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