+ disconnect_user()
+ flash('Vous avez été déconnecté.', 'info')
+ return redirect(url_for('home'))
+
+#-----------------
+# Change password
+
+@app.route('/password/lost', methods=['GET', 'POST'])
+def password_lost():
+ info = None
+ if request.method == 'POST':
+ user = query_db('select * from users where email = ?', [request.form['email']], one=True)
+ if user is None:
+ flash('Cet utilisateur n\'existe pas !', 'error')
+ else:
+ key = keygen()
+ g.db.execute('update users set key = ? where id = ?', [key, user['id']])
+ g.db.commit()
+ link = BASEURL + url_for('login_key', userid=user['id'], key=key)
+ BODY = string.join((
+ "From: %s" % EMAIL,
+ "To: %s" % user['email'],
+ "Subject: [Cavote] Password lost",
+ "Date: %s" % time.strftime("%a, %d %b %Y %H:%M:%S +0000", time.gmtime()),
+ "X-Mailer: %s" % VERSION,
+ "",
+ "You have lost your password.",
+ "This link will log you without password.",
+ "Don't forget to define a new one as soon a possible!",
+ "This link will only work one time.",
+ "",
+ link,
+ "",
+ "If you think this mail is not for you, please ignore and delete it."
+ ), "\r\n")
+ server = smtplib.SMTP(SMTP_SERVER)
+ server.sendmail(EMAIL, [user['email']], BODY)
+ server.quit()
+ flash(u"Un mail a été envoyé à " + user['email'], 'info')
+ return render_template('password_lost.html')
+
+@app.route('/login/<userid>/<key>')
+def login_key(userid, key):
+ user = query_db('select * from users where id = ? and key = ?', [userid, key], one=True)
+ if user is None or user['key'] == "invalid":
+ abort(404)
+ else:
+ connect_user(user)
+ g.db.execute('update users set key = "invalid" where id = ?', [user['id']])
+ g.db.commit()
+ flash(u"Veuillez mettre à jour votre mot de passe", 'info')
+ return redirect(url_for('user_password', userid=user['id']))
+
+#---------------
+# User settings
+
+@app.route('/user/<userid>')
+def user(userid):
+ if int(userid) != get_userid():
+ abort(401)
+ groups = query_db('select * from groups join user_group on id=id_group where id_user = ?', userid)
+ return render_template('user.html', groups=groups)
+
+@app.route('/user/settings/<userid>', methods=['GET', 'POST'])
+def user_edit(userid):
+ if int(userid) != get_userid():
+ abort(401)
+ if request.method == 'POST':
+ if query_db('select * from users where email=? and id!=?', [request.form['email'], userid], one=True) is None:
+ if query_db('select * from users where name=? and id!=?', [request.form['name'], userid], one=True) is None:
+ g.db.execute('update users set email = ?, name = ?, organization = ? where id = ?',
+ [request.form['email'], request.form['name'], request.form['organization'], session['user']['id']])
+ g.db.commit()
+ disconnect_user()
+ user = query_db('select * from users where id=?', [userid], one=True)
+ if user is None:
+ flash(u'Une erreur s\'est produite.', 'error')
+ return redirect(url_for('login'))
+ connect_user(user)
+ flash(u'Votre profil a été mis à jour !', 'success')
+ else:
+ flash(u'Le nom ' + request.form['name'] + u' est déjà pris ! Veuillez en choisir un autre.', 'error')
+ else:
+ flash(u'Il existe déjà un compte pour cette adresse e-mail : ' + request.form['email'], 'error')
+ return render_template('user_edit.html')
+
+@app.route('/user/password/<userid>', methods=['GET', 'POST'])
+def user_password(userid):
+ if int(userid) != get_userid():
+ abort(401)
+ if request.method == 'POST':
+ if request.form['password'] == request.form['password2']:
+ g.db.execute('update users set password = ? where id = ?', [crypt(request.form['password']), session['user']['id']])
+ g.db.commit()
+ flash(u'Votre mot de passe a été mis à jour.', 'success')
+ else:
+ flash(u'Les mots de passe sont différents.', 'error')
+ return render_template('user_edit.html')
+
+#------------
+# User admin
+
+@app.route('/admin/users')
+def admin_users():
+ if not session.get('user').get('is_admin'):
+ abort(401)
+ tuples = query_db('select *, groups.name as groupname from (select *, id as userid, name as username from users join user_group on id=id_user order by id desc) join groups on id_group=groups.id')
+ users = dict()
+ for t in tuples:
+ if t['userid'] in users:
+ users[t['userid']]['groups'].append(t["groupname"])
+ else:
+ users[t['userid']] = dict()
+ users[t['userid']]['userid'] = t['userid']
+ users[t['userid']]['email'] = t['email']
+ users[t['userid']]['username'] = t['username']
+ users[t['userid']]['is_admin'] = t['is_admin']
+ users[t['userid']]['groups'] = [t['groupname']]
+
+ return render_template('admin_users.html', users=users.values())
+
+@app.route('/admin/users/add', methods=['GET', 'POST'])
+def admin_user_add():
+ if not session.get('user').get('is_admin'):
+ abort(401)
+ if request.method == 'POST':
+ if request.form['email']:
+ if query_db('select * from users where email=?', [request.form['email']], one=True) is None:
+ if request.form['username']:
+ if query_db('select * from users where name=?', [request.form['username']], one=True) is None:
+ password = keygen()
+ admin = 0
+ if 'admin' in request.form.keys():
+ admin = 1
+ key = keygen()
+ g.db.execute('insert into users (email, name, organization, password, is_admin, key) values (?, ?, ?, ?, ?, ?)',
+ [request.form['email'], request.form['username'], request.form['organization'], password, admin, key])
+ g.db.commit()
+ user = query_db('select * from users where email = ?', [request.form["email"]], one=True)
+ if user:
+ groups = request.form.getlist('groups')
+ groups.append('1')
+ for group in groups:
+ if query_db('select id from groups where id = ?', group, one=True) is None:
+ flash(u'Le groupe portant l\'id %s n\'existe pas.' % group, 'warning')
+ else:
+ g.db.execute('insert into user_group values (?, ?)', [user['id'], group])
+ g.db.commit()
+ link = BASEURL + url_for('login_key', userid=user['id'], key=user['key'])
+ BODY = string.join((
+ "From: %s" % EMAIL,
+ "To: %s" % user['email'],
+ "Subject: [Cavote] Welcome",
+ "Date: %s" % time.strftime("%a, %d %b %Y %H:%M:%S +0000", time.gmtime()),
+ "X-Mailer: %s" % VERSION,
+ "",
+ "Hi %s!" % user['name'],
+ "Welcome on %s." % TITLE,
+ "Your account's adresse is : %s." % user['email'],
+ "",
+ "To log in for the first time and set your password, please follow this link :",
+ link,
+ ""
+ ), "\r\n")
+ server = smtplib.SMTP(SMTP_SERVER)
+ server.sendmail(EMAIL, [user['email']], BODY)
+ server.quit()
+ flash(u'Le nouvel utilisateur a été créé avec succès', 'success')
+ return redirect(url_for('admin_users'))
+ else:
+ flash(u'Une erreur s\'est produite.', 'error')
+ else:
+ flash(u'Le nom ' + request.form['username'] + u' est déjà pris ! Veuillez en choisir un autre.', 'error')
+ else:
+ flash(u"Vous devez spécifier un nom d'utilisateur.", 'error')
+ else:
+ flash(u'Il existe déjà un compte pour cette adresse e-mail : ' + request.form['email'], 'error')
+ else:
+ flash(u"Vous devez spécifier une adresse email.", 'error')
+ groups = query_db('select * from groups where system=0')
+ return render_template('admin_user_new.html', groups=groups)
+
+#-------------
+# Roles admin
+
+@app.route('/admin/groups')
+def admin_groups():
+ if not session.get('user').get('is_admin'):
+ abort(401)
+ groups = query_db('select * from groups')
+ return render_template('admin_groups.html', groups=groups)
+
+@app.route('/admin/groups/add', methods=['POST'])
+def admin_group_add():
+ if not session.get('user').get('is_admin'):
+ abort(401)
+ if request.method == 'POST':
+ if request.form['name']:
+ g.db.execute('insert into groups (name) values (?)', [request.form['name']])
+ g.db.commit()
+ else:
+ flash(u"Vous devez spécifier un nom.", "error")
+ return redirect(url_for('admin_groups'))