Mercurial > hg > ltpdarepo
diff src/ltpdarepo/user.py @ 0:c812c3020b63
Initial import.
author | Daniele Nicolodi <nicolodi@science.unitn.it> |
---|---|
date | Thu, 09 Jun 2011 13:16:24 +0200 |
parents | |
children | d19c5ae165de |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/ltpdarepo/user.py Thu Jun 09 13:16:24 2011 +0200 @@ -0,0 +1,127 @@ +from MySQLdb.cursors import DictCursor +from ltpdarepo import connection +from ltpdarepo.form import Form +from wtforms.fields import TextField, PasswordField, BooleanField +from wtforms import validators + + +def _generate_password(): + import random + import string + chars = string.letters + string.digits + return "".join([random.choice(chars) for i in range(8)]) + + +class IUser(Form): + username = TextField("Username", validators=[validators.Required(), + validators.Regexp(r'^[a-zA-Z][0-9a-zA-Z\-\._]+$', + message=u'Invalid identifier.')]) + name = TextField("Given name") + surname = TextField("Family name") + email = TextField("Email", validators=[validators.Required(), + validators.Email()]) + telephone = TextField("Telephone") + institution = TextField("Institution") + admin = BooleanField("Admin") + + +class IPassword(Form): + password = PasswordField() + confirm = PasswordField() + + def validate_password(form, field): + if not form.password.data == form.confirm.data: + raise validators.ValidationError(u"Passwords do not match.") + + +class User(object): + __slots__ = ('username', 'password', 'name', 'surname', 'email', 'telephone', 'institution', 'admin') + + def __init__(self, username='', password='', name='', surname='', email='', telephone='', institution='', admin=False): + self.username = username + self.password = password + self.name = name + self.surname = surname + self.email = email + self.telephone = telephone + self.institution = institution + self.admin = bool(admin) + + def __getitem__(self, name): + return getattr(self, name) + + def load(self, username): + conn = connection() + curs = conn.cursor(DictCursor) + curs.execute("""SELECT username, + given_name AS name, + family_name AS surname, + email, institution, telephone, + is_admin AS admin + FROM users WHERE username=%s""", username) + user = curs.fetchone() + if user is None: + return user + for key, value in user.iteritems(): + setattr(self, key, value) + return self + + def create(self): + if not self.password: + self.password = _generate_password() + + conn = connection() + curs = conn.cursor() + + for host in ('localhost', '%'): + curs.execute("""CREATE USER %s@%s IDENTIFIED BY %s""", + (self.username, host, self.password)) + + curs.execute("""INSERT INTO users (username, given_name, family_name, + email, telephone, institution, is_admin) + VALUES (%s, %s, %s, %s, %s, %s, %s)""", + (self.username, self.name, self.surname, + self.email, self.telephone, self.institution, self.admin)) + + conn.commit() + + def delete(self): + conn = connection() + curs = conn.cursor() + + curs.execute("""DELETE FROM users WHERE username=%s""", self.username) + curs.execute("""SELECT Host FROM mysql.user WHERE User=%s""", self.username) + hosts = [row[0] for row in curs.fetchall()] + for host in hosts: + curs.execute("""DROP USER %s@%s""", (self.username, host)) + + conn.commit() + + def save(self): + conn = connection() + curs = conn.cursor() + + curs.execute("""UPDATE users SET given_name=%s, family_name=%s, email=%s, + institution=%s, telephone=%s, is_admin=%s + WHERE username=%s""", + (self.name, self.surname, self.email, + self.telephone, self.institution, self.admin, self.username)) + + conn.commit() + + def passwd(self, password=''): + if not password: + password = _generate_password() + self.password = password + + conn = connection() + curs = conn.cursor() + + curs.execute("""SELECT Host FROM mysql.user WHERE User=%s""", + (self.username, )) + hosts = [row[0] for row in curs.fetchall()] + for host in hosts: + curs.execute("""SET PASSWORD FOR %s@%s = PASSWORD(%s)""", + (self.username, host, self.password)) + + conn.commit()