[Checkins] SVN: Sandbox/kteague/BabyLoginDemo/ Simplified LoginDemo for Grok - partially complete implementation, enough to login but no logout

Kevin Teague kevin at bud.ca
Wed Jan 16 03:50:57 EST 2008


Log message for revision 82915:
  Simplified LoginDemo for Grok - partially complete implementation, enough to login but no logout

Changed:
  A   Sandbox/kteague/BabyLoginDemo/.installed.cfg
  A   Sandbox/kteague/BabyLoginDemo/buildout.cfg
  A   Sandbox/kteague/BabyLoginDemo/setup.py
  A   Sandbox/kteague/BabyLoginDemo/src/
  A   Sandbox/kteague/BabyLoginDemo/src/babylogindemo/
  A   Sandbox/kteague/BabyLoginDemo/src/babylogindemo/__init__.py
  A   Sandbox/kteague/BabyLoginDemo/src/babylogindemo/__init__.pyc
  A   Sandbox/kteague/BabyLoginDemo/src/babylogindemo/babylogin.py
  A   Sandbox/kteague/BabyLoginDemo/src/babylogindemo/babylogin.pyc
  A   Sandbox/kteague/BabyLoginDemo/src/babylogindemo/babylogin_templates/
  A   Sandbox/kteague/BabyLoginDemo/src/babylogindemo/babylogin_templates/index.pt
  A   Sandbox/kteague/BabyLoginDemo/src/babylogindemo/babylogin_templates/listing.pt
  A   Sandbox/kteague/BabyLoginDemo/src/babylogindemo/babylogin_templates/login.pt
  A   Sandbox/kteague/BabyLoginDemo/src/babylogindemo/babylogin_templates/master.pt
  A   Sandbox/kteague/BabyLoginDemo/src/babylogindemo/configure.zcml
  A   Sandbox/kteague/BabyLoginDemo/src/babylogindemo/form.pt
  A   Sandbox/kteague/BabyLoginDemo/src/babylogindemo/ftesting.zcml
  A   Sandbox/kteague/BabyLoginDemo/src/babylogindemo/memberauth.py
  A   Sandbox/kteague/BabyLoginDemo/src/babylogindemo/memberauth.pyc
  A   Sandbox/kteague/BabyLoginDemo/src/babylogindemo/members.py
  A   Sandbox/kteague/BabyLoginDemo/src/babylogindemo/members.pyc
  A   Sandbox/kteague/BabyLoginDemo/src/babylogindemo/testing.py
  A   Sandbox/kteague/BabyLoginDemo/src/babylogindemo/testing.pyc

