import os from django.conf import settings from django.contrib.auth.decorators import login_required, permission_required from django.http import FileResponse from django.shortcuts import get_object_or_404, redirect, render from django.utils import timezone from django.utils.translation import gettext_lazy as _ from calendarweek import CalendarWeek from constance import config from aleksis.core.util import messages from .forms import PosterUploadForm from .models import Poster from .settings import BASE_DIR @login_required @permission_required("resint.add_poster") def upload(request): if request.method == 'POST': form = PosterUploadForm(request.POST, request.FILES) if form.is_valid(): form.save() messages.success(request, _("The poster was uploaded successfully.")) return redirect('poster_index') else: form = PosterUploadForm() return render(request, 'resint/upload.html', { 'form': form }) @login_required @permission_required("resint.add_poster") def delete(request, id): poster = get_object_or_404(Poster, pk=id) poster.delete() messages.success(request, _("The poster was deleted successfully.")) return redirect("poster_index") @login_required @permission_required("poster.add_poster") def index(request): posters = Poster.objects.all().order_by("calendar_week", "year") return render(request, 'resint/index.html', {"posters": posters}) 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() cw = CalendarWeek.from_date(current_date) # Create datetime with the friday of the week and the toggle time friday = cw[int(config.RESINT_NEW_WEEK_DAY)] friday = timezone.datetime.combine(friday, config.RESINT_NEW_WEEK_TIME) # Check whether to show the poster of the next week or the current week if current_date > friday: cw += 1 # Look for matching PDF in DB try: obj = Poster.objects.get(year=cw.year, calendar_week=cw.week) return return_pdf(os.path.join(settings.MEDIA_ROOT, str(obj.pdf))) # Or show the default PDF except Poster.DoesNotExist: return return_default_pdf()