work in progress: info texts and feedback pages for self-service registration

This commit is contained in:
Helmut Merz 2013-05-17 11:30:10 +02:00
parent d84e8de9a0
commit 3f1ffdb8f4
6 changed files with 66 additions and 19 deletions

View file

@ -481,7 +481,7 @@ class BaseView(GenericView, I18NView):
return absoluteURL(provider, self.request) return absoluteURL(provider, self.request)
return None return None
def renderText(self, text, contentType): def renderText(self, text, contentType='text/restructured'):
text = util.toUnicode(text) text = util.toUnicode(text)
typeKey = util.renderingFactories.get(contentType, None) typeKey = util.renderingFactories.get(contentType, None)
if typeKey is None: if typeKey is None:

Binary file not shown.

View file

@ -774,7 +774,7 @@ msgstr "Die Passwort-Wiederholung stimmt nicht mit dem eingegebenen Passwort üb
msgid "confirmation_mail_subject" msgid "confirmation_mail_subject"
msgstr "Benutzer-Registrierung" msgstr "Benutzer-Registrierung"
msgid "confirmation_mail_text." msgid "confirmation_mail_text"
msgstr "Bitte clicken Sie auf den folgenden Link, um die Anmeldung abzschließen." msgstr "Bitte clicken Sie auf den folgenden Link, um die Anmeldung abzschließen."
msgid "The user account has been created." msgid "The user account has been created."

View file

@ -185,7 +185,7 @@ sure that a principal object can be served by a corresponding factory):
... 'lastName': u'Sawyer', ... 'lastName': u'Sawyer',
... 'firstName': u'Tom', ... 'firstName': u'Tom',
... 'email': u'tommy@sawyer.com', ... 'email': u'tommy@sawyer.com',
... 'action': 'update',} ... 'form.action': 'update',}
and register it. and register it.

View file