-=-
Added: Sandbox/kteague/BabyLoginDemo/.installed.cfg
===================================================================
--- Sandbox/kteague/BabyLoginDemo/.installed.cfg	                        (rev 0)
+++ Sandbox/kteague/BabyLoginDemo/.installed.cfg	2008-01-16 08:50:57 UTC (rev 82915)
@@ -0,0 +1,125 @@
+[buildout]
+installed_develop_eggs = /Users/kteague/buildouts/BabyLoginDemo/develop-eggs/BabyLoginDemo.egg-link
+parts = app data zopectl i18n test
+
+[app]
+__buildout_installed__ = /Users/kteague/buildouts/BabyLoginDemo/parts/app
+__buildout_signature__ = zc.zope3recipes-0.6.0-py2.4.egg ZConfig-2.5-py2.4.egg zc.recipe.egg-1.0.0-py2.4.egg setuptools-0.6c7-py2.4.egg zope.testing-3.5.1-py2.4.egg zc.buildout-1.0.0-py2.4.egg zc.buildout-1.0.0-py2.4.egg
+_b = /Users/kteague/buildouts/BabyLoginDemo/bin
+_d = /Users/kteague/buildouts/BabyLoginDemo/develop-eggs
+_e = /Users/kteague/buildouts/shared/eggs
+bin-directory = /Users/kteague/buildouts/BabyLoginDemo/bin
+develop-eggs-directory = /Users/kteague/buildouts/BabyLoginDemo/develop-eggs
+eggs = BabyLoginDemo
+eggs-directory = /Users/kteague/buildouts/shared/eggs
+executable = /Applications/Plone-3.0.4/Python-2.4.4/bin/python
+find-links = http://download.zope.org/distribution/
+location = /Users/kteague/buildouts/BabyLoginDemo/parts/app
+recipe = zc.zope3recipes>=0.5.3:application
+scripts = 
+servers = twisted
+site.zcml = <include package="babylogindemo" />
+	<include package="zope.app.twisted" />
+	<configure i18n_domain="babylogindemo">
+	<unauthenticatedPrincipal id="zope.anybody"
+	title="Unauthenticated User" />
+	<unauthenticatedGroup id="zope.Anybody"
+	title="Unauthenticated Users" />
+	<authenticatedGroup id="zope.Authenticated"
+	title="Authenticated Users" />
+	<everybodyGroup id="zope.Everybody"
+	title="All Users" />
+	<principal id="zope.manager"
+	title="Manager"
+	login="grok"
+	password_manager="Plain Text"
+	password="grok"
+	/>
+	<!-- Replace the following directive if you don't want
+	public access -->
+	<grant permission="zope.View"
+	principal="zope.Anybody" />
+	<grant permission="zope.app.dublincore.view"
+	principal="zope.Anybody" />
+	<role id="zope.Manager" title="Site Manager" />
+	<role id="zope.Member" title="Site Member" />
+	<grantAll role="zope.Manager" />
+	<grant role="zope.Manager"
+	principal="zope.manager" />
+	</configure>
+
+[data]
+__buildout_installed__ = 
+__buildout_signature__ = zc.recipe.filestorage-1.0.0-py2.4.egg setuptools-0.6c7-py2.4.egg zope.testing-3.5.1-py2.4.egg zc.buildout-1.0.0-py2.4.egg
+blob-dir = 
+path = /Users/kteague/buildouts/BabyLoginDemo/parts/data/Data.fs
+recipe = zc.recipe.filestorage
+zconfig = <zodb>
+	%(__buildout_space__)s%(__buildout_space__)s<filestorage>
+	%(__buildout_space__)s%(__buildout_space__)s%(__buildout_space__)s%(__buildout_space__)spath /Users/kteague/buildouts/BabyLoginDemo/parts/data/Data.fs
+	%(__buildout_space__)s%(__buildout_space__)s</filestorage>
+	</zodb>%(__buildout_space_n__)s
+
+[zopectl]
+__buildout_installed__ = /Users/kteague/buildouts/BabyLoginDemo/parts/zopectl
+	/Users/kteague/buildouts/BabyLoginDemo/bin/zopectl
+__buildout_signature__ = zc.zope3recipes-0.6.0-py2.4.egg ZConfig-2.5-py2.4.egg zc.recipe.egg-1.0.0-py2.4.egg setuptools-0.6c7-py2.4.egg zope.testing-3.5.1-py2.4.egg zc.buildout-1.0.0-py2.4.egg zc.buildout-1.0.0-py2.4.egg
+_b = /Users/kteague/buildouts/BabyLoginDemo/bin
+_d = /Users/kteague/buildouts/BabyLoginDemo/develop-eggs
+_e = /Users/kteague/buildouts/shared/eggs
+application = app
+application-location = /Users/kteague/buildouts/BabyLoginDemo/parts/app
+bin-directory = /Users/kteague/buildouts/BabyLoginDemo/bin
+develop-eggs-directory = /Users/kteague/buildouts/BabyLoginDemo/develop-eggs
+eggs = zdaemon
+	setuptools
+eggs-directory = /Users/kteague/buildouts/shared/eggs
+executable = /Applications/Plone-3.0.4/Python-2.4.4/bin/python
+find-links = http://download.zope.org/distribution/
+recipe = zc.zope3recipes:instance
+run-directory = /Users/kteague/buildouts/BabyLoginDemo/parts/zopectl
+scripts = 
+servers = twisted
+zope.conf = <zodb>
+	%(__buildout_space__)s%(__buildout_space__)s<filestorage>
+	%(__buildout_space__)s%(__buildout_space__)s%(__buildout_space__)s%(__buildout_space__)spath /Users/kteague/buildouts/BabyLoginDemo/parts/data/Data.fs
+	%(__buildout_space__)s%(__buildout_space__)s</filestorage>
+	</zodb>%(__buildout_space_n__)s
+
+[i18n]
+__buildout_installed__ = bin/i18nextract
+	bin/i18nmergeall
+__buildout_signature__ = lovely.recipe-0.3.1b1-py2.4.egg ZConfig-2.5-py2.4.egg zc.zodbrecipes-0.2.1-py2.4.egg zc.zope3recipes-0.6.0-py2.4.egg zope.app.locales-3.4.0a1-py2.4.egg zc.recipe.egg-1.0.0-py2.4.egg zc.buildout-1.0.0-py2.4.egg setuptools-0.6c7-py2.4.egg ZODB3-3.8.0b2-py2.4-macosx-10.3-i386.egg zdaemon-2.0.0-py2.4.egg zope.testing-3.5.1-py2.4.egg ZConfig-2.5-py2.4.egg zope.tal-3.4.0b1-py2.4.egg zope.interface-3.4.0-py2.4-macosx-10.3-i386.egg zope.i18nmessageid-3.4.0a1-py2.4-macosx-10.3-i386.egg zope.app.appsetup-3.4.1-py2.4.egg zope.app.applicationcontrol-3.4.1-py2.4.egg zc.buildout-1.0.0-py2.4.egg zope.proxy-3.4.0-py2.4-macosx-10.3-i386.egg zope.i18n-3.4.0-py2.4.egg zope.traversing-3.5.0a1.dev_r78730-py2.4.egg zope.security-3.4.0b5-py2.4-macosx-10.3-i386.egg zope.event-3.4.0-py2.4.egg zope.error-3.5.1-py2.4.egg zope.configuration-3.4.0-py2.4.egg zope.component-3.4.0-py2.4.egg zope.app.publication-3.4.2-py2.4.egg zope.app.folder-3.4.0a1-py2.4.egg zope.app.container-3.5.0a1-py2.4-macosx-10.3-i386.egg zope.app.component-3.4.0b3-py2.4.egg zope.size-3.4.0-py2.4.egg zope.i18n-3.4.0-py2.4.egg zope.component-3.4.0-py2.4.egg pytz-2007g-py2.4.egg zope.publisher-3.5.0a1.dev_r78838-py2.4.egg zope.schema-3.4.0-py2.4.egg zope.location-3.4.0b2-py2.4.egg zope.exceptions-3.4.0-py2.4.egg zope.deferredimport-3.4.0-py2.4.egg zope.publisher-3.5.0a1.dev_r78838-py2.4.egg zope.deprecation-3.4.0-py2.4.egg zope.app.security-3.4.0a1_1-py2.4.egg zope.app.exception-3.4.0a1-py2.4.egg zope.app.error-3.5.1-py2.4.egg zope.app.http-3.4.0a1-py2.4.egg zope.app.authentication-3.4.0a1-py2.4.egg zope.datetime-3.4.0-py2.4.egg zope.dublincore-3.4.0-py2.4.egg zope.copypastemove-3.4.0-py2.4.egg zope.app.broken-3.4.0a1-py2.4.egg zope.filerepresentation-3.4.0-py2.4.egg zope.lifecycleevent-3.4.0-py2.4.egg zope.location-3.4.0b2-py2.4.egg zope.dottedname-3.4.2-py2.4.egg zope.cachedescriptors-3.4.0-py2.4.egg zope.app.zapi-3.4.0a1-py2.4.egg zope.app.publisher-3.5.0a2-py2.4.egg zope.thread-3.4-py2.4.egg zope.location-3.4.0b2-py2.4.egg zope.formlib-3.4.0-py2.4.egg zope.component-3.4.0-py2.4.egg zope.app.pagetemplate-3.4.0-py2.4.egg zope.app.interface-3.4.0a1-py2.4.egg zope.annotation-3.4.0-py2.4.egg zope.proxy-3.4.0-py2.4-macosx-10.3-i386.egg zope.app.i18n-3.4.0a1-py2.4.egg zope.app.form-3.4.0b2-py2.4.egg zope.app.session-3.4.0a1-py2.4.egg zope.app.testing-3.4.0a1-py2.4.egg zope.app.principalannotation-3.4.0a1-py2.4.egg zope.traversing-3.5.0a1.dev_r78730-py2.4.egg zope.pagetemplate-3.4.0a1-py2.4.egg zope.contenttype-3.4.0-py2.4.egg zope.app.zcmlfiles-3.4.0a1-py2.4.egg zope.hookable-3.4.0-py2.4-macosx-10.3-i386.egg zope.tales-3.4.0a1-py2.4.egg zope.security-3.4.0b5-py2.4-macosx-10.3-i386.egg zodbcode-3.4.0b1dev_r75670-py2.4.egg zope.location-3.4.0b2-py2.4.egg zope.location-3.4.0b2-py2.4.egg zope.app.basicskin-3.4.0a1-py2.4.egg zope.app.dependable-3.4.0a1-py2.4.egg zope.app.debug-3.4.0a1-py2.4.egg zope.app.schema-3.4.0a1-py2.4.egg zope.app.wsgi-3.4.0-py2.4.egg zope.app.rotterdam-3.4.0a1-py2.4.egg zope.app.zopeappgenerations-3.4.0a1-py2.4.egg zope.app.generations-3.4.0a1-py2.4.egg zope.app.content-3.4.0a1-py2.4.egg zope.modulealias-3.4.0a1-py2.4.egg RestrictedPython-3.4.2-py2.4.egg zope.app.renderer-3.4.0a1-py2.4.egg zope.structuredtext-3.4.0-py2.4.egg docutils-0.4-py2.4.egg
+_b = /Users/kteague/buildouts/BabyLoginDemo/bin
+_d = /Users/kteague/buildouts/BabyLoginDemo/develop-eggs
+_e = /Users/kteague/buildouts/shared/eggs
+bin-directory = /Users/kteague/buildouts/BabyLoginDemo/bin
+develop-eggs-directory = /Users/kteague/buildouts/BabyLoginDemo/develop-eggs
+domain = babylogindemo
+eggs = %(__buildout_space_n__)szope.app.locales
+	babylogindemo
+eggs-directory = /Users/kteague/buildouts/shared/eggs
+executable = /Applications/Plone-3.0.4/Python-2.4.4/bin/python
+find-links = http://download.zope.org/distribution/
+location = src/babylogindemo
+output = locales
+package = babylogindemo
+recipe = lovely.recipe:i18n
+
+[test]
+__buildout_installed__ = /Users/kteague/buildouts/BabyLoginDemo/parts/test
+	/Users/kteague/buildouts/BabyLoginDemo/bin/test
+__buildout_signature__ = zc.recipe.testrunner-1.0.0-py2.4.egg zc.recipe.egg-1.0.0-py2.4.egg setuptools-0.6c7-py2.4.egg zope.testing-3.5.1-py2.4.egg zc.buildout-1.0.0-py2.4.egg zc.buildout-1.0.0-py2.4.egg
+_b = /Users/kteague/buildouts/BabyLoginDemo/bin
+_d = /Users/kteague/buildouts/BabyLoginDemo/develop-eggs
+_e = /Users/kteague/buildouts/shared/eggs
+bin-directory = /Users/kteague/buildouts/BabyLoginDemo/bin
+defaults = ['--tests-pattern', '^f?tests$', '-v']
+develop-eggs-directory = /Users/kteague/buildouts/BabyLoginDemo/develop-eggs
+eggs = BabyLoginDemo
+eggs-directory = /Users/kteague/buildouts/shared/eggs
+executable = /Applications/Plone-3.0.4/Python-2.4.4/bin/python
+find-links = http://download.zope.org/distribution/
+location = /Users/kteague/buildouts/BabyLoginDemo/parts/test
+recipe = zc.recipe.testrunner
+script = /Users/kteague/buildouts/BabyLoginDemo/bin/test

Added: Sandbox/kteague/BabyLoginDemo/buildout.cfg
===================================================================
--- Sandbox/kteague/BabyLoginDemo/buildout.cfg	                        (rev 0)
+++ Sandbox/kteague/BabyLoginDemo/buildout.cfg	2008-01-16 08:50:57 UTC (rev 82915)
@@ -0,0 +1,67 @@
+[buildout]
+develop = .
+parts = app data zopectl i18n test
+find-links = http://download.zope.org/distribution/
+extends= http://grok.zope.org/releaseinfo/grok-0.11.cfg
+versions = versions
+
+[data]
+recipe = zc.recipe.filestorage
+
+[app]
+recipe = zc.zope3recipes>=0.5.3:application
+eggs = BabyLoginDemo
+site.zcml = <include package="babylogindemo" />
+            <include package="zope.app.twisted" />
+
+            <configure i18n_domain="babylogindemo">
+              <unauthenticatedPrincipal id="zope.anybody"
+                                        title="Unauthenticated User" />
+              <unauthenticatedGroup id="zope.Anybody"
+                                    title="Unauthenticated Users" />
+              <authenticatedGroup id="zope.Authenticated"
+                                title="Authenticated Users" />
+              <everybodyGroup id="zope.Everybody"
+                              title="All Users" />
+              <principal id="zope.manager"
+                         title="Manager"
+                         login="grok"
+                         password_manager="Plain Text"
+                         password="grok"
+                         />
+
+              <!-- Replace the following directive if you don't want
+                   public access -->
+              <grant permission="zope.View"
+                     principal="zope.Anybody" />
+              <grant permission="zope.app.dublincore.view"
+                     principal="zope.Anybody" />
+
+              <role id="zope.Manager" title="Site Manager" />
+              <role id="zope.Member" title="Site Member" />
+              <grantAll role="zope.Manager" />
+              <grant role="zope.Manager"
+                     principal="zope.manager" />
+           </configure>
+
+[data]
+recipe = zc.recipe.filestorage
+
+# this section named so that the start/stop script is called bin/zopectl
+[zopectl]
+recipe = zc.zope3recipes:instance
+application = app
+zope.conf = ${data:zconfig}
+
+[test]
+recipe = zc.recipe.testrunner
+eggs = BabyLoginDemo
+defaults = ['--tests-pattern', '^f?tests$', '-v']
+
+# this section named so that the i18n scripts are called bin/i18n...
+[i18n]
+recipe = lovely.recipe:i18n
+package = babylogindemo
+domain = babylogindemo
+location = src/babylogindemo
+output = locales

