8 Commits

Author SHA1 Message Date
6329a647e4 hide expiry date unless has value 2023-04-18 19:45:26 -04:00
86ed978098 fix 2023-04-18 19:41:45 -04:00
b5c49bc46f update templates 2023-04-18 19:41:13 -04:00
dc6fb52b58 update templates with task expiry 2023-04-18 17:26:49 -04:00
b783946273 update task form to include expiry date field 2023-04-18 17:25:59 -04:00
dca5b35395 expiry date migration in alembic 2023-04-18 17:13:56 -04:00
5d6695d608 add expiry_date to task model 2023-04-18 17:13:34 -04:00
1597a322bf brand version 1.1.1
All checks were successful
continuous-integration/drone/push Build is passing
2023-04-17 20:19:49 -04:00
10 changed files with 67 additions and 4 deletions

View File

@@ -1 +1 @@
1.1.0 1.1.1

View File

@@ -4,7 +4,7 @@ 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, prevDay, ZoneInfo, currVersion, currCommit from misc import datetime, date, time, currDay, prevDay, ZoneInfo, currVersion, currCommit, convDay
from db import (db, Period, Task, Event, User) from db import (db, Period, Task, Event, User)
from sqlalchemy import inspect from sqlalchemy import inspect
from forms import (TaskForm, EventForm, PeriodForm, SignupForm, LoginForm, SettingsForm) from forms import (TaskForm, EventForm, PeriodForm, SignupForm, LoginForm, SettingsForm)
@@ -258,9 +258,14 @@ def newTask():
sourceIP = request.environ.get('HTTP_X_REAL_IP', request.remote_addr) sourceIP = request.environ.get('HTTP_X_REAL_IP', request.remote_addr)
form = TaskForm() form = TaskForm()
if form.validate_on_submit(): if form.validate_on_submit():
if form.expiryDate.data is not None:
expiryDate=convDay(form.expiryDate.data)
else:
expiryDate = None
task = Task(title=form.title.data, task = Task(title=form.title.data,
description=form.description.data, description=form.description.data,
created_timestamp=int(time.time())) created_timestamp=int(time.time()),
expiry_date=expiryDate)
db.session.add(task) db.session.add(task)
db.session.commit() db.session.commit()
logger.info(f'New task added by \'{current_user.userName}\' from {sourceIP}') logger.info(f'New task added by \'{current_user.userName}\' from {sourceIP}')
@@ -276,6 +281,9 @@ def editTask(task_id):
if form.validate_on_submit(): if form.validate_on_submit():
task.title=form.title.data task.title=form.title.data
task.description=form.description.data task.description=form.description.data
if form.expiryDate.data is not None:
expiryDate=convDay(form.expiryDate.data)
task.expiry_date=expiryDate
db.session.commit() db.session.commit()
logger.info(f'Task {task_id} edited by \'{current_user.userName}\' from {sourceIP}') logger.info(f'Task {task_id} edited by \'{current_user.userName}\' from {sourceIP}')
return redirect(f'/task/{task_id}') return redirect(f'/task/{task_id}')

View File

@@ -20,6 +20,7 @@ class Task(db.Model):
is_completed = db.Column(db.Boolean) is_completed = db.Column(db.Boolean)
created_timestamp = db.Column(db.Integer) created_timestamp = db.Column(db.Integer)
due_timestamp = db.Column(db.Integer) due_timestamp = db.Column(db.Integer)
expiry_date = db.Column(db.String(100))
def __repr__(self): def __repr__(self):
return f'<Task "{self.title}">' return f'<Task "{self.title}">'

View File

