import datetime import os import time from django.contrib.auth.decorators import login_required, permission_required from django.http import FileResponse from django.shortcuts import render, redirect from django.utils import timezone from .models import Menu from .settings import BASE_DIR from .forms import MenuUploadForm from aleksis.core.util import messages from django.utils.translation import gettext_lazy as _ @login_required @permission_required("mensa.add_menu") def upload(request): if request.method == 'POST': form = MenuUploadForm(request.POST, request.FILES) if form.is_valid(): form.save() messages.success(request, _("The menu was uploaded successfully.")) return redirect('menu_index') else: form = MenuUploadForm() return render(request, 'mensa/upload.html', { 'form': form }) @login_required @permission_required("mensa.add_menu") def delete(request, id): Menu.objects.get(id=id).delete() messages.success(request, _("The menu was deleted successfully.")) return redirect("menu_index") @login_required @permission_required("menu.add_menu") def index(request): menus = Menu.objects.all().order_by("calendar_week", "year") return render(request, 'mensa/index.html', {"menus": menus}) def return_pdf(filename): """Read and response a PDF file""" file = open(filename, "rb") return FileResponse(file, content_type="application/pdf") def return_default_pdf(): """Response the default PDF""" return return_pdf(os.path.join(BASE_DIR, "default.pdf")) def show_current(request): # Get current date with year and calendar week current_date = timezone.datetime.now() year, calendar_week = current_date.isocalendar()[:2] # Calculate the number of days to next friday days_to_add = 5 - current_date.isoweekday() if days_to_add < 0: days_to_add = days_to_add + 7 if days_to_add == 6 or days_to_add == 7: calendar_week += 1 # Create datetime with next friday and time 14:10 friday = current_date + datetime.timedelta(days=days_to_add) friday_14_10 = timezone.datetime(friday.year, friday.month, friday.day, 14, 10) # Check whether to show the plan of the next week or the current week if current_date > friday_14_10: calendar_week += 1 # Look for matching PDF in DB try: obj = Menu.objects.get(year=year, calendar_week=calendar_week) return return_pdf(os.path.join(settings.MEDIA_ROOT, str(obj.pdf))) # Or show the default PDF except Menu.DoesNotExist: return return_default_pdf()