Compare commits
8 Commits
master
...
task-expir
Author | SHA1 | Date | |
---|---|---|---|
6329a647e4 | |||
86ed978098 | |||
b5c49bc46f | |||
dc6fb52b58 | |||
b783946273 | |||
dca5b35395 | |||
5d6695d608 | |||
1597a322bf |
@@ -1 +1 @@
|
|||||||
1.1.0
|
1.1.1
|
||||||
|
12
app/app.py
12
app/app.py
@@ -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}')
|
||||||
|
@@ -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}">'
|
||||||
|
@@ -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()])
|
||||||
|
32
app/migrations/versions/625eb20835b5_add_expiry_date.py
Normal file
32
app/migrations/versions/625eb20835b5_add_expiry_date.py
Normal 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 ###
|
@@ -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()
|
||||||
|
@@ -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>
|
||||||
|
@@ -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>
|
||||||
|
@@ -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>
|
||||||
|
@@ -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>
|
||||||
|
Reference in New Issue
Block a user