[Checkins] SVN: grokapps/LoginDemo/src/logindemo/app implemented
member listing view which requires a permission;
Luciano Ramalho
luciano at ramalho.org
Sat Dec 29 00:25:24 EST 2007
Log message for revision 82532:
implemented member listing view which requires a permission;
granted permission to users upon joining
Changed:
U grokapps/LoginDemo/src/logindemo/app.py
U grokapps/LoginDemo/src/logindemo/app_templates/index.pt
A grokapps/LoginDemo/src/logindemo/app_templates/listing.pt
U grokapps/LoginDemo/src/logindemo/app_templates/master.pt
-=-
Modified: grokapps/LoginDemo/src/logindemo/app.py
===================================================================
--- grokapps/LoginDemo/src/logindemo/app.py 2007-12-29 02:49:28 UTC (rev 82531)
+++ grokapps/LoginDemo/src/logindemo/app.py 2007-12-29 05:25:23 UTC (rev 82532)
@@ -9,6 +9,7 @@
from zope.app.authentication.session import SessionCredentialsPlugin
from zope.app.security.interfaces import IAuthentication
from zope.app.security.interfaces import IUnauthenticatedPrincipal
+from zope.app.securitypolicy.interfaces import IPrincipalPermissionManager
from zope.app.securitypolicy.interfaces import IRole
from zope.app.securitypolicy.interfaces import IPrincipalRoleManager
from zope.app.securitypolicy.role import LocalRole
@@ -25,12 +26,15 @@
pau['session'] = session = SessionCredentialsPlugin()
session.loginpagename = 'login'
pau.credentialsPlugins = ('No Challenge if Authenticated', 'session',)
-
+
def role_factory(*args):
def factory():
return LocalRole(*args)
return factory
+class ViewMemberListing(grok.Permission):
+ grok.name('logindemo.ViewMemberListing')
+
class LoginDemo(grok.Application, grok.Container):
"""
An app that lets you create an account and change your password.
@@ -56,6 +60,17 @@
"""
The main page, where the user can login or click a link to join.
"""
+
+ def members(self):
+ pau = getUtility(IAuthentication)
+ result = len(pau['principals'])
+ if result == 0:
+ return _(u'No one has')
+ elif result == 1:
+ return _(u'One member has')
+ else:
+ return unicode(result) + _(u' members have')
+
class Login(Master):
"""
@@ -105,11 +120,21 @@
principals.prefix + login)
self.redirect(self.url('login')+'?'+urlencode({'login':login}))
+ # grant the user permission to view the member listing
+ permission_mngr = IPrincipalPermissionManager(grok.getSite())
+ permission_mngr.grantPermissionToPrincipal(
+ 'logindemo.ViewMemberListing', principals.prefix + login)
+
class Account(grok.View):
def render(self):
return 'Not implemented'
-
+
+class Listing(Master):
+ grok.require('logindemo.ViewMemberListing')
-
-
\ No newline at end of file
+ def members(self):
+ pau = getUtility(IAuthentication)
+ principals = pau['principals']
+ return [{'id':id, 'title':principals[id].title}
+ for id in sorted(principals.keys())]
Modified: grokapps/LoginDemo/src/logindemo/app_templates/index.pt
===================================================================
--- grokapps/LoginDemo/src/logindemo/app_templates/index.pt 2007-12-29 02:49:28 UTC (rev 82531)
+++ grokapps/LoginDemo/src/logindemo/app_templates/index.pt 2007-12-29 05:25:23 UTC (rev 82532)
@@ -1,29 +1,42 @@
<html metal:use-macro="context/@@master/macros/page">
<body>
<div metal:fill-slot="main">
- <h1>Front Page</h1>
+ <h1>Login Demo Main Page</h1>
- <h3>User information</h3>
- <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>
+ <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: grokapps/LoginDemo/src/logindemo/app_templates/listing.pt
===================================================================
--- grokapps/LoginDemo/src/logindemo/app_templates/listing.pt (rev 0)
+++ grokapps/LoginDemo/src/logindemo/app_templates/listing.pt 2007-12-29 05:25:23 UTC (rev 82532)
@@ -0,0 +1,15 @@
+<html metal:use-macro="context/@@master/macros/page">
+<body>
+<div metal:fill-slot="main">
+ <h1>Member Listing</h1>
+
+ <table>
+ <tr><th>Login</th><th>Real name</th></tr>
+ <tr tal:repeat="member view/members">
+ <td bgcolor="lightgray" tal:content="member/id"></td>
+ <td bgcolor="lightgray" tal:content="member/title"></td>
+ </tr>
+ </table>
+</div>
+</body>
+</html>
Modified: grokapps/LoginDemo/src/logindemo/app_templates/master.pt
===================================================================
--- grokapps/LoginDemo/src/logindemo/app_templates/master.pt 2007-12-29 02:49:28 UTC (rev 82531)
+++ grokapps/LoginDemo/src/logindemo/app_templates/master.pt 2007-12-29 05:25:23 UTC (rev 82532)
@@ -3,17 +3,20 @@
<title>Grok Login Sample Application</title>
</head>
<body>
- <table border="1" width="100%">
+ <table bgcolor="lightgray" width="100%">
<tr tal:condition="not:view/logged_in">
- <td width="80%">you are not logged in</td>
+ <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="80%"
- tal:content="string:${request/principal/title}
- (${request/principal/id})">
- principal.title (principal.id)
+ <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>
More information about the Checkins
mailing list