[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