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()