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>