from django.shortcuts import get_object_or_404 from django.http import HttpResponse from django.views import generic from django.contrib.staticfiles.finders import find import csv import various.views.generic from seminar.views import obalkyView from .models import Soustredeni, Soustredeni_Ucastnici from various.models import Nastaveni class SoustredeniListView(generic.ListView): model = Soustredeni template_name = 'soustredeni/seznam_soustredeni.html' def get_queryset(self): if not self.request.user.je_org: return super().get_queryset() return ( super().get_queryset() .prefetch_related( "ucastnici", "ucastnici__osoba", "organizatori", "organizatori__osoba", "galerie_set", ) .select_related("rocnik") ) class KonkretniSoustredeniMixin: """ Přidá k View s parametrem `soustredeni` atribut `self.soustredeni` """ def setup(self, request, *args, **kwargs): super().setup(request, *args, **kwargs) soustredeni_id = self.kwargs["soustredeni"] self.soustredeni = get_object_or_404(Soustredeni, id=soustredeni_id) class SoustredeniUcastniciBaseView( KonkretniSoustredeniMixin, various.views.generic.NeprazdnyListView, ): """ Slouží jako ListView účastníků soustředění + háže inteligentní chybu při soustředění bez účastníků """ model = Soustredeni_Ucastnici if_prazdny_title = "K soustředění nejsou přidaní žádní účastníci" if_prazdny_text = "K tebou zvolenému soustředění nejsou přidaní žádní účastníci, tedy není co zobrazit. Můžeš to zkusit změnit v adminu, případně se zeptej webařů :-)" def get_queryset(self): return Soustredeni_Ucastnici.objects.filter( soustredeni=self.soustredeni).select_related('resitel', 'resitel__osoba') # FIXME předělat jako ostatní (vyžaduje předělání `obalkyView`) def soustredeniObalkyView(request, soustredeni): soustredeni = get_object_or_404(Soustredeni, id=soustredeni) return obalkyView(request, soustredeni.ucastnici.all()) class SoustredeniMailyUcastnikuView(SoustredeniUcastniciBaseView): """ Seznam e-mailů řešitelů oddělených čárkami. """ template_name = 'soustredeni/maily_ucastniku.txt' class SoustredeniUcastniciView(SoustredeniUcastniciBaseView): """ HTML tabulka účastníků pro tisk. """ template_name = 'soustredeni/seznam_ucastniku.html' class SoustredeniUcastniciExportView(SoustredeniUcastniciBaseView): """ CSV tabulka účastníků. """ def render(self, request, *args, **kwargs): response = HttpResponse(content_type='text/csv') response['Content-Disposition'] = 'attachment; filename="ucastnici.csv"' writer = csv.writer(response) writer.writerow(["jmeno", "prijmeni", "rok_maturity", "telefon", "email", "ulice", "mesto", "psc","stat"]) for u in self.object_list: o = u.resitel.osoba writer.writerow([o.jmeno, o.prijmeni, str(u.resitel.rok_maturity), o.telefon, o.email, o.ulice, o.mesto, o.psc, o.stat.name]) return response class SoustredeniStvrzenkyView( various.views.generic.TeXResponseMixin, SoustredeniUcastniciBaseView, ): template_name = 'soustredeni/stvrzenky.tex' dalsi_potrebne_soubory = [find('soustredeni/logomm.pdf')] if_prazdny_title = "Není pro koho vyrobit stvrzenky." if_prazdny_text = "Právě ses pokusil/a vygenerovat stvrzenky pro prázdnou množinu lidí. Můžeš to zkusit změnit, případně se zeptej webařů :-)" def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) context["castka"] = Nastaveni.get_solo().cena_sous context["soustredeni"] = self.soustredeni context["ucastnici"] = self.object_list return context class SoustredeniAbstraktyView(generic.DetailView): model = Soustredeni template_name = 'soustredeni/export_do_abstraktu.html' pk_url_kwarg = 'soustredeni' # v url bude místo defaultně požadovaného