Added: Sandbox/kteague/BabyLoginDemo/setup.py
===================================================================
--- Sandbox/kteague/BabyLoginDemo/setup.py	                        (rev 0)
+++ Sandbox/kteague/BabyLoginDemo/setup.py	2008-01-16 08:50:57 UTC (rev 82915)
@@ -0,0 +1,28 @@
+from setuptools import setup, find_packages
+
+version = '0.1'
+
+setup(name='BabyLoginDemo',
+      version=version,
+      description="",
+      long_description="""\
+""",
+      # Get strings from http://www.python.org/pypi?%3Aaction=list_classifiers
+      classifiers=[], 
+      keywords="",
+      author="",
+      author_email="",
+      url="",
+      license="",
+      package_dir={'': 'src'},
+      packages=find_packages('src'),
+      include_package_data=True,
+      zip_safe=False,
+      install_requires=['setuptools',
+                        'grok',
+                        # Add extra requirements here
+                        ],
+      entry_points="""
+      # Add entry points here
+      """,
+      )

Added: Sandbox/kteague/BabyLoginDemo/src/babylogindemo/__init__.py
===================================================================
--- Sandbox/kteague/BabyLoginDemo/src/babylogindemo/__init__.py	                        (rev 0)
+++ Sandbox/kteague/BabyLoginDemo/src/babylogindemo/__init__.py	2008-01-16 08:50:57 UTC (rev 82915)
@@ -0,0 +1 @@
+# this directory is a package

