From 932d17d12a95e63a335af4f9122fda24dbf2bc74 Mon Sep 17 00:00:00 2001 From: Martin Putzlocher Date: Fri, 8 May 2026 00:17:07 +0200 Subject: [PATCH] =?UTF-8?q?Kategorien=20f=C3=BCr=20Gerichte=20erg=C3=A4nzt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- db.sqlite3 | Bin 188416 -> 192512 bytes mensa_app/__pycache__/admin.cpython-312.pyc | Bin 744 -> 849 bytes mensa_app/__pycache__/models.cpython-312.pyc | Bin 4679 -> 5919 bytes mensa_app/__pycache__/tests.cpython-312.pyc | Bin 0 -> 192 bytes mensa_app/admin.py | 4 ++ mensa_app/migrations/0001_initial.py | 30 ++++++++++---- ..._preis_alter_bestellung_status_and_more.py | 33 --------------- .../__pycache__/0001_initial.cpython-312.pyc | Bin 3922 -> 5003 bytes ...bestellung_status_and_more.cpython-312.pyc | Bin 1569 -> 0 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 159 -> 159 bytes mensa_app/models.py | 38 +++++++++++++++--- 11 files changed, 58 insertions(+), 47 deletions(-) create mode 100644 mensa_app/__pycache__/tests.cpython-312.pyc delete mode 100644 mensa_app/migrations/0002_gericht_preis_alter_bestellung_status_and_more.py delete mode 100644 mensa_app/migrations/__pycache__/0002_gericht_preis_alter_bestellung_status_and_more.cpython-312.pyc diff --git a/db.sqlite3 b/db.sqlite3 index ac45a760a47b10e6b511950e3ecfb176f36cd25e..6180d0fa626712bdfbd636a9d81721ed53a2891e 100644 GIT binary patch delta 5498 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 delta 3635 zcmZ`*du&_P8NcV;>&Ly<*C%NnZsR1jlP1p7xlg}BQ_@hHG<}3erzL#^H*pga#}2kr z`T(^qfiAK;E46RJlKw67bK!Y|#%>=8owWHDmh$43GwVSxp zu;ic4`Q7jQ&Ue1^o$s9epRxPjVGp`EA3+fH_z&^F?@(J0Xw6MMi8vm2D;ylga^@}7 zQnK8%k*#9h%4MHn;+xA&ge%=W8BL@k!;z^ep6A8kv1lqbGM*WpN=0Mo;Yd6aO$~34 zrZdrad^#~UoX$it)0j_;4o@aiQIQw@?Yz>?2i!s+EX!d<@yQCW_ybaziKuDlPDj(} zSTd1TUvxQ2v5CZodEOWDi&8KkFHx(V4QP>7{Qi)lKJM%+;$&V>Lh3oERK!VAPztD} z)&3$*49dKy{-`=!%!z_uR!>!jia0^xgCX^c>aHS=4+aELm22c;P7?h=_2C+&m=gq9 zRNt(TxCNhsAxT!htqCq#1+f?}tE*~@RuK&HGS90|-^K+b*)OUe)!tDw7RNWVlKZvwCW+11j%s3VA?5aQ5rg0)`- z=qh>uy@__Br_dQBqkiN-(0(13iDlI>vh!AN2(Ic%(BIG!A%%P2fWWI8iGjIAbP zMz*wZH0iM#>J%ui)&v(?Cp@SqPpn1kYSwE|1H2&ZIs{q)Y!W5ISu~a0Z=UzF3 ztyttB&^2@!y^r2Pr%?)RLA^-A%YG`C{l>0--{ov#%PH5g#nt4!X38j+W0BNDpbo8k ziEN|0RLh;Bx64+^USr>5Pp~^!fhCwL%-hUyW)CyO$c&x-C;cvclpd$Ma@jd6Y-&@F z_cnu8_1)ff(4yYJ*sQwy8m;ao69MX58TFHXr^Sog-VR2++3#B4m~W4ac;LCi5vZD z54Lf6X>T$sH_x5t2D!UAiL2vE zZQt3h+CJvq;9lSkaIsvr+NL&aso2-%pg;$(j7Hfxa?H9 zWl!7HGl|C7s-e|WgM4E5Kx$&_!Q`OaAK0Mm7MJgl#>aYwdV9r`GPq~Qx;=NL*2yU$ z-LWZgS3G_1&Yqs=?tz_Ct47nU@`?<;iqa$F(|ChZ|8w~S!;0VwD6-%e)Xrq%)>Wwu z6QSt|Bni*0i3O1Z#a-dG zS1C8yX8%sLoEO{(AsUhP?@$uO&8%{RhpXOXvf19bKI%oywt&y4Mz3N5-lnWzmr~ z8)(vzr3@r>v_gsmv{m0;8eJgJO}xQ3(7(_>u|QgSn$Z1>M>6gv z@ydZS&Dx7|z`0r<9tbNzpFiZ6MQNJ}504nbh2r5Grf~^LxF=&7_x;JqNCrzK&z_39 zo0J8qhJqA6S@?Y-$z2qd^5i`cuzQM67u5PL0cXKf!Us+kf;`_vE|>}e9$#d-FRvdSRtAxa4OB?lm9Vlwv!%k%K<@z9OtHn;uoL6lGo2es$`aW72b3)`ou&DLD)YnC|VBx8#{jSR
en@cU z0f2J$``7{I4W^BL!g|Sa*?P>YTPVrH__D=dzV4)EAAE%7|`g7*Ar z|IPDoueSaLC{oSY@;kI}1grpU+O7!rF$ilPL_ia0);bcPLPOiZZd0e(v9VdN21~V{ zZwIxu7VMu@cQV@;(yl!V*MKH%?g*^c&=I&qn>YenK~U3=>*BV5RoT zbFjO%%?CD%8hrw`0FNOwyY2*B3e4*Tvm?@} zm7aoi8h;WtvTnV;=z%sa0=$s}mcs`r9O<(J`V^hTHD(sAsDx&so~{5zDSTHf9*6b7 YOmxx?@B^7S5sf9Hrq@ry?-79i1r4vnuK)l5 diff --git a/mensa_app/__pycache__/admin.cpython-312.pyc b/mensa_app/__pycache__/admin.cpython-312.pyc index e80cb5c1159bf92fb351a71c3cfb0a03b33adb09..d91dd7d69147585ab8acf729d3ec4b508bcd445e 100644 GIT binary patch delta 134 zcmaFCdXbIyG%qg~0}w=U{mnc*kyny&&PMfUMy?d56pkFGT&^gt$zF`Q{9LOUL5dg{ z7#S)#HMu6YF&c7ldMB2orso%BrcU0%sKUrS`6i876lwA+S;ghT@LNxlESA gvJV(o+qoLKt}_TV!Z delta 74 zcmcb}_JWo7G%qg~0}w=<{gW9xkyny2YNL8IBTFTRCgib@EGP3b+p+Kixd70l5YGSr diff --git a/mensa_app/__pycache__/models.cpython-312.pyc b/mensa_app/__pycache__/models.cpython-312.pyc index 5fa7d6aaafeee35b03bb1f4f018c4fadcff177c1..a8847381c2a42715b34eee531c5df091b7c2d226 100644 GIT binary patch delta 2189 zcmZ`)T}&KR6rP#=o1NWdccCn-i|o)Mc7Uw56|61R(gj*XXn}2wM6(XeWtnyv$er0n zYEp>dfhINu=YbkyT3?K$L@~VhP!mlbYT^r~x?woVJd++`FTZyut0|9}7u_pYbUhprJRde<1!ojBk$DC%AvROt6E_@w#`KLls zc(s9*ICg3EoP%W>qp-&ECdXvjrIM^dW2n0?Wo2C_G!DuVLq+(bwdRM;i>$c%yEDXw zYrvwj03xl$$++opAMX)C?2~v}ho=1q2N3EJ8~~QLLpI3PJ_$5pd@3P`2zIC@l$y-z zZb`6>sE;g!E7_F!J}XTtoZ?WN%dR^Z5XO+(&d?1RdhT%BHjl#3GDG~7R}w655A2zl zpeo6A!?Ym6=pdu2rV?t1ib}+G{3lc#oFuAF#DjzP?%unl+e))|M$Szd8A8>OF{4=| z)5b_bO4va*4nw$<#Yhes0*N*QSRRFp%DJpD0!nFMp>RA#zeR>HL#)CKaSA)+nBpYI z)3VYhCVGh>TS7_K`XuKw<%AThipzu!Pv|7A$>StFnaxo-`=2UWP7Fj}h5fLhIu9_* z6l)vvd~B=M$IShFa(Y)E!S71Aw0$C-)(x6YV`FqbzzkCiR@|7nHnqlA+j06N?=#;A zbttu)z6dL58^SS!-QDhGC>GI%N)U8p#VqrP<6QhhH{-9FYc2RH^;T5!ig#Hku_tKHh&U7WDSjoeTvlRR7}rPLN^m(;@-J7yz_yC1a;d_+ z?&)i__-($BC60RG%Pc=7Szw`JcdToPr7d7h(N_Q^j#j`QZ887!v`nKtCj-1qG)J59D5~S*Kw99!=)Jp{VVR0KO%XNZsVHkAQ8l88z~U?FsH%^Q zfs&FlVulQZ8_^Q5FK%Xe$4GWEZIBO)5tcFk;9fFM`aI>^2MHW@hI!jnIsF-rH&5L(Ze9KKY9W3&A3wZS zdt~L%TCin}Z`mfq~LQ_Aw38#tTlOs43Y=6(J^MLAS4 zEoZZYW{5`8qu^|A@J-WJ2qzRdN2shpg(i$WxXREI@Xa>h{iZJg%rXz0?L}X#L{oj; z*EG`s)D7>ScNao+`A}Vv4;Ra;7ZVGKVr6{O;|#lJx*rNmRpb0il3jdFE_)vUAXW6RDl72gBOQswiDB2STkaczs%K-H?r( zPJ7WljIdYM@8Sf)Df9c#$9{1~?UMrL`EY-mT}=C`wd-gX$zCI&r|n(~(o?=|d_u`( z$q8zJitmndk!U6igb!69a9|a1$l}Dah>QN9y5ZA$GJ!!Y~jYC{iWN;8%4S)-PMu3?@ zbKFR%l98tsoNzu40gM!2wdf#kY@$>=*dr(_~4eU$On)3;EsCCU(Sz~*uYw($Oewsz{~cxu}_v` zb|OFg(}JviLq9kZq$)gd`BAG_fgRMLu~?F+?8$g0u_R%Jx^O3;i-N{B+!MX+*0F-N*LD&F5GUXP9Cm;%z+JEgiPziJ30wB6;ry3m>5`qasUuLaZCc$&gjoOb`Ee0#BL#rR8K+magJC8Vpme d%#mFo%rnTpwy-I$%O@sko>Y@xLZbyT`~eHK@F4&I diff --git a/mensa_app/__pycache__/tests.cpython-312.pyc b/mensa_app/__pycache__/tests.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5efc8ba0932ae41cdfe69e905480490f5a3585cc GIT binary patch literal 192 zcmX@j%ge<81i7dFWZD4f#~=<2FhLog1%Qm{3@HpLj5!Rsj8Tk?43$ip%r8OGnvAzN zLQ;!MoD+*v{WO_wai?S@=B4NBl>o(xn1KpbGJFQ9`(>b?k)NBYUr<_7m8oA)l%JKF zTvDtb>>lEqnpd2tp9>=66AKFTK{|`|3Mzkb*yQG?l;)(`6>$I!Uv8@BO#$m@L{7!t`<;#@duJc(;p-xX4XmLs^PJcXME?L zd+)jD&T4-Oz87}>(9~pS$m4YWC4bVq;{4LlLQV2K{?WSf{a1$o57>fz%~U%~auNp| zpiyQEO*?1U#d=vMKEn1{n>hyBZ~E{$+t%z_V|QZ;Zal$F;_IvrdJ3((9?)h)1Zv3o z6*Lsu>u~%2C$7W51qp-Jc3>-b*SH-Lz-PDw{Hduu4)zyF+c8>UciC#DJrpv*1|acwLnfH8j<(1Dqsd@84|^3>eNBe%~_5_OATW z?W!jz?UX%5%lZcm?9u1T!WR6lxqJEM!1JzWrhWQfc*hCvGvI9DTphXd2L8Wq(F+C+ zdn{9XivD7KPhg0Oet9p^U#iDRmV$dnM9Fd^@b++IMCZq335lAVRi<_RRZ)Xd7ReAt ztQX$YnaXj}e#E3(0ZfYdw5HoL;_XBlDw3AcEqO(LD-U(gB1Cgp6($rh0~5J)9*Jq) z{xp>mF`;IXMz{o{E`lq$MYS^KwQ^ z6T;#=RBHi7dq9?CP1Rkr5)ktciHZd0ma|%3B%w18lNV)(v|fRr1Rz5ds=_vN zLC$0#5{N3v@4l7hL?q-DASkpcK~w}ND^L;C99)um>F+Qs#08B#->Wv7di3b>y(K#)v zo5!G%honR&X$5tW1-ILRc65ZA^a9~wTga_jCLmI?if%?(B6Xwze`xCgL|jKk)pHF0guttOtgS6lHT z$1FyUvE{B}IDU7r9FCX5@s0k?@GC{v=tFm)7>unZ%fVPF7+as-IKCOYSae-_=Neenpl>7Y+=}gKQn<}8Q~Gry=56;S<46Zva7S?>U_db H%SiM$Yc~>ttbeh zS1+v(p;x_l$SVC4Jc*!(tyC&|u@}Kyr1%3tM4U;8uHYWt<9+AN`+R4Zy}#{EF8V4G z33})!y#A>ygchPtLvdEp@5`8P;l;D4CDgf=P(?ThYg|U`utF{^3>L~HIVzZj^at7r^ZxTt_ol=y zE925Pw)J!tcUzn4-u4a`KF9D}4@{v z3f4LfQFe0S(}skb?qY0j9x>lMVi972baJTW#2w+2Z+rBgd)q|=M^@*wjUvbXl;haF*Dk#)&bYT8-HKT33^GHt@s zz|qqUOgrf(z zyOu|~NQXGSszOu@r-aNw$2X@b*XM}Cj}wihS)C|GgSl$(42Ya4CKY8yQp>ZdR3S#o z09IthG~jzMCptn+D`TP(lQ_t%K~HEPpZDs$j1<<1DwzbAHED+ETbl4wL^o=h!|OF_ z5GF!}LL=28`76^kg(7tJ!X4i=RWc0HV6UIfOVgys;X|kt_fl7Uty(2?%1M^sQg~F#5$XpXMn>RmlW+pSWW0t=O~r%0|PEneXBmJ6l*R zt!4|$*}_ua^F1$*tYlByu`_Tl{%F&i;oIvT&nP;9XqrS9(N~YB`w}bSWdw&4cZ5-{ znDE^l(ia5dJq M9P9h$p+$4gZ^CRN`2YX_ diff --git a/mensa_app/migrations/__pycache__/0002_gericht_preis_alter_bestellung_status_and_more.cpython-312.pyc b/mensa_app/migrations/__pycache__/0002_gericht_preis_alter_bestellung_status_and_more.cpython-312.pyc deleted file mode 100644 index b1d769ac85ea5286ac08874a8664f8b418d2d362..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1569 zcmb7EJ!~9B6rTOP+w~8=jg1pIA&#*lodh{U0SKW;0fZ%FI|RErDO%0#%Ha_~ za8o&8e5bye6==yRNfNt_BZN(g1CH}yeiW+EK#EAmo`nhHTpl_5W}@O#9(qA0j4r2PI+F4HvLYin9Cc016Y7N#W^R{ZkEWtRXdCxf27ShN zT@w0XmV%j`ciN3{M1`KOMmwa82)jkoj55}XePN~<&U$Ix09HoQZqry8H{}L$6}NmE zBoMfIV}hjiW6D3lVVd>lcO});(hANhE!xKcI8@#)0O+hVOL!boo(XHOgnS878Of;v zq7^SlLP&(mNh*?HH1@MVm|e=#Bo^i!hSQYpkKnmT52M9!e21?}dp+(kCJdf1M(esH zn0i5vGRk{ZIN$SvpMC@Z4opS^PPs6*^BpuZQJ7)gqG3jPzqTWr^77791s1v&&~|^W zINAn7DB5UIvQYVD*m4fL^%+rh^Gds}uw54_-(wW;tm}T%!%S9RN`!W4Ola(dkga^G zP+3CWlU?C5H8J~c(b`-k>>CV-71(+wz!PXEP?q93e}|624Lu1PK@!nMx0m(9MwcfY z>SbwTZ)-m%-uQdm8q+^P0|xI^cQS8oK5j0S_qo&YaEs}1aZDg5POo(jxcuwniv;O! zu-rpq6IoZsn!0Fywmr6yb@2=PsJe1kT^TN~4r}L!&c^+#N6yBfv+@0{huW_n+%t-(9Q(;N(#l(y zH?FA4Ytk&YeFM;w>RZJeT<33s2)|a8UW8?=DT?x^iIn<@xuTf&?W2YD!-e%f5D2;V EQ<$`t-T(jq diff --git a/mensa_app/migrations/__pycache__/__init__.cpython-312.pyc b/mensa_app/migrations/__pycache__/__init__.cpython-312.pyc index e1854232b914b31d6168f7415c6146568ac3c9ab..bdc1992ef02f7fa8ef72603d1fc9bdf1876953d7 100644 GIT binary patch delta 19 ZcmbQwIG>UGG%qg~0}$}>{hi1?1pq4U1cU$p delta 19 ZcmbQwIG>UGG%qg~0}$k%`ZJMx3IH(B1)cx^ diff --git a/mensa_app/models.py b/mensa_app/models.py index 30b945b..4bf631c 100644 --- a/mensa_app/models.py +++ b/mensa_app/models.py @@ -18,16 +18,42 @@ class SpeiseplanTag(models.Model): def __str__(self): return self.datum.strftime('%d.%m.%Y') -class Gericht(models.Model): - """Ein einzelnes Gericht (z.B. 'Nudeln mit Tomatensauce').""" - name = models.CharField(max_length=100) - ist_vegetarisch = models.BooleanField(default=False) - allergene = models.TextField(blank=True) - preis = models.DecimalField(max_digits=5, decimal_places=2, default=0.00) +class Kategorie(models.Model): + """ + Definiert die Art der Speise (Süßspeise, Hauptgericht, etc.). + """ + name = models.CharField(max_length=50, unique=True, default="") + + class Meta: + verbose_name_plural = "Kategorien" def __str__(self): return self.name +class Gericht(models.Model): + """Ein einzelnes Gericht (z.B. 'Nudeln mit Tomatensauce').""" + name = models.CharField(max_length=100) + # PROTECT verhindert, dass eine Kategorie gelöscht wird, + # solange noch Gerichte ihr zugeordnet sind. + kategorie = models.ForeignKey( + Kategorie, + on_delete=models.PROTECT, + related_name='gerichte' + ) + ist_vegetarisch = models.BooleanField(default=False) + ist_allergene_frei = models.BooleanField(default=False) + allergene = models.TextField(blank=True, default="") + preis = models.DecimalField(max_digits=5, decimal_places=2, default=0.00) + + # Das Attribut für das "Dauerangebot" + ist_dauerangebot = models.BooleanField( + default=False, + help_text="Wenn aktiviert, ist dieses Gericht immer verfügbar und nicht an einen spezifischen Tag gebunden." + ) + + def __str__(self): + return f"{self.name} ({self.kategorie.name})" + class Menue(models.Model): """Eine Kombination von Speisen für einen Tag (z.B. Hauptgang + Dessert).""" tag = models.ForeignKey(SpeiseplanTag, on_delete=models.CASCADE, related_name='menues')