From 49cdbf88e2504bdfbbcee60fb242cb83088de3ed Mon Sep 17 00:00:00 2001
From: kaiyou <pierre@jaury.eu>
Date: Sat, 5 Sep 2020 18:53:16 +0200
Subject: [PATCH] Monkey patch an application property on Service

---
 hiboo/application/__init__.py |  3 +++
 hiboo/application/base.py     | 31 +++++++++++++++++++++++++++++--
 hiboo/profile/__init__.py     |  4 ++--
 hiboo/service/admin.py        |  8 ++++----
 hiboo/service/forms.py        | 29 -----------------------------
 5 files changed, 38 insertions(+), 37 deletions(-)
 delete mode 100644 hiboo/service/forms.py

diff --git a/hiboo/application/__init__.py b/hiboo/application/__init__.py
index c6916ebc..b2de80b5 100644
--- a/hiboo/application/__init__.py
+++ b/hiboo/application/__init__.py
@@ -5,8 +5,11 @@ blueprint = flask.Blueprint("application", __name__, template_folder="templates"
 
 
 from hiboo.application import base
+from hiboo import models
 
 register = base.BaseApplication.register
 registry = base.BaseApplication.registry
+setattr(models.Service, "application",
+    property(lambda self: registry.get(self.application_id)))
 
 from hiboo.application import sso, infrastructure, social, storage
\ No newline at end of file
diff --git a/hiboo/application/base.py b/hiboo/application/base.py
index c20ae1b6..eb5b64d4 100644
--- a/hiboo/application/base.py
+++ b/hiboo/application/base.py
@@ -1,7 +1,34 @@
-from hiboo import sso
-from hiboo.service.forms import ServiceForm as BaseForm
+from hiboo import sso, models, format
+from wtforms import validators, fields, widgets
+from flask_babel import lazy_gettext as _
 
 import flask
+import flask_wtf
+
+
+class BaseForm(flask_wtf.FlaskForm):
+    """ Base class for service forms, used in applications
+    """
+    name = fields.StringField(_('Service name'), [validators.DataRequired()])
+    provider = fields.StringField(_('Provider'), [validators.DataRequired()])
+    description = fields.StringField(_('Description'))
+    policy = fields.SelectField(_('Profile policy'),
+        choices=list(models.Service.POLICIES.items()))
+    max_profiles = fields.IntegerField(_('Maximum profile count'),
+        [validators.NumberRange(1, 1000)])
+    profile_format = fields.SelectField(_('Profile username format'),
+        choices=(
+            [("", _("Default ({})".format(
+                format.ProfileFormat.registry[None].message))
+            )] +
+            [(name, format.message.capitalize())
+              for name, format in format.ProfileFormat.registry.items()
+              if name is not None
+            ]
+        )
+    )
+    single_profile = fields.BooleanField(_('Enable single-profile behavior (no custom username, no additional profile)'))
+    submit = fields.SubmitField(_('Submit'))
 
 
 class BaseApplication(object):
diff --git a/hiboo/profile/__init__.py b/hiboo/profile/__init__.py
index 487311dd..85382bf7 100644
--- a/hiboo/profile/__init__.py
+++ b/hiboo/profile/__init__.py
@@ -4,7 +4,7 @@ import flask
 blueprint = flask.Blueprint("profile", __name__, template_folder="templates")
 
 import flask_login
-from hiboo import models, utils, application
+from hiboo import models, utils
 from hiboo.profile import forms
 
 
@@ -47,7 +47,7 @@ def transition(profile, current, target, done=False):
             []
         ),
     }
-    app = application.registry.get(profile.service.application_id)
+    app = profile.service.application
     index = 1 if done else 0
     empty = ([], [])
     functions = (
diff --git a/hiboo/service/admin.py b/hiboo/service/admin.py
index 780e5983..e5e97b53 100644
--- a/hiboo/service/admin.py
+++ b/hiboo/service/admin.py
@@ -1,5 +1,5 @@
 from hiboo import models, utils, security, application
-from hiboo.service import blueprint, forms
+from hiboo.service import blueprint
 from flask_babel import lazy_gettext as _
 
 import flask
@@ -49,7 +49,7 @@ def create(application_id):
 @security.admin_required()
 def edit(service_uuid):
     service = models.Service.query.get(service_uuid) or flask.abort(404)
-    app = application.registry.get(service.application_id) or flask.abort(404)
+    app = service.application or flask.abort(404)
     form = app.Form()
     if form.validate_on_submit():
         form.populate_obj(service)
@@ -65,7 +65,7 @@ def edit(service_uuid):
 @security.admin_required()
 def details(service_uuid):
     service = models.Service.query.get(service_uuid) or flask.abort(404)
-    app = application.registry.get(service.application_id) or flask.abort(404)
+    app = service.application or flask.abort(404)
     return flask.render_template("service_details.html", service=service, application=app)
 
 
@@ -83,7 +83,7 @@ def delete(service_uuid):
 @security.admin_required()
 def action(service_uuid, action):
     service = models.Service.query.get(service_uuid) or flask.abort(404)
-    app = application.registry.get(service.application_id) or flask.abort(404)
+    app = service.application or flask.abort(404)
     label, profile, quick = app.actions.get(action) or flask.abort(404)
     if profile:
         flask.abort(404)
diff --git a/hiboo/service/forms.py b/hiboo/service/forms.py
deleted file mode 100644
index cc218243..00000000
--- a/hiboo/service/forms.py
+++ /dev/null
@@ -1,29 +0,0 @@
-from wtforms import validators, fields, widgets
-from flask_babel import lazy_gettext as _
-
-from hiboo import models, application, format
-
-import flask_wtf
-
-
-class ServiceForm(flask_wtf.FlaskForm):
-    name = fields.StringField(_('Service name'), [validators.DataRequired()])
-    provider = fields.StringField(_('Provider'), [validators.DataRequired()])
-    description = fields.StringField(_('Description'))
-    policy = fields.SelectField(_('Profile policy'),
-        choices=list(models.Service.POLICIES.items()))
-    max_profiles = fields.IntegerField(_('Maximum profile count'),
-        [validators.NumberRange(1, 1000)])
-    profile_format = fields.SelectField(_('Profile username format'),
-        choices=(
-            [("", _("Default ({})".format(
-                format.ProfileFormat.registry[None].message))
-            )] +
-            [(name, format.message.capitalize())
-              for name, format in format.ProfileFormat.registry.items()
-              if name is not None
-            ]
-        )
-    )
-    single_profile = fields.BooleanField(_('Enable single-profile behavior (no custom username, no additional profile)'))
-    submit = fields.SubmitField(_('Submit'))
-- 
GitLab