· 5 years ago · Sep 08, 2020, 12:36 AM
1import resources.connection as Connection
2import json
3import random
4import string
5
6from flask import jsonify, Blueprint
7from flask_restful import Resource, Api, reqparse
8
9loggedIn = {}
10
11def pretty(d, indent=0):
12 for key, value in d.items():
13 print(' ' * indent + str(key)+":")
14 if isinstance(value, dict):
15 pretty(value, indent+1)
16 else:
17 print(' ' * (indent+1) + str(value))
18
19def get_random_string(length):
20 letters = string.ascii_lowercase
21 result_str = ''.join(random.choice(letters) for i in range(length))
22 print("Random string of length", length, "is:", result_str)
23
24class Maskineriet(Resource):
25 def __init__(self):
26 self.reqparse = reqparse.RequestParser()
27 self.reqparse.add_argument(
28 "data",
29 required = False,
30 location = ["form", "json"]
31 )
32
33
34 brukere = Connection.execute_read_query("SELECT * FROM brukere")
35 self.brukere = {}
36 for k in brukere:
37 bruker_id, navn, prosjekter = k
38 self.brukere[bruker_id] = {
39 "navn": navn,
40 "prosjekter": json.loads(prosjekter),
41 "timer": {}
42 }
43
44 prosjekter = Connection.execute_read_query("SELECT * FROM prosjekt")
45 self.prosjekter = {}
46 for k in prosjekter:
47 prosjekt_id, navn, label = k
48 self.prosjekter[navn] = {
49 "id": prosjekt_id,
50 "label": label
51 }
52
53 timer = Connection.execute_read_query("SELECT * FROM timer")
54 self.timer = {}
55 for k in timer:
56 id, bruker_id, prosjekt_id, minutter, dato, vaktStart, vaktSlutt = k
57 self.timer[id] = {
58 "bruker_id": bruker_id,
59 "prosjekt_id": prosjekt_id,
60 "minutter": minutter,
61 "dato": dato,
62 "vaktStart": vaktStart,
63 "vaktSlutt": vaktSlutt
64 }
65 self.brukere[bruker_id]["timer"][id] = {
66 "bruker_id": bruker_id,
67 "prosjekt_id": prosjekt_id,
68 "minutter": minutter,
69 "dato": dato,
70 "vaktStart": vaktStart,
71 "vaktSlutt": vaktSlutt
72 }
73
74 def get(self):
75 return jsonify(self.prosjekter)
76
77 def post(self):
78 args = self.reqparse.parse_args()
79 return jsonify(self.searchTimer(
80 int(args["time_id"]) if args["time_id"] != None else None,
81 int(args["bruker_id"]) if args["bruker_id"] != None else None, None, None, None))
82
83 def leggTilTimer(self, bruker, prosjekter, dato, vaktStart, vaktSlutt):
84 if self.brukere.get(bruker) == None:
85 return "error", "Bruker id {} finnes ikke".format(bruker)
86 query = "INSERT INTO timer (bruker_id, prosjekt_id, minutter, dato, vaktStart, vaktSlutt) VALUES "
87 first = True
88 for k in prosjekter:
89 v = int(prosjekter[k])
90 if v > 1440:
91 return "error", "Forsøkt lagt til flere minutter en hva som er i en dag: {}".format(k)
92 if not Connection.execute_read_query("SELECT * FROM timer WHERE bruker_id = {} AND dato = '{}' AND prosjekt_id = {}".format(bruker, dato, self.prosjekter[k]["id"])) == []:
93 Connection.execute_query("DELETE FROM timer WHERE bruker_id = {} AND dato = '{}' AND prosjekt_id = {}".format(bruker, dato, self.prosjekter[k]["id"]))
94 if first:
95 query = query+"({}, {}, {}, '{}', '{}:00', '{}:00')".format(bruker, self.prosjekter[k]["id"], v, dato, vaktStart, vaktSlutt)
96 first = False
97 else:
98 query = query+", ({}, {}, {}, '{}', '{}:00', '{}:00')".format(bruker, self.prosjekter[k]["id"], v, dato, vaktStart, vaktSlutt)
99 return Connection.execute_query(query)
100
101 def searchTimer(self, id, bruker_id, prosjekt_id, datoStart, datoSlutt):
102 temp = []
103 if id != None:
104 data = Connection.execute_read_query("SELECT * FROM timer")
105 if data == [] or data[0] == "error":
106 return "error", "Ingenting funnet med filter gitt"
107 else:
108 return data
109
110 if bruker_id != None:
111 for k in self.timer:
112 if self.timer[k]["bruker_id"] == bruker_id:
113 temp.append(k)
114 if prosjekt_id != None:
115 if not temp and bruker_id == None:
116 for k in self.timer:
117 if self.timer[k]["prosjekt_id"] == prosjekt_id:
118 temp.append(k)
119 else:
120 x = []
121 for k in range(len(temp)):
122 if self.timer[temp[k]]["prosjekt_id"] == prosjekt_id:
123 x.append(k)
124 temp = x
125 if not temp:
126 return jsonify("error", "Ingenting mathcet dette filteret")
127 return temp
128
129class Insert(Maskineriet):
130 def post(self):
131 args = json.loads(self.reqparse.parse_args()["data"])
132 if args["bruker_id"] == None:
133 return jsonify("error", "Mangler bruker ID")
134 elif args["prosjekter"] == None:
135 return jsonify("error", "Mangler prosjekter")
136 elif args["dato"] == None:
137 return jsonify("error", "Mangler dato")
138 elif args["vaktStart"] == None:
139 return jsonify("error", "Mangler vakt start")
140 elif args["vaktSlutt"] == None:
141 return jsonify("error", "Mangler prosjekter")
142 return jsonify(self.leggTilTimer(
143 int(args["bruker_id"]),
144 args["prosjekter"],
145 args["dato"],
146 args["vaktStart"],
147 args["vaktSlutt"]))
148
149class Data(Maskineriet):
150 def get(self):
151 return jsonify(self.prosjekter)
152
153class Login(Maskineriet):
154 def post(self):
155 args = json.loads(self.reqparse.parse_args()["data"])
156 result = Connection.execute_read_query("SELECT * FROM admin WHERE username = {} AND password = {}").format(args["un"], args["pw"])
157 if result == []:
158 return jsonify("error", "Feil brukernavn eller passord")
159 else:
160 return get_random_string(25)
161
162class CheckCookie(Maskineriet):
163 def post(self):
164 args = self.reqparse.parse_args()["data"]
165 if loggedIn.get(args) != None:
166 return True
167 else:
168 return False
169
170maskineriet_api = Blueprint("resources.main", __name__)
171api = Api(maskineriet_api)
172api.add_resource(
173 Maskineriet,
174 "/maskineriet",
175 endpoint="maskineriet"
176)
177api.add_resource(
178 Insert,
179 "/insert",
180 endpoint="insert"
181)
182api.add_resource(
183 Data,
184 "/data",
185 endpoint="data"
186)
187api.add_resource(
188 Login,
189 "/login",
190 endpoint="login"
191)
192api.add_resource(
193 CheckCookie,
194 "/checkCookie",
195 endpoint="checkCookie"
196)