Skip to content
Snippets Groups Projects
Commit 1e0a6720 authored by kaiyou's avatar kaiyou
Browse files

Implement basic profile transitions

parent 6268e4db
No related branches found
No related tags found
1 merge request!20Add 'remember me' button
from hiboo import sso
from hiboo.service.forms import ServiceForm as BaseForm
from flask_babel import lazy_gettext as _
import flask
......@@ -15,6 +14,8 @@ class BaseApplication(object):
@classmethod
def register(cls, application_id):
""" Class decorator for registering new applications
"""
def register_function(application):
application.application_id = application_id
cls.registry[application_id] = application()
......@@ -22,14 +23,40 @@ class BaseApplication(object):
return register_function
def render_details(self, service):
""" Render application details in the service details page
"""
return flask.render_template(
"application_{}.html".format(self.application_id),
service=service
)
def fill_service(self, service):
""" Updates the service options dictionary based on SSO
parameters
"""
return self.sso_protocol.fill_service(service)
def activate(self, profile):
""" Default activation behavior is doing nothing
"""
return True
def block(self, profile):
""" Default blocking behavior is doing nothing
"""
return True
def welcome(self, profile):
""" Defaul welcome behavior is doing nothing
"""
return True
def delete(self, profile):
""" Deleting an account generally requires application
implementation, so this needs to be overridden
"""
return False
class OIDCApplication(BaseApplication):
sso_protocol = sso.oidc
......
......@@ -4,14 +4,7 @@ import flask
blueprint = flask.Blueprint("profile", __name__, template_folder="templates")
import flask_login
from hiboo import models, utils
from hiboo.profile import format
formats = format.ProfileFormat.registry
from hiboo.profile import login, admin, forms, cli
from hiboo import models, utils, application
def get_profile(service, **redirect_args):
......@@ -26,3 +19,32 @@ def get_profile(service, **redirect_args):
utils.force_redirect(utils.url_for("profile.pick", **redirect_args))
else:
utils.force_redirect(utils.url_for("profile.create_quick", **redirect_args))
def transition(profile):
""" Handle profile transitions as single-step workflows
"""
# These are coded as (current, target), None being a wildcard.
# All matches apply, including wildcards.
TRANSITIONS = {
(None, models.Profile.BLOCKED): ["block"],
(None, models.Profile.DELETED): ["delete"],
(None, models.Profile.ACTIVE): ["activate"],
(models.Profile.REQUEST, models.Profile.ACTIVE): ["welcome"],
}
app = application.registry.get(profile.service.application_id)
functions = (
TRANSITIONS.get((profile.status, profile.transition), []) +
TRANSITIONS.get((None, profile.transition), []) +
TRANSITIONS.get((profile.status, None), [])
)
valid = any([
hasattr(app, function) and getattr(app, function)(profile)
for function in functions
])
if valid:
profile.status = profile.transition
profile.transition = None
from hiboo.profile import login, admin, cli
\ No newline at end of file
from hiboo.profile import blueprint
from hiboo.profile import blueprint, transition
from hiboo import security, models
from hiboo import user as hiboo_user
from flask_babel import lazy_gettext as _
......@@ -45,7 +45,7 @@ def set_status(profile_uuid, status):
if status not in (models.Profile.ACTIVE, models.Profile.BLOCKED):
flask.abort(403)
profile = models.Profile.query.get(profile_uuid) or flask.abort(404)
profile.status = status
profile.transition = status
models.log(
category=models.History.STATUS,
value=status,
......@@ -55,8 +55,9 @@ def set_status(profile_uuid, status):
actor=flask_login.current_user,
public=True
)
transition(profile)
models.db.session.commit()
flask.flash(_("Profile status was successfully changed"), "success")
flask.flash(_("Profile status change was requested"), "success")
return flask.redirect(flask.url_for(".details", profile_uuid=profile_uuid))
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment