1- from model import Kraj , Oseba , Racun , Transakcija , vzpostavi_povezavo
1+ from functools import wraps
2+ from model import Entiteta , Kraj , Oseba , Racun , Transakcija , IntegrityError , vzpostavi_povezavo
23import bottle
34import bottleext
5+ import json
46import os
57
68
1517bottle .debug (True ) # za izpise pri razvoju
1618
1719
20+ def nastavi_piskotek (piskotek , vsebina ):
21+ """
22+ Nastavi podani piškotek.
23+ """
24+ bottle .response .set_cookie (piskotek , vsebina , secret = SKRIVNOST , path = '/' )
25+
26+
27+ def preberi_piskotek (piskotek , izbrisi = False ):
28+ """
29+ Preberi podani piškotek.
30+ """
31+ if izbrisi :
32+ pobrisi_piskotek (piskotek )
33+ return bottle .request .get_cookie (piskotek , secret = SKRIVNOST )
34+
35+
36+ def pobrisi_piskotek (piskotek ):
37+ """
38+ Pobriši podani piškotek.
39+ """
40+ bottle .response .delete_cookie (piskotek , path = '/' )
41+
42+
43+ def nastavi_sporocilo (sporocilo ):
44+ """
45+ Nastavi podano sporočilo.
46+ """
47+ nastavi_piskotek ('sporocilo' , sporocilo )
48+
49+
50+ def preberi_sporocilo ():
51+ """
52+ Vrni sporočilo in pobriši piškotek.
53+ """
54+ return preberi_piskotek ('sporocilo' , izbrisi = True )
55+
56+
57+ def nastavi_obrazec (piskotek , objekt ):
58+ """
59+ Nastavi piškotek s polji objekta.
60+ """
61+ nastavi_piskotek (piskotek , json .dumps (objekt .kot_slovar ()))
62+
63+
64+ def preberi_obrazec (piskotek , obj ):
65+ """
66+ Vrni objekt iz piškotka in ga pobriši.
67+ """
68+ try :
69+ slovar = json .loads (preberi_piskotek (piskotek , izbrisi = True ))
70+ if isinstance (obj , Entiteta ):
71+ obj .posodobi_polja (** slovar )
72+ return obj
73+ else :
74+ return obj (** slovar )
75+ except (TypeError , json .JSONDecodeError ):
76+ return obj if isinstance (obj , Entiteta ) else obj .NULL
77+
78+
79+ def prijavljeni_uporabnik ():
80+ """
81+ Vrni prijavljenega uporabnika z ID-jem iz piškotka.
82+ """
83+ try :
84+ return Oseba .z_id (preberi_piskotek ('uporabnik' ))
85+ except ValueError :
86+ return Oseba .NULL
87+
88+
89+ def prijavi_uporabnika (uporabnik , geslo , piskotek = None ):
90+ """
91+ Nastavi piškotek na podanega uporabnika.
92+ """
93+ if not uporabnik or not uporabnik .prijavi (geslo ):
94+ nastavi_sporocilo ("Prijava ni bila uspešna!" )
95+ if piskotek :
96+ nastavi_obrazec (piskotek , uporabnik )
97+ bottle .redirect (bottle .url ('prijava' ))
98+ print (uporabnik .emso , type (uporabnik .emso ))
99+ nastavi_piskotek ('uporabnik' , uporabnik .emso )
100+ bottle .redirect (bottle .url ('index' ))
101+
102+
103+ def odjavi_uporabnika ():
104+ """
105+ Pobriši piškotek z ID-jem prijavljenega uporabnika.
106+ """
107+ pobrisi_piskotek ('uporabnik' )
108+ bottle .redirect (bottle .url ('index' ))
109+
110+
111+ def status (preveri ):
112+ """
113+ Vrni dekorator, ki preveri prijavljenega uporabnika v skladu s podano
114+ funkcijo in elemente vrnjenega zaporedja preda kot začetne argumente
115+ dekorirani funkciji.
116+ """
117+ @wraps (preveri )
118+ def decorator (fun ):
119+ @wraps (fun )
120+ def wrapper (* largs , ** kwargs ):
121+ uporabnik = prijavljeni_uporabnik ()
122+ out = fun (* preveri (uporabnik ), * largs , ** kwargs )
123+ if out is None :
124+ out = {}
125+ if isinstance (out , dict ):
126+ out ['uporabnik' ] = uporabnik
127+ return out
128+ return wrapper
129+ return decorator
130+
131+
132+ @status
133+ def admin (uporabnik ):
134+ """
135+ Preveri, ali ima uporabnik administratorske pravice.
136+
137+ Dekorirana funkcija kot prvi argument sprejme prijavljenega uporabnika.
138+ """
139+ if not uporabnik .admin :
140+ bottle .abort (401 , "Dostop prepovedan!" )
141+ return (uporabnik , )
142+
143+
144+ @status
145+ def prijavljen (uporabnik ):
146+ """
147+ Preveri, ali je uporabnik prijavljen.
148+
149+ Dekorirana funkcija kot prvi argument sprejme prijavljenega uporabnika.
150+ """
151+ if not uporabnik :
152+ bottle .redirect (bottle .url ('prijava' ))
153+ return (uporabnik , )
154+
155+
156+ @status
157+ def odjavljen (uporabnik ):
158+ """
159+ Preveri, ali je uporabnik odjavljen.
160+ """
161+ if uporabnik :
162+ bottle .redirect (bottle .url ('index' ))
163+ return ()
164+
165+
166+ def preveri_lastnika (uporabnik , emso ):
167+ """
168+ Preveri, ali ima prijavljeni uporabnik dovoljenje dostopa za podani EMŠO.
169+ """
170+ if uporabnik .emso != emso and not uporabnik .admin :
171+ bottle .abort (401 , "Dostop prepovedan!" )
172+
173+
18174bottle .BaseTemplate .defaults .update (
19175 Kraj = Kraj ,
20176 Oseba = Oseba ,
21177 Racun = Racun ,
22178 Transakcija = Transakcija ,
23179 url = bottle .url ,
24180 urlencode = bottle .urlencode ,
181+ preberi_sporocilo = preberi_sporocilo ,
182+ preberi_obrazec = preberi_obrazec ,
183+ prijavljeni_uporabnik = prijavljeni_uporabnik ,
25184)
26185
27186
@@ -36,4 +195,61 @@ def index():
36195 pass
37196
38197
39- bottle .run (host = 'localhost' , port = SERVER_PORT , reloader = RELOADER )
198+ @bottle .get ('/prijava/' )
199+ @bottle .view ('prijava.html' )
200+ @odjavljen
201+ def prijava ():
202+ pass
203+
204+
205+ @bottle .post ('/prijava/' )
206+ @odjavljen
207+ def prijava_post ():
208+ uporabnisko_ime = bottle .request .forms .getunicode ('uporabnisko_ime' )
209+ geslo = bottle .request .forms .getunicode ('geslo' )
210+ uporabnik = Oseba .z_uporabniskim_imenom (uporabnisko_ime )
211+ prijavi_uporabnika (uporabnik , geslo , 'prijava' )
212+
213+
214+ @bottle .get ('/registracija/' )
215+ @bottle .view ('registracija.html' )
216+ @odjavljen
217+ def registracija ():
218+ pass
219+
220+
221+ @bottle .post ('/registracija/' )
222+ @odjavljen
223+ def registracija_post ():
224+ emso = bottle .request .forms .getunicode ('emso' )
225+ ime = bottle .request .forms .getunicode ('ime' )
226+ priimek = bottle .request .forms .getunicode ('priimek' )
227+ naslov = bottle .request .forms .getunicode ('naslov' )
228+ kraj = bottle .request .forms .getunicode ('kraj' )
229+ uporabnisko_ime = bottle .request .forms .getunicode ('uporabnisko_ime' )
230+ geslo = bottle .request .forms .getunicode ('geslo' )
231+ geslo2 = bottle .request .forms .getunicode ('geslo2' )
232+ uporabnik = Oseba (emso , ime , priimek , naslov , kraj , uporabnisko_ime , geslo )
233+ if geslo != geslo2 :
234+ uporabnik .geslo = None
235+ nastavi_sporocilo ("Gesli se ne ujemata!" )
236+ nastavi_obrazec ('registracija' , uporabnik )
237+ bottle .redirect (bottle .url ('registracija' ))
238+ try :
239+ uporabnik .vstavi ()
240+ except IntegrityError :
241+ uporabnik .geslo = None
242+ nastavi_sporocilo ("Dodajanje uporabnika ni uspelo!" )
243+ nastavi_obrazec ('registracija' , uporabnik )
244+ bottle .redirect (bottle .url ('registracija' ))
245+ prijavi_uporabnika (uporabnik , geslo , 'registracija' )
246+
247+
248+ @bottle .post ('/odjava/' )
249+ @prijavljen
250+ def odjava_post (uporabnik ):
251+ odjavi_uporabnika ()
252+
253+
254+ with vzpostavi_povezavo (port = DB_PORT ):
255+ bottle .run (host = 'localhost' , port = SERVER_PORT , reloader = RELOADER )
0 commit comments