Passed
Push — mvp ( c8cadd...d4ca14 )
by
unknown
01:27
created

app.dashboard_page()   B

Complexity

Conditions 6

Size

Total Lines 20
Code Lines 15

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 15
dl 0
loc 20
rs 8.6666
c 0
b 0
f 0
cc 6
nop 0
1
import re
2
import secrets
3
from datetime import datetime
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, autoincrement=True)
31
    user_id = db.Column(db.Integer)
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 session.get('user'):
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable session does not seem to be defined.
Loading history...
44
        return redirect(url_for('dashboard_page'))
45
    if request.method == 'POST':
46
        username = request.form['username']
47
        password = request.form['password']
48
49
        if username and password:
50
            login = User.query.filter_by(
51
                pseudo=username,
52
                password=sha512(password)
53
            ).first()
54
55
            if login is not None:
56
                session['user'] = {'name': username}
57
                return redirect(url_for('dashboard_page'))
58
59
    return render_template('auth/login.jinja2')
60
61
62
@app.route('/auth/register', methods=('GET', 'POST'))
63
def register_page():
64
    if request.method == 'POST':
65
        username = request.form['username']
66
        password = request.form['password']
67
        confirm_password = request.form['confirm_password']
68
69
        if (
70
                re.match(USERNAME_PATTERN, username)
71
                and re.match(PASSWORD_PATTERN, password)
72
                and confirm_password
73
                and confirm_password == password
74
        ):
75
            new_user = User(
76
                pseudo=username,
77
                password=sha512(password)
78
            )
79
80
            db.session.add(new_user)
81
            db.session.commit()
82
83
            session['user'] = {'name': username}
84
            return redirect(url_for('dashboard_page'))
85
86
    return render_template(
87
        'auth/register.jinja2',
88
        USERNAME_PATTERN=USERNAME_PATTERN,
89
        PASSWORD_PATTERN=PASSWORD_PATTERN
90
    )
91
92
93
@app.route('/dashboard', methods=('GET', 'POST'))
94
def dashboard_page():
95
    user = session.get('user')
96
97
    if not user:
98
        return redirect(url_for('login_page'))
99
100
    if not user.get('name'):
101
        return redirect(url_for('login_page'))
102
103
    if request.method == 'POST' and request.form['date']:
104
        username = request.form['username']
105
        date = datetime.strptime(request.form['date'], '%Y-%m-%d')
106
107
        if re.match(USERNAME_PATTERN, username):
108
            new_birthday = Birthday(person_name=username,person_birthday=date)
109
            db.session.add(new_birthday)
110
            db.session.commit()
111
112
    return render_template('dashboard.jinja2')
113
114
115
@app.route('/auth/delete', methods=('GET', 'POST'))
116
def delete_account_page():
117
    user = session.get('user')
118
119
    if not user:
120
        return redirect(url_for('login_page'))
121
122
    if not user.get('name'):
123
        return redirect(url_for('login_page'))
124
    if request.method == 'POST' and user.get('name') == request.form.get(
125
            'account_name'
126
    ):
127
        db.session.delete(User.query.filter_by(pseudo=user.get('name')).first())
128
        db.session.commit()
129
        return redirect(url_for('logout'))
130
    return render_template('auth/delete.jinja2')
131
132
133
@app.route('/legal')
134
def legal_page():
135
    return render_template('legal.jinja2')
136
137
138
@app.route('/auth/edit', methods=('GET', 'POST'))
139
def edit_page():
140
    user = session.get('user')
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable session does not seem to be defined.
Loading history...
141
142
    if not user:
143
        return redirect(url_for('login_page'))
144
145
    if not user.get('name'):
146
        return redirect(url_for('login_page'))
147
148
    if request.method == 'POST':
149
        if request.form.get('new_password'):
150
            new_password = request.form['new_password']
151
            confirm_password = request.form['confirm_new_password']
152
            old_password = request.form['old_password']
153
154
            if (
155
                    User.query.filter_by(
156
                        pseudo=user.get('name'), password=sha512(old_password)
157
                    ).first()
158
                    and new_password == confirm_password
159
            ):
160
                user = User.query.filter_by(pseudo=user.get('name')).first()
161
                user.password = sha512(new_password)
162
                db.session.commit()
163
164
        elif request.form.get('new_username'):
165
            new_username = request.form['new_username']
166
            confirm_username = request.form['confirm_new_username']
167
168
            if (
169
                    new_username == confirm_username
170
                    and not User.query.filter_by(pseudo=new_username).first()
171
            ):
172
                user = User.query.filter_by(pseudo=user.get('name')).first()
173
                user.pseudo = new_username
174
                db.session.commit()
175
176
                session['user'] = {'name': new_username}
177
178
    return render_template('auth/edit.jinja2')
179
180
181
@app.route('/logout/')
182
def logout():
183
    if session.get('user'):
184
        session.pop('user')
185
186
    return redirect(url_for('index_page'))
187
188
189
if __name__ == '__main__':
190
    db.drop_all()
191
    db.create_all()
192
    app.run(debug=True)
193