class UserAddView(BaseFormView): """ view handling user add, also check for existing similar accounts """ title = u"Ajouter un compte" schema = get_add_edit_schema() def __init__(self, *args, **kwargs): BaseFormView.__init__(self, *args, **kwargs) self.form_config = UserFormConfigState(self.session) def query_homonym(self, lastname, email): """ collect the accounts with same name or email :param str lastname: The lastname to check :param str email: the email to check :returns: The SQLAlchemy query object :rtype: obj """ query = User.query().filter( or_( User.lastname == lastname, User.email == email, )) return query def _confirmation_form(self, query, appstruct, query_count): """ Return datas used to display a confirmation form :param obj query: homonym SQLAlchemy query object :param dict appstruct: Preserved form datas :param int query_count: The number of homonyms :returns: template vars :rtype: dict """ form = self._get_form() _query = self.request.GET.copy() _query['confirmation'] = '1' form.action = self.request.current_route_path(_query=_query) form.set_appstruct(appstruct) datas = dict( duplicate_accounts=query.all(), appstruct=appstruct, form=form.render(), confirm_form_id=form.formid, user_view_route=USER_ITEM_URL, back_url=self.request.route_path(USER_URL), ) datas.update(self._more_template_vars()) return datas def submit_success(self, appstruct): """ Handle successfull form submission :param dict appstruct: The submitted datas """ logger.debug(u"Adding a new user account") logger.debug(appstruct) confirmation = self.request.GET.get('confirmation', '0') lastname = appstruct['lastname'] email = appstruct['email'] if confirmation == '0': # Check homonyms query = self.query_homonym(lastname, email) count = query.count() if count > 0: return self._confirmation_form(query, appstruct, count) add_login = appstruct.pop('add_login', False) model = self.schema.objectify(appstruct) self.dbsession.add(model) self.dbsession.flush() if add_login: redirect = self.request.route_path(USER_LOGIN_URL, id=model.id, _query={'action': 'add'}) else: next_step = self.form_config.get_next_step() if next_step is not None: redirect = self.request.route_path( next_step, id=model.id, ) else: redirect = self.request.route_path( USER_ITEM_URL, id=model.id, ) logger.debug(u"Account with id {0} added".format(model.id)) return HTTPFound(redirect)
def test_user_add_schema(pyramid_request): import colander from autonomie.forms.user.user import get_add_edit_schema appstruct = { 'civilite': u'Monsieur', 'lastname': u'Test lastname', 'firstname': u"Firstname", 'email': "*****@*****.**", 'add_login': "******", } schema = get_add_edit_schema() schema = schema.bind(request=pyramid_request) result = schema.deserialize(appstruct) assert 'email' in result # civilite with pytest.raises(colander.Invalid): appstruct = { 'civilite': u"Not a valid one", 'lastname': u'Test lastname', 'firstname': u"Firstname", 'email': "*****@*****.**", 'add_login': "******", } schema.deserialize(appstruct) # lastname with pytest.raises(colander.Invalid): appstruct = { 'civilite': u'Monsieur', 'firstname': u"Firstname", 'email': "*****@*****.**", 'add_login': "******", } schema.deserialize(appstruct) # firstname with pytest.raises(colander.Invalid): appstruct = { 'civilite': u'Monsieur', 'lastname': u'Test lastname', 'email': "*****@*****.**", 'add_login': "******", } schema.deserialize(appstruct) # email with pytest.raises(colander.Invalid): appstruct = { 'civilite': u'Monsieur', 'lastname': u'Test lastname', 'firstname': u"Firstname", 'add_login': "******", } schema.deserialize(appstruct) with pytest.raises(colander.Invalid): appstruct = { 'civilite': u'Monsieur', 'lastname': u'Test lastname', 'firstname': u"Firstname", 'email': "notanemail", 'add_login': "******", } schema.deserialize(appstruct)
class UserEditView(BaseEditView): schema = get_add_edit_schema(edit=True) def redirect(self): return HTTPFound(self.request.current_route_path(_query={}))