diff --git a/participate.py b/participate.py index 96ec376..a75d2d7 100755 --- a/participate.py +++ b/participate.py @@ -171,6 +171,15 @@ def check_session(func): return render_template('login_or_register.html', message='') return check +def gen_token(size=42): + """ Generate a random token to be stored in session and cookie """ + token = binascii.hexlify(os.urandom(size)) + return token + +######################################################################## +# User management +######################################################################## + def check_login(login, password): """ Puts the login verification code here """ hashed_password = bcrypt.hashpw(password, bcrypt.gensalt()) @@ -229,7 +238,7 @@ def register_user(login, password, confirm): return True def confirm_user(login, password, link_id): - """ Confirm user """ + """ Confirm user by setting link_id == None """ if check_confirm(login, password, link_id): user = Tetawebapp_users.query.filter_by(mail=login).first() setattr(user, 'link_id', None) @@ -345,7 +354,22 @@ def get_user_name(user_id): print "%s" % e.message print "------------------------------" return False - + +def check_user_info(): + """ Check user info and send appropriate message if info are not complete""" + message = '' + user = Tetawebapp_users.query.filter_by(mail=session['login']).first() + name = user.name + phone = user.phone + diet = user.diet + if name == None or phone == None or diet == None or \ + len(name) == 0 or len(phone) == 0 or len(diet) == 0: + message = "Vos informations personnelles ne sont pas complètement renseignées. N'oubliez pas de remplir votre fiche située dans la section 'Mon compte'" + return message.decode('utf-8') + +######################################################################## +# Turns +######################################################################## def save_turn(role_id, day, start, end, num_slot): """ Save a new turn """ @@ -484,6 +508,9 @@ def turns_list(): turns.append(('Dimanche', sunday_turns)) return turns +######################################################################## +# Staffs +######################################################################## def get_staffs(): """ """ try: @@ -537,6 +564,10 @@ def save_staff_slot(turn_id, slot_id, user_id): return True return False +######################################################################## +# Role +######################################################################## + def get_roles(): """ Get full roles list """ try: @@ -549,22 +580,9 @@ def get_roles(): print "------------------------------" return False -def check_user_info(): - """ Check user info and send appropriate message if info are not complete""" - message = '' - user = Tetawebapp_users.query.filter_by(mail=session['login']).first() - name = user.name - phone = user.phone - diet = user.diet - if name == None or phone == None or diet == None or \ - len(name) == 0 or len(phone) == 0 or len(diet) == 0: - message = "Vos informations personnelles ne sont pas complètement renseignées. N'oubliez pas de remplir votre fiche située dans la section 'Mon compte'" - return message.decode('utf-8') - -def gen_token(size=42): - """ Generate a random token to be stored in session and cookie """ - token = binascii.hexlify(os.urandom(size)) - return token +######################################################################## +# Mail +######################################################################## def send_mail(email, link_id): msg = Message("Confirmation d'inscription au staff THSF", @@ -594,6 +612,21 @@ def page_not_found(e): """ 404 not found """ return render_template('error.html'), 404 +######################################################################## +# Entry +######################################################################## +@app.route("/", methods=['GET', 'POST']) +@check_session +def index(): + """ Index page """ + page = str(request.url_rule) + menu = get_menu(page) + message = check_user_info() + return render_template('index.html', menu=menu, message=message, login=session['login']) + +######################################################################## +# Session +######################################################################## @app.route("/login", methods=['GET', 'POST']) def login(): """ Login """ @@ -622,6 +655,9 @@ def login(): except AttributeError: return render_template('login_or_register.html', message="Utilisateur ou mot de passe invalide") +######################################################################## +# User +######################################################################## @app.route("/confirm/", methods=['GET', 'POST']) def confirm(LINK_ID): """ Index page """ @@ -674,15 +710,6 @@ def register(): except AttributeError: return render_template('login_or_register.html', message="Utilisateur ou mot de passe invalide") -@app.route("/", methods=['GET', 'POST']) -@check_session -def index(): - """ Index page """ - page = str(request.url_rule) - menu = get_menu(page) - message = check_user_info() - return render_template('index.html', menu=menu, message=message, login=session['login']) - @app.route("/account", methods=['GET', 'POST']) @check_session def account(): @@ -738,246 +765,10 @@ def logout(): sync_cookies(response, session) return response + ######################################################################## -# Admin zone +# Staffsheet ######################################################################## -@app.route("/users", methods=['GET', 'POST']) -@check_session -def list_users(): - """ Users list """ - page = str(request.url_rule) - menu = get_menu(page) - message = check_user_info() - staffers = Tetawebapp_users.query.filter_by(is_admin=0).order_by(Tetawebapp_users.name).all() - return render_template('list_users.html', menu=menu, staffers=staffers, message=message) - -@app.route("/account/", methods=['GET', 'POST']) -@check_session -def account_by_id(ID): - """ Arcticles page """ - try: - if session['is_admin']: - page = str(request.url_rule) - menu = get_menu(page) - message = "ID de l'utilisateur non conforme" - staffers = Tetawebapp_users.query.filter_by(is_admin=0).order_by(Tetawebapp_users.name).all() - user_id = int(ID.encode('utf-8')) - user = Tetawebapp_users.query.filter_by(id=user_id).first() - return render_template('account_by_id.html', menu=menu, user=user) - # User is not admin - return render_template('login_or_register.html', message="Utilisateur ou mot de passe invalide") - except AttributeError: - # User is not logged in - return render_template('login_or_register.html', message="Utilisateur ou mot de passe invalide") - except ValueError: - # ID is not an integer - return render_template('list_users.html', menu=menu, staffers=staffers, message=message) - -@app.route("/account/update/", methods=['GET', 'POST']) -@check_session -def update_account_by_id(ID): - """ Update given account """ - try: - if session['is_admin']: - page = str(request.url_rule) - menu = get_menu(page) - login = session['login'] - password = request.form.get('password').encode('utf-8') - confirm = request.form.get('confirm').encode('utf-8') - name = request.form.get('name').encode('utf-8') - phone = request.form.get('phone').encode('utf-8') - diet = request.form.get('diet').encode('utf-8') - message = "ID de l'utilisateur non conforme" - staffers = Tetawebapp_users.query.filter_by(is_admin=0).order_by(Tetawebapp_users.name).all() - user_id = int(ID.encode('utf-8')) - if update_user_by_id(user_id, login, password, confirm, name, phone, diet): - user = Tetawebapp_users.query.filter_by(id=ID).first() - message = check_user_info() - else: - message = "Erreur lors de l'enregistrement des données." - return render_template('account_by_id.html', menu=menu, user=user,message=message) - # User is not admin - return render_template('login_or_register.html', message="Utilisateur ou mot de passe invalide") - except AttributeError: - # User is not logged in - return render_template('login_or_register.html', message="Utilisateur ou mot de passe invalide") - except ValueError: - # ID is not an integer - return render_template('list_users.html', menu=menu, staffers=staffers, message=message) - -@app.route("/account/delete/", methods=['GET', 'POST']) -@check_session -def delete_account(ID): - """ Delete given account """ - try: - if session['is_admin']: - message = "Erreur lors de la suppression.".decode('utf-8') - page = str(request.url_rule) - menu = get_menu(page) - staffers = Tetawebapp_users.query.filter_by(is_admin=0).order_by(Tetawebapp_users.name).all() - user_id = int(ID.encode('utf-8')) - if delete_user(user_id): - message = '' - staffers = Tetawebapp_users.query.filter_by(is_admin=0).order_by(Tetawebapp_users.name).all() - return render_template('list_users.html', menu=menu, staffers=staffers, message=message) - # User is not admin - return render_template('login_or_register.html', message="Utilisateur ou mot de passe invalide") - except AttributeError: - # User is not logged in - return render_template('login_or_register.html', message="Utilisateur ou mot de passe invalide") - except ValueError: - # ID is not an integer - return render_template('list_users.html', menu=menu, staffers=staffers, message=message) - -@app.route("/turns", methods=['GET', 'POST']) -@check_session -def list_turns(): - """ List staff turns """ - try: - page = str(request.url_rule) - menu = get_menu(page) - message = '' - if session['is_admin']: - page = str(request.url_rule) - menu = get_menu(page) - turns = turns_list() - message = '' - return render_template('list_turns.html', menu=menu, page=page, turns=turns, message=message) - # TODO: - # Here comes the list_turns_by_user_id code - except AttributeError: - # User is not logged in - return render_template('login_or_register.html', message="Utilisateur ou mot de passe invalide") - -@app.route("/turn/new", methods=['GET', 'POST']) -@check_session -def new_turn(): - """ New turn form """ - tuesday = '2018-05-08' - wenesday = '2018-05-09' - thirsday = '2018-05-10' - friday = '2018-05-11' - saturday = '2018-05-12' - sunday = '2018-05-13' - monday = '2018-05-14' - try: - if session['is_admin']: - page = str(request.url_rule) - menu = get_menu(page) - roles = Tetawebapp_roles.query.order_by(Tetawebapp_roles.id).all() - days = [('Mardi', tuesday), ('Mercredi', wenesday), ('Jeudi', thirsday), ('Vendredi', friday), ('Samedi', saturday), ('Dimanche', sunday)] - return render_template('new_turn.html', menu=menu, page=page, roles=roles, days=days) - except AttributeError: - # User is not logged in - return render_template('login_or_register.html', message="Utilisateur ou mot de passe invalide") - -@app.route("/turn/add", methods=['GET', 'POST']) -@check_session -def add_turn(): - """ Add staff turn """ - try: - if session['is_admin']: - role_id = request.form.get('role_id').encode('utf-8') - day = request.form.get('day').encode('utf-8') - start = request.form.get('start').encode('utf-8') - end = request.form.get('end').encode('utf-8') - num_slot = request.form.get('num_slot').encode('utf-8') - page = str(request.url_rule) - menu = get_menu(page) - turns = turns_list() - message = "Erreur lors de l'enregistrement.".decode('utf-8') - if save_turn(role_id, day, start, end, num_slot): - turns = turns_list() - message='' - return render_template('list_turns.html', menu=menu, page=page, turns=turns, message=message) - # User is not admin - return render_template('login_or_register.html', message="Utilisateur ou mot de passe invalide") - except AttributeError as e: - # User is not logged in - return render_template('login_or_register.html', message="Utilisateur ou mot de passe invalide") - -@app.route("/turn/", methods=['GET', 'POST']) -@check_session -def turn_by_id(ID): - try: - if session['is_admin']: - tuesday = '2018-05-08' - wenesday = '2018-05-09' - thirsday = '2018-05-10' - friday = '2018-05-11' - saturday = '2018-05-12' - sunday = '2018-05-13' - monday = '2018-05-14' - days = [('Mardi', tuesday), ('Mercredi', wenesday), ('Jeudi', thirsday), ('Vendredi', friday), ('Samedi', saturday), ('Dimanche', sunday)] - page = str(request.url_rule) - menu = get_menu(page) - roles = Tetawebapp_roles.query.order_by(Tetawebapp_roles.id).all() - message = 'ID du tour de staff non conforme' - turns = turns_list() - turn_id = int(ID.encode('utf-8')) - turn = get_turn_by_id(turn_id) - return render_template('turn_by_id.html', menu=menu, page=page, turn=turn, roles=roles, days=days) - except AttributeError: - # User is not logged in - return render_template('login_or_register.html', message="Utilisateur ou mot de passe invalide") - except ValueError: - # ID is not an integer - return render_template('list_turns.html', menu=menu, page=page, turns=turns, message=message) - -@app.route("/turn/update/", methods=['GET', 'POST']) -@check_session -def update_turn(ID): - """ Update given staff turn """ - try: - role_id = request.form.get('role_id').encode('utf-8') - start = request.form.get('start').encode('utf-8') - end = request.form.get('end').encode('utf-8') - num_slot = request.form.get('num_slot').encode('utf-8') - day = request.form.get('day').encode('utf-8') - if session['is_admin']: - page = str(request.url_rule) - menu = get_menu(page) - turns = turns_list() - message = "Erreur lors de l'enregistrement.".decode('utf-8') - turn_id = int(ID.encode('utf-8')) - if update_turn_by_id(turn_id, role_id, day, start, end, num_slot): - turns = turns_list() - message = '' - return render_template('list_turns.html', menu=menu, page=page, turns=turns, message=message) - # User is not admin - return render_template('login_or_register.html', message="Utilisateur ou mot de passe invalide") - except AttributeError as e: - # User is not logged in - return render_template('login_or_register.html', message="Utilisateur ou mot de passe invalide") - except ValueError: - # ID is not an integer - return render_template('list_turns.html', menu=menu, page=page, turns=turns, message=message) - -@app.route("/turn/delete/", methods=['GET', 'POST']) -@check_session -def delete_turn(ID): - """ Delete given staff turn """ - try: - if session['is_admin']: - message = 'Erreur lors de la suppression.' - page = str(request.url_rule) - menu = get_menu(page) - turns = turns_list() - turn_id = int(ID.encode('utf-8')) - if drop_turn(turn_id): - message = '' - turns = turns_list() - return render_template('list_turns.html', menu=menu, turns=turns, message=message) - return render_template('list_turns.html', menu=menu, turns=turns, message=message) - # User is not admin - return render_template('login_or_register.html', message="Utilisateur ou mot de passe invalide") - except AttributeError: - # User is not logged in - return render_template('login_or_register.html', message="Utilisateur ou mot de passe invalide") - except ValueError: - # ID is not an integer - return render_template('list_turns.html', menu=menu, page=page, turns=turns, message=message) - @app.route("/staffsheet", methods=['GET', 'POST']) @check_session def staffsheet(): @@ -1161,6 +952,249 @@ def update_staff_slot(TURN_ID, SLOT_ID): # At least one ID is not integer return render_template('login_or_register.html', message="Identifiants non conformes") +######################################################################## +# Admin zone +######################################################################## +@app.route("/users", methods=['GET', 'POST']) +@check_session +def list_users(): + """ Users list """ + page = str(request.url_rule) + menu = get_menu(page) + message = check_user_info() + staffers = Tetawebapp_users.query.filter_by(is_admin=0).order_by(Tetawebapp_users.name).all() + return render_template('list_users.html', menu=menu, staffers=staffers, message=message) + +@app.route("/account/", methods=['GET', 'POST']) +@check_session +def account_by_id(ID): + """ Arcticles page """ + try: + if session['is_admin']: + page = str(request.url_rule) + menu = get_menu(page) + message = "ID de l'utilisateur non conforme" + staffers = Tetawebapp_users.query.filter_by(is_admin=0).order_by(Tetawebapp_users.name).all() + user_id = int(ID.encode('utf-8')) + user = Tetawebapp_users.query.filter_by(id=user_id).first() + return render_template('account_by_id.html', menu=menu, user=user) + # User is not admin + return render_template('login_or_register.html', message="Utilisateur ou mot de passe invalide") + except AttributeError: + # User is not logged in + return render_template('login_or_register.html', message="Utilisateur ou mot de passe invalide") + except ValueError: + # ID is not an integer + return render_template('list_users.html', menu=menu, staffers=staffers, message=message) + +@app.route("/account/update/", methods=['GET', 'POST']) +@check_session +def update_account_by_id(ID): + """ Update given account """ + try: + if session['is_admin']: + page = str(request.url_rule) + menu = get_menu(page) + login = session['login'] + password = request.form.get('password').encode('utf-8') + confirm = request.form.get('confirm').encode('utf-8') + name = request.form.get('name').encode('utf-8') + phone = request.form.get('phone').encode('utf-8') + diet = request.form.get('diet').encode('utf-8') + message = "ID de l'utilisateur non conforme" + staffers = Tetawebapp_users.query.filter_by(is_admin=0).order_by(Tetawebapp_users.name).all() + user_id = int(ID.encode('utf-8')) + if update_user_by_id(user_id, login, password, confirm, name, phone, diet): + user = Tetawebapp_users.query.filter_by(id=ID).first() + message = check_user_info() + else: + message = "Erreur lors de l'enregistrement des données." + return render_template('account_by_id.html', menu=menu, user=user,message=message) + # User is not admin + return render_template('login_or_register.html', message="Utilisateur ou mot de passe invalide") + except AttributeError: + # User is not logged in + return render_template('login_or_register.html', message="Utilisateur ou mot de passe invalide") + except ValueError: + # ID is not an integer + return render_template('list_users.html', menu=menu, staffers=staffers, message=message) + +@app.route("/account/delete/", methods=['GET', 'POST']) +@check_session +def delete_account(ID): + """ Delete given account """ + try: + if session['is_admin']: + message = "Erreur lors de la suppression.".decode('utf-8') + page = str(request.url_rule) + menu = get_menu(page) + staffers = Tetawebapp_users.query.filter_by(is_admin=0).order_by(Tetawebapp_users.name).all() + user_id = int(ID.encode('utf-8')) + if delete_user(user_id): + message = '' + staffers = Tetawebapp_users.query.filter_by(is_admin=0).order_by(Tetawebapp_users.name).all() + return render_template('list_users.html', menu=menu, staffers=staffers, message=message) + # User is not admin + return render_template('login_or_register.html', message="Utilisateur ou mot de passe invalide") + except AttributeError: + # User is not logged in + return render_template('login_or_register.html', message="Utilisateur ou mot de passe invalide") + except ValueError: + # ID is not an integer + return render_template('list_users.html', menu=menu, staffers=staffers, message=message) + +######################################################################## +# Turns +######################################################################## +@app.route("/turns", methods=['GET', 'POST']) +@check_session +def list_turns(): + """ List staff turns """ + try: + page = str(request.url_rule) + menu = get_menu(page) + message = '' + if session['is_admin']: + page = str(request.url_rule) + menu = get_menu(page) + turns = turns_list() + message = '' + return render_template('list_turns.html', menu=menu, page=page, turns=turns, message=message) + # TODO: + # Here comes the list_turns_by_user_id code + except AttributeError: + # User is not logged in + return render_template('login_or_register.html', message="Utilisateur ou mot de passe invalide") + +@app.route("/turn/new", methods=['GET', 'POST']) +@check_session +def new_turn(): + """ New turn form """ + tuesday = '2018-05-08' + wenesday = '2018-05-09' + thirsday = '2018-05-10' + friday = '2018-05-11' + saturday = '2018-05-12' + sunday = '2018-05-13' + monday = '2018-05-14' + try: + if session['is_admin']: + page = str(request.url_rule) + menu = get_menu(page) + roles = Tetawebapp_roles.query.order_by(Tetawebapp_roles.id).all() + days = [('Mardi', tuesday), ('Mercredi', wenesday), ('Jeudi', thirsday), ('Vendredi', friday), ('Samedi', saturday), ('Dimanche', sunday)] + return render_template('new_turn.html', menu=menu, page=page, roles=roles, days=days) + except AttributeError: + # User is not logged in + return render_template('login_or_register.html', message="Utilisateur ou mot de passe invalide") + +@app.route("/turn/add", methods=['GET', 'POST']) +@check_session +def add_turn(): + """ Add staff turn """ + try: + if session['is_admin']: + role_id = request.form.get('role_id').encode('utf-8') + day = request.form.get('day').encode('utf-8') + start = request.form.get('start').encode('utf-8') + end = request.form.get('end').encode('utf-8') + num_slot = request.form.get('num_slot').encode('utf-8') + page = str(request.url_rule) + menu = get_menu(page) + turns = turns_list() + message = "Erreur lors de l'enregistrement.".decode('utf-8') + if save_turn(role_id, day, start, end, num_slot): + turns = turns_list() + message='' + return render_template('list_turns.html', menu=menu, page=page, turns=turns, message=message) + # User is not admin + return render_template('login_or_register.html', message="Utilisateur ou mot de passe invalide") + except AttributeError as e: + # User is not logged in + return render_template('login_or_register.html', message="Utilisateur ou mot de passe invalide") + +@app.route("/turn/", methods=['GET', 'POST']) +@check_session +def turn_by_id(ID): + try: + if session['is_admin']: + tuesday = '2018-05-08' + wenesday = '2018-05-09' + thirsday = '2018-05-10' + friday = '2018-05-11' + saturday = '2018-05-12' + sunday = '2018-05-13' + monday = '2018-05-14' + days = [('Mardi', tuesday), ('Mercredi', wenesday), ('Jeudi', thirsday), ('Vendredi', friday), ('Samedi', saturday), ('Dimanche', sunday)] + page = str(request.url_rule) + menu = get_menu(page) + roles = Tetawebapp_roles.query.order_by(Tetawebapp_roles.id).all() + message = 'ID du tour de staff non conforme' + turns = turns_list() + turn_id = int(ID.encode('utf-8')) + turn = get_turn_by_id(turn_id) + return render_template('turn_by_id.html', menu=menu, page=page, turn=turn, roles=roles, days=days) + except AttributeError: + # User is not logged in + return render_template('login_or_register.html', message="Utilisateur ou mot de passe invalide") + except ValueError: + # ID is not an integer + return render_template('list_turns.html', menu=menu, page=page, turns=turns, message=message) + +@app.route("/turn/update/", methods=['GET', 'POST']) +@check_session +def update_turn(ID): + """ Update given staff turn """ + try: + role_id = request.form.get('role_id').encode('utf-8') + start = request.form.get('start').encode('utf-8') + end = request.form.get('end').encode('utf-8') + num_slot = request.form.get('num_slot').encode('utf-8') + day = request.form.get('day').encode('utf-8') + if session['is_admin']: + page = str(request.url_rule) + menu = get_menu(page) + turns = turns_list() + message = "Erreur lors de l'enregistrement.".decode('utf-8') + turn_id = int(ID.encode('utf-8')) + if update_turn_by_id(turn_id, role_id, day, start, end, num_slot): + turns = turns_list() + message = '' + return render_template('list_turns.html', menu=menu, page=page, turns=turns, message=message) + # User is not admin + return render_template('login_or_register.html', message="Utilisateur ou mot de passe invalide") + except AttributeError as e: + # User is not logged in + return render_template('login_or_register.html', message="Utilisateur ou mot de passe invalide") + except ValueError: + # ID is not an integer + return render_template('list_turns.html', menu=menu, page=page, turns=turns, message=message) + +@app.route("/turn/delete/", methods=['GET', 'POST']) +@check_session +def delete_turn(ID): + """ Delete given staff turn """ + try: + if session['is_admin']: + message = 'Erreur lors de la suppression.' + page = str(request.url_rule) + menu = get_menu(page) + turns = turns_list() + turn_id = int(ID.encode('utf-8')) + if drop_turn(turn_id): + message = '' + turns = turns_list() + return render_template('list_turns.html', menu=menu, turns=turns, message=message) + return render_template('list_turns.html', menu=menu, turns=turns, message=message) + # User is not admin + return render_template('login_or_register.html', message="Utilisateur ou mot de passe invalide") + except AttributeError: + # User is not logged in + return render_template('login_or_register.html', message="Utilisateur ou mot de passe invalide") + except ValueError: + # ID is not an integer + return render_template('list_turns.html', menu=menu, page=page, turns=turns, message=message) + ######################################################################## # Main ######################################################################## diff --git a/templates/account_by_id.html b/templates/account_by_id.html index ca72f2d..f9334d8 100644 --- a/templates/account_by_id.html +++ b/templates/account_by_id.html @@ -5,11 +5,11 @@

Informations du compte


-
+


-
-
+
+
diff --git a/templates/login_or_register.html b/templates/login_or_register.html index 591af81..56188d8 100644 --- a/templates/login_or_register.html +++ b/templates/login_or_register.html @@ -10,8 +10,8 @@ Mix'Art Myrys.

- Ce festival ne pourrait pas avoir lieu sans votre implication et cette année encore votre aide est la bienvenue et nous - est précieuse. + Ce festival ne pourrait pas avoir lieu sans votre implication et cette année encore votre aide est la bienvenue et nous + est précieuse.

Ce site vous permettra: @@ -47,9 +47,9 @@

-
-
- +
+
+

Mot de passe oublié ? Envoyez une demande de réinitialisation de votre mot de passe. @@ -64,7 +64,7 @@


- +

En vous inscrivant vous déclarez être prèt à découvrir l'insondabilité de l'improbable