From b094347b7cc628799cd8bb5ba007df08522a8650 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jon=C3=A1=C5=A1=20Havelka?= <jonas.havelka@volny.cz>
Date: Fri, 2 Aug 2024 18:34:05 +0200
Subject: [PATCH 01/13] =?UTF-8?q?Vyta=C5=BEen=C3=AD=20prefixu=20'soustrede?=
 =?UTF-8?q?ni/'=20do=20aplikace=20soustredeni?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 mamweb/urls.py      |  2 +-
 soustredeni/urls.py | 15 ++++++++-------
 2 files changed, 9 insertions(+), 8 deletions(-)

diff --git a/mamweb/urls.py b/mamweb/urls.py
index cdd7df09..25910d33 100644
--- a/mamweb/urls.py
+++ b/mamweb/urls.py
@@ -43,7 +43,7 @@ urlpatterns = [
 	path('', include('prednasky.urls')),
 
 	# Soustredkova aplikace (ma vlastni podadresare)
-	path('', include('soustredeni.urls')),
+	path('soustredeni/', include('soustredeni.urls')),
 
 	# Personalni aplikace (ma vlastni podadresare)
 	# (profil, osobní údaje, ..., ne autentizace, viz dále)
diff --git a/soustredeni/urls.py b/soustredeni/urls.py
index 2e5a6136..4d07f660 100644
--- a/soustredeni/urls.py
+++ b/soustredeni/urls.py
@@ -2,39 +2,40 @@ from django.urls import path, include
 from . import views
 from seminar.utils import org_required
 
+# prefix = 'soustredeni/'
 urlpatterns = [
 	path(
-		'soustredeni/probehlo/',
+		'probehlo/',
 		views.SoustredeniListView.as_view(),
 		name='seminar_seznam_soustredeni'
 	),
 	path(
-		'soustredeni/<int:soustredeni>/seznam_ucastniku',
+		'<int:soustredeni>/seznam_ucastniku',
 		org_required(views.SoustredeniUcastniciView.as_view()),
 		name='soustredeni_ucastnici'
 	),
 	path(
-		'soustredeni/<int:soustredeni>/maily_ucastniku',
+		'<int:soustredeni>/maily_ucastniku',
 		org_required(views.SoustredeniMailyUcastnikuView.as_view()),
 		name='maily_ucastniku'
 	),
 	path(
-		'soustredeni/<int:soustredeni>/export_ucastniku',
+		'<int:soustredeni>/export_ucastniku',
 		org_required(views.soustredeniUcastniciExportView),
 		name='soustredeni_ucastnici_export'
 	),
 	path(
-		'soustredeni/<int:soustredeni>/stvrzenky.pdf',
+		'<int:soustredeni>/stvrzenky.pdf',
 		org_required(views.soustredeniStvrzenkyView),
 		name='soustredeni_ucastnici_stvrzenky'
 	),
 	path(
-		'soustredeni/<int:soustredeni>/obalky.pdf',
+		'<int:soustredeni>/obalky.pdf',
 		org_required(views.soustredeniObalkyView),
 		name='seminar_soustredeni_obalky'
 	),
 	path(
-		'soustredeni/<int:soustredeni>/fotogalerie/',
+		'<int:soustredeni>/fotogalerie/',
 		include('galerie.urls')
 	),
 ]

From 0fa2fb8e2bd8eb7c9ef34d135e9deb501bd05c64 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jon=C3=A1=C5=A1=20Havelka?= <jonas.havelka@volny.cz>
Date: Fri, 2 Aug 2024 19:01:50 +0200
Subject: [PATCH 02/13] =?UTF-8?q?=C3=9Aprava=20import=C5=AF=20v=20soustred?=
 =?UTF-8?q?eni?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 soustredeni/views.py | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/soustredeni/views.py b/soustredeni/views.py
index f150b6b8..6ec8c36c 100644
--- a/soustredeni/views.py
+++ b/soustredeni/views.py
@@ -1,9 +1,8 @@
 from django.shortcuts import get_object_or_404, render
 from django.http import HttpResponse
 from django.views import generic
-from django.conf import settings
 from django.contrib.staticfiles.finders import find
-from seminar.models import Soustredeni, Resitel, Soustredeni_Ucastnici, Nastaveni # Tohle je stare a chceme se toho zbavit. Pouzivejte s.ToCoChci
+
 import csv
 import tempfile
 import shutil
@@ -13,6 +12,10 @@ import http
 
 from seminar.views import obalkyView
 
+from .models import Soustredeni, Soustredeni_Ucastnici
+from personalni.models import Resitel
+from various.models import Nastaveni
+
 
 class SoustredeniListView(generic.ListView):
 	model = Soustredeni

From ddda7052ae1b619c47aef27fbacd18a4a11e17c4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jon=C3=A1=C5=A1=20Havelka?= <jonas.havelka@volny.cz>
Date: Fri, 2 Aug 2024 19:17:11 +0200
Subject: [PATCH 03/13] =?UTF-8?q?Zbaven=C3=AD=20se=20zbyte=C4=8Dn=C3=A9ho?=
 =?UTF-8?q?=20importu=20modelu=20Resitel?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 soustredeni/views.py | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/soustredeni/views.py b/soustredeni/views.py
index 6ec8c36c..2022adba 100644
--- a/soustredeni/views.py
+++ b/soustredeni/views.py
@@ -13,7 +13,6 @@ import http
 from seminar.views import obalkyView
 
 from .models import Soustredeni, Soustredeni_Ucastnici
-from personalni.models import Resitel
 from various.models import Nastaveni
 
 
@@ -66,7 +65,7 @@ class SoustredeniUcastniciView(SoustredeniUcastniciBaseView):
 
 def soustredeniUcastniciExportView(request, soustredeni):
 	soustredeni = get_object_or_404(Soustredeni, id=soustredeni)
-	ucastnici = Resitel.objects.filter(soustredeni=soustredeni)
+	ucastnici = soustredeni.ucastnici.all()
 	response = HttpResponse(content_type='text/csv')
 	response['Content-Disposition'] = 'attachment; filename="ucastnici.csv"'
 
@@ -79,7 +78,7 @@ def soustredeniUcastniciExportView(request, soustredeni):
 
 def soustredeniStvrzenkyView(request, soustredeni):
 	soustredeni = get_object_or_404(Soustredeni, id=soustredeni)
-	ucastnici = Resitel.objects.filter(soustredeni=soustredeni)
+	ucastnici = soustredeni.ucastnici.all()
 	if ucastnici.count() == 0:
 		return HttpResponse(
 			render(request, 'universal.html', {

From d1db1b952fba9aabdd1cbf83d5924e12553fe82c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jon=C3=A1=C5=A1=20Havelka?= <jonas.havelka@volny.cz>
Date: Fri, 2 Aug 2024 19:17:49 +0200
Subject: [PATCH 04/13] Obsah modulu soustredeni

---
 soustredeni/__init__.py | 6 ++----
 1 file changed, 2 insertions(+), 4 deletions(-)

diff --git a/soustredeni/__init__.py b/soustredeni/__init__.py
index a9f1f263..88d1678e 100644
--- a/soustredeni/__init__.py
+++ b/soustredeni/__init__.py
@@ -1,5 +1,3 @@
 """
-Obsahuje vše (až na přednášky) ohledně soustředění.
-
-TODO stvrzenky?
-"""
\ No newline at end of file
+Obsahuje vše (až na přednášky a galerie) ohledně soustředění.
+"""

From 036af434c643620122b1e148e3fa6e51bf779614 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jon=C3=A1=C5=A1=20Havelka?= <jonas.havelka@volny.cz>
Date: Fri, 2 Aug 2024 19:25:25 +0200
Subject: [PATCH 05/13] =?UTF-8?q?Odd=C4=9Blen=C3=AD=20urlpatterns=20konkr?=
 =?UTF-8?q?=C3=A9tn=C3=ADho=20sousu?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 soustredeni/urls.py | 66 +++++++++++++++++++++++++--------------------
 1 file changed, 37 insertions(+), 29 deletions(-)

diff --git a/soustredeni/urls.py b/soustredeni/urls.py
index 4d07f660..7ae79cdd 100644
--- a/soustredeni/urls.py
+++ b/soustredeni/urls.py
@@ -2,7 +2,7 @@ from django.urls import path, include
 from . import views
 from seminar.utils import org_required
 
-# prefix = 'soustredeni/'
+# prefix = soustredeni/
 urlpatterns = [
 	path(
 		'probehlo/',
@@ -10,32 +10,40 @@ urlpatterns = [
 		name='seminar_seznam_soustredeni'
 	),
 	path(
-		'<int:soustredeni>/seznam_ucastniku',
-		org_required(views.SoustredeniUcastniciView.as_view()),
-		name='soustredeni_ucastnici'
-	),
-	path(
-		'<int:soustredeni>/maily_ucastniku',
-		org_required(views.SoustredeniMailyUcastnikuView.as_view()),
-		name='maily_ucastniku'
-	),
-	path(
-		'<int:soustredeni>/export_ucastniku',
-		org_required(views.soustredeniUcastniciExportView),
-		name='soustredeni_ucastnici_export'
-	),
-	path(
-		'<int:soustredeni>/stvrzenky.pdf',
-		org_required(views.soustredeniStvrzenkyView),
-		name='soustredeni_ucastnici_stvrzenky'
-	),
-	path(
-		'<int:soustredeni>/obalky.pdf',
-		org_required(views.soustredeniObalkyView),
-		name='seminar_soustredeni_obalky'
-	),
-	path(
-		'<int:soustredeni>/fotogalerie/',
-		include('galerie.urls')
-	),
+		'<int:soustredeni>/',
+		include(
+			# prefix = 'soustredeni/<int:soustredeni>/'
+			[
+				path(
+					'seznam_ucastniku',
+					org_required(views.SoustredeniUcastniciView.as_view()),
+					name='soustredeni_ucastnici'
+				),
+				path(
+					'maily_ucastniku',
+					org_required(views.SoustredeniMailyUcastnikuView.as_view()),
+					name='maily_ucastniku'
+				),
+				path(
+					'export_ucastniku',
+					org_required(views.soustredeniUcastniciExportView),
+					name='soustredeni_ucastnici_export'
+				),
+				path(
+					'stvrzenky.pdf',
+					org_required(views.soustredeniStvrzenkyView),
+					name='soustredeni_ucastnici_stvrzenky'
+				),
+				path(
+					'obalky.pdf',
+					org_required(views.soustredeniObalkyView),
+					name='seminar_soustredeni_obalky'
+				),
+				path(
+					'fotogalerie/',
+					include('galerie.urls')
+				),
+			]
+		)
+	)
 ]

From 62a65af40ed8954fc1966fc72ca23fe10197d755 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jon=C3=A1=C5=A1=20Havelka?= <jonas.havelka@volny.cz>
Date: Fri, 2 Aug 2024 19:29:13 +0200
Subject: [PATCH 06/13] =?UTF-8?q?Odstran=C4=9Bn=C3=AD=20zbyte=C4=8Dn=C3=A9?=
 =?UTF-8?q?ho=20importu?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 galerie/forms.py | 1 -
 1 file changed, 1 deletion(-)

diff --git a/galerie/forms.py b/galerie/forms.py
index e6666884..2f4e1337 100644
--- a/galerie/forms.py
+++ b/galerie/forms.py
@@ -1,7 +1,6 @@
 #coding: utf-8
 
 from django import forms
-from seminar.models import Soustredeni
 
 class KomentarForm(forms.Form):
 	komentar = forms.CharField(label = "Komentář:", max_length = 300, required=False)

From 27beb3415398779fe2c70e4efd42167d50c4573a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jon=C3=A1=C5=A1=20Havelka?= <jonas.havelka@volny.cz>
Date: Fri, 2 Aug 2024 19:38:06 +0200
Subject: [PATCH 07/13] =?UTF-8?q?Odd=C4=9Blen=C3=AD=20generov=C3=A1n=C3=AD?=
 =?UTF-8?q?=20testdat=20k=20sous=20v=C4=9Bcem?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 seminar/testutils.py     | 52 +++--------------------------------
 soustredeni/testutils.py | 59 ++++++++++++++++++++++++++++++++++++++++
 2 files changed, 63 insertions(+), 48 deletions(-)
 create mode 100644 soustredeni/testutils.py

diff --git a/seminar/testutils.py b/seminar/testutils.py
index 0d90456a..b3888fa9 100644
--- a/seminar/testutils.py
+++ b/seminar/testutils.py
@@ -12,13 +12,15 @@ import unidecode
 import logging
 
 from korektury.testutils import create_test_pdf
-from seminar.models import Skola, Resitel, Rocnik, Cislo, Deadline, Problem, Reseni, PrilohaReseni, Nastaveni, Soustredeni, Soustredeni_Ucastnici, Soustredeni_Organizatori, Osoba, Organizator, Prijemce, Tema, Uloha, Konfera, TextNode, UlohaVzorakNode, RocnikNode, CisloNode, TemaVCisleNode, Text, Hodnoceni, UlohaZadaniNode, Novinky, TreeNode
+from seminar.models import Skola, Resitel, Rocnik, Cislo, Deadline, Problem, Reseni, PrilohaReseni, Nastaveni, Osoba, Organizator, Prijemce, Tema, Uloha, TextNode, UlohaVzorakNode, RocnikNode, CisloNode, TemaVCisleNode, Text, Hodnoceni, UlohaZadaniNode, Novinky, TreeNode
 import seminar.models as m
 
 from django.contrib.flatpages.models import FlatPage
 from django.contrib.sites.models import Site
 from treenode.treelib import all_children, insert_last_child, all_children_of_type, create_node_after
 
+from soustredeni.testutils import gen_soustredeni, gen_konfery
+
 
 User = django.contrib.auth.get_user_model()
 zlinska = None # tohle bude speciální škola, které později dodáme kontaktní osobu
@@ -354,30 +356,6 @@ def gen_ulohy_do_cisla(rnd, organizatori, resitele, rocnik_cisla, rocniky, size)
 
 	return
 
-def gen_soustredeni(rnd, resitele, organizatori):
-	logger.info('Generuji soustředění...')
-
-	soustredeni = []
-	for _ in range(1, 10): #FIXME Tu range si změňte jak chcete, nevím, co přesně znamená size (asi Anet?)
-		datum_zacatku=datetime.date(rnd.randint(2000, 2020), rnd.randint(1, 12), rnd.randint(1, 28))
-		working_sous = Soustredeni.objects.create(
-			rocnik=Rocnik.objects.order_by('?').first(),
-			verejne_db=rnd.choice([True, False]),
-			misto=rnd.choice(['Kremrolovice', 'Indiánov', 'U zmzliny', 'Vafláreň', 'Větrník', 'Horní Rakvička', 'Dolní cheesecake']),
-			typ=rnd.choice(['jarni', 'podzimni', 'vikend']),
-			datum_zacatku=datum_zacatku,
-			datum_konce=datum_zacatku + datetime.timedelta(days=7))
-		ucastnici = rnd.sample(resitele, min(len(resitele), 20))
-		working_sous.ucastnici.set(ucastnici)
-		#for res in rnd.sample(resitele, min(len(resitele), 20)):
-		#	Soustredeni_Ucastnici.objects.create(resitel=res, soutredeni=working_sous)
-		orgove_vyber = rnd.sample(organizatori, min(len(organizatori), 20))
-		working_sous.organizatori.set(orgove_vyber)
-		#for org in rnd.sample(organizatori, min(len(organizatori), 20)):
-		#	Soustredeni_Organizatori.objects.create(organizator=org, soutredeni=working_sous)
-		working_sous.save()
-		soustredeni.append(working_sous)
-	return soustredeni
 
 def gen_rocniky(last_rocnik, size):
 	logger.info('Generuji ročníky (size={})...'.format(size))
@@ -392,28 +370,6 @@ def gen_rocniky(last_rocnik, size):
 		rocniky.append(rocnik)
 	return rocniky
 
-def gen_konfery(size, rnd, organizatori, resitele, soustredeni):
-	logger.info('Generuji konfery (size={})...'.format(size))
-
-	konfery = []
-	for _ in range(1, size): #FIXME Tu range si změňte jak chcete, nevím, co přesně znamená size (asi Anet?)
-		# Anet: size je parametr udávající velikost testovacích dat a dá se pomocí ní škálovat,
-		# kolik dat se nageneruje
-		konfera = Konfera.objects.create(
-			nazev=rnd.choice(['Pozorování', 'Zkoumání', 'Modelování', 'Počítání', 'Zkoušení']) + rnd.choice([' vlastností', ' jevů', ' charakteristik']) + rnd.choice([' vektorových prostorů', ' kinetické terorie látek', ' molekulární biologie', ' syntentických stromů']),
-			anotace=lorem.paragraph(),
-			abstrakt=lorem.paragraph(),
-			garant=rnd.choice(organizatori),
-			soustredeni=rnd.choice(soustredeni),
-			typ_prezentace=rnd.choice(['veletrh', 'prezentace']))
-		ucastnici_sous = list(konfera.soustredeni.ucastnici.all())
-		ucastnici = rnd.sample(ucastnici_sous, min(len(ucastnici_sous), rnd.randint(3, 6)))
-		konfera.ucastnici.set(ucastnici)
-		#for res in rnd.sample(ucastnici, min(len(ucastnici), rnd.randint(3, 6))):
-		#	Konfery_Ucastnici.objects.create(resitel=res, konfera=konfera)
-		konfera.save()
-		konfery.append(konfera)
-	return konfery
 
 def gen_cisla(rnd, rocniky):
 	logger.info('Generuji čísla...')
@@ -883,7 +839,7 @@ def create_test_data(size = 6, rnd = None):
 	gen_ulohy_k_tematum(rnd, rocniky, rocnik_cisla, rocnik_temata, organizatori, resitele)
 
 	#generování soustředění
-	soustredeni = gen_soustredeni(rnd, resitele, organizatori)
+	soustredeni = gen_soustredeni(size, rnd, resitele, organizatori)
 
 	#generování konfer
 	konfery = gen_konfery(size, rnd, organizatori, resitele, soustredeni)
diff --git a/soustredeni/testutils.py b/soustredeni/testutils.py
new file mode 100644
index 00000000..12a48378
--- /dev/null
+++ b/soustredeni/testutils.py
@@ -0,0 +1,59 @@
+import logging
+import datetime
+
+import lorem
+
+from .models import Soustredeni, Konfera
+import seminar.models.tvorba as am
+
+logger = logging.getLogger(__name__)
+
+
+def gen_soustredeni(size, rnd, resitele, organizatori):
+	logger.info('Generuji soustředění...')
+
+	soustredeni = []
+	for _ in range(1, 10):  # FIXME Tu range si změňte jak chcete, nevím, co přesně znamená size (asi Anet?)
+		datum_zacatku = datetime.date(rnd.randint(2000, 2020), rnd.randint(1, 12), rnd.randint(1, 28))
+		working_sous = Soustredeni.objects.create(
+			rocnik=am.Rocnik.objects.order_by('?').first(),
+			verejne_db=rnd.choice([True, False]),
+			misto=rnd.choice(['Kremrolovice', 'Indiánov', 'U zmzliny', 'Vafláreň', 'Větrník', 'Horní Rakvička', 'Dolní cheesecake']),
+			typ=rnd.choice(['jarni', 'podzimni', 'vikend']),
+			datum_zacatku=datum_zacatku,
+			datum_konce=datum_zacatku + datetime.timedelta(days=7))
+		ucastnici = rnd.sample(resitele, min(len(resitele), 20))
+		working_sous.ucastnici.set(ucastnici)
+		# for res in rnd.sample(resitele, min(len(resitele), 20)):
+		# 	Soustredeni_Ucastnici.objects.create(resitel=res, soutredeni=working_sous)
+		orgove_vyber = rnd.sample(organizatori, min(len(organizatori), 20))
+		working_sous.organizatori.set(orgove_vyber)
+		# for org in rnd.sample(organizatori, min(len(organizatori), 20)):
+		# 	Soustredeni_Organizatori.objects.create(organizator=org, soutredeni=working_sous)
+		working_sous.save()
+		soustredeni.append(working_sous)
+	return soustredeni
+
+
+def gen_konfery(size, rnd, organizatori, resitele, soustredeni):
+	logger.info('Generuji konfery (size={})...'.format(size))
+
+	konfery = []
+	for _ in range(1, size):  # FIXME Tu range si změňte jak chcete, nevím, co přesně znamená size (asi Anet?)
+		# Anet: size je parametr udávající velikost testovacích dat a dá se pomocí ní škálovat,
+		# kolik dat se nageneruje
+		konfera = Konfera.objects.create(
+			nazev=rnd.choice(['Pozorování', 'Zkoumání', 'Modelování', 'Počítání', 'Zkoušení']) + rnd.choice([' vlastností', ' jevů', ' charakteristik']) + rnd.choice([' vektorových prostorů', ' kinetické terorie látek', ' molekulární biologie', ' syntentických stromů']),
+			anotace=lorem.paragraph(),
+			abstrakt=lorem.paragraph(),
+			garant=rnd.choice(organizatori),
+			soustredeni=rnd.choice(soustredeni),
+			typ_prezentace=rnd.choice(['veletrh', 'prezentace']))
+		ucastnici_sous = list(konfera.soustredeni.ucastnici.all())
+		ucastnici = rnd.sample(ucastnici_sous, min(len(ucastnici_sous), rnd.randint(3, 6)))
+		konfera.ucastnici.set(ucastnici)
+		# for res in rnd.sample(ucastnici, min(len(ucastnici), rnd.randint(3, 6))):
+		# 	Konfery_Ucastnici.objects.create(resitel=res, konfera=konfera)
+		konfera.save()
+		konfery.append(konfera)
+	return konfery

From a6220e8d50b12d61618f164a9582ac29b3222d02 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jon=C3=A1=C5=A1=20Havelka?= <jonas.havelka@volny.cz>
Date: Fri, 2 Aug 2024 20:05:19 +0200
Subject: [PATCH 08/13] =?UTF-8?q?Typov=C3=A9=20anotace=20a=20dal=C5=A1?=
 =?UTF-8?q?=C3=AD=20detaily=20v=20generov=C3=A1n=C3=AD=20testdat=20k=20sou?=
 =?UTF-8?q?stredeni?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 seminar/testutils.py     |  4 ++--
 soustredeni/testutils.py | 22 +++++++++++++++++++---
 2 files changed, 21 insertions(+), 5 deletions(-)

diff --git a/seminar/testutils.py b/seminar/testutils.py
index b3888fa9..2de60884 100644
--- a/seminar/testutils.py
+++ b/seminar/testutils.py
@@ -839,10 +839,10 @@ def create_test_data(size = 6, rnd = None):
 	gen_ulohy_k_tematum(rnd, rocniky, rocnik_cisla, rocnik_temata, organizatori, resitele)
 
 	#generování soustředění
-	soustredeni = gen_soustredeni(size, rnd, resitele, organizatori)
+	soustredeni = gen_soustredeni(size, resitele, organizatori, rnd=rnd)
 
 	#generování konfer
-	konfery = gen_konfery(size, rnd, organizatori, resitele, soustredeni)
+	konfery = gen_konfery(size, organizatori, resitele, soustredeni, rnd=rnd)
 
 	# vytvoreni pdf ke korekturam
 	create_test_pdf(rnd, organizatori)
diff --git a/soustredeni/testutils.py b/soustredeni/testutils.py
index 12a48378..51bbb135 100644
--- a/soustredeni/testutils.py
+++ b/soustredeni/testutils.py
@@ -1,16 +1,25 @@
 import logging
 import datetime
+import random
+from typing import Sequence
 
 import lorem
 
 from .models import Soustredeni, Konfera
 import seminar.models.tvorba as am
+import personalni.models as pm
 
 logger = logging.getLogger(__name__)
 
 
-def gen_soustredeni(size, rnd, resitele, organizatori):
-	logger.info('Generuji soustředění...')
+def gen_soustredeni(
+		size: int,
+		resitele: Sequence[pm.Resitel],
+		organizatori: Sequence[pm.Organizator],
+		rnd: random.Random = None,
+) -> Sequence[Soustredeni]:
+	logger.info('Generuji soustředění (size={})...')
+	rnd = rnd or random.Random(x=42)
 
 	soustredeni = []
 	for _ in range(1, 10):  # FIXME Tu range si změňte jak chcete, nevím, co přesně znamená size (asi Anet?)
@@ -35,8 +44,15 @@ def gen_soustredeni(size, rnd, resitele, organizatori):
 	return soustredeni
 
 
-def gen_konfery(size, rnd, organizatori, resitele, soustredeni):
+def gen_konfery(
+		size: int,
+		organizatori: Sequence[pm.Organizator],
+		resitele: Sequence[pm.Resitel],
+		soustredeni: Sequence[Soustredeni],
+		rnd: random.Random = None,
+) -> Sequence[Konfera]:
 	logger.info('Generuji konfery (size={})...'.format(size))
+	rnd = rnd or random.Random(x=42)
 
 	konfery = []
 	for _ in range(1, size):  # FIXME Tu range si změňte jak chcete, nevím, co přesně znamená size (asi Anet?)

From b44bdadb0a4060ac61a8b865868efdb28721d208 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jon=C3=A1=C5=A1=20Havelka?= <jonas.havelka@volny.cz>
Date: Fri, 2 Aug 2024 20:15:02 +0200
Subject: [PATCH 09/13] =?UTF-8?q?Odstran=C4=9Bn=20zakomentovan=C3=BD=20zby?=
 =?UTF-8?q?te=C4=8Dn=C4=9B=20slo=C5=BEit=C3=BD=20k=C3=B3d?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 soustredeni/testutils.py | 6 ------
 1 file changed, 6 deletions(-)

diff --git a/soustredeni/testutils.py b/soustredeni/testutils.py
index 51bbb135..6e406530 100644
--- a/soustredeni/testutils.py
+++ b/soustredeni/testutils.py
@@ -33,12 +33,8 @@ def gen_soustredeni(
 			datum_konce=datum_zacatku + datetime.timedelta(days=7))
 		ucastnici = rnd.sample(resitele, min(len(resitele), 20))
 		working_sous.ucastnici.set(ucastnici)
-		# for res in rnd.sample(resitele, min(len(resitele), 20)):
-		# 	Soustredeni_Ucastnici.objects.create(resitel=res, soutredeni=working_sous)
 		orgove_vyber = rnd.sample(organizatori, min(len(organizatori), 20))
 		working_sous.organizatori.set(orgove_vyber)
-		# for org in rnd.sample(organizatori, min(len(organizatori), 20)):
-		# 	Soustredeni_Organizatori.objects.create(organizator=org, soutredeni=working_sous)
 		working_sous.save()
 		soustredeni.append(working_sous)
 	return soustredeni
@@ -68,8 +64,6 @@ def gen_konfery(
 		ucastnici_sous = list(konfera.soustredeni.ucastnici.all())
 		ucastnici = rnd.sample(ucastnici_sous, min(len(ucastnici_sous), rnd.randint(3, 6)))
 		konfera.ucastnici.set(ucastnici)
-		# for res in rnd.sample(ucastnici, min(len(ucastnici), rnd.randint(3, 6))):
-		# 	Konfery_Ucastnici.objects.create(resitel=res, konfera=konfera)
 		konfera.save()
 		konfery.append(konfera)
 	return konfery

From ccf3ec07f7865ecace408d4d1ea4f18bb8b980fc Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jon=C3=A1=C5=A1=20Havelka?= <jonas.havelka@volny.cz>
Date: Fri, 2 Aug 2024 20:17:31 +0200
Subject: [PATCH 10/13] =?UTF-8?q?Generov=C3=A1n=C3=AD=20konfer=20s=20konkr?=
 =?UTF-8?q?=C3=A9tn=C3=ADmi=20=C5=99e=C5=A1iteli?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 seminar/testutils.py     | 2 +-
 soustredeni/testutils.py | 4 ++--
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/seminar/testutils.py b/seminar/testutils.py
index 2de60884..ea6e0125 100644
--- a/seminar/testutils.py
+++ b/seminar/testutils.py
@@ -842,7 +842,7 @@ def create_test_data(size = 6, rnd = None):
 	soustredeni = gen_soustredeni(size, resitele, organizatori, rnd=rnd)
 
 	#generování konfer
-	konfery = gen_konfery(size, organizatori, resitele, soustredeni, rnd=rnd)
+	konfery = gen_konfery(size, organizatori, soustredeni, rnd=rnd)
 
 	# vytvoreni pdf ke korekturam
 	create_test_pdf(rnd, organizatori)
diff --git a/soustredeni/testutils.py b/soustredeni/testutils.py
index 6e406530..52e81d1c 100644
--- a/soustredeni/testutils.py
+++ b/soustredeni/testutils.py
@@ -43,8 +43,8 @@ def gen_soustredeni(
 def gen_konfery(
 		size: int,
 		organizatori: Sequence[pm.Organizator],
-		resitele: Sequence[pm.Resitel],
 		soustredeni: Sequence[Soustredeni],
+		resitele: Sequence[pm.Resitel] = None,
 		rnd: random.Random = None,
 ) -> Sequence[Konfera]:
 	logger.info('Generuji konfery (size={})...'.format(size))
@@ -61,7 +61,7 @@ def gen_konfery(
 			garant=rnd.choice(organizatori),
 			soustredeni=rnd.choice(soustredeni),
 			typ_prezentace=rnd.choice(['veletrh', 'prezentace']))
-		ucastnici_sous = list(konfera.soustredeni.ucastnici.all())
+		ucastnici_sous = resitele if resitele else list(konfera.soustredeni.ucastnici.all())
 		ucastnici = rnd.sample(ucastnici_sous, min(len(ucastnici_sous), rnd.randint(3, 6)))
 		konfera.ucastnici.set(ucastnici)
 		konfera.save()

From 4a3681b1a6818171f078e778a398db8a6e16e6bf Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jon=C3=A1=C5=A1=20Havelka?= <jonas.havelka@volny.cz>
Date: Fri, 2 Aug 2024 20:32:07 +0200
Subject: [PATCH 11/13] Drobnost

---
 soustredeni/views.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/soustredeni/views.py b/soustredeni/views.py
index 2022adba..a0e3fe13 100644
--- a/soustredeni/views.py
+++ b/soustredeni/views.py
@@ -24,7 +24,7 @@ class SoustredeniListView(generic.ListView):
 		if not self.request.user.je_org:
 			return super().get_queryset()
 		return (
-			Soustredeni.objects
+			super().get_queryset()
 			.prefetch_related(
 				"ucastnici", "ucastnici__osoba",
 				"organizatori", "organizatori__osoba",

From d5d55d76a9bd9fbc528a7a13920bca0adff61f83 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jon=C3=A1=C5=A1=20Havelka?= <jonas.havelka@volny.cz>
Date: Tue, 22 Oct 2024 21:57:01 +0200
Subject: [PATCH 12/13] =?UTF-8?q?Lep=C5=A1=C3=AD=20koment=C3=A1=C5=99?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 soustredeni/__init__.py | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/soustredeni/__init__.py b/soustredeni/__init__.py
index 88d1678e..94eca4f4 100644
--- a/soustredeni/__init__.py
+++ b/soustredeni/__init__.py
@@ -1,3 +1,4 @@
 """
-Obsahuje vše (až na přednášky a galerie) ohledně soustředění.
+Obsahuje vše (až na přednášky a galerie) ohledně soustředění,
+tzn. převážně informace o účastech orgů a účastníků a o tom, kdo byl na které konfeře.
 """

From 3db6231a77d89bb15407440376fa0052b97baa58 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jon=C3=A1=C5=A1=20Havelka?= <jonas.havelka@volny.cz>
Date: Tue, 22 Oct 2024 22:11:59 +0200
Subject: [PATCH 13/13] =?UTF-8?q?N=C3=A1zev=20id=20v=20url?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 soustredeni/views.py | 1 +
 1 file changed, 1 insertion(+)

diff --git a/soustredeni/views.py b/soustredeni/views.py
index 2f296b60..67a0305f 100644
--- a/soustredeni/views.py
+++ b/soustredeni/views.py
@@ -105,3 +105,4 @@ def soustredeniStvrzenkyView(request, soustredeni):
 class SoustredeniAbstraktyView(generic.DetailView):
 	model = Soustredeni
 	template_name = 'soustredeni/export_do_abstraktu.html'
+	pk_url_kwarg = 'soustredeni' # v url bude <int:soustredeni> místo defaultně požadovaného <int:pk>