Added: Sandbox/kteague/BabyLoginDemo/src/babylogindemo/__init__.pyc
===================================================================
(Binary files differ)


Property changes on: Sandbox/kteague/BabyLoginDemo/src/babylogindemo/__init__.pyc
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: Sandbox/kteague/BabyLoginDemo/src/babylogindemo/babylogin.py
===================================================================
--- Sandbox/kteague/BabyLoginDemo/src/babylogindemo/babylogin.py	                        (rev 0)
+++ Sandbox/kteague/BabyLoginDemo/src/babylogindemo/babylogin.py	2008-01-16 08:50:57 UTC (rev 82915)
@@ -0,0 +1,139 @@
+import grok
+
+from urllib import urlencode
+
+from zope.i18n import MessageFactory
+from zope.component import getUtility
+from zope.app.security.interfaces import IAuthentication
+from zope.app.securitypolicy.interfaces import IPrincipalPermissionManager
+from zope.schema import getFieldNamesInOrder, ValidationError
+
+from babylogindemo.memberauth import MemberAuthentication
+from babylogindemo.members import IMember, Member
+
+_ = MessageFactory('babylogindemo')
+
+
+class BabyLoginDemo(grok.Application, grok.Container):
+    """
+    An app that lets users create accounts, login, logout and change their
+    passwords.
+    """
+    grok.local_utility(MemberAuthentication, IAuthentication)
+    
+    def __init__(self):
+        super(BabyLoginDemo,self).__init__()
+        self['members'] = grok.Container()
+
+
+class ViewMemberListing(grok.Permission):
+    "Permission to see the member listing"
+    grok.name('babylogindemo.ViewMemberListing')
+
+
+class Master(grok.View):
+    """
+    The master page template macro.
+
+    The template master.pt is used as page macro in most views. Since this
+    template uses the logged_in method and message attributes below, it's best
+    to make all other views in this app subclasses of Master.
+    """
+    grok.context(BabyLoginDemo)
+
+    message = '' # used to give feedback
+
+    def logged_in(self):
+        if self.request.principal.id == 'babylogindemo.ac':
+            return False
+        return True
+
+
+class Index(Master):
+    """
+    The main page, showing user data and member count.
+    """
+
+    def members(self):
+        members = grok.getSite()['members']
+        member_count = len(members)
+        if member_count == 0:
+            return _(u'No one has')
+        elif member_count == 1:
+            return _(u'One member has')
+        else:
+            return unicode(member_count) + _(u' members have')
+
+class Login(Master):
+    """
+    Login form and handler.
+    """
+    def update(self, login_submit=None):
+        if login_submit is not None:
+            if self.logged_in():
+                dest = self.request.get('camefrom', self.application_url())
+                self.redirect(dest)
+            else:
+                self.message = _(u'Invalid login name and/or password')
+
+
+class Listing(Master):
+    """
+    Member listing view.
+    
+    This demonstrates how to require a permission to view, and also how to
+    obtain a list of annotated principals.
+    """
+
+    grok.require('babylogindemo.ViewMemberListing')
+
+    def field_names(self):        
+        return getFieldNamesInOrder(IMember)
+
+    def members(self):
+        members = self.context['members']
+        roster = []
+        for id in sorted(members.keys()):
+            member = members[id]
+            fields = {}
+            for field in self.field_names():
+                fields[field] = getattr(member, field)
+            roster.append(fields)
+        return roster
+    
+
+
+class Join(grok.AddForm, Master):
+    """
+    User registration form
+    """
+    form_fields = grok.AutoFields(IMember)
+    label = _(u'Member registration')
+    template = grok.PageTemplateFile('form.pt')
+
+    @grok.action('Save')
+    def save(self, **data):
+        """
+        Create a Member and grant it the ViewMemberListing permission.
+        """
+        login = data['login']
+        members = self.context['members']
+        member = Member(**data)
+        try:
+            # if we can already fetch a member object based on the requested
+            # login id, then we create a validation exception and assign it
+            # to the login field
+            members[login]
+            msg = _(u'Login name taken. Please choose a different one.') 
+            self.widgets['login']._error = ValidationError(msg)
+            self.form_reset = False
+        except KeyError:
+            # login id is not taken so we save the member object
+            # and grant the ViewMemberListing permission to the login id
+            members[login] = member
+            permission_mngr = IPrincipalPermissionManager(grok.getSite())
+            permission_mngr.grantPermissionToPrincipal(
+               'babylogindemo.ViewMemberListing', 'babylogindemo' + login)
+            self.redirect(
+                self.url('login') + '?' + urlencode({'login':login})
+            )

Added: Sandbox/kteague/BabyLoginDemo/src/babylogindemo/babylogin.pyc
===================================================================
(Binary files differ)


