[Checkins] SVN: Products.CMFDefault/trunk/Products/CMFDefault/ - reimplemented PasswordFormView

Yvo Schubbe y.2011 at wcm-solutions.de
Fri Jul 29 09:56:54 EDT 2011


Log message for revision 122422:
  - reimplemented PasswordFormView
  - fixed / changed several redirect targets

Changed:
  U   Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/authentication.py
  U   Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/configure.zcml
  U   Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/join.py
  D   Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/password.pt
  U   Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/password.py
  U   Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/password.txt
  U   Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/preferences.py
  U   Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/preferences.txt
  U   Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/tests/password.txt
  U   Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/tests/preferences.txt
  U   Products.CMFDefault/trunk/Products/CMFDefault/formlib/form.py
  U   Products.CMFDefault/trunk/Products/CMFDefault/skins/zpt_generic/logged_in.py
  U   Products.CMFDefault/trunk/Products/CMFDefault/skins/zpt_generic/password_form.py

-=-
Modified: Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/authentication.py
===================================================================
--- Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/authentication.py	2011-07-29 09:51:38 UTC (rev 122421)
+++ Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/authentication.py	2011-07-29 13:56:54 UTC (rev 122422)
@@ -215,10 +215,10 @@
 
     def first_login(self, member):
         """First time login, reset password"""
-        utool = self._getTool('portal_url')
+        atool = self._getTool('portal_actions')
         now = DateTime()
         member.setProperties(last_login_time='1999/01/01', login_time=now)
-        target = '%s/password_form' % utool()
+        target = atool.getActionInfo('user/change_password')['url']
         return self.request.response.redirect(target)
 
     def __call__(self):

Modified: Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/configure.zcml
===================================================================
--- Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/configure.zcml	2011-07-29 09:51:38 UTC (rev 122421)
+++ Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/configure.zcml	2011-07-29 13:56:54 UTC (rev 122422)
@@ -54,7 +54,7 @@
       for="Products.CMFCore.interfaces.ISiteRoot"
       layer="Products.CMFDefault.interfaces.ICMFDefaultSkin"
       name="preferences.html"
-      class=".preferences.Preferences"
+      class=".preferences.PreferencesFormView"
       permission="cmf.SetOwnProperties"
       />
 
@@ -68,7 +68,7 @@
       for="Products.CMFCore.interfaces.ISiteRoot"
       layer="Products.CMFDefault.interfaces.ICMFDefaultSkin"
       name="password.html"
-      class=".password.Password"
+      class=".password.PasswordFormView"
       permission="cmf.SetOwnPassword"
       />
 

Modified: Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/join.py
===================================================================
--- Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/join.py	2011-07-29 09:51:38 UTC (rev 122421)
+++ Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/join.py	2011-07-29 13:56:54 UTC (rev 122422)
@@ -79,8 +79,7 @@
             name='cancel',
             label=_(u'Cancel'),
             validator='handle_cancel_validate',
-            success='handle_cancel_success',
-            failure='handle_cancel_failure'))
+            success='handle_cancel_success'))
 
     @property
     def form_fields(self):
@@ -163,14 +162,6 @@
         if not self.validate_email:
             self._setRedirect('portal_actions', 'user/login')
 
-    def handle_cancel_validate(self, action, data):
-        return []
-
     def handle_cancel_success(self, action, data):
         return self._setRedirect('portal_actions', 'global/manage_members',
                                  keys='b_start')
-
-    def handle_cancel_failure(self, action, data, errors):
-        self.status = None
-        return self._setRedirect('portal_actions', 'global/manage_members',
-                                 keys='b_start')

Deleted: Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/password.pt
===================================================================
--- Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/password.pt	2011-07-29 09:51:38 UTC (rev 122421)
+++ Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/password.pt	2011-07-29 13:56:54 UTC (rev 122422)
@@ -1,24 +0,0 @@
-<html metal:use-macro="context/@@standard_macros/page">
-<body>
-
-<h1 tal:content="view/title">Title</h1>
-
-<metal:slot metal:fill-slot="body" i18n:domain="cmf_default">
-
-<tal:case tal:condition="view/is_first_login">
-<p i18n:translate="">This is the first time that you've logged in to
- <tal:span tal:content="context/title"
-    i18n:name="portal_title">Here</tal:span>.
- Before you start exploring you need to change your original password. This
- will ensure that the password we sent you via email cannot be used in a
- malicious manner.</p>
-
-<p i18n:translate="">Please use the form below to change your password.</p>
-</tal:case>
-
-<metal:macro metal:use-macro="view/base_template/macros/form" />
-
-</metal:slot>
-
-</body>
-</html>

