from django.shortcuts import get_object_or_404 from django.urls import reverse from django.views.generic import FormView, ListView from various.views.pomocne import formularOKView from .forms import SifrovackaForm, NapovedaForm from .models import OdpovedUcastnika, SpravnaOdpoved, Napoveda, NapovezenoUcastnikovi, SeznamSifer from personalni.models import Resitel class SifrovackaView(FormView): template_name = 'sifrovacka/sifrovacka.html' form_class = SifrovackaForm def form_valid(self, form): instance = form.save(commit=False) resitel = Resitel.objects.get(osoba__user=self.request.user) instance.resitel = resitel instance.save() sifra = SpravnaOdpoved.objects.filter(sifra=instance.sifra, odpoved__iexact=instance.odpoved.strip()).first() if sifra is None: return formularOKView(self.request, f'<h1>Bohužel vám hvězdy nebyly nakloněny. Rozumějte <i>máte to blbě</i>.</h1> <p><a href="{reverse("sifrovacka")}">Zkusit znovu.</a></p><br><br><br>') instance.uspech = True instance.save() return formularOKView(self.request, f'<h1>{sifra.skryty_text}</h1> <p><a href="{reverse("sifrovacka")}">Odevzdat další.</a></p><br><br><br>') class SifrovackaListView(ListView): template_name = 'sifrovacka/odpovedi_list.html' model = OdpovedUcastnika class SifrovackaNektereListView(SifrovackaListView): def get_queryset(self): seznam = get_object_or_404(SeznamSifer, jmeno=self.kwargs['seznam']) orig = super().get_queryset() return orig.filter(sifra__in=seznam.sifry.all().values('sifra')) # poslední je kvůli tomu, že máme odkaz na celý objekt a ne jen na jméno šifry. class NapovedaView(FormView): template_name = 'sifrovacka/napoveda.html' form_class = NapovedaForm def form_valid(self, form): instance = form.save(commit=False) resitel = Resitel.objects.get(osoba__user=self.request.user) instance.resitel = resitel if NapovezenoUcastnikovi.objects.filter(resitel=resitel, sifra=instance.sifra).first() is None: instance.save() napoveda = Napoveda.objects.filter(sifra=instance.sifra).first() return formularOKView(self.request, f'<h1>Nápověda k šifře číslo {instance.sifra} je:</h1><p>{napoveda.text}</p> <p><a href="{reverse("sifrovacka")}">Odevzdat řešení.</a></p><br><br><br>') class NapovedaListView(ListView): template_name = 'sifrovacka/napovedy_list.html' model = NapovezenoUcastnikovi class PreskoceniView(FormView): template_name = 'sifrovacka/preskoceni.html' form_class = SifrovackaForm initial = {"odpoved": "=======PŘESKOČENO======="} def form_valid(self, form): instance = form.save(commit=False) instance.odpoved = "=======PŘESKOČENO=======" resitel = Resitel.objects.get(osoba__user=self.request.user) instance.resitel = resitel instance.save() sifra = SpravnaOdpoved.objects.filter(sifra=instance.sifra).first() # FIXME co když je více "správných" odpovědí? return formularOKView(self.request, f'<h1>{sifra.skryty_text}</h1> <p><a href="{reverse("sifrovacka")}">Zpět na odevzdávátko.</a></p><br><br><br>')