Mercurial > kallithea
changeset 238:a55c17874486
Rewrite of user managment, improved forms, added some user info
author | Marcin Kuzminski <marcin@python-works.com> |
---|---|
date | Sun, 30 May 2010 17:55:56 +0200 |
parents | f188b156603d |
children | b18f89d6d17f |
files | pylons_app/controllers/users.py pylons_app/model/forms.py pylons_app/model/user_model.py pylons_app/templates/admin/users/user_add.html pylons_app/templates/admin/users/user_edit.html pylons_app/templates/admin/users/users.html pylons_app/templates/login.html |
diffstat | 7 files changed, 131 insertions(+), 16 deletions(-) [+] |
line wrap: on
line diff
--- a/pylons_app/controllers/users.py Sun May 30 17:52:20 2010 +0200 +++ b/pylons_app/controllers/users.py Sun May 30 17:55:56 2010 +0200 @@ -1,6 +1,8 @@ from formencode import htmlfill from pylons import request, response, session, tmpl_context as c, url, \ app_globals as g +from pylons.i18n.translation import _ +from pylons_app.lib import helpers as h from pylons.controllers.util import abort, redirect from pylons_app.lib.auth import LoginRequired from pylons_app.lib.base import BaseController, render @@ -37,10 +39,11 @@ # url('users') user_model = UserModel() - login_form = UserForm() + login_form = UserForm()() try: form_result = login_form.to_python(dict(request.POST)) user_model.create(form_result) + h.flash(_('created user %s') % form_result['username'], category='success') return redirect(url('users')) except formencode.Invalid as errors: @@ -64,14 +67,14 @@ # method='put') # url('user', id=ID) user_model = UserModel() - login_form = UserForm() + login_form = UserForm(edit=True)() try: form_result = login_form.to_python(dict(request.POST)) user_model.update(id, form_result) + h.flash(_('User updated succesfully'), category='success') return redirect(url('users')) except formencode.Invalid as errors: - errors.value c.user = user_model.get_user(id) c.form_errors = errors.error_dict return htmlfill.render( @@ -90,6 +93,7 @@ try: self.sa.delete(self.sa.query(User).get(id)) self.sa.commit() + h.flash(_('sucessfully deleted user'), category='success') except: self.sa.rollback() raise
--- a/pylons_app/model/forms.py Sun May 30 17:52:20 2010 +0200 +++ b/pylons_app/model/forms.py Sun May 30 17:55:56 2010 +0200 @@ -19,7 +19,9 @@ for SELECT use formencode.All(OneOf(list), Int()) """ -from formencode.validators import UnicodeString, OneOf, Int, Number, Regex +from formencode.validators import UnicodeString, OneOf, Int, Number, Regex, \ + Email, Bool, StringBoolean +from formencode import All from pylons import session from pylons.i18n.translation import _ from pylons_app.lib.auth import get_crypt_password @@ -48,7 +50,16 @@ if value != authentication_token(): raise formencode.Invalid(self.message('invalid_token', state, search_number=value), value, state) +class ValidUsername(formencode.validators.FancyValidator): + def validate_python(self, value, state): + pass + +class ValidPassword(formencode.validators.FancyValidator): + + def to_python(self, value, state): + return get_crypt_password(value) + class ValidAuth(formencode.validators.FancyValidator): messages = { 'invalid_password':_('invalid password'), @@ -70,6 +81,9 @@ except (NoResultFound, MultipleResultsFound, OperationalError) as e: log.error(e) user = None + raise formencode.Invalid(self.message('invalid_password', + state=State_obj), value, state, + error_dict=self.e_dict) if user: if user.active: if user.username == username and user.password == crypted_passwd: @@ -124,4 +138,18 @@ #chained validators have access to all data chained_validators = [ValidAuth] - +def UserForm(edit=False): + class _UserForm(formencode.Schema): + allow_extra_fields = True + filter_extra_fields = True + username = All(UnicodeString(strip=True, min=3, not_empty=True), ValidUsername) + if edit: + new_password = All(UnicodeString(strip=True, min=3, not_empty=False), ValidPassword) + else: + password = All(UnicodeString(strip=True, min=3, not_empty=False), ValidPassword) + active = StringBoolean(if_missing=False) + name = UnicodeString(strip=True, min=3, not_empty=True) + lastname = UnicodeString(strip=True, min=3, not_empty=True) + email = Email(not_empty=True) + + return _UserForm
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pylons_app/model/user_model.py Sun May 30 17:55:56 2010 +0200 @@ -0,0 +1,48 @@ +#!/usr/bin/env python +# encoding: utf-8 +# +# Copyright (c) 2010 marcink. All rights reserved. +# +from pylons_app.model.db import User +from pylons_app.model.meta import Session +''' +Created on Apr 9, 2010 + +@author: marcink +''' + +class UserModel(object): + + def __init__(self): + self.sa = Session() + + def get_user(self, id): + return self.sa.query(User).get(id) + + def create(self, form_data): + try: + new_user = User() + for k, v in form_data.items(): + setattr(new_user, k, v) + + self.sa.add(new_user) + self.sa.commit() + except: + self.sa.rollback() + raise + + def update(self, id, form_data): + try: + new_user = self.sa.query(User).get(id) + for k, v in form_data.items(): + if k == 'new_password' and v != '': + + new_user.password = v + else: + setattr(new_user, k, v) + + self.sa.add(new_user) + self.sa.commit() + except: + self.sa.rollback() + raise
--- a/pylons_app/templates/admin/users/user_add.html Sun May 30 17:52:20 2010 +0200 +++ b/pylons_app/templates/admin/users/user_add.html Sun May 30 17:55:56 2010 +0200 @@ -7,7 +7,7 @@ <%def name="breadcrumbs()"> ${h.link_to(u'Admin',h.url('admin_home'))} / - ${_('Users')} + ${_('Users')} </%def> <%def name="page_nav()"> ${self.menu('admin')} @@ -21,20 +21,37 @@ <tr> <td>${_('Username')}</td> <td>${h.text('username')}</td> + <td>${self.get_form_error('username')}</td> + </tr> + <tr> + <td>${_('Password')}</td> + <td>${h.password('password')}</td> + <td>${self.get_form_error('password')}</td> + </tr> + <tr> + <td>${_('Name')}</td> + <td>${h.text('name')}</td> + <td>${self.get_form_error('name')}</td> </tr> <tr> - <td>${_('password')}</td> - <td>${h.text('password')}</td> + <td>${_('Lastname')}</td> + <td>${h.text('lastname')}</td> + <td>${self.get_form_error('lastname')}</td> </tr> <tr> + <td>${_('Email')}</td> + <td>${h.text('email')}</td> + <td>${self.get_form_error('email')}</td> + </tr> + <tr> <td>${_('Active')}</td> - <td>${h.checkbox('active')}</td> + <td>${h.checkbox('active',value=True)}</td> + <td>${self.get_form_error('active')}</td> </tr> <tr> <td></td> - <td>${h.submit('add','add')}</td> + <td>${h.submit('save','save')}</td> </tr> - </table> ${h.end_form()} </div>
--- a/pylons_app/templates/admin/users/user_edit.html Sun May 30 17:52:20 2010 +0200 +++ b/pylons_app/templates/admin/users/user_edit.html Sun May 30 17:55:56 2010 +0200 @@ -21,14 +21,32 @@ <tr> <td>${_('Username')}</td> <td>${h.text('username')}</td> + <td>${self.get_form_error('username')}</td> </tr> <tr> <td>${_('New password')}</td> <td>${h.text('new_password')}</td> + <td>${self.get_form_error('new_password')}</td> </tr> <tr> + <td>${_('Name')}</td> + <td>${h.text('name')}</td> + <td>${self.get_form_error('name')}</td> + </tr> + <tr> + <td>${_('Lastname')}</td> + <td>${h.text('lastname')}</td> + <td>${self.get_form_error('lastname')}</td> + </tr> + <tr> + <td>${_('Email')}</td> + <td>${h.text('email')}</td> + <td>${self.get_form_error('email')}</td> + </tr> + <tr> <td>${_('Active')}</td> <td>${h.checkbox('active',value=True)}</td> + <td>${self.get_form_error('active')}</td> </tr> <tr> <td></td>
--- a/pylons_app/templates/admin/users/users.html Sun May 30 17:52:20 2010 +0200 +++ b/pylons_app/templates/admin/users/users.html Sun May 30 17:55:56 2010 +0200 @@ -18,16 +18,18 @@ <h2>${_('Mercurial users')}</h2> <table class="table_disp"> <tr class="header"> - <td>${_('id')}</td> <td>${_('username')}</td> + <td>${_('name')}</td> + <td>${_('lastname')}</td> <td>${_('active')}</td> <td>${_('admin')}</td> <td>${_('action')}</td> </tr> %for user in c.users_list: <tr> - <td>${user.user_id}</td> <td>${h.link_to(user.username,h.url('edit_user', id=user.user_id))}</td> + <td>${user.name}</td> + <td>${user.lastname}</td> <td>${user.active}</td> <td>${user.admin}</td> <td>
--- a/pylons_app/templates/login.html Sun May 30 17:52:20 2010 +0200 +++ b/pylons_app/templates/login.html Sun May 30 17:55:56 2010 +0200 @@ -21,9 +21,7 @@ <tr> <td>${_('Username')}</td> <td>${h.text('username')}</td> - <td>${self.get_form_error('username')} - - </td> + <td>${self.get_form_error('username')}</td> </tr> <tr> <td>${_('Password')}</td>