Passed
Push — mvp ( 9d6c83...e9d41d )
by Yohann
01:00
created

app.edit_page()   C

Complexity

Conditions 9

Size

Total Lines 35
Code Lines 26

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 26
dl 0
loc 35
rs 6.6666
c 0
b 0
f 0
cc 9
nop 0
1
import re
2
import secrets
3
4
from flask import Flask, render_template, redirect, url_for, request, session
5
from flask_sqlalchemy import SQLAlchemy
6
7
from src.security import sha512
8
9
app = Flask(__name__)
10
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///bday.db'
11
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
12
db = SQLAlchemy(app)
13
14
app.config.from_object(__name__)
15
app.secret_key = secrets.token_urlsafe(32)
16
17
USERNAME_PATTERN = r'^([\w -]){4,32}$'
18
PASSWORD_PATTERN = r'^(.*(?=.{8,})(?=.*[a-zA-Z])(?=.*\d).*){8,32}$'
19
20
21
# DB Model
22
class User(db.Model):
23
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
24
    pseudo = db.Column(db.String(32))
25
    password = db.Column(db.String(128))
26
    birthday = db.Column(db.Date, default=None)
27
28
29
class Birthday(db.Model):
30
    id = db.Column(db.Integer, primary_key=True)
31
    user_id = db.Column(db.Integer, primary_key=True)
32
    person_name = db.Column(db.String(32))
33
    person_birthday = db.Column(db.Date)
34
35
36
@app.route('/', methods=('GET', 'POST'))
37
def index_page():
38
    return render_template('index.jinja2')
39
40
41
@app.route('/auth/login', methods=('GET', 'POST'))
42
def login_page():
43
    if request.method == 'POST':
44
        username = request.form['username']
45
        password = request.form['password']
46
47
        if username and password:
48
            login = User.query.filter_by(
49
                pseudo=username,
50
                password=sha512(password)
51
            ).first()
52
53
            if login is not None:
54
                session['user'] = {'name': username}
55
                return redirect(url_for('dashboard_page'))
56
57
    return render_template('auth/login.jinja2')
58
59
60
@app.route('/auth/register', methods=('GET', 'POST'))
61
def register_page():
62
    if request.method == 'POST':
63
        username = request.form['username']
64
        password = request.form['password']
65
        confirm_password = request.form['confirm_password']
66
67
        if (
68
                re.match(USERNAME_PATTERN, username)
69
                and re.match(PASSWORD_PATTERN, password)
70
                and confirm_password
71
                and confirm_password == password
72
        ):
73
            new_user = User(
74
                pseudo=username,
75
                password=sha512(password)
76
            )
77
78
            db.session.add(new_user)
79
            db.session.commit()
80
81
            session['user'] = {'name': username}
82
            return redirect(url_for('dashboard_page'))
83
84
    return render_template('auth/register.jinja2')
85
86
87
@app.route('/dashboard')
88
def dashboard_page():
89
    user = session.get('user')
90
91
    if not user:
92
        return redirect(url_for('login_page'))
93
94
    if not user.get('name'):
95
        return redirect(url_for('login_page'))
96
97
    return render_template('dashboard.jinja2')
98
99
100
@app.route('/auth/delete', methods=('GET', 'POST'))
101
def delete_account_page():
102
    return render_template('auth/delete.jinja2')
103
104
105
@app.route('/legal')
106
def legal_page():
107
    return render_template('legal.jinja2')
108
109
110
@app.route('/auth/edit', methods=('GET', 'POST'))
111
def edit_page():
112
    user = session.get('user')
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable session does not seem to be defined.
Loading history...
113
114
    if not user:
115
        return redirect(url_for('login_page'))
116
117
    if not user.get('name'):
118
        return redirect(url_for('login_page'))
119
120
    if request.method == 'POST':
121
        if request.form.get('new_password'):
122
            new_password = request.form['new_password']
123
            confirm_password = request.form['confirm_new_password']
124
125
            if new_password == confirm_password:
126
                user = User.query.filter_by(pseudo=user.get('name')).first()
127
                user.password = sha512(new_password)
128
                db.session.commit()
129
130
        elif request.form.get('new_username'):
131
            new_username = request.form['new_username']
132
            confirm_username = request.form['confirm_new_username']
133
134
            if (
135
                new_username == confirm_username
136
                and not User.query.filter_by(pseudo=new_username).first()
137
            ):
138
                user = User.query.filter_by(pseudo=user.get('name')).first()
139
                user.pseudo = new_username
140
                db.session.commit()
141
142
                session['user'] = {'name': new_username}
143
144
    return render_template('auth/edit.jinja2')
145
146
147
@app.route('/logout/')
148
def logout():
149
    return redirect(url_for('index'))
150
151
152
if __name__ == '__main__':
153
    db.create_all()
154
    app.run(debug=True)
155