create settings page, full timezone support
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
2022-11-23 20:36:38 -05:00
parent 5c26838c50
commit 8ed6336e20
8 changed files with 58 additions and 10 deletions

View File

@@ -3,9 +3,9 @@ from flask import Flask, render_template, redirect, url_for, request, flash
from flask_migrate import Migrate from flask_migrate import Migrate
from werkzeug.security import generate_password_hash, check_password_hash from werkzeug.security import generate_password_hash, check_password_hash
from flask_login import (LoginManager, login_user, login_required, logout_user, current_user) from flask_login import (LoginManager, login_user, login_required, logout_user, current_user)
from misc import datetime, date, time, currDay from misc import datetime, date, time, currDay, ZoneInfo
from db import (db, Period, Task, Event, User) from db import (db, Period, Task, Event, User)
from forms import (TaskForm, EventForm, PeriodForm, SignupForm, LoginForm) from forms import (TaskForm, EventForm, PeriodForm, SignupForm, LoginForm, SettingsForm)
from create_events import createEvents from create_events import createEvents
basedir = os.path.abspath(os.path.dirname(__file__)) basedir = os.path.abspath(os.path.dirname(__file__))
@@ -82,6 +82,19 @@ def logout():
logout_user() logout_user()
return redirect(url_for('index')) return redirect(url_for('index'))
@app.route('/settings', methods=('GET', 'POST'))
@login_required
def settings():
user = User.query.get_or_404(current_user.id)
form = SettingsForm(obj=user)
if form.validate_on_submit():
user.realName = form.realName.data
user.timezone = form.timezone.data
if form.password.data != '':
user.password = generate_password_hash(form.password.data, method='sha256')
db.session.commit()
return render_template('settings.html', form=form)
# Periods routes # Periods routes
@app.route('/periods') @app.route('/periods')
@login_required @login_required
@@ -133,7 +146,7 @@ def events():
periods = Period.query.all() periods = Period.query.all()
createEvents(db, currDay, Period, Event) createEvents(db, currDay, Period, Event)
return render_template('events.html', events=events, periods=periods, datetime=datetime, date=date) return render_template('events.html', events=events, periods=periods, datetime=datetime, date=date, ZoneInfo=ZoneInfo)
@app.route('/event/edit/<int:event_id>/', methods=('GET', 'POST')) @app.route('/event/edit/<int:event_id>/', methods=('GET', 'POST'))
@login_required @login_required

View File

@@ -43,4 +43,4 @@ class User(UserMixin, db.Model):
email = db.Column(db.String(100), unique=True) email = db.Column(db.String(100), unique=True)
password = db.Column(db.String(100)) password = db.Column(db.String(100))
realName = db.Column(db.String(1000)) realName = db.Column(db.String(1000))
timezone = db.Column(db.String(20)) timezone = db.Column(db.String(20), default='UTC')

View File

@@ -1,6 +1,7 @@
import pytz
from db import Task from db import Task
from flask_wtf import FlaskForm from flask_wtf import FlaskForm
from wtforms import (StringField, DateField, TimeField, TextAreaField, IntegerField, BooleanField, from wtforms import (StringField, DateField, TimeField, TextAreaField, IntegerField, SelectField, BooleanField,
RadioField, EmailField, PasswordField) RadioField, EmailField, PasswordField)
from wtforms.validators import InputRequired, Length from wtforms.validators import InputRequired, Length
from wtforms_sqlalchemy.orm import QuerySelectField from wtforms_sqlalchemy.orm import QuerySelectField
@@ -21,6 +22,11 @@ class PeriodForm(FlaskForm):
weekendSchedule = BooleanField(label='Include on Weekends?', false_values=None) weekendSchedule = BooleanField(label='Include on Weekends?', false_values=None)
periodTime = TimeField('Time', format="%H:%M") periodTime = TimeField('Time', format="%H:%M")
class SettingsForm(FlaskForm):
password = PasswordField('Password')
realName = StringField('Real Name')
timezone = SelectField('Time Zone', choices=pytz.all_timezones)
class SignupForm(FlaskForm): class SignupForm(FlaskForm):
userName = StringField('Username', validators=[InputRequired()]) userName = StringField('Username', validators=[InputRequired()])
password = PasswordField('Password', validators=[InputRequired()]) password = PasswordField('Password', validators=[InputRequired()])

