From ca824164f4e57bef8da158a412a4e4bf8a5db526 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Kuba=20R=C5=AF=C5=BEi=C4=8Dka?= Date: Thu, 23 May 2019 23:44:44 +0200 Subject: [PATCH 1/8] =?UTF-8?q?testutils.py:=20odsazen=C3=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- seminar/testutils.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/seminar/testutils.py b/seminar/testutils.py index 820a95f4..a8cd7052 100644 --- a/seminar/testutils.py +++ b/seminar/testutils.py @@ -165,10 +165,10 @@ def gen_ulohy_do_cisla(rnd, cislo, organizatori, resitele, slovnik_cisel, size): res_vyber = rnd.sample(resitele, min(poc_reseni, len(resitele) - 2)) for resitel in res_vyber: res = Reseni.objects.create(problem = p, - resitele=[resitel], - forma=rnd.choice(Reseni.FORMA_CHOICES)) + resitele=[resitel], + forma=rnd.choice(Reseni.FORMA_CHOICES)) hod = Hodnoceni.objects.create(body=rnd.randint(0, p.max_body), - cislo_body=slovnik_cisel[cislo], reseni=res, problem=p) + cislo_body=slovnik_cisel[cislo], reseni=res, problem=p) return def gen_soustredeni(): From 0faf1d381ebc843b2f1c50bcd1b95a147a7f6b7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Domes?= Date: Thu, 23 May 2019 23:54:30 +0200 Subject: [PATCH 2/8] =?UTF-8?q?testutil.py:=20odsazen=C3=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- seminar/testutils.py | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/seminar/testutils.py b/seminar/testutils.py index a8cd7052..3bb21e30 100644 --- a/seminar/testutils.py +++ b/seminar/testutils.py @@ -116,7 +116,10 @@ def gen_organizatori(rnd, osoby, last_rocnik, users): return organizatori def gen_ulohy_do_cisla(rnd, cislo, organizatori, resitele, slovnik_cisel, size): - '''cislo = cislo cisla v rocniku, nikoli objekt Cislo ''' + ''' + cislo = cislo cisla v rocniku, nikoli objekt Cislo + ''' + # ulohy resene v ci jaka = ["Šachová", "Černá", "Větrná", "Dlouhá", "Křehká", "Rychlá", "Zákeřná", "Fyzikální"] @@ -152,8 +155,13 @@ def gen_ulohy_do_cisla(rnd, cislo, organizatori, resitele, slovnik_cisel, size): cislo_reseni=slovnik_cisel[cislo], cislo_deadline=slovnik_cisel[cislo], max_body = rnd.randint(1, 8)) - p.zadani = " ".join([rnd.choice(sloveso), rnd.choice(koho), - rnd.choice(ceho), rnd.choice(jmeno), rnd.choice(kde)]) + p.zadani = " ".join( + [rnd.choice(sloveso), + rnd.choice(koho), + rnd.choice(ceho), + rnd.choice(jmeno), + rnd.choice(kde)] + ) p.vzorak = " - ".join([p.zadani, rnd.choice(reseni)]) p.save() @@ -164,11 +172,17 @@ def gen_ulohy_do_cisla(rnd, cislo, organizatori, resitele, slovnik_cisel, size): # (nebo skoro vsechny resitele, pokud jich je mene nez pocet reseni) res_vyber = rnd.sample(resitele, min(poc_reseni, len(resitele) - 2)) for resitel in res_vyber: - res = Reseni.objects.create(problem = p, - resitele=[resitel], - forma=rnd.choice(Reseni.FORMA_CHOICES)) - hod = Hodnoceni.objects.create(body=rnd.randint(0, p.max_body), - cislo_body=slovnik_cisel[cislo], reseni=res, problem=p) + res = Reseni.objects.create( + problem = p, + resitele=[resitel], + forma=rnd.choice(Reseni.FORMA_CHOICES) + ) + hod = Hodnoceni.objects.create( + body=rnd.randint(0, p.max_body), + cislo_body=slovnik_cisel[cislo], + reseni=res, + problem=p + ) return def gen_soustredeni(): From 42fcc91a68a7fd4600fe884ea8970587554742aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Domes?= Date: Fri, 24 May 2019 00:02:22 +0200 Subject: [PATCH 3/8] =?UTF-8?q?testutil.py:=20odsazen=C3=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- seminar/testutils.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/seminar/testutils.py b/seminar/testutils.py index 3bb21e30..3f1fbf1c 100644 --- a/seminar/testutils.py +++ b/seminar/testutils.py @@ -154,7 +154,8 @@ def gen_ulohy_do_cisla(rnd, cislo, organizatori, resitele, slovnik_cisel, size): cislo_zadani=slovnik_cisel[cislo-2], cislo_reseni=slovnik_cisel[cislo], cislo_deadline=slovnik_cisel[cislo], - max_body = rnd.randint(1, 8)) + max_body = rnd.randint(1, 8) + ) p.zadani = " ".join( [rnd.choice(sloveso), rnd.choice(koho), @@ -187,9 +188,13 @@ def gen_ulohy_do_cisla(rnd, cislo, organizatori, resitele, slovnik_cisel, size): def gen_soustredeni(): # TODO: vice soustredeni a k nim nahodne podmnoziny organizatoru a ucastniku - sous = Soustredeni.objects.create(rocnik=Rocnik.objects.first(), verejne_db=True, - misto=u'Někde', datum_zacatku=datetime.date(2000, 11, 23), - datum_konce=datetime.date(2000, 11, 27)) + sous = Soustredeni.objects.create( + rocnik=Rocnik.objects.first(), + verejne_db=True, + misto=u'Někde', + datum_zacatku=datetime.date(2000, 11, 23), + datum_konce=datetime.date(2000, 11, 27) + ) for res in rnd.sample(resitele, 6): Soustredeni_Ucastnici.objects.create(resitel=res, soustredeni=sous) From 2f50906e6fb4cb9a349b0febdbaf151d1e5d2c23 Mon Sep 17 00:00:00 2001 From: "Tomas \"Jethro\" Pokorny" Date: Fri, 24 May 2019 00:13:35 +0200 Subject: [PATCH 4/8] Update modelu - Nody --- Schema_new.dia | Bin 14335 -> 14633 bytes seminar/migrations/0050_auto_20190510_2228.py | 48 +++++++++++++++--- seminar/models.py | 34 +++++++++++-- 3 files changed, 71 insertions(+), 11 deletions(-) diff --git a/Schema_new.dia b/Schema_new.dia index d7a38dbdaa369012ffa94b3dddbf5ebc54f737be..536c3c4841c63cb49711199adb87006b65017033 100644 GIT binary patch literal 14633 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 Date: Fri, 24 May 2019 00:17:12 +0200 Subject: [PATCH 5/8] =?UTF-8?q?Migrace:=20generov=C3=A1n=C3=AD=20v=C5=A1ec?= =?UTF-8?q?h=20Ro=C4=8Dn=C3=ADkNod=C5=AF=20a=20=C4=8C=C3=ADsloNod=C5=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0056_vrcholy_pro_rocniky_a_cisla.py | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 seminar/migrations/0056_vrcholy_pro_rocniky_a_cisla.py diff --git a/seminar/migrations/0056_vrcholy_pro_rocniky_a_cisla.py b/seminar/migrations/0056_vrcholy_pro_rocniky_a_cisla.py new file mode 100644 index 00000000..6e638980 --- /dev/null +++ b/seminar/migrations/0056_vrcholy_pro_rocniky_a_cisla.py @@ -0,0 +1,44 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.20 on 2019-05-23 21:54 +from __future__ import unicode_literals + +from django.db import migrations + +def generuj_RocnikNody_a_CisloNody(apps,schema_editor): + Rocnik = apps.get_model('seminar', 'Rocnik') + RocnikNode = apps.get_model('seminar', 'RocnikNode') + Cislo = apps.get_model('seminar', 'Rocnik') + CisloNode = apps.get_model('seminar', 'RocnikNode') + + last_rn = None # last_* slouží k navázání následníků + for r in Rocnik.objects.all(): + rn = RocnikNode.objects.create(rocnik=r) + rn.save() + rn.root = rn + rn.save() + if last_rn: + last_rn.succ = rn + last_rn.save() + last_rn = rn + + last_cn = None + for c in Cislo.objects.filter(rocnik=r): + cn = CisloNode.objects.create(cislo=c, root=rn) + cn.save() + if last_cn: + last_cn.succ = cn + last_cn.save() + last_cn = cn + + + + +class Migration(migrations.Migration): + + dependencies = [ + ('seminar', '0055_smazat_nemigrovane_zastarale_veci'), + ] + + operations = [ + migrations.RunPython(generuj_RocnikNody_a_CisloNody), + ] From 37c81de60161608e865dad0371adf92ba6372174 Mon Sep 17 00:00:00 2001 From: LEdoian Date: Fri, 24 May 2019 00:19:53 +0200 Subject: [PATCH 6/8] =?UTF-8?q?Migrace:=20je=C5=A1t=C4=9B=20zapomenut?= =?UTF-8?q?=C3=BD=20first=5Fchild=20u=20p=C5=99edchoz=C3=ADho=20commitu?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- seminar/migrations/0056_vrcholy_pro_rocniky_a_cisla.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/seminar/migrations/0056_vrcholy_pro_rocniky_a_cisla.py b/seminar/migrations/0056_vrcholy_pro_rocniky_a_cisla.py index 6e638980..e583e58d 100644 --- a/seminar/migrations/0056_vrcholy_pro_rocniky_a_cisla.py +++ b/seminar/migrations/0056_vrcholy_pro_rocniky_a_cisla.py @@ -25,9 +25,12 @@ def generuj_RocnikNody_a_CisloNody(apps,schema_editor): for c in Cislo.objects.filter(rocnik=r): cn = CisloNode.objects.create(cislo=c, root=rn) cn.save() - if last_cn: + if last_cn: # Jsme něčí následník last_cn.succ = cn last_cn.save() + else: # Jsme první v řadě, takže se musíme přidat jako first_child RočníkNodu + rn.first_child = cn + rn.save() last_cn = cn From ddbc169f494faf3fcaaed5b1a14803f014d5de2e Mon Sep 17 00:00:00 2001 From: LEdoian Date: Fri, 24 May 2019 00:27:29 +0200 Subject: [PATCH 7/8] =?UTF-8?q?Migrace:=20Neum=C3=ADm=20sed-ovat,=20tak=20?= =?UTF-8?q?dal=C5=A1=C3=AD=20pokus=20o=20migraci=20=C4=8C=C3=ADsloNod?= =?UTF-8?q?=C5=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- seminar/migrations/0056_vrcholy_pro_rocniky_a_cisla.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/seminar/migrations/0056_vrcholy_pro_rocniky_a_cisla.py b/seminar/migrations/0056_vrcholy_pro_rocniky_a_cisla.py index e583e58d..024400a4 100644 --- a/seminar/migrations/0056_vrcholy_pro_rocniky_a_cisla.py +++ b/seminar/migrations/0056_vrcholy_pro_rocniky_a_cisla.py @@ -7,8 +7,8 @@ from django.db import migrations def generuj_RocnikNody_a_CisloNody(apps,schema_editor): Rocnik = apps.get_model('seminar', 'Rocnik') RocnikNode = apps.get_model('seminar', 'RocnikNode') - Cislo = apps.get_model('seminar', 'Rocnik') - CisloNode = apps.get_model('seminar', 'RocnikNode') + Cislo = apps.get_model('seminar', 'Cislo') + CisloNode = apps.get_model('seminar', 'CisloNode') last_rn = None # last_* slouží k navázání následníků for r in Rocnik.objects.all(): From 69f9b54e7b5dbb36070d978d29d90987b1c9212b Mon Sep 17 00:00:00 2001 From: "Tomas \"Jethro\" Pokorny" Date: Fri, 24 May 2019 00:44:45 +0200 Subject: [PATCH 8/8] TreeNode odabstrahovano. --- seminar/migrations/0050_auto_20190510_2228.py | 164 ++++++++---------- seminar/models.py | 11 +- 2 files changed, 77 insertions(+), 98 deletions(-) diff --git a/seminar/migrations/0050_auto_20190510_2228.py b/seminar/migrations/0050_auto_20190510_2228.py index fe82dbfc..7e54a817 100644 --- a/seminar/migrations/0050_auto_20190510_2228.py +++ b/seminar/migrations/0050_auto_20190510_2228.py @@ -13,81 +13,115 @@ class Migration(migrations.Migration): ] operations = [ + migrations.AlterField( + model_name='konfera', + name='reseni', + field=models.OneToOneField(blank=True, help_text='Účastnický přípěvek o konfeře', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='konfery', to='seminar.Reseni', verbose_name='článek ke konfeře'), + ), + migrations.AlterField( + model_name='organizator', + name='osoba', + field=models.OneToOneField(help_text='osobní údaje organizátora', null=True, on_delete=django.db.models.deletion.CASCADE, related_name='org', to='seminar.Osoba', verbose_name='osoba'), + ), + migrations.AlterField( + model_name='reseni', + name='text_cely', + field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='reseni_cely_set', to='seminar.Text', verbose_name='Plná verze textu řešení'), + ), + migrations.AlterField( + model_name='resitel', + name='osoba', + field=models.OneToOneField(null=True, on_delete=django.db.models.deletion.CASCADE, to='seminar.Osoba', verbose_name='osoba'), + ), + migrations.AlterField( + model_name='uloha', + name='vzorak', + field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='uloha_vzorak_set', to='seminar.Text', verbose_name='vzorové řešení'), + ), + migrations.AlterField( + model_name='uloha', + name='zadani', + field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='uloha_zadani_set', to='seminar.Text', verbose_name='veřejné zadání'), + ), migrations.CreateModel( - name='CisloNode', + name='TreeNode', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ], + options={ + 'verbose_name': 'TreeNode', + 'verbose_name_plural': 'TreeNody', + 'db_table': 'seminar_nodes_treenode', + }, + ), + migrations.CreateModel( + name='CisloNode', + fields=[ + ('treenode_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='seminar.TreeNode')), + ('cislo', models.OneToOneField(on_delete=django.db.models.deletion.PROTECT, to='seminar.Cislo', verbose_name='číslo')), + ], options={ 'verbose_name': 'Číslo (Node)', 'verbose_name_plural': 'Čísla (Node)', 'db_table': 'seminar_nodes_cislo', }, + bases=('seminar.treenode',), ), migrations.CreateModel( name='ClanekNode', fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('first_child', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='seminar.ClanekNode', verbose_name='první potomek')), - ('root', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='potomci_set', to='seminar.ClanekNode', verbose_name='kořen stromu')), - ('succ', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='prev', to='seminar.ClanekNode', verbose_name='další element na stejné úrovni')), + ('treenode_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='seminar.TreeNode')), + ('clanek', models.ForeignKey(null=True, on_delete=django.db.models.deletion.PROTECT, to='seminar.Clanek', verbose_name='článek')), ], options={ 'verbose_name': 'Článek (Node)', 'verbose_name_plural': 'Články (Node)', 'db_table': 'seminar_nodes_clanek', }, + bases=('seminar.treenode',), ), migrations.CreateModel( name='KonferaNode', fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('first_child', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='seminar.KonferaNode', verbose_name='první potomek')), - ('root', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='potomci_set', to='seminar.KonferaNode', verbose_name='kořen stromu')), - ('succ', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='prev', to='seminar.KonferaNode', verbose_name='další element na stejné úrovni')), + ('treenode_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='seminar.TreeNode')), + ('konfera', models.ForeignKey(null=True, on_delete=django.db.models.deletion.PROTECT, to='seminar.Konfera', verbose_name='konfera')), ], options={ 'verbose_name': 'Konfera (Node)', 'verbose_name_plural': 'Konfery (Node)', 'db_table': 'seminar_nodes_konfera', }, + bases=('seminar.treenode',), ), migrations.CreateModel( name='MezicisloNode', fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('first_child', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='seminar.MezicisloNode', verbose_name='první potomek')), - ('root', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='potomci_set', to='seminar.MezicisloNode', verbose_name='kořen stromu')), - ('succ', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='prev', to='seminar.MezicisloNode', verbose_name='další element na stejné úrovni')), + ('treenode_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='seminar.TreeNode')), ], options={ 'verbose_name': 'Mezičíslo (Node)', 'verbose_name_plural': 'Mezičísla (Node)', 'db_table': 'seminar_nodes_mezicislo', }, + bases=('seminar.treenode',), ), migrations.CreateModel( name='RocnikNode', fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('first_child', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='seminar.RocnikNode', verbose_name='první potomek')), + ('treenode_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='seminar.TreeNode')), ('rocnik', models.OneToOneField(on_delete=django.db.models.deletion.PROTECT, to='seminar.Rocnik', verbose_name='ročník')), - ('root', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='potomci_set', to='seminar.RocnikNode', verbose_name='kořen stromu')), - ('succ', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='prev', to='seminar.RocnikNode', verbose_name='další element na stejné úrovni')), ], options={ 'verbose_name': 'Ročník (Node)', 'verbose_name_plural': 'Ročníky (Node)', 'db_table': 'seminar_nodes_rocnik', }, + bases=('seminar.treenode',), ), migrations.CreateModel( name='TemaVCisleNode', fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('first_child', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='seminar.TemaVCisleNode', verbose_name='první potomek')), - ('root', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='potomci_set', to='seminar.TemaVCisleNode', verbose_name='kořen stromu')), - ('succ', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='prev', to='seminar.TemaVCisleNode', verbose_name='další element na stejné úrovni')), + ('treenode_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='seminar.TreeNode')), ('tema', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='seminar.Tema', verbose_name='téma v čísle')), ], options={ @@ -95,14 +129,12 @@ class Migration(migrations.Migration): 'verbose_name_plural': 'Témata v čísle (Node)', 'db_table': 'seminar_nodes_temavcisle', }, + bases=('seminar.treenode',), ), migrations.CreateModel( name='TextNode', fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('first_child', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='seminar.TextNode', verbose_name='první potomek')), - ('root', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='potomci_set', to='seminar.TextNode', verbose_name='kořen stromu')), - ('succ', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='prev', to='seminar.TextNode', verbose_name='další element na stejné úrovni')), + ('treenode_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='seminar.TreeNode')), ('text', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='seminar.Text', verbose_name='text')), ], options={ @@ -110,103 +142,47 @@ class Migration(migrations.Migration): 'verbose_name_plural': 'Text (Node)', 'db_table': 'seminar_nodes_obsah', }, + bases=('seminar.treenode',), ), migrations.CreateModel( name='UlohaVzorakNode', fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('first_child', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='seminar.UlohaVzorakNode', verbose_name='první potomek')), - ('root', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='potomci_set', to='seminar.UlohaVzorakNode', verbose_name='kořen stromu')), - ('succ', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='prev', to='seminar.UlohaVzorakNode', verbose_name='další element na stejné úrovni')), + ('treenode_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='seminar.TreeNode')), + ('uloha', models.ForeignKey(null=True, on_delete=django.db.models.deletion.PROTECT, to='seminar.Uloha', verbose_name='úloha')), ], options={ 'verbose_name': 'Vzorák úlohy (Node)', 'verbose_name_plural': 'Vzoráky úloh (Node)', 'db_table': 'seminar_nodes_uloha_vzorak', }, + bases=('seminar.treenode',), ), migrations.CreateModel( name='UlohaZadaniNode', fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('first_child', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='seminar.UlohaZadaniNode', verbose_name='první potomek')), - ('root', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='potomci_set', to='seminar.UlohaZadaniNode', verbose_name='kořen stromu')), - ('succ', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='prev', to='seminar.UlohaZadaniNode', verbose_name='další element na stejné úrovni')), + ('treenode_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='seminar.TreeNode')), + ('uloha', models.ForeignKey(null=True, on_delete=django.db.models.deletion.PROTECT, to='seminar.Uloha', verbose_name='úloha')), ], options={ 'verbose_name': 'Zadání úlohy (Node)', 'verbose_name_plural': 'Zadání úloh (Node)', 'db_table': 'seminar_nodes_uloha_zadani', }, - ), - migrations.AddField( - model_name='claneknode', - name='clanek', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.PROTECT, to='seminar.Clanek', verbose_name='článek'), - ), - migrations.AddField( - model_name='konferanode', - name='konfera', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.PROTECT, to='seminar.Konfera', verbose_name='konfera'), - ), - migrations.AddField( - model_name='ulohavzoraknode', - name='uloha', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.PROTECT, to='seminar.Uloha', verbose_name='úloha'), - ), - migrations.AddField( - model_name='ulohazadaninode', - name='uloha', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.PROTECT, to='seminar.Uloha', verbose_name='úloha'), - ), - migrations.AlterField( - model_name='konfera', - name='reseni', - field=models.OneToOneField(blank=True, help_text='Účastnický přípěvek o konfeře', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='konfery', to='seminar.Reseni', verbose_name='článek ke konfeře'), - ), - migrations.AlterField( - model_name='organizator', - name='osoba', - field=models.OneToOneField(help_text='osobní údaje organizátora', null=True, on_delete=django.db.models.deletion.CASCADE, related_name='org', to='seminar.Osoba', verbose_name='osoba'), - ), - migrations.AlterField( - model_name='reseni', - name='text_cely', - field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='reseni_cely_set', to='seminar.Text', verbose_name='Plná verze textu řešení'), - ), - migrations.AlterField( - model_name='resitel', - name='osoba', - field=models.OneToOneField(null=True, on_delete=django.db.models.deletion.CASCADE, to='seminar.Osoba', verbose_name='osoba'), - ), - migrations.AlterField( - model_name='uloha', - name='vzorak', - field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='uloha_vzorak_set', to='seminar.Text', verbose_name='vzorové řešení'), - ), - migrations.AlterField( - model_name='uloha', - name='zadani', - field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='uloha_zadani_set', to='seminar.Text', verbose_name='veřejné zadání'), - ), - migrations.AddField( - model_name='cislonode', - name='cislo', - field=models.OneToOneField(on_delete=django.db.models.deletion.PROTECT, to='seminar.Cislo', verbose_name='číslo'), + bases=('seminar.treenode',), ), migrations.AddField( - model_name='cislonode', + model_name='treenode', name='first_child', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='seminar.CisloNode', verbose_name='první potomek'), + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='seminar.TreeNode', verbose_name='první potomek'), ), migrations.AddField( - model_name='cislonode', + model_name='treenode', name='root', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='potomci_set', to='seminar.CisloNode', verbose_name='kořen stromu'), + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='potomci_set', to='seminar.TreeNode', verbose_name='kořen stromu'), ), migrations.AddField( - model_name='cislonode', + model_name='treenode', name='succ', - field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='prev', to='seminar.CisloNode', verbose_name='další element na stejné úrovni'), + field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='prev', to='seminar.TreeNode', verbose_name='další element na stejné úrovni'), ), ] diff --git a/seminar/models.py b/seminar/models.py index e4d3d34f..8e61e09c 100644 --- a/seminar/models.py +++ b/seminar/models.py @@ -1086,19 +1086,22 @@ class Obrazek(SeminarModelBase): class TreeNode(models.Model): class Meta: - abstract = True - root = models.ForeignKey('self', + db_table = "seminar_nodes_treenode" + verbose_name = "TreeNode" + verbose_name_plural = "TreeNody" + + root = models.ForeignKey('TreeNode', related_name="potomci_set", null = True, blank = False, on_delete = models.SET_NULL, # Vrcholy s null kořenem jsou sirotci bez ročníku verbose_name="kořen stromu") - first_child = models.ForeignKey('self', + first_child = models.ForeignKey('TreeNode', null = True, blank = True, on_delete=models.SET_NULL, verbose_name="první potomek") - succ = models.OneToOneField('self', + succ = models.OneToOneField('TreeNode', related_name="prev", null = True, blank = True,