1+ import bcrypt
2+ import csv
13from psycopg import connect , sql , errors
24from auth import auth
35from dataclasses import dataclass
@@ -39,6 +41,36 @@ def izbrisi_tabelo(cls, ce_obstaja=False):
3941 ce_obstaja = sql .SQL ("IF EXISTS" if ce_obstaja else "" )
4042 ))
4143
44+ @classmethod
45+ def uvozi_podatke (cls ):
46+ with conn .transaction ():
47+ with conn .cursor () as cur :
48+ with open ('podatki/kraj.csv' ) as f :
49+ rd = csv .reader (f )
50+ stolpci = next (rd )
51+ for vrstica in rd :
52+ podatki = dict (zip (stolpci , vrstica ))
53+ cur .execute (
54+ """
55+ INSERT INTO kraj (posta, kraj)
56+ VALUES (%(posta)s, %(kraj)s)
57+ """ , podatki
58+ )
59+
60+ @classmethod
61+ def z_id (cls , id ):
62+ with conn .transaction ():
63+ with conn .cursor () as cur :
64+ cur .execute (
65+ """
66+ SELECT posta, kraj FROM kraj
67+ WHERE posta = %s
68+ """ , (id , )
69+ )
70+ vrstica = cur .fetchone ()
71+ if vrstica is None :
72+ raise ValueError (f"Kraj s pošto { id } ne obstaja!" )
73+ return Kraj (* vrstica )
4274
4375@dataclass
4476class Oseba :
@@ -47,6 +79,9 @@ class Oseba:
4779 priimek : str
4880 naslov : str
4981 kraj : Kraj
82+ uporabnisko_ime : str
83+ geslo : bytes = None
84+ admin : bool = False
5085
5186 @classmethod
5287 def ustvari_tabelo (cls , pobrisi = False , ce_ne_obstaja = False ):
@@ -61,7 +96,10 @@ def ustvari_tabelo(cls, pobrisi=False, ce_ne_obstaja=False):
6196 ime TEXT NOT NULL,
6297 priimek TEXT NOT NULL,
6398 naslov TEXT NOT NULL,
64- kraj INTEGER NOT NULL REFERENCES kraj(posta)
99+ kraj INTEGER NOT NULL REFERENCES kraj(posta),
100+ uporabnisko_ime TEXT NOT NULL UNIQUE,
101+ geslo BYTEA,
102+ admin BOOLEAN NOT NULL DEFAULT (FALSE)
65103 );
66104 """ ).format (
67105 ce_ne_obstaja = sql .SQL ("IF NOT EXISTS" if ce_ne_obstaja else "" )
@@ -78,6 +116,63 @@ def izbrisi_tabelo(cls, ce_obstaja=False):
78116 ce_obstaja = sql .SQL ("IF EXISTS" if ce_obstaja else "" )
79117 ))
80118
119+ @classmethod
120+ def uvozi_podatke (cls ):
121+ with conn .transaction ():
122+ with conn .cursor () as cur :
123+ with open ('podatki/oseba.csv' ) as f :
124+ rd = csv .reader (f )
125+ stolpci = next (rd )
126+ for vrstica in rd :
127+ podatki = dict (zip (stolpci , vrstica ))
128+ if podatki ['geslo' ]:
129+ podatki ['geslo' ] = Oseba ._nastavi_geslo (podatki ['geslo' ])
130+ else :
131+ podatki ['geslo' ] = None
132+ podatki ['admin' ] = (podatki ['emso' ] == '1' )
133+ cur .execute (
134+ """
135+ INSERT INTO oseba (emso, ime, priimek, naslov, kraj, uporabnisko_ime, geslo, admin)
136+ VALUES (%(emso)s, %(ime)s, %(priimek)s, %(naslov)s, %(kraj)s,
137+ %(uporabnisko_ime)s, %(geslo)s, %(admin)s)
138+ """ , podatki
139+ )
140+
141+ @classmethod
142+ def z_id (cls , id ):
143+ with conn .transaction ():
144+ with conn .cursor () as cur :
145+ cur .execute (
146+ """
147+ SELECT emso, ime, priimek, naslov, kraj.posta, kraj.kraj, uporabnisko_ime, admin FROM oseba
148+ JOIN kraj ON oseba.kraj = posta
149+ WHERE emso = %s
150+ """ , (id , )
151+ )
152+ vrstica = cur .fetchone ()
153+ if vrstica is None :
154+ raise ValueError (f"Uporabnik z EMŠOm { id } ne obstaja!" )
155+ * podatki , posta , kraj , uporabnisko_ime , admin = vrstica
156+ return Oseba (* podatki , Kraj (posta , kraj ), uporabnisko_ime , admin = admin )
157+
158+ @staticmethod
159+ def _nastavi_geslo (geslo ):
160+ """
161+ Vrni zgostitev podanega gesla.
162+ """
163+ geslo = geslo .encode ("utf-8" )
164+ sol = bcrypt .gensalt ()
165+ return bcrypt .hashpw (geslo , sol )
166+
167+ @staticmethod
168+ def _preveri_geslo (geslo , zgostitev ):
169+ """
170+ Preveri podano geslo glede na podano zgostitev.
171+ """
172+ geslo = geslo .encode ("utf-8" )
173+ return bcrypt .checkpw (geslo , zgostitev )
174+
175+
81176@dataclass
82177class Racun :
83178 stevilka : int
@@ -110,6 +205,50 @@ def izbrisi_tabelo(cls, ce_obstaja=False):
110205 ce_obstaja = sql .SQL ("IF EXISTS" if ce_obstaja else "" )
111206 ))
112207
208+ @classmethod
209+ def uvozi_podatke (cls ):
210+ with conn .transaction ():
211+ with conn .cursor () as cur :
212+ with open ('podatki/racun.csv' ) as f :
213+ rd = csv .reader (f )
214+ stolpci = next (rd )
215+ for vrstica in rd :
216+ podatki = dict (zip (stolpci , vrstica ))
217+ cur .execute (
218+ """
219+ INSERT INTO racun (stevilka, lastnik)
220+ VALUES (%(stevilka)s, %(lastnik)s)
221+ """ , podatki
222+ )
223+ cur .execute (
224+ """
225+ SELECT MAX(stevilka) FROM racun
226+ """
227+ )
228+ stevec , = cur .fetchone ()
229+ cur .execute (sql .SQL (
230+ """
231+ ALTER SEQUENCE racun_stevilka_seq RESTART WITH {vrednost}
232+ """
233+ ).format (vrednost = sql .Literal (stevec + 1 )))
234+
235+ @classmethod
236+ def z_id (cls , id ):
237+ with conn .transaction ():
238+ with conn .cursor () as cur :
239+ cur .execute (
240+ """
241+ SELECT stevilka, emso, ime, priimek, naslov, kraj.posta, kraj.kraj, uporabnisko_ime, admin FROM racun
242+ JOIN oseba ON lastnik = emso
243+ JOIN kraj ON oseba.kraj = posta
244+ WHERE stevilka = %s
245+ """ , (id , )
246+ )
247+ vrstica = cur .fetchone ()
248+ if vrstica is None :
249+ raise ValueError (f"Račun s številko { id } ne obstaja!" )
250+ stevilka , * podatki , posta , kraj , uporabnisko_ime , admin = vrstica
251+ return Racun (stevilka , Oseba (* podatki , Kraj (posta , kraj ), uporabnisko_ime , admin = admin ))
113252
114253@dataclass
115254class Transakcija :
@@ -149,6 +288,54 @@ def izbrisi_tabelo(cls, ce_obstaja=False):
149288 ce_obstaja = sql .SQL ("IF EXISTS" if ce_obstaja else "" )
150289 ))
151290
291+ @classmethod
292+ def uvozi_podatke (cls ):
293+ with conn .transaction ():
294+ with conn .cursor () as cur :
295+ with open ('podatki/transakcija.csv' ) as f :
296+ rd = csv .reader (f )
297+ stolpci = next (rd )
298+ for vrstica in rd :
299+ podatki = dict (zip (stolpci , vrstica ))
300+ cur .execute (
301+ """
302+ INSERT INTO transakcija (id, racun, znesek, cas, opis)
303+ VALUES (%(id)s, %(racun)s, %(znesek)s, %(cas)s, %(opis)s)
304+ """ , podatki
305+ )
306+ cur .execute (
307+ """
308+ SELECT MAX(id) FROM transakcija
309+ """
310+ )
311+ stevec , = cur .fetchone ()
312+ cur .execute (sql .SQL (
313+ """
314+ ALTER SEQUENCE transakcija_id_seq RESTART WITH {vrednost}
315+ """
316+ ).format (vrednost = sql .Literal (stevec + 1 )))
317+
318+ @classmethod
319+ def z_id (cls , id ):
320+ with conn .transaction ():
321+ with conn .cursor () as cur :
322+ cur .execute (
323+ """
324+ SELECT id, racun, znesek, cas, opis, emso, ime, priimek, naslov,
325+ kraj.posta, kraj.kraj, uporabnisko_ime, admin FROM transakcija
326+ JOIN racun ON racun = stevilka
327+ JOIN oseba ON lastnik = emso
328+ JOIN kraj ON oseba.kraj = posta
329+ WHERE id = %s
330+ """ , (id , )
331+ )
332+ vrstica = cur .fetchone ()
333+ if vrstica is None :
334+ raise ValueError (f"Transakcija z ID-jem { id } ne obstaja!" )
335+ id , racun , znesek , cas , opis , * podatki , posta , kraj , uporabnisko_ime , admin = vrstica
336+ return Transakcija (id , Racun (racun , Oseba (* podatki , Kraj (posta , kraj ), uporabnisko_ime , admin = admin )),
337+ znesek , cas , opis )
338+
152339
153340RAZREDI = [Kraj , Oseba , Racun , Transakcija ]
154341
0 commit comments