Browse Source

Přidáno exportítko CSV řešitelů + použito pro řešitele ročníku

export_seznamu_prednasek
Pavel 'LEdoian' Turinsky 3 years ago
committed by Pavel "LEdoian" Turinsky
parent
commit
6162d0d671
  1. 70
      personalni/views.py
  2. 4
      seminar/templates/seminar/archiv/rocnik.html
  3. 5
      seminar/urls.py
  4. 9
      seminar/views/views_all.py

70
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

4
seminar/templates/seminar/archiv/rocnik.html

@ -119,7 +119,9 @@
{% if user.je_org %}
<div class='mam-org-only'>
<a href='vysledkovka.tex' download>Výsledkovka ročníku (LaTeX, včetně neveřejných)</a>
<p><a href='vysledkovka.tex' download>Výsledkovka ročníku (LaTeX, včetně neveřejných)</a></p>
{# FIXME: Sice to sem asi nepatří sémanticky, ale bylo to nejjednodušší… #}
<p><a href='{% url 'seminar_rocnik_resitele_csv' rocnik=rocnik.rocnik %}' download>CSV export řešitelů</a></p>
<h2>Výsledková listina včetně neveřejných bodů</h2>
{% include "vysledkovky/vysledkovka_rocnik_neverejna.html" %}
</div>

5
seminar/urls.py

@ -36,6 +36,11 @@ urlpatterns = [
org_required(views.RocnikVysledkovkaView.as_view()),
name='seminar_rocnik_vysledkovka'
),
path(
'rocnik/<int:rocnik>/resitele.csv',
org_required(views.resiteleRocnikuCsvExportView),
name='seminar_rocnik_resitele_csv'
),
path(
'cislo/<int:rocnik>.<str:cislo>/vysledkovka.tex',
org_required(views.CisloVysledkovkaView.as_view()),

9
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):

Loading…
Cancel
Save