From 4533fd64029208ca5f00d868b0e70de2d27e01c7 Mon Sep 17 00:00:00 2001 From: Martin Putzlocher Date: Fri, 15 May 2026 01:18:38 +0200 Subject: [PATCH 1/2] Erster View und erstes Template angelegt, URL /speisekarte registriert. --- db.sqlite3 | Bin 212992 -> 212992 bytes .../__pycache__/__init__.cpython-314.pyc | Bin 156 -> 156 bytes mensa_app/__pycache__/admin.cpython-314.pyc | Bin 958 -> 958 bytes mensa_app/__pycache__/apps.cpython-314.pyc | Bin 461 -> 461 bytes mensa_app/__pycache__/models.cpython-314.pyc | Bin 8602 -> 8602 bytes mensa_app/__pycache__/urls.cpython-314.pyc | Bin 0 -> 383 bytes mensa_app/__pycache__/views.cpython-314.pyc | Bin 0 -> 655 bytes .../__pycache__/0001_initial.cpython-314.pyc | Bin 4939 -> 4939 bytes ...r_gericht_options_and_more.cpython-314.pyc | Bin 2026 -> 2026 bytes ...cht_time_creation_and_more.cpython-314.pyc | Bin 2143 -> 2143 bytes ...cht_time_creation_and_more.cpython-314.pyc | Bin 1152 -> 1152 bytes .../__pycache__/__init__.cpython-314.pyc | Bin 167 -> 167 bytes .../templates/mensa_app/gericht_list.html | 55 ++++++++++++++++++ mensa_app/urls.py | 6 ++ mensa_app/views.py | 8 +++ .../__pycache__/__init__.cpython-314.pyc | Bin 157 -> 157 bytes .../__pycache__/settings.cpython-314.pyc | Bin 2465 -> 2465 bytes mensa_core/__pycache__/urls.cpython-314.pyc | Bin 1022 -> 1102 bytes mensa_core/__pycache__/wsgi.cpython-314.pyc | Bin 646 -> 646 bytes mensa_core/urls.py | 3 +- 20 files changed, 71 insertions(+), 1 deletion(-) create mode 100644 mensa_app/__pycache__/urls.cpython-314.pyc create mode 100644 mensa_app/__pycache__/views.cpython-314.pyc create mode 100644 mensa_app/templates/mensa_app/gericht_list.html create mode 100644 mensa_app/urls.py diff --git a/db.sqlite3 b/db.sqlite3 index f2574ceecfb016836d55f9e9d2167ba6c454b560..f70068fcf61b755b3ac26781bc726491ac851047 100644 GIT binary patch delta 1430 zcmb7^Z%7+w7{KqnOEhQ9J+Wi8TbA`|3)NLCauJ7`Bvkqg@A;jrpP5I_UOcgY7Qrn93--56}C; z`#e9M_qpHQ{Jdp;-m+*zv85Nz8)KOB%`esxZyh}f?N}|fVumf)pvu$+ybjl?zrY48 z^*yx$>N-t-M;YtQ1do=N#?Uhezj~yFAy%-{OAAfS&(;$yC@p7HDJtc1QAM6k#>evn zW+91VCaI7gk1EsILJq^Qrlo}wSFg7mN96hsEnl9kbI}~{XL&#GaWWp(>vOGto;^!f zA?hAR-CJ9@MU`G{K*r!}5s}NdxLKtzmnh6A%4C{Rrx-pHSJL@pOcF9P8K>M?9GD2I z-O7a6-#X?nJDS<%6V0?EOSzV1TDV7sEY-NJBdu~i&Ty3{ZmRwGG16&1zcWOrxQ&(4O% z+B*Cl(SfOvVs?(5iU<2WLrN&Gwhl*Q+5Sk3KR>|cB`+UVRWH+?lZH8l^Eeo{gY*4+ zZf>uOtI>vw;64WT*Xwe(;lyzwNIq?3AFmpIIZVP$48Db1a1%D+F8l#c;Ahw>KmQI| zgBOhiLME~jO?o7&EBmU--nhK=5wdB3I~e>4zr(Na2!7Nc58xZPvus^ON6OqPdJmp6 z5F{e?VA4ai9;)3hLY{7l-1zjy+p@YJQaVUsd8gp>dIbJVwMMaRQ+CStwLl(d zf$=&ymxpE8(JHNYv{KB53JE!tq0`Ac-Iq;EdF^w`YR%~PEB%iPy8MjW>C^C>AR0A# z<2HTIke<>Y?|1v00_PK0*GmQsajg9H19ZC1h~OaxWp)F-ORX*X&?!41{&Tm3Mp`r@ zalPUvc=$;z{uP|6!3oT^Gb1Y^u*N-2=?3GliD~+6mTRr}U9g)88`{aotwbZaC;u9a z8>}@1Jl5@d48LjKZvyCE5xSl@P7ow{?Hq1+MN3jK&F>FDU0aZ$#1Uq!nKW6dO{Cqv zPp5N-v^KOy|1EKTm$17w;AX5|t3f2P+bgyZ`0m;6$|Ey&h9tEdjr$+3)4=i6Uh?~^ G_~PFy7>(!v delta 448 zcmZo@;B9E&ogmE^HBrWyHHtxR>dB2MbLHjv{xk6K&En#J$$x=wJKqKVZvI33vHa5f zhI~)?X7R7tte|k8kA>fzL1v<(#AIoGU8yn#Q3ebk#?5TZF@0hhqp&Xn|11U(3v%=#R;sd>eT@reZm@#(2WnaLR?lMm@DGqP-crhm>} z&``n1z{=Rd%G5;9*woO-z+m&ye0v2p1_1^JzB`)*8{YFz3}ByDz{JT2=Pf!Qu;~EH z12GohN2l}%U2DeKsVBE+*af00Rm+Kj&fr{QT@c-fe&i{%3E&mi4+%C0& zaTidLHiDeVyp@0Jb{+wy>p%h7Nf%g_vnVhLY-VZr1M~;? Wc5VlzpYfYn9U1D%nSf6V+2Vgvvy`veLA delta 20 acmX@he3qG8n~#@^0SJC;Fm2>M#0UT|Nd%w( diff --git a/mensa_app/__pycache__/models.cpython-314.pyc b/mensa_app/__pycache__/models.cpython-314.pyc index e0fd0fabf71bd62cb08fc39d4b165117065438a4..010479e236c544f28cdde449bb308881a3fa6055 100644 GIT binary patch delta 20 acmbQ`Jjh5I1S&%p zc}CM{V1difK^5?D2e-28;6GO2a3ws`vySmnRFSYedk>t1xNv1CNYs_?SjKBqA!ZlrgQq^YYLs_C7~ zozl_uy0g2@NY+>GV#*o&VT@aGTCjOeV9Bmoz{hOF zkslk}8Fxk&T7-FEjqQQ~pGpngbH*inb!24;;0oSgCdjND8{HMYBWt$%jO|HOEzK11BRVz53PxfPQZz~gI-`^H?XOPqxV{xTjrai z4008Uuq^#~(?O)v6^1cpsoo9K6hs?>aSy?~v<01n;D=WN7izo)^zmmlQ-XZv}&#x}bR{sCpKF}4_u>34NDz23QYM;~> zw%X|}U#t!uFE3X22H)+zH10a-a^UH^vqhNCi=m1OiBW}0nvc^5t-E2KLvF4oZ4+|q zJypGQ)6mS_u=Y$s_i1ytXR=SG`9*a^>X*eiU$c`xF5{Fn~#@^0SHV(*fw%I2m=5wsRP^q delta 20 acmX@Dc3O>Fn~#@^0SJC;Fm2>^5C#A<_XKhP diff --git a/mensa_app/migrations/__pycache__/0002_alter_bestellung_options_alter_gericht_options_and_more.cpython-314.pyc b/mensa_app/migrations/__pycache__/0002_alter_bestellung_options_alter_gericht_options_and_more.cpython-314.pyc index 973cd0960747557d4c72ec763e22ad6f0842f0de..cae7689d07f0434934ab4e04f1650c34dea42439 100644 GIT binary patch delta 20 acmaFG|B9bmn~#@^0SHV(*fw(CX9oZ>IRt+I delta 20 acmaFG|B9bmn~#@^0SJC;Fm2?%&kg`KhXoY? diff --git a/mensa_app/migrations/__pycache__/0003_schulwoche_alter_gericht_time_creation_and_more.cpython-314.pyc b/mensa_app/migrations/__pycache__/0003_schulwoche_alter_gericht_time_creation_and_more.cpython-314.pyc index a82d32da7a08008ec44840bd8947570965bdb07e..680e53de3abdfe9f000d51faa7b06044644ebd2d 100644 GIT binary patch delta 20 acmcaFa9@C1n~#@^0SHV(*fw&9Z~y==rUT&s delta 20 acmcaFa9@C1n~#@^0SKCHnKp8VZ~y=?Dg+b& diff --git a/mensa_app/migrations/__pycache__/0004_alter_gericht_time_creation_and_more.cpython-314.pyc b/mensa_app/migrations/__pycache__/0004_alter_gericht_time_creation_and_more.cpython-314.pyc index f97feed9d200ef24f107bb99f9f29217f75e83e2..c33415e3f4e0dc5dd3513491ac52f5488d2cd6db 100644 GIT binary patch delta 20 ZcmZqRY~bY9=HumJ00PqxwvF7SEC3+R12O;r delta 20 ZcmZqRY~bY9=HumJ0D=X!OdGjNSpXv)1A+hm diff --git a/mensa_app/migrations/__pycache__/__init__.cpython-314.pyc b/mensa_app/migrations/__pycache__/__init__.cpython-314.pyc index 2acbc8d967049c2e78cdf5181b7184e3380544db..cc7d1ead2f6eb275f088311aac3761e3970b40c2 100644 GIT binary patch delta 19 ZcmZ3^xSWw&n~#@^0SHV(*d}t%0RSP-19JcX delta 19 ZcmZ3^xSWw&n~#@^0SJC;Fiqs10{|t51PK5D diff --git a/mensa_app/templates/mensa_app/gericht_list.html b/mensa_app/templates/mensa_app/gericht_list.html new file mode 100644 index 0000000..4b4f375 --- /dev/null +++ b/mensa_app/templates/mensa_app/gericht_list.html @@ -0,0 +1,55 @@ + + + + + + Mensa-Speisekarte + + + + + +
+
+
+
+
+

Unsere Speisekarte

+
+
+ + + + + + + + + + {% for gericht in alle_gerichte %} + + + + + + {% empty %} + + + + {% endfor %} + +
GerichtKategorieStatus
{{ gericht.name }}{{ gericht.kategorie.name }} + {% if gericht.ist_dauerangebot %} + Dauerangebot + {% else %} + Tagesangebot + {% endif %} +
Keine Gerichte im System gefunden.
+
+
+
+
+
+ + + diff --git a/mensa_app/urls.py b/mensa_app/urls.py new file mode 100644 index 0000000..a191ae4 --- /dev/null +++ b/mensa_app/urls.py @@ -0,0 +1,6 @@ +from django.urls import path +from .views import GerichtListView + +urlpatterns = [ + path('speisekarte/', GerichtListView.as_view(), name='gericht_list'), +] diff --git a/mensa_app/views.py b/mensa_app/views.py index 91ea44a..b8aafaa 100644 --- a/mensa_app/views.py +++ b/mensa_app/views.py @@ -1,3 +1,11 @@ from django.shortcuts import render # Create your views here. +from django.views.generic import ListView +from .models import Gericht + +class GerichtListView(ListView): + model = Gericht + template_name = 'mensa_app/gericht_liste.html' # Der Pfad zum Template + context_object_name = 'alle_gerichte' # Der Name, den wir im Template nutzen + diff --git a/mensa_core/__pycache__/__init__.cpython-314.pyc b/mensa_core/__pycache__/__init__.cpython-314.pyc index c6998ecd32fa2a0f71238a59baa963077a7a4f9e..f6c0a1cb41d1d133db23f80ba154c0adfb0c6734 100644 GIT binary patch delta 19 ZcmbQsIG2%In~#@^0SHV(*d}sM0stUg162S3 delta 19 ZcmbQsIG2%In~#@^0SJC;Fiqs11OOxz1M2_) diff --git a/mensa_core/__pycache__/settings.cpython-314.pyc b/mensa_core/__pycache__/settings.cpython-314.pyc index ddbc6402d2cf83f461ca64755d1269d00834eb0b..4d35f6dbf9abb95bcff230d829bd9ee3f19d151c 100644 GIT binary patch delta 20 acmZ1|yik~1n~#@^0SHV(*fw%c;{*UFV*{=L delta 20 acmZ1|yik~1n~#@^0SJC;Fm2?X#t8r`u>?c_ diff --git a/mensa_core/__pycache__/urls.cpython-314.pyc b/mensa_core/__pycache__/urls.cpython-314.pyc index 262e0fa27a4c921217a32395638215c28e954503..05686aa83cee225a2c6a0f94ad12342534be8d68 100644 GIT binary patch delta 289 zcmeyzevU(3n~#@^0SMy4*s^??85kaeI55BtWqhuis4k!4!CJy9&k)O^$PmOF%M`!^ zQ-z=d_z-Lu%Y+HS0_$UmWd-VHHDQE^!Q}LqN;rbplo>SHH+D^6(q+2EQjl1Zaf>}O zFFB_)CAEqzF(o%MPyZG}6<=;@UU6c4VnKmkX;DtGpC;#I9cBZjB9_UK%xV7oKx08h z7uy1f56p~=j31f!8Ckw6Ffc0KXHfmf#=y$iAu+*py46Ih>Gl)tFS97$WZ~!#>I}ai Xs(P7M?J|q{2Ucc&rY7zpUZ4p8#kn?^ delta 189 zcmX@d@sC|yn~#@^0SJC;FlGH?Vqka-;=lk4l<_%kqPo0-JVPvtB0~^!EK>kj3rrP+ z4&a%XCB>!3Si&B}qRgPlx^dM6CLzXKECq=r8C7hFDY=<>`hJ=mlhc_ECeL9`w&w+E zV+7)2T_Ev+nURt4BNIO(%U1;kM#Z}fG9TF(SUEc+CYVmQnrJoMexm(l7Ud7jO#Dnu J+(q0#9RNFnB;Wu5 diff --git a/mensa_core/__pycache__/wsgi.cpython-314.pyc b/mensa_core/__pycache__/wsgi.cpython-314.pyc index b95635bf17fe848caed1b4c78e87ecd995d9a456..ebd799de991fe5f8216188c5ca42b4d57dee87b7 100644 GIT binary patch delta 20 ZcmZo;ZDZxu=HumJ00PqxwvF7?OaLJ)13CZz delta 20 ZcmZo;ZDZxu=HumJ0D|8dOdGkYnE)kv1JD2f diff --git a/mensa_core/urls.py b/mensa_core/urls.py index 29c5021..da1dfc9 100644 --- a/mensa_core/urls.py +++ b/mensa_core/urls.py @@ -15,8 +15,9 @@ Including another URLconf 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) """ from django.contrib import admin -from django.urls import path +from django.urls import path, include urlpatterns = [ path('admin/', admin.site.urls), + path('', include('mensa_app.urls')), # Schaltet die App-URLs frei ] -- 2.49.1 From 5d6235679a02a8986be698466a844b980dbca061 Mon Sep 17 00:00:00 2001 From: Martin Putzlocher Date: Fri, 15 May 2026 11:18:40 +0200 Subject: [PATCH 2/2] =?UTF-8?q?Speiseplan=20f=C3=BCr=20einen=20Tag=20mit?= =?UTF-8?q?=20Pager=20erstellt.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- db.sqlite3 | Bin 212992 -> 212992 bytes .../templates/mensa_app/gericht_list.html | 2 +- mensa_app/urls.py | 2 + mensa_app/views.py | 39 ++++++++++++++++++ 4 files changed, 42 insertions(+), 1 deletion(-) diff --git a/db.sqlite3 b/db.sqlite3 index f70068fcf61b755b3ac26781bc726491ac851047..e42d6e9edc9e29fcef7c1d82a707fe8efa10ea17 100644 GIT binary patch delta 1436 zcma)6U1(cn7(PD@%iqbnKk0C;3$;RjYh`X@LL}aUs3eJv-PUyUFFi)~&wDUsG#q)i9 z@B2RQ_dVb9oyA3BaglicIGVWhl1Gz3EKzigUp{$^LX4&>I@pE{Q^m9a@4y$P$8a3p zD8FcK1RSm)muEKGUp)eN2bvOOg^O^ROhlc{3D^sbc-NlAm@q3w<5|t+x4R}$qWnwO z{HX=9_O;}!-Z?8f5tPRQoZ=bEOoaHpXrRSTDd{dL5u>JkQm8AIpOGbhSHc^dN_L-> z!l|)dfl34h{BmK4e2pe)rjxXHQg$=Rx+uHLX0@;mig7X=pAzL7oK~{pbXMYIzB5)# z$(&NYn{F{{G2$9xx=mbLyRbqmTznbR_}?0F=h=*{$jZXBSg>U&vJ@{&HZwko6OisqXW6w!5|Y0`DV^}>m@Dc%I6q#h$2Fi51U~BfgkB#LERVlE1Dh z&F)dv$&w^fzP;RrYB8uFa0e>oLz$1^l@{EO{+Di8`Oa$VA58?55!i%p;U-*%&){eH z0ltJX{0+PCJ8V~)KR_?RF%6EQdZLP2V+{?p75&o9Rg_gJZXoao{(?W@H~3Yh_z8Z5 zTks8hty0~nG+#xR;b;S{Ly0OFt6->tzH;k2N*-(?4EGUOfe;)veP?>lL=(HjRbrCB zjjP5%!~IJ02Ktp@VT#ZpAnH0$otv(ULD4RAXfBmevI3Vhr^KvTC}d|j^O=EO->|38 z-0IxA_(|L3d^5-M0^jU1&!0d4y8c=96N5TjByF)dNUPHxF{(YHwI258c#V6BmvWnE zTle;5$BYA}>E}9f%!8{~NCBfWk{~yO-)Td^#+MEnYS0*>nmBXqf))Cl(b=49TIN5}| z(R!1An+U6HJw}^JlLqcpukr!xz&&`VR(=oq>Q!l~&`^1B3OjO8CEh{cA?&E(yKq#C zX%JL3h6dB3wV4LTK7A8wIIWVI5Y<*6fdXDItzCFzT5xC#h)1g>P_6F7iRUEVtMCE! z*FiEa^`@VW?F|N`P4~2LpSXgio>L!b+<WPgh^W-Jm8F=_+ar3|AzreSh?*e}}{~^Br{L=h} zo23-Q`K5&TnYB4`Q}c=w;}Z)C;(@HvR0anASqwT88#Tm5#hLXP5whv2MVZMNCCrn% z^rIO$H$T&_wy!rb00EV36Ax#9PggHX-;l}>v(VrOpHed?3l;OULVYKb%Ip;9Tod!C zOiN3Xkc?v20)y1Be6KL`H0=zhaAVU@mwdmxbXy|>BQsqCQ(Z$71tViCLt`srGd%+{ zLvst0#FX63JTT!Bi^sP8+fBRA3@-Dr3;KFxHnEHWZWKomvN;KD
-
+

Unsere Speisekarte

diff --git a/mensa_app/urls.py b/mensa_app/urls.py index a191ae4..60835bc 100644 --- a/mensa_app/urls.py +++ b/mensa_app/urls.py @@ -1,6 +1,8 @@ from django.urls import path from .views import GerichtListView +from .views import SpeiseplanView # Achte auf den neuen Klassennamen! urlpatterns = [ path('speisekarte/', GerichtListView.as_view(), name='gericht_list'), + path('speiseplan/', SpeiseplanView.as_view(), name='speiseplan'), ] diff --git a/mensa_app/views.py b/mensa_app/views.py index b8aafaa..5cb7a01 100644 --- a/mensa_app/views.py +++ b/mensa_app/views.py @@ -9,3 +9,42 @@ class GerichtListView(ListView): template_name = 'mensa_app/gericht_liste.html' # Der Pfad zum Template context_object_name = 'alle_gerichte' # Der Name, den wir im Template nutzen +from django.views.generic import TemplateView +from django.utils import timezone +from datetime import datetime +from .models import Menue, Gericht, SpeiseplanTag + +class SpeiseplanView(TemplateView): + template_name = 'mensa_app/speiseplan.html' + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + + # 1. Datum aus der URL holen (z.B. ?datum=2023-10-27) + # Wenn kein Datum angegeben ist, nehmen wir heute. + date_str = self.request.GET.get('datum') + if date_str: + try: + target_date = datetime.strptime(date_str, '%Y-%m-%d').date() + except ValueError: + target_date = timezone.glob.now().date() + else: + target_date = timezone.now().date() + + # 2. Menüs für diesen spezifischen Tag laden + # Wir suchen alle Menüs, deren Tag das target_date hat + context['target_date'] = target_date + context['menues_day'] = Menue.objects.filter(tag__datum=target_date) + + # 3. Dauerangebote laden (unabhängig vom Tag) + context['dauerangebote'] = Gericht.objects.filter(ist_dauerangebot=True) + + # 4. Pager-Logik: Vorherigen und nächsten Tag finden + # Wir suchen in der Tabelle SpeiseplanTag nach dem Tag davor/danach + prev_tag = SpeiseplanTag.objects.filter(datum__lt=target_date).order_by('-datum').first() + next_tag = SpeiseplanTag.objects.filter(datum__gt=target_date).order_by('datum').first() + + context['prev_date'] = prev_tag.datum.strftime('%Y-%m-%d') if prev_tag else None + context['next_date'] = next_tag.datum.strftime('%Y-%m-%d') if next_tag else None + + return context -- 2.49.1