[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