[Checkins] SVN: Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/ Change password view.

Charlie Clark charlie at begeistert.org
Thu Jul 1 06:37:38 EDT 2010


Log message for revision 114042:
  Change password view.

Changed:
  U   Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/configure.zcml
  A   Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/password.pt
  A   Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/password.py
  A   Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/password.txt

-=-
Modified: Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/configure.zcml
===================================================================
--- Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/configure.zcml	2010-07-01 10:37:00 UTC (rev 114041)
+++ Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/configure.zcml	2010-07-01 10:37:37 UTC (rev 114042)
@@ -59,11 +59,17 @@
   />
   
   <utility
-   component=".preferences.portal_skins"
-   provides="zope.schema.interfaces.IVocabularyFactory"
-   name="cmf.portal_skins"
+      component=".preferences.portal_skins"
+      provides="zope.schema.interfaces.IVocabularyFactory"
+      name="cmf.portal_skins"
   />
-  
-  
 
+  <browser:page
+      for="Products.CMFCore.interfaces.ISiteRoot"
+      layer="Products.CMFDefault.interfaces.ICMFDefaultSkin"
+      name="password.html"
+      class=".password.Password"
+      permission="cmf.SetOwnPassword"
+  />
+
 </configure>

Added: Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/password.pt
===================================================================
--- Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/password.pt	                        (rev 0)
+++ Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/password.pt	2010-07-01 10:37:37 UTC (rev 114042)
@@ -0,0 +1,24 @@
+<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>

Added: Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/password.py
===================================================================
--- Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/password.py	                        (rev 0)
+++ Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/password.py	2010-07-01 10:37:37 UTC (rev 114042)
@@ -0,0 +1,101 @@
+"""
+Change password form
+"""
+
+from DateTime import DateTime
+
+from zope.formlib import form
+from zope.interface import Interface, invariant
+from zope.schema import ASCIILine, Password, List, TextLine
+
+from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile
+
+from Products.CMFCore.utils import getToolByName
+from Products.CMFDefault.utils import Message as _
+from Products.CMFDefault.formlib.form import EditFormBase
+
+def check_domain(value):
+    if " " in value:
+        return False
+    return True
+
+
+class IPasswordSchema(Interface):
+    
+    password = Password(
+                    title=_(u"New password"),
+                    min_length=5,
+                    required=False
+                    )
+
+    confirmation = Password(
+                    title=_(u"Confirm new password"),
+                    required=False
+                    )
+                    
+    domains = List(
+                    title=_("Domains"),
+                    description=_(u"""If you do not know what this field is
+                                      for, leave it blank."""),
+                    value_type=ASCIILine(
+                            title=_(u"Domain name"),
+                            constraint=check_domain
+                            ),
+                    required = False
+                )
+                        
+    @invariant
+    def check_passwords_match(schema):
+        """Password and confirmation must match"""
+        if schema.password != schema.confirmation:
+            raise Invalid(_(u"Passwords do not match"))
+        
+
+class Password(EditFormBase):
+    
+    form_fields = form.FormFields(IPasswordSchema)
+    
+    actions = form.Actions(
+                    form.Action(
+                        name="change",
+                        label=_(u"Change password"),
+                        success="handle_success",
+                        failure="handle_failure"
+                        )
+                    )
+                    
+    template = ViewPageTemplateFile("password.pt")
+    base_template = EditFormBase.template
+    
+    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 setUpWidgets(self, ignore_request=False):
+        """Populate form with user domains"""
+        data = {}
+        data['domains'] = " ".join(self.member.getDomains())
+        self.widgets = form.setUpDataWidgets(
+                            self.form_fields,
+                            self.prefix,
+                            self.context,
+                            self.request,
+                            data=data,
+                            ignore_request=ignore_request)
+        
+    @property
+    def member(self):
+        return self.mtool.getAuthenticatedMember()
+        
+    @property
+    def is_first_login(self):
+        return self.member.getProperty('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")


Property changes on: Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/password.py
___________________________________________________________________
Added: svn:keywords
   + Id
Added: svn:eol-style
   + native

Added: Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/password.txt
===================================================================
--- Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/password.txt	                        (rev 0)
+++ Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/password.txt	2010-07-01 10:37:37 UTC (rev 114042)
@@ -0,0 +1,7 @@
+Password change form
+--------------------
+
+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
\ No newline at end of file



More information about the checkins mailing list