From 6162d0d6713e13e1b0f7f83ac52d599194e8f923 Mon Sep 17 00:00:00 2001 From: Pavel 'LEdoian' Turinsky Date: Tue, 23 Nov 2021 23:44:00 +0100 Subject: [PATCH] =?UTF-8?q?P=C5=99id=C3=A1no=20export=C3=ADtko=20CSV=20?= =?UTF-8?q?=C5=99e=C5=A1itel=C5=AF=20+=20pou=C5=BEito=20pro=20=C5=99e?= =?UTF-8?q?=C5=A1itele=20ro=C4=8Dn=C3=ADku?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- personalni/views.py | 70 ++++++++++++++++++++ seminar/templates/seminar/archiv/rocnik.html | 4 +- seminar/urls.py | 5 ++ seminar/views/views_all.py | 9 +++ 4 files changed, 87 insertions(+), 1 deletion(-) diff --git a/personalni/views.py b/personalni/views.py index 9ae3c239..7d62fcb3 100644 --- a/personalni/views.py +++ b/personalni/views.py @@ -7,6 +7,7 @@ from django.views.generic.base import TemplateView from django.contrib.auth.models import User, Permission, Group from django.contrib.auth.mixins import LoginRequiredMixin from django.db import transaction +from django.http import HttpResponse import seminar.models as s import seminar.models as m @@ -14,6 +15,7 @@ from .forms import PrihlaskaForm, ProfileEditForm, PoMaturiteProfileEditForm from datetime import date import logging +import csv from seminar.views import formularOKView from various.autentizace.views import LoginView @@ -304,3 +306,71 @@ def profilView(request): return ResitelView.as_view()(request) else: return LoginView.as_view()(request) + +def dataResiteluCsvResponse(queryset, columns=None, with_header=True): + """Pomocná funkce pro vracení dat řešitelů jako CSV. Musí dostat správný QuerySet, který dává Řešitele""" + # TODO: Možná nějak zobecnit i na Osoby? + # TODO: Nemá to spíš být class-based? Tohle je efektivně metoda "get", které ale chybí "get_queryset"… + + default_columns = ( + 'id', + 'osoba__jmeno', + 'osoba__prijmeni', + 'osoba__prezdivka', + 'osoba__email', + 'osoba__telefon', + 'osoba__user', + 'osoba__datum_narozeni', + 'osoba__pohlavi_muz', + 'osoba__ulice', + 'osoba__mesto', + 'osoba__psc', + 'osoba__stat', + 'skola', # Bude fungovat takhle? + 'poznamka', + 'osoba__poznamka', + 'rok_maturity', + 'zasilat', + 'zasilat_cislo_emailem', + 'osoba__datum_registrace', + 'osoba__datum_souhlasu_udaje', + 'osoba__datum_souhlasu_zasilani', + ) + if columns is None: columns = default_columns + + field_name_overrides = { + # Zrušení prefixu "osoba__" + 'osoba__jmeno': 'jmeno', + 'osoba__prijmeni': 'prijmeni', + 'osoba__prezdivka': 'prezdivka', + 'osoba__email': 'email', + 'osoba__telefon': 'telefon', + 'osoba__user': 'user', + 'osoba__datum_narozeni': 'datum_narozeni', + 'osoba__pohlavi_muz': 'pohlavi_muz', + 'osoba__ulice': 'ulice', + 'osoba__mesto': 'mesto', + 'osoba__psc': 'psc', + 'osoba__stat': 'stat', + 'osoba__datum_registrace': 'datum_registrace', + 'osoba__datum_souhlasu_udaje': 'datum_souhlasu_udaje', + 'osoba__datum_souhlasu_zasilani':'datum_souhlasu_zasilani', + } + + def get_field_name(column_name): + if column_name in field_name_overrides: + return field_name_overrides[column_name] + return column_name + + response = HttpResponse(content_type='text/csv') + writer = csv.writer(response) + + # První řádek je záhlaví + if with_header: + writer.writerow(map(get_field_name, columns)) + + # Data: + queryset_list = queryset.values_list(*columns) + writer.writerows(queryset_list) + + return response diff --git a/seminar/templates/seminar/archiv/rocnik.html b/seminar/templates/seminar/archiv/rocnik.html index d5c67e9c..3d7fbc14 100644 --- a/seminar/templates/seminar/archiv/rocnik.html +++ b/seminar/templates/seminar/archiv/rocnik.html @@ -119,7 +119,9 @@ {% if user.je_org %}
- Výsledkovka ročníku (LaTeX, včetně neveřejných) +

Výsledkovka ročníku (LaTeX, včetně neveřejných)

+ {# FIXME: Sice to sem asi nepatří sémanticky, ale bylo to nejjednodušší… #} +

CSV export řešitelů

Výsledková listina včetně neveřejných bodů

{% include "vysledkovky/vysledkovka_rocnik_neverejna.html" %}
diff --git a/seminar/urls.py b/seminar/urls.py index 182bbe7e..0e05f991 100644 --- a/seminar/urls.py +++ b/seminar/urls.py @@ -36,6 +36,11 @@ urlpatterns = [ org_required(views.RocnikVysledkovkaView.as_view()), name='seminar_rocnik_vysledkovka' ), + path( + 'rocnik//resitele.csv', + org_required(views.resiteleRocnikuCsvExportView), + name='seminar_rocnik_resitele_csv' + ), path( 'cislo/./vysledkovka.tex', org_required(views.CisloVysledkovkaView.as_view()), diff --git a/seminar/views/views_all.py b/seminar/views/views_all.py index 1b012bd3..c6d0b853 100644 --- a/seminar/views/views_all.py +++ b/seminar/views/views_all.py @@ -19,6 +19,7 @@ import treenode.templatetags as tnltt import treenode.serializers as vr from vysledkovky.utils import body_resitelu from vysledkovky.views import vysledkovka_rocniku, vysledkovka_cisla +from personalni.views import dataResiteluCsvResponse from datetime import date, datetime from django.utils import timezone @@ -390,6 +391,14 @@ class RocnikView(generic.DetailView): return context +def resiteleRocnikuCsvExportView(request, rocnik): + assert request.method in ('GET', 'HEAD') + return dataResiteluCsvResponse( + utils.resi_v_rocniku( + m.Rocnik.objects.get(rocnik=rocnik) + ) + ) + # FIXME: Pozor, výš je ještě jeden ProblemView! #class ProblemView(generic.DetailView):