Modified: Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/password.py
===================================================================
--- Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/password.py	2011-07-29 09:51:38 UTC (rev 122421)
+++ Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/password.py	2011-07-29 13:56:54 UTC (rev 122422)
@@ -14,15 +14,20 @@
 """
 
 from DateTime import DateTime
-from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile
+from zope.component import adapts
+from zope.component import getUtility
 from zope.formlib import form
+from zope.interface import implements
 from zope.interface import Interface
 from zope.interface import Invalid
 from zope.interface import invariant
 from zope.schema import Password
 
-from Products.CMFCore.utils import getToolByName
-from Products.CMFDefault.formlib.form import EditFormBase
+from Products.CMFCore.interfaces import IMember
+from Products.CMFCore.interfaces import ISiteRoot
+from Products.CMFDefault.browser.utils import memoize
+from Products.CMFDefault.browser.utils import decode
+from Products.CMFDefault.formlib.form import SettingsEditFormBase
 from Products.CMFDefault.utils import Message as _
 
 
@@ -46,39 +51,81 @@
                             u"Please try again."))
 
 
-class Password(EditFormBase):
+class PasswordSchemaAdapter(object):
 
-    form_fields = form.FormFields(IPasswordSchema)
+    adapts(IMember)
+    implements(IPasswordSchema)
 
-    actions = form.Actions(
-                    form.Action(
-                        name="change",
-                        label=_(u"Change"),
-                        success="handle_success",
-                        failure="handle_failure"
-                        )
-                    )
+    def __init__(self, context):
+        self.context = context
 
-    template = ViewPageTemplateFile("password.pt")
-    base_template = EditFormBase.template
+    def _getPassword(self):
+        return u''
 
-    def __init__(self, context, request):
-        super(Password, self).__init__(context, request)
-        self.mtool = getToolByName(self.context, 'portal_membership')
-        self.rtool = getToolByName(self.context, 'portal_registration')
-        if self.member.getProperty('last_login_time') == DateTime('1999/01/01'):
-            self.member.setProperties(last_login_time='2000/01/01')
+    def _setPassword(self, val):
+        self.context.setSecurityProfile(val)
 
+    def _getLastLoginTime(self):
+        return self.context.getProperty('last_login_time')
+
+    def _setLastLoginTime(self, val):
+        self.context.setProperties(last_login_time=val)
+
+    password = property(_getPassword, _setPassword)
+    confirmation = u''
+    last_login_time = property(_getLastLoginTime, _setLastLoginTime)
+
+
+class PasswordFormView(SettingsEditFormBase):
+
+    successMessage = _(u"Your password has been changed.")
+    form_fields = form.FormFields(IPasswordSchema)
+
     @property
-    def member(self):
-        return self.mtool.getAuthenticatedMember()
+    def label(self):
+        if self.is_first_login:
+            return _(u'Welcome!')
+        else:
+            return _(u'Change your Password')
 
     @property
+    @decode
+    def portal_title(self):
+        return getUtility(ISiteRoot).title
+
+    @property
+    def description(self):
+        if self.is_first_login:
+            return _(u"This is the first time that you've logged in to "
+                     u"${portal_title}. Before you start exploring you need "
+                     u"to change your original password. This will ensure "
+                     u"that the password we sent you via email cannot be "
+                     u"used in a malicious manner.",
+                     mapping={'portal_title': self.portal_title})
+        else:
+            return _(u'Please use the form below to change your password.')
+
+    @memoize
+    def getContent(self):
+        mtool = self._getTool('portal_membership')
+        member = mtool.getAuthenticatedMember()
+        return PasswordSchemaAdapter(member)
+
+    @property
     def is_first_login(self):
-        return self.member.getProperty('last_login_time') == DateTime('1999/01/01')
+        return self.getContent().last_login_time == DateTime('1999/01/01')
 
-    def handle_success(self, action, data):
-        data.pop("confirmation")
-        self.member.setSecurityProfile(**data)
-        self.status = _(u'Your password has been changed.')
-        self._setRedirect("portal_actions", "user/login")
+    def applyChanges(self, data):
+        changes = super(PasswordFormView, self).applyChanges(data)
+        if self.getContent().last_login_time == DateTime('1999/01/01'):
+            self.getContent().last_login_time = DateTime('2000/01/01')
+        mtool = self._getTool('portal_membership')
+        mtool.credentialsChanged(data['password'], self.request)
+        return changes
+
+    def handle_change_success(self, action, data):
+        self._handle_success(action, data)
+        return self._setRedirect('portal_actions', 'user/mystuff')
+
+    def handle_cancel_success(self, action, data):
+        return self._setRedirect('portal_actions', 'user/mystuff')

Modified: Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/password.txt
===================================================================
--- Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/password.txt	2011-07-29 09:51:38 UTC (rev 122421)
+++ Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/password.txt	2011-07-29 13:56:54 UTC (rev 122422)
@@ -3,5 +3,3 @@
 
 Apply same constraints as when joining
 Uses that have been sent a password must change it using this form the first time they log in
-
-Once the password has been changed the user must login again

Modified: Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/preferences.py
===================================================================
--- Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/preferences.py	2011-07-29 09:51:38 UTC (rev 122421)
+++ Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/preferences.py	2011-07-29 13:56:54 UTC (rev 122422)
@@ -71,7 +71,7 @@
             object.__setattr__(self, name, value)
 
 
-class Preferences(SettingsEditFormBase):
+class PreferencesFormView(SettingsEditFormBase):
 
     label = _(u"Member Preferences")
     successMessage = _(u"Member preferences changed.")
@@ -85,7 +85,7 @@
         return PreferencesSchemaAdapter(member)
 
     def applyChanges(self, data):
-        changes = super(Preferences, self).applyChanges(data)
+        changes = super(PreferencesFormView, self).applyChanges(data)
         if any('portal_skin' in v for v in changes.itervalues()):
             stool = self._getTool('portal_skins')
             stool.updateSkinCookie()
@@ -94,3 +94,6 @@
     def handle_change_success(self, action, data):
         self._handle_success(action, data)
         return self._setRedirect('portal_actions', 'user/preferences')
+
+    def handle_cancel_success(self, action, data):
+        return self._setRedirect('portal_actions', 'user/mystuff')

Modified: Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/preferences.txt
===================================================================
--- Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/preferences.txt	2011-07-29 09:51:38 UTC (rev 122421)
+++ Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/preferences.txt	2011-07-29 13:56:54 UTC (rev 122422)
@@ -6,5 +6,3 @@
 Email address
 Listed or unlisted
 User's chosen skin if set
-
-The preferences form contains a link to password change form

Modified: Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/tests/password.txt
===================================================================
--- Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/tests/password.txt	2011-07-29 09:51:38 UTC (rev 122421)
+++ Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/tests/password.txt	2011-07-29 13:56:54 UTC (rev 122422)
@@ -14,6 +14,13 @@
     >>> browser.handleErrors = False
     >>> browser.addHeader('Authorization', 'Basic mbr:mbrpw')
 
+Cancel redirects users to the site root if no member area exists.
+
+    >>> browser.open('http://localhost/site/@@password.html')
+    >>> browser.getControl('[[cmf_default][Cancel]]').click()
+    >>> browser.url
+    'http://localhost/site'
+
 Open the join form. Password field should be visible
 
     >>> browser.open("http://localhost/site/@@password.html")

Modified: Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/tests/preferences.txt
===================================================================
--- Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/tests/preferences.txt	2011-07-29 09:51:38 UTC (rev 122421)
+++ Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/tests/preferences.txt	2011-07-29 13:56:54 UTC (rev 122422)
@@ -59,3 +59,10 @@
     >>> browser.getControl('[[cmf_default][Change]]').click()
     >>> '[[cmf_default][Nothing to change.]]' in browser.contents
     True
+
+Cancel redirects users to the site root if no member area exists.
+
+    >>> browser.open('http://localhost/site/@@preferences.html')
+    >>> browser.getControl('[[cmf_default][Cancel]]').click()
+    >>> browser.url
+    'http://localhost/site'

Modified: Products.CMFDefault/trunk/Products/CMFDefault/formlib/form.py
===================================================================
--- Products.CMFDefault/trunk/Products/CMFDefault/formlib/form.py	2011-07-29 09:51:38 UTC (rev 122421)
+++ Products.CMFDefault/trunk/Products/CMFDefault/formlib/form.py	2011-07-29 13:56:54 UTC (rev 122422)
@@ -82,6 +82,9 @@
             processInputs(self.request, [HTTPRequest.default_encoding])
         super(_EditFormMixin, self).update()
 
+    def handle_cancel_validate(self, action, data):
+        return []
+
     def handle_failure(self, action, data, errors):
         if self.status:
             message = translate(self.status, self.context)
@@ -103,7 +106,12 @@
             name='change',
             label=_(u'Change'),
             success='handle_change_success',
-            failure='handle_failure'))
+            failure='handle_failure'),
+        form.Action(
+            name='cancel',
+            label=_(u'Cancel'),
+            validator='handle_cancel_validate',
+            success='handle_cancel_success'))
 
     description = u''
     successMessage = _(u"Settings changed.")
@@ -157,8 +165,8 @@
         form.Action(
             name='cancel',
             label=_(u'Cancel'),
-            success='handle_cancel_success',
-            failure='handle_cancel_failure'))
+            validator='handle_cancel_validate',
+            success='handle_cancel_success'))
 
     def __init__(self, context, request, ti):
         self.context = context
@@ -200,11 +208,6 @@
         return self._setRedirect('portal_types',
                                  ('object/folderContents', 'object/view'))
 
-    def handle_cancel_failure(self, action, data, errors):
-        self.status = None
-        return self._setRedirect('portal_types',
-                                 ('object/folderContents', 'object/view'))
-
     def create(self, data):
         id = data.pop('id', '') or ''
         factory = getUtility(IFactory, self.ti.factory)

Modified: Products.CMFDefault/trunk/Products/CMFDefault/skins/zpt_generic/logged_in.py
===================================================================
--- Products.CMFDefault/trunk/Products/CMFDefault/skins/zpt_generic/logged_in.py	2011-07-29 09:51:38 UTC (rev 122421)
+++ Products.CMFDefault/trunk/Products/CMFDefault/skins/zpt_generic/logged_in.py	2011-07-29 13:56:54 UTC (rev 122422)
@@ -5,11 +5,10 @@
 from Products.CMFDefault.utils import decode
 from Products.CMFDefault.utils import Message as _
 
+atool = getToolByName(script, 'portal_actions')
 mtool = getToolByName(script, 'portal_membership')
 ptool = getUtilityByInterfaceName('Products.CMFCore.interfaces.IPropertiesTool')
 stool = getToolByName(script, 'portal_skins')
-utool = getToolByName(script, 'portal_url')
-portal_url = utool()
 
 
 if stool.updateSkinCookie():
@@ -33,7 +32,7 @@
     never_logged_in = str(last_login).startswith('2000/01/01')
     if never_logged_in and ptool.getProperty('validate_email'):
         member.setProperties(last_login_time='1999/01/01', login_time=now)
-        target = '%s/password_form' % portal_url
+        target = atool.getActionInfo('user/change_password')['url']
         context.REQUEST.RESPONSE.redirect(target)
         return
     else:

Modified: Products.CMFDefault/trunk/Products/CMFDefault/skins/zpt_generic/password_form.py
===================================================================
--- Products.CMFDefault/trunk/Products/CMFDefault/skins/zpt_generic/password_form.py	2011-07-29 09:51:38 UTC (rev 122421)
+++ Products.CMFDefault/trunk/Products/CMFDefault/skins/zpt_generic/password_form.py	2011-07-29 13:56:54 UTC (rev 122422)
@@ -15,10 +15,10 @@
 form = context.REQUEST.form
 if change and \
         context.change_password(**form) and \
-        context.setRedirect(atool, 'user/preferences'):
+        context.setRedirect(atool, 'user/mystuff'):
     return
 elif cancel and \
-        context.setRedirect(atool, 'user/preferences'):
+        context.setRedirect(atool, 'user/mystuff'):
     return
 
 



More information about the checkins mailing list