From 15d91b40d13c3016fd287c7eed2db1be3d7b212a Mon Sep 17 00:00:00 2001 From: TD589 Date: Fri, 4 Apr 2025 15:41:50 +0200 Subject: [PATCH] ub3 + ub3-dekorator --- ub1/app.py | 4 +- ub2-master/ub2-master/app.py | 27 +++++++++ ub2-master/ub2-master/mitarbeiter.py | 32 +++++++++++ ub2-master/ub2-master/templates/index.html | 33 +++++++++++ ub2/__pycache__/mitarbeiter.cpython-311.pyc | Bin 0 -> 1962 bytes .../__pycache__/mitarbeiter.cpython-311.pyc | Bin 0 -> 1528 bytes ub2_pro/app.py | 19 +++++++ ub2_pro/mitarbeiter.py | 26 +++++++++ ub2_pro/static/images/eva.jpeg | Bin 0 -> 11416 bytes ub2_pro/static/images/hans.jpeg | Bin 0 -> 5690 bytes ub2_pro/static/images/otto.jpeg | Bin 0 -> 5862 bytes ub2_pro/templates/detail.html | 39 +++++++++++++ ub2_pro/templates/index.html | 52 ++++++++++++++++++ .../ub3-dekorator-master/call_limit.py | 27 +++++++++ 14 files changed, 258 insertions(+), 1 deletion(-) create mode 100644 ub2-master/ub2-master/app.py create mode 100644 ub2-master/ub2-master/mitarbeiter.py create mode 100644 ub2-master/ub2-master/templates/index.html create mode 100644 ub2/__pycache__/mitarbeiter.cpython-311.pyc create mode 100644 ub2_pro/__pycache__/mitarbeiter.cpython-311.pyc create mode 100644 ub2_pro/app.py create mode 100644 ub2_pro/mitarbeiter.py create mode 100644 ub2_pro/static/images/eva.jpeg create mode 100644 ub2_pro/static/images/hans.jpeg create mode 100644 ub2_pro/static/images/otto.jpeg create mode 100644 ub2_pro/templates/detail.html create mode 100644 ub2_pro/templates/index.html create mode 100644 ub3-dekorator-master/ub3-dekorator-master/call_limit.py diff --git a/ub1/app.py b/ub1/app.py index 9fff168..cb90a84 100644 --- a/ub1/app.py +++ b/ub1/app.py @@ -6,4 +6,6 @@ app = Flask(__name__) def home(): return render_template('index.html') -app.run(host='0.0.0.0', port=5007) +app.run(host='0.0.0.0', port=5007, debug=True) + + diff --git a/ub2-master/ub2-master/app.py b/ub2-master/ub2-master/app.py new file mode 100644 index 0000000..867c93d --- /dev/null +++ b/ub2-master/ub2-master/app.py @@ -0,0 +1,27 @@ +from flask import Flask, render_template +import mitarbeiter + +app = Flask(__name__) + +@app.route('/') +def startseite(): + return render_template('index.html', + mycontent=mitarbeiter.GibAlleMitarbeiter(mitarbeiter.mitarbeiterliste)) + +@app.route('/mitarbeiter1') +def show1(): + return render_template('index.html', mycontent=mitarbeiter.GibMitarbeiter(mitarbeiter.mitarbeiter1)) + +@app.route('/mitarbeiter2') +def show2(): + return render_template('index.html', mycontent=mitarbeiter.GibMitarbeiter(mitarbeiter.mitarbeiter2)) + +@app.route('/mitarbeiter3') +def show3(): + return render_template('index.html', mycontent=mitarbeiter.GibMitarbeiter(mitarbeiter.mitarbeiter3)) + +@app.route('/mitarbeiter') +def show_all(): + return render_template('index.html', mycontent=mitarbeiter.GibAlleMitarbeiter(mitarbeiter.mitarbeiterliste)) + +app.run(host='0.0.0.0', port=5007) diff --git a/ub2-master/ub2-master/mitarbeiter.py b/ub2-master/ub2-master/mitarbeiter.py new file mode 100644 index 0000000..88a6ec8 --- /dev/null +++ b/ub2-master/ub2-master/mitarbeiter.py @@ -0,0 +1,32 @@ +#! /usr/bin/python3 + +mitarbeiter1 = ['Otto', 'Müller', 'Adlergestell 700', '12527 Berlin', '03067549000'] +mitarbeiter2 = ['Hans', 'Lindner', 'Friedenstraße 4', '10464 Wildau', '03375 23925'] +mitarbeiter3 = ['Eva', 'Habeck', 'Seestraße 5', '10430 Wildau', '03375 45321'] +mitarbeiterliste= [mitarbeiter1, mitarbeiter2, mitarbeiter3] + +for m in mitarbeiterliste: + print('Vorname: ' + m[0]) + print('Nachname: ' + m[1]) + print('Straße: ' + m[2]) + print('PLZ Ort: ' + m[3]) + print('Telefonnr.: ' + m[4]) + print('-----------------------------') + +def GibMitarbeiter(mitarbeiter): + string = f"Vorname: {mitarbeiter[0]}
" + string += f"Nachname: {mitarbeiter[1]}
" + string += f"Straße: {mitarbeiter[2]}
" + string += f"Ort: {mitarbeiter[3]}
" + string += f"Telefon: {mitarbeiter[4]}

" + return string + +def GibAlleMitarbeiter(liste): + text = "" + for m in liste: + text += GibMitarbeiter(m) + return text + +if __name__ == '__main__': + print(GibMitarbeiter(mitarbeiter1)) + print(GibAlleMitarbeiter(mitarbeiterliste)) diff --git a/ub2-master/ub2-master/templates/index.html b/ub2-master/ub2-master/templates/index.html new file mode 100644 index 0000000..6601ab4 --- /dev/null +++ b/ub2-master/ub2-master/templates/index.html @@ -0,0 +1,33 @@ + + + + + Mitarbeiterliste + + + +

Mitarbeiterliste

+

{{ mycontent | safe }}

+ + + + diff --git a/ub2/__pycache__/mitarbeiter.cpython-311.pyc b/ub2/__pycache__/mitarbeiter.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9ba1483cef9438213eb91efdf0bbd695c5d2698a GIT binary patch literal 1962 zcma)6&2Jk;6rb^qzdz!pjYOP8Y(R=}P#njO6B=2eX>tuFa z!QvuIaPXmr90IjODk2V01b+YrBo6%tc99R(o{%^oZk8f0Iq_!gBz7bqqc?Bn&F{@` zXWo0W--p8i1nt-6pWE*fg#O^hS@U!zCl!p)6SR$F^ex`tBZd*f=z`Hj5yjNCEo=x> zxP{)^-ykkT-LgQ5Oa{-mkO8yrfagc(?S_%#=LSE|75u#5=evTRAN&GW@C$-p=n8(} z%cp+KDqRJ{|&``(7Q%5<;=Zim)sk$zB8RhEP$C{<*PO#D~dIxjTv<^G)JMMK|D_dBaD!PdI9Y!LfF@h`T^}Ky-R2i(5`|5G_UxSh~3I5&i{ z6S_H(MY!$bzP$f{5-vNqtLPFdP(`QA_CP)rbz9>p5XIA(t+~zn8fDt1UMTBybNQ|H z{89-@?xWIXSyd(&-GfOXz1hW)-223iEGvbT3tDyq=y<(ppM$ERW_bD8-JkJKIWxT6 zmg-WI1kA`}{q^JhqXn3>#Uhg(Bw2s;SUO6Yk&aj-*+Iq+c8*66RWmZ)7K@B`ko4J} zv>D-Iku)H|Yt@w#I0ot|5H~D11@an9c!5B=5&X?=JaSdA-c?E!SMMurm&W6P3WgNA zayCj}=eh~Ob{7?Rnl{nt$GVMoHO?=JBD)Tw-47vJglF6xrXc`cfUZq~f-nWc)mzPQ ze+yyvOOC4HrZ4nmq`q%OM;p;m%QsphHPQ_BRqwI^&g#qOcO^y5=W_|a9qP);RF9SJ zu`+hF%hNeDi*Yvh9u$M_T!-3q_;&8csGwj;by;v8Osv{q*3S zgZ;yG%R6Y{SOdpQ9BTuW1F4P=Wy>40@K6H}nRw`bcKj>VXLVd3JtCHO*uo3F zL4*oA5+oGOw>YLS%9s7y-=6(BqcILge z`Z*e%LLd*>+sY3jLjQ0wmJ1_g@I5F8NI>@xK`#)&F9n2tfi;u@SSTU_5s5@(q7apY zUaH^$Yvh3gj|*gqgh_-%$we}K#zP1^Vq}KQk~tD5^JL+She$CMs8|sT5=p#31(_^v zq2#6V_$7SDBQl7Casa0)V1fz)!Qd|v0sKWT{J?Y!R-&duSvfQc;2XaXlmHEO01i+a zw~-FoP}%~paeCAiflUg~mVoidK-w}eX~Gm>@`S0tlrbY{3%$adN!1ff;;GF#vy2+` zLY7h92{hGqm|@%06YI?JREJjScHQzqC9_Hz+XhL7JjtfjZN^hFUT(%O#CYQv?<)&) zhyd8!ppE4Hjq;7+S2ksK(J8qOE#ABTNMEnB3f-+2UCaEG(FQ1`wBBI#V(p|}OO5AV zNY_ovbacHHKUK-4@l$?tI}gx7{n>a|+Ee?9%dkcIiyCavF`HWe78eidI{Yks2}Fd<}&G(R^rU5Y10VOmM2pW$@nYy8e9iBKn~zoK1WYxzQt|4JMnL$XTdkZ zq&6-K7^Z!1md`xn-$PRHVg?jfKQ& D_lu!S{e`Hjmb{ptIh5g*vBw_0n_QBf zEWomt0XpdK=tn*h=XR;r-s#)!*0tTI)S_kL2dD-0TQ_IrgFPvtGeDlHFt3Ju%)ry#CYE-=6;Yr1z+H gBwNR_)e(FJ%_k0p!#n%8dMM^A5{~)kJOsD-AAm-6iU0rr literal 0 HcmV?d00001 diff --git a/ub2_pro/app.py b/ub2_pro/app.py new file mode 100644 index 0000000..19135e0 --- /dev/null +++ b/ub2_pro/app.py @@ -0,0 +1,19 @@ +# app.py +from flask import Flask, render_template +import mitarbeiter + +app = Flask(__name__) + +@app.route('/') +def index(): + return render_template("index.html", mitarbeiterliste=mitarbeiter.alle_mitarbeiter) + +@app.route('/detail/') +def mitarbeiter_detail(mid): + person = mitarbeiter.get_mitarbeiter_by_id(mid) + if person: + return render_template("detail.html", mitarbeiter=person) + return "

Mitarbeiter nicht gefunden.

