[Checkins] SVN: Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/ - fixed Preferences form (re-implemented it using SettingsEditFormBase)

Yvo Schubbe y.2011 at wcm-solutions.de
Mon Feb 21 06:26:01 EST 2011


Log message for revision 120491:
  - fixed Preferences form (re-implemented it using SettingsEditFormBase)

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

-=-
Modified: Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/preferences.py
===================================================================
--- Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/preferences.py	2011-02-21 11:19:30 UTC (rev 120490)
+++ Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/preferences.py	2011-02-21 11:26:01 UTC (rev 120491)
@@ -13,20 +13,24 @@
 """Change user preferences.
 """
 
+from zope.component import adapts
 from zope.formlib import form
+from zope.interface import implements
 from zope.interface import Interface
 from zope.schema import Bool
 from zope.schema import Choice
 from zope.schema.vocabulary import SimpleVocabulary
 
+from Products.CMFCore.interfaces import IMember
 from Products.CMFCore.utils import getToolByName
-from Products.CMFDefault.formlib.form import EditFormBase
+from Products.CMFDefault.browser.utils import memoize
+from Products.CMFDefault.formlib.form import SettingsEditFormBase
 from Products.CMFDefault.formlib.schema import EmailLine
 from Products.CMFDefault.utils import Message as _
 
 
 def portal_skins(context):
-    stool = getToolByName(context, 'portal_skins')
+    stool = getToolByName(context.context, 'portal_skins')
     return SimpleVocabulary.fromValues(stool.getSkinSelections())
 
 
@@ -39,59 +43,54 @@
         title=_(u"Listed status"),
         description=_(u"Select to be listed on the public membership roster."))
 
-    skin = Choice(
+    portal_skin = Choice(
         title=_(u"Skin"),
         vocabulary=u"cmf.AvailableSkins",
-        required=False)
+        required=False,
+        missing_value='')
 
 
-class Preferences(EditFormBase):
+class PreferencesSchemaAdapter(object):
 
-    form_fields = form.FormFields(IPreferencesSchema)
+    """Adapter for IMember.
+    """
 
-    actions = form.Actions(
-                form.Action(
-                name="change",
-                label=u"Change",
-                success="handle_success",
-                failure="handle_failure"
-                    )
-                )
-    label = _(u"Member Preferences")
+    adapts(IMember)
+    implements(IPreferencesSchema)
 
-    def __init__(self, context, request):
-        super(Preferences, self).__init__(context, request)
-        self.mtool = self._getTool('portal_membership')
-        self.stool = self._getTool('portal_skins')
-        self.atool = self._getTool('portal_actions')
+    def __init__(self, context):
+        self.context = context
 
-    def get_skin_cookie(self):
-        """Check for user cookie"""
-        cookies = self.request.cookies
-        return cookies.get('portal_skin')
+    def __getattr__(self, name):
+        return self.context.getProperty(name)
 
-    @property
-    def member(self):
-        """Get the current user"""
-        return self.mtool.getAuthenticatedMember()
+    def __setattr__(self, name, value):
+        if name in ('email', 'listed', 'portal_skin'):
+            self.context.setMemberProperties({name: value})
+        else:
+            object.__setattr__(self, name, value)
 
-    def setUpWidgets(self, ignore_request=False):
-        """Populate form with member preferences"""
-        data = {}
-        data['email'] = self.member.email
-        data['listed'] = getattr(self.member, 'listed', None)
-        data['skin'] = self.get_skin_cookie()
 
-        self.widgets = form.setUpDataWidgets(self.form_fields,
-                                        self.prefix,
-                                        self.context,
-                                        self.request,
-                                        data=data,
-                                        ignore_request=False)
+class Preferences(SettingsEditFormBase):
 
