1.0.1 release #15
19
app/app.py
19
app/app.py
@@ -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
|
||||||
|
@@ -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')
|
||||||
|
@@ -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()])
|
||||||
|
@@ -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 ###
|
||||||
|
|
||||||
|
|
@@ -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')
|
@@ -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
|
||||||
|
@@ -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>
|
||||||
|
23
app/templates/settings.html
Normal file
23
app/templates/settings.html
Normal 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 %}
|
Reference in New Issue
Block a user