", 404 + +if __name__ == '__main__': + app.run(host='0.0.0.0', port=5000) diff --git a/ub2_pro/mitarbeiter.py b/ub2_pro/mitarbeiter.py new file mode 100644 index 0000000..daa4854 --- /dev/null +++ b/ub2_pro/mitarbeiter.py @@ -0,0 +1,26 @@ +# mitarbeiter.py + +class Mitarbeiter: + def __init__(self, id, vorname, nachname, strasse, ort, telefon, bildpfad): + self.id = id + self.vorname = vorname + self.nachname = nachname + self.strasse = strasse + self.ort = ort + self.telefon = telefon + self.bildpfad = bildpfad + +# Beispielhafte Mitarbeiter +m1 = Mitarbeiter(1, "Otto", "Müller", "Adlergestell 700", "12527 Berlin", "030 67549000", "/static/images/otto.jpeg") +m2 = Mitarbeiter(2, "Hans", "Lindner", "Friedenstraße 4", "10464 Wildau", "03375 23925", "/static/images/hans.jpeg") +m3 = Mitarbeiter(3, "Eva", "Habeck", "Seestraße 5", "10430 Wildau", "03375 45321", "/static/images/eva.jpeg") + +# Liste mit allen +alle_mitarbeiter = [m1, m2, m3] + +# Mitarbteiter mit ID 1 +def get_mitarbeiter_by_id(mid): + for m in alle_mitarbeiter: + if m.id == mid: + return m + return None \ No newline at end of file diff --git a/ub2_pro/static/images/eva.jpeg b/ub2_pro/static/images/eva.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..1cd77e0aa3761dd5ce6e2a6e8598c4d7d3a50404 GIT binary patch literal 11416 zcma)iWn5g%(&rG|A!H!9yAxc44Hh7{C%C&iBm@c0;O_1&gS)#sgS$I~&2!(oclX`h z4_oI;^=Ya4RdsjOIrV>AeA@(I$%14+02mkm0Os!lcv}Jd0w5zGzQ@7Bd5`lRhzrC6 z;^E@r;Q@g_ypKS&0rN2BZGCTqT z4E(=T`P;;XBWHjAj~I@BF|D zfCyk^@*Uta5)6P04&cw?A5gwrVk+3bfS>p03?W%>I}!8{T@!CkYm$02dR}<4DzV*2 zT}#5@#W?ZpIKqk>cp&Inr}CuzWG~(t`Sww|iI<^1C4xWBbo!YW*#S`4uMa zm11rAY5Se#xSpJI{dBlPSZH-rW86=J!u)*Y2Q_cOb`nEQOQ>90OjQIqj` z0|u{=te-HaihtK&Ku^m5m=J}}gMA*O8op-keT}+lBu)J$aZ5w5XFX=aWh5Lg*h~yv z(93(>%(*oxQLJTE<`YC$2;W6~N|?S>_Z3g#ZpdUaUOLS1wLWDJSbYP0eE>4FIw$Dm z$t}g7*2~W58lFSzzrkI9Luw)mXbQ+#yk6JN$ogx1tpDYQf3bi#c+XOcTERXU{NiXr z-n!ku;NxNEc1YlG-yEb4_$sIfBAIXqE&iR*`z>)?v4;O1LQx%I__YDrQap#bEido- zd1mMg;p}<*LP2t(;5k9MaV1-diHX}!wR!r9Wq1AaoK4=NC%^f2epG;=`4|++bLWpc z^)s}Fmtihl%SOK8p>=pobs}ad&nx51&cWfDp^u4rDjP9}r5DjUk7{}O3XgV>oSQ`I zhqSK+F?0h+C|wiq;SJ!ryL$=)TBePS4qqfHUmtMSe2%ri9;z-S2lJR(r7fWMzF)w^ zDtBz4Epi>Nju>K*4H*xN<>cQ!wYzQ!{%}k4K90H`&umsdqollzxM7LPmCb z)!EK{WVLFC+bN*2@W%nG`BmDg>W2klnvPPkw$&46GP?VsFzvD+ zft%^5OWm2Qr!0Tg;+8Rxnx_W~>G$llk;$%Iv6;;NdAUcGHvkO;Tcw{nMN4P07Y+*@ zPU+V9X`Jx6j`%oRlG@m#oA3^PUDK60UrxNmFl*v1uOb0Bff+80rR)2BUdq7SobPyUTmNA)EK2c@sd?I_fE^d4 zREnV(u+Xo?19zYcB@cX){DqEW`DjWt{m)aPo3+mpF~r1Z>89Ads88(#PVnNtk?YRt znHSNmq*;5?MX}mMo&WpR|2=To zKND2PImDSFiQ{7iNq%A`(sf4VkLPwCJCpi`gLH}BaA!cYOPlkZ`<{7M0N4l5luk8n zeY@k<^96HEfB#g_rcWWZefIX|gtK=WCzxE+dgeM&H*-Wn#qwy4aTF}rJm4Yl2FN&0+=8H>H%>R=y(js_5CNsJ4H)5>H@%&<$H$k<`oAY>k+=yiK3~|6+hSXLqnBK z>FN3J8qE{u+;#z=47c;IvZTND-O4(>Ztsg|dIZG*Kb2-fI4|svp5qGsS`Pz854*~X zlyu5z?S;oq^&ZFvtQBWcIkB77hR+gBW9co>-iPnfj9740#wK>K5kYwM|mDe4Kr%_=e2em-Z`e=<` z8>(TIWty6$qGjsTx#CtLLhG#rbav}M7ZMC!)b_g!Ht{cD!JSa{W1)Tf6Ic(ycjI|? zc;9wh4A?5M1-?yb4J%4?crx#rx>NfL?RMSPL`};gs?*qEOJHmYK_=iWIeiYTo`+m; z`;CAS#Y*ah#JKlQ`F$PKV21bB&u21JU|X44uzPH8Mfop#8zjiPXnUm^g~`~e--vLF zgklOkd8C|0OElY_NxJ=s0-rxv$JT|;*^+y;tu(?+RGUy7ST7I26dx161_X$eGCN=< z;DK399R&4m#WZ!JbJP43HhzB{(FKQ=oS_pwqAUJh1!_4DrMT6wJC#E2>6jgeq%41l zmwkT9^)pSJX^k$+bp)qK+LqexQ0@Lscy@D(2+Eifp!QJbOeHz&OJf4%Ja?T4icuSK zSBNa7#3o6NEnEOzbn_@IE{(lX?^Dn0AId3)Wl*Al;p0TT@Qtv2fpSI#8Dc|8c5*7$ zNv~azBD}=Q=c_K&T55Uu8GmTM;ox3exoLzAD|vF=Zr*de)-LwsPoSNm6^C|%qSShR zRbLymr6xG0*{jaky{)ZJd> za}s3AQC8A0jVo5Do8x6{1d}&723|>9mB73g)TWy_As0xsD>yw9MkR2tIUUhklRoQL z59DQH#v9Y4y_AbGoN|vH&o@|~+G$~#;FMqVHrxBPtS__pMQX2D#jsnU6Dl}+TEj&4 znh}+fp%jKMmG_juKK3KneSCYUgUu~d^UiorY4{+pIQh$Q%f9`p&g8>1IJws%$S%hn^SW`G38<@}Av+ocn0oDKLQ0+D!R8=QA5HIP~A_i9)lNEn8bbQnbmm-mQ?1{$T< zdww8pMrW+rnuPYqVJgieT6(2;a?K9GJEi>-O5kBMib$Eu4jN}>c=_d>!MR>Wg3Fyw zB-6N-3jM2&xRYo0 zd%TQD!@F+)eKMn+gH>nOfWhX%2VFtcZXKrI{Ri!GHP)1J9?Tx%=y4j=L;$uJlbrZr zPW9s)=l9&w;~Jd7oRM(!;1+TLJQO0OGH;jBqaI})VimhQl{4cue=va}#dPaqg{+rO zMhA_Ts>q(fBi_tUTVg8>l2Z*&RXJzXWe2Q-9Mzf(r6L%n2#`#86%34wi35{kMK z^F|hA<3vZQ_;I5FGHgtSJ4UBTXwG0nZWc7BcQxBnxsRjM5K#-s;u-B&U~F9fIbR#q zLrbV1M~&usw4_!->WkfKHkgXV`KuPO>86NK;l*dcpTa0CT8yztB>2+;?5mulp~K2N zg{XUa^ydDA2|WDDq#S9Ea^T1aUQvVA*_=ViP@1K!EY2qMmFI+;r7>-4;h;jw6`zI1 z%+7;)zF02wpgs;o{PyG&#eg5e6P^{Slb1ky7&)I-)zu(pjg1RysRMM~c=$ zgeLhZcwyD2DQ*&HL+XP4Pag7ng?p+wwCg6V zqPjQ6%S)bRkrU?1KT}HOooE^oRqhj=uBrta1TQ`#p{#V&8S49v$0Q0yNMx;aFmjzc z_FW&jNX=z{U(kTBM->}0q-AZWY&s<7WP+|c>u~Oj$!TUP`WWEO%n8Gv2mL~HP`vc9 zj*`g@oO$5|FJRqo$+YlpDZRB3N~O{++G~ULa7_gnz*IYJ=4MumwzS7NNQ**UFiS_} zCWMF&K9x%{41FM5AAN9Zr)YC*TZv*qG_;4hruBQwl<5p;3T#{|Rz8yFshx;RIGXpf zvK}3Q7NfiFN1$3vECkwufuO@}+2qeP3w!o;jAEk5o*@H_wC0yIv#Cua^ow2_e}tz0 zp>v_j3YPDKP?629Gm~&^W|yXe7mZso2&- zB<9edgA`Rc^5J^>ka{cA!3fo86z-i14g&jxL#_5S)C0ic^F!QK!z34vkFNZi1WRwH zuPlxG@vP7s=Ej1UvgL|(J4R@iyj^XidErkN^s-GzbXOdDm;-^#fq+mxD(yK%n{ zbT!W#ithDQGqzxO{SR%ls!gqGAapAHt~#6qh5Kmll@~ftN)qQ}0pUcHq4W%rWnm zxnykWDmEgX=H=BqcFA+$+gp|-Yus$$ld;C1Cv*C$O*{Q3lF?I^j%$H3^$k#Pg?Q0i zR7c?%`?3GF3~fnb*}vh_x~35EpW?sf_R2e(F?bcCn!?mS7qfHh7LBi^=p*$ZMqZ=b9Z}C_YCQ+y z%)V2A$uGU>cB5DlqL`ZnJvZJps_4)%6?4%Db+SFuIQ4cFmKIwPjEPR(0`Tkk&y~D( zWW%&-Hh!rzm(?}~7<#P8Jyd8h3Py>sTvBcOrZ*^2QBn=x%^9|#xj~)H_uMl!E0J`^ z%k|<^=rXCrgYUxd-ht%Br5`JsI&6bS95+lTV{Mh!xhu=!s|S~aOw$^t2Xq`Hi3a0V zeqeD33vMDb|3a*@B|9LQ>d|?}V~Mo>x%nsY*D!zw9V?FGjewT@K{Fn&n*j40Ain5# zM&Laj!2`3t;piK{x&X~&cs5rnT8FW*ApKEyq$*vV!}M}`bg622PaenEpov_0*SKuZ zC+3L1BK5f>5jXNn60)|)?-2$*8>xWX(Ho!K3Dr{XuNtROTu&6e4T95cb;O>d!Yss0 zv7}E*(Ly!wfnWCFmtQdD5XX8JiswGQ0i4@^Cr~%<{r%KN_;g56-<{w6q7Dg-))5Hj zi{%V-s440Z2-p(15mBWnRR}GS^*>4bIT2b^=0`Ru;@+dBfn&WL{L&q*bTu zA0pYXONRL^?tVaH<8Q&|>61jb_>eRs#KUci4owU}w^c9onDpddhx8P*NS%EGVKqlW zUwL#dsdeH&Rv7m{`FaD>uWoJQUXXz|Kz=@t_b5BIQk}FehZM)TO@(!rYklYHPiK3w zgAH?SqF0H0MqY+QQ0_rwA+sFfG<@NRqB)9^*%VjW_szQB0iVj73t1z(v=s(HJf`le zd`smffn#^*_l6c|st$GM_0!armb8c}xN-Ig@lltdQf$v8bKv39<8Q&vkAEh@9!wYR zsTOjX7@fu#>+RYZ@#qeA{ah_R3XL)1rK>HzD$3$}2`h#}TPgnJ2hqa@cC{>Cr&KRv z@syNBvb!~5+#ui|GPHqJn@4$2ZTfiP3Gh!Y*Gn|#$d@_jkPyoVv^N^gii82p>nOG{ z7Nuq3wZKxqj&0#S$y};&UcxW9E8S>byK^<>VjO|`s#T#E*;o!Mlgm#SZoH4~N8xl#%oI+xl+Iy5r{`DcW@DK+R$Po{UN3WNZlVK9<-0+K1Z?`MR~7ir+f3HYcU<6fbMRDp~`SrEnvrS!bsc0BaR4R96H=8JW zqlPq};ruB|SS}=)8c&9-c*zH&B`6HOIfptGP`X(wvT&%#|yi{FV$|QkqaBz(*$F6x*dm|6k zMRU~)_*Y_jaG$(TuHVrFX^z4hpv5OFqs%Tvph#iFB&A%S3lKQ&l0J)Q!iR*hmGoZl zGr1TXvGJUd+^2`=qhAIF3=E;IYo=U1N09Fn%%^fX9v1!drkb$MtL4T0rX=8oB*7G3 z^xL{|B1NPDA-4w%tAcm|({VIOn+nUxJlxyUPOaRtFr0lqu2Q}jdW?X&B2K)Y@_xb$ zA9(`m&?7T*j6UPr6r?e4^18t(SH=h88Fya&O$@I*sQEjK7HRAcpwZf3tasK(;X&A!GlMh@Inx zSd)VToo~y1AganxGkjJ$GnoeZmOf%abzO0rMAmEL#y7|lj*m_M!KsWl5QZJS>- zN?Z+~VgW810&&na12HBe`=}-8Z(&=DDeX%ae?=To9DxNUgD3$VKj4uh_rP&lhU1Gl zV?PZQgT`)?Z``A5AD9X%#zTgO`?@2`!Kif`Nl=0Ap;El2X3O`f*cl+u^gh%0R-u2EgehxtmZva~<_Kv&N;un+I$nnT`iqN8t+psslAs(=KFMh3_ zkFv1n543<5a>9FKcPC`@ohrX8clyqZ-zopHTgJ7*@ft*aND_Ymb@>8V?8vio_7_=) z3gYgkgtnqXT2_JzA+M?&L%Pbc3;bgdd3%2kyKdWnebpv>Yj<%D%QH{4gQP{Nw0A)- z$i+wi6OnX_7&52Bl%*#uyS4-4i$1AS7p1edSnMPRM2GYc7>!R^w>>vK4}j}Pw)t|o z5~!WnQ+48ZoM!16>WKp3(h<;CQKC5>g*8@wh~a)|HDDbh#MJL_U$0ImG$xTqv*Na9 zoWVVs7Tx1iGPE;DpghE|bR^ImLf&^xb>f~`EGJ+9aj|3Yq3S=3&XFl{1x_fHBQokh z<%jlSWmyKN)6(X4w6+3+9cZgC4~i@dls*fG5Le7TivTH>fIc~kgWqPTIsFPO#^$)K z9_xNO2DGo#Ym1fMM|vi?SoLP9cWWPGiDJwWBas~;=@8}2+RX-x78&57QF!$whWQM9 z_nFnK{J8OM6SL+3zv1K!@U5ZU7UpuMu}WeD@{r*j zZ?VrOd=6WSKic!Puzg(dDdU?AE_L-@xWh0;MvA#_nyvW>mAN;1Xx?@`Zp1}>I?7~e zSAnsPAE`V%(1M_yCFt9bA+7j|Z|uEtctcil0e=)_NE&Y9NcCQ8a*CmFv6WkMr>}Q+ z?PwQnd2A0qO-tS)UxTr&{Zx6QW|j9L=BF%#)p?r@O6gLH2_+_skmfTdZ6XAHMVTZ^ z1%vYQLS~eo`>IXZqegIqsC%1xhi2@#k!_|ITW#VJg${zci2a+kP|&aA9Ue@$u+g%Z zgwYY+NV4b#5QXw|FlxjLRv1x|a|a3Kg_t5i7HqPQU^EUd+8qQFGis+qo>0a3*hGsM zk8oZMfD%_RJgkMk<|7K061)^1N6luW`~iWad_!kMr9iuN)O7<82>t0BVOCT?*P-Z= zqBn0^cf)kdE}Ux5@Mv&&V zFA|VqzmyiFRg~Fl1m-)d9QHl;-xmLrn8)YVz>pGO&Bpb79}A?m<#qtckF(@-)<1C< z+6`wazX9fE#2$5h8e7NLLn&u8Y32huq)lMV(ioZT-0Dsy`=Reo8JKNKES7x^kr}H8i zC~UpzwJ>^f`8^^i|GVd&9E7+1_Q2?)x0u!zU@d=~Y9+9KrU_UUNk?(3I{A5~WJ0ZN zZ_`U`bkc^2#|XNS^lqa8Bg5~5cCeSR_$C)$B~GNqPu&3rtNu$n0~DKN>;#E$_nsD7 ztd$tYEg!0q*1&CTcCN_Xo(yn@X6EB$f>mzHzMthn)^Ee7T>7PRm;4H zMA$R>9D}$Or=3_u|Ci~*%a2ba$!%VdMZ|Zr_Z2pYUY{nHTWv#Mrkfyw`x=C>*IopC zZj8dYLR?f;4Yy~tF=cYXlpxvyZ!-^Km7yN>OfE~?(eX0Zm^gX(-_zr80gIy5h`lVe z{>ot6`p7rH_%0Go86*WW7+kGH3pzeyKo%*mYIEoZJ@NHMMPh3JoA3QKi| z0qh&VafG1cE|^q)-xc;^S5WQ`!N_BV(qsF!ihfnifne<{z`xSQTfxYvOrQE@e0-Cq z1<~S@pIiC*T%d`SyzR}p=eKciT7FPMJTOr;QSxDTaTMBNvIK8kk5*k6-^K)I`$|80 zArN^s0PmJzzN_TWYEt6*o(fOroRkc)_krP)1Xp=@?A#1Lc*NP)j zT22d?9IRQ2kIVGQf*(crch*ggm?#-;&|2X)w_{YMHG$!igFu@QElWvg(r9h-PE(Lz zz|>DU$wp0}d7qRx{cK!@@ma4CE9Swf6ZZn%I{b;XHzOl@`nH-jbu@=;!WrfNM?$--r2nbEPz#jL)cf6gS>7V}6{H?gbOADxJ~i8GBXJ5jKLsyrLYYAP zT#WGD3|i;tj@ZuC^OCJO%EoFlbwW92_26%)?~BHYOS`pXTpaYQRL#8X&k{oBx<@15 zbHzLOf0B5akA}#t=)GoLH#m5Cp9ANe7YeHG^RB1*zkm3CJ_p>=NaE^o;I==3mK(*_ z(A1~=CUCojL_X6qOlkD#B)AXW%GJV*@J~5^sa3`|9IuV$U>zpkPOaWL|aucf57T{L=GPxjDOL*|?HVp!^B3Ya7kIR*%JJ zBDF)oQ3upiC$?_OD?typs9u&JhrYy*1+~bwi30>3vX^*Tyzct1auzT>t4HrcWa&@A$JB%pLR3Xyxjhd) z0jsUymVq)0tF6#+)Uyy1v$=ZVo%Z<1YGU_;ALB;Xp4sBw1PAXQCE1gkn#e+;NY`Xy zAIS<(%b`)lGfm2}_D8is<+wHe&}r?QZ0Z5k>}2?e##y%o*p-|qbETt@Gz)Ak>`5uF zM{mVu8KpJjMSe29r~AE_jC_(&gv173I*l-kz76q~Qua zPz*jyJluR;?+&Qfg!LqipN8ZY+E4XpfD{62(4hWEz(6sWgL&s)b z7^)Kgcw_Zvi2(TYMX6h{0Y_rN=mZ)`{|hlBkNn!fOJ&uI(X1b3H7=pxkJpHJ8LZd% zFP$$RgwV;SLG?lLW0Wmac^M@o%*J2Y?4-bRYF{3SCzS>$M`IzP3HKw!uVz+OXT&YA z3w2js zUU)TtR>yN^%yM0s3@A{wRxOwC|X@iZKq zAqhp2-2vZ&Lm?&yGwCuXGhwlt5mIJsSMvx47YPmXT=kSHD`@I)kDP90s`2`i06h54Q}wqe;|SX215N$R@~5wOYu{S96z7C98L?Lp!C#+J20*or0^t6caj}d z4idmyj_P4r2$*U4`%C1<9A7d`WF}TvfT@vDlH>3Ns?2HCxmvyE?c*n(GISf2f~V%G z3y(@%CHC~79%Ap4@}9NZ6w{#BsAG$Je+4ZTuzCE+a_mbo$R~2*Sua^Haf+#O9^4+8 zVoZV zG?c7n=af}=QuA2c&K5DDYL4NaU#8Ou;`NIA+Itu8k#Bqg8#+fcLU>8lk-{Btmj8VB zF&i0Jo2WW^u4r{C*@l10i@nhB1^o!v{M5f%S68>_g%LQ9GmE|K_WhJ^=%HqYmFEVx zb84<7sx+09B=(BNyg?hGRgT_ABG);VXvZh$sq6w}D)+bBb+-hTh#e4 z^%4_97{hdTn6)Kxzu~(Yj>c>$Yu($r-ti%|*+B=^>lZ}DgrcJ+YxLcz zk&R43!Q4k%3r4yZ+WYKlhI+lkqUsR@RubVQUQ&2U+G^C>CYv?1%aic_RoZD%MKJ%{ mUHt!IB~I>N(nxm(UW$-~MKXF3GczqdyUrs1pYsskmi`CSYqEs^ literal 0 HcmV?d00001 diff --git a/ub2_pro/static/images/hans.jpeg b/ub2_pro/static/images/hans.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..51b2112d2f12a2a8f083a3f16dc9010d3c8b3f7d GIT binary patch literal 5690 zcmY*d1yt0{*ZwWtES*wIvmmgvpfv0*OD!PXpfpGbhzJN0N-r%P(&eszDBaT12uioo zqM&@d@BfSQ-N`$5&NI)Xc$Hu_GEy2wvBqAmz#>5GegNe!tii(MV$jHd3 zD5;phU{(=+4zAmxlA@xbA~!|+-{zm*|H?ng{|x+3D|+1l(2xKtzzRNy2f(8N;nRSw zdjPf@j)ea({XYTW;S&%N5#Jc^fdRZ5jR>EJfPjDq|7HpZ55T7(pyehcl29?QK8J+#knrT|1%Lt{bi){*2Dk_0fx%hXc;HANk{jSAc^AgZ(~B*o zrJ0E;cy7n}Fg;9WJQ0gj(d<%~5alL_WgHLVQ zf5z*>Xq3ZfI+VdA-x@j{!}$p8>?2d8F_zo>jGq@x2zZj(TO}*JgkHL^^if%{Q4Gn| zb2yT8no$$moRD@n1hje5hwVOH4H;w6T7a>|D@L`YQggQ${8G|_N{%u)9Z+aUO141G zC7OSYwm$ICs48T!$>NLAtfEiD<8yoq;u>`i95~ab>kW${bP+f?XNh+hPzW0YE|D9}h ziV*#r#NLqirP{-f4pnq>EVbxMww3$uTs@w)8w}zVLf%FAo=HIa(a(h3oENLU}67H;yqB?{EM7nfNBg;-z%V zH)@u#wW_a60-wz?(6oC~i4d;Ay;e551O12)Wd8@80mjExae!|49nlevf8?oTQg?aN zY-9krC(KxW6hiQomYh*BVY2_9!t74^{@ZRmt-mV#n-P$7etEJSQ{dZ~0L89S@vk9^l_ z1aGCZ?^Xi)?Y=_xhd8!y`+GhPUXkNhJAb5VmJ-?`jCwCM4X4>Fy+I*-V=9XuiisG7 zlk|e>_D=E8(m%R?h#GY%-EXYe2PXaQ2>AFIL!V{=XN;LGC8jg;Lz9Nuki29cqwE~Z zlZKU&vysFLKgPZaCicj={_ir3l?);dUQaT!uLjvdh*S4b&7%9e3#}=fPvs8b;qXD?T(5Tw?_; za)8fWc#itc$)1^VG5(w|FHM>Ns=|iqsE&e#~zN6Xa==%yi-k zQ(=t|Bgy0Zcv<($-GWSY>h%+KPAmsk0MV0p^q(Z7EBR5i(E2q#;q+-0j$D2tBrQ{? zTprBIJjcni3EdOSvX>uyX>($#S+aR1xbr2!=Bvv_j#($H`bx}MM=f-w#OnmR-QYJ{ zoT4Q6w$(qWKHXB=RQK&D7mxU$srE1^Db8Mns0*r%A87#ABEe7BE|O4BQ!nLJfpR4k zqzlE8++U<8ANS{M`t$dGp5Ds>dLsdp`?GcxrL2k+C}o{u_tSIVN#}Y#_?jF3jBECm z07`O=nAu+e1r=k6VPp>)E_i<>5ERkrRFdtg3_~?`-H|%{GN18$UL&E2-@ldZvD_`K z>KX)2QDM{Wv6p{P-jT3Zl;1Uwq1#=ncJ}%LGukiLT|9p7IaJSn)iYZdjgNFvl4sdm zWC}UbS(7K!gTBL_TFTsBm_WQ{c6GL(l}31E<0WyHP;(J@AO^A<0G|)u)hsFp@-;g} z-!)C@KY3Ye?Hpz~L5%DdJKvxK>uoorC)d)}Tn=8twuNuA`Ai0Fcr4Z#e1L{|6C|Lu z2wSEPYWY-}2$3Pr7PN3#_qSeai1il$|K)GNUa--)&HbocL_aDAY;8eJIsvX9Kt%m@?^aF?MSw8hiy z@wx-2Fy#j7^&?)D3*nEoA~+l!It^(4q4mn+Y37A%9ik{{AoMEa%`+6tuuS>mgx-+J zm1dt^137$VC)UvAqh#5Jv@C@b7iV=-YqS#CEmhFrq)RI$f5M0i+NBzXbol;9@@Xxk zuRkK+UkhGiR&H9Oz+Lm^MV{RewiH_>i3afC*PT~2Da@BtalDqp=2UMYOo zLK36V@n=N5w#D>9#=>3LEcvA+dc^%j4hNHJ#&J8#$NKXEVV7Kz4L(#>R8Ju@+Dg~* z8c46^mp*#G{WcUQY=__T1<7AbVdi>Gy?~d7X@LOPsOWa>02lsfj(Cp53pe zit;-tr>q@o*;{KQitqUBd>z*jU+hF9Mbi?X_zwC)tn22+BF!hHT}Un02=}y0qZU2XiqMu zACoa1!wBdGmz{fXX_#mFF+X|rDY=&Et<8ZVHnwDp+aBs}sH*i84E+$2O4`Pa~B#%CSNSNh*p? zGc+&dl3!Zyyfl9VM=e!k$h=ov1gU)~~UrDZ`b z_nQ+9lbOX*>$sHH{tdu*sg2d?&|7=JSFZ*-!zdnLVJ_sXXK77pBEzI z=kVw=$NdwO+a=0W2I)s&c@_G(YDrO`u@tenW=QSc_f_y2QZuXnDogfVJQ(M~p?-B5 z+m^#}M%7uD<=&JTn{ja9nJN%D*Tp?FGX1%lF>c^rkAJ+A~BV zX*qMyVy~CJ569( zz>^k?s?sgR3LE7`>)s<3m2g!X0x=d0csXxML7KDe&j(@dYnX}tAJHpkiXO@vuHsa~ zHK++wV)-m)S&`))-9%gWg+PiseA95U7SJ$_zM09@7_D9qn(nPnjE8QithGjF#Tny0 zGdIFUVF^mBljL%hBI-Q_r;1clWNNm8;O*25!eP0?blh840fzQWnI0M1IP&bY(bv_C z2ggK@1H_nb%wc{n^U}Hal`Tu3GL67++?O7PZCt-W3svvU!)ORl?>aYWz^& znyR=`8>-=gCyFItElNlQ8WA@-P;I*PF)9N$#$uAjXDq{k_iJu0%Hg*`@Lo^Xn3mey zubsL<-FQjtgdT$idXrwe5@~FawN+hV7;N0{Zg@BNQZXH26QF#|nDQa2tXsdE)jl%? z{Lcr?JAtN1PMeewk;0cEgek?OyRaBgH0TVdF7i9!_BAVmIe+Mxy$~NxFwiz`bI|@9 z5%k$>!Ffq0<$hPGKE5T*_vVR=fj?z0U6+RTe@wbA*|7MH;(M(OO}WO6tui{*H|+Sz z95NiQ9KNaHK7$$7ewS8zP%G)%Xg09Z*F9>o>@GY>Kbak+u3t&aMX>2V$Unb*4fv3b z3PWe-Ta`giM$9cdb1sZtDB-Z*7M+c2qD{(HJbO_;($D49EYdcq`oAWAnvx4Km*FUt z8JJ;G*0Ofkk?y>wX|jJF+&0};iEiZ#jKXipJbhSLO(Hva6*TPeG2YUIIkKYmRW&u9 zG?9;-)n<>~ZlbGcc%e*NuCs*&jZd7?k`TpfElib0MDo?==Wp6N#|g_z-i48;=wVu0 zIddv3jcSatk>zikrjDn`!*`uRev5a(H*ymuAKTEr>MmG=9p>~!u8XE!19pc^9iQ0H zt_DR>RmKQcqS8$031!s>p~PD8Iq-CjiL|yLrt8R7x9#J~n+1vI3G|MM$ey+EEkUMM z5$R*12D{%VtN?a!UP|PNaOm8{(B2=N8d+3Un%?=_uwN+$D2CDEOmfpEiw8HYDt%2Y!BdhrHU4s^2e5)Qh%dJbgoO@a zP{vEa6`=}_01{{j%qXI(({v)?^h2amgX2S$jsuR|0Xayc><7h2sb$q-&D7!eU1X(f zNjqx&j(rBUsKdtwe42fbU_TnKcs`ev-)gKprqL|d{Q4SL726K=pyG+R26_!F6cYb- zQUB=|`=EeqcKwBDUVURWC8|7Q`*g)e@nW!d{ak?lQW5Rl zx&?l^2H=oU*}cFW2Uk({TLSd8gmcz4kNG<+(4HL5!H-wYw`<3`tqX|hEQzYWJfbq{ z+?GF+J%GC3TI~K@j_V~bL0&S{tiYx#mtc4zcja@K0-9ZrKybJL%Y9ILxUlEnxd>)qm^(a+eE7xGCGiN4$pLPQP8sqB5?o$9fS zykKq;1fUU1uT4zy&4EDQwq(e$(#hK~&X&=jWP36jo5czW;xI*|Dsku}a!H=I4LgdO z#Jtb7&RqT2|1byg&{?NxnzA4B1(7Pt*_f7yEp@CI_SQPtellwD@F(3w@%^ZG&raLc z6kf0{Kd|@a+7)|KKB?6x6I-^Krf-y>>0ZkX-;hs7D-rx1?$IF(y*pE8vw=R(zJT7s z$vRApm@}tM`^8^%y-fAsf3)2_D6mNTOSA1`nKgtF-niQzwylsCp%K@Mvp30$eRfON zTCF0nESxa9Vl!l;Hu|oOmeTvo*{+R*qAbm_{lNU41)1W$)&Z+6Kl_v}#frhfjpx|# z1*&6ym*kjNjym=YulUKhAi3z$b_7iui)m}0+A6Pk;eiVVJd31Z# zb1AZ-F+h-)4YjX3>Wiu{sC;N7vQo)lBQ(BSQ^;yD3-@5kuZYIt<~w`I7cil}KlY zkS+9=zPzU;vV0MYW^Cy6%4$3n{~&N=W(k-FIdGVW(#-kuxzoMT|C`P z?^v+zD;N0UMNYNkaID#waFIDjN9*{IL=~(Y$xTR0^PjtCKtiH@a|b~@U0^)##goJl zV;B5ViMkUG7`A7YeqvXaz_5QZ$V9BA!XOtX)|2TxaN7|oSFu%@cl6Tm+u6+D2<ABUkIm{>4zh?)kh6-<@O9NOtgj1Lb%4hP&PXOj zRPAlC*NtTenYSEKzn<@$=)y^joAzNZ(6?D2n> zFE&nQ!1vy7XU^Fp=%S|9Bgp$*(-xbVi|GdcTGSZlOMGY1y+C~-$ zQBytn-}&Ep_ntG~Ei?DdnR{o>nah>SPXMTaj=l~62m}CtR}8pZ10(_{NXejdS48_C zzCtJs4U~?SmX3}I#>~tFV`74H3UR~P_}Q75c*S}61%<`L#8|FL%1MgI-V_xR22xT| z($dhvp-{LeCnu+v=zmE}RQO617XDwjlK$)XXZ?TjI25btSYPX_2~8a z;(~WH=qdQ}2Mg4AfZWj7I5iEBE&X7g6$v*Fkepl%sm8y^4YG|bcX(Ldl}V84{AE@X zT1kVtR_|>(TZU+3P~jAB-Qrdu+X#4iEMjuD#qm-04xNdGp}-d$M6qM{g}7 zM{I}S?K2M4R$*WBp{jY1WV6`nf!(uwy+W_~R=vWsuy`$3`qbDy1DpiE8ikf7FLk+5 z1Ij$kVmlvbSV*oG&r}UfBq!nK1HtKqfaDY|njkGVKWc+Hley_UJ8)NTO*}ybwE34M zTY6S3crPE{?tpynE;M)BMi-bDXJc6}q@61Hrfb2&a!}3yUdPk&G2A6UU&)r;zGigC z6FJ&#{Pjcc%0zM@^>~V<3uM@8c~up+;1XuobH?-%JN;K}N=e$recifiz*4J3)0x58 zzp(WZFcHVTC;rIVjaLpO05F%m?W=5(sqLWnBJ!RB zY-hqt+}^3#SZJk;^`WWZ{RMI>H~%OmmFr1WhFx~4s|88YQhNzCIjXs9;+U zl;jCpdE?zS1&uG%$-+PJNYSYMl$|mZG}sZl`yk@x6o74Y>4cz?SLL5y`_5(Eci3#Q zTy;djx%8{7VH70HAk-M!lC@hopJ+GU>^JwS0m1(56zFL&!+J7U+6vtX91_R48h z<(=<)x@$+oDlUh7Dz~KrD>pO{Eb08ebZu>BD4{wxAi+ufcX& zolVyH)kv;izRo>vG!T)$V-_FgNT}$t2s*>-#KNTKN1G<`#|yG+VaxOvF)q&I{EZDH z^r@M|dvM?$Rd{Y9r|SEF+~N=?9}dNz$fYBhCngU(?_n%uq#JXU7ylCO_Nne4doFaM z{j5&wKktgl-nHwcS53vYG%=3{sV9I&5yex$OJ} zr`4(9(=YR9oA+=0GUD(sbo%}wlmqd)r|VH>0O7OckhJV@zV|zko@@ORgU*^$_Ftsr zjPpsG>m1f^&0e5Yc%w}Iy1k3$_n`*{()CCFt^;Sj?!a}tXn#ga$m`7P&6w<7r>V*< z736C|Ka%DC)!rkl6dm}u@qmp|Orotm^v}(noGFU^YU6C9RXmBBE0>l%1u~Tv2%F+Y z#8z_W!L`7YV89scs#Ejzxe*#rEpgC@IEfBW-27&yIYi4XRsCkx6{5+RE5&WJVeH77 zJHxkQBq%Y7HRkmTyc2P z*`xlAF4chBn%4IZoS96D3H4r3iCY}2KLQU+gwoQUnUrxC$79iM&zprwv|KTuCB9s_ zCk3AmiYGeqU$cZN=o1PG3n*=4PR%wv|sJsSuN6 zc%$v0HR))?MPYTYn7Kt2l?Mk|PQl5+#w*GTC2fg{Z$`P*q&<$lN_We`hQS7pd`yyf zEN_KAj~`qsyfBvc6Gxo%-b|}LIw(2wZZ|L=y&c;1K}Zq8yHpF%X5Jb6vLzAjLu>A{ zf9}GSvMo5*=-Lvja0;+9?q*V9phJD@AgL%2D2GhESRV34NG*6%pCV2LMG*#8^%5^a zrpaYFP8n=I$Mh14vo01`uC*06B_Q+Pd9>2%Te=Ri2W8?Fm4)5dnuI!p82cc?`)o-q zM0seBnM25wyjoLijqxuf!%aAY#|*M+u3^K?Zx@Ac+pVX^0M%N-v6$()S8G3)j}rPj zD2A77wEe&77n=Ku>CMCOsoFdSO$%}k3Ib?fH72!IvX;`AosIhTrP_*+_U`T*LP>yp z{cREI-4~xmh?T|J9tqdZvbk!7?TrG*@ZN_0o(n7}bCGGYi`b~P%?EE^FeoQR)G|WM zU8F#wiF?h_?xr_n?8YP8ITI}@a)&eyVBThr|WIUZo_tY>6N+fER=b_?CbVgJP-``dgnGYL@bmm zxL&b!R90v-jzj3DRi2=!nld69wueVJQ8FzXFG=lQ`}I4!Zoup%HyZlD52h#7Il)vW z=TuI8H^&WW6UN$mxZ*^QOV8NdI-?5k-<5Bm{rt<1zAN4HG>pSzi{sJEoJNH81LF38 z!1ZK-IlL4;WZB(%temQbUxn(v3g5#W1QVlUcC4=7pEiTk_HIBh;oc2lQ_j@ai;S%k z-U~0InrJjmy96^|9|#U8Gu(x$`q@`7rXsOe7sW_VfyPzHqcrx)%&a!A~SvjnEiYJ@+{RFV4lwrq0j*TY%Mag~M#) zAQ?o_Ai&jS!~yE(8vUIi?V}K8oeYI-v@&SaYpfqfky*FhD9rpOo8sF-MP*O_^UUYH z2`iD4Nm>7z{4rr>&HBi8%JOzt{b_s;N?>Alq~3g74aLkrWg#sSdV&{~O`k#Rh3V{D zk8&-;%wrYyn(WW8gc1DR!^P+2r-T@zg|DY!Qe$BxyAWInwgFcZ4`CM5r7aT()^*zQhc%;Xz$HaHJBX#Mx z^Zmi5gF#XgIy9E+UA)y_;lB?*Mg26@-7H?>;(Wez{y4{P3sZzxU(>AEb;C?C(z+qp z;k5|nIb-;kV7X}JD!Vogg0su?YQNcFVNf8Y33G$zO1n0s!_x0qT8%ZNTEc6gr{WVR z1kWlbFvQegP5vwi4i|`OEX}w8rVX=75p}6ZSpL(KvDpv z?P*!qB)i@8t5L4!0=P94Y;W(k8Fb@F2-@{^!GxGyD)(dB$2B=2cb4wydk5!E&I70A z55!X<$uqM>-I!A%qBo&nyEfLVv8$&`B0$!@s(1P}RM=wTG`od7~8hbQXGpZ`n#c`$B`k+Ai5}^MlbLBv6jXhN^)6NMX$`-yqrwjb8J2F-Z z5nx7pP0kgtUtmU)1vw(!pVXJOpK=|na!P9}+zsdWow7V3k+ig93eq*ZyLiu)H|gp> z0~(|S+>J}|Klqt{KO{Qu1zvI5;?c%C&Sswd_y;hS3wF$*s^Fq)P{E!U+PI{#bz+a8 z8Wg1Tb@>t?r*oZ==b;W8VfIPsvTu-R;kfwDu813E`u^~$Cd|-zx>jS6Ghn~__-9)2 zScnn&?nj0W@pN~JOnX*F5w|G;abFiIZ5*%L$^>7-?MF8e?j(BR>33*I;o@q;q>S&x zV@DFGS)n`P>28d}q@)^;KeNB@h>kIi8xS(Z*J)PtMLj933+fOj#ZtbdNuRG*Kbr76 zE;F|NT7B%$e7JS;V|t}(jY?9mVg>sV3dm zJu~)?SuIjB%=5oH=u^8BbfGLlWun04#vyu)^?ioQ()%gC$7rsZ|mNM5WauR8N!UV6^)5Ju4&U66tF{3 z6i~rC5m&ajTYT&jg~p`fMtX=>iE?n4Q7|-Sp7%jR5x3X_AwjU zw6|vLB|DuRq2gCh3b^7>`N7+Vv*91F;WtJRmPg~Y6NK08lMQ4=ofmKElOS!}*hqHR z2}2cQ;L!Z?KCvj=DeHS{$%OR{MgO;b8M_*}3PG2E#Z~iW$uv>+oh}>9;u90lZ#g1g z?KuPM>QoHMIEW_cMmCc`4_f2kBoU*^V&A*8z7%X7u~F)tMuAC% z6g$Q&d?C-ux9=2%W@-AQj7oYNp_JA?wsSe1&)*>>*egcAwvV9lQs%2mW(E+t)LmXw zl?rv+{E?Q(fv^t14=)T}C%H7RVV)|h_*qkM41ph~osdQ)NFCF}8B}gIoP`R`vnEHi zyuv4qE`5I7G2mJAQ2zT5zee#`qr^c0AJo;L;le;(EAH#jmLXv6xE&YC{qGPHsNtG% z$<%s?xLi57+9;SDPD2V6SDU1veD_V~wUM=gM~jeU!-X%!AGKtX5N4KRkjp1oe%ch6 zL*$+7p9ZH10yQ6szf;Z-rvrYY7QjQt#XtO*H=UA2tS_p92Kpb}la2mr{Uz_}^{@bX zPzKy5T@5a7q)}Au=tqhQ@#SHx7bZ(L4iCz)5w~Poc4nS%*ti?N;KXH&1jQwLgIrO z!Wmkzhs*+__%8wCML%QvTcnnvbjF_cn0kiQ76JDGt!!&c$2lsI*@9xfIaT%~z0gO_ zo_j?nZH0>`cdNIyNp@u361VCd6KZ+Lcq&dERU`L|E&HSuHENSX9?az{cUeMiOuKGH zGq6~6%4E^byy!5?m6~W&NAa!$NTbFj!KhDPxDPCfMUhpKigr6@0*fq6{F>-l`D5$KKp5HTK}PqSSh^{+DISCvWp*X_A-QrvEu z8Z_jgI|=k`YKblf!m_iCfyk=*<;`Gm0uIIO`$-~i{&j3A z?fJgeQ14=8g}0Tw!L8>xBeub0j!H_NzH3ofHl{Y(TPx?9`CQ&b#(ChxUHu+}TY2P3g?&$GaHpn^)am$*Q9kg6|s# zNyD)tK|dmrT;C`_?{oiMsKr_@diZ3d9bWsiU(R zpQ#WJxwh&y;f%f%qj9PWaw|J4Gg62b~Ca^U`ehtm#=e-`*`NZRbPbr>>S zxT`oroK*UabcpYovO`iwE$e$Y(yh=7u3PS^Hi|FzPKR~9*2i^j4g%x=fbXCo3NJ`` zQCY$$>pzS|LW=%#Q&~kYByWsB9*{_Gec*BtHPvK)MeGpiP1f*SDY#vwdQyaDh~Ce5 zg?JU-IlCG{u9uAel2oced4lU}4Dp6(;u@tc>-5%Cy=NISGwSkLIhFzf53Nkz7Rv>T`Hlp# zY~S(^@yl98(yniB`F?6p_KU0;IY5JxJynOKE~ZburY`6hY(35}x`=wq9%=qGAb{)o zrocq@vgH)(r;o%_^#T4jO8T-TS&s+8xUB~yzukI{V*aw@uA*qtd4^jhk4*jelGgI= zVYD$CVEyjd?2hWHZ^P!blO8TwF%@3#;wjlMtv;R(%Qzg%SWOypX(eT$l!t}#cA!8g zP2#>-5I;k4?$f11NrvaGGCL+D@Oqt(C5TXBA z{btE~Ow@;;*ocUjojX+lUPPd*%=Kp6j|jC90UCm_!rgsInf_l(%QF4l_RetWB5bxr zz{KaA_K6QSHh}a7`DS1E@=54-#z7 + + + + Details – {{ mitarbeiter.vorname }} {{ mitarbeiter.nachname }} + + + + ← Zurück zur Übersicht +
+ Profilbild +

