|
@@ -15,6 +15,7 @@ from flask import (
|
|
|
from flask_sqlalchemy import SQLAlchemy
|
|
from flask_sqlalchemy import SQLAlchemy
|
|
|
from sqlalchemy.orm import DeclarativeBase
|
|
from sqlalchemy.orm import DeclarativeBase
|
|
|
from sqlalchemy.sql import func
|
|
from sqlalchemy.sql import func
|
|
|
|
|
+from sqlalchemy.exc import IntegrityError
|
|
|
|
|
|
|
|
|
|
|
|
|
dotenv.load_dotenv()
|
|
dotenv.load_dotenv()
|
|
@@ -69,15 +70,88 @@ class Task_Assignment(db.Model):
|
|
|
|
|
|
|
|
|
|
|
|
|
@app.route("/")
|
|
@app.route("/")
|
|
|
-def home():
|
|
|
|
|
|
|
+def home(completed=False):
|
|
|
if not session.get("userid"):
|
|
if not session.get("userid"):
|
|
|
return redirect(url_for("login"))
|
|
return redirect(url_for("login"))
|
|
|
|
|
|
|
|
- tasks = db.session.execute(
|
|
|
|
|
- db.select(Task).where(Task.deleted == False)
|
|
|
|
|
- ).scalars()
|
|
|
|
|
|
|
+ select = (
|
|
|
|
|
+ db.select(Task)
|
|
|
|
|
+ .where(Task.deleted == False)
|
|
|
|
|
+ .order_by(Task.created_datetime.desc())
|
|
|
|
|
+ )
|
|
|
|
|
|
|
|
- return render_template("home.html", tasks=tasks)
|
|
|
|
|
|
|
+ if completed:
|
|
|
|
|
+ select = select.where(Task.completed == True)
|
|
|
|
|
+ else:
|
|
|
|
|
+ select = select.where(Task.completed == False)
|
|
|
|
|
+
|
|
|
|
|
+ tasks = db.session.execute(select).scalars().all()
|
|
|
|
|
+
|
|
|
|
|
+ for task in tasks:
|
|
|
|
|
+ task.assignees = ""
|
|
|
|
|
+
|
|
|
|
|
+ assignees = (
|
|
|
|
|
+ db.session.execute(
|
|
|
|
|
+ db.select(User)
|
|
|
|
|
+ .join(Task_Assignment)
|
|
|
|
|
+ .where(Task_Assignment.task_id == task.id)
|
|
|
|
|
+ )
|
|
|
|
|
+ .scalars()
|
|
|
|
|
+ .all()
|
|
|
|
|
+ )
|
|
|
|
|
+
|
|
|
|
|
+ for assignee in assignees:
|
|
|
|
|
+ task.assignees += assignee.username + ", "
|
|
|
|
|
+ task.assignees = task.assignees[:-2]
|
|
|
|
|
+
|
|
|
|
|
+ users = db.session.execute(db.select(User)).scalars().all()
|
|
|
|
|
+
|
|
|
|
|
+ return render_template(
|
|
|
|
|
+ "home.html", tasks=tasks, completed=completed, users=users
|
|
|
|
|
+ )
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
[email protected]("/completed")
|
|
|
|
|
+def completed():
|
|
|
|
|
+ return home(completed=True)
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
[email protected]("/account", methods=["GET", "POST"])
|
|
|
|
|
+def account():
|
|
|
|
|
+ if not session.get("userid"):
|
|
|
|
|
+ return redirect(url_for("login"))
|
|
|
|
|
+
|
|
|
|
|
+ user = db.session.execute(
|
|
|
|
|
+ db.select(User).where(User.id == session.get("userid"))
|
|
|
|
|
+ ).scalar_one_or_none()
|
|
|
|
|
+
|
|
|
|
|
+ if not user:
|
|
|
|
|
+ return redirect(url_for("login"))
|
|
|
|
|
+
|
|
|
|
|
+ if request.method == "POST":
|
|
|
|
|
+ if newpassword := request.form.get("newpassword"):
|
|
|
|
|
+ if not bcrypt.checkpw(
|
|
|
|
|
+ request.form.get("oldpassword").encode(), user.passhash.encode()
|
|
|
|
|
+ ):
|
|
|
|
|
+ flash("Incorrect Password", category="warning")
|
|
|
|
|
+ return redirect(url_for("account"))
|
|
|
|
|
+
|
|
|
|
|
+ salt = bcrypt.gensalt()
|
|
|
|
|
+ user.passhash = bcrypt.hashpw(newpassword.encode(), salt)
|
|
|
|
|
+ db.session.commit()
|
|
|
|
|
+ flash("Updated Password", category="success")
|
|
|
|
|
+ return redirect(url_for("account"))
|
|
|
|
|
+
|
|
|
|
|
+ if username := request.form.get("username"):
|
|
|
|
|
+ user.username = username
|
|
|
|
|
+ db.session.commit()
|
|
|
|
|
+ flash("Updated Username", category="success")
|
|
|
|
|
+ return redirect(url_for("account"))
|
|
|
|
|
+
|
|
|
|
|
+ flash("Failed to update", category="warning")
|
|
|
|
|
+ return redirect(url_for("account"))
|
|
|
|
|
+
|
|
|
|
|
+ return render_template("account.html", user=user)
|
|
|
|
|
|
|
|
|
|
|
|
|
@app.route("/login", methods=["GET", "POST"])
|
|
@app.route("/login", methods=["GET", "POST"])
|
|
@@ -109,7 +183,7 @@ def login():
|
|
|
flash("Failed to login", category="warning")
|
|
flash("Failed to login", category="warning")
|
|
|
return redirect(url_for("login"))
|
|
return redirect(url_for("login"))
|
|
|
except:
|
|
except:
|
|
|
- flash("Critical Error, contact Peter pls", category="error")
|
|
|
|
|
|
|
+ flash("Critical Error, contact Peter pls", category="danger")
|
|
|
return redirect(url_for("login"))
|
|
return redirect(url_for("login"))
|
|
|
|
|
|
|
|
return render_template("login.html")
|
|
return render_template("login.html")
|
|
@@ -117,6 +191,8 @@ def login():
|
|
|
|
|
|
|
|
@app.route("/addtask", methods=["POST"])
|
|
@app.route("/addtask", methods=["POST"])
|
|
|
def addtask():
|
|
def addtask():
|
|
|
|
|
+ if not session.get("userid"):
|
|
|
|
|
+ return redirect(url_for("login"))
|
|
|
try:
|
|
try:
|
|
|
tasktext = request.form.get("task-text")
|
|
tasktext = request.form.get("task-text")
|
|
|
user_id = session.get("userid")
|
|
user_id = session.get("userid")
|
|
@@ -132,7 +208,7 @@ def addtask():
|
|
|
db.session.add(newtask)
|
|
db.session.add(newtask)
|
|
|
db.session.commit()
|
|
db.session.commit()
|
|
|
except:
|
|
except:
|
|
|
- flash("Critical Error, contact Peter pls", category="error")
|
|
|
|
|
|
|
+ flash("Critical Error, contact Peter pls", category="danger")
|
|
|
return redirect(url_for("home"))
|
|
return redirect(url_for("home"))
|
|
|
|
|
|
|
|
return redirect(url_for("home"))
|
|
return redirect(url_for("home"))
|
|
@@ -140,6 +216,8 @@ def addtask():
|
|
|
|
|
|
|
|
@app.route("/updatetask", methods=["POST"])
|
|
@app.route("/updatetask", methods=["POST"])
|
|
|
def updatetask():
|
|
def updatetask():
|
|
|
|
|
+ if not session.get("userid"):
|
|
|
|
|
+ return redirect(url_for("login"))
|
|
|
if "task-id" not in request.form:
|
|
if "task-id" not in request.form:
|
|
|
flash("Failed to find task", category="warning")
|
|
flash("Failed to find task", category="warning")
|
|
|
return redirect(url_for("home"))
|
|
return redirect(url_for("home"))
|
|
@@ -153,18 +231,61 @@ def updatetask():
|
|
|
return redirect(url_for("home"))
|
|
return redirect(url_for("home"))
|
|
|
|
|
|
|
|
if "due" in request.form:
|
|
if "due" in request.form:
|
|
|
- if not task.due:
|
|
|
|
|
|
|
+ due = request.form.get("due")
|
|
|
|
|
+ if not due:
|
|
|
flash("Invalid due date", category="warning")
|
|
flash("Invalid due date", category="warning")
|
|
|
return redirect(url_for("home"))
|
|
return redirect(url_for("home"))
|
|
|
|
|
|
|
|
- datetime_str = request.form.get("due")
|
|
|
|
|
|
|
+ datetime_str = due
|
|
|
datetime_str = datetime_str.replace("T", " ")
|
|
datetime_str = datetime_str.replace("T", " ")
|
|
|
datetime_str += ":00"
|
|
datetime_str += ":00"
|
|
|
|
|
+ app.logger.info(datetime_str)
|
|
|
task.due = datetime_str
|
|
task.due = datetime_str
|
|
|
|
|
|
|
|
|
|
+ if "assignee" in request.form:
|
|
|
|
|
+ assignee = request.form.get("assignee")
|
|
|
|
|
+ if not assignee:
|
|
|
|
|
+ flash("Invalid assignee", category="warning")
|
|
|
|
|
+ return redirect(url_for("home"))
|
|
|
|
|
+
|
|
|
|
|
+ assignment = Task_Assignment(user_id=assignee, task_id=task.id)
|
|
|
|
|
+ db.session.add(assignment)
|
|
|
|
|
+
|
|
|
|
|
+ if "completed" in request.form:
|
|
|
|
|
+ task.completed = not task.completed
|
|
|
|
|
+
|
|
|
|
|
+ try:
|
|
|
db.session.commit()
|
|
db.session.commit()
|
|
|
|
|
+ except IntegrityError as e:
|
|
|
|
|
+ flash("Database error, what did you just try to do?", category="danger")
|
|
|
|
|
+
|
|
|
|
|
+ return redirect(url_for("home"))
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
[email protected]("/admin", methods=["GET", "POST"])
|
|
|
|
|
+def admin():
|
|
|
|
|
+ if not session.get("userid"):
|
|
|
|
|
+ return redirect(url_for("login"))
|
|
|
|
|
+ user = db.session.execute(
|
|
|
|
|
+ db.select(User).where(User.id == session.get("userid"))
|
|
|
|
|
+ ).scalar_one_or_none()
|
|
|
|
|
+ if not user or not user.is_admin:
|
|
|
|
|
+ flash("You are not an admin!", category="danger")
|
|
|
return redirect(url_for("home"))
|
|
return redirect(url_for("home"))
|
|
|
|
|
|
|
|
|
|
+ if request.method == "POST":
|
|
|
|
|
+ if userid := request.form.get("userid-reset"):
|
|
|
|
|
+ resetuser = db.session.execute(
|
|
|
|
|
+ db.select(User).where(User.id == userid)
|
|
|
|
|
+ ).scalar_one_or_none()
|
|
|
|
|
+ resetuser.passhash = None
|
|
|
|
|
+ db.session.commit()
|
|
|
|
|
+ flash("Reset user's password succesfully", category="success")
|
|
|
|
|
+ return redirect(url_for("admin"))
|
|
|
|
|
+
|
|
|
|
|
+ users = db.session.execute(db.select(User)).scalars().all()
|
|
|
|
|
+ return render_template("admin.html", users=users)
|
|
|
|
|
+
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
if __name__ == "__main__":
|
|
|
app.run(host="0.0.0.0", debug=True)
|
|
app.run(host="0.0.0.0", debug=True)
|