Skip to content

Commit b3f10d7

Browse files
committed
Dodano urejanje po stolpcih
1 parent c1ea8e0 commit b3f10d7

File tree

11 files changed

+116
-71
lines changed

11 files changed

+116
-71
lines changed

predavanja/primeri/banka/banka.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,7 @@ def vrni_stran():
180180
stran = 0
181181
except ValueError:
182182
stran = 0
183-
return stran
183+
return (stran, bottle.request.query.uredi)
184184

185185

186186
bottle.BaseTemplate.defaults.update(
@@ -384,7 +384,7 @@ def komitenti_uredi_post(uporabnik, emso):
384384
def komitenti_racuni(uporabnik, emso):
385385
preveri_lastnika(uporabnik, emso)
386386
oseba = Oseba.z_id(emso)
387-
return dict(oseba=oseba, racuni=oseba.racuni())
387+
return dict(oseba=oseba)
388388

389389

390390
@bottle.get('/komitenti/transakcije/<emso>/')

predavanja/primeri/banka/model.py

Lines changed: 46 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
from auth import auth
33
from dataclasses import dataclass
44
from datetime import datetime
5-
from orm import povezi, stolpec, Entiteta, Funkcija, sql, field, fields
5+
from orm import povezi, stolpec, Seznam, Entiteta, Funkcija, sql, field, fields
66

77
@dataclass
88
class Kraj(Entiteta):
@@ -43,31 +43,44 @@ def z_uporabniskim_imenom(cls, up_ime):
4343
"""
4444
return cls._s_kljucem('up_ime', up_ime)
4545

46-
def racuni(self):
46+
@Seznam
47+
def racuni(self, cur):
4748
"""
4849
Vrni račune osebe.
4950
"""
50-
with conn.cursor() as cur:
51-
cur.execute("""
52-
SELECT stevilka, COALESCE(SUM(znesek), 0) AS stanje
53-
FROM racun LEFT JOIN transakcija ON stevilka = racun
54-
WHERE lastnik = %s
55-
GROUP BY stevilka
56-
""", [self.emso])
57-
yield from (Racun(stevilka, self, stanje)
58-
for stevilka, stanje in cur)
51+
yield from (Racun(stevilka, self, stanje) for stevilka, stanje in cur)
5952

60-
def transakcije(self):
53+
@racuni.poizvedba
54+
def racuni(self):
55+
return dict(stolpci=sql.SQL("stevilka, COALESCE(SUM(znesek), 0) AS stanje"),
56+
tabela=Racun._tabela(),
57+
join=sql.SQL("LEFT JOIN transakcija ON stevilka = racun"),
58+
pogoji=sql.SQL("WHERE lastnik = {lastnik}").format(
59+
lastnik=sql.Placeholder()
60+
),
61+
zdruzevanje=sql.SQL("GROUP BY stevilka"),
62+
podatki=[self.emso],
63+
objekt=Racun)
64+
65+
66+
@Seznam
67+
def transakcije(self, cur):
6168
"""
6269
Vrni transakcije osebe.
6370
"""
64-
with conn.cursor() as cur:
65-
cur.execute("""
66-
SELECT id, racun, znesek, cas, opis
67-
FROM racun JOIN transakcija ON stevilka = racun
68-
WHERE lastnik = %s
69-
""", [self.emso])
70-
yield from (Transakcija(*vrstica) for vrstica in cur)
71+
yield from (Transakcija(*vrstica) for vrstica in cur)
72+
73+
@transakcije.poizvedba
74+
def transakcije(self):
75+
return dict(stolpci=sql.SQL("id, racun, znesek, cas, opis"),
76+
tabela=sql.SQL("""
77+
racun JOIN transakcija ON stevilka = racun
78+
"""),
79+
pogoji=sql.SQL("WHERE lastnik = {lastnik}").format(
80+
lastnik=sql.Placeholder()
81+
),
82+
podatki=[self.emso],
83+
objekt=Transakcija)
7184

7285
@classmethod
7386
def _stolpci(cls):
@@ -176,18 +189,23 @@ class Racun(Entiteta):
176189
lastnik: Oseba = stolpec(obvezen=True)
177190
stanje: int = field(default=0)
178191

179-
def transakcije(self):
192+
@Seznam
193+
def transakcije(self, cur):
180194
"""
181195
Vrni transakcije osebe.
182196
"""
183-
with conn.cursor() as cur:
184-
cur.execute("""
185-
SELECT id, znesek, cas, opis
186-
FROM transakcija
187-
WHERE racun = %s
188-
""", [self.stevilka])
189-
yield from (Transakcija(id, self, znesek, cas, opis)
190-
for id, znesek, cas, opis in cur)
197+
yield from (Transakcija(id, self, znesek, cas, opis)
198+
for id, znesek, cas, opis in cur)
199+
200+
@transakcije.poizvedba
201+
def transakcije(self):
202+
return dict(stolpci=sql.SQL("id, znesek, cas, opis"),
203+
tabela=Transakcija._tabela(),
204+
pogoji=sql.SQL("WHERE racun = {racun}").format(
205+
racun=sql.Placeholder()
206+
),
207+
podatki=[self.stevilka],
208+
objekt=Transakcija)
191209

192210
@classmethod
193211
def _stolpci(cls):

predavanja/primeri/banka/orm.py

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,7 @@ def __init__(self, fun=None, stevilo=STEVILO, stolpci=None, tabela=None,
111111
self.zdruzevanje = zdruzevanje
112112
self.urejanje = urejanje
113113
self.podatki = podatki
114+
self.objekt = None
114115
if fun:
115116
self(fun)
116117

@@ -127,10 +128,10 @@ def __call__(self, *largs, **kwargs):
127128
if isinstance(fun, (classmethod, staticmethod)):
128129
fun = fun.__func__
129130
@wraps(fun)
130-
def wrapper(*largs, stevilo=self.stevilo, stran=0, **kwargs):
131+
def wrapper(*largs, stevilo=self.stevilo, stran=0, uredi=None, **kwargs):
131132
largs, kwargs = self.obdelaj_argumente(largs, kwargs)
132133
stolpci, tabela, join, pogoji, zdruzevanje, urejanje, podatki = \
133-
self.vrni_poizvedbo(*largs, **kwargs)
134+
self.vrni_poizvedbo(*largs, uredi=uredi, **kwargs)
134135
def generator(podatki=podatki):
135136
with conn.transaction():
136137
with conn.cursor() as cur:
@@ -180,6 +181,8 @@ def __get__(self, instance, owner=None):
180181
"""
181182
Vrni ustrezno metodo glede na način klicanja.
182183
"""
184+
if self.objekt is None:
185+
self.objekt = owner
183186
if issubclass(self.tip, classmethod):
184187
return MethodType(self.fun, owner)
185188
elif issubclass(self.tip, staticmethod) or instance is None:
@@ -204,19 +207,24 @@ def sestavi_poizvedbo(self, *largs, **kwargs):
204207
"""
205208
return {}
206209

207-
def vrni_poizvedbo(self, *largs, **kwargs):
210+
def vrni_poizvedbo(self, *largs, uredi=None, **kwargs):
208211
"""
209212
Vrni trojico s specifikacijo stolpcev, glavnega dela stavka SQL in
210213
podatkov.
211214
"""
212215
poizvedba = dict(stolpci=self.stolpci, tabela=self.tabela,
213216
join=self.join, pogoji=self.pogoji,
214217
zdruzevanje=self.zdruzevanje, urejanje=self.urejanje,
215-
podatki=self.podatki)
218+
podatki=self.podatki, objekt=self.objekt)
216219
polja = tuple(poizvedba.keys())
217220
poizvedba.update(self.sestavi_poizvedbo(*largs, **kwargs))
221+
if uredi and any(stolpec.name == uredi
222+
for stolpec in fields(poizvedba['objekt'])):
223+
poizvedba['urejanje'] = sql.SQL("""
224+
ORDER BY {uredi}
225+
""").format(uredi=sql.Identifier(uredi))
218226
return tuple(PRAZNO if poizvedba[k] is None else poizvedba[k]
219-
for k in polja)
227+
for k in polja if k != 'objekt')
220228

