Projet

Général

Profil

Bug #5786

label de l'application passerelle.messages en conflit avec django.contrib.messages

Ajouté par Thomas Noël il y a plus de 9 ans. Mis à jour il y a plus de 5 ans.

Statut:
Fermé
Priorité:
Haut
Assigné à:
Version cible:
-
Début:
23 octobre 2014
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Oui
Planning:

Description

Il faut changer le label de passerelle.messages car il est en conflit avec django.contrib.messages.

Exemple de pépin :

./manage.py convert_to_south messages
Creating migrations directory at '/home/thomas/dev/passerelle/venv/local/lib/python2.7/site-packages/django/contrib/messages/migrations'...
Creating __init__.py in '/home/thomas/dev/passerelle/venv/local/lib/python2.7/site-packages/django/contrib/messages/migrations'...
 + Added model messages.MessageGateway
 + Added M2M table for users on messages.MessageGateway

Résultat : impossible de faire du south sur l'application...

(et ça plantera pire encore en django 1.7)


Fichiers

Historique

#1

Mis à jour par Thomas Noël il y a plus de 9 ans

En 1.7, même runserver est pas content :

$ ./manage.py runserver
Traceback (most recent call last):
  File "./manage.py", line 34, in <module>
    execute_from_command_line(sys.argv[:1] + argv)
  File "/usr/lib/python2.7/dist-packages/django/core/management/__init__.py", line 385, in execute_from_command_line
    utility.execute()
  File "/usr/lib/python2.7/dist-packages/django/core/management/__init__.py", line 354, in execute
    django.setup()
  File "/usr/lib/python2.7/dist-packages/django/__init__.py", line 21, in setup
    apps.populate(settings.INSTALLED_APPS)
  File "/usr/lib/python2.7/dist-packages/django/apps/registry.py", line 89, in populate
    "duplicates: %s" % app_config.label)
django.core.exceptions.ImproperlyConfigured: Application labels aren't unique, duplicates: messages
#2

Mis à jour par Thomas Noël il y a plus de 9 ans

Pour mémoire, extrait de https://docs.djangoproject.com/en/1.6/intro/reusable-apps/#packaging-your-app :

« The application names (that is, the final dotted part of the path to the module containing models.py) defined in INSTALLED_APPS must be unique. Avoid using the same name as any of the Django contrib packages, for example auth, admin or messages. »

#3

Mis à jour par Frédéric Péters il y a plus de 9 ans

Je n'ai pas réfléchi aux conséquences sur la DB avec l'héritage des modèles, mais mon option préférée, elle serait d'ajouter un messages.py dans passerelle/, d'y glisser le modèle et la vue qui sont utilisés, et de bazarder passerelle/messages/.

Mais comme en fait, si, j'ai réfléchi et j'ai bien vu que ça allait tout casser, je note qu'on n'a pas de déploiement utilisant les fournisseurs SMS (on me corrigera) et que c'est pas bien grave de casser les choses maintenant.

#4

Mis à jour par Thomas Noël il y a plus de 9 ans

Par nettoyage, tu entends quoi ?

Si on renomme juste "messages", sur au moins une passerelle déployée (cg14) avec les tables sql créées, on a des foreignkeys vers des tables de "messages". Mais je pourrais éventuellement supprimer ce qu'il faut du INSTALLED_APPS.

Je vais voir si South peut m'aider pour modifier les tables, parce que là j'ai des choses du genre:

CREATE TABLE "mobyt_mobytsmsgateway" (
    "messagegateway_ptr_id" integer NOT NULL PRIMARY KEY REFERENCES "messages_messagegateway" ("id") DEFERRABLE INITIALLY DEFERRED,
                                                                       ^^^
                                                                       aïe

#5

Mis à jour par Frédéric Péters il y a plus de 9 ans

Mon option ne se soucie pas de l'existant (c'est du coup bien plus facile).

En gros, on remplace le modèle intermédiaire MessageGateway par un mixin, qu'on met dans un passerelle/messages.py, et puis on vire passerelle/messages/ comme ça on n'a plus deux applis nommées "messages".

Ça se bricole sans doute d'avoir une belle migration arrangeant tout mais je ne sais pas si ça en vaut le temps de développement.

#6

Mis à jour par Thomas Noël il y a plus de 9 ans

  • Priorité changé de Normal à Haut
#7

Mis à jour par Thomas Noël il y a plus de 9 ans

Quelque chose comme ça ?

Note : ça permet de générer une migration South, mais ne fait que modifier les colonnes et ne pas migre les données (c'est pas très grave vu qu'on n'instancie pour l'instant ces modèles nulle part). Mais à regarder le SQL, je pense qu'il faut, si on migre vers cette organisation, faire un nettoyage quasi manuel ("drop table messages_*" et ce genre de chose).

