示例#1
0
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)
示例#2
0
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)
示例#3
0
class UserEditView(BaseEditView):
    schema = get_add_edit_schema(edit=True)

    def redirect(self):
        return HTTPFound(self.request.current_route_path(_query={}))