Project

General

Profile

Development #46611

Permettre de charger les fichiers urls depuis une application commune, tout en gardant les fonctionnalités liées aux connecteurs qui dérivent de cette application.

Added by Nicolas Roche 4 months ago. Updated 3 months ago.

Status:
Solution déployée
Priority:
Normal
Assignee:
Target version:
-
Start date:
14 Sep 2020
Due date:
% Done:

0%

Estimated time:
Patch proposed:
Yes
Planning:
No

Description

J'aurais besoin de ce patch pour charger sms/urls.py sur les connecteurs SMS,
pour implémenter un bouton de test d'envoi des SMS (#45333).


Files


Related issues

Related to Passerelle - Development #45333: intégrer au niveau des connecteurs SMS la possibilité d'un envoi de testSolution déployée21 Jul 2020

Actions

Associated revisions

Revision a5ee5cb6 (diff)
Added by Nicolas Roche 3 months ago

base: load urls.py from generic connectors apps (#46611)

History

#1

Updated by Nicolas Roche 4 months ago

Je pose un patch, mais c'est uniquement pour clarifier ma description du besoin qui n'est certainement pas claire du tout.

#2

Updated by Frédéric Péters 4 months ago

Tu ne devrais pas aller taper du code spécifique SMS dans passerelle/base/.

L'approche devrait être d'avoir dans passerelle/sms/ le SmsAppConfigMixin et dans la classe modèle de base un attribut, genre app_config_extra_mixins = (SmsAppConfigMixin,).

De là, tu peux avoir dans passerelle/base/ du code qui ferait un générique

app.__class__.__bases__ = connector.app_config_extra_mixins + app.__class__.__bases__
#3

Updated by Nicolas Roche 4 months ago

J'ai l'impression que si j'ajoute le mixin SMS dans app.__class__.__bases__,
alors toutes les applications qui utilisent ConnectorAppConfig vont également bénéficier du mixin.
Et donc qu'il me faut plutôt remplacer app.__class__ par une classe qui la dérive.

J'ai déplacé le code dans apps/sms/__init__.py,
et ConnectorAppMixin dans base/mixins.py pour éviter l'import circulaire.

En vrai, il n'y a rien ici pour tester ce patch.
Pour cela il faut voir la branche posée sur #45333 qui l'utilise.

#4

Updated by Frédéric Péters 4 months ago

  • Status changed from Solution proposée to En cours
  • Patch proposed changed from Yes to No

Ce n'est pas ça que je suggérais mais oublions tout à fait là je vais encore suggérer autre chose : arrêter avec les AppConfig qui introduisent une hiérarchie parallèle et conduisent à ce ticket.

Rester au truc simple de un connecteur = la classe de son modèle.

Et du coup modifier register_apps_urls pour également itérer sur les modèles.

#5

Updated by Nicolas Roche 4 months ago

Et du coup modifier register_apps_urls pour également itérer sur les modèles.

Aïe, mon code est super moche et du coup j'intuite que je suis à nouveau passé à côté :
j'itère sur la classe qui se serait éventuellement intercalée entre le connecteur et BaseResource.

#6

Updated by Frédéric Péters 4 months ago

Sur l'appconfig tu as un get_connector_model. Il faut utiliser ça.

C'est verbeux à cause du changement d'indentation, mais en gros j'imaginais arriver à du code comme ça :

diff --git a/passerelle/plugins.py b/passerelle/plugins.py
index 491805c4..f26d93e9 100644
--- a/passerelle/plugins.py
+++ b/passerelle/plugins.py
@@ -27,29 +27,32 @@ def register_apps_urls(urlpatterns):
     before_urls = []
     after_urls = []
     for app in apps.get_app_configs():
-        if hasattr(app, 'get_before_urls') or hasattr(app, 'get_after_urls'):
-            if hasattr(app, 'get_before_urls'):
-                urls = app.get_before_urls()
+        if not hasattr(app, 'get_connector_model'):
+            continue
+        connector_model = app.get_connector_model()
+        connector_slug = connector_model.get_connector_slug()
+        for obj in (connector_model, app):
+            if hasattr(obj, 'get_before_urls') or hasattr(obj, 'get_after_urls'):
+                if hasattr(obj, 'get_before_urls'):
+                    urls = obj.get_before_urls()
+                    if urls:
+                        before_urls.append(url('^', include(urls)))
+                if hasattr(obj, 'get_after_urls'):
+                    urls = obj.get_after_urls()
+                    if urls:
+                        after_urls.append(url('^', include(urls)))
+            elif hasattr(obj, 'get_urls'):
+                url_prefix = '^%s/' % connector_slug
+                urls = obj.get_urls()
                 if urls:
-                    before_urls.append(url('^', include(urls)))
-            if hasattr(app, 'get_after_urls'):
-                urls = app.get_after_urls()
+                    urls = required(app_enabled(app.label), urls)
+                    after_urls.append(url(url_prefix, include(urls), kwargs={'connector': connector_slug}))
+            if hasattr(obj, 'get_management_urls'):
+                url_prefix = '^manage/%s/' % connector_slug
+                urls = obj.get_management_urls()
                 if urls:
-                    after_urls.append(url('^', include(urls)))
-        elif hasattr(app, 'get_urls'):
-            connector_slug = app.get_connector_model().get_connector_slug()
-            url_prefix = '^%s/' % connector_slug
-            urls = app.get_urls()
-            if urls:
-                urls = required(app_enabled(app.label), urls)
-                after_urls.append(url(url_prefix, include(urls), kwargs={'connector': connector_slug}))
-        if hasattr(app, 'get_management_urls'):
-            connector_slug = app.get_connector_model().get_connector_slug()
-            url_prefix = '^manage/%s/' % connector_slug
-            urls = app.get_management_urls()
-            if urls:
-                urls = required(app_enabled(app.label), urls)
-                urls = required(manager_required, urls)
-                after_urls.append(url(url_prefix, include(urls), kwargs={'connector': connector_slug}))
+                    urls = required(app_enabled(app.label), urls)
+                    urls = required(manager_required, urls)
+                    after_urls.append(url(url_prefix, include(urls), kwargs={'connector': connector_slug}))

     return before_urls + urlpatterns + after_urls

(pas testé du tout)

#7

Updated by Nicolas Roche 4 months ago

Waouh, ça marche du premier coup ! (je pose le patch mais c'est ligne pour ligne le diff ci-dessus)
Et donc ensuite (cf la branche posée sur #45333), juste ajouter cette méthode de classe dans sms/models.py ?

class SMSResource(BaseResource):
...
    @classmethod
    def get_management_urls(cls):
        return import_string('passerelle.sms.urls.management_urlpatterns')

#8

Updated by Nicolas Roche 4 months ago

  • Related to Development #45333: intégrer au niveau des connecteurs SMS la possibilité d'un envoi de test added
#9

Updated by Nicolas Roche 4 months ago

  • Assignee set to Nicolas Roche
#10

Updated by Valentin Deniaud 3 months ago

  • Status changed from Solution proposée to Solution validée

Il y a pas de branche mais je vois que c'est vert via #45333, donc go.

#11

Updated by Nicolas Roche 3 months ago

  • Status changed from Solution validée to Résolu (à déployer)
commit a5ee5cb6e06485ec498957d40c9ff54449eba9b4
Author: Nicolas ROCHE <nroche@entrouvert.com>
Date:   Thu Sep 17 16:22:30 2020 +0200

    base: load urls.py from generic connectors apps (#46611)
#12

Updated by Frédéric Péters 3 months ago

  • Status changed from Résolu (à déployer) to Solution déployée

Also available in: Atom PDF