diff --git a/browser/form_macros.pt b/browser/form_macros.pt index 63543d3..47e846b 100644 --- a/browser/form_macros.pt +++ b/browser/form_macros.pt @@ -51,6 +51,8 @@ + +
@@ -59,7 +61,7 @@ - @@ -119,6 +121,8 @@ tal:attributes="value typeToken" /> + +
@@ -127,7 +131,7 @@ - diff --git a/browser/skin/lobo/body.pt b/browser/skin/lobo/body.pt index f1f08c6..2a3ea56 100644 --- a/browser/skin/lobo/body.pt +++ b/browser/skin/lobo/body.pt @@ -30,7 +30,13 @@
-
+ +
+
-
+ +
+
0: + # show form again + return True + login = form.get('loginName') + regMan = IMemberRegistrationManager(self.context.getLoopsRoot()) + pw = generateName() + email = form.get('email') + result = regMan.register(login, pw, + form.get('lastName'), form.get('firstName'), + email=email,) + if isinstance(result, dict): + fi = formState.fieldInstances[result['fieldName']] + fi.setError(result['error'], self.formErrors) + formState.severity = max(formState.severity, fi.severity) + return True + self.object = result + person = result.context + pa = self.getPrincipalAnnotation( + getPrincipalForUserId(adapted(person).getUserId())) + pa['id'] = generateName() + pa['timestamp'] = datetime.utcnow() + self.notifyEmail(login, email, pa['id']) + msg = self.message + self.request.response.redirect('%s?loops.message=%s' % (self.url, msg)) + return False - # TODO: control form via interface? + def notifyEmail(self, userid, recipient, id): + baseUrl = absoluteURL(self.context.getMenu(), self.request) + url = u'%s/selfservice_confirmation.html?login=%s&id=%s' % ( + baseUrl, userid, id,) + recipients = [recipient] + message = u'Um die Anmeldung abzuschliessen muessen Sie folgenden Link betaetigen:\n\n' + message = (message + url).encode('UTF-8') + sender = 'webmaster@zeitraum-bayern.de' + msg = MIMEText(message, 'plain', 'utf-8') + msg['Subject'] = 'Benutzer-Registrierung' + msg['From'] = sender + msg['To'] = ', '.join(recipients) + mailhost = component.getUtility(IMailDelivery, 'Mail') + mailhost.send(sender, recipients, msg.as_string()) + + +class ConfirmMemberRegistration(BaseMemberRegistration, Form): + + permissions_key = u'secure_registration.permissions' + roles_key = u'secure_registration.roles' + + template = form_macros + isInnerHtml = False + showAssignments = False + form_action = 'confirm_registration' + + def closeAction(self, submit=True): + return u'' @Lazy def macro(self): return organize_macros.macros['confirm'] + @Lazy + def data(self): + form = self.request.form + return dict(loginName=form.get('login'), id=form.get('id')) + + @Lazy + def schema(self): + schema = super(ConfirmMemberRegistration, self).schema + schema.fields.remove('birthDate') + schema.fields.remove('phoneNumbers') + schema.fields.loginName.readonly = True + schema.fields.reorder(-2, 'loginName') + schema.fields.firstName.readonly = True + schema.fields.lastName.readonly = True + schema.fields.firstName.readonly = True + schema.fields.email.readonly = True + return schema + + def update(self): + form = self.request.form + if form.get('form.action') != 'confirm_registration': + return True + if not form.get('login'): + return True + regMan = IMemberRegistrationManager(self.context.getLoopsRoot()) + prefix = regMan.getPrincipalFolderFromOption().prefix + userId = prefix + form['login'] + principal = getPrincipalForUserId(userId) + pa = self.getPrincipalAnnotation(principal) + id = form.get('id') + if not id or id != pa.get('id'): + return True + pw = form.get('password') + pwConfirm = form.get('passwordConfirm') + if pw != pwConfirm: + msg = self.errorMessages['confirm_nomatch'] + self.request.form['message'] = msg + return True + del pa['id'] + del pa['timestamp'] + ip = getInternalPrincipal(userId) + ip.setPassword(pw) + url = '%s?loops.message=%s' % (self.url, self.message) + self.request.response.redirect(url) + return False + class PasswordChange(NodeView, Form): diff --git a/organize/browser/view_macros.pt b/organize/browser/view_macros.pt index af8ea2b..ecc21ad 100644 --- a/organize/browser/view_macros.pt +++ b/organize/browser/view_macros.pt @@ -1,7 +1,22 @@ - - + + + + + + + + + +
Login Name +
+ +
+
+
diff --git a/organize/member.py b/organize/member.py index 9753bd6..09e5326 100644 --- a/organize/member.py +++ b/organize/member.py @@ -1,5 +1,5 @@ # -# Copyright (c) 2012 Helmut Merz helmutm@cy55.de +# Copyright (c) 2013 Helmut Merz helmutm@cy55.de # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -62,11 +62,20 @@ class MemberRegistrationManager(object): def __init__(self, context): self.context = context + @Lazy + def personType(self): + concepts = self.context.getConceptManager() + return adapted(concepts[self.person_typeName]) + + def getPrincipalFolderFromOption(self): + options = IOptions(self.personType) + pfName = options(self.principalfolder_key, + (self.default_principalfolder,))[0] + return getPrincipalFolder(self.context, pfName) + def register(self, userId, password, lastName, firstName=u'', groups=[], useExisting=False, pfName=None, **kw): - concepts = self.context.getConceptManager() - personType = adapted(concepts[self.person_typeName]) - options = IOptions(personType) + options = IOptions(self.personType) if pfName is None: pfName = options(self.principalfolder_key, (self.default_principalfolder,))[0] @@ -74,7 +83,7 @@ class MemberRegistrationManager(object): if len(groups)==0: groups = options(self.groups_key, ()) self.setGroupsForPrincipal(pfName, userId, groups=groups) - self.createPersonForPrincipal(pfName, userId, lastName, firstName, + return self.createPersonForPrincipal(pfName, userId, lastName, firstName, useExisting, **kw) def createPrincipal(self, pfName, userId, password, lastName,