import grok from grok import index from zope import schema, component, interface from zope.app.catalog.interfaces import ICatalog from zope.app.authentication import PluggableAuthentication from zope.app.authentication.principalfolder import (PrincipalFolder, InternalPrincipal) 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 IPrincipalRoleManager, IRole from zope.app.securitypolicy.interfaces import IRolePermissionManager from zope.app.securitypolicy.role import LocalRole from nudgenudge.interfaces import IReview from nudgenudge.review import Review grok.define_permission('nudge.AddReview') grok.define_permission('nudge.EditReview') grok.define_permission('nudge.DeleteReview') def setup_pau(pau): pau['principals'] = PrincipalFolder('nudge.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 class NudgeNudge(grok.Application, grok.Container): grok.local_utility(PluggableAuthentication, IAuthentication, setup=setup_pau) grok.local_utility(role_factory(u'Nudge Reviewers'), IRole, name='nudge.Reviewers', name_in_container='nudge.Reviewers') class ReviewIndexes(grok.Indexes): grok.site(NudgeNudge) grok.context(IReview) # TODO would prefer to use zc.catalog's ValueIndex here package_name = index.Field() author = index.Field() @grok.subscribe(NudgeNudge, grok.IObjectAddedEvent) def grant_permissions(app, event): role_manager = IRolePermissionManager(app) role_manager.grantPermissionToRole('nudge.AddReview', 'nudge.Reviewers') class Index(grok.View): def update(self, package=None): self.results = [] if package: catalog = component.getUtility(ICatalog) # TODO zc.catalog's ValueIndex has a nicer query interface query = (package, package) self.results = catalog.searchResults(package_name=query) class CreateReview(grok.AddForm): grok.require('nudge.AddReview') form_fields = grok.AutoFields(IReview) template = grok.PageTemplateFile('form.pt') #form_fields['package_name'].for_display = True # XXX doesn't work??? @grok.action('Create') def create(self, **kw): r = Review() self.applyData(r, **kw) base = name = kw['package_name'] + '-' + kw['version'] count = 0 while name in self.context: count += 1 name = '%s_%03d' % (base, count) self.context[name] = r grok.notify(grok.ObjectCreatedEvent(r)) self.redirect(self.url(r)) class SignUp(grok.Form): form_fields = grok.Fields( name = schema.TextLine(title=u"Your name"), # TODO: validate email address email = schema.TextLine(title=u"Email address"), password = schema.Password(title=u"Password"), password_repeat = schema.Password(title=u"Repeat password"), ) @grok.action('Sign up') def sign_up(self, name, email, password, password_repeat): # TODO: validate password is equal to password_repeat # add principal to principal folder pau = component.getUtility(IAuthentication) principals = pau['principals'] principals[email] = user = InternalPrincipal(email, password, name) # grant principal the role role_manager = IPrincipalRoleManager(self.context) role_manager.assignRoleToPrincipal('nudge.Reviewers', principals.prefix + email) self.redirect('index') class Login(grok.View): grok.context(interface.Interface) def update(self, login_submit=None): if (not IUnauthenticatedPrincipal.providedBy(self.request.principal) and login_submit is not None): camefrom = self.request.get('camefrom', '.') self.redirect(camefrom)