Basti
parent
81f2e2a19a
commit
f52e066ca9
@ -0,0 +1,22 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
"""Django's command-line utility for administrative tasks."""
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
"""Run administrative tasks."""
|
||||||
|
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'webprog5.settings')
|
||||||
|
try:
|
||||||
|
from django.core.management import execute_from_command_line
|
||||||
|
except ImportError as exc:
|
||||||
|
raise ImportError(
|
||||||
|
"Couldn't import Django. Are you sure it's installed and "
|
||||||
|
"available on your PYTHONPATH environment variable? Did you "
|
||||||
|
"forget to activate a virtual environment?"
|
||||||
|
) from exc
|
||||||
|
execute_from_command_line(sys.argv)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main()
|
@ -0,0 +1,19 @@
|
|||||||
|
from django.contrib import admin
|
||||||
|
from .models import Meal, Comment, DailyMenu, Mensa
|
||||||
|
|
||||||
|
# Register your models here.
|
||||||
|
@admin.register(Mensa)
|
||||||
|
class MensaAdmin(admin.ModelAdmin):
|
||||||
|
pass
|
||||||
|
|
||||||
|
@admin.register(Meal)
|
||||||
|
class MealAdmin(admin.ModelAdmin):
|
||||||
|
pass
|
||||||
|
|
||||||
|
@admin.register(Comment)
|
||||||
|
class CommentAdmin(admin.ModelAdmin):
|
||||||
|
pass
|
||||||
|
|
||||||
|
@admin.register(DailyMenu)
|
||||||
|
class DailyMenuAdmin(admin.ModelAdmin):
|
||||||
|
pass
|
@ -0,0 +1,6 @@
|
|||||||
|
from django.apps import AppConfig
|
||||||
|
|
||||||
|
|
||||||
|
class MensaConfig(AppConfig):
|
||||||
|
default_auto_field = 'django.db.models.BigAutoField'
|
||||||
|
name = 'mensa'
|
@ -0,0 +1,10 @@
|
|||||||
|
from django import forms
|
||||||
|
|
||||||
|
class FilterForm(forms.Form):
|
||||||
|
vegan = forms.BooleanField(label="Vegan", label_suffix="", required=False)
|
||||||
|
vegetarian = forms.BooleanField(label="Vegetarisch", label_suffix="", required=False)
|
||||||
|
price_for = forms.ChoiceField(choices=(('s', 'Student'), ('e','Employee'), ('g', 'Guest')), widget=forms.RadioSelect)
|
||||||
|
|
||||||
|
class CommentForm(forms.Form):
|
||||||
|
username = forms.CharField(max_length=100)
|
||||||
|
text = forms.CharField(max_length=700)
|
@ -0,0 +1,102 @@
|
|||||||
|
from .models import Mensa, DailyMenu, Meal
|
||||||
|
|
||||||
|
import requests
|
||||||
|
import datetime
|
||||||
|
|
||||||
|
|
||||||
|
def fetch_mensa(mensa_id):
|
||||||
|
res = requests.get('https://mensa.fly.dev/' + str(mensa_id))
|
||||||
|
if res.status_code != 200:
|
||||||
|
raise Exception('request failed')
|
||||||
|
return res.json()
|
||||||
|
|
||||||
|
|
||||||
|
def save_in_database(mensa_id):
|
||||||
|
# save mensa with mensa_id 'mensa_id' in database if entry does not exit yet
|
||||||
|
if mensa_id not in [m.mensa_id for m in Mensa.objects.all()]:
|
||||||
|
Mensa(mensa_id=mensa_id).save()
|
||||||
|
|
||||||
|
# get mensa with 'mensa_id' from database
|
||||||
|
mensa = Mensa.objects.get(mensa_id=mensa_id)
|
||||||
|
|
||||||
|
# cycle through days listed in fetched data
|
||||||
|
for day in fetch_mensa(mensa_id):
|
||||||
|
# save daily_menu for mensa with 'mensa_id' in database if entry does not exist yet
|
||||||
|
if day['day'] + str(mensa_id) not in [str(day.date) + str(day.mensa) for day in DailyMenu.objects.all()]:
|
||||||
|
DailyMenu(date=day['day'], mensa=mensa).save()
|
||||||
|
|
||||||
|
# get this mensas daily_menu for current day from database
|
||||||
|
daily_menu = DailyMenu.objects.get(date=day['day'], mensa=mensa)
|
||||||
|
|
||||||
|
# cycle through meals listed in current day
|
||||||
|
for meal in day['menus']:
|
||||||
|
name = meal['name']
|
||||||
|
|
||||||
|
# if meal with name 'name' already exists in database
|
||||||
|
if name in [meal_object.name for meal_object in Meal.objects.all()]:
|
||||||
|
# simply add current daily_menu to it's related_daily_menus
|
||||||
|
Meal.objects.get(name=name).related_daily_menus.add(daily_menu)
|
||||||
|
|
||||||
|
# otherwise
|
||||||
|
else:
|
||||||
|
# create new meal object, save in database and add current daily_menu to it's related_daily_menus
|
||||||
|
art = meal['art']
|
||||||
|
types = ' '.join(meal['types'])
|
||||||
|
allergens = ' '.join(meal['allergens'])
|
||||||
|
price_student = 0
|
||||||
|
price_employee = 0
|
||||||
|
price_guest = 0
|
||||||
|
if " / " in meal['price']:
|
||||||
|
price_student = float(meal['price'].split(' / ')[0].replace('€', '').replace(',', '.'))
|
||||||
|
price_employee = float(meal['price'].split(' / ')[1].replace('€', '').replace(',', '.'))
|
||||||
|
price_guest = float(meal['price'].split(' / ')[2].replace('€', '').replace(',', '.'))
|
||||||
|
|
||||||
|
new_meal = Meal(art=art, name=name, price_student=price_student, price_employee=price_employee, price_guest=price_guest, allergens=allergens, types=types)
|
||||||
|
new_meal.save()
|
||||||
|
new_meal.related_daily_menus.add(daily_menu)
|
||||||
|
new_meal.save()
|
||||||
|
|
||||||
|
|
||||||
|
def get_filtered_plan(mensa_id, flags):
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
week = []
|
||||||
|
for menu in DailyMenu.objects.filter(mensa=Mensa.objects.get(mensa_id=mensa_id), date__week=datetime.date.today().isocalendar().week):
|
||||||
|
meals = []
|
||||||
|
for meal in Meal.objects.filter(related_daily_menus=menu, types__contains='vn' if flags['vegan'] else 've' if flags['vegetarian'] else ''):
|
||||||
|
meals.append({
|
||||||
|
'art': meal.art,
|
||||||
|
'name': meal.name,
|
||||||
|
'price': meal.price_student if flags['price_for'] == 's' else meal.price_employee if flags['price_for'] == 'e' else meal.price_guest,
|
||||||
|
'allergens': meal.allergens,
|
||||||
|
'types': meal.types,
|
||||||
|
'likes': meal.likes,
|
||||||
|
'dislikes': meal.dislikes,
|
||||||
|
'pk': meal.pk
|
||||||
|
})
|
||||||
|
week.append({'date': menu.date, 'meals': meals})
|
||||||
|
return week
|
||||||
|
|
||||||
|
|
||||||
|
def filter_plan_old(plan, flags):
|
||||||
|
for day in plan:
|
||||||
|
filtered_menus = []
|
||||||
|
for menu in day['menus']:
|
||||||
|
if ' / ' in menu['price']:
|
||||||
|
if flags['price_for'] == 's':
|
||||||
|
menu['price'] = menu['price'].split(' / ')[0]
|
||||||
|
elif flags['price_for'] == 'e':
|
||||||
|
menu['price'] = menu['price'].split(' / ')[1]
|
||||||
|
elif flags['price_for'] == 'g':
|
||||||
|
menu['price'] = menu['price'].split(' / ')[2]
|
||||||
|
if flags['vegan'] == True:
|
||||||
|
if 'vn' in menu['types']:
|
||||||
|
filtered_menus.append(menu)
|
||||||
|
elif flags['vegetarian'] == True:
|
||||||
|
if 've' in menu['types']:
|
||||||
|
filtered_menus.append(menu)
|
||||||
|
else:
|
||||||
|
filtered_menus.append(menu)
|
||||||
|
day['menus'] = filtered_menus
|
||||||
|
return plan
|
@ -0,0 +1,24 @@
|
|||||||
|
# Generated by Django 4.1.3 on 2022-11-29 16:06
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
initial = True
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='dish',
|
||||||
|
fields=[
|
||||||
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('name', models.CharField(max_length=100)),
|
||||||
|
('priceStudent', models.DecimalField(decimal_places=4, max_digits=6)),
|
||||||
|
('priceEmployee', models.DecimalField(decimal_places=4, max_digits=6)),
|
||||||
|
('priceGast', models.DecimalField(decimal_places=4, max_digits=6)),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
]
|
@ -0,0 +1,38 @@
|
|||||||
|
# Generated by Django 4.1.3 on 2022-11-29 16:19
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('mensa', '0001_initial'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='dish',
|
||||||
|
name='allergens',
|
||||||
|
field=models.CharField(default='green', max_length=100),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='dish',
|
||||||
|
name='types',
|
||||||
|
field=models.CharField(default='vegan', max_length=100),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='dish',
|
||||||
|
name='priceEmployee',
|
||||||
|
field=models.DecimalField(decimal_places=4, default=4.34, max_digits=6),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='dish',
|
||||||
|
name='priceGast',
|
||||||
|
field=models.DecimalField(decimal_places=4, default=5.34, max_digits=6),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='dish',
|
||||||
|
name='priceStudent',
|
||||||
|
field=models.DecimalField(decimal_places=4, default=3.34, max_digits=6),
|
||||||
|
),
|
||||||
|
]
|
@ -0,0 +1,28 @@
|
|||||||
|
# Generated by Django 4.1.3 on 2022-12-02 16:48
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('mensa', '0002_dish_allergens_dish_types_alter_dish_priceemployee_and_more'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='dish',
|
||||||
|
name='priceEmployee',
|
||||||
|
field=models.CharField(max_length=100),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='dish',
|
||||||
|
name='priceGast',
|
||||||
|
field=models.CharField(max_length=100),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='dish',
|
||||||
|
name='priceStudent',
|
||||||
|
field=models.CharField(max_length=100),
|
||||||
|
),
|
||||||
|
]
|
@ -0,0 +1,42 @@
|
|||||||
|
# Generated by Django 4.1.3 on 2022-12-02 17:09
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
import django.db.models.deletion
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('mensa', '0003_alter_dish_priceemployee_alter_dish_pricegast_and_more'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='dish',
|
||||||
|
name='dislikes',
|
||||||
|
field=models.IntegerField(default=0, max_length=100),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='dish',
|
||||||
|
name='likes',
|
||||||
|
field=models.IntegerField(default=0, max_length=100),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='dish',
|
||||||
|
name='allergens',
|
||||||
|
field=models.CharField(max_length=100),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='dish',
|
||||||
|
name='types',
|
||||||
|
field=models.CharField(max_length=100),
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='comments',
|
||||||
|
fields=[
|
||||||
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('comment', models.CharField(max_length=700)),
|
||||||
|
('dish', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='mensa.dish')),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
]
|
@ -0,0 +1,32 @@
|
|||||||
|
# Generated by Django 4.1.4 on 2022-12-12 16:28
|
||||||
|
|
||||||
|
from django.db import migrations
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('mensa', '0004_dish_dislikes_dish_likes_alter_dish_allergens_and_more'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.RenameModel(
|
||||||
|
old_name='comments',
|
||||||
|
new_name='Comment',
|
||||||
|
),
|
||||||
|
migrations.RenameField(
|
||||||
|
model_name='dish',
|
||||||
|
old_name='priceEmployee',
|
||||||
|
new_name='price_employee',
|
||||||
|
),
|
||||||
|
migrations.RenameField(
|
||||||
|
model_name='dish',
|
||||||
|
old_name='priceGast',
|
||||||
|
new_name='price_guest',
|
||||||
|
),
|
||||||
|
migrations.RenameField(
|
||||||
|
model_name='dish',
|
||||||
|
old_name='priceStudent',
|
||||||
|
new_name='price_student',
|
||||||
|
),
|
||||||
|
]
|
@ -0,0 +1,44 @@
|
|||||||
|
# Generated by Django 4.1.4 on 2022-12-12 16:58
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
import django.db.models.deletion
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('mensa', '0005_rename_comments_comment_and_more'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='Day',
|
||||||
|
fields=[
|
||||||
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('date', models.DateField()),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='Menu',
|
||||||
|
fields=[
|
||||||
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('name', models.CharField(max_length=100)),
|
||||||
|
('price_student', models.CharField(max_length=100)),
|
||||||
|
('price_employee', models.CharField(max_length=100)),
|
||||||
|
('price_guest', models.CharField(max_length=100)),
|
||||||
|
('allergens', models.CharField(max_length=100)),
|
||||||
|
('types', models.CharField(max_length=100)),
|
||||||
|
('likes', models.IntegerField(default=0, max_length=100)),
|
||||||
|
('dislikes', models.IntegerField(default=0, max_length=100)),
|
||||||
|
('day', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='mensa.day')),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='comment',
|
||||||
|
name='dish',
|
||||||
|
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='mensa.menu'),
|
||||||
|
),
|
||||||
|
migrations.DeleteModel(
|
||||||
|
name='dish',
|
||||||
|
),
|
||||||
|
]
|
@ -0,0 +1,29 @@
|
|||||||
|
# Generated by Django 4.1.4 on 2022-12-12 17:20
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
import django.db.models.deletion
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('mensa', '0006_day_menu_alter_comment_dish_delete_dish'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='menu',
|
||||||
|
name='day',
|
||||||
|
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='day', to='mensa.day'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='menu',
|
||||||
|
name='dislikes',
|
||||||
|
field=models.IntegerField(default=0),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='menu',
|
||||||
|
name='likes',
|
||||||
|
field=models.IntegerField(default=0),
|
||||||
|
),
|
||||||
|
]
|
@ -0,0 +1,26 @@
|
|||||||
|
# Generated by Django 4.1.4 on 2022-12-12 18:01
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
import django.db.models.deletion
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('mensa', '0007_alter_menu_day_alter_menu_dislikes_alter_menu_likes'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='Mensa',
|
||||||
|
fields=[
|
||||||
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('mensa_id', models.CharField(max_length=100)),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='day',
|
||||||
|
name='mensa',
|
||||||
|
field=models.ForeignKey(default=0, on_delete=django.db.models.deletion.CASCADE, to='mensa.mensa'),
|
||||||
|
),
|
||||||
|
]
|
@ -0,0 +1,18 @@
|
|||||||
|
# Generated by Django 4.1.4 on 2022-12-12 18:57
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('mensa', '0008_mensa_day_mensa'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='mensa',
|
||||||
|
name='mensa_id',
|
||||||
|
field=models.IntegerField(),
|
||||||
|
),
|
||||||
|
]
|
@ -0,0 +1,17 @@
|
|||||||
|
# Generated by Django 4.1.4 on 2022-12-12 19:21
|
||||||
|
|
||||||
|
from django.db import migrations
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('mensa', '0009_alter_mensa_mensa_id'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.RenameModel(
|
||||||
|
old_name='Day',
|
||||||
|
new_name='DayPlan',
|
||||||
|
),
|
||||||
|
]
|
@ -0,0 +1,18 @@
|
|||||||
|
# Generated by Django 4.1.4 on 2022-12-12 19:22
|
||||||
|
|
||||||
|
from django.db import migrations
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('mensa', '0010_rename_day_dayplan'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.RenameField(
|
||||||
|
model_name='menu',
|
||||||
|
old_name='day',
|
||||||
|
new_name='day_plan',
|
||||||
|
),
|
||||||
|
]
|
@ -0,0 +1,22 @@
|
|||||||
|
# Generated by Django 4.1.4 on 2022-12-12 19:41
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('mensa', '0011_rename_day_menu_day_plan'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='menu',
|
||||||
|
name='day_plan',
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='menu',
|
||||||
|
name='day_plans',
|
||||||
|
field=models.ManyToManyField(to='mensa.dayplan'),
|
||||||
|
),
|
||||||
|
]
|
@ -0,0 +1,49 @@
|
|||||||
|
# Generated by Django 4.1.4 on 2022-12-12 20:18
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
import django.db.models.deletion
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('mensa', '0012_remove_menu_day_plan_menu_day_plans'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='Meal',
|
||||||
|
fields=[
|
||||||
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('name', models.CharField(max_length=100)),
|
||||||
|
('price_student', models.CharField(max_length=100)),
|
||||||
|
('price_employee', models.CharField(max_length=100)),
|
||||||
|
('price_guest', models.CharField(max_length=100)),
|
||||||
|
('allergens', models.CharField(max_length=100)),
|
||||||
|
('types', models.CharField(max_length=100)),
|
||||||
|
('likes', models.IntegerField(default=0)),
|
||||||
|
('dislikes', models.IntegerField(default=0)),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='comment',
|
||||||
|
name='dish',
|
||||||
|
),
|
||||||
|
migrations.RenameModel(
|
||||||
|
old_name='DayPlan',
|
||||||
|
new_name='DailyMenu',
|
||||||
|
),
|
||||||
|
migrations.DeleteModel(
|
||||||
|
name='Menu',
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='meal',
|
||||||
|
name='related_daily_menus',
|
||||||
|
field=models.ManyToManyField(to='mensa.dailymenu'),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='comment',
|
||||||
|
name='meal',
|
||||||
|
field=models.ForeignKey(default=None, on_delete=django.db.models.deletion.CASCADE, to='mensa.meal'),
|
||||||
|
),
|
||||||
|
]
|
@ -0,0 +1,25 @@
|
|||||||
|
# Generated by Django 4.1.4 on 2022-12-12 21:12
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
import django.db.models.deletion
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('mensa', '0013_meal_remove_comment_dish_rename_dayplan_dailymenu_and_more'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='Week',
|
||||||
|
fields=[
|
||||||
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='dailymenu',
|
||||||
|
name='week',
|
||||||
|
field=models.ForeignKey(default=0, on_delete=django.db.models.deletion.CASCADE, to='mensa.week'),
|
||||||
|
),
|
||||||
|
]
|
@ -0,0 +1,20 @@
|
|||||||
|
# Generated by Django 4.1.4 on 2022-12-13 02:17
|
||||||
|
|
||||||
|
from django.db import migrations
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('mensa', '0014_week_dailymenu_week'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='dailymenu',
|
||||||
|
name='week',
|
||||||
|
),
|
||||||
|
migrations.DeleteModel(
|
||||||
|
name='Week',
|
||||||
|
),
|
||||||
|
]
|
@ -0,0 +1,18 @@
|
|||||||
|
# Generated by Django 4.1.4 on 2022-12-13 02:48
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('mensa', '0015_remove_dailymenu_week_delete_week'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='meal',
|
||||||
|
name='art',
|
||||||
|
field=models.CharField(default=None, max_length=100),
|
||||||
|
),
|
||||||
|
]
|
@ -0,0 +1,28 @@
|
|||||||
|
# Generated by Django 4.1.4 on 2022-12-13 03:05
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('mensa', '0016_meal_art'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='meal',
|
||||||
|
name='price_employee',
|
||||||
|
field=models.FloatField(max_length=100),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='meal',
|
||||||
|
name='price_guest',
|
||||||
|
field=models.FloatField(max_length=100),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='meal',
|
||||||
|
name='price_student',
|
||||||
|
field=models.FloatField(max_length=100),
|
||||||
|
),
|
||||||
|
]
|
@ -0,0 +1,18 @@
|
|||||||
|
# Generated by Django 4.1.4 on 2022-12-13 04:13
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('mensa', '0017_alter_meal_price_employee_alter_meal_price_guest_and_more'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='comment',
|
||||||
|
name='username',
|
||||||
|
field=models.CharField(default='anon', max_length=100),
|
||||||
|
),
|
||||||
|
]
|
@ -0,0 +1,37 @@
|
|||||||
|
from django.db import models
|
||||||
|
|
||||||
|
class Mensa(models.Model):
|
||||||
|
mensa_id = models.IntegerField()
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return str(self.mensa_id)
|
||||||
|
|
||||||
|
|
||||||
|
class DailyMenu(models.Model):
|
||||||
|
date = models.DateField()
|
||||||
|
mensa = models.ForeignKey(Mensa, on_delete=models.CASCADE, default=0)
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return f"Mensa {self.mensa} - {self.date}"
|
||||||
|
|
||||||
|
|
||||||
|
class Meal(models.Model):
|
||||||
|
related_daily_menus = models.ManyToManyField(DailyMenu)
|
||||||
|
name = models.CharField(max_length=100)
|
||||||
|
art = models.CharField(max_length=100, default=None)
|
||||||
|
price_student = models.FloatField(max_length=100)
|
||||||
|
price_employee = models.FloatField(max_length=100)
|
||||||
|
price_guest = models.FloatField(max_length=100)
|
||||||
|
allergens = models.CharField(max_length=100)
|
||||||
|
types = models.CharField(max_length=100)
|
||||||
|
likes = models.IntegerField(default=0)
|
||||||
|
dislikes = models.IntegerField(default=0)
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return self.name
|
||||||
|
|
||||||
|
|
||||||
|
class Comment(models.Model):
|
||||||
|
meal = models.ForeignKey(Meal, on_delete=models.CASCADE, default=None)
|
||||||
|
username = models.CharField(max_length=100, default='anon')
|
||||||
|
comment = models.CharField(max_length=700)
|
@ -0,0 +1,15 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>MensaApp</title>
|
||||||
|
<link type="text/css" rel="stylesheet" href="/static/base.css" />
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<main>
|
||||||
|
<h1>Mensapläne Flensburg</h1>
|
||||||
|
{% block content %}
|
||||||
|
{% endblock content %}
|
||||||
|
</main>
|
||||||
|
</body>
|
||||||
|
</html>
|
@ -0,0 +1,63 @@
|
|||||||
|
{% extends 'base.html' %}
|
||||||
|
{% block content %}
|
||||||
|
|
||||||
|
<form class="filter" action="{% url 'mensa:mensa_by_id' mensa_id=id %}" method="post">
|
||||||
|
{% csrf_token %}
|
||||||
|
<label>
|
||||||
|
Vegan
|
||||||
|
<input type="checkbox" name="vegan" value="on" {% if vn == True %}checked{% endif %}>
|
||||||
|
</label> |
|
||||||
|
<label>
|
||||||
|
Vegetarisch
|
||||||
|
<input type="checkbox" name="vegetarian" value="on" {% if ve == True %}checked{% endif %}>
|
||||||
|
</label>
|
||||||
|
<br>
|
||||||
|
<label>
|
||||||
|
Student
|
||||||
|
<input type="radio" name="price-for" value="s" {% if price_for == 's' %}checked{% endif %}>
|
||||||
|
</label>
|
||||||
|
<br>
|
||||||
|
<label>
|
||||||
|
Mitarbeiter
|
||||||
|
<input type="radio" name="price-for" value="e" {% if price_for == 'e' %}checked{% endif %}>
|
||||||
|
</label>
|
||||||
|
<br>
|
||||||
|
<label>
|
||||||
|
Gast
|
||||||
|
<input type="radio" name="price-for" value="g" {% if price_for == 'g' %}checked{% endif %}>
|
||||||
|
</label>
|
||||||
|
<br>
|
||||||
|
<button type="submit" name="button">Speichern</button>
|
||||||
|
</form>
|
||||||
|
|
||||||
|
|
||||||
|
<h2>Mensaplan</h2>
|
||||||
|
<div class="plan">
|
||||||
|
|
||||||
|
{% for day in mensa_plan %}
|
||||||
|
<div class="cards">
|
||||||
|
<h2>{{ day.day }}</h2>
|
||||||
|
|
||||||
|
{% for item in day.menus %}
|
||||||
|
<div class="card">
|
||||||
|
<b>{{ item.name }}</b>
|
||||||
|
<p>{{ item.price }}</p>
|
||||||
|
<p>
|
||||||
|
{% for allergy in item.allergens %}
|
||||||
|
{{ allergy }}
|
||||||
|
{% endfor %}
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
{% for type in item.types %}
|
||||||
|
{{ type }}
|
||||||
|
{% endfor %}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
</div>
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{% endblock content %}
|
@ -0,0 +1,57 @@
|
|||||||
|
{% extends 'base.html' %}
|
||||||
|
{% block content %}
|
||||||
|
<form action="{% url "mensa:save" %}" method="post">
|
||||||
|
{% csrf_token %}
|
||||||
|
<label>
|
||||||
|
<textarea name="mensa" id="text" cols="30" rows="1"
|
||||||
|
value="{{mensa|default_if_none:""}}"></textarea>
|
||||||
|
Mensa
|
||||||
|
</label>
|
||||||
|
<label>
|
||||||
|
<textarea name="id" id="text" cols="30" rows="1"
|
||||||
|
value="{{id|default_if_none:""}}"></textarea>
|
||||||
|
ID
|
||||||
|
</label>
|
||||||
|
<label>
|
||||||
|
<textarea name="name" id="text" cols="30" rows="1"
|
||||||
|
value="{{name|default_if_none:""}}"></textarea>
|
||||||
|
Name
|
||||||
|
</label>
|
||||||
|
<label>
|
||||||
|
<textarea name="art" id="text" cols="30" rows="1"
|
||||||
|
value="{{art|default_if_none:""}}"></textarea>
|
||||||
|
vegetrisch usw
|
||||||
|
</label>
|
||||||
|
<label>
|
||||||
|
<textarea name="priceStudents" id="text" cols="30" rows="1"
|
||||||
|
value="{{priceStudents|default_if_none:""}}"></textarea>
|
||||||
|
preise students
|
||||||
|
</label>
|
||||||
|
<label>
|
||||||
|
<textarea name="priceEmployee" id="text" cols="30" rows="1"
|
||||||
|
value="{{priceEmployee|default_if_none:""}}"></textarea>
|
||||||
|
preise angestellte
|
||||||
|
</label>
|
||||||
|
<label>
|
||||||
|
<textarea name="priceGast" id="text" cols="30" rows="1"
|
||||||
|
value="{{priceGast|default_if_none:""}}"></textarea>
|
||||||
|
preis gäste
|
||||||
|
</label>
|
||||||
|
<label>
|
||||||
|
<textarea name="allergens" id="text" cols="30" rows="1"
|
||||||
|
value="{{allergens|default_if_none:""}}"></textarea>
|
||||||
|
allergien
|
||||||
|
</label>
|
||||||
|
<label>
|
||||||
|
<textarea name="types" id="text" cols="30" rows="1"
|
||||||
|
value="{{types|default_if_none:""}}"></textarea>
|
||||||
|
types
|
||||||
|
</label>
|
||||||
|
<input type="submit" value="Save">
|
||||||
|
|
||||||
|
</form>
|
||||||
|
<a href="{% url 'mensa:mensa_flensburg' %}">
|
||||||
|
Zurück
|
||||||
|
</a>
|
||||||
|
|
||||||
|
{% endblock content %}
|
@ -0,0 +1,38 @@
|
|||||||
|
{% extends 'base.html' %}
|
||||||
|
{% block content %}
|
||||||
|
|
||||||
|
<h1>{{meal.name}}</h1>
|
||||||
|
<p>{{meal.art}}</p>
|
||||||
|
<p>Preis für Studenten: {{meal.price_student}}</p>
|
||||||
|
<p>Preis für Mitarbeiter: {{meal.price_employee}}</p>
|
||||||
|
<p>Preis für Gäste: {{meal.price_guest}}</p>
|
||||||
|
<p>Types: {{meal.types}}</p>
|
||||||
|
<p>Allergene: {{meal.allergens}}</p>
|
||||||
|
<p>{{meal.likes}}</p>
|
||||||
|
<p>{{meal.dislikes}}</p>
|
||||||
|
|
||||||
|
|
||||||
|
<form class="" action="{% url 'mensa:meal' meal.pk %}" method="post">
|
||||||
|
{% csrf_token %}
|
||||||
|
{{ form }}
|
||||||
|
<button type="submit" name="button" value="comment">Kommentar Speichern</button>
|
||||||
|
</form>
|
||||||
|
|
||||||
|
<form class="" action="{% url 'mensa:meal' meal.pk %}" method="post">
|
||||||
|
{% csrf_token %}
|
||||||
|
<button type="submit" name="button" value="like">Like</button>
|
||||||
|
</form>
|
||||||
|
|
||||||
|
<form class="" action="{% url 'mensa:meal' meal.pk %}" method="post">
|
||||||
|
{% csrf_token %}
|
||||||
|
<button type="submit" name="button" value="dislike">Dislike</button>
|
||||||
|
</form>
|
||||||
|
|
||||||
|
<div class="comments">
|
||||||
|
{% for comment in comments %}
|
||||||
|
<p>{{comment.username}}</p>
|
||||||
|
<p>{{comment.comment}}</p>
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{% endblock content %}
|
@ -0,0 +1,56 @@
|
|||||||
|
{% extends 'base.html' %}
|
||||||
|
{% block content %}
|
||||||
|
|
||||||
|
<form class="filter" action="{% url 'mensa:mensa_flensburg' %}" method="post">
|
||||||
|
{% csrf_token %}
|
||||||
|
<div class="form-wrapper">
|
||||||
|
{{ form.vegan.errors }}
|
||||||
|
{{ form.vegan.label_tag }}
|
||||||
|
{{ form.vegan }}
|
||||||
|
</div>
|
||||||
|
<div class="form-wrapper">
|
||||||
|
{{ form.vegetarian.errors }}
|
||||||
|
{{ form.vegetarian.label_tag }}
|
||||||
|
{{ form.vegetarian }}
|
||||||
|
</div>
|
||||||
|
<div class="form-wrapper">
|
||||||
|
{{ form.price_for.errors }}
|
||||||
|
{{ form.price_for.label_tag }}
|
||||||
|
{{ form.price_for }}
|
||||||
|
</div>
|
||||||
|
<button type="submit" name="button">Speichern</button>
|
||||||
|
</form>
|
||||||
|
|
||||||
|
|
||||||
|
<a href="{% url 'mensa:meal_form' %}">
|
||||||
|
Neues Gericht hizufügen.
|
||||||
|
</a>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
{% for name, plan in mensa_list.items %}
|
||||||
|
<h2>{{ name }}</h2>
|
||||||
|
<div class="plan">
|
||||||
|
|
||||||
|
{% for day in plan %}
|
||||||
|
<div class="cards">
|
||||||
|
<h3>{{ day.date }}</h3>
|
||||||
|
|
||||||
|
{% for item in day.meals %}
|
||||||
|
<div class="card">
|
||||||
|
<p>{{ item.art }}</p>
|
||||||
|
<b>{{ item.name }}</b>
|
||||||
|
<p>Preis: {{ item.price }}€</p>
|
||||||
|
<p>{{ item.types }}</p>
|
||||||
|
<p>Allergene: {{ item.allergens }}</p>
|
||||||
|
<a href='{% url "mensa:meal" item.pk %}'>{{ item.pk }}</a>
|
||||||
|
</div>
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
</div>
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
</div>
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
{% endblock content %}
|
@ -0,0 +1,3 @@
|
|||||||
|
from django.test import TestCase
|
||||||
|
|
||||||
|
# Create your tests here.
|
@ -0,0 +1,13 @@
|
|||||||
|
from django.urls import path
|
||||||
|
from . import views
|
||||||
|
|
||||||
|
app_name = 'mensa'
|
||||||
|
urlpatterns = [
|
||||||
|
path('', views.mensa_flensburg, name='mensa_flensburg'),
|
||||||
|
path('mensa/<int:mensa_id>', views.mensa_by_id, name='mensa_by_id'),
|
||||||
|
path('meal/<int:meal_id>', views.meal, name='meal'),
|
||||||
|
path('meal/form', views.meal_form, name='meal_form'),
|
||||||
|
path('save/', views.meal_save, name='save'),
|
||||||
|
path('update/<int:id>/', views.meal_update, name='update'),
|
||||||
|
path('delete/<int:id>/', views.meal_delet, name='meal_delet')
|
||||||
|
]
|
@ -0,0 +1,128 @@
|
|||||||
|
from django.shortcuts import render
|
||||||
|
from django.http import HttpResponse
|
||||||
|
from django.views.decorators.cache import cache_page
|
||||||
|
from django.views.generic import DetailView
|
||||||
|
from django.shortcuts import redirect
|
||||||
|
|
||||||
|
from .helpers import get_filtered_plan
|
||||||
|
from .models import Meal, DailyMenu, Mensa, Comment
|
||||||
|
from .forms import FilterForm, CommentForm
|
||||||
|
|
||||||
|
@cache_page(60 * 15)
|
||||||
|
def mensa_flensburg(request):
|
||||||
|
flags = {'vegan': None, 'vegetarian': None, 'price_for': None,}
|
||||||
|
|
||||||
|
if request.method == 'POST':
|
||||||
|
form = FilterForm(request.POST)
|
||||||
|
if form.is_valid():
|
||||||
|
flags['vegan'] = form.cleaned_data['vegan']
|
||||||
|
flags['vegetarian'] = form.cleaned_data['vegetarian']
|
||||||
|
flags['price_for'] = form.cleaned_data['price_for']
|
||||||
|
else:
|
||||||
|
flags['vegan'] = request.COOKIES.get('vegan')
|
||||||
|
flags['vegetarian'] = request.COOKIES.get('vegetarian')
|
||||||
|
flags['price_for'] = request.COOKIES.get('price_for')
|
||||||
|
form = FilterForm(request.COOKIES)
|
||||||
|
|
||||||
|
context = {
|
||||||
|
'mensa_list': {
|
||||||
|
'Hauptmensa': get_filtered_plan(7, flags),
|
||||||
|
'B-Mensa': get_filtered_plan(14, flags),
|
||||||
|
},
|
||||||
|
'form': form,
|
||||||
|
}
|
||||||
|
|
||||||
|
response = render(request, 'mensa_list.html', context)
|
||||||
|
response.set_cookie('vegan', flags['vegan'])
|
||||||
|
response.set_cookie('vegetarian', flags['vegetarian'])
|
||||||
|
response.set_cookie('price_for', flags['price_for'])
|
||||||
|
return response
|
||||||
|
|
||||||
|
|
||||||
|
def meal(request, meal_id):
|
||||||
|
form = CommentForm()
|
||||||
|
|
||||||
|
if request.method == 'POST':
|
||||||
|
if request.POST['button'] == 'comment':
|
||||||
|
form = CommentForm(request.POST)
|
||||||
|
if form.is_valid():
|
||||||
|
username = form.cleaned_data['username']
|
||||||
|
text = form.cleaned_data['text']
|
||||||
|
Comment(meal=Meal.objects.get(pk=meal_id), username=username, comment=text).save()
|
||||||
|
elif request.POST['button'] == 'like':
|
||||||
|
meal = Meal.objects.get(pk=meal_id)
|
||||||
|
meal.likes += 1
|
||||||
|
meal.save()
|
||||||
|
elif request.POST['button'] == 'dislike':
|
||||||
|
meal = Meal.objects.get(pk=meal_id)
|
||||||
|
meal.dislikes += 1
|
||||||
|
meal.save()
|
||||||
|
else:
|
||||||
|
form = CommentForm()
|
||||||
|
|
||||||
|
context = {
|
||||||
|
'meal': Meal.objects.get(pk=meal_id),
|
||||||
|
'form': form,
|
||||||
|
'comments': Comment.objects.filter(meal=Meal.objects.get(pk=meal_id))
|
||||||
|
}
|
||||||
|
return render(request, 'meal.html', context)
|
||||||
|
|
||||||
|
|
||||||
|
@cache_page(60 * 15)
|
||||||
|
def mensa_by_id(request, mensa_id):
|
||||||
|
flags = {'vegan': None, 'vegetarian': None, 'price_for': None,}
|
||||||
|
|
||||||
|
if request.method == 'POST':
|
||||||
|
for key in flags:
|
||||||
|
flags[key] = request.POST.get(key)
|
||||||
|
else:
|
||||||
|
for key in flags:
|
||||||
|
flags[key] = request.COOKIES.get(key)
|
||||||
|
|
||||||
|
context = {
|
||||||
|
'mensa_list': {
|
||||||
|
f'Mensa {mensa_id}': get_filtered_plan((mensa_id), flags),
|
||||||
|
},
|
||||||
|
'flags': flags,
|
||||||
|
}
|
||||||
|
|
||||||
|
response = render(request, 'mensa_list.html', context)
|
||||||
|
response.set_cookie('vegan', flags['vegan'])
|
||||||
|
response.set_cookie('vegetarian', flags['vegetarian'])
|
||||||
|
response.set_cookie('price_for', flags['price_for'])
|
||||||
|
return response
|
||||||
|
|
||||||
|
def meal_form(request):
|
||||||
|
return render(request, 'forms.html')
|
||||||
|
|
||||||
|
def meal_delet(request):
|
||||||
|
return
|
||||||
|
|
||||||
|
def meal_update(request):
|
||||||
|
return
|
||||||
|
|
||||||
|
def meal_save(request):
|
||||||
|
#mensa = request.POST.get('mensa')
|
||||||
|
id = request.POST.get('id')
|
||||||
|
name = request.POST.get('name')
|
||||||
|
art = request.POST.get('art')
|
||||||
|
priceStudents = request.POST.get('priceStudents')
|
||||||
|
priceEmployee = request.POST.get('priceEmployee')
|
||||||
|
priceGast = request.POST.get('priceGast')
|
||||||
|
allergens = request.POST.get('allergens')
|
||||||
|
types = request.POST.get('types')
|
||||||
|
|
||||||
|
b = None
|
||||||
|
if id:
|
||||||
|
b = Meal.objects.get(id=id)
|
||||||
|
b.name = name
|
||||||
|
b.art = art
|
||||||
|
b.priceStudents = priceStudents
|
||||||
|
b.priceEmployee = priceEmployee
|
||||||
|
b.priceGast = priceGast
|
||||||
|
b.allergens = allergens
|
||||||
|
b.types = types
|
||||||
|
else:
|
||||||
|
b = Meal(name=name, art=art, price_student=priceStudents,price_employee=priceEmployee,price_guest=priceGast,allergens=allergens,types=types)
|
||||||
|
b.save()
|
||||||
|
return redirect('mensa:mensa_flensburg')
|
@ -0,0 +1,45 @@
|
|||||||
|
.main {
|
||||||
|
gap: 1rem;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
color:rgba(255, 255, 255, 0.8);
|
||||||
|
background-color: rgba(24, 24, 24, 0.979);
|
||||||
|
font-family: sans-serif;
|
||||||
|
}
|
||||||
|
|
||||||
|
.card {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
box-shadow: 0px 0px 8px rgb(190, 190, 190, 0.8);
|
||||||
|
background-color: rgb(238, 148, 204);
|
||||||
|
margin: 1rem;
|
||||||
|
padding: 0.5rem;
|
||||||
|
font-family: sans-serif;
|
||||||
|
color:rgb(0, 0, 0);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.cards {
|
||||||
|
display: flex;
|
||||||
|
flex-flow: column;
|
||||||
|
flex-basis: 10rem;
|
||||||
|
flex-shrink: 0;
|
||||||
|
flex-grow: 1;
|
||||||
|
color:rgba(255, 255, 255, 0.8);
|
||||||
|
font-family: sans-serif;
|
||||||
|
}
|
||||||
|
|
||||||
|
.plan {
|
||||||
|
display: flex;
|
||||||
|
flex-flow: row;
|
||||||
|
font-family: sans-serif;
|
||||||
|
}
|
||||||
|
form {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
}
|
||||||
|
a{
|
||||||
|
color: white;
|
||||||
|
}
|
@ -0,0 +1,16 @@
|
|||||||
|
"""
|
||||||
|
ASGI config for webprog5 project.
|
||||||
|
|
||||||
|
It exposes the ASGI callable as a module-level variable named ``application``.
|
||||||
|
|
||||||
|
For more information on this file, see
|
||||||
|
https://docs.djangoproject.com/en/4.1/howto/deployment/asgi/
|
||||||
|
"""
|
||||||
|
|
||||||
|
import os
|
||||||
|
|
||||||
|
from django.core.asgi import get_asgi_application
|
||||||
|
|
||||||
|
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'webprog5.settings')
|
||||||
|
|
||||||
|
application = get_asgi_application()
|
@ -0,0 +1,138 @@
|
|||||||
|
"""
|
||||||
|
Django settings for webprog5 project.
|
||||||
|
|
||||||
|
Generated by 'django-admin startproject' using Django 4.1.3.
|
||||||
|
|
||||||
|
For more information on this file, see
|
||||||
|
https://docs.djangoproject.com/en/4.1/topics/settings/
|
||||||
|
|
||||||
|
For the full list of settings and their values, see
|
||||||
|
https://docs.djangoproject.com/en/4.1/ref/settings/
|
||||||
|
"""
|
||||||
|
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
# Build paths inside the project like this: BASE_DIR / 'subdir'.
|
||||||
|
BASE_DIR = Path(__file__).resolve().parent.parent
|
||||||
|
|
||||||
|
|
||||||
|
# Quick-start development settings - unsuitable for production
|
||||||
|
# See https://docs.djangoproject.com/en/4.1/howto/deployment/checklist/
|
||||||
|
|
||||||
|
# SECURITY WARNING: keep the secret key used in production secret!
|
||||||
|
SECRET_KEY = 'django-insecure-axv=x^^fm+u6fy)#@e77(x+!zl8#i4mbsi=c3one%2e3eqisr)'
|
||||||
|
|
||||||
|
# SECURITY WARNING: don't run with debug turned on in production!
|
||||||
|
DEBUG = True
|
||||||
|
|
||||||
|
ALLOWED_HOSTS = []
|
||||||
|
|
||||||
|
|
||||||
|
# Application definition
|
||||||
|
|
||||||
|
INSTALLED_APPS = [
|
||||||
|
'mensa.apps.MensaConfig',
|
||||||
|
'django.contrib.admin',
|
||||||
|
'django.contrib.auth',
|
||||||
|
'django.contrib.contenttypes',
|
||||||
|
'django.contrib.sessions',
|
||||||
|
'django.contrib.messages',
|
||||||
|
'django.contrib.staticfiles'
|
||||||
|
|
||||||
|
]
|
||||||
|
|
||||||
|
MIDDLEWARE = [
|
||||||
|
'django.middleware.cache.UpdateCacheMiddleware',
|
||||||
|
'django.middleware.security.SecurityMiddleware',
|
||||||
|
'django.contrib.sessions.middleware.SessionMiddleware',
|
||||||
|
'django.middleware.common.CommonMiddleware',
|
||||||
|
'django.middleware.csrf.CsrfViewMiddleware',
|
||||||
|
'django.contrib.auth.middleware.AuthenticationMiddleware',
|
||||||
|
'django.contrib.messages.middleware.MessageMiddleware',
|
||||||
|
'django.middleware.clickjacking.XFrameOptionsMiddleware',
|
||||||
|
'django.middleware.cache.FetchFromCacheMiddleware',
|
||||||
|
]
|
||||||
|
|
||||||
|
ROOT_URLCONF = 'webprog5.urls'
|
||||||
|
|
||||||
|
TEMPLATES = [
|
||||||
|
{
|
||||||
|
'BACKEND': 'django.template.backends.django.DjangoTemplates',
|
||||||
|
'DIRS': [],
|
||||||
|
'APP_DIRS': True,
|
||||||
|
'OPTIONS': {
|
||||||
|
'context_processors': [
|
||||||
|
'django.template.context_processors.debug',
|
||||||
|
'django.template.context_processors.request',
|
||||||
|
'django.contrib.auth.context_processors.auth',
|
||||||
|
'django.contrib.messages.context_processors.messages',
|
||||||
|
],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
]
|
||||||
|
|
||||||
|
WSGI_APPLICATION = 'webprog5.wsgi.application'
|
||||||
|
|
||||||
|
|
||||||
|
# Database
|
||||||
|
# https://docs.djangoproject.com/en/4.1/ref/settings/#databases
|
||||||
|
|
||||||
|
DATABASES = {
|
||||||
|
'default': {
|
||||||
|
'ENGINE': 'django.db.backends.sqlite3',
|
||||||
|
'NAME': BASE_DIR / 'db.sqlite3',
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
# Password validation
|
||||||
|
# https://docs.djangoproject.com/en/4.1/ref/settings/#auth-password-validators
|
||||||
|
|
||||||
|
AUTH_PASSWORD_VALIDATORS = [
|
||||||
|
{
|
||||||
|
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
|
||||||
|
},
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
# Internationalization
|
||||||
|
# https://docs.djangoproject.com/en/4.1/topics/i18n/
|
||||||
|
|
||||||
|
LANGUAGE_CODE = 'en-us'
|
||||||
|
|
||||||
|
TIME_ZONE = 'UTC'
|
||||||
|
|
||||||
|
USE_I18N = True
|
||||||
|
|
||||||
|
USE_TZ = True
|
||||||
|
|
||||||
|
|
||||||
|
# Static files (CSS, JavaScript, Images)
|
||||||
|
# https://docs.djangoproject.com/en/4.1/howto/static-files/
|
||||||
|
|
||||||
|
STATIC_URL = 'static/'
|
||||||
|
|
||||||
|
STATICFILES_DIRS = [
|
||||||
|
BASE_DIR/"static",
|
||||||
|
]
|
||||||
|
|
||||||
|
CACHES = {
|
||||||
|
'default': {
|
||||||
|
'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
|
||||||
|
'LOCATION': 'c:\django-cache'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Default primary key field type
|
||||||
|
# https://docs.djangoproject.com/en/4.1/ref/settings/#default-auto-field
|
||||||
|
|
||||||
|
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
|
@ -0,0 +1,22 @@
|
|||||||
|
"""webprog5 URL Configuration
|
||||||
|
|
||||||
|
The `urlpatterns` list routes URLs to views. For more information please see:
|
||||||
|
https://docs.djangoproject.com/en/4.1/topics/http/urls/
|
||||||
|
Examples:
|
||||||
|
Function views
|
||||||
|
1. Add an import: from my_app import views
|
||||||
|
2. Add a URL to urlpatterns: path('', views.home, name='home')
|
||||||
|
Class-based views
|
||||||
|
1. Add an import: from other_app.views import Home
|
||||||
|
2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
|
||||||
|
Including another URLconf
|
||||||
|
1. Import the include() function: from django.urls import include, path
|
||||||
|
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
|
||||||
|
"""
|
||||||
|
from django.contrib import admin
|
||||||
|
from django.urls import path, include
|
||||||
|
|
||||||
|
urlpatterns = [
|
||||||
|
path('admin/', admin.site.urls),
|
||||||
|
path('', include('mensa.urls')),
|
||||||
|
]
|
@ -0,0 +1,16 @@
|
|||||||
|
"""
|
||||||
|
WSGI config for webprog5 project.
|
||||||
|
|
||||||
|
It exposes the WSGI callable as a module-level variable named ``application``.
|
||||||
|
|
||||||
|
For more information on this file, see
|
||||||
|
https://docs.djangoproject.com/en/4.1/howto/deployment/wsgi/
|
||||||
|
"""
|
||||||
|
|
||||||
|
import os
|
||||||
|
|
||||||
|
from django.core.wsgi import get_wsgi_application
|
||||||
|
|
||||||
|
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'webprog5.settings')
|
||||||
|
|
||||||
|
application = get_wsgi_application()
|
Loading…
Reference in New Issue