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