/
app.py
134 lines (115 loc) · 5.56 KB
/
app.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
from flask import Flask, render_template, request, redirect, url_for, flash
import mongo as mongo
import view_model as view_model
import dotenv
from flask_login import login_required, login_user, current_user
import login_manager as login_manager
from oauthlib.oauth2 import WebApplicationClient
import os
import requests
import json
from user import User
from flask_config import Config
from loggly.handlers import HTTPSHandler
from logging import Formatter
def create_app():
app = Flask(__name__)
app.config.from_object(Config())
app.config['LOGIN_DISABLED'] = os.environ.get('LOAD_DISABLED', 'False').lower() in ['true', '1']
app.config['LOG_LEVEL'] = os.environ.get('LOG_LEVEL')
app.logger.setLevel(app.config['LOG_LEVEL'])
app.config['LOGGLY_TOKEN'] = os.environ.get('LOGGLY_TOKEN')
if app.config['LOGGLY_TOKEN'] is not None:
handler = HTTPSHandler(f'https://logs-01.loggly.com/inputs/{app.config["LOGGLY_TOKEN"]}/tag/todo-app')
handler.setFormatter(Formatter("[%(asctime)s] %(levelname)s in %(module)s: %(message)s"))
app.logger.addHandler(handler)
login_manager.login_manager.init_app(app)
@app.route('/', methods=['Get'])
@login_required
def index():
items = mongo.fetch_all_items()
items.sort(key=lambda k: k.status, reverse=True)
item_view_model = view_model.ViewModel(items)
if current_user.is_active == True:
if current_user.role == 'writer':
return render_template('index_writer.html', view_model=item_view_model)
elif current_user.role == 'reader':
return render_template('index_reader.html', view_model=item_view_model)
else:
return render_template('index_writer.html', view_model=item_view_model)
else:
return render_template('index_writer.html', view_model=item_view_model)
@app.route('/add', methods=['Post'])
@login_required
def add_todo():
if current_user.is_active == True:
if current_user.role == 'writer' or current_user.role == 'admin':
mongo.create_new_item(request.form.get('title'))
app.logger.info("User %s added Todo item '%s'", current_user.name, request.form.get('title'))
return redirect('/')
else :
flash('You do not have access. Please contact an admin')
app.logger.info("User %s attempted to add Todo item, incorrect permissions", current_user.name)
return redirect('/')
else:
mongo.create_new_item(request.form.get('title'))
return redirect('/')
@app.route('/doing_item/<todo_id>', methods=['Post'])
@login_required
def update_status_doing(todo_id):
mongo.update_item_doing(todo_id)
if current_user.is_active:
app.logger.info("User %s set Todo item Id '%s' to 'Doing'", current_user.name, todo_id)
return redirect('/')
@app.route('/done_item/<todo_id>', methods=['Post'])
@login_required
def update_status_done(todo_id):
mongo.update_item_done(todo_id)
if current_user.is_active:
app.logger.info("User %s set Todo item Id '%s' to 'Done'", current_user.name, todo_id)
return redirect('/')
@app.route('/delete/<todo_id>', methods=['Post'])
@login_required
def remove_item(todo_id):
mongo.delete_item(todo_id)
if current_user.is_active:
app.logger.info("User %s deleted Todo item Id '%s'", current_user.name, todo_id)
return redirect('/')
@app.route('/login/callback')
def login_callback():
callback_code = request.args.get("code")
github_client = WebApplicationClient(os.environ.get('clientId'))
github_token = github_client.prepare_token_request("https://github.com/login/oauth/access_token", code=callback_code)
github_access = requests.post(github_token[0], headers=github_token[1], data=github_token[2], auth=(os.environ.get('clientId'), os.environ.get('client_secret')))
github_json = github_client.parse_request_body_response(github_access.text)
github_user_request_param = github_client.add_token("https://api.github.com/user")
github_user = requests.get(github_user_request_param[0], headers=github_user_request_param[1]).json()
login_user(User(github_user))
mongo.add_user_mongo(current_user)
app.logger.info("User '%s' logged in successfully", current_user.name)
return redirect('/')
@app.route('/users', methods=['Get'])
@login_required
def users():
if current_user.role == 'admin':
users = mongo.fetch_all_users()
return render_template('index_users.html', users=users)
else:
flash('You do not have access. Please contact an admin')
app.logger.info("User %s attempted to view Users page, incorrect permissions", current_user.name)
return redirect('/')
@app.route('/users/make_admin/<userid>', methods=['Post'])
@login_required
def make_admin(userid):
mongo.make_admin(userid)
app.logger.info("User %s changed permission level of User Id '%s' to Admin", current_user.name, userid)
return redirect('/users')
@app.route('/users/make_reader/<userid>', methods=['Post'])
@login_required
def make_reader(userid):
mongo.make_reader(userid)
app.logger.info("User %s changed permission level of User Id '%s' to Reader", current_user.name, userid)
return redirect('/users')
if __name__ == '__main__':
app.run()
return app