-
Notifications
You must be signed in to change notification settings - Fork 0
/
looking.py
473 lines (407 loc) · 20.4 KB
/
looking.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
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
#!/usr/bin/python
# -*- encoding: utf-8 -*-
# uvozimo bottle.py
from bottle import *
import sqlite3
import hashlib
from datetime import datetime
from datetime import date
# uvozimo ustrezne podatke za povezavo
import auth_public as auth
# uvozimo psycopg2
import psycopg2, psycopg2.extensions, psycopg2.extras
psycopg2.extensions.register_type(psycopg2.extensions.UNICODE) # se znebimo problemov s šumniki
# odkomentiraj, če želiš sporočila o napakah
debug(True)
#Mapa s statičnimi datotekami
static_dir = "./static"
hotel_dir = "./hotel"
#piškotki
secret = "to skrivnost je zelo tezko uganiti 1094107c907cw982982c42"
admini = ["katarinabrilej", "evadezelak", "asistent", "profesor"]
######################################################################
#Pomožne funkcije
def password_hash(s):
"""Vrni SHA-512 hash danega UTF-8 niza. Gesla vedno spravimo v bazo
kodirana s to funkcijo."""
h = hashlib.md5()
h.update(s.encode('utf-8'))
return h.hexdigest()
# Funkcija, ki v cookie spravi sporocilo
def set_sporocilo(tip, vsebina):
response.set_cookie('message', (tip, vsebina), path='/', secret=secret)
def get_sporocilo():
sporocilo = request.get_cookie('message', default=None, secret=secret)
response.delete_cookie('message')
return sporocilo
def get_user():
"""Poglej cookie in ugotovi, kdo je prijavljeni uporabnik,
vrni njegov username in ime. Če ni prijavljen, presumeri
na stran za prijavo ali vrni None (advisno od auto_login).
"""
username = request.get_cookie('username', secret=secret)
# Preverimo, ali ta uporabnik obstaja
if username is not None:
cur.execute("SELECT uporabnisko_ime, ime FROM uporabnik WHERE uporabnisko_ime=%s",
[username])
r = cur.fetchone()
if r is not None:
# uporabnik obstaja, vrnemo njegove podatke
return username
else:
return None
######################################################################
# Funkcije, ki obdelajo zahteve odjemalcev.
def clean(list):
cleaned = []
for x in list:
strip = x[0].strip()
cleaned.append(strip)
return cleaned
def clean3(list):
cleaned = []
for x in list:
cleaned.append(x[0])
return cleaned
def drzave():
cur.execute("SELECT ime_mesta, ime_drzave, mesto.id ,drzava.id FROM drzava JOIN mesto ON drzava.id = drzava_id ORDER BY ime_mesta")
drzave = cur.fetchall()
return drzave
@route("/static/<filename:path>")
def static(filename):
"""Splošna funkcija, ki servira vse statične datoteke iz naslova
/static/..."""
return static_file(filename, root=static_dir)
@route("/hotel/<filename:path>")
def hotel(filename):
return static_file(filename, root=hotel_dir)
@get("/")
def main():
username = get_user()
drzave_seznam = drzave()
sporocilo = get_sporocilo()
return template("index.html", drzave=drzave_seznam,
username=username,
sporocilo=sporocilo, admini = admini)
@get("/drzava/:x")
def drzave_hoteli(x):
username = get_user()
cur.execute("SELECT hotel_id, lokacija_id FROM na_lokaciji")
na_lokaciji = cur.fetchall()
cur.execute("SELECT hotel, ugodnost FROM ima")
ugodnosti_hoteli = cur.fetchall()
cur.execute("SELECT ime_mesta FROM mesto WHERE id = %s", [x])
mesto = cur.fetchall()
mesto = mesto[0][0]
cur.execute("SELECT id, ime_ugodnosti FROM ugodnosti ORDER BY ime_ugodnosti")
ugodnosti = cur.fetchall()
cur.execute("SELECT lokacije.id,ime_lokacije, tip, mesto.id FROM lokacije JOIN mesto ON mesto_id = mesto.id WHERE mesto.id = %s", [x])
lokacije = cur.fetchall()
cur.execute("SELECT ime, hotel.id, st_zvezdic, tip_nastanitve, mesto.id FROM hotel JOIN mesto ON mesto.id = mesto_id WHERE mesto.id = %s", [x])
hoteli = cur.fetchall()
cur.execute("SELECT DISTINCT st_zvezdic FROM hotel WHERE mesto_id =%s", [x])
zvezdice = cur.fetchall()
zvezdice = clean3(zvezdice)
cur.execute("SELECT DISTINCT tip_nastanitve FROM hotel WHERE mesto_id =%s", [x])
nastanitve = cur.fetchall()
nastanitve = clean3(nastanitve)
cur.execute("SELECT ROUND(AVG(x.vrednost),1), y.id FROM oceni AS x RIGHT JOIN hotel AS y ON x.hotel = y.id GROUP BY y.id")
ocene = cur.fetchall()
return template("drzave.html", username = username, admini = admini, ugodnosti = ugodnosti, lokacije = lokacije, mesto = mesto, hoteli = hoteli,
zvezdice = zvezdice, nastanitve = nastanitve, ugodnosti_hoteli = ugodnosti_hoteli, na_lokaciji = na_lokaciji, ocene = ocene)
@get("/hotel-podrobno/:x")
def hotel1(x):
cur.execute("SELECT ime_lokacije, tip, lokacija_id FROM na_lokaciji JOIN lokacije ON lokacija_id = id WHERE hotel_id = %s",[x])
lokacije = cur.fetchall()
cur.execute("SELECT ugodnost, ime_ugodnosti FROM ima JOIN ugodnosti ON id = ugodnost WHERE hotel = %s", [x])
ugodnosti = cur.fetchall()
cur.execute("SELECT hotel.id,ime, st_zvezdic,tip_nastanitve, mesto.ime_mesta FROM hotel JOIN mesto ON mesto.id = mesto_id WHERE hotel.id =%s", [x])
hotel_podrobnosti = cur.fetchall()
cur.execute("SELECT datum, mnenje, vrednost,uporabnik.uporabnisko_ime FROM oceni JOIN uporabnik ON uporabnik.id = oceni.uporabnik WHERE hotel= %s", [x])
komentarji = cur.fetchall()
username = get_user()
cur.execute("SELECT AVG(vrednost) FROM oceni WHERE hotel=%s",[x])
povprecna_ocena = cur.fetchall()
povprecna_ocena = povprecna_ocena[0][0]
if povprecna_ocena is not None:
povprecna_ocena = round(povprecna_ocena,1)
else:
povprecna_ocena = 0
return template("hotel.html", username=username, admini = admini, lokacije = lokacije, ugodnosti = ugodnosti, hotel_podrobnosti = hotel_podrobnosti, komentarji = komentarji, povprecna_ocena = povprecna_ocena)
@post("/hotel-podrobno/")
def dodajKomentar():
username = get_user()
komentar = request.forms.komentar
ocena = request.forms['optradio']
datum = date.today()
hotel_id = request.forms['idHotela']
cur.execute("SELECT id FROM uporabnik WHERE uporabnisko_ime=%s",[username])
user_id = cur.fetchall()
cur.execute("SELECT ime_lokacije, tip, lokacija_id FROM na_lokaciji JOIN lokacije ON lokacija_id = id WHERE hotel_id = %s",[hotel_id])
if user_id is not None:
cur.execute("INSERT INTO oceni (datum, mnenje, vrednost, hotel, uporabnik) VALUES (%s,%s,%s,%s,%s)",
(datum,komentar,ocena,hotel_id,user_id[0][0]))
return redirect("/hotel-podrobno/"+hotel_id)
@get("/login/")
def login_get():
"""Serviraj formo za login."""
return template("login2.html",
napaka=None,
username=None)
@post("/login/")
def login_post():
"""Obdelaj izpolnjeno formo za prijavo"""
# Uporabniško ime, ki ga je uporabnik vpisal v formo
username = request.forms.username
# Izračunamo hash gesla, ki ga bomo spravili
geslo = password_hash(request.forms.password)
# Preverimo, ali se je uporabnik pravilno prijavil
cur = conn.cursor(cursor_factory=psycopg2.extras.DictCursor)
cur.execute("SELECT * FROM uporabnik WHERE uporabnisko_ime=%s AND geslo=%s",
[username, geslo])
if cur.fetchone() is None:
# Username in geslo se ne ujemata
return template("login2.html",
napaka="Nepravilna prijava",
username=username)
else:
# Vse je v redu, nastavimo cookie in preusmerimo na glavno stran
response.set_cookie('username', username, path='/', secret=secret)
redirect("/")
@get("/logout/")
def logout():
"""Pobriši cookie in preusmeri na login."""
response.delete_cookie('username', path='/')
redirect('/login/')
@get("/register/")
def login_get():
"""Prikaži formo za registracijo."""
return template("register2.html",
username=None,
ime=None,
napaka=None)
@post("/register/")
def register_post():
"""Registriraj novega uporabnika."""
username = request.forms.username
ime = request.forms.ime
priimek = request.forms.priimek
password1 = request.forms.password1
password2 = request.forms.password2
# Ali uporabnik že obstaja?
cur = conn.cursor(cursor_factory=psycopg2.extras.DictCursor)
cur.execute("SELECT 1 FROM uporabnik WHERE uporabnisko_ime=%s", [username])
if cur.fetchone():
# Uporabnik že obstaja
return template("register2.html",
username=username,
ime=ime,
napaka='To uporabniško ime je že zavzeto')
elif not password1 == password2:
# Geslo se ne ujemata
return template("register2.html",
username=username,
ime=ime,
napaka='Gesli se ne ujemata')
elif username == 'katarinabrilej' or username == 'evadezelak':
# Vse je v redu, vstavi novega uporabnika v bazo
uporabnik = "administrator"
password = password_hash(password1)
cur.execute("INSERT INTO uporabnik (uporabnisko_ime, ime, priimek, geslo, tip) VALUES (%s, %s, %s, %s, %s)",
(username, ime, priimek, password, uporabnik))
# Daj uporabniku cookie
response.set_cookie('username', username, path='/', secret=secret)
redirect("/")
else:
# Vse je v redu, vstavi novega uporabnika v bazo
uporabnik = "uporabnik"
password = password_hash(password1)
cur.execute("INSERT INTO uporabnik (uporabnisko_ime, ime, priimek, geslo, tip) VALUES (%s, %s, %s, %s, %s)",
(username, ime, priimek, password, uporabnik))
# Daj uporabniku cookie
response.set_cookie('username', username, path='/', secret=secret)
redirect("/")
@get("/uporabnik/")
def uporabnik(sporocila=[]):
sporocilo = get_sporocilo()
username = get_user()
cur.execute("SELECT id FROM uporabnik WHERE uporabnisko_ime=%s",[username])
user_id = cur.fetchall()
cur.execute("SELECT datum, mnenje, vrednost, ime, oceni.hotel FROM oceni JOIN hotel ON oceni.hotel=hotel.id WHERE oceni.uporabnik=%s",[user_id[0][0]])
mnenja = cur.fetchall()
return template("uporabnik.html", username = username, admini = admini, sporocilo = sporocilo,sporocila=sporocila,mnenja=mnenja)
@post("/uporabnik/")
def spremeni():
username = get_user()
# Staro geslo (je obvezno)
password1 = password_hash(request.forms.password1)
# Preverimo staro geslo
cur.execute ("SELECT 1 FROM uporabnik WHERE uporabnisko_ime=%s AND geslo=%s",
[username, password1])
# Pokazali bomo eno ali več sporočil, ki jih naberemo v seznam
sporocila = []
if cur.fetchone():
# Geslo je ok
# Ali je treba spremeniti geslo?
password2 = request.forms.password2
password3 = request.forms.password3
if password2 or password3:
# Preverimo, ali se gesli ujemata
if password2 == password3:
# Vstavimo v bazo novo geslo
password2 = password_hash(password2)
cur.execute ("UPDATE uporabnik SET geslo=%s WHERE uporabnisko_ime = %s", [password2, username])
sporocila.append(("alert-success", "Geslo ste uspešno spremenili."))
else:
sporocila.append(("alert-danger", "Gesli se ne ujemata"))
else:
# Geslo ni ok
sporocila.append(("alert-danger", "Staro geslo je napačno"))
return uporabnik(sporocila)
@get("/admin/")
def admin():
sporocilo = get_sporocilo()
username = get_user()
cur.execute("SELECT id, ime_celine FROM celina ORDER BY ime_celine")
celine= cur.fetchall()
cur.execute("SELECT id, ime_drzave FROM drzava ORDER BY ime_drzave")
drzave= cur.fetchall()
cur.execute("SELECT ime_mesta, ime_drzave, mesto.id ,drzava.id FROM drzava JOIN mesto ON drzava.id = drzava_id ORDER BY ime_mesta")
mesta = cur.fetchall()
cur.execute("SELECT * FROM ugodnosti ORDER BY ime_ugodnosti")
ugodnosti = cur.fetchall()
cur.execute("SELECT lokacije.id, mesto_id, ime_lokacije FROM lokacije JOIN mesto on mesto_id = mesto.id WHERE tip = 'Okrožje' ORDER BY ime_lokacije ")
okrozja_po_mestih = cur.fetchall()
cur.execute("SELECT lokacije.id, mesto_id, ime_lokacije FROM lokacije JOIN mesto on mesto_id = mesto.id WHERE tip = 'Znamenitost' ORDER BY ime_lokacije ")
znamenitosti_po_mestih = cur.fetchall()
return template("admin.html", username = username, sporocilo = sporocilo, napaka1 = None, napaka2 = None, napaka3 = None, napaka_o = None, napaka_z = None,
celine = celine, drzave = drzave, mesta = mesta, ugodnosti = ugodnosti, admini = admini,
okrozja_po_mestih = okrozja_po_mestih, znamenitosti_po_mestih = znamenitosti_po_mestih )
@post("/admin/")
def dodaj():
username = get_user()
cur.execute("SELECT id, ime_celine FROM celina ORDER BY ime_celine")
celine= cur.fetchall()
cur.execute("SELECT id, ime_drzave FROM drzava ORDER BY ime_drzave")
drzave= cur.fetchall()
cur.execute("SELECT ime_mesta, ime_drzave, mesto.id ,drzava.id FROM drzava JOIN mesto ON drzava.id = drzava_id ORDER BY ime_mesta")
mesta = cur.fetchall()
cur.execute("SELECT * FROM ugodnosti ORDER BY ime_ugodnosti")
ugodnosti = cur.fetchall()
cur.execute("SELECT lokacije.id, mesto_id, ime_lokacije FROM lokacije JOIN mesto on mesto_id = mesto.id WHERE tip = 'Okrožje' ORDER BY ime_lokacije ")
okrozja_po_mestih = cur.fetchall()
cur.execute("SELECT lokacije.id, mesto_id, ime_lokacije FROM lokacije JOIN mesto on mesto_id = mesto.id WHERE tip = 'Znamenitost' ORDER BY ime_lokacije ")
znamenitosti_po_mestih = cur.fetchall()
drzava = request.forms.drzava
id_celine = request.forms.celina
mesto = request.forms.mesto
id_drzave = request.forms.drzava_izbira
hotel = request.forms.hotel
id_mesta = request.forms.mesto_izbira
nastanitev = request.forms.nastanitev
st_zvezdic = request.forms.star
ugodnosti_izbira = request.forms.getlist("ugodnosti")
okrozja_izbira = request.forms.getlist("okrozja")
znamenitosti_izbira = request.forms.getlist("znamenitosti")
dodano_okrozje = request.forms.okrozje
id_mesto_okrozje = request.forms.mesto_okrozje
dodana_znamenitost = request.forms.znamenitost
id_mesto_znamenitost = request.forms.mesto_znamenitost
if drzava:
cur.execute("SELECT 1 FROM drzava WHERE ime_drzave=%s", [drzava])
if cur.fetchone():
# Država že obstaja
return template("admin.html",
username=username,admini = admini,
napaka1='Ta država je že vnešena.',
napaka2 = None,
napaka3 = None,
celine = celine, drzave = drzave, mesta = mesta, ugodnosti = ugodnosti,
napaka_o = None, napaka_z = None,
okrozja_po_mestih = okrozja_po_mestih, znamenitosti_po_mestih = znamenitosti_po_mestih )
else:
cur.execute("INSERT INTO Drzava(Ime_drzave, Celina_id) VALUES (%s, %s)", [drzava, id_celine])
return redirect("/admin/")
elif mesto:
cur.execute("SELECT 1 FROM mesto WHERE ime_mesta=%s", [mesto])
if cur.fetchone():
# Mesto že obstaja
return template("admin.html",
username=username,admini = admini,
napaka1 = None,
napaka2='To mesto je že vnešeno.',
napaka3 = None,
celine = celine, drzave = drzave, mesta = mesta, ugodnosti = ugodnosti,
napaka_o = None, napaka_z = None,
znamenitosti_po_mestih = znamenitosti_po_mestih,
okrozja_po_mestih = okrozja_po_mestih )
else:
cur.execute("INSERT INTO mesto(ime_mesta, drzava_id) VALUES (%s, %s)", [mesto, id_drzave])
return redirect("/admin/")
elif dodano_okrozje:
cur.execute("SELECT * FROM lokacije JOIN mesto ON mesto.id = mesto_id WHERE mesto_id=%s AND ime_lokacije = %s", [id_mesto_okrozje, dodano_okrozje])
if cur.fetchone():
# Okrožje že obstaja
return template("admin.html",
username=username,admini = admini,
napaka1 = None,
napaka2= None,
napaka3 = None,
celine = celine, drzave = drzave, mesta = mesta, ugodnosti = ugodnosti,
napaka_o = "To okrožje v tem mestu že obstaja", napaka_z = None,
znamenitosti_po_mestih = znamenitosti_po_mestih,
okrozja_po_mestih = okrozja_po_mestih )
else:
cur.execute("INSERT INTO lokacije(ime_lokacije, tip, mesto_id) VALUES (%s, 'Okrožje',%s)", [dodano_okrozje, id_mesto_okrozje])
return redirect("/admin/")
elif dodana_znamenitost:
cur.execute("SELECT * FROM lokacije JOIN mesto ON mesto.id = mesto_id WHERE mesto_id=%s AND ime_lokacije = %s", [id_mesto_znamenitost, dodana_znamenitost ])
if cur.fetchone():
# Znamenitost že obstaja
return template("admin.html",
username=username,admini = admini,
napaka1 = None,
napaka2= None,
napaka3 = None,
celine = celine, drzave = drzave, mesta = mesta, ugodnosti = ugodnosti,
napaka_z = "Ta znamenitost v tem mestu že obstaja", napaka_o = None,
znamenitosti_po_mestih = znamenitosti_po_mestih,
okrozja_po_mestih = okrozja_po_mestih )
else:
cur.execute("INSERT INTO lokacije(ime_lokacije, tip, mesto_id) VALUES (%s, 'Znamenitost',%s)", [dodana_znamenitost , id_mesto_znamenitost])
return redirect("/admin/")
elif hotel:
cur.execute("SELECT drzava_id FROM mesto WHERE id = %s", [id_mesta])
drzava_id = cur.fetchone()
drzava_id = drzava_id[0]
cur.execute("SELECT * FROM hotel JOIN mesto ON mesto.id = mesto_id WHERE mesto_id=%s AND Ime = %s", [id_mesta, hotel])
if cur.fetchone():
# Hotel že obstaja
return template("admin.html",
username=username,admini = admini,
napaka1 = None,
napaka2= None,
napaka3 = 'Ta hotel v tem mestu že obstaja.', napaka_o = None, napaka_z = None,
celine = celine, drzave = drzave, mesta = mesta, ugodnosti = ugodnosti,
znamenitosti_po_mestih = znamenitosti_po_mestih,
okrozja_po_mestih = okrozja_po_mestih)
else:
cur.execute("INSERT INTO hotel (Ime, st_zvezdic, tip_nastanitve, Mesto_id) VALUES (%s, %s, %s, %s)", [hotel, st_zvezdic, nastanitev, id_mesta])
cur.execute("SELECT id FROM hotel WHERE id = (SELECT MAX(id) FROM hotel)")
zadnji_hotel = cur.fetchone()
zadnji_hotel = zadnji_hotel[0]
for ugodnost in ugodnosti_izbira:
cur.execute("INSERT INTO ima (hotel, ugodnost) VALUES (%s, %s)", [zadnji_hotel,ugodnost])
for okrozje in okrozja_izbira:
cur.execute("INSERT INTO Na_lokaciji (Hotel_id, Lokacija_id ) VALUES (%s, %s)",[zadnji_hotel,okrozje])
for znamenitost in znamenitosti_izbira:
cur.execute("INSERT INTO Na_lokaciji (Hotel_id, Lokacija_id ) VALUES (%s, %s)",[zadnji_hotel,znamenitost])
return redirect("/admin/")
######################################################################
# Glavni program
# priklopimo se na bazo
conn = psycopg2.connect(database=auth.db, host=auth.host, user=auth.user, password=auth.password)
conn.set_isolation_level(psycopg2.extensions.ISOLATION_LEVEL_AUTOCOMMIT) # onemogočimo transakcije
cur = conn.cursor(cursor_factory=psycopg2.extras.DictCursor)
# poženemo strežnik na portu 8080, glej http://localhost:8080/
run(host='localhost', port=8080) #,reloader=True)