Izmenjen templates folder tako da bude modularniji #4
@ -8,18 +8,17 @@ CONFIG_PATH = "/var/taskmanager/taskmanager/config.ini"
|
|||||||
|
|
||||||
config = configparser.ConfigParser()
|
config = configparser.ConfigParser()
|
||||||
config.read(CONFIG_PATH)
|
config.read(CONFIG_PATH)
|
||||||
|
|
||||||
ADMINPASS = config.get('credentials', 'ADMINPASS')
|
ADMINPASS = config.get('credentials', 'ADMINPASS')
|
||||||
|
|
||||||
@app.route('/', methods=['GET'])
|
@app.route('/', methods=['GET'])
|
||||||
def index():
|
def index():
|
||||||
tasks = Task.query.all()
|
tasks = Task.query.all()
|
||||||
return render_template('index.html', tasks = tasks)
|
return render_template('pages/index.html', tasks = tasks)
|
||||||
|
|
||||||
@app.route('/addtask', methods=['GET','POST'])
|
@app.route('/addtask', methods=['GET','POST'])
|
||||||
def addtask():
|
def addtask():
|
||||||
if request.method == 'GET':
|
if request.method == 'GET':
|
||||||
return render_template('addtask.html')
|
return render_template('pages/addtask.html')
|
||||||
elif request.method == 'POST':
|
elif request.method == 'POST':
|
||||||
taskname = request.form['taskname']
|
taskname = request.form['taskname']
|
||||||
taskdesc = request.form['taskdesc']
|
taskdesc = request.form['taskdesc']
|
||||||
@ -27,9 +26,9 @@ def addtask():
|
|||||||
# Input sanitation
|
# Input sanitation
|
||||||
# Task name
|
# Task name
|
||||||
if not taskname.isprintable():
|
if not taskname.isprintable():
|
||||||
return render_template('response.html', response = "Task name has to be made only of letters or numbers.")
|
return render_template('pages/response.html', response = "Task name has to be made only of letters or numbers.")
|
||||||
if len(taskname) < 1 or len(taskname) > 40:
|
if len(taskname) < 1 or len(taskname) > 40:
|
||||||
return render_template('response.html', response = "Task name lenght invalid, only smaller then 40 charachters allowed")
|
return render_template('pages/response.html', response = "Task name lenght invalid, only smaller then 40 charachters allowed")
|
||||||
|
|
||||||
# Username
|
# Username
|
||||||
if username == "":
|
if username == "":
|
||||||
@ -38,28 +37,28 @@ def addtask():
|
|||||||
try:
|
try:
|
||||||
creatorid = User.query.filter_by(username = username).first().id
|
creatorid = User.query.filter_by(username = username).first().id
|
||||||
except:
|
except:
|
||||||
return render_template('response.html', response = 'No user with this username. Please register')
|
return render_template('pages/response.html', response = 'No user with this username. Please register')
|
||||||
if creatorid is None:
|
if creatorid is None:
|
||||||
return render_template('response.html', response = 'No user with this username. Please register.')
|
return render_template('pages/response.html', response = 'No user with this username. Please register.')
|
||||||
|
|
||||||
# Task descripton
|
# Task descripton
|
||||||
if taskdesc != '':
|
if taskdesc != '':
|
||||||
if not taskdesc.isprintable():
|
if not taskdesc.isprintable():
|
||||||
return render_template('response.html', response = "Task description has to be made of printable characters.")
|
return render_template('pages/response.html', response = "Task description has to be made of printable characters.")
|
||||||
if len(taskdesc) > 2000:
|
if len(taskdesc) > 2000:
|
||||||
return render_template('response.html', response = "Task description lenght invalid, only smaller then 2000 charachters allowed")
|
return render_template('pages/response.html', response = "Task description lenght invalid, only smaller then 2000 charachters allowed")
|
||||||
sqladdtask = Task(name = taskname, desc = taskdesc, creatorid = creatorid)
|
sqladdtask = Task(name = taskname, desc = taskdesc, creatorid = creatorid)
|
||||||
try:
|
try:
|
||||||
db.session.add(sqladdtask)
|
db.session.add(sqladdtask)
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
return render_template('response.html', response = 'Task added')
|
return render_template('pages/response.html', response = 'Task added')
|
||||||
except:
|
except:
|
||||||
return render_template('response.html', response = 'Adding task failed')
|
return render_template('pages/response.html', response = 'Adding task failed')
|
||||||
|
|
||||||
@app.route('/register', methods=['POST', 'GET'])
|
@app.route('/register', methods=['POST', 'GET'])
|
||||||
def register():
|
def register():
|
||||||
if request.method == 'GET':
|
if request.method == 'GET':
|
||||||
return render_template('register.html')
|
return render_template('pages/register.html')
|
||||||
elif request.method == 'POST':
|
elif request.method == 'POST':
|
||||||
username = request.form['username']
|
username = request.form['username']
|
||||||
contact = request.form['contact']
|
contact = request.form['contact']
|
||||||
@ -67,34 +66,34 @@ def register():
|
|||||||
|
|
||||||
# Username
|
# Username
|
||||||
if not username.isalnum():
|
if not username.isalnum():
|
||||||
return render_template('response.html', response = "Username has to be made only of letters or numbers.")
|
return render_template('pages/response.html', response = "Username has to be made only of letters or numbers.")
|
||||||
if len(username) < 1 or len(username) > 40:
|
if len(username) < 1 or len(username) > 40:
|
||||||
return render_template('response.html', response = "Username lenght invalid, only smaller then 40 charachters allowed")
|
return render_template('pages/response.html', response = "Username lenght invalid, only smaller then 40 charachters allowed")
|
||||||
|
|
||||||
# Contact
|
# Contact
|
||||||
if contact != '':
|
if contact != '':
|
||||||
if not contact.isprintable():
|
if not contact.isprintable():
|
||||||
return render_template('response.html', response = "Contact information has to be made of printable characters.")
|
return render_template('pages/response.html', response = "Contact information has to be made of printable characters.")
|
||||||
if len(contact) > 100:
|
if len(contact) > 100:
|
||||||
return render_template('response.html', response = "Contact lenght invalid, only smaller then 100 charachters allowed")
|
return render_template('pages/response.html', response = "Contact lenght invalid, only smaller then 100 charachters allowed")
|
||||||
|
|
||||||
# Password
|
# Password
|
||||||
if password != '':
|
if password != '':
|
||||||
if not password.isprintable():
|
if not password.isprintable():
|
||||||
return render_template('response.html', response = "Password has to be made of printable characters.")
|
return render_template('pages/response.html', response = "Password has to be made of printable characters.")
|
||||||
if len(password) > 500:
|
if len(password) > 500:
|
||||||
return render_template('response.html', response = "Password lenght invalid, only smaller then 500 charachters allowed")
|
return render_template('pages/response.html', response = "Password lenght invalid, only smaller then 500 charachters allowed")
|
||||||
|
|
||||||
sqladduser = User(username = username, contact = contact, password = password)
|
sqladduser = User(username = username, contact = contact, password = password)
|
||||||
try:
|
try:
|
||||||
db.session.add(sqladduser)
|
db.session.add(sqladduser)
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
return render_template('response.html', response = 'User added')
|
return render_template('pages/response.html', response = 'User added')
|
||||||
except:
|
except:
|
||||||
return render_template('response.html', response = 'Adding user failed')
|
return render_template('pages/response.html', response = 'Adding user failed')
|
||||||
|
|
||||||
else:
|
else:
|
||||||
return render_template('response.html', response = 'HTTP request method not recogniezed')
|
return render_template('pages/response.html', response = 'HTTP request method not recogniezed')
|
||||||
|
|
||||||
|
|
||||||
@app.route('/projects/<int:task_id>', methods=['GET','POST'])
|
@app.route('/projects/<int:task_id>', methods=['GET','POST'])
|
||||||
@ -102,40 +101,40 @@ def project(task_id:int):
|
|||||||
try:
|
try:
|
||||||
task = Task.query.get(task_id)
|
task = Task.query.get(task_id)
|
||||||
except:
|
except:
|
||||||
return render_template('response.html', response = 'Task not found, bad URL')
|
return render_template('pages/response.html', response = 'Task not found, bad URL')
|
||||||
if task is None:
|
if task is None:
|
||||||
return render_template('response.html', response = 'Task not found, bad URL')
|
return render_template('pages/response.html', response = 'Task not found, bad URL')
|
||||||
users = gettaskusers(task_id)
|
users = gettaskusers(task_id)
|
||||||
if request.method == 'GET':
|
if request.method == 'GET':
|
||||||
return render_template("project.html", task = task, users = users)
|
return render_template("pages/project.html", task = task, users = users)
|
||||||
elif request.method == 'POST':
|
elif request.method == 'POST':
|
||||||
# Assigning user to task
|
# Assigning user to task
|
||||||
username = request.form['username']
|
username = request.form['username']
|
||||||
for user in users:
|
for user in users:
|
||||||
if username == user.username:
|
if username == user.username:
|
||||||
return render_template('response.html', response = 'User already added to task')
|
return render_template('pages/response.html', response = 'User already added to task')
|
||||||
try:
|
try:
|
||||||
userid = User.query.filter_by(username = username).first().id
|
userid = User.query.filter_by(username = username).first().id
|
||||||
except:
|
except:
|
||||||
return render_template('response.html', response = 'User not found, please register.')
|
return render_template('pages/response.html', response = 'User not found, please register.')
|
||||||
if userid is None:
|
if userid is None:
|
||||||
return render_template('response.html', response = 'User not found, please register.')
|
return render_template('pages/response.html', response = 'User not found, please register.')
|
||||||
sqladduser = TaskUser(userid = userid, taskid = task_id)
|
sqladduser = TaskUser(userid = userid, taskid = task_id)
|
||||||
try:
|
try:
|
||||||
db.session.add(sqladduser)
|
db.session.add(sqladduser)
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
return render_template('response.html', response = 'User added')
|
return render_template('pages/response.html', response = 'User added')
|
||||||
except:
|
except:
|
||||||
return render_template('response.html', response = 'Adding user failed')
|
return render_template('pages/response.html', response = 'Adding user failed')
|
||||||
|
|
||||||
@app.route('/projects/<int:task_id>/del', methods=['GET','POST'])
|
@app.route('/projects/<int:task_id>/del', methods=['GET','POST'])
|
||||||
def deltask(task_id:int):
|
def deltask(task_id:int):
|
||||||
try:
|
try:
|
||||||
task = Task.query.get(task_id)
|
task = Task.query.get(task_id)
|
||||||
except:
|
except:
|
||||||
return render_template('response.html', response = 'Task not found, bad URL')
|
return render_template('pages/response.html', response = 'Task not found, bad URL')
|
||||||
if task is None:
|
if task is None:
|
||||||
return render_template('response.html', response = 'Task not found, bad URL')
|
return render_template('pages/response.html', response = 'Task not found, bad URL')
|
||||||
try:
|
try:
|
||||||
taskusers = TaskUser.query.filter_by(taskid = task_id).all()
|
taskusers = TaskUser.query.filter_by(taskid = task_id).all()
|
||||||
except:
|
except:
|
||||||
@ -147,35 +146,35 @@ def deltask(task_id:int):
|
|||||||
db.session.delete(task)
|
db.session.delete(task)
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
except:
|
except:
|
||||||
return render_template('response.html', response = 'Deleting task failed')
|
return render_template('pages/response.html', response = 'Deleting task failed')
|
||||||
try:
|
try:
|
||||||
if taskusers != None:
|
if taskusers != None:
|
||||||
for taskuser in taskusers:
|
for taskuser in taskusers:
|
||||||
db.session.delete(taskuser)
|
db.session.delete(taskuser)
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
except:
|
except:
|
||||||
return render_template('response.html', response = 'Deleting user assignment to task failed')
|
return render_template('pages/response.html', response = 'Deleting user assignment to task failed')
|
||||||
return render_template('response.html', response = 'Task deleted')
|
return render_template('pages/response.html', response = 'Task deleted')
|
||||||
else:
|
else:
|
||||||
return render_template('deltask.html', task = task)
|
return render_template('pages/deltask.html', task = task)
|
||||||
if request.method == 'POST':
|
if request.method == 'POST':
|
||||||
password = request.form['password']
|
password = request.form['password']
|
||||||
if len(password) < 1 or len(password) > 500:
|
if len(password) < 1 or len(password) > 500:
|
||||||
return render_template('response.html', response = "Password lenght invalid, only smaller then 500 charachters allowed")
|
return render_template('pages/response.html', response = "Password lenght invalid, only smaller then 500 charachters allowed")
|
||||||
# Check password
|
# Check password
|
||||||
if password != ADMINPASS and password != User.query.get(creatorid).password:
|
if password != ADMINPASS and password != User.query.get(creatorid).password:
|
||||||
return render_template('response.html', response = 'Wrong password')
|
return render_template('pages/response.html', response = 'Wrong password')
|
||||||
# Delete task
|
# Delete task
|
||||||
try:
|
try:
|
||||||
db.session.delete(task)
|
db.session.delete(task)
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
except:
|
except:
|
||||||
return render_template('response.html', response = 'Deleting task failed')
|
return render_template('pages/response.html', response = 'Deleting task failed')
|
||||||
try:
|
try:
|
||||||
if taskusers != None:
|
if taskusers != None:
|
||||||
for taskuser in taskusers:
|
for taskuser in taskusers:
|
||||||
db.session.delete(taskuser)
|
db.session.delete(taskuser)
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
except:
|
except:
|
||||||
return render_template('response.html', response = 'Deleting user assignment to task failed')
|
return render_template('pages/response.html', response = 'Deleting user assignment to task failed')
|
||||||
return render_template('response.html', response = 'Task deleted')
|
return render_template('pages/response.html', response = 'Task deleted')
|
||||||
|
2
taskmanager/templates/includes/footer.html
Normal file
2
taskmanager/templates/includes/footer.html
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
<footer>
|
||||||
|
</footer>
|
8
taskmanager/templates/includes/header.html
Normal file
8
taskmanager/templates/includes/header.html
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
<header>
|
||||||
|
<nav class="container">
|
||||||
|
<ul>
|
||||||
|
<li class="current"><a href="/">Home</a></li>
|
||||||
|
<li><a href="/register">Register</a></li>
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
</header>
|
31
taskmanager/templates/includes/index.html
Normal file
31
taskmanager/templates/includes/index.html
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
{% extends "layouts/base.html" %}
|
||||||
|
{% block content %}
|
||||||
|
<header>
|
||||||
|
<nav class="container">
|
||||||
|
<ul>
|
||||||
|
<li class="current"><a href="/">Home</a></li>
|
||||||
|
<li><a href="/register">Register</a></li>
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
</header>
|
||||||
|
<main class="container page page-index">
|
||||||
|
<section>
|
||||||
|
<div class="btn">
|
||||||
|
<a href="/addtask">Add new task</a>
|
||||||
|
</div>
|
||||||
|
<div class="tasks-wrap">
|
||||||
|
<h1>Tasks</h1>
|
||||||
|
{% for task in tasks %}
|
||||||
|
<div class="task">
|
||||||
|
<a href="/projects/{{task.id}}">
|
||||||
|
<div>{{task.id}}.</div>
|
||||||
|
<div>{{task.name}}</div>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</main>
|
||||||
|
<footer>
|
||||||
|
</footer>
|
||||||
|
{% endblock content %}
|
15
taskmanager/templates/layouts/base.html
Normal file
15
taskmanager/templates/layouts/base.html
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8" />
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||||
|
<link rel="stylesheet" href="/static/style.css" />
|
||||||
|
<title>Task manager</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
{% include "includes/header.html" %}
|
||||||
|
{% block content %}
|
||||||
|
{% endblock content %}
|
||||||
|
{% include "includes/footer.html" %}
|
||||||
|
</body>
|
||||||
|
</html>
|
25
taskmanager/templates/pages/addtask.html
Normal file
25
taskmanager/templates/pages/addtask.html
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
{% extends "layouts/base.html" %}
|
||||||
|
{% block content %}
|
||||||
|
<main class="container page page-addtask">
|
||||||
|
<h1>Create new task</h1>
|
||||||
|
<div class="form-wrap">
|
||||||
|
<form action="/addtask" method="POST">
|
||||||
|
<div class="form-input">
|
||||||
|
<label for="taskname" class="label">Task name:</label>
|
||||||
|
<input type="text" name="taskname" id="taskname" required />
|
||||||
|
</div>
|
||||||
|
<div class="form-input">
|
||||||
|
<label for="taskdesc" class="label">Description:</label>
|
||||||
|
<input type="text" name="taskdesc" id="taskdesc" placeholder="optional"/>
|
||||||
|
</div>
|
||||||
|
<div class="form-input">
|
||||||
|
<label for="username" class="label">Username:</label>
|
||||||
|
<input type="text" name="username" id="username" placeholder="optional"/>
|
||||||
|
</div>
|
||||||
|
<div class="btn-wrap">
|
||||||
|
<button class="btn">Submit</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</main>
|
||||||
|
{% endblock content %}
|
19
taskmanager/templates/pages/deltask.html
Normal file
19
taskmanager/templates/pages/deltask.html
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
{% extends "layouts/base.html" %}
|
||||||
|
{% block content %}
|
||||||
|
<body>
|
||||||
|
<main class="container page page-addtask">
|
||||||
|
<h1>Create new task</h1>
|
||||||
|
<div class="form-wrap">
|
||||||
|
<form action="/projects/{{task.id}}/del" method="POST">
|
||||||
|
<p> Task creator's password <p>
|
||||||
|
<div class="form-input">
|
||||||
|
<label for="password" class="label">password:</label>
|
||||||
|
<input type="password" name="password" id="password" required />
|
||||||
|
</div>
|
||||||
|
<div class="btn-wrap">
|
||||||
|
<button class="btn">DELETE</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</main>
|
||||||
|
{% endblock content %}
|
21
taskmanager/templates/pages/index.html
Normal file
21
taskmanager/templates/pages/index.html
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
{% extends "layouts/base.html" %}
|
||||||
|
{% block content %}
|
||||||
|
<main class="container page page-index">
|
||||||
|
<section>
|
||||||
|
<div class="btn">
|
||||||
|
<a href="/addtask">Add new task</a>
|
||||||
|
</div>
|
||||||
|
<div class="tasks-wrap">
|
||||||
|
<h1>Tasks</h1>
|
||||||
|
{% for task in tasks %}
|
||||||
|
<div class="task">
|
||||||
|
<a href="/projects/{{task.id}}">
|
||||||
|
<div>{{task.id}}.</div>
|
||||||
|
<div>{{task.name}}</div>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</main>
|
||||||
|
{% endblock content %}
|
36
taskmanager/templates/pages/project.html
Normal file
36
taskmanager/templates/pages/project.html
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
{% extends "layouts/base.html" %}
|
||||||
|
{% block content %}
|
||||||
|
<main class="container page page-project">
|
||||||
|
<section >
|
||||||
|
<h1>{{task.name}}</h1>
|
||||||
|
<label class="label underline">Description</label>
|
||||||
|
<p>{{task.desc}}</p>
|
||||||
|
</section>
|
||||||
|
<section class="section-task">
|
||||||
|
<div>
|
||||||
|
<label class="label underline">Users added to this task</label>
|
||||||
|
{% for user in users %}
|
||||||
|
<div class="user-info-wrap">
|
||||||
|
<div><b>Username:</b> {{user.username}}</div>
|
||||||
|
<div><b>Contact info:</b> {{user.contact}}</div>
|
||||||
|
</div>
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<label class="label underline"> Add person to task</label>
|
||||||
|
<div class="form-wrap">
|
||||||
|
<form action="/projects/{{task.id}}" method="POST">
|
||||||
|
<div class="form-input">
|
||||||
|
<label for="username" class="label">Username:</label>
|
||||||
|
<input type="text" name="username" id="username" required />
|
||||||
|
</div>
|
||||||
|
<div class="btn-wrap">
|
||||||
|
<button class="btn">Submit</button>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
<p><a href="/projects/{{task.id}}/del">DELETE TASK</a><p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</main>
|
||||||
|
{% endblock content %}
|
24
taskmanager/templates/pages/register.html
Normal file
24
taskmanager/templates/pages/register.html
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
{% extends "layouts/base.html" %}
|
||||||
|
{% block content %}
|
||||||
|
<main class="container page page-register">
|
||||||
|
<div class="form-wrap">
|
||||||
|
<form action="/register" method="POST">
|
||||||
|
<div class="form-input">
|
||||||
|
<label for="username">Username:</label>
|
||||||
|
<input type="text" name="username" id="username" required />
|
||||||
|
</div>
|
||||||
|
<div class="form-input">
|
||||||
|
<label for="contact">Contact:</label>
|
||||||
|
<input type="text" name="contact" id="contact" required />
|
||||||
|
</div>
|
||||||
|
<div class="form-input">
|
||||||
|
<label for="password">Password:</label>
|
||||||
|
<input type="password" name="password" placeholder="optional" id="password"/>
|
||||||
|
</div>
|
||||||
|
<div class="btn-wrap">
|
||||||
|
<button class="btn">Submit</button>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</main>
|
||||||
|
{% endblock content %}
|
8
taskmanager/templates/pages/response.html
Normal file
8
taskmanager/templates/pages/response.html
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
{% extends "layouts/base.html" %}
|
||||||
|
{% block content %}
|
||||||
|
<main class="container page page-project">
|
||||||
|
<section >
|
||||||
|
<p>{{response}}<p>
|
||||||
|
</section>
|
||||||
|
</main>
|
||||||
|
{% endblock content %}
|
Loading…
Reference in New Issue
Block a user