Tip: Click lines to highlight, hold ctrl/cmd to multi-select

http://codedumper.com/uwoze (24-May @ 05:39)

Syntax Highlighted Code

  1. import re
  2. import grok
  3. from grok import index
  4. from zope.interface import Interface
  5. from zope import schema
  6. from z3c.widget.tiny.widget import TinyWidget
  7. from zope.app.authentication import PluggableAuthentication
  8. from zope.app.authentication.principalfolder import PrincipalFolder
  9. from zope.app.authentication.principalfolder import InternalPrincipal
  10. from zope.app.authentication.principalfolder import IInternalPrincipal
  11. from zope.app.authentication.interfaces import IPasswordManager
  12. from zope.app.authentication.session import SessionCredentialsPlugin
  13. from zope.app.security.interfaces import IAuthentication
  14. from zope.app.security.interfaces import IUnauthenticatedPrincipal
  15. from zope.securitypolicy.interfaces import IPrincipalRoleManager
  16. from zope.securitypolicy.interfaces import IRole
  17. from zope.securitypolicy.interfaces import IRolePermissionManager
  18. from zope.securitypolicy.role import LocalRole
  19. from zope.i18n import MessageFactory
  20. from zope.component import provideAdapter
  21. from zope.component import getUtility
  22. from zope.interface import implements
  23. from zope.component import adapts
  24. from zope.component import getUtility
  25. from zope.component import getUtilitiesFor
  26. from zope.annotation.interfaces import IAnnotations
  27. from persistent.dict import PersistentDict
  28. from zope.i18n import MessageFactory
  29. import appconfig
  30. from zope import component
  31.  
  32. expr = re.compile(r"^(w&.%#$&'*+-/=?^_`{}|~]+!)*[w&.%#$&'*+-/=?^_`{}|~]+"
  33.                   r"@(([0-9a-z]([0-9a-z-]*[0-9a-z])?.)+[a-z]{2,6}|([0-9]{1,3}"
  34.                   r".){3}[0-9]{1,3})$", re.IGNORECASE)
  35. check_email = expr.match
  36.  
  37.  
  38. ##############################################################################
  39. ### I N T E R F A C E S ######################################################
  40. ##############################################################################
  41.  
  42. _ = MessageFactory('tpi')
  43.  
  44.  
  45. ################################################## email validation
  46.  
  47. class NotAnEmailAddress(schema.ValidationError):
  48.     __doc__ = _(u"Invalid email address")
  49.  
  50. check_email = re.compile(r"[a-zA-Z0-9._%-]+@([a-zA-Z0-9-]+.)*[a-zA-Z]{2,4}").match
  51. def valid_email(value):
  52.     if check_email(value):
  53.         return True
  54.     raise NotAnEmailAddress(value)
  55.  
  56. ################################################## interfaces
  57.  
  58.  
  59. class IUser(Interface):
  60.     """Basic user data."""
  61.     login = schema.TextLine(title=_(u"Login"),
  62.                             required=True)
  63.     password = schema.Password(title=_(u"Password"),
  64.                             required=True)
  65.     password_repeat = schema.Password(title=_(u"Password repeat"),
  66.                             required=True)
  67.     fname = schema.TextLine(title=_(u"First name"),
  68.                             required=False)
  69.     lname = schema.TextLine(title=_(u"Last name"),
  70.                             required=False)
  71.     email = schema.ASCIILine(title=_(u"E-mail"),
  72.                             required=False,
  73.                             constraint=valid_email)
  74.  
  75. ### H E L P E R   S C R I P T S  #############################################
  76.  
  77. def setup_pau(pau):
  78.     pau['principals'] = PrincipalFolder('tpi.principals.')
  79.     pau.authenticatorPlugins = ('principals',)
  80.     pau['session'] = session = SessionCredentialsPlugin()
  81.     session.loginpagename = 'login'
  82.     pau.credentialsPlugins = ('No Challenge if Authenticated', 'session',)
  83.  
  84. def role_factory(*args):
  85.     def factory():
  86.         return LocalRole(*args)
  87.     return factory
  88.  
  89. ##############################################################################
  90. ### A P P L I C A T I O N ####################################################
  91. ##############################################################################
  92.  
  93. class Tpi(grok.Application, grok.Container):
  94.     def __init__(self):
  95.         super(Tpi, self).__init__()
  96.  
  97.     ### U T I L I T I E S  ###################################################
  98.  
  99.     # register authentication utility
  100.     grok.local_utility(PluggableAuthentication, IAuthentication,
  101.                        setup=setup_pau)
  102.  
  103.     # register Admin Role  
  104.     grok.local_utility(role_factory(u'TPI Administrator'), IRole,
  105.                        name='tpi.Admin',
  106.                        name_in_container='tpi.Admin')
  107.  
  108.     # register Employee Role  
  109.     grok.local_utility(role_factory(u'TPI Employees'), IRole,
  110.                        name='tpi.Employee',
  111.                        name_in_container='tpi.Employees')
  112.  
  113.     # register Employee Role  
  114.     grok.local_utility(role_factory(u'TPI Member'), IRole,
  115.                        name='tpi.Member',
  116.                        name_in_container='tpi.Member')
  117.  
  118. ### S U B S C R I B E R S ####################################################
  119.  
  120. @grok.subscribe(Tpi, grok.IObjectAddedEvent)
  121. def grant_permissions(app, event):
  122.     role_manager = IRolePermissionManager(app)
  123.     # Admin Permissions
  124.     role_manager.grantPermissionToRole('tpi.ViewClients', 'tpi.Employees')
  125.     role_manager.grantPermissionToRole('tpi.AddClient', 'tpi.Employees')
  126.     role_manager.grantPermissionToRole('tpi.DeleteClient', 'tpi.Admin')
  127.     role_manager.grantPermissionToRole('tpi.ViewMemberListing', 'tpi.Admin')
  128.     # Employee Permissions
  129.     role_manager.grantPermissionToRole('tpi.ViewClients', 'tpi.Employees')
  130.     role_manager.grantPermissionToRole('tpi.AddClient', 'tpi.Employees')
  131.  
  132.  
  133. class GlobalMacros(grok.View):
  134.     grok.context(Interface)
  135.     grok.name('globalmacros')
  136.  
  137. class Index(grok.View):
  138.     grok.context(Tpi)
  139.     grok.name('index')
  140.     def navLIST(self, name):
  141.         if name not in appconfig.menuitems.keys():
  142.             pass
  143.         else:
  144.             return appconfig.menuitems[name]
  145.  
  146.  
  147.  
  148. ##############################################################################
  149. ### A U T H E N T I C A T I O N ##############################################
  150. ##############################################################################
  151.  
  152. class Register(grok.Form):
  153.    
  154.     form_fields = grok.AutoFields(IUser)
  155.     label = u'User registration'
  156.     template = grok.PageTemplateFile('form.pt')
  157.  
  158.     @grok.action('Sign up')
  159.     def save(self, login, password, password_repeat, fname, lname, email):
  160.         # TODO: validate password is equal to password_repeat
  161.        
  162.         # add principal to principal folder
  163.         pau = component.getUtility(IAuthentication)
  164.         principals = pau['principals']
  165.         assert(login not in principals)
  166.         name = fname + ' ' + lname      
  167.         principals[login] = user = InternalPrincipal(login, password, name)
  168.  
  169.         # save the email to an IUser instance
  170.         user.email = email
  171.        
  172.         # grant principal the role
  173.         role_manager = IPrincipalRoleManager(self.context)
  174.         role_manager.assignRoleToPrincipal('tpi.Employee',
  175.                                            principals.prefix + login)
  176.         self.redirect('index')
  177.  
  178. class MemberListing(grok.Adapter):
  179.     grok.implements(IUser)
  180.     grok.template('form.pt')
  181.  
  182.     def fieldNames(self):
  183.         return (f for f in IUser)
  184.  
  185.     def members(self):
  186.         pau = component.getUtility(IAuthentication)
  187.         principals = pau['principals']
  188.         roster = [ ]
  189.         for id in sorted(principals.keys()):
  190.             print id
  191.             print principals[id]
  192.             user = IUser(principals[id])        # <----- this is where the code is breaking
  193.             fields = {}
  194.             for field in IUser:
  195.                 fields[field] = getattr(user, field)
  196.             roster.append(fields)
  197.         return roster
  198.  
  199.  