Property changes on: Sandbox/kteague/BabyLoginDemo/src/babylogindemo/babylogin.pyc
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: Sandbox/kteague/BabyLoginDemo/src/babylogindemo/babylogin_templates/index.pt
===================================================================
--- Sandbox/kteague/BabyLoginDemo/src/babylogindemo/babylogin_templates/index.pt	                        (rev 0)
+++ Sandbox/kteague/BabyLoginDemo/src/babylogindemo/babylogin_templates/index.pt	2008-01-16 08:50:57 UTC (rev 82915)
@@ -0,0 +1,42 @@
+<html metal:use-macro="context/@@master/macros/page">
+<body>
+<div metal:fill-slot="main">
+    <h1>Login Demo Main Page</h1>
+    
+    <table><tr>
+        <td valign="top">
+            <h2>User information</h2>
+            <dl>
+                <dt>principal.id</dt>
+                    <dd tal:content="request/principal/id" />
+                
+            </dl>
+            <dl>
+                <dt>principal.title</dt>
+                    <dd tal:content="request/principal/title" />
+                
+            </dl>
+            
+            <p>
+                You are <em tal:condition="not:view/logged_in">not </em>logged in.
+            </p>
+            
+            <tal:not_logged_in condition="not:view/logged_in">
+          
+                <form metal:use-macro="context/@@login/macros/loginform" />
+                
+            </tal:not_logged_in>
+        </td>
+        <td width="30%"></td>
+        <td valign="top">
+            <h2>Membership</h2>
+            
+            <h3><span tal:replace="view/members" /> joined so far.</h3>
+            
+            <p><a href="listing">View member listing</a> (requires login)</p>
+            
+        </td>
+    </tr></table>
+</div>
+</body>
+</html>

Added: Sandbox/kteague/BabyLoginDemo/src/babylogindemo/babylogin_templates/listing.pt
===================================================================
--- Sandbox/kteague/BabyLoginDemo/src/babylogindemo/babylogin_templates/listing.pt	                        (rev 0)
+++ Sandbox/kteague/BabyLoginDemo/src/babylogindemo/babylogin_templates/listing.pt	2008-01-16 08:50:57 UTC (rev 82915)
@@ -0,0 +1,17 @@
+<html metal:use-macro="context/@@master/macros/page">
+<body>
+<div metal:fill-slot="main">
+    <h1>Member Listing</h1>
+    
+    <table>
+        <tr><th tal:repeat="field view/fieldNames"
+                tal:content="field">Field name</th></tr>
+        <tr tal:repeat="member view/members">
+            <td bgcolor="lightgray"
+                tal:repeat="field view/fieldNames"
+                tal:content="python:member[field]"></td>
+        </tr>
+    </table>
+</div>
+</body>
+</html>

Added: Sandbox/kteague/BabyLoginDemo/src/babylogindemo/babylogin_templates/login.pt
===================================================================
--- Sandbox/kteague/BabyLoginDemo/src/babylogindemo/babylogin_templates/login.pt	                        (rev 0)
+++ Sandbox/kteague/BabyLoginDemo/src/babylogindemo/babylogin_templates/login.pt	2008-01-16 08:50:57 UTC (rev 82915)
@@ -0,0 +1,36 @@
+<html metal:use-macro="context/@@master/macros/page">
+<body>
+<div metal:fill-slot="main">
+    <h1>Login</h1>
+        
+    <form metal:define-macro="loginform" action="login" method="post">
+        <input type="hidden" name="camefrom"
+            tal:condition="exists:request/camefrom"
+            tal:attributes="value request/camefrom" />
+        
+        <table>
+            <tr>
+                <th>Login</th>
+                <td>
+                    <input type="text" name="login" id="login"
+                        tal:attributes="value request/login|nothing"/>
+                </td>
+            </tr>
+            <tr>
+                <th>Password</th>
+                <td>
+                    <input type="password" name="password" id="password" />
+                </td>
+            </tr>
+            <tr>
+                <td></td>
+                <td>
+                    <input type="submit" name="login_submit" value="Log in" />
+                </td>
+            </tr>
+        </table>
+    </form>
+    
+</div>  
+</body>
+</html>

Added: Sandbox/kteague/BabyLoginDemo/src/babylogindemo/babylogin_templates/master.pt
===================================================================
--- Sandbox/kteague/BabyLoginDemo/src/babylogindemo/babylogin_templates/master.pt	                        (rev 0)
+++ Sandbox/kteague/BabyLoginDemo/src/babylogindemo/babylogin_templates/master.pt	2008-01-16 08:50:57 UTC (rev 82915)
@@ -0,0 +1,34 @@
+<html metal:define-macro="page">
+<head>
+<title>Grok Login Sample Application</title>
+</head>
+<body>
+    <table bgcolor="lightgray" width="100%">
+        <tr tal:condition="not:view/logged_in">
+            <td width="10%"><a href="index">main</a></td>
+            <td width="70%">you are not logged in</td>
+            <td width="10%"><a href="join">join</a></td>
+            <td width="10%"><a href="login">login</a></td>
+        </tr>
+        <tr tal:condition="view/logged_in">
+            <td width="10%"><a href="index">main</a></td>
+            <td width="70%">logged in as
+                <span tal:replace="string:${request/principal/title}
+                                         (${request/principal/id})">
+                    principal.title (principal.id)
+                </span>
+            </td>
+            <td width="10%"><a href="account">account</a></td>
+            <td width="10%"><a href="logout">logout</a></td>
+        </tr>
+    </table>
+    <div style="background: yellow;"
+         tal:condition="view/message"
+         tal:content="view/message"
+    />
+    <div metal:define-slot="main">
+    Here goes the main content of the page
+    </div>
+  
+</body>
+</html>