@ -83,6 +83,7 @@ class BaseMemberRegistration(NodeView):
interface = IMemberRegistration # TODO: add company, create institution interface = IMemberRegistration # TODO: add company, create institution
message = _(u'The user account has been created.') message = _(u'The user account has been created.')
template = form_macros
formErrors = dict( formErrors = dict(
confirm_nomatch=FormError(_(u'Password and password confirmation do not match.')), confirm_nomatch=FormError(_(u'Password and password confirmation do not match.')),
@ -95,6 +96,17 @@ class BaseMemberRegistration(NodeView):
permissions_key = u'registration.permissions' permissions_key = u'registration.permissions'
roles_key = u'registration.roles' roles_key = u'registration.roles'
registration_adapter_key = u'registration.adapter' registration_adapter_key = u'registration.adapter'
text_names_prefix = 'organize.member.registration'
# texts: reg_info, reg_feedback, conf_mail, conf_info, conf_feedback
info_key = 'reg_info'
feedback_key = 'reg_feedback'
isInnerHtml = False
showAssignments = False
form_action = 'register'
def closeAction(self, submit=True):
return u''
@Lazy @Lazy
def macro(self): def macro(self):
@ -118,6 +130,21 @@ class BaseMemberRegistration(NodeView):
def getPrincipalAnnotation(self, principal): def getPrincipalAnnotation(self, principal):
return annotations(principal).get(ANNOTATION_KEY, None) return annotations(principal).get(ANNOTATION_KEY, None)
@Lazy
def infoText(self):
name = '.'.join((self.text_names_prefix, self.info_key))
text = self.resourceManager.get(name)
if text:
return self.renderText(text.data)
return u''
@Lazy
def feedbackUrl(self):
name = '.'.join((self.text_names_prefix, self.feedback_key))
text = self.resourceManager.get(name)
if text:
return self.getUrlForTarget(text)
class MemberRegistration(BaseMemberRegistration, CreateForm): class MemberRegistration(BaseMemberRegistration, CreateForm):
@ -135,7 +162,7 @@ class MemberRegistration(BaseMemberRegistration, CreateForm):
def update(self): def update(self):
form = self.request.form form = self.request.form
if not form.get('action'): if not form.get('form.action'):
return True return True
instance = component.getAdapter(self.object, IInstance, name='editor') instance = component.getAdapter(self.object, IInstance, name='editor')
instance.template = self.schema instance.template = self.schema
@ -186,13 +213,17 @@ class SecureMemberRegistration(BaseMemberRegistration, CreateForm):
#schema.fields.reorder(-2, 'loginName') #schema.fields.reorder(-2, 'loginName')
return schema return schema
@Lazy
def macro(self):
return organize_macros.macros['register']
@Lazy @Lazy
def object(self): def object(self):
return Person(Concept()) return Person(Concept())
def update(self): def update(self):
form = self.request.form form = self.request.form
if not form.get('action'): if not form.get('form.action'):
return True return True
instance = component.getAdapter(self.object, IInstance, name='editor') instance = component.getAdapter(self.object, IInstance, name='editor')
instance.template = self.schema instance.template = self.schema
@ -221,6 +252,9 @@ class SecureMemberRegistration(BaseMemberRegistration, CreateForm):
pa['id'] = generateName() pa['id'] = generateName()
pa['timestamp'] = datetime.utcnow() pa['timestamp'] = datetime.utcnow()
self.notifyEmail(login, email, pa['id']) self.notifyEmail(login, email, pa['id'])
if self.feedbackUrl:
self.request.response.redirect(self.feedbackUrl)
else:
msg = self.message msg = self.message
self.request.response.redirect('%s?loops.message=%s' % (self.url, msg)) self.request.response.redirect('%s?loops.message=%s' % (self.url, msg))
return False return False
@ -230,11 +264,18 @@ class SecureMemberRegistration(BaseMemberRegistration, CreateForm):
url = u'%s/selfservice_confirmation.html?login=%s&id=%s' % ( url = u'%s/selfservice_confirmation.html?login=%s&id=%s' % (
baseUrl, userid, id,) baseUrl, userid, id,)
recipients = [recipient] recipients = [recipient]
subject = _(u'confirmation_mail_subject')
name = '.'.join((self.text_names_prefix, self.feedback_key))
text = self.resourceManager.get(name)
if text:
message = text.data % url
subject = text.description or subject
else:
message = _(u'confirmation_mail_text') + u':\n\n' message = _(u'confirmation_mail_text') + u':\n\n'
message = (message + url).encode('UTF-8') message = (message + url).encode('UTF-8')
sender = 'helmutm@cy55.de' sender = 'helmutm@cy55.de'
msg = MIMEText(message, 'plain', 'utf-8') msg = MIMEText(message, 'plain', 'utf-8')
msg['Subject'] = _(u'confirmation_mail_subject') msg['Subject'] = subject
msg['From'] = sender msg['From'] = sender
msg['To'] = ', '.join(recipients) msg['To'] = ', '.join(recipients)
mailhost = component.getUtility(IMailDelivery, 'Mail') mailhost = component.getUtility(IMailDelivery, 'Mail')
@ -245,15 +286,11 @@ class ConfirmMemberRegistration(BaseMemberRegistration, Form):
permissions_key = u'secure_registration.permissions' permissions_key = u'secure_registration.permissions'
roles_key = u'secure_registration.roles' roles_key = u'secure_registration.roles'
info_key = 'conf_info'
feedback_key = 'conf_feedback'
template = form_macros
isInnerHtml = False
showAssignments = False
form_action = 'confirm_registration' form_action = 'confirm_registration'
def closeAction(self, submit=True):
return u''
@Lazy @Lazy
def macro(self): def macro(self):
return organize_macros.macros['confirm'] return organize_macros.macros['confirm']
@ -306,6 +343,9 @@ class ConfirmMemberRegistration(BaseMemberRegistration, Form):
del pa['timestamp'] del pa['timestamp']
ip = getInternalPrincipal(userId) ip = getInternalPrincipal(userId)
ip.setPassword(pw) ip.setPassword(pw)
if self.feedbackUrl:
self.request.response.redirect(self.feedbackUrl)
else:
url = '%s?loops.message=%s' % (self.url, self.message) url = '%s?loops.message=%s' % (self.url, self.message)
self.request.response.redirect(url) self.request.response.redirect(url)
return False return False

View file

@ -1,7 +1,14 @@
<html i18n:domain="loops"> <html i18n:domain="loops">
<metal:block define-macro="register">
<tal:info content="structure item/infoText" />
<metal:data use-macro="view/form_macros/edit" />
</metal:block>
<metal:block define-macro="confirm"> <metal:block define-macro="confirm">
<tal:info content="structure item/infoText" />
<metal:data use-macro="view/form_macros/edit"> <metal:data use-macro="view/form_macros/edit">
<metal:custom fill-slot="custom_header"> <metal:custom fill-slot="custom_header">
<tbody><tr><td colspan="5"> <tbody><tr><td colspan="5">