Plain Code

import re
import grok
from grok import index
from zope.interface import Interface
from zope import schema
from z3c.widget.tiny.widget import TinyWidget
from zope.app.authentication import PluggableAuthentication
from zope.app.authentication.principalfolder import PrincipalFolder
from zope.app.authentication.principalfolder import InternalPrincipal
from zope.app.authentication.principalfolder import IInternalPrincipal
from zope.app.authentication.interfaces import IPasswordManager
from zope.app.authentication.session import SessionCredentialsPlugin
from zope.app.security.interfaces import IAuthentication
from zope.app.security.interfaces import IUnauthenticatedPrincipal
from zope.securitypolicy.interfaces import IPrincipalRoleManager
from zope.securitypolicy.interfaces import IRole
from zope.securitypolicy.interfaces import IRolePermissionManager
from zope.securitypolicy.role import LocalRole
from zope.i18n import MessageFactory
from zope.component import provideAdapter
from zope.component import getUtility
from zope.interface import implements
from zope.component import adapts
from zope.component import getUtility
from zope.component import getUtilitiesFor
from zope.annotation.interfaces import IAnnotations
from persistent.dict import PersistentDict
from zope.i18n import MessageFactory
import appconfig
from zope import component

expr = re.compile(r"^(w&.%#$&'*+-/=?^_`{}|~]+!)*[w&.%#$&'*+-/=?^_`{}|~]+"
                  r"@(([0-9a-z]([0-9a-z-]*[0-9a-z])?.)+[a-z]{2,6}|([0-9]{1,3}"
                  r".){3}[0-9]{1,3})$", re.IGNORECASE)
