[Checkins] SVN: grokapps/LoginDemo/src/logindemo/ implemented IIterableSource for password_encoding choice field in IUser

Luciano Ramalho luciano at ramalho.org
Wed Jan 2 01:37:00 EST 2008


Log message for revision 82637:
  implemented IIterableSource for password_encoding choice field in IUser

Changed:
  U   grokapps/LoginDemo/src/logindemo/app.py
  U   grokapps/LoginDemo/src/logindemo/ftests/member.txt
  U   grokapps/LoginDemo/src/logindemo/interfaces.py

-=-
Modified: grokapps/LoginDemo/src/logindemo/app.py
===================================================================
--- grokapps/LoginDemo/src/logindemo/app.py	2008-01-02 05:31:50 UTC (rev 82636)
+++ grokapps/LoginDemo/src/logindemo/app.py	2008-01-02 06:37:00 UTC (rev 82637)
@@ -8,6 +8,8 @@
 from zope.app.authentication.principalfolder import PrincipalFolder
 from zope.app.authentication.principalfolder import InternalPrincipal
 from zope.app.authentication.session import SessionCredentialsPlugin
+# XXX: Failed attempt to display the password_encoding field
+# from zope.app.form.browser.source import SourceDropdownWidget
 from zope.app.security.interfaces import IAuthentication
 from zope.app.security.interfaces import IUnauthenticatedPrincipal
 from zope.app.securitypolicy.interfaces import IPrincipalPermissionManager
@@ -93,6 +95,10 @@
     User registration form.
     """
     form_fields = grok.AutoFields(IUser)
+    
+    # XXX: Failed attempt to display the password_encoding field
+    #form_fields[u'password_encoding'].custom_widget = SourceDropdownWidget
+  
     form_title = u'User registration'
     
     @grok.action('Save')

Modified: grokapps/LoginDemo/src/logindemo/ftests/member.txt
===================================================================
--- grokapps/LoginDemo/src/logindemo/ftests/member.txt	2008-01-02 05:31:50 UTC (rev 82636)
+++ grokapps/LoginDemo/src/logindemo/ftests/member.txt	2008-01-02 06:37:00 UTC (rev 82637)
@@ -36,15 +36,15 @@
     name ip-title
     email user at domain.com    
 
-One day we may allow a user to choose his PasswordManager. To allow that,
-we'll need a list of available options::
+One day we may allow a user to choose his PasswordManager. We'll do that as soon
+as we discover how to display a Choices field in a form. Meanwhile, we know
+we'll need a list of available options, so here is how we generate one::
 
-    >>> from zope.component import getUtilitiesFor
-    >>> from zope.app.authentication.interfaces import IPasswordManager
-    >>> for name, util in sorted(getUtilitiesFor(IPasswordManager)):
-    ...     print name
+    >>> from logindemo.interfaces import PasswordManagerChoices
+    >>> choices = PasswordManagerChoices()
+    >>> len(choices)
+    3
+    >>> for choice in choices: print choice
     MD5
     Plain Text
     SHA1
-    
-

Modified: grokapps/LoginDemo/src/logindemo/interfaces.py
===================================================================
--- grokapps/LoginDemo/src/logindemo/interfaces.py	2008-01-02 05:31:50 UTC (rev 82636)
+++ grokapps/LoginDemo/src/logindemo/interfaces.py	2008-01-02 06:37:00 UTC (rev 82637)
@@ -2,9 +2,10 @@
 
 from zope.interface import Interface, implements
 from zope import schema
-from zope.component import adapts
+from zope.component import adapts, getUtilitiesFor
 from zope.annotation.interfaces import IAnnotations
 from zope.app.authentication.principalfolder import IInternalPrincipal
+from zope.app.authentication.interfaces import IPasswordManager
 from persistent.dict import PersistentDict
 from zope.i18n import MessageFactory
 
@@ -21,12 +22,32 @@
         return True
     raise NotAnEmailAddress(value)
 
+class PasswordManagerChoices(object):
+    implements(schema.interfaces.IIterableSource)
+    
+    def __init__(self):
+        self.choices = [name for name, util in
+                            sorted(getUtilitiesFor(IPasswordManager))]
+        
+    def __iter__(self):
+        return iter(self.choices)
+    
+    def __len__(self):
+        return len(self.choices)
+    
+    def __contains__(self, value):
+        return value in self.choices
+
 class IUser(Interface):
     """Basic user data."""
     login = schema.TextLine(title=_(u"Login"),
                             required=True)
     password = schema.Password(title=_(u"Password"),
                             required=True)
+    # XXX: I have not managed yet to display this in the app.py join form
+    #password_encoding = schema.Choice(title=_(u"Password encoding"),
+    #                        required=True,
+    #                        source=PasswordManagerChoices())
     name = schema.TextLine(title=_(u"Full name"),
                             required=False)
     email = schema.ASCIILine(title=_(u"E-mail"),
@@ -52,7 +73,7 @@
         annotations = IAnnotations(context)
         self.context = context
         self.data = annotations.get(USER_DATA_KEY)
-        if  self.data is None:
+        if self.data is None:
             self.data = PersistentDict()
             for field in IUser:
                 if field not in IInternalPrincipal:



More information about the Checkins mailing list