[Checkins] SVN: Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/ - improved join form

Yvo Schubbe cvs-admin at zope.org
Sat Jun 23 14:49:55 UTC 2012


Log message for revision 127053:
  - improved join form

Changed:
  U   Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/join.pt
  U   Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/join.py
  U   Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/tests/join.txt

-=-
Modified: Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/join.pt
===================================================================
--- Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/join.pt	2012-06-23 04:11:43 UTC (rev 127052)
+++ Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/join.pt	2012-06-23 14:49:50 UTC (rev 127053)
@@ -16,14 +16,6 @@
          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 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>
-
 <tal:case condition="not: view/isOrdinaryMember">
   <metal:macro metal:use-macro="view/base_template/macros/form" />
 </tal:case>

Modified: Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/join.py
===================================================================
--- Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/join.py	2012-06-23 04:11:43 UTC (rev 127052)
+++ Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/join.py	2012-06-23 14:49:50 UTC (rev 127053)
@@ -13,8 +13,10 @@
 """Join form.
 """
 
+import transaction
 from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile
 from zope.component import getUtility
+from zope.component import queryUtility
 from zope.formlib import form
 from zope.interface import Interface
 from zope.interface import Invalid
@@ -24,6 +26,7 @@
 from zope.schema import Password
 
 from Products.CMFCore.interfaces import IActionsTool
+from Products.CMFCore.interfaces import ICookieCrumbler
 from Products.CMFCore.interfaces import IMembershipTool
 from Products.CMFCore.interfaces import IPropertiesTool
 from Products.CMFCore.interfaces import IRegistrationTool
@@ -69,7 +72,6 @@
 
     base_template = EditFormBase.template
     template = ViewPageTemplateFile("join.pt")
-    registered = False
 
     actions = form.Actions(
         form.Action(
@@ -112,7 +114,7 @@
     @property
     @memoize
     def isOrdinaryMember(self):
-        return not (self.registered or self.isManager or self.isAnon)
+        return not (self.isManager or self.isAnon)
 
     @property
     def title(self):
@@ -142,29 +144,57 @@
                             u"or is not valid. Please choose another."))
         return errors
 
-    def add_member(self, data):
-        """Add new member and notify if requested or required"""
+    def _add_member(self, data):
+        member_id = data['member_id']
+        password = data['password'].encode(self._getDefaultCharset())
         rtool = getUtility(IRegistrationTool)
-        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']:
-            rtool.registeredNotify(data['member_id'])
-        self.registered = True
-        self.label = _(u'Success')
+        rtool.addMember(id=member_id, password=password,
+                        properties={'username': member_id,
+                                    'email': data['email']})
 
+    def _notify_member(self, data):
+        if not (self.validate_email or data['send_password']):
+            return False
+        rtool = getUtility(IRegistrationTool)
+        try:
+            rtool.registeredNotify(data['member_id'], REQUEST=self.request)
+        except IOError:
+            return False
+        return True
+
     def handle_register_success(self, action, data):
         """Register user and inform they have been registered"""
-        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')
+        try:
+            self._add_member(data)
+        except ValueError, errmsg:
+            transaction.abort()
+            self.form_reset = False
+            self.status = errmsg
+            return self.handle_failure(action, data, ())
 
+        if self.isManager:
+            if self._notify_member(data):
+                self.status = _(u'Member registered and notified.')
+            else:
+                self.status = _(u'Member registered.')
+            return self._setRedirect('portal_actions',
+                                     'global/members_register',
+                                     keys='b_start')
+        if self._notify_member(data):
+            self.status = _(u'You will receive an email shortly containing '
+                            u'your password and instructions on how to '
+                            u'activate your membership.')
+        else:
+            self.status = _(u'You have been registered as a member.')
+        try:
+            cctool = queryUtility(ICookieCrumbler)
+            ac_name_id = cctool.name_cookie
+        except AttributeError:
+            ac_name_id = '__ac_name'
+        self.request.form[ac_name_id] = data['member_id']
+        return self._setRedirect('portal_actions', 'user/login',
+                                 keys=ac_name_id)
+
     def handle_cancel_success(self, action, data):
         return self._setRedirect('portal_actions', 'global/manage_members',
                                  keys='b_start')

Modified: Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/tests/join.txt
===================================================================
--- Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/tests/join.txt	2012-06-23 04:11:43 UTC (rev 127052)
+++ Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/tests/join.txt	2012-06-23 14:49:50 UTC (rev 127053)
@@ -15,6 +15,8 @@
 Open the join form. Password field should be visible
 
     >>> browser.open('http://localhost/site/@@join.html')
+    >>> '[[cmf_default][Become a Member]]' in browser.contents
+    True
     >>> browser.getControl(name='form.password').value == ''
     True
 
@@ -25,10 +27,58 @@
     >>> browser.url
     'http://localhost/site'
 
-Cancel redirects managers to the members_manage_form.
+Use the form without input as anonymous user.
 
+    >>> browser.open('http://localhost/site/@@join.html')
+    >>> browser.getControl('[[cmf_default][Register]]').click()
+    >>> '[[zope][There were errors]]' in browser.contents
+    True
+    >>> '[[zope][Required input is missing.]]' in browser.contents
+    True
+
+Use the form with valid input as anonymous user.
+
+    >>> browser.open('http://localhost/site/@@join.html')
+    >>> browser.getControl(name='form.member_id').value = 'FOO'
+    >>> browser.getControl(name='form.email').value = 'FOO at EXAMPLE.ORG'
+    >>> browser.getControl(name='form.password').value = 'SECRET'
+    >>> browser.getControl(name='form.confirmation').value = 'SECRET'
+    >>> browser.getControl('[[cmf_default][Register]]').click()
+    >>> '[[cmf_default][You have been registered' in browser.contents
+    True
+
+Open the join form as manager.
+
     >>> browser.addHeader('Authorization', 'Basic mgr:mgrpw')
     >>> browser.open('http://localhost/site/@@join.html')
+    >>> '[[cmf_default][Register a New Member]]' in browser.contents
+    True
+    >>> browser.getControl(name='form.password').value == ''
+    True
+
+Cancel redirects managers to the members_manage_form.
+
+    >>> browser.open('http://localhost/site/@@join.html')
     >>> browser.getControl('[[cmf_default][Cancel]]').click()
     >>> browser.url
     'http://localhost/site/members_manage_form'
+
+Use the form without input as manager.
+
+    >>> browser.open('http://localhost/site/@@join.html')
+    >>> browser.getControl('[[cmf_default][Register]]').click()
+    >>> '[[zope][There were errors]]' in browser.contents
+    True
+    >>> '[[zope][Required input is missing.]]' in browser.contents
+    True
+
+Use the form with valid input as manager.
+
+    >>> browser.open('http://localhost/site/@@join.html')
+    >>> browser.getControl(name='form.member_id').value = 'BAR'
+    >>> browser.getControl(name='form.email').value = 'BAR at EXAMPLE.ORG'
+    >>> browser.getControl(name='form.password').value = 'SECRET'
+    >>> browser.getControl(name='form.confirmation').value = 'SECRET'
+    >>> browser.getControl('[[cmf_default][Register]]').click()
+    >>> '[[cmf_default][Member registered.]]' in browser.contents
+    True



More information about the checkins mailing list