-    def handle_success(self, action, data):
-        if 'skin' in data:
-            self.stool.portal_skins.updateSkinCookie()
-        self.member.setProperties(data)
-        self.status = _(u"Member preferences changed.")
-        self._setRedirect('portal_actions', 'user/preferences')
+    label = _(u"Member Preferences")
+    successMessage = _(u"Member preferences changed.")
+
+    form_fields = form.FormFields(IPreferencesSchema)
+
+    @memoize
+    def getContent(self):
+        mtool = self._getTool('portal_membership')
+        member = mtool.getAuthenticatedMember()
+        return PreferencesSchemaAdapter(member)
+
+    def applyChanges(self, data):
+        changes = super(Preferences, self).applyChanges(data)
+        if any('portal_skin' in v for v in changes.itervalues()):
+            stool = self._getTool('portal_skins')
+            stool.updateSkinCookie()
+        return changes
+
+    def handle_change_success(self, action, data):
+        self._handle_success(action, data)
+        return self._setRedirect('portal_actions', 'user/preferences')

Modified: Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/tests/preferences.txt
===================================================================
--- Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/tests/preferences.txt	2011-02-21 11:19:30 UTC (rev 120490)
+++ Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/tests/preferences.txt	2011-02-21 11:26:01 UTC (rev 120491)
@@ -6,23 +6,56 @@
     >>> from urllib import quote
     >>> uf = app.site.acl_users
     >>> _ignored = uf._doAddUser('mbr', 'mbrpw', ['Member'], [])
-    >>> mbr_credentials = quote('mbr:mbrpw'.encode('base64').rstrip())
 
 Create the browser object we'll be using.
 
     >>> from Testing.testbrowser import Browser
     >>> browser = Browser()
+    >>> browser.handleErrors = False
+    >>> browser.addHeader('Authorization', 'Basic mbr:mbrpw')
 
-Log the user in
-    >>> browser.open('http://localhost/site/@@login.html')
-    >>> browser.getControl('[[cmf_default][Member ID]]').value = 'mbr'
-    >>> browser.getControl('[[cmf_default][Password]]').value = 'mbrpw'
-    >>> browser.getControl('[[cmf_default][Login]]').click()
-    >>> '[[cmf_default][Login success]]' in browser.contents
+Use the preferences form without input.
+
+    >>> browser.open("http://localhost/site/@@preferences.html")
+    >>> '[[cmf_default][Member Preferences]]' in browser.contents
     True
+    >>> browser.getControl('[[cmf_default][Change]]').click()
+    >>> '[[zope][There were errors]]' in browser.contents
+    True
+    >>> '[[zope][Required input is missing.]]' in browser.contents
+    True
 
-Open the preferences form. Email field should be visible
+Use the preferences form with valid input. Keep skin unselected.
 
     >>> browser.open("http://localhost/site/@@preferences.html")
-    >>> browser.getControl(name='form.email').value == ''
+    >>> browser.getControl(name='form.email').value = 'ME at EXAMPLE.ORG'
+    >>> browser.getControl('[[cmf_default][Change]]').click()
+    >>> '[[cmf_default][Member preferences changed.]]' in browser.contents
     True
+
+Use the preferences form again without input.
+
+    >>> browser.open("http://localhost/site/@@preferences.html")
+    >>> '[[cmf_default][Member Preferences]]' in browser.contents
+    True
+    >>> browser.getControl('[[cmf_default][Change]]').click()
+    >>> '[[cmf_default][Nothing to change.]]' in browser.contents
+    True
+
+Use the preferences form with valid input. Select skin.
+
+    >>> browser.open("http://localhost/site/@@preferences.html")
+    >>> browser.getControl(name='form.listed').value = True
+    >>> browser.getControl(name='form.portal_skin').value = ('Basic',)
+    >>> browser.getControl('[[cmf_default][Change]]').click()
+    >>> '[[cmf_default][Member preferences changed.]]' in browser.contents
+    True
+
+Use the preferences form again without input.
+
+    >>> browser.open("http://localhost/site/@@preferences.html")
+    >>> '[[cmf_default][Member Preferences]]' in browser.contents
+    True
+    >>> browser.getControl('[[cmf_default][Change]]').click()
+    >>> '[[cmf_default][Nothing to change.]]' in browser.contents
+    True



More information about the checkins mailing list