@@ -3,7 +3,7 @@ from db import Task
from flask_wtf import FlaskForm from flask_wtf import FlaskForm
from wtforms import (StringField, DateField, TimeField, TextAreaField, IntegerField, SelectField, 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, Optional
from wtforms_sqlalchemy.orm import QuerySelectField from wtforms_sqlalchemy.orm import QuerySelectField
def get_tasks(): def get_tasks():
@@ -12,6 +12,7 @@ class TaskForm(FlaskForm):
title = StringField('Title', validators=[InputRequired(), title = StringField('Title', validators=[InputRequired(),
Length(min=5, max=100)]) Length(min=5, max=100)])
description = TextAreaField('Description', validators=[Length(max=200)]) description = TextAreaField('Description', validators=[Length(max=200)])
expiryDate = DateField('Expiry Date', format='%Y-%m-%d', validators=[Optional()])
class EventForm(FlaskForm): class EventForm(FlaskForm):
# eventDate = DateField('Date', validators=[InputRequired()], format='m-%d-%Y') # eventDate = DateField('Date', validators=[InputRequired()], format='m-%d-%Y')
# period_num = IntegerField(validators=[InputRequired()]) # period_num = IntegerField(validators=[InputRequired()])

View File

@@ -0,0 +1,32 @@
"""add expiry date
Revision ID: 625eb20835b5
Revises:
Create Date: 2023-04-18 17:11:23.703222
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = '625eb20835b5'
down_revision = None
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
with op.batch_alter_table('task', schema=None) as batch_op:
batch_op.add_column(sa.Column('expiry_date', sa.String(length=100), nullable=True))
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
with op.batch_alter_table('task', schema=None) as batch_op:
batch_op.drop_column('expiry_date')
# ### end Alembic commands ###

View File

@@ -10,6 +10,11 @@ currDay = currDay.strftime('%m-%d-%Y')
prevDay = datetime.now() + timedelta(days=-1) prevDay = datetime.now() + timedelta(days=-1)
prevDay = prevDay.strftime('%m-%d-%Y') prevDay = prevDay.strftime('%m-%d-%Y')
# Convert date to str format
def convDay(inDate):
outDate = inDate.strftime('%m-%d-%Y')
return outDate
with open('__version__','r') as file: with open('__version__','r') as file:
currVersion = file.read() currVersion = file.read()

View File

@@ -13,6 +13,10 @@
{{ form.description.label }} {{ form.description.label }}
</p> </p>
{{ form.description(rows=5, cols=25) }} {{ form.description(rows=5, cols=25) }}
<p>
{{ form.expiryDate.label }}
{{ form.expiryDate }}
</p>
<p> <p>
<button class="btn btn-primary" type="submit">Edit Task</button> <button class="btn btn-primary" type="submit">Edit Task</button>
</p> </p>

View File

@@ -13,6 +13,10 @@
{{ form.description.label }} {{ form.description.label }}
</p> </p>
{{ form.description(rows=5, cols=25) }} {{ form.description(rows=5, cols=25) }}
<p>
{{ form.expiryDate.label }}
{{ form.expiryDate }}
</p>
<p> <p>
<button class="btn btn-primary" type="submit">Add Task</button> <button class="btn btn-primary" type="submit">Add Task</button>
</p> </p>

View File

@@ -29,6 +29,11 @@
<div> <div>
<p>Due: {{ task.due_timestamp }}</p> <p>Due: {{ task.due_timestamp }}</p>
</div> </div>
{% if task.expiry_date != None %}
<div>
<p>Expires: {{ task.expiry_date }}</p>
</div>
{% endif %}
<p> <p>
<a class="btn btn-primary" href="/task/{{task.id}}/edit">Edit Task</a> <a class="btn btn-primary" href="/task/{{task.id}}/edit">Edit Task</a>
<span> <span>

View File

@@ -28,6 +28,9 @@
</b> </b>
<div> <div>
<p>Created: {{ createdTime.strftime('%Y-%m-%d %I:%M %p') }}</p> <p>Created: {{ createdTime.strftime('%Y-%m-%d %I:%M %p') }}</p>
{% if task.expiry_date != None %}
<p>Expires: {{ task.expiry_date }}</p>
{% endif %}
</div> </div>
<hr> <hr>
</div> </div>