[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