Bug #5786
label de l'application passerelle.messages en conflit avec django.contrib.messages
0%
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
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
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. »
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.
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
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.
Mis à jour par Thomas Noël il y a plus de 9 ans
- Fichier 0001-juste-un-exemple-pour-blablater.patch 0001-juste-un-exemple-pour-blablater.patch ajouté
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.
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.
Mis à jour par Frédéric Péters il y a plus de 9 ans
- Fichier 0001-refactor-SMS-applications-5786.patch 0001-refactor-SMS-applications-5786.patch ajouté
- Assigné à mis à Frédéric Péters
- Patch proposed changé de Non à Oui
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.
Mis à jour par Thomas Noël 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é
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.
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.
Mis à jour par Thomas Noël il y a plus de 9 ans
Ack pour 0001-refactor-SMS-applications-5786.patch
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.
Mis à jour par Benjamin Dauvergne il y a plus de 5 ans
- Statut changé de Résolu (à déployer) à Fermé