check_email = expr.match


##############################################################################
### I N T E R F A C E S ######################################################
##############################################################################

_ = MessageFactory('tpi')


################################################## email validation

class NotAnEmailAddress(schema.ValidationError):
    __doc__ = _(u"Invalid email address")

check_email = re.compile(r"[a-zA-Z0-9._%-]+@([a-zA-Z0-9-]+.)*[a-zA-Z]{2,4}").match
def valid_email(value):
    if check_email(value):
        return True
    raise NotAnEmailAddress(value)

################################################## interfaces


class IUser(Interface):
    """Basic user data."""
    login = schema.TextLine(title=_(u"Login"),
                            required=True)
    password = schema.Password(title=_(u"Password"),
                            required=True)
    password_repeat = schema.Password(title=_(u"Password repeat"),
                            required=True)
    fname = schema.TextLine(title=_(u"First name"),
                            required=False)
    lname = schema.TextLine(title=_(u"Last name"),
                            required=False)
    email = schema.ASCIILine(title=_(u"E-mail"),
                            required=False,
                            constraint=valid_email)

### H E L P E R   S C R I P T S  #############################################

def setup_pau(pau):
    pau['principals'] = PrincipalFolder('tpi.principals.')
    pau.authenticatorPlugins = ('principals',)
    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

##############################################################################
### A P P L I C A T I O N ####################################################
##############################################################################

class Tpi(grok.Application, grok.Container):
    def __init__(self):
        super(Tpi, self).__init__()

    ### U T I L I T I E S  ###################################################

    # register authentication utility
    grok.local_utility(PluggableAuthentication, IAuthentication, 
                       setup=setup_pau)

    # register Admin Role  
    grok.local_utility(role_factory(u'TPI Administrator'), IRole,
                       name='tpi.Admin',
                       name_in_container='tpi.Admin')

    # register Employee Role  
    grok.local_utility(role_factory(u'TPI Employees'), IRole,
                       name='tpi.Employee',
                       name_in_container='tpi.Employees')

    # register Employee Role  
    grok.local_utility(role_factory(u'TPI Member'), IRole,
                       name='tpi.Member',
                       name_in_container='tpi.Member')

### S U B S C R I B E R S ####################################################

@grok.subscribe(Tpi, grok.IObjectAddedEvent)
def grant_permissions(app, event):
    role_manager = IRolePermissionManager(app)
    # Admin Permissions
    role_manager.grantPermissionToRole('tpi.ViewClients', 'tpi.Employees')
    role_manager.grantPermissionToRole('tpi.AddClient', 'tpi.Employees')
    role_manager.grantPermissionToRole('tpi.DeleteClient', 'tpi.Admin')
    role_manager.grantPermissionToRole('tpi.ViewMemberListing', 'tpi.Admin')
    # Employee Permissions
    role_manager.grantPermissionToRole('tpi.ViewClients', 'tpi.Employees')
    role_manager.grantPermissionToRole('tpi.AddClient', 'tpi.Employees')


class GlobalMacros(grok.View):
    grok.context(Interface)
    grok.name('globalmacros')

class Index(grok.View):
    grok.context(Tpi)
    grok.name('index')
    def navLIST(self, name):
        if name not in appconfig.menuitems.keys():
            pass
        else:
            return appconfig.menuitems[name]



##############################################################################
### A U T H E N T I C A T I O N ##############################################
##############################################################################

class Register(grok.Form):
    
    form_fields = grok.AutoFields(IUser)
    label = u'User registration'
    template = grok.PageTemplateFile('form.pt')

    @grok.action('Sign up')
    def save(self, login, password, password_repeat, fname, lname, email):
        # TODO: validate password is equal to password_repeat
        
        # add principal to principal folder
        pau = component.getUtility(IAuthentication)
        principals = pau['principals']
        assert(login not in principals)
        name = fname + ' ' + lname      
        principals[login] = user = InternalPrincipal(login, password, name)

        # save the email to an IUser instance
        user.email = email
        
        # grant principal the role
        role_manager = IPrincipalRoleManager(self.context)
        role_manager.assignRoleToPrincipal('tpi.Employee',
                                           principals.prefix + login)
        self.redirect('index')

class MemberListing(grok.Adapter):
    grok.implements(IUser)
    grok.template('form.pt')

    def fieldNames(self):
        return (f for f in IUser)

    def members(self):
        pau = component.getUtility(IAuthentication)
        principals = pau['principals']
        roster = [ ]
        for id in sorted(principals.keys()):
            print id
            print principals[id]
            user = IUser(principals[id])        # <----- this is where the code is breaking
            fields = {}
            for field in IUser:
                fields[field] = getattr(user, field)
            roster.append(fields)
        return roster

Permalink: http://codedumper.com/uwoze