Bref, c'est jouable.

#8

Mis à jour par Frédéric Péters il y a plus de 9 ans

Ouaip comme ça, il y a aussi le messages.views.SendView qui est à récupérer, et c'est tout je pense.

#9

Mis à jour par Frédéric Péters il y a plus de 9 ans

Gros mais bête patch.

Par rapport à nos discussions sur les migrations, l'astuce du jour c'est d'utiliser db_table pour forcer un nouveau nom aux tables.

    refactor SMS applications (#5786)

    SMS application models were subclass of a non-abtract MessageGateway, it
    didn't bring anything but a classmethod and complications for migrations;
    it's now removed in favour of directly subclassing BaseResource.

    Migrations are added, and new table names are defined to avoid collisions.

    The passerelle.messages application has also been moved to passerelle.sms,
    this avoids the conflicting name 'messages' that is also claimed by
    django.contrib.messages.
#10

Mis à jour par Thomas Noël il y a plus de 9 ans

En lecture rapide ce vendredi soir :
  • j'aurais carrément renommé "MessageGatewayMixin" en "SMSGatewayMixin" voire "SMSMixin", parce que ça ne cause que de SMS
  • je pense qu'il n'est pas utile d'avoir passerelle.sms dans les INSTALLED_APPS mais j'ai pas testé

Par ailleurs, au niveau du SQL, pour OVH par exemple, on se retrouve avec ça :

CREATE TABLE "sms_ovh_users" (
    "id" integer NOT NULL PRIMARY KEY,
    "ovhsmsgateway_id" integer NOT NULL,
    "apiuser_id" integer NOT NULL REFERENCES "base_apiuser" ("id"),
    UNIQUE ("ovhsmsgateway_id", "apiuser_id")
)
;
CREATE TABLE "sms_ovh" (
    "id" integer NOT NULL PRIMARY KEY,
    "title" varchar(50) NOT NULL,
    "slug" varchar(50) NOT NULL,
    "description" text NOT NULL,
    "account" varchar(64) NOT NULL,
    "username" varchar(64) NOT NULL,
    "password" varchar(64) NOT NULL,
    "msg_class" integer NOT NULL,
    "credit_threshold_alert" integer unsigned NOT NULL,
    "default_country_code" varchar(3) NOT NULL,
    "credit_left" integer unsigned NOT NULL
)
;

La première table vient du « users = models.ManyToManyField(ApiUser, blank=True) » dans BaseResource, et je me demande dans quelle mesure c'est encore nécessaire depuis l'ajout du modèle « AccessRight ».

Ceci dit, cette seconde partie de ma remarque pourrait être un nouveau ticket. C'est vendredi soir.

#11

Mis à jour par Frédéric Péters il y a plus de 9 ans

  • j'aurais carrément renommé "MessageGatewayMixin" en "SMSGatewayMixin" voire "SMSMixin", parce que ça ne cause que de SMS
  • je pense qu'il n'est pas utile d'avoir passerelle.sms dans les INSTALLED_APPS mais j'ai pas testé

Oui ×2; patch attaché.

La première table vient du « users = models.ManyToManyField(ApiUser, blank=True) » dans BaseResource, et je me demande dans quelle mesure c'est encore nécessaire depuis l'ajout du modèle « AccessRight ».

Je suis pour que ça se discute de manière séparée, je viens de créer un ticket dédié, #6003.

#12

Mis à jour par Thomas Noël il y a plus de 9 ans

Ack pour 0001-refactor-SMS-applications-5786.patch

#13

Mis à jour par Frédéric Péters il y a plus de 9 ans

  • Statut changé de Nouveau à Résolu (à déployer)
commit af349017242f45e34316270fe1a0b631755a961f
Author: Frédéric Péters <fpeters@entrouvert.com>
Date:   Mon Nov 17 14:35:19 2014 +0100

    refactor SMS applications (#5786)

    SMS application models were subclass of a non-abtract MessageGateway, it
    didn't bring anything but a classmethod and complications for migrations;
    it's now removed in favour of directly subclassing BaseResource.

    Migrations are added, and new table names are defined to avoid collisions.

    The passerelle.messages application has also been moved to passerelle.sms,
    this avoids the conflicting name 'messages' that is also claimed by
    django.contrib.messages.
#14

Mis à jour par Benjamin Dauvergne il y a plus de 5 ans

  • Statut changé de Résolu (à déployer) à Fermé

Formats disponibles : Atom PDF