[Checkins] SVN: Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/ Join form.
Charlie Clark
charlie at begeistert.org
Tue Jun 29 14:16:32 EDT 2010
Log message for revision 113986:
Join form.
Changed:
U Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/TODO.txt
U Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/join.py
U Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/templates/join.pt
A Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/tests/join.txt
-=-
Modified: Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/TODO.txt
===================================================================
--- Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/TODO.txt 2010-06-29 18:06:53 UTC (rev 113985)
+++ Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/TODO.txt 2010-06-29 18:16:31 UTC (rev 113986)
@@ -15,11 +15,17 @@
mail_password_form -> MailPasswordFormView
mail_password_form.pt -> templates/mail_password.pt
- mail_password_response.pt
+ mail_password_response.pt -> joined.pt
[x] join:
- join_form.py -> Join
+ validatePassword.py
+ join_form.py
+ members_add_control.py -> Join
join_form_template -> templates/join.pt
+
+ [ ] preferences:
+
+ [ ] member roster:
[ ] complete this todo list
Modified: Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/join.py
===================================================================
--- Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/join.py 2010-06-29 18:06:53 UTC (rev 113985)
+++ Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/join.py 2010-06-29 18:16:31 UTC (rev 113986)
@@ -3,16 +3,22 @@
$Id$
"""
+from zope.interface import Interface, invariant, Invalid
+from zope.schema import ASCIILine, Password, Bool
from zope.formlib import form
-from zope.interface import Interface
-from zope.schema import ASCIILine, Password, Bool
+from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile
from Products.CMFDefault.formlib.form import EditFormBase
from Products.CMFDefault.formlib.schema import EmailLine
+from Products.CMFDefault.permissions import ManageUsers
from Products.CMFDefault.utils import Message as _
-class IZopeChooseSchema(Interface):
+def passwords_must_match(pw, confirmation):
+ pass
+
+
+class IJoinSchema(Interface):
"""Zope generates password and sends it by e-mail"""
member_id = ASCIILine(
@@ -23,30 +29,40 @@
title=_(u"E-mail address")
)
-class IUserChooseSchema(IZopeChooseSchema):
- """User is allowed to set their own e-mail"""
-
password = Password(
- title=_(u"Password")
+ title=_(u"Password"),
+ min_length=5
)
- password_confirmation = Password(
- title=_(u"Password (confirm)")
+ confirmation = Password(
+ title=_(u"Password (confirm)"),
+ min_length=5
)
send_password = Bool(
title=_(u"Mail Password?"),
description=_(u"Check this box to have the password mailed."))
+
+ @invariant
+ def check_passwords_match(schema):
+ """Password and confirmation must match"""
+ if schema.password != schema.confirmation:
+ raise Invalid(_(u"Passwords do not match"))
class Join(EditFormBase):
+ base_template = EditFormBase.template
+ template = ViewPageTemplateFile("templates/join.pt")
+ registered = False
+ form_fields = form.FormFields(IJoinSchema)
+
actions = form.Actions(
form.Action(
name='register',
label=_(u'Register'),
- validator='handle_register_validate',
- success='handle_success',
+ validator="validate_username",
+ success='handle_register_success',
failure='handle_failure'),
form.Action(
name='cancel',
@@ -57,20 +73,67 @@
def __init__(self, context, request):
super(Join, self).__init__(context, request)
ptool = self._getTool("portal_properties")
- validate = ptool.getProperty('validate_email')
- if validate:
- self.form_fields = form.FormFields(IZopeChooseSchema)
+ self.validate_email = ptool.getProperty('validate_email', None)
+ self.rtool = self._getTool('portal_registration')
+ self.mtool = self._getTool('portal_membership')
+
+ @property
+ def isAnon(self):
+ return self.mtool.isAnonymousUser()
+
+ @property
+ def isManager(self):
+ return self.mtool.checkPermission(ManageUsers, self.mtool)
+
+ @property
+ def isOrdinaryMember(self):
+ return not (self.registered or self.isManager or self.isAnon)
+
+ @property
+ def title(self):
+ if self.isManager:
+ return _(u"Register a new member")
else:
- self.form_fields = form.FormFields(IUserChooseSchema)
-
+ return _(u'Become a Member')
+
+ def setUpWidgets(self, ignore_request=False):
+ """If e-mail validation is in effect, users cannot select passwords"""
+ if self.validate_email:
+ self.form_fields = self.form_fields.select('member_id', 'email')
+ super(Join, self).setUpWidgets(ignore_request)
+
+ def personalize(self):
+ atool = self._getTool('portal_actions')
+ return atool.getActionInfo("user/preferences")['url']
+
+ def validate_username(self, action, data):
+ """Avoid duplicate registration"""
+ errors = super(Join, self).validate(action, data)
+ member = self.mtool.getMemberById(data['member_id'])
+ if member is not None:
+ errors.append(_(u"The login name you selected is already in use or is not valid. Please choose another."))
+ return errors
+
def add_member(self, data):
- """add member"""
+ """Add new member and notify if requested or required"""
+ self.rtool.addMember(
+ id=data['member_id'],
+ password=data['password'],
+ properties={
+ 'username': data['member_id'],
+ 'email': data['email']
+ }
+ )
+ if self.validate_email or data['send_password']:
+ self.rtool.registeredNotify(data['member_id'])
+ self.registered = True
+ self.label = _(u'Success')
- def send_password(self):
- """send password"""
-
- def handle_success(self, action, data):
- """"""
-
- def handle_failure(self, action, data):
- pass
+ def handle_register_success(self, action, data):
+ """Register user and inform they have been registered"""
+ if self.validate_email:
+ data['password'] = self.rtool.generatePassword()
+ self.add_member(data)
+ self.status = _(u'You have been registered as a member.')
+ if not self.validate_email:
+ self._setRedirect('portal_actions', 'user/login')
\ No newline at end of file
Modified: Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/templates/join.pt
===================================================================
--- Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/templates/join.pt 2010-06-29 18:06:53 UTC (rev 113985)
+++ Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/templates/join.pt 2010-06-29 18:16:31 UTC (rev 113986)
@@ -1,16 +1,32 @@
-<html metal:use-macro="context/main_template/macros/master">
+<html metal:use-macro="context/@@standard_macros/page">
<body>
<metal:slot metal:fill-slot="body" i18n:domain="cmf_default">
- <h1 i18n:translate="">Become a Member</h1>
+ <h1 tal:content="view/title" i18n:translate="">Become a member</h1>
+
+ <tal:case tal:condition="view/isAnon">
+ <p i18n:translate="">Becoming a member gives you the ability to personalize the site and participate in the community.</p>
- <p i18n:translate="">Becoming a member gives you the ability to personalize the site and participate in the community.</p>
+ <p i18n:translate="">It does not cost any money to become a member and your email and other personal information will remain private.</p>
+ </tal:case>
+
+ <tal:case tal:condition="view/isOrdinaryMember">
+ <p i18n:translate=""> You are already a member. You may use the
+ <a tal:attributes="href view/personalize">personalization form</a>
+ to change your membership information. </p>
+ </tal:case>
+
+ <tal:case condition="view/registered">
+ <p i18n:translate="">You have been registered as a member.</p>
- <p i18n:translate="">It does not cost any money to become a member and your email and other personal information will remain private.</p>
+ <p tal:condition="view/validate_email" i18n:translate="">You will receive
+ an email shortly containing your password and instructions on how to
+ activate your membership.</p>
+ </tal:case>
-<metal:macro metal:use-macro="view/base_template/macros/form" />
-
-
+<tal:case condition="not: view/isOrdinaryMember">
+ <metal:macro metal:use-macro="view/base_template/macros/form" />
+</tal:case>
</metal:slot>
</body>
Added: Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/tests/join.txt
===================================================================
--- Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/tests/join.txt (rev 0)
+++ Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/tests/join.txt 2010-06-29 18:16:31 UTC (rev 113986)
@@ -0,0 +1,26 @@
+Join views
+----------
+
+Create the browser object we'll be using.
+
+ # BBB for Zope 2.12
+ >>> try:
+ ... from Testing.testbrowser import Browser
+ ... except ImportError:
+ ... from Products.Five.testbrowser import Browser
+ >>> browser = Browser()
+
+Set properties to validation not required.
+
+ >>> from zope.component import getSiteManager
+ >>> from Products.CMFCore.interfaces import IPropertiesTool
+ >>> sm = getSiteManager()
+ >>> ptool = app.site.portal_properties
+ >>> sm.registerUtility(ptool, IPropertiesTool)
+ >>> ptool.editProperties({'validate_email':False})
+
+Open the join form. Password field should be visible
+
+ >>> browser.open("http://localhost/site/@@join.html")
+ >>> browser.getControl(name='form.password').value == ''
+ True
\ No newline at end of file
More information about the checkins
mailing list