221229
def argumenti(self, fun):
222230
"""

predavanja/primeri/banka/views/komitenti.html

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,16 @@ <h1 class="title">
1717
</div>
1818
</div>
1919

20-
% stran = vrni_stran()
21-
% seznam = Oseba.seznam(stran=stran)
20+
% stran, uredi = vrni_stran()
21+
% seznam = Oseba.seznam(stran=stran, uredi=uredi)
2222
% include('strani.html', url=url('komitenti'))
2323

2424
<table class="table">
2525
<tr>
26-
<th>EMŠO</th>
27-
<th>Ime in priimek</th>
28-
<th>Naslov</th>
26+
<th><a href="{{url('komitenti')}}?uredi=emso">EMŠO</a></th>
27+
<th><a href="{{url('komitenti')}}?uredi=ime">Ime</a> in
28+
<a href="{{url('komitenti')}}?uredi=priimek">priimek</a></th>
29+
<th><a href="{{url('komitenti')}}?uredi=naslov">Naslov</a></th>
2930
<th></th>
3031
</tr>
3132
% for oseba in seznam:

predavanja/primeri/banka/views/komitenti.racuni.html

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,17 @@ <h1 class="title">
2020
</div>
2121
</div>
2222

23+
% stran, uredi = vrni_stran()
24+
% seznam = oseba.racuni(stran=stran, uredi=uredi)
25+
% include('strani.html', url=url('komitenti_racuni', emso=oseba.emso))
26+
2327
<table class="table">
2428
<tr>
25-
<th>Številka</th>
26-
<th>Stanje</th>
29+
<th><a href="{{url('komitenti_racuni', emso=oseba.emso)}}?uredi=stevilka">Številka</a></th>
30+
<th><a href="{{url('komitenti_racuni', emso=oseba.emso)}}?uredi=stanje">Stanje</a></th>
2731
<th></th>
2832
</tr>
29-
% for racun in racuni:
33+
% for racun in seznam:
3034
<tr>
3135
% skupaj += racun.stanje
3236
<td>
@@ -53,4 +57,6 @@ <h1 class="title">
5357
<th></th>
5458
</tr>
5559
</table>
60+
61+
% include('strani.html', url=url('komitenti_racuni', emso=oseba.emso))
5662
</div>

predavanja/primeri/banka/views/komitenti.transakcije.html

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,22 @@ <h1 class="title">
44
Transakcije komitenta {{oseba.ime}} {{oseba.priimek}} ({{oseba.emso}})
55
</h1>
66

7+
% stran, uredi = vrni_stran()
8+
% seznam = oseba.transakcije(stran=stran, uredi=uredi)
9+
% include('strani.html', url=url('komitenti_transakcije', emso=oseba.emso))
10+
711
<table class="table">
812
<tr>
9-
<th>ID</th>
10-
<th>Račun</th>
11-
<th>Znesek</th>
12-
<th>Čas</th>
13-
<th>Opis</th>
13+
<th><a href="{{url('komitenti_transakcije', emso=oseba.emso)}}?uredi=id">ID</a></th>
14+
<th><a href="{{url('komitenti_transakcije', emso=oseba.emso)}}?uredi=racun">Račun</a></th>
15+
<th><a href="{{url('komitenti_transakcije', emso=oseba.emso)}}?uredi=znesek">Znesek</a></th>
16+
<th><a href="{{url('komitenti_transakcije', emso=oseba.emso)}}?uredi=cas">Čas</a></th>
17+
<th><a href="{{url('komitenti_transakcije', emso=oseba.emso)}}?uredi=opis">Opis</a></th>
1418
% if uporabnik.admin:
1519
<th></th>
1620
%end
1721
</tr>
18-
% for transakcija in oseba.transakcije():
22+
% for transakcija in seznam:
1923
<tr>
2024
<td>{{transakcija.id}}</td>
2125
<td>
@@ -48,4 +52,6 @@ <h1 class="title">
4852
</tr>
4953
% end
5054
</table>
55+
56+
% include('strani.html', url=url('komitenti_transakcije', emso=oseba.emso))
5157
</div>

predavanja/primeri/banka/views/kraji.html

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,14 @@ <h1 class="title">
1717
</div>
1818
</div>
1919

20-
% stran = vrni_stran()
21-
% seznam = Kraj.seznam(stran=stran)
20+
% stran, uredi = vrni_stran()
21+
% seznam = Kraj.seznam(stran=stran, uredi=uredi)
2222
% include('strani.html', url=url('kraji'))
2323

2424
<table class="table">
2525
<tr>
26-
<th>Poštna številka</th>
27-
<th>Kraj</th>
26+
<th><a href="{{url('kraji')}}?uredi=posta">Poštna številka</a></th>
27+
<th><a href="{{url('kraji')}}?uredi=kraj">Kraj</a></th>
2828
<th></th>
2929
</tr>
3030
% for kraj in seznam:

predavanja/primeri/banka/views/racuni.html

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,15 @@ <h1 class="title">
55
Računi
66
</h1>
77

8-
% stran = vrni_stran()
9-
% seznam = Racun.seznam(stran=stran)
8+
% stran, uredi = vrni_stran()
9+
% seznam = Racun.seznam(stran=stran, uredi=uredi)
1010
% include('strani.html', url=url('racuni'))
1111

1212
<table class="table">
1313
<tr>
14-
<th>Številka</th>
15-
<th>Lastnik</th>
16-
<th>Stanje</th>
14+
<th><a href="{{url('racuni')}}?uredi=stevilka">Številka</a></th>
15+
<th><a href="{{url('racuni')}}?uredi=lastnik">Lastnik</a></th>
16+
<th><a href="{{url('racuni')}}?uredi=stanje">Stanje</a></th>
1717
<th></th>
1818
</tr>
1919
% for racun in seznam:

predavanja/primeri/banka/views/racuni.transakcije.html

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,17 +18,21 @@ <h1 class="title">
1818
</div>
1919
</div>
2020

21+
% stran, uredi = vrni_stran()
22+
% seznam = racun.transakcije(stran=stran, uredi=uredi)
23+
% include('strani.html', url=url('racuni_transakcije', stevilka=racun.stevilka))
24+
2125
<table class="table">
2226
<tr>
23-
<th>ID</th>
24-
<th>Znesek</th>
25-
<th>Čas</th>
26-
<th>Opis</th>
27+
<th><a href="{{url('racuni_transakcije', stevilka=racun.stevilka)}}?uredi=id">ID</a></th>
28+
<th><a href="{{url('racuni_transakcije', stevilka=racun.stevilka)}}?uredi=znesek">Znesek</a></th>
29+
<th><a href="{{url('racuni_transakcije', stevilka=racun.stevilka)}}?uredi=cas">Čas</a></th>
30+
<th><a href="{{url('racuni_transakcije', stevilka=racun.stevilka)}}?uredi=opis">Opis</a></th>
2731
% if uporabnik.admin:
2832
<th></th>
2933
%end
3034
</tr>
31-
% for transakcija in racun.transakcije():
35+
% for transakcija in seznam:
3236
<tr>
3337
<td>{{transakcija.id}}</td>
3438
<td>{{transakcija.znesek}}</td>
@@ -56,4 +60,6 @@ <h1 class="title">
5660
</tr>
5761
% end
5862
</table>
63+
64+
% include('strani.html', url=url('racuni_transakcije', stevilka=racun.stevilka))
5965
</div>

predavanja/primeri/banka/views/strani.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
% setdefault('parametri', {})
22
% setdefault('okoli', 2)
3-
% stran = lambda s: f'{url}?{urlencode(dict(**parametri, stran=s))}'
3+
% stran = lambda s: f'{url}?{urlencode(dict(**parametri, stran=s, uredi=uredi))}'
44
% zadnja = (seznam.skupaj-1) // seznam.stevilo
55
% prva_st = max(0, min(seznam.stran - okoli, zadnja - 2*okoli))
66
% zadnja_st = min(zadnja, max(seznam.stran + okoli, 2*okoli))

0 commit comments

Comments
 (0)