Erste Version mit erstem Datenmodell realisiert. Noch kein Template, kein View.

This commit is contained in:
2026-05-07 19:50:39 +02:00
parent 86261ea577
commit f2f00848f2
5707 changed files with 759434 additions and 0 deletions

0
mensa_app/__init__.py Normal file
View File

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

23
mensa_app/admin.py Normal file
View File

@@ -0,0 +1,23 @@
from django.contrib import admin
# Register your models here.
from .models import Person # Ersetze dies durch deine echten Klassennamen
admin.site.register(Person)
from .models import SpeiseplanTag # Ersetze dies durch deine echten Klassennamen
admin.site.register(SpeiseplanTag)
from .models import Gericht # Ersetze dies durch deine echten Klassennamen
admin.site.register(Gericht)
from .models import Menue # Ersetze dies durch deine echten Klassennamen
admin.site.register(Menue)
from .models import Bestellung # Ersetze dies durch deine echten Klassennamen
admin.site.register(Bestellung)

5
mensa_app/apps.py Normal file
View File

@@ -0,0 +1,5 @@
from django.apps import AppConfig
class MensaAppConfig(AppConfig):
name = 'mensa_app'

View File

@@ -0,0 +1,63 @@
# Generated by Django 6.0.5 on 2026-05-07 17:29
import django.db.models.deletion
import django.utils.timezone
from django.conf import settings
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.CreateModel(
name='Gericht',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=100)),
('ist_vegetarisch', models.BooleanField(default=False)),
('allergene', models.TextField(blank=True)),
],
),
migrations.CreateModel(
name='SpeiseplanTag',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('datum', models.DateField(unique=True)),
],
),
migrations.CreateModel(
name='Menue',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('preis', models.DecimalField(decimal_places=2, max_digits=5)),
('gericht', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='mensa_app.gericht')),
('tag', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='menues', to='mensa_app.speiseplantag')),
],
),
migrations.CreateModel(
name='Person',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('rolle', models.CharField(choices=[('schueler', 'Schüler'), ('lehrer', 'Lehrer')], max_length=20)),
('klasse', models.CharField(blank=True, max_length=10, null=True)),
('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
],
),
migrations.CreateModel(
name='Bestellung',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('datum_bestellung', models.DateTimeField(default=django.utils.timezone.now)),
('status', models.CharField(choices=[('offen', 'Offen'), ('bezahlt', 'Bezahlt'), ('storniert', 'Storniert')], default='offen', max_length=10)),
('bezahlt', models.BooleanField(default=False)),
('menue', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='mensa_app.menue')),
('person', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='mensa_app.person')),
],
),
]

View File

@@ -0,0 +1,33 @@
# Generated by Django 6.0.5 on 2026-05-07 17:44
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('mensa_app', '0001_initial'),
]
operations = [
migrations.AddField(
model_name='gericht',
name='preis',
field=models.DecimalField(decimal_places=2, default=0.0, max_digits=5),
),
migrations.AlterField(
model_name='bestellung',
name='status',
field=models.CharField(choices=[('offen', 'Offen'), ('abgeholt', 'Abgeholt'), ('verwaist', 'Nicht abgeholt'), ('bezahlt', 'Bezahlt'), ('storniert', 'Storniert')], default='offen', max_length=10),
),
migrations.AlterField(
model_name='person',
name='klasse',
field=models.CharField(blank=True, max_length=4, null=True),
),
migrations.AlterField(
model_name='person',
name='rolle',
field=models.CharField(choices=[('schueler', 'Schüler'), ('lehrer', 'Lehrer'), ('mitarbeiter', 'Mensa-Mitarbeiter'), ('chef', 'Mensa-Leitung')], max_length=20),
),
]

View File

57
mensa_app/models.py Normal file
View File

@@ -0,0 +1,57 @@
from django.db import models
from django.contrib.auth.models import User
from django.utils import timezone
class Person(models.Model):
"""Repräsentiert Schüler oder Lehrer."""
user = models.OneToOneField(User, on_delete=models.CASCADE)
rolle = models.CharField(max_length=20, choices=[('schueler', 'Schüler'), ('lehrer', 'Lehrer'), ('mitarbeiter','Mensa-Mitarbeiter'), ('chef','Mensa-Leitung')])
klasse = models.CharField(max_length=4, blank=True, null=True) # Nur für Schüler relevant
def __str__(self):
return f"{self.user.username} ({self.rolle})"
class SpeiseplanTag(models.Model):
"""Ein bestimmter Tag im Speiseplan."""
datum = models.DateField(unique=True)
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)
def __str__(self):
return self.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')
gericht = models.ForeignKey(Gericht, on_delete=models.CASCADE)
preis = models.DecimalField(max_digits=5, decimal_places=2)
def __str__(self):
return f"{self.tag.datum}: {self.gericht.name} ({self.preis}€)"
class Bestellung(models.Model):
"""Eine abgeschlossene Bestellung eines Nutzers."""
STATUS_CHOICES = [
('offen', 'Offen'),
('abgeholt', 'Abgeholt'),
('verwaist', 'Nicht abgeholt'),
('bezahlt', 'Bezahlt'),
('storniert', 'Storniert'),
]
person = models.ForeignKey(Person, on_delete=models.CASCADE)
menue = models.ForeignKey(Menue, on_delete=models.CASCADE)
datum_bestellung = models.DateTimeField(default=timezone.now)
status = models.CharField(max_length=10, choices=STATUS_CHOICES, default='offen')
bezahlt = models.BooleanField(default=False)
def __str__(self):
return f"Bestellung {self.id} von {self.person.user.username}"

3
mensa_app/tests.py Normal file
View File

@@ -0,0 +1,3 @@
from django.test import TestCase
# Create your tests here.

3
mensa_app/views.py Normal file
View File

@@ -0,0 +1,3 @@
from django.shortcuts import render
# Create your views here.