[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