Skip to content

Commit b1979b4

Browse files
committed
Podatki, uvoz in iskanje po ID-ju
1 parent cea60fd commit b1979b4

5 files changed

Lines changed: 4192 additions & 1 deletion

File tree

predavanja/primeri/banka/model.py

Lines changed: 188 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import bcrypt
2+
import csv
13
from psycopg import connect, sql, errors
24
from auth import auth
35
from 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
4476
class 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
82177
class 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
115254
class 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

153340
RAZREDI = [Kraj, Oseba, Racun, Transakcija]
154341

0 commit comments

Comments
 (0)