View File

@@ -1,8 +1,8 @@
"""empty message """empty message
Revision ID: d4e71a6e9479 Revision ID: d92ccc005d22
Revises: bf65c9f77f9f Revises: bf65c9f77f9f
Create Date: 2022-11-22 05:24:06.596342 Create Date: 2022-11-23 20:32:41.868230
""" """
from alembic import op from alembic import op
@@ -10,7 +10,7 @@ import sqlalchemy as sa
# revision identifiers, used by Alembic. # revision identifiers, used by Alembic.
revision = 'd4e71a6e9479' revision = 'd92ccc005d22'
down_revision = 'bf65c9f77f9f' down_revision = 'bf65c9f77f9f'
branch_labels = None branch_labels = None
depends_on = None depends_on = None
@@ -18,7 +18,7 @@ depends_on = None
def upgrade(): def upgrade():
# ### commands auto generated by Alembic - please adjust! ### # ### commands auto generated by Alembic - please adjust! ###
op.add_column('user', sa.Column('timezone', sa.String(length=20), nullable=True)) op.add_column('user', sa.Column('timezone', sa.String(length=20), nullable=True, server_default='UTC'))
# ### end Alembic commands ### # ### end Alembic commands ###

View File

@@ -1,4 +1,5 @@
import time import time
from datetime import datetime, date from datetime import datetime, date
from zoneinfo import ZoneInfo
currDay = datetime.now() currDay = datetime.now()
currDay = currDay.strftime('%m-%d-%Y') currDay = currDay.strftime('%m-%d-%Y')

View File

@@ -20,6 +20,9 @@ Flask-User==1.0.2.2
# WTForms Extensions # WTForms Extensions
WTForms-SQLAlchemy==0.3.0 WTForms-SQLAlchemy==0.3.0
# Python Time packages
pytz==2022.6
# Automated tests # Automated tests
pytest==7.2.0 pytest==7.2.0
pytest-cov==4.0.0 pytest-cov==4.0.0

View File

@@ -1,10 +1,12 @@
{% extends 'base.html' %} {% extends 'base.html' %}
{% set currDay = datetime.now() %} {% set currDay = datetime.now() %}
{% set currDay = currDay.astimezone(ZoneInfo(current_user.timezone)) %}
{% set currTime = currDay.strftime('%I:%M %p') %}
{% set currDay = currDay.strftime('%m-%d-%Y') %} {% set currDay = currDay.strftime('%m-%d-%Y') %}
{% block content %} {% block content %}
<span><h1>{% block title %} Events {% endblock %}</h1></span> <span><h1>{% block title %} Events {% endblock %}</h1></span>
<b>Current Date: {{ currDay }} </b> <br> <br> <b>Current Date: {{ currDay }} </b> <br> <b>Current Time: {{ currTime }}</b> <br> <br>
<div> <div>
{% for period in periods %} {% for period in periods %}
<div> <div>

View File

@@ -0,0 +1,23 @@
{% extends 'base.html' %}
{% block content %}
<span><h1>{% block title %} Settings {% endblock %}</h1></span>
<form method="post">
{{ form.csrf_token }}
<p>
<b>User: {{ current_user.userName }}</b>
<div>
{{ form.realName.label }} {{ form.realName }}
</div> <br>
<div>
{{ form.password.label }} {{ form.password }}
</div> <br>
<div>
{{ form.timezone.label }} {{ form.timezone }}
</div>
</p>
<p>
<button class="btn btn-primary" type="submit">Submit</button>
</p>
</form>
{% endblock %}