-
Notifications
You must be signed in to change notification settings - Fork 0
/
endpoints.py
156 lines (128 loc) · 7.29 KB
/
endpoints.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
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
from flask import Flask, jsonify, request, render_template
from utils import MongoCollection
from dotenv import load_dotenv
import os
app = Flask(__name__)
load_dotenv()
password = os.environ.get("MONGODB_PASSWORD")
DATABASE_URL = f'mongodb+srv://cpschneider98:{password}@sharednamr.nxmopyw.mongodb.net/?retryWrites=false&w=majority'
salaries = MongoCollection(app, collection_name="salaries", connection_str=DATABASE_URL)
common_pivots = ["Regular", "Retro", "Overtime", "Injury", "Other", "Total"]
cabinets = salaries.unique_values(filter={}, field="Cabinet")
departments = salaries.unique_values(filter={}, field="Department")
programs = salaries.unique_values(filter={}, field="Program")
path_root = os.environ.get("PATH_ROOT")
@app.route('/')
def display_all():
sums_by_year = salaries.pivot(filter={}, agg="sum", group_by="Year", pivot_on=common_pivots)
avgs_by_year = salaries.pivot(filter={}, agg="avg", group_by="Year", pivot_on=common_pivots)
injured_employees_by_year = salaries.count_instance_of_field(filter={}, field="Injury", group_by="Year")
employees_by_year = salaries.count_instance_of_field(filter={}, field="Total", group_by="Year")
years = salaries.unique_values(filter={}, field="Year", is_desc=True)
return render_template('index.html' \
, path_root = path_root \
, sums_by_year = sums_by_year \
, avgs_by_year = avgs_by_year \
, injured_employees_by_year = injured_employees_by_year \
, employees_by_year = employees_by_year \
, years = years)
@app.errorhandler(404)
def page_not_found(error):
return render_template('404.html', title = '404'), 404
@app.route('/employee/', methods=['GET'])
def employee_by_name_json():
first = request.args.get('first').upper()
last = request.args.get('last').upper()
docs = salaries.get_documents(filter={'First':first, 'Last':last})
if len(docs) == 0:
return page_not_found(f"No record of employee with name {first} {last}")
return jsonify(docs)
@app.route('/top-n-for-year', methods=['GET'])
def top_n_employees_json():
year = int(request.args.get("forYear", None))
division_type = request.args.get("divisionType", None).title()
division_value = request.args.get("divisionValue", None)
if division_type:
return {"data": salaries.top_n(filter={"$and": [{"Year": year}, {division_type: division_value}]}, sort_on="Total", n=10)}
return {"data": salaries.top_n(filter={"Year": year}, sort_on="Total", n=10)}
@app.route('/salary-histogram', methods=['GET'])
def salary_histogram_json():
year = int(request.args.get("forYear", None))
division_type = request.args.get("divisionType", None).title()
division_value = request.args.get("divisionValue", None)
if division_type:
return {"data": salaries.histogram(filter={"$and": [{"Year": year}, {division_type : division_value}]}, field="Total")}
return {"data" :salaries.histogram(filter={"Year": year}, field="Total")}
@app.route('/division-options', methods=['GET'])
def division_options_json():
selected = request.args.get("selected", None)
if selected == "Program":
return {"options": [k["Department"] + " - " + k["Program"] for k in salaries.unique_dim_pairs("Department", "Program")]}
if selected in ("Department", "Cabinet"):
return {"options":salaries.unique_values(filter={}, field=selected)}
return {"options":[]}
@app.route('/cabinet/<cabinet>', methods=['GET'])
def display_employees_by_cabinet(cabinet):
if cabinet not in cabinets:
return page_not_found(f"{cabinet} is not a valid cabinet")
cabinet = cabinet.upper()
sums_by_year = salaries.pivot(filter={'Cabinet': cabinet}, agg="sum", group_by="Year", pivot_on=common_pivots)
avgs_by_year = salaries.pivot(filter={'Cabinet': cabinet}, agg="avg", group_by="Year", pivot_on=common_pivots)
injured_employees_by_year = salaries.count_instance_of_field(filter={"Cabinet": cabinet}, field="Injury", group_by="Year")
employees_by_year =salaries.count_instance_of_field(filter={"Cabinet": cabinet}, field="Total", group_by="Year")
years = salaries.unique_values(filter={'Cabinet': cabinet}, field="Year", is_desc=True)
return render_template('index.html' \
, path_root = path_root \
, division_type = "cabinet" \
, division_value = cabinet \
, sums_by_year = sums_by_year \
, avgs_by_year = avgs_by_year \
, injured_employees_by_year = injured_employees_by_year \
, employees_by_year = employees_by_year \
, years = years)
@app.route('/department/<dept>', methods=['GET'])
def display_employees_by_department(dept):
dept = dept.upper()
if dept not in departments:
return page_not_found(f"{dept} is not a valid department")
sums_by_year = salaries.pivot(filter={'Department':dept}, agg="sum", group_by="Year", pivot_on=common_pivots)
avgs_by_year = salaries.pivot(filter={'Department':dept}, agg="avg", group_by="Year", pivot_on=common_pivots)
injured_employees_by_year = salaries.count_instance_of_field(filter={"Department": dept}, field="Injury", group_by="Year")
employees_by_year =salaries.count_instance_of_field(filter={"Department": dept}, field="Total", group_by="Year")
years = salaries.unique_values(filter={'Department':dept}, field="Year", is_desc=True)
return render_template('index.html' \
, path_root = path_root \
, division_type = "department" \
, division_value = dept \
, sums_by_year = sums_by_year \
, avgs_by_year = avgs_by_year \
, injured_employees_by_year = injured_employees_by_year \
, employees_by_year = employees_by_year \
, years = years)
@app.route('/department/<dept>/program/<program>', methods=['GET'])
def display_employees_by_program(dept, program):
dept, program = dept.upper(), program.upper()
if dept not in departments:
return page_not_found(f"{dept} is not a valid department")
if program not in programs:
return page_not_found(f"{program} is not a valid program")
dept = dept.upper()
program = program.upper()
sums_by_year = salaries.pivot(filter={"$and" : [{'Department':dept},{'Program':program}]}, agg="sum", group_by="Year", pivot_on=common_pivots)
avgs_by_year = salaries.pivot(filter={"$and" : [{'Department':dept},{'Program':program}]}, agg="avg", group_by="Year", pivot_on=common_pivots)
injured_employees_by_year = salaries.count_instance_of_field(filter={'Department':dept, 'Program':program}, field="Injury", group_by="Year")
employees_by_year = salaries.count_instance_of_field(filter={'Department':dept, 'Program':program}, field="Total", group_by="Year")
years = salaries.unique_values(filter={"$and" : [{'Department':dept},{'Program':program}]}, field="Year", is_desc=True)
return render_template('index.html' \
, path_root = path_root \
, division_type = "program" \
, division_value = program \
, dept = dept \
, sums_by_year = sums_by_year \
, avgs_by_year = avgs_by_year \
, injured_employees_by_year = injured_employees_by_year \
, employees_by_year = employees_by_year \
, years = years)
if __name__ == '__main__':
print(salaries.pivot(filter={'Cabinet': "EDUCATION"}, agg="sum", group_by="Year", pivot_on=common_pivots))
app.run(load_dotenv=False, port=4999)