From c780e7e35fe24c9e58e1ca7cf6dc00b89a36a761 Mon Sep 17 00:00:00 2001 From: ticvac <vaclav.tichy180@gmail.com> Date: Wed, 5 Mar 2025 18:33:06 +0100 Subject: [PATCH 1/5] pridano ucastnici --- .../personalni/profil/export_lidi.html | 1 + personalni/views.py | 20 +++++++++++++++---- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/personalni/templates/personalni/profil/export_lidi.html b/personalni/templates/personalni/profil/export_lidi.html index 96778449..22b45202 100644 --- a/personalni/templates/personalni/profil/export_lidi.html +++ b/personalni/templates/personalni/profil/export_lidi.html @@ -11,6 +11,7 @@ <option value="2">Řešitelé ročníku</option> <option value="3">Všichni řešitelé, kteří ještě neodmaturovali</option> <option value="4">Organizátoři soustředění</option> + <option value="5">Účastníci soustředění</option> </select> <select name="select-two" id="select-two"> diff --git a/personalni/views.py b/personalni/views.py index 49938f29..ca3aa184 100644 --- a/personalni/views.py +++ b/personalni/views.py @@ -147,7 +147,9 @@ class OrgoRozcestnikView(TemplateView): class PrvniTypExportu(Enum): CISLA = 1 ROCNIKU = 2 - SOUSTREDENI = 4 + SOUSTREDENI_ORG = 4 + SOUSTREDENI_UCASTNICI = 5 + class ExportLidiView(TemplateView): template_name = 'personalni/profil/export_lidi.html' @@ -163,7 +165,9 @@ def get_export_options(request, type): data = [{"id": c.id, "display": str(c)} for c in Cislo.objects.all()] if type == PrvniTypExportu.ROCNIKU.value: data = [{"id": r.id, "display": str(r)} for r in Rocnik.objects.all()] - if type == PrvniTypExportu.SOUSTREDENI.value: + if type == PrvniTypExportu.SOUSTREDENI_ORG.value: + data = [{"id": s.id, "display": str(s)} for s in Soustredeni.objects.all()] + if type == PrvniTypExportu.SOUSTREDENI_UCASTNICI.value: data = [{"id": s.id, "display": str(s)} for s in Soustredeni.objects.all()] return HttpResponse(json.dumps(data), content_type='application/json') @@ -184,14 +188,22 @@ def download_export_csv(request, type, id): name = str(Rocnik.objects.get(id=id)).replace(" ", "_") + "_resitele_rocniku.csv" response['Content-Disposition'] = 'attachment; filename="' + name + '"' return response - if type == PrvniTypExportu.SOUSTREDENI.value: + if type == PrvniTypExportu.SOUSTREDENI_ORG.value: soustredeni = Soustredeni.objects.get(id=id) organizatori = soustredeni.organizatori.all() organizatoriOsoby = Osoba.objects.filter(org__in=organizatori) - response = dataOsobCsvResponse(organizatoriOsoby, columns=("jmeno", "prijmeni", "email", "telefon",)) + response = dataOsobCsvResponse(organizatoriOsoby, columns=("jmeno", "prijmeni", "email", "telefon", "ulice", "mesto", "psc",)) name = str(soustredeni).replace(" ", "_") + "_organizatori_soustredeni.csv" response['Content-Disposition'] = 'attachment; filename="' + name + '"' return response + if type == PrvniTypExportu.SOUSTREDENI_UCASTNICI.value: + soustredeni = Soustredeni.objects.get(id=id) + ucastnici = soustredeni.ucastnici.all() + usaciOsoby = Osoba.objects.filter(resitel__in=ucastnici) + response = dataOsobCsvResponse(usaciOsoby, columns=("jmeno", "prijmeni", "email", "telefon", "ulice", "mesto", "psc",)) + name = str(soustredeni).replace(" ", "_") + "_ucastnici_soustredeni.csv" + response['Content-Disposition'] = 'attachment; filename="' + name + '"' + return response class ResitelView(LoginRequiredMixin,generic.DetailView): model = m.Resitel From 96b66f40198bb0b5481844c0eb50fb070142ff12 Mon Sep 17 00:00:00 2001 From: ticvac <vaclav.tichy180@gmail.com> Date: Wed, 5 Mar 2025 18:44:32 +0100 Subject: [PATCH 2/5] link na odkazy se soustredeni --- soustredeni/templates/soustredeni/seznam_soustredeni.html | 1 + 1 file changed, 1 insertion(+) diff --git a/soustredeni/templates/soustredeni/seznam_soustredeni.html b/soustredeni/templates/soustredeni/seznam_soustredeni.html index 75db6f37..3905f151 100644 --- a/soustredeni/templates/soustredeni/seznam_soustredeni.html +++ b/soustredeni/templates/soustredeni/seznam_soustredeni.html @@ -57,6 +57,7 @@ <a href="../{{soustredeni.pk}}/seznam_ucastniku">HTML tabulka pro tisk</a>, <a href="../{{soustredeni.pk}}/export_ucastniku">CSV</a>, <a href="../{{soustredeni.pk}}/maily_ucastniku">E-maily</a><br> + Exporty pro soustředění: <a href="{% url 'exporty_lidi' %}">exporty</a><br> <a href="../{{soustredeni.pk}}/stvrzenky.pdf">Stvrzenky</a> </div> {% endif %} From eb410082616f438502a88d3bc87da40f096e69d4 Mon Sep 17 00:00:00 2001 From: ticvac <vaclav.tichy180@gmail.com> Date: Wed, 5 Mar 2025 19:14:11 +0100 Subject: [PATCH 3/5] pridani custom checkboxu --- .../personalni/profil/export_lidi.html | 21 ++++++++++++++++--- personalni/views.py | 20 ++++++++++++------ 2 files changed, 32 insertions(+), 9 deletions(-) diff --git a/personalni/templates/personalni/profil/export_lidi.html b/personalni/templates/personalni/profil/export_lidi.html index 22b45202..3b0d7896 100644 --- a/personalni/templates/personalni/profil/export_lidi.html +++ b/personalni/templates/personalni/profil/export_lidi.html @@ -5,6 +5,17 @@ <h2><strong>Export lidí</strong></h2> +<p>Vyberte pole, které chcete exportovat</p> +<p> + <label>( Jméno: <input class="field-check" data-value="jmeno" type="checkbox" checked>)</label> + <label>( Příjmení: <input class="field-check" data-value="prijmeni" type="checkbox" checked>)</label> + <label>( E-mail <input class="field-check" data-value="email" type="checkbox" checked>)</label> + <label>( Telefon <input class="field-check" data-value="telefon" type="checkbox" checked>)</label> + <label>( Ulice <input class="field-check" data-value="ulice" type="checkbox">)</label> + <label>( Město <input class="field-check" data-value="mesto" type="checkbox">)</label> + <label>( PSČ <input class="field-check" data-value="psc" type="checkbox">)</label> +</p> + <select name="select-one" id="select-one"> <option value="0">---</option> <option value="1">Řešitelé čísla</option> @@ -77,12 +88,16 @@ }) download_button.addEventListener('click', (e) => { + // uzivatele vybrana pole + const fields = Array.from(document.getElementsByClassName('field-check')) + .filter(e => e.checked) + .map(e => e.getAttribute('data-value')) + console.log(fields) if (select_two.innerHTML == '') { - window.location.href = "/profil/exporty_lidi/get_csv_only_one_step/" + select_one.value + window.location.href = "/profil/exporty_lidi/get_csv_only_one_step/" + select_one.value + "?fields=" + fields.join(',') } else { - window.location.href = "/profil/exporty_lidi/get_csv/" + select_one.value + "/" + select_two.value + window.location.href = "/profil/exporty_lidi/get_csv/" + select_one.value + "/" + select_two.value + "?fields=" + fields.join(',') } - }) </script> diff --git a/personalni/views.py b/personalni/views.py index ca3aa184..a302e5d2 100644 --- a/personalni/views.py +++ b/personalni/views.py @@ -172,19 +172,27 @@ def get_export_options(request, type): return HttpResponse(json.dumps(data), content_type='application/json') def download_export_csv_only_first_step(request, type): + fields = request.GET.get('fields').split(',') if type == 3: - response = dataResiteluCsvResponse(tvorba_utils.resitele_co_neodmaturovali()) + resitele = tvorba_utils.resitele_co_neodmaturovali() + resiteleOsoby = Osoba.objects.filter(resitel__in=resitele) + response = dataOsobCsvResponse(resiteleOsoby, columns=fields) response['Content-Disposition'] = 'attachment; filename="resitele_co_neodmaturovali.csv"' return response def download_export_csv(request, type, id): + fields = request.GET.get('fields').split(',') if type == PrvniTypExportu.CISLA.value: - response = dataResiteluCsvResponse(tvorba_utils.resi_cislo(Cislo.objects.get(id=id))) + resitele = tvorba_utils.resi_cislo(Cislo.objects.get(id=id)) + resiteleOsoby = Osoba.objects.filter(resitel__in=resitele) + response = dataOsobCsvResponse(resiteleOsoby, columns=fields) name = str(Cislo.objects.get(id=id)).replace(" ", "_") + "_resitele_cisla.csv" response['Content-Disposition'] = 'attachment; filename="' + name + '"' return response if type == PrvniTypExportu.ROCNIKU.value: - response = dataResiteluCsvResponse(tvorba_utils.resi_v_rocniku(Rocnik.objects.get(id=id))) + resitele = tvorba_utils.resi_v_rocniku(Rocnik.objects.get(id=id)) + resiteleOsoby = Osoba.objects.filter(resitel__in=resitele) + response = dataOsobCsvResponse(resiteleOsoby, columns=fields) name = str(Rocnik.objects.get(id=id)).replace(" ", "_") + "_resitele_rocniku.csv" response['Content-Disposition'] = 'attachment; filename="' + name + '"' return response @@ -192,15 +200,15 @@ def download_export_csv(request, type, id): soustredeni = Soustredeni.objects.get(id=id) organizatori = soustredeni.organizatori.all() organizatoriOsoby = Osoba.objects.filter(org__in=organizatori) - response = dataOsobCsvResponse(organizatoriOsoby, columns=("jmeno", "prijmeni", "email", "telefon", "ulice", "mesto", "psc",)) + response = dataOsobCsvResponse(organizatoriOsoby, columns=fields) name = str(soustredeni).replace(" ", "_") + "_organizatori_soustredeni.csv" response['Content-Disposition'] = 'attachment; filename="' + name + '"' return response if type == PrvniTypExportu.SOUSTREDENI_UCASTNICI.value: soustredeni = Soustredeni.objects.get(id=id) ucastnici = soustredeni.ucastnici.all() - usaciOsoby = Osoba.objects.filter(resitel__in=ucastnici) - response = dataOsobCsvResponse(usaciOsoby, columns=("jmeno", "prijmeni", "email", "telefon", "ulice", "mesto", "psc",)) + ucastniciOsoby = Osoba.objects.filter(resitel__in=ucastnici) + response = dataOsobCsvResponse(ucastniciOsoby, columns=fields) name = str(soustredeni).replace(" ", "_") + "_ucastnici_soustredeni.csv" response['Content-Disposition'] = 'attachment; filename="' + name + '"' return response From c1df250a4693aa0bdd36e81e9d51b46bba53e7f8 Mon Sep 17 00:00:00 2001 From: ticvac <vaclav.tichy180@gmail.com> Date: Wed, 5 Mar 2025 19:48:19 +0100 Subject: [PATCH 4/5] multiple fields support added, prazdne params --- .../personalni/profil/export_lidi.html | 19 ++++++++++++++----- personalni/views.py | 10 ++++++++-- 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/personalni/templates/personalni/profil/export_lidi.html b/personalni/templates/personalni/profil/export_lidi.html index 3b0d7896..2a269f3e 100644 --- a/personalni/templates/personalni/profil/export_lidi.html +++ b/personalni/templates/personalni/profil/export_lidi.html @@ -6,6 +6,9 @@ <h2><strong>Export lidí</strong></h2> <p>Vyberte pole, které chcete exportovat</p> +<!-- for loop zde neni pouzit proto, aby se mohlo napsat + data-value="email telefon mesto" +a zabalit tak vice parametru do jednoho checkboxu --> <p> <label>( Jméno: <input class="field-check" data-value="jmeno" type="checkbox" checked>)</label> <label>( Příjmení: <input class="field-check" data-value="prijmeni" type="checkbox" checked>)</label> @@ -89,14 +92,20 @@ download_button.addEventListener('click', (e) => { // uzivatele vybrana pole - const fields = Array.from(document.getElementsByClassName('field-check')) + fields = Array.from(document.getElementsByClassName('field-check')) .filter(e => e.checked) - .map(e => e.getAttribute('data-value')) - console.log(fields) + .map(e => e.getAttribute('data-value')); + params = "" + for (let val of fields) { + for(let s of val.split(' ')) { + params += s + "," + } + } + params = params.slice(0, -1) if (select_two.innerHTML == '') { - window.location.href = "/profil/exporty_lidi/get_csv_only_one_step/" + select_one.value + "?fields=" + fields.join(',') + window.location.href = "/profil/exporty_lidi/get_csv_only_one_step/" + select_one.value + "?fields=" + params } else { - window.location.href = "/profil/exporty_lidi/get_csv/" + select_one.value + "/" + select_two.value + "?fields=" + fields.join(',') + window.location.href = "/profil/exporty_lidi/get_csv/" + select_one.value + "/" + select_two.value + "?fields=" + params } }) </script> diff --git a/personalni/views.py b/personalni/views.py index a302e5d2..da98e365 100644 --- a/personalni/views.py +++ b/personalni/views.py @@ -171,8 +171,14 @@ def get_export_options(request, type): data = [{"id": s.id, "display": str(s)} for s in Soustredeni.objects.all()] return HttpResponse(json.dumps(data), content_type='application/json') -def download_export_csv_only_first_step(request, type): +def getFieldsForExport(request): fields = request.GET.get('fields').split(',') + if fields == ['']: + return ["jmeno", "prijmeni", "email", "telefon"] + return fields + +def download_export_csv_only_first_step(request, type): + fields = getFieldsForExport(request) if type == 3: resitele = tvorba_utils.resitele_co_neodmaturovali() resiteleOsoby = Osoba.objects.filter(resitel__in=resitele) @@ -181,7 +187,7 @@ def download_export_csv_only_first_step(request, type): return response def download_export_csv(request, type, id): - fields = request.GET.get('fields').split(',') + fields = getFieldsForExport(request) if type == PrvniTypExportu.CISLA.value: resitele = tvorba_utils.resi_cislo(Cislo.objects.get(id=id)) resiteleOsoby = Osoba.objects.filter(resitel__in=resitele) From 5f1e9d07d9da3d8650b3d1d6e1d943f8580a56f9 Mon Sep 17 00:00:00 2001 From: ticvac <vaclav.tichy180@gmail.com> Date: Wed, 5 Mar 2025 19:49:48 +0100 Subject: [PATCH 5/5] another fix --- personalni/views.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/personalni/views.py b/personalni/views.py index da98e365..c2d194f2 100644 --- a/personalni/views.py +++ b/personalni/views.py @@ -172,9 +172,9 @@ def get_export_options(request, type): return HttpResponse(json.dumps(data), content_type='application/json') def getFieldsForExport(request): - fields = request.GET.get('fields').split(',') - if fields == ['']: + if 'fields' not in request.GET or request.GET.get('fields') == '': return ["jmeno", "prijmeni", "email", "telefon"] + fields = request.GET.get('fields').split(',') return fields def download_export_csv_only_first_step(request, type):