Created
April 30, 2009 18:54
-
-
Save NaPs/104613 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/usr/bin/env python | |
| #coding=utf8 | |
| # PTI #5 | |
| import pickle | |
| import fcntl | |
| USER_DATABASE = 'users.db' | |
| class User(object): | |
| ''' Classe représentant un utilisateur ''' | |
| def __init__(self, username, mail, password): | |
| self.username = username | |
| self.mail = mail | |
| self.password = password | |
| self.firstname = None | |
| self.lastname = None | |
| def __repr__(self): | |
| return '<User %s>' % self.username | |
| class Users(object): | |
| ''' Classe de gestion des utilisateurs ''' | |
| def __init__(self, user_database_filename=USER_DATABASE): | |
| self.user_database_filename = user_database_filename | |
| self.users = [] | |
| self._load() | |
| def _secure_save(func): | |
| ''' Décorateur permettant de sauvegarder le fichier des | |
| utilisateurs de manière sécurisée, avec un verrou sur le | |
| fichier pour éviter les accès concurrents. ''' | |
| def f(self, *args, **kwargs): | |
| f_users = open(self.user_database_filename, 'r+b') | |
| fcntl.lockf(f_users, fcntl.LOCK_EX) # Verrou | |
| self.users = pickle.load(f_users) # Dé-sérialisation | |
| func(self, *args, **kwargs) # Appel de la fonction décorée | |
| f_users.seek(0) # Retour au début du fichier pour écriture | |
| pickle.dump(self.users, f_users) # Sérialisation | |
| fcntl.lockf(f_users, fcntl.LOCK_UN) # Relachement du verrou | |
| f_users.close() | |
| return f | |
| @_secure_save | |
| def create_user(self, username, mail, firstname, lastname, password): | |
| ''' Création d'un nouvel utilisateur ''' | |
| username = username.lower() | |
| if username in (u.username for u in self.users): | |
| raise self.UserAlreadyExist('User already exist on database') | |
| else: | |
| new_user = User(username, mail, password) | |
| new_user.firstname = firstname | |
| new_user.lastname = lastname | |
| self.users.append(new_user) | |
| @_secure_save | |
| def delete_user(self, username): | |
| ''' Suppression d'un utilisateur ''' | |
| username = username.lower() | |
| found = [u for u in self.users if u.username == username] | |
| if not found: | |
| raise UserDoesntExist('User doesn\'t exist on database') | |
| else: | |
| self.users.remove(found[0]) | |
| @_secure_save | |
| def change_password(self, username, new_password): | |
| ''' Changer le mot de passe d'un utilisateur ''' | |
| username = username.lower() | |
| found = [u for u in self.users if u.username == username] | |
| if not found: | |
| raise UserDoesntExist('User doesn\'t exist on database') | |
| else: | |
| found[0].password = new_password | |
| def _load(self): | |
| ''' (Re)Charge le fichier des utilisateurs ''' | |
| f_users = open(self.user_database_filename, 'rb') | |
| self.users = pickle.load(f_users) | |
| f_users.close() | |
| # Exceptions : | |
| class UserAlreadyExist(Exception): | |
| pass | |
| class UserDoesntExist(Exception): | |
| pass |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment