Submitted By: Mario Fetka (mario dot fetka at gmail dot com) Date: 2009-02-18 Initial Package Version: unknown Origin: http://trac-hacks.org/wiki/RegistrationConfirmationPatch Upstream Status: unknown Description: This is a patch for AccountManagerPlugin that adds an IRegistrationConfirmation extension point that enables pluggable verifications for new user registration. diff -Naur trac-acct_mgr-0.2.1.orig/acct_mgr/api.py trac-acct_mgr-0.2.1/acct_mgr/api.py --- trac-acct_mgr-0.2.1.orig/acct_mgr/api.py 2009-02-18 09:10:33.000000000 +0000 +++ trac-acct_mgr-0.2.1/acct_mgr/api.py 2009-02-18 09:42:33.254276668 +0000 @@ -77,6 +77,19 @@ """User deleted """ +class IRegistrationConfirmation(Interface): + """An interface for receiving notification before and after the new user + registration form has been submitted. + """ + + def pre_registration(self, req): + """Returns the markup to be added to the registration form + """ + + def verify_registration(self, req): + """Returns an error message if confirmation fails, or None on success + """ + class AccountManager(Component): """The AccountManager component handles all user account management methods provided by the IPasswordStore interface. diff -Naur trac-acct_mgr-0.2.1.orig/acct_mgr/templates/register.html trac-acct_mgr-0.2.1/acct_mgr/templates/register.html --- trac-acct_mgr-0.2.1.orig/acct_mgr/templates/register.html 2009-02-18 09:10:33.000000000 +0000 +++ trac-acct_mgr-0.2.1/acct_mgr/templates/register.html 2009-02-18 09:42:33.256586814 +0000 @@ -43,6 +43,11 @@ class="textwidget" size="20" /> + +
+ ${Markup(extra_required_content)} +
+
Optional diff -Naur trac-acct_mgr-0.2.1.orig/acct_mgr/web_ui.py trac-acct_mgr-0.2.1/acct_mgr/web_ui.py --- trac-acct_mgr-0.2.1.orig/acct_mgr/web_ui.py 2009-02-18 09:10:33.000000000 +0000 +++ trac-acct_mgr-0.2.1/acct_mgr/web_ui.py 2009-02-18 09:45:45.904094348 +0000 @@ -27,6 +27,7 @@ from genshi.builder import tag from api import AccountManager +from api import IRegistrationConfirmation from acct_mgr.util import urandom def _create_user(req, env, check_permissions=True): @@ -351,6 +352,8 @@ implements(INavigationContributor, IRequestHandler, ITemplateProvider) + listeners = ExtensionPoint(IRegistrationConfirmation) + def __init__(self): self._enable_check(log=True) @@ -394,26 +397,42 @@ 'name' : None, 'email' : None, }, + 'extra_required_content' : self._get_extra_content(req) } + error = None if req.method == 'POST' and action == 'create': - try: - _create_user(req, self.env) - except TracError, e: - data['registration_error'] = e.message + for listener in self.listeners: + error = listener.verify_registration(req) + if error is not None: + break + data['registration_error'] = error + if error is None: + try: + _create_user(req, self.env) + except TracError, e: + data['registration_error'] = e.message formdata = getattr(e, 'acctmgr', None) if formdata: data['acctmgr'] = formdata else: raise e - else: - req.redirect(req.href.login()) + else: + req.redirect(req.href.login()) + data['reset_password_enabled'] = \ (self.env.is_component_enabled(AccountModule) and NotificationSystem(self.env).smtp_enabled) return 'register.html', data, None - + def _get_extra_content(self, req): + ret = "" + for listener in self.listeners: + response = listener.pre_registration(req) + if response is not None: + ret += response + return ret + # ITemplateProvider def get_htdocs_dirs(self): @@ -427,7 +446,7 @@ ClearSilver templates. """ from pkg_resources import resource_filename - return [resource_filename(__name__, 'templates')] + return [resource_filename(__name__, 'templates')] def if_enabled(func):