"""
This module handles the routes corresponding to the :class:`models.user.user.User` model.
Attributes
----------
logger : logging.Logger
The logger used to log information of module.
"""
import logging
from flask import Blueprint, request, session, url_for, render_template, redirect, flash
from werkzeug.wrappers import Response
from models.user import User, UserErrors
from models.user import requires_login
from typing import Union
from common.utils import Utils
logger = logging.getLogger("pricing-service.controllers.users")
user_blueprint = Blueprint('users', __name__)
[docs]@user_blueprint.route('/register', methods=['GET', 'POST'])
def register():
"""
Handles the RESTful NEW (GET method) and CREATE (POST method) routes.
Returns
-------
str
The Alerts INDEX template if POST method, Users REGISTER template otherwise.
Raises
------
UserErrors.UserError
If the user couldn't be created.
"""
if request.method == 'POST':
email = request.form['email']
password = request.form['password']
try:
User.register_user(email, password)
logger.debug(f"Created user: {User}")
session['email'] = email
return redirect(url_for('alerts.index'))
except UserErrors.UserError as e:
return e.message
return render_template('users/register.html')
[docs]@user_blueprint.route('/login', methods=['GET', 'POST'])
def login():
"""
Handles the Log in route.
Returns
-------
str
The Users LOGIN template if POST method, Alerts INDEX template otherwise.
Raises
------
UserErrors.UserError
If the user couldn't be created.
"""
if request.method == 'POST':
email = request.form['email']
password = request.form['password']
try:
if User.is_login_valid(email, password):
session['email'] = email
flash(f"Welcome back, {email}!", 'success')
return redirect(url_for('alerts.index'))
except UserErrors.UserError as err:
flash(err.message, 'danger')
return redirect(url_for('users.login'))
return render_template('users/login.html')
[docs]@user_blueprint.route('/edit', methods=['GET', 'POST'])
@requires_login
def edit() -> Union[str, Response]:
"""
Handles the RESTful NEW (GET method) and CREATE (POST method) routes.
Returns
-------
str
The Alerts INDEX template if POST method, Alerts INDEX template otherwise.
Raises
------
UserErrors.UserError
If the user couldn't be created.
"""
email = session['email']
user = User.find_by_email(email)
if request.method == 'POST':
logger.info(f"request.form: {request.form}")
email = request.form['email']
current_password = request.form['current-password']
new_password = request.form['new-password']
try:
if User.is_login_valid(email, current_password):
user.password = Utils.hash_password(new_password)
user.save_to_mongo()
flash(f"Profile edited, {user.email}", 'success')
return redirect(url_for('alerts.index'))
except UserErrors.UserError as err:
flash(err.message, 'danger')
return redirect(url_for('.edit'))
return render_template('users/edit.html', user=user)
[docs]@user_blueprint.route('/logout')
def logout():
"""
Handles the Log out route.
Returns
-------
Response
Redirects to the login route.
"""
session['email'] = None
return redirect('login')