[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