Skip to content
Snippets Groups Projects
Commit e442a4f0 authored by Tobias Ullerich's avatar Tobias Ullerich
Browse files

Fixed #41 - Add option to hide roadmap

parent 49e9622e
No related branches found
No related tags found
1 merge request!1Fixed #41 - Add option to hide roadmap
from enum import Enum
from flask import Blueprint, jsonify, request
from flask_jwt_extended import jwt_required
from flask_jwt_extended import jwt_required, jwt_optional, get_jwt_identity
from logic.DateFormatter import DateFormatter
from logic.RequestValidator import RequestValidator, ValidationError
......@@ -10,24 +10,41 @@ from logic.RequestValidator import RequestValidator, ValidationError
class RoadmapParameters(Enum):
ID = 'ID'
PROJECT_NAME = 'Projectname'
HIDDEN = 'Hidden'
def construct_blueprint(database):
roadmap_api = Blueprint('roadmap_api', __name__)
@roadmap_api.route('/roadmaps', methods=['GET'])
def get_roadmaps():
@jwt_optional
def get_visible_roadmaps():
user = get_jwt_identity()
if user is not None:
return jsonify(database.get_roadmaps())
else:
return jsonify(database.get_visible_roadmaps())
@roadmap_api.route('/roadmap/<int:roadmapID>', methods=['GET'])
@jwt_optional
def get_roadmap(roadmapID):
return jsonify(database.get_roadmap(roadmapID))
roadmap = database.get_roadmap(roadmapID)
user = get_jwt_identity()
if roadmap['Hidden'] and user is None:
return jsonify({'success': False, 'msg': 'A roadmap with this id not exists'}), 404
return jsonify(roadmap)
@roadmap_api.route('/roadmap/<int:roadmapID>/full', methods=['GET'])
@jwt_optional
def get_roadmap_full(roadmapID):
roadmap = database.get_roadmap(roadmapID)
roadmap['milestones'] = database.get_milestones(roadmapID)
user = get_jwt_identity()
if roadmap['Hidden'] and user is None:
return jsonify({'success': False, 'msg': 'A roadmap with this id not exists'}), 404
numberOfOpenMilestones = 0
for milestone in roadmap['milestones']:
milestone['DueDate'] = DateFormatter.format(milestone['DueDate'])
......@@ -82,8 +99,11 @@ def construct_blueprint(database):
@jwt_required
def update_roadmap():
try:
parameters = RequestValidator.validate(request,
[RoadmapParameters.ID.value, RoadmapParameters.PROJECT_NAME.value])
parameters = RequestValidator.validate(request, [
RoadmapParameters.ID.value,
RoadmapParameters.PROJECT_NAME.value,
RoadmapParameters.HIDDEN.value
])
except ValidationError as e:
return e.response, 400
......@@ -91,11 +111,9 @@ def construct_blueprint(database):
if not __roadmaps_exists(roadmapID):
return jsonify({'success': False, 'msg': "No roadmap with ID '{}' existing".format(roadmapID)}), 400
if __name_already_used(parameters[RoadmapParameters.PROJECT_NAME.value]):
return jsonify({'success': False, 'msg': 'A roadmap with this name already exists'}), 400
database.update_roadmap(parameters[RoadmapParameters.ID.value],
parameters[RoadmapParameters.PROJECT_NAME.value])
parameters[RoadmapParameters.PROJECT_NAME.value],
parameters[RoadmapParameters.HIDDEN.value])
return jsonify({'success': True})
def __roadmaps_exists(roadmapID):
......
......@@ -71,6 +71,7 @@ class Database:
f'("{RoadmapParameters.ID.value}" int4 NOT NULL DEFAULT ' \
f'nextval(\'"roadmaps_ID_seq"\'::regclass),' \
f'"{RoadmapParameters.PROJECT_NAME.value}" text NOT NULL, ' \
f'"{RoadmapParameters.HIDDEN.value}" boolean NOT NULL DEFAULT false, ' \
f'PRIMARY KEY ("{RoadmapParameters.ID.value}"));'
self.__query(queryTable, fetch_type=FetchType.NONE)
......@@ -124,6 +125,10 @@ class Database:
query = f'SELECT * FROM roadmaps ORDER BY "{RoadmapParameters.ID.value}";'
return self.__query(query)
def get_visible_roadmaps(self):
query = f'SELECT * FROM roadmaps WHERE "{RoadmapParameters.HIDDEN.value}"=FALSE ORDER BY "{RoadmapParameters.ID.value}";'
return self.__query(query)
def get_roadmap(self, roadmapID):
query = f'SELECT * FROM roadmaps WHERE "{RoadmapParameters.ID.value}"=%s;'
return self.__query(query, roadmapID, fetch_type=FetchType.ONE)
......@@ -132,9 +137,9 @@ class Database:
query = f'INSERT INTO roadmaps ("{RoadmapParameters.PROJECT_NAME.value}") VALUES (%s);'
self.__query(query, name, fetch_type=FetchType.NONE)
def update_roadmap(self, roadmapID, name):
query = f'UPDATE roadmaps SET "{RoadmapParameters.PROJECT_NAME.value}"=%s WHERE "{RoadmapParameters.ID.value}"=%s;'
self.__query(query, name, roadmapID, fetch_type=FetchType.NONE)
def update_roadmap(self, roadmapID, name, hidden):
query = f'UPDATE roadmaps SET "{RoadmapParameters.PROJECT_NAME.value}"=%s, "{RoadmapParameters.HIDDEN.value}"=%s WHERE "{RoadmapParameters.ID.value}"=%s;'
self.__query(query, name, hidden, roadmapID, fetch_type=FetchType.NONE)
def delete_roadmap(self, roadmapID):
query = f'DELETE FROM roadmaps WHERE "{RoadmapParameters.ID.value}"=%s;'
......
......@@ -64,7 +64,11 @@ class RoadmapClient(FlaskBaseApp):
if roadmapID < 1:
return False, render_template('error.html', message=LOCALIZATION['error_param_invalid'])
roadmap = requests.get(urlBuilder.build_url('roadmap', roadmapID, 'full')).json()
response = requests.get(urlBuilder.build_url('roadmap', roadmapID, 'full'))
if response.status_code != 200:
return False, render_template('error.html', message=LOCALIZATION['error_roadmap_not_existing'])
roadmap = response.json()
if roadmap is None:
return False, render_template('error.html', message=LOCALIZATION['error_roadmap_not_existing'])
......
......@@ -12,7 +12,8 @@ def construct_blueprint(urlBuilder):
@roadmaps.route('/admin/roadmaps/overview', methods=['GET'])
@require_api_token
def overview():
roadmaps = requests.get(urlBuilder.build_url('roadmaps')).json()
_, roadmaps = ApiRequest.send_api_request(urlBuilder.build_url('roadmaps'), requests.get, {}, [])
print(roadmaps)
return render_template('admin/roadmaps/overview.html', roadmaps=roadmaps)
@roadmaps.route('/admin/roadmaps/add', methods=['GET'])
......@@ -39,7 +40,7 @@ def construct_blueprint(urlBuilder):
if not ID or int(ID) < 0:
return render_template('error.html', message=LOCALIZATION['error_param_invalid'])
roadmap = requests.get(urlBuilder.build_url('roadmap', ID)).json()
_, roadmap = ApiRequest.send_api_request(urlBuilder.build_url('roadmap', ID), requests.get, {}, [])
return render_template('admin/roadmaps/edit.html',
title='Edit Roadmap',
roadmap=roadmap,
......@@ -49,8 +50,8 @@ def construct_blueprint(urlBuilder):
@require_api_token
def edit_post():
success, response = ApiRequest.send_api_request(urlBuilder.build_url('roadmap'),
requests.post, request.form,
[('ID', int), ('Projectname', str)])
requests.put, request.form,
[('ID', int), ('Projectname', str), ('Hidden', bool)])
if not success:
return response
......
......@@ -19,11 +19,21 @@
<label for="project-name">Project Name</label>
</div>
</div>
<div class="col s12 m8 offset-m2 l6 offset-l3">
<div class="input-field col s12">
<p>
<label>
<input id="Hidden" name="Hidden" type="checkbox"
{% if roadmap and roadmap["Hidden"] %} checked="checked" {% endif %}/>
<span>Hidden</span>
</label>
</p>
</div>
</div>
<div class="row center-align margin-top">
<div class="col s12 m8 offset-m2 l6 offset-l3">
<a class="waves-effect waves-light btn blue darken-3" href="{{ url_for("admin_roadmaps.overview") }}"><i class="material-icons left">arrow_back</i>Back</a>
<button class="bwaves-effect waves-light btn blue darken-3 margin-left" type="submit" name="action">
<button class="waves-effect waves-light btn blue darken-3 margin-left" type="submit" name="action">
<i class="material-icons left">save</i>Save
</button>
</div>
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment