From 5e06265a2f7ea941fc96d9a6197e6906a8dbba33 Mon Sep 17 00:00:00 2001 From: Martin Putzlocher Date: Fri, 15 May 2026 11:32:44 +0200 Subject: [PATCH] =?UTF-8?q?Datenmodell=20f=C3=BCr=20Bewertungssystem=20(5?= =?UTF-8?q?=20stars)=20erg=C3=A4nzt.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- db.sqlite3 | Bin 212992 -> 225280 bytes mensa_app/admin.py | 3 +++ mensa_app/models.py | 60 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 63 insertions(+) diff --git a/db.sqlite3 b/db.sqlite3 index f2574ceecfb016836d55f9e9d2167ba6c454b560..f8ad6e97a681ab191a2d420e04d85a85d6acb537 100644 GIT binary patch delta 3995 zcmaJ^3v5%@8NTOUJJ;8bd&q-0B_z2q3510>_g?$@5emf6@Foo;yh6dfwyz%~e#8$T zt*T&JwbeFlgba#uwyKo1Ti2=!bgMw6TWMEqt28=k=h}&5 zoKQ#kZU6qycfRwVbH4w-$B&zie{4EgTRuP#gcJYIzMdXkWz!B2RzH{soPnl3>|eap zgsqvmI7TmO1I*-5r$kSje2{#k->fAXhCERvmXf`4BEj>#yO9M zN-XV74<{6M?3%S|nH&Cy&=OU(R6A4P?VVwU7g<9|3~C%FtEx?UssYHEbl96oDM^wb zY8$B40R8nmX>KPg>#4S)@d+iFipMJIsMaDUhR-O~ODP+JMuVWTiZC%$qb`RSO2#t@ zoKux|O*Mx@=D7Hjqe?Q36E}9PeX(Fv^AD)@*#$)-p`@IS#A7M59{zeJ0agm^ zk%)2>@7@fD4RVZAJ>2?P&v#rnu1#VC%Ak@~?v2d*iejDlSbrFAMoDbmSBPB^YI5M< z7457X2;7T`9fh#aeuo9H;cUNmb8<
Y`AN~u#~cIOB_iKhX-RRS87cf-=vg3oWc1{_QsQ;!FUSanvvpb#3yVi=EUVNO2Ba9kFghmZE{-xfT&T{ygBpRm`_^lHk43la@$|I22BMBlM_u;*t%-f1#Gan@J8Zkxhn}df)g{!v_XI ze@-9Py{3DXeuq9)cDJlv`zP)9sZXdiqDyB^lU3GkU`hYS823 zBs-cPS(_g{Q;iq_l>+nPPNB9o> zJ-jl-y#!u_D>M`XjH)rHMz0!1H9FPMswq>=*gtO6a4h>afq|~$;lF?v;CJB=JODSq zcDMur_9pxGMD`L}Q_X6KhKBjtGIjGRXaGx%#%cmyg1cY^`!0KuU2gi&giNcA9~qxD zR!?!)z<&%Q38S8XS&C@|j7KOw6kJ|+lr-0!!CDgIqLDP$7mvzV!&C8JUr=%miR;A` zCZ@y=JZ{0-pad)(+~ZF?age>YnAn64yVL5H1l}p`G%y6*l%H_@NTD=w0(T@HVR6bxB9|^G-jl_iVGM(FIOE97g z22yy(4_G!vlBqNolcS1d6=&Hl&we?G&w{3eH{ZcaR^BbS>{6#kTUh!%Qjz-0~$WffW^p}y`3{(ZNi0CBByxLc_2F-6M z1%}zbfd5iW#_fjx86G4$^rV$fSxjdhLpR-Ro720gGfu|RzW#6DuP>H#UzJSZN zVON)@4_)ztN~X|xphcU2G0lF!ERgw^SC+7mp7XL(JS86yFLgC~=z9qqG8ev~vSk zp8xuRADB?PA8^!(#gC#fKUf9YRIUHCO7{>^F}G~>(>fXL^nw;wTMq!qO1ew^wVBhLbjDN0O_Wtxx0(o(*01^z6Ens$mSd=6@3o;ek*AR6{iM<2?DRvK{_1v%I?KP~A91F4wf2sP~~Cj*=bdbw56ge^;9s+^9Iv%2VW1Y9ADz z$PNH1%Xrb6GdPMyWCPlNhJ@(FGvqRG2>tF1xfWjv^U7y>VUoASLyz_;+YH=$$$24Xc9MBE|O z)!nB!YSkx7cL(p9egFBFq=v_8U4U6<13LUL}(03~%9%iE3u%=VMNYbAn!~!8vvQKlKERK>z>% delta 1567 zcmaJ>eNa?Y6o2==$9}(e7Gzmu8Ca4?XJx;auMz}PiXbSzQYY8lWnpQD-E~T{XqZdp1E)CIp=rI zz31HDeLa`>o*ur}khz&*7$=>N(uwHwCYC!gHZ$gdZ;!PO0$)W7 z3AKmazHlh!55?TEoe@7Tj+?V(F1?m@DaaQ-l%2sqJ(HiP&E2(#XG;~G{!o|4?TJL( z5r4ER9AdJ7H7&4Gf484u;AKWf&-l>DQL~N(*q|roZx2U1{0tmmvLC`S46kI16rS!_ zz}+4VcSp)7AnQR;ww|>t$k*{vMQ7n?oDQ*;yA^kKv`0O$ zj&P_eM@3z{FwMZ9FbU`2G>k%2%CVjh#1?IyG+kYQSeJZEl&=g*wOXfK8mr%`U|s5C zqP!(YdtalLj%``XX%N&gP{(giiIf?!!>;(_h-cz8wMsp|TB)q%Bi>+Zo88?N@Yr2t z#WuS&HHw4Ir&cvTy}F^YY2D6sW$V|z(AZs8S5aKvw%tqC z9kKd1gc~-Lx0wQU8y&9oPllfjwXd*S?PaA_SE$+2P_+JBVL}Yv|GD z7?^{fVH&2T%$`3$n%kA7MZePZbx5?xkB?3QEwx#XM=2_(B7*^<##l!s(Bl`{R>Qu0Osng~<3A`LVmJa(q zfqBy0htH^XZz-4SO(yh8Ckcyq2`WhgJ{0jba+u%}(wV?k;_b)242Mj=$*~~y)qY&S zJrXzBi7(ra0*7?HP{YYU=>&(50EfLxp78F zPMt@ED4!E9Fz`M+4_U$mg$6#kFZ2elLf@!T z{VCj&J2p;%Q^n1|EHzw&Ts3Pz8^gYU-)+Mx)}TzU?J5cN+@>T@i<3u+BxBEyK=DA|2G!NNx||M$Wm% z+d{m9*o;ic#2}Us8!xFL#Ea^Yg`h#ox)C2zlM`N)MY4U!gsRC(A6i2uyr`Ib;6s&c zT)Bcw9;92Artz}}v5wS_PtmKTrK?W~t@xw~uP+)v!0<#@*he)H#^@A9W$PmwT7{ M3tN-iHhin_KRvnK7XSbN diff --git a/mensa_app/admin.py b/mensa_app/admin.py index 3bb21ae..223d240 100644 --- a/mensa_app/admin.py +++ b/mensa_app/admin.py @@ -29,3 +29,6 @@ from .models import Bestellung # Ersetze dies durch deine echten Klassennamen admin.site.register(Bestellung) +from .models import Bewertung + +admin.site.register(Bewertung) diff --git a/mensa_app/models.py b/mensa_app/models.py index 605e782..c24c43e 100644 --- a/mensa_app/models.py +++ b/mensa_app/models.py @@ -133,3 +133,63 @@ class Bestellung(models.Model): verbose_name = "Bestellung" verbose_name_plural = "Bestellungen" + +from django.core.exceptions import ValidationError + + +class Bewertung(models.Model): + """ + Repräsentiert die Bewertung eines Gerichts durch einen Nutzer. + """ + + class Sterne(models.IntegerChoices): + EINER = 1, '★☆☆☆☆' + ZWEI = 2, '★★☆☆☆' + DREI = 3, '★★★☆☆' + VIER = 4, '★★★★☆' + FUENF = 5, '★★★★★' + + user = models.ForeignKey('Person', on_delete=models.CASCADE, related_name='bewertungen') + gericht = models.ForeignKey('Gericht', on_delete=models.CASCADE, related_name='bewertungen') + sterne = models.IntegerField(choices=Sterne.choices, default=3) + kommentar = models.TextField(blank=True, null=True) + datum = models.DateTimeField(auto_now_add=True) + + # Das Feld für die Verifizierung + ist_verifiziert = models.BooleanField( + default=False, + help_text="Wird automatisch auf True gesetzt, wenn eine bezahlte Bestellung vorliegt." + ) + + class Meta: + # Verhindert, dass ein Nutzer dasselbe Gericht mehrfach bewertet + unique_together = ('user', 'gericht') + verbose_name = "Bewertung" + verbose_name_plural = "Bewertungen" + + def __str__(self): + return f"{self.user.user.username} bewertet {self.gericht.name} mit {self.sterne} Sternen" + + def clean(self): + """ + Hier können wir zusätzliche Validierungen einbauen. + """ + if self.sterne < 1 or self.sterne > 5: + raise ValidationError("Die Bewertung muss zwischen 1 und 5 Sternen liegen.") + + def check_verifizierung(self): + """ + Ein hilfreicher Service-Method, um den Status der Verifizierung + automatisch zu prüfen. + """ + # Wir prüfen, ob es eine Bestellung für diesen User und dieses Gericht gibt, + # die bereits als 'bezahlt' markiert ist. + exists = Bestellung.objects.filter( + person=self.user, + menue__gericht=self.gericht, + bezahlt=True + ).exists() + + if exists: + self.ist_verifiziert = True + return self.ist_verifiziert