version inicial de la aplicacion de gestion de compras
[compra.git] / view / login.py
1 # -*- coding: utf-8 -*-
2
3 import web
4 from web import form
5 from db import User
6
7 def get_user(authuser=''):
8     '''
9     Devuelve el usuario autenticado
10     '''
11     session = web.ctx.session
12     orm = web.ctx.orm
13     user = None
14     if not authuser:
15         authuser = session.get('username', '')
16     if authuser:
17         user = orm.query(User).filter(User.name == authuser).one()
18
19     return user
20
21 # decorators
22
23 def authenticated(function):
24     '''
25     Si es un usuario autenticado permite el acceso al recurso, sino
26     redirige a /login
27     '''
28     session = web.ctx.session
29     def decorated(*args, **kwargs):
30         if session.get('username', ''):
31             return function(*args, **kwargs)
32         else:
33             raise web.seeother('/login')
34
35     return decorated
36
37 vname = form.regexp("\w*$", 'Alphanumeric only')
38 vpass = form.regexp(r".{3,20}", 'Must be between 3 and 20 chars')
39
40 logform = form.Form(
41     form.Textbox("username", vname, description="User"),
42     form.Password("password", vpass, description="Password"),
43 )
44
45 class Login:
46     def GET(self, *args):
47         return web.ctx.render.login(logform())
48
49     def POST(self, *args):
50         orm = web.ctx.orm
51         session = web.ctx.session
52
53         lform = logform()
54         if not lform.validates():
55             return web.ctx.render.login(lform)
56
57         values = web.input()
58         name = values['username']
59         pwd = values['password']
60
61         query = orm.query(User).filter(User.name == name)
62
63         # si no existe se crea
64         if not query.count():
65             pass
66             #u = User(name, pwd)
67             #orm.add(u)
68
69         user = query.one()
70         if user.auth(pwd):
71             session.username = name
72             raise web.seeother('/index')
73         else:
74             # hack
75             lform.username.note = 'wrong password'
76             return web.ctx.render.login(lform)
77     
78
79 class Logout:
80     @authenticated
81     def GET(self):
82         web.ctx.session.username = ''
83         raise web.seeother('/')
84
85
86 class Prefs:
87     @authenticated
88     def GET(self):
89         session = web.ctx.session
90         orm = web.ctx.orm
91         lform = logform()
92         u = get_user()
93         lform.username.value = u.name
94         lform.username.attrs['disabled'] = 'disabled'
95         
96         return web.ctx.render.prefs(lform)
97
98     @authenticated
99     def POST(self):
100         session = web.ctx.session
101         orm = web.ctx.orm
102         input = web.input()
103         passwd = input.password
104
105         u = get_user()
106         if passwd:
107             u.set_password(passwd)
108             orm.add(u)
109
110         raise web.seeother('/prefs')
111