diff --git a/app/app.py b/app/app.py index a7421dd..911034b 100644 --- a/app/app.py +++ b/app/app.py @@ -3,9 +3,9 @@ from flask import Flask, render_template, redirect, url_for, request, flash from flask_migrate import Migrate from werkzeug.security import generate_password_hash, check_password_hash 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 forms import (TaskForm, EventForm, PeriodForm, SignupForm, LoginForm) +from forms import (TaskForm, EventForm, PeriodForm, SignupForm, LoginForm, SettingsForm) from create_events import createEvents basedir = os.path.abspath(os.path.dirname(__file__)) @@ -82,6 +82,19 @@ def logout(): logout_user() 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 @app.route('/periods') @login_required @@ -133,7 +146,7 @@ def events(): periods = Period.query.all() 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//', methods=('GET', 'POST')) @login_required diff --git a/app/db.py b/app/db.py index 27fe326..4bb6bff 100644 --- a/app/db.py +++ b/app/db.py @@ -43,4 +43,4 @@ class User(UserMixin, db.Model): email = db.Column(db.String(100), unique=True) password = db.Column(db.String(100)) realName = db.Column(db.String(1000)) - timezone = db.Column(db.String(20)) + timezone = db.Column(db.String(20), default='UTC') diff --git a/app/forms.py b/app/forms.py index 928c5fb..8548404 100644 --- a/app/forms.py +++ b/app/forms.py @@ -1,6 +1,7 @@ +import pytz from db import Task 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) from wtforms.validators import InputRequired, Length from wtforms_sqlalchemy.orm import QuerySelectField @@ -21,6 +22,11 @@ class PeriodForm(FlaskForm): weekendSchedule = BooleanField(label='Include on Weekends?', false_values=None) 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): userName = StringField('Username', validators=[InputRequired()]) password = PasswordField('Password', validators=[InputRequired()]) diff --git a/app/migrations/versions/d4e71a6e9479_.py b/app/migrations/versions/d92ccc005d22_.py similarity index 80% rename from app/migrations/versions/d4e71a6e9479_.py rename to app/migrations/versions/d92ccc005d22_.py index 14e1572..fcd70ff 100644 --- a/app/migrations/versions/d4e71a6e9479_.py +++ b/app/migrations/versions/d92ccc005d22_.py @@ -1,8 +1,8 @@ """empty message -Revision ID: d4e71a6e9479 +Revision ID: d92ccc005d22 Revises: bf65c9f77f9f -Create Date: 2022-11-22 05:24:06.596342 +Create Date: 2022-11-23 20:32:41.868230 """ from alembic import op @@ -10,7 +10,7 @@ import sqlalchemy as sa # revision identifiers, used by Alembic. -revision = 'd4e71a6e9479' +revision = 'd92ccc005d22' down_revision = 'bf65c9f77f9f' branch_labels = None depends_on = None @@ -18,7 +18,7 @@ depends_on = None def upgrade(): # ### 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 ### diff --git a/app/misc.py b/app/misc.py index 9124938..b0933f7 100644 --- a/app/misc.py +++ b/app/misc.py @@ -1,4 +1,5 @@ import time from datetime import datetime, date +from zoneinfo import ZoneInfo currDay = datetime.now() currDay = currDay.strftime('%m-%d-%Y') \ No newline at end of file diff --git a/app/requirements.txt b/app/requirements.txt index 8ed3ceb..1158712 100644 --- a/app/requirements.txt +++ b/app/requirements.txt @@ -20,6 +20,9 @@ Flask-User==1.0.2.2 # WTForms Extensions WTForms-SQLAlchemy==0.3.0 +# Python Time packages +pytz==2022.6 + # Automated tests pytest==7.2.0 pytest-cov==4.0.0 diff --git a/app/templates/events.html b/app/templates/events.html index b4b1c0d..fc9cfe1 100644 --- a/app/templates/events.html +++ b/app/templates/events.html @@ -1,10 +1,12 @@ {% extends 'base.html' %} {% 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') %} {% block content %}

{% block title %} Events {% endblock %}

- Current Date: {{ currDay }}

+ Current Date: {{ currDay }}
Current Time: {{ currTime }}

{% for period in periods %}
diff --git a/app/templates/settings.html b/app/templates/settings.html new file mode 100644 index 0000000..04c0611 --- /dev/null +++ b/app/templates/settings.html @@ -0,0 +1,23 @@ +{% extends 'base.html' %} + +{% block content %} +

{% block title %} Settings {% endblock %}

+
+ {{ form.csrf_token }} +

+ User: {{ current_user.userName }} +

+ {{ form.realName.label }} {{ form.realName }} +

+
+ {{ form.password.label }} {{ form.password }} +

+
+ {{ form.timezone.label }} {{ form.timezone }} +
+

+

+ +

+
+{% endblock %} \ No newline at end of file