Added: Sandbox/kteague/BabyLoginDemo/src/babylogindemo/configure.zcml
===================================================================
--- Sandbox/kteague/BabyLoginDemo/src/babylogindemo/configure.zcml	                        (rev 0)
+++ Sandbox/kteague/BabyLoginDemo/src/babylogindemo/configure.zcml	2008-01-16 08:50:57 UTC (rev 82915)
@@ -0,0 +1,5 @@
+<configure xmlns="http://namespaces.zope.org/zope"
+           xmlns:grok="http://namespaces.zope.org/grok">
+  <include package="grok" />
+  <grok:grok package="." />
+</configure>

Added: Sandbox/kteague/BabyLoginDemo/src/babylogindemo/form.pt
===================================================================
--- Sandbox/kteague/BabyLoginDemo/src/babylogindemo/form.pt	                        (rev 0)
+++ Sandbox/kteague/BabyLoginDemo/src/babylogindemo/form.pt	2008-01-16 08:50:57 UTC (rev 82915)
@@ -0,0 +1,75 @@
+<html metal:use-macro="context/@@master/macros/page">
+<body>
+    
+    <div metal:fill-slot="main">
+
+<!-- the code of the form element below was copied verbatim from
+     src/grok/templates/default_edit_form.pt-->
+<!-- XXX: is a better way of rendering Groks's default forms inside
+     a master template?-->
+
+<form action="." tal:attributes="action request/URL" method="post"
+      class="edit-form" enctype="multipart/form-data">
+
+  <h1 i18n:translate=""
+    tal:condition="view/label"
+    tal:content="view/label">Label</h1>
+
+  <div class="form-status"
+    tal:define="status view/status"
+    tal:condition="status">
+
+    <div i18n:translate="" tal:content="view/status">
+      Form status summary
+    </div>
+
+    <ul class="errors" tal:condition="view/errors">
+      <li tal:repeat="error view/error_views">
+         <span tal:replace="structure error">Error Type</span>
+      </li>
+    </ul>
+  </div>
+
+  <table class="form-fields">
+    <tbody>
+      <tal:block repeat="widget view/widgets">
+        <tr>
+          <td class="label" tal:define="hint widget/hint">
+            <label tal:condition="python:hint"
+                   tal:attributes="for widget/name">
+              <span class="required" tal:condition="widget/required"
+              >*</span><span i18n:translate=""
+                             tal:content="widget/label">label</span>
+            </label>
+            <label tal:condition="python:not hint"
+                   tal:attributes="for widget/name">
+              <span class="required" tal:condition="widget/required"
+              >*</span><span i18n:translate=""
+                             tal:content="widget/label">label</span>
+            </label>
+          </td>
+          <td class="field">
+            <div class="widget" tal:content="structure widget">
+              <input type="text" />
+            </div>
+            <div class="error" tal:condition="widget/error">
+              <span tal:replace="structure widget/error">error</span>
+            </div>
+          </td>
+        </tr>
+      </tal:block>
+    </tbody>
+  </table>
+
+  <div id="actionsView">
+    <span class="actionButtons" tal:condition="view/availableActions">
+      <input tal:repeat="action view/actions"
+             tal:replace="structure action/render"
+             />
+    </span>
+  </div>
+</form>
+
+    </div><!--/slot main-->
+</body>
+</html>

Added: Sandbox/kteague/BabyLoginDemo/src/babylogindemo/ftesting.zcml
===================================================================
--- Sandbox/kteague/BabyLoginDemo/src/babylogindemo/ftesting.zcml	                        (rev 0)
+++ Sandbox/kteague/BabyLoginDemo/src/babylogindemo/ftesting.zcml	2008-01-16 08:50:57 UTC (rev 82915)
@@ -0,0 +1,35 @@
+<configure
+   xmlns="http://namespaces.zope.org/zope"
+   i18n_domain="babylogindemo"
+   package="babylogindemo"
+   >
+
+  <include package="grok" />
+  <include package="babylogindemo" />
+
+  <!-- Typical functional testing security setup -->
+  <securityPolicy
+      component="zope.app.securitypolicy.zopepolicy.ZopeSecurityPolicy"
+      />
+
+  <unauthenticatedPrincipal
+      id="zope.anybody"
+      title="Unauthenticated User"
+      />
+  <grant
+      permission="zope.View"
+      principal="zope.anybody"
+      />
+
+  <principal
+      id="zope.mgr"
+      title="Manager"
+      login="mgr"
+      password="mgrpw"
+      />
+
+  <role id="zope.Manager" title="Site Manager" />
+  <grantAll role="zope.Manager" />
+  <grant role="zope.Manager" principal="zope.mgr" />
+
+</configure>