{{ mitarbeiter.vorname }} {{ mitarbeiter.nachname }}

+

Straße: {{ mitarbeiter.strasse }}

+

Ort: {{ mitarbeiter.ort }}

+

Telefon: {{ mitarbeiter.telefon }}

+
+ + diff --git a/ub2_pro/templates/index.html b/ub2_pro/templates/index.html new file mode 100644 index 0000000..cdd2447 --- /dev/null +++ b/ub2_pro/templates/index.html @@ -0,0 +1,52 @@ + + + + + Mitarbeiterliste + + + +

Mitarbeiterliste

+ + {% for m in mitarbeiterliste %} +
+ + Profilbild von {{ m.vorname }} + +

{{ m.vorname }} {{ m.nachname }}

+

{{ m.strasse }}

+

{{ m.ort }}

+

{{ m.telefon }}

+
+ {% endfor %} + + + + diff --git a/ub3-dekorator-master/ub3-dekorator-master/call_limit.py b/ub3-dekorator-master/ub3-dekorator-master/call_limit.py new file mode 100644 index 0000000..e7b7470 --- /dev/null +++ b/ub3-dekorator-master/ub3-dekorator-master/call_limit.py @@ -0,0 +1,27 @@ +def call_limit(max_calls): + """Ein Dekorator, der nur eine bestimmte Anzahl von Funktionsaufrufen erlaubt.""" + def decorator(func): + count = 0 # Zähler für die Aufrufe + + def wrapper(*args, **kwargs): + nonlocal count # Zugriff auf äußeren Zähler + if count < max_calls: + count += 1 + return func(*args, **kwargs) + else: + print(f"Aufruflimit erreicht: {max_calls}x erlaubt.") + return wrapper + return decorator + + +# Anwendung des Dekorators +@call_limit(3) +def say_hello(): + print("Hello world!") + +# Testaufrufe +if __name__ == '__main__': + say_hello() # 1. Aufruf + say_hello() # 2. Aufruf + say_hello() # 3. Aufruf + say_hello() # 4. Aufruf → wird geblockt, habs getestet :P