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 from django.http import Http404 from django.core.exceptions import PermissionDenied import csv import various.views.generic from personalni.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 # Kontaktníčky def soustredeniKontaktnicekPdfView(request, soustredeni): return soustredeniKontaktnicekView(request, soustredeni, "pdf") def soustredeniKontaktnicekVcfView(request, soustredeni): return soustredeniKontaktnicekView(request, soustredeni, "vcf") def soustredeniKontaktnicekView(request, soustredeni, typ): soustredeni = get_object_or_404(Soustredeni, id=soustredeni) # nebyl jsi tam, nebo nejsi org if (not request.user in [u.osoba.user for u in soustredeni.ucastnici.all()]) and not request.user.je_org: raise PermissionDenied() kontaktnicky = { 'pdf': (soustredeni.kontaktnicek_pdf, 'applcation/pdf', 'rb'), 'vcf': (soustredeni.kontaktnicek_vcf, 'text/vcard', 'rb'), } try: field, mime, otevreni = kontaktnicky[typ] except KeyError as e: raise ValueError("Neznámý typ kontaktníčku") from e # není k dispozici if not field: raise Http404() with open(field.path, otevreni) as kontaktnicek: response = HttpResponse(kontaktnicek.read(), content_type=mime) response['Content-Disposition'] = 'attachment; filename="kontaktnicek.{}"'.format(typ) return response