import deform from pyramid.httpexceptions import HTTPFound from pyramid.view import view_config from ordr.models.account import User, Role, TokenSubject from ordr.events import RegistrationNotification # below this password length a warning is displayed MIN_PW_LENGTH = 12 @view_config( context='ordr.resources.account.RegistrationResource', permission='view', request_method='GET', renderer='ordr:templates/account/registration_form.jinja2' ) def registration_form(context, request): ''' show registration form ''' form = context.get_registration_form() return {'form': form} @view_config( context='ordr.resources.account.RegistrationResource', permission='view', request_method='POST', renderer='ordr:templates/account/registration_form.jinja2' ) def registration_form_processing(context, request): ''' process registration form ''' if 'create' not in request.POST: return HTTPFound(request.resource_url(request.root)) form = context.get_registration_form() data = request.POST.items() try: appstruct = form.validate(data) except deform.ValidationFailure as e: return {'form': form} # form validation successfull, create user account = User( username=appstruct['username'], first_name=appstruct['first_name'], last_name=appstruct['last_name'], email=appstruct['email'], role=Role.UNVALIDATED ) account.set_password(appstruct['password']) request.dbsession.add(account) # create a verify-new-account token and send email token = account.issue_token(request, TokenSubject.REGISTRATION) notification = RegistrationNotification(request, account, {'token': token}) request.registry.notify(notification) return HTTPFound(request.resource_url(context, 'verify')) @view_config( context='ordr.resources.account.RegistrationResource', name='verify', permission='view', request_method='GET', renderer='ordr:templates/account/registration_verify.jinja2' ) def verify(context, request): ''' show email verification text ''' return {} @view_config( context='ordr.resources.account.RegistrationTokenResource', permission='view', request_method='GET', renderer='ordr:templates/account/registration_completed.jinja2' ) def completed(context, request): ''' registration is completed, awaiting activation by admin ''' token = context.model account = token.owner account.role = Role.NEW request.dbsession.delete(token) return {}