Added: Sandbox/kteague/BabyLoginDemo/src/babylogindemo/memberauth.py
===================================================================
--- Sandbox/kteague/BabyLoginDemo/src/babylogindemo/memberauth.py	                        (rev 0)
+++ Sandbox/kteague/BabyLoginDemo/src/babylogindemo/memberauth.py	2008-01-16 08:50:57 UTC (rev 82915)
@@ -0,0 +1,58 @@
+import grok
+
+import base64
+import urllib
+
+from zope.interface import implements, alsoProvides
+from zope.app.security.interfaces import IAuthentication
+from zope.app.security.interfaces import IUnauthenticatedPrincipal
+
+class Nobody(object):
+    # we could allow the Zope to return the zope.anybody principal
+    # but this way is more explicit for demonstration purposes
+    implements(IUnauthenticatedPrincipal)
+    id = 'babylogindemo.ac'
+    title = 'The Anonymous Coward'
+    description = 'You are not logged in, eh'
+
+
+class MemberAuthentication(grok.Model):
+    "Authenticates against our own Members container"
+    implements(IAuthentication)
+    
+    def authenticate(self, request):
+        members = grok.getSite()['members']
+        login = request.get('login', None)
+        password = request.get('password', None)
+        cookie = request.get('babylogindemo.auth', None)
+        
+        # if login and password are submitted with the request,
+        # save them in a cookie, otherwise get the cookie and
+        # extract the login and password from them
+        if login and password:
+            val = base64.encodestring('%s:%s' % (login, password))
+            request.response.setCookie('babylogindemo.auth',
+                                       urllib.quote(val),
+                                       path='/')
+        elif cookie:
+            val = base64.decodestring(urllib.unquote(cookie))
+            login, password = val.split(':')
+        
+        # XXX check the password, eh!
+        try:
+            return members[login]
+        except KeyError:
+            return None
+    
+    def unauthenticatedPrincipal(self):
+        return Nobody()
+    
+    def unauthorized(self, id, request):
+        return None
+    
+    def getPrincipal(self, id):
+        members = grok.getSite()['members']
+        try:
+            return members[id]
+        except KeyError:
+            return None

Added: Sandbox/kteague/BabyLoginDemo/src/babylogindemo/memberauth.pyc
===================================================================
(Binary files differ)


Property changes on: Sandbox/kteague/BabyLoginDemo/src/babylogindemo/memberauth.pyc
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: Sandbox/kteague/BabyLoginDemo/src/babylogindemo/members.py
===================================================================
--- Sandbox/kteague/BabyLoginDemo/src/babylogindemo/members.py	                        (rev 0)
+++ Sandbox/kteague/BabyLoginDemo/src/babylogindemo/members.py	2008-01-16 08:50:57 UTC (rev 82915)
@@ -0,0 +1,42 @@
+import grok
+
+from zope.interface import implements, Interface
+from zope.schema import TextLine, Password, Text
+from zope.i18n import MessageFactory
+from zope.security.interfaces import IPrincipal
+
+_ = MessageFactory('babylogindemo')
+
+class IMember(Interface):
+    login = TextLine(
+        title=_("Login"),
+        description=_("Unique Id")
+    )
+    password = Password(
+        title=_("Password"),
+        description=_("The password. It is in plain-text, whee!")
+    )
+    title = TextLine(
+        title=_("Full Name"),
+    )
+    description = Text(
+        title=_("Description"),
+        description=_("Tell us a little bit about yourself."),
+        required=False,
+        missing_value='',
+        default=u''
+    )
+
+
+class Member(grok.Model):
+    implements(IMember, IPrincipal)
+
+    def __init__(self, login, password, title, description=''):
+        self.login = login
+        self.password = password
+        self.title = title
+        self.description = description
+    
+    @property
+    def id(self):
+        return self.login

Added: Sandbox/kteague/BabyLoginDemo/src/babylogindemo/members.pyc
===================================================================
(Binary files differ)


Property changes on: Sandbox/kteague/BabyLoginDemo/src/babylogindemo/members.pyc
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: Sandbox/kteague/BabyLoginDemo/src/babylogindemo/testing.py
===================================================================
--- Sandbox/kteague/BabyLoginDemo/src/babylogindemo/testing.py	                        (rev 0)
+++ Sandbox/kteague/BabyLoginDemo/src/babylogindemo/testing.py	2008-01-16 08:50:57 UTC (rev 82915)
@@ -0,0 +1,7 @@
+import os.path
+import babylogindemo
+from zope.app.testing.functional import ZCMLLayer
+
+ftesting_zcml = os.path.join(
+    os.path.dirname(babylogindemo.__file__), 'ftesting.zcml')
+FunctionalLayer = ZCMLLayer(ftesting_zcml, __name__, 'FunctionalLayer')

Added: Sandbox/kteague/BabyLoginDemo/src/babylogindemo/testing.pyc
===================================================================
(Binary files differ)


Property changes on: Sandbox/kteague/BabyLoginDemo/src/babylogindemo/testing.pyc
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream



More information about the Checkins mailing list