Compare commits

..

5 commits

Author SHA1 Message Date
Pavel "LEdoian" Turinsky
9b14e4a333 Treenode: žádné pomocné treenody nebudou. 2024-11-03 01:46:18 +01:00
Pavel "LEdoian" Turinsky
8283b530e9 Merge remote-tracking branch 'gitea/podezrele-seminare' into bez_treenodu_i_bez_podezrelych_seminaru
Zatím tak, jak se namergeovalo, změny k funkčnosti v dalších commitech
(ať neděláme zbytečně magické merge)
2024-11-03 01:42:56 +01:00
Pavel "LEdoian" Turinsky
e10747aa9f odstřel Treenode: zapomenutá závislost na contenttypes 2024-11-02 22:46:14 +01:00
Pavel "LEdoian" Turinsky
8ae19988b1 Vyrábět schéma semináře už nemá moc smysl :-) 2024-11-02 22:21:47 +01:00
Pavel "LEdoian" Turinsky
2659d72d2e odstřel TreeNode: 🔫💥💥💥 2024-11-02 22:00:08 +01:00
27 changed files with 747 additions and 95 deletions

View file

@ -5,5 +5,4 @@ set -exuo pipefail
ensure_web_installed ensure_web_installed
./manage.py graph_models seminar | dot -Tpdf > schema_seminar.pdf
./manage.py graph_models -a -g | dot -Tpdf > schema_all.pdf ./manage.py graph_models -a -g | dot -Tpdf > schema_all.pdf

View file

@ -0,0 +1,13 @@
# Generated by Django 4.2.16 on 2024-11-02 19:45
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('odevzdavatko', '0006_tvorba_post'),
]
operations = [
]

View file

@ -0,0 +1,20 @@
# Generated by Django 4.2.16 on 2024-11-02 20:44
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('treenode', '0001_odstrel_treenode_create'),
('odevzdavatko', '0007_odstrel_treenode_pre'),
]
operations = [
migrations.AlterField(
model_name='reseni',
name='text_cely',
field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='reseni_cely_set', to='treenode.reseninode', verbose_name='Plná verze textu řešení'),
),
]

View file

@ -0,0 +1,14 @@
# Generated by Django 4.2.16 on 2024-11-02 20:52
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('odevzdavatko', '0008_odstrel_treenode_relink'),
('treenode', '0003_odstrel_treenode_post'),
]
operations = [
]

View file

@ -49,7 +49,7 @@ class Reseni(bm.SeminarModelBase):
forma = models.CharField('forma řešení', max_length=16, choices=FORMA_CHOICES, blank=False, forma = models.CharField('forma řešení', max_length=16, choices=FORMA_CHOICES, blank=False,
default=FORMA_EMAIL) default=FORMA_EMAIL)
text_cely = models.OneToOneField('seminar.ReseniNode', verbose_name='Plná verze textu řešení', text_cely = models.OneToOneField('treenode.ReseniNode', verbose_name='Plná verze textu řešení',
blank=True, null=True, related_name="reseni_cely_set", blank=True, null=True, related_name="reseni_cely_set",
on_delete=models.PROTECT) on_delete=models.PROTECT)

View file

@ -0,0 +1,13 @@
# Generated by Django 4.2.16 on 2024-11-02 19:45
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('personalni', '0015_tvorba_post'),
]
operations = [
]

View file

@ -0,0 +1,14 @@
# Generated by Django 4.2.16 on 2024-11-02 20:52
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('personalni', '0016_odstrel_treenode_pre'),
('treenode', '0003_odstrel_treenode_post'),
]
operations = [
]

View file

@ -0,0 +1,17 @@
# Generated by Django 4.2.16 on 2024-11-02 19:45
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('seminar', '0139_tvorba_post'),
('odevzdavatko', '0007_odstrel_treenode_pre'),
('personalni', '0016_odstrel_treenode_pre'),
('tvorba', '0004_odstrel_treenode_pre'),
('contenttypes', '0002_remove_content_type_name'),
]
operations = [
]

View file

@ -0,0 +1,69 @@
# Generated by Django 4.2.16 on 2024-11-02 19:56
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('seminar', '0140_odstrel_treenode_pre'),
]
operations = [
migrations.AlterModelOptions(
name='castnode',
options={'managed': False, 'verbose_name': 'Část (Node)', 'verbose_name_plural': 'Části (Node)'},
),
migrations.AlterModelOptions(
name='cislonode',
options={'managed': False, 'verbose_name': 'Číslo (Node)', 'verbose_name_plural': 'Čísla (Node)'},
),
migrations.AlterModelOptions(
name='mezicislonode',
options={'managed': False, 'verbose_name': 'Mezičíslo (Node)', 'verbose_name_plural': 'Mezičísla (Node)'},
),
migrations.AlterModelOptions(
name='obrazek',
options={'managed': False, 'verbose_name': 'obrázek', 'verbose_name_plural': 'obrázky'},
),
migrations.AlterModelOptions(
name='orgtextnode',
options={'managed': False, 'verbose_name': 'Organizátorský článek (Node)', 'verbose_name_plural': 'Organizátorské články (Node)'},
),
migrations.AlterModelOptions(
name='pohadkanode',
options={'managed': False, 'verbose_name': 'Pohádka (Node)', 'verbose_name_plural': 'Pohádky (Node)'},
),
migrations.AlterModelOptions(
name='reseninode',
options={'managed': False, 'verbose_name': 'Otištěné řešení (Node)', 'verbose_name_plural': 'Otištěná řešení (Node)'},
),
migrations.AlterModelOptions(
name='rocniknode',
options={'managed': False, 'verbose_name': 'Ročník (Node)', 'verbose_name_plural': 'Ročníky (Node)'},
),
migrations.AlterModelOptions(
name='temavcislenode',
options={'managed': False, 'verbose_name': 'Téma v čísle (Node)', 'verbose_name_plural': 'Témata v čísle (Node)'},
),
migrations.AlterModelOptions(
name='text',
options={'managed': False, 'verbose_name': 'text', 'verbose_name_plural': 'texty'},
),
migrations.AlterModelOptions(
name='textnode',
options={'managed': False, 'verbose_name': 'Text (Node)', 'verbose_name_plural': 'Text (Node)'},
),
migrations.AlterModelOptions(
name='treenode',
options={'managed': False, 'verbose_name': 'TreeNode', 'verbose_name_plural': 'TreeNody'},
),
migrations.AlterModelOptions(
name='ulohavzoraknode',
options={'managed': False, 'verbose_name': 'Vzorák úlohy (Node)', 'verbose_name_plural': 'Vzoráky úloh (Node)'},
),
migrations.AlterModelOptions(
name='ulohazadaninode',
options={'managed': False, 'verbose_name': 'Zadání úlohy (Node)', 'verbose_name_plural': 'Zadání úloh (Node)'},
),
]

View file

@ -0,0 +1,153 @@
# Generated by Django 4.2.16 on 2024-11-02 20:47
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('seminar', '0141_odstrel_treenode_unmanage'),
('odevzdavatko', '0008_odstrel_treenode_relink'),
('treenode', '0001_odstrel_treenode_create'),
]
operations = [
migrations.RemoveField(
model_name='cislonode',
name='cislo',
),
migrations.RemoveField(
model_name='cislonode',
name='treenode_ptr',
),
migrations.RemoveField(
model_name='mezicislonode',
name='treenode_ptr',
),
migrations.RemoveField(
model_name='obrazek',
name='text',
),
migrations.RemoveField(
model_name='orgtextnode',
name='organizator',
),
migrations.RemoveField(
model_name='orgtextnode',
name='treenode_ptr',
),
migrations.RemoveField(
model_name='pohadkanode',
name='pohadka',
),
migrations.RemoveField(
model_name='pohadkanode',
name='treenode_ptr',
),
migrations.RemoveField(
model_name='reseninode',
name='reseni',
),
migrations.RemoveField(
model_name='reseninode',
name='treenode_ptr',
),
migrations.RemoveField(
model_name='rocniknode',
name='rocnik',
),
migrations.RemoveField(
model_name='rocniknode',
name='treenode_ptr',
),
migrations.RemoveField(
model_name='temavcislenode',
name='tema',
),
migrations.RemoveField(
model_name='temavcislenode',
name='treenode_ptr',
),
migrations.RemoveField(
model_name='textnode',
name='text',
),
migrations.RemoveField(
model_name='textnode',
name='treenode_ptr',
),
migrations.RemoveField(
model_name='treenode',
name='first_child',
),
migrations.RemoveField(
model_name='treenode',
name='polymorphic_ctype',
),
migrations.RemoveField(
model_name='treenode',
name='root',
),
migrations.RemoveField(
model_name='treenode',
name='succ',
),
migrations.RemoveField(
model_name='ulohavzoraknode',
name='treenode_ptr',
),
migrations.RemoveField(
model_name='ulohavzoraknode',
name='uloha',
),
migrations.RemoveField(
model_name='ulohazadaninode',
name='treenode_ptr',
),
migrations.RemoveField(
model_name='ulohazadaninode',
name='uloha',
),
migrations.DeleteModel(
name='CastNode',
),
migrations.DeleteModel(
name='CisloNode',
),
migrations.DeleteModel(
name='MezicisloNode',
),
migrations.DeleteModel(
name='Obrazek',
),
migrations.DeleteModel(
name='OrgTextNode',
),
migrations.DeleteModel(
name='PohadkaNode',
),
migrations.DeleteModel(
name='ReseniNode',
),
migrations.DeleteModel(
name='RocnikNode',
),
migrations.DeleteModel(
name='TemaVCisleNode',
),
migrations.DeleteModel(
name='Text',
),
migrations.DeleteModel(
name='TextNode',
),
migrations.DeleteModel(
name='TreeNode',
),
migrations.DeleteModel(
name='UlohaVzorakNode',
),
migrations.DeleteModel(
name='UlohaZadaniNode',
),
]

View file

@ -0,0 +1,14 @@
# Generated by Django 4.2.16 on 2024-11-02 20:52
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('seminar', '0142_odstrel_treenode_delete'),
('treenode', '0003_odstrel_treenode_post'),
]
operations = [
]

View file

@ -1,7 +1,5 @@
from .tvorba import * from .tvorba import *
from .base import * from .base import *
from .pomocne import *
from .treenode import *
from various.models import Nastaveni from various.models import Nastaveni
from personalni.models import Organizator, Resitel, Skola, Prijemce, Osoba from personalni.models import Organizator, Resitel, Skola, Prijemce, Osoba
@ -9,6 +7,7 @@ from soustredeni.models import Soustredeni, Soustredeni_Ucastnici, Soustredeni_O
from novinky.models import Novinky from novinky.models import Novinky
from odevzdavatko.models import Reseni, PrilohaReseni, Reseni_Resitele, Hodnoceni from odevzdavatko.models import Reseni, PrilohaReseni, Reseni_Resitele, Hodnoceni
from tvorba.models import ZmrazenaVysledkovka, Deadline, Cislo, Rocnik, Pohadka, Tema, Problem, Problemy_Opravovatele, Uloha, Clanek from tvorba.models import ZmrazenaVysledkovka, Deadline, Cislo, Rocnik, Pohadka, Tema, Problem, Problemy_Opravovatele, Uloha, Clanek
from treenode.models import UlohaVzorakNode, UlohaZadaniNode, CisloNode, TemaVCisleNode, OrgTextNode, Obrazek, RocnikNode, PohadkaNode, TextNode, MezicisloNode, ReseniNode, CastNode, Text, TreeNode
# Kvůli migr. 0041 # Kvůli migr. 0041
from soustredeni.models import generate_filename_konfera from soustredeni.models import generate_filename_konfera

View file

@ -1,69 +0,0 @@
import logging
import os
from django.db import models
from .base import SeminarModelBase
logger = logging.getLogger(__name__)
class Text(SeminarModelBase):
class Meta:
db_table = 'seminar_texty'
verbose_name = 'text'
verbose_name_plural = 'texty'
na_web = models.TextField(
'text na web', blank=True,
help_text='Text ke zveřejnění na webu')
do_cisla = models.TextField(
'text do čísla', blank=True,
help_text='Text ke zveřejnění v čísle')
# má OneToOneField s:
# Reseni (je u něj jako reseni_cele)
# obrázky mají návaznost opačným směrem (vazba z druhé strany)
def save(self, *args, **kwargs):
super().save(*args, **kwargs)
# *Node.save() aktualizuje název *Nodu.
for tn in self.textnode_set.all():
tn.save()
def __str__(self):
return str(self.na_web)[:20]
class Obrazek(SeminarModelBase):
class Meta:
db_table = 'seminar_obrazky'
verbose_name = 'obrázek'
verbose_name_plural = 'obrázky'
# Interní ID
id = models.AutoField(primary_key=True)
na_web = models.ImageField(
'obrázek na web', upload_to='obrazky/%Y/%m/%d/',
null=True, blank=True)
text = models.ForeignKey(
Text, verbose_name='text',
help_text='text, ve kterém se obrázek vyskytuje',
null=False, blank=False, on_delete=models.CASCADE)
do_cisla_barevny = models.FileField(
'barevný obrázek do čísla',
help_text='Barevná verze obrázku do čísla',
upload_to='obrazky/%Y/%m/%d/', blank=True, null=True)
do_cisla_cernobily = models.FileField(
'černobílý obrázek do čísla',
help_text='Černobílá verze obrázku do čísla',
upload_to='obrazky/%Y/%m/%d/', blank=True, null=True)
# TODO placement hint - chci ho tady / pred textem / za textem

View file

@ -5,7 +5,7 @@ from django.forms import widgets
from polymorphic.admin import PolymorphicParentModelAdmin, PolymorphicChildModelAdmin, PolymorphicChildModelFilter from polymorphic.admin import PolymorphicParentModelAdmin, PolymorphicChildModelAdmin, PolymorphicChildModelFilter
from .models import TreeNode, RocnikNode, CisloNode, MezicisloNode, TemaVCisleNode, UlohaZadaniNode, PohadkaNode, UlohaVzorakNode, TextNode, CastNode, OrgTextNode from .models import TreeNode, RocnikNode, CisloNode, MezicisloNode, TemaVCisleNode, UlohaZadaniNode, PohadkaNode, UlohaVzorakNode, TextNode, CastNode, OrgTextNode
from .models.pomocne import Text, Obrazek from .models import Text, Obrazek
# Polymorfismus pro stromy # Polymorfismus pro stromy
# TODO: Inlines podle https://django-polymorphic.readthedocs.io/en/stable/admin.html # TODO: Inlines podle https://django-polymorphic.readthedocs.io/en/stable/admin.html

View file

@ -1,5 +1,5 @@
from django import forms from django import forms
from .models.pomocne import Obrazek from .models import Obrazek
# pro přidání políčka do formuláře je potřeba # pro přidání políčka do formuláře je potřeba
# - mít v modelu tu položku, kterou chci upravovat # - mít v modelu tu položku, kterou chci upravovat

View file

@ -0,0 +1,231 @@
# Generated by Django 4.2.16 on 2024-11-02 20:06
from django.db import migrations, models
import django.db.models.deletion
def nastav_nove_contenttypes(apps, schema_editor):
ContentType = apps.get_model('contenttypes', 'ContentType')
# Seznam níž ověřen tím, že se skutečně při téhle migraci tabulka `django_content_type` (lokální v SQLite) změní správně :-)
for m in ('ulohavzoraknode', 'ulohazadaninode', 'cislonode', 'temavcislenode', 'orgtextnode', 'obrazek', 'rocniknode', 'pohadkanode', 'textnode', 'mezicislonode', 'reseninode', 'castnode', 'text', 'treenode'):
ContentType.objects.filter(app_label='seminar', model=m).update(app_label='treenode')
def nastav_stare_contenttypes(apps, schema_editor):
ContentType = apps.get_model('contenttypes', 'ContentType')
for m in ('ulohavzoraknode', 'ulohazadaninode', 'cislonode', 'temavcislenode', 'orgtextnode', 'obrazek', 'rocniknode', 'pohadkanode', 'textnode', 'mezicislonode', 'reseninode', 'castnode', 'text', 'treenode'):
ContentType.objects.filter(app_label='treenode', model=m).update(app_label='seminar')
class Migration(migrations.Migration):
initial = True
dependencies = [
('seminar', '0141_odstrel_treenode_unmanage'),
]
operations = [
migrations.CreateModel(
name='Obrazek',
fields=[
('id', models.AutoField(primary_key=True, serialize=False)),
('na_web', models.ImageField(blank=True, null=True, upload_to='obrazky/%Y/%m/%d/', verbose_name='obrázek na web')),
('do_cisla_barevny', models.FileField(blank=True, help_text='Barevná verze obrázku do čísla', null=True, upload_to='obrazky/%Y/%m/%d/', verbose_name='barevný obrázek do čísla')),
('do_cisla_cernobily', models.FileField(blank=True, help_text='Černobílá verze obrázku do čísla', null=True, upload_to='obrazky/%Y/%m/%d/', verbose_name='černobílý obrázek do čísla')),
('text', models.ForeignKey(help_text='text, ve kterém se obrázek vyskytuje', on_delete=django.db.models.deletion.CASCADE, to='treenode.text', verbose_name='text')),
],
options={
'verbose_name': 'obrázek',
'verbose_name_plural': 'obrázky',
'db_table': 'seminar_obrazky',
'managed': False,
},
),
migrations.CreateModel(
name='Text',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('na_web', models.TextField(blank=True, help_text='Text ke zveřejnění na webu', verbose_name='text na web')),
('do_cisla', models.TextField(blank=True, help_text='Text ke zveřejnění v čísle', verbose_name='text do čísla')),
],
options={
'verbose_name': 'text',
'verbose_name_plural': 'texty',
'db_table': 'seminar_texty',
'managed': False,
},
),
migrations.CreateModel(
name='TreeNode',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('nazev', models.TextField(help_text='Tento název se zobrazuje v nabídkách pro výběr vhodného TreeNode', null=True, verbose_name='název tohoto node')),
('zajimave', models.BooleanField(default=False, help_text='Zobrazí se daná věc na rozcestníku témátek', verbose_name='Zajímavé')),
('srolovatelne', models.BooleanField(blank=True, help_text='Bude na stránce témátka možnost tuto položku skrýt', null=True, verbose_name='Srolovatelné')),
('first_child', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='father_of_first', to='treenode.treenode', verbose_name='první potomek')),
('polymorphic_ctype', models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='polymorphic_%(app_label)s.%(class)s_set+', to='contenttypes.contenttype')),
('root', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='potomci_set', to='treenode.treenode', verbose_name='kořen stromu')),
('succ', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='prev', to='treenode.treenode', verbose_name='další element na stejné úrovni')),
],
options={
'verbose_name': 'TreeNode',
'verbose_name_plural': 'TreeNody',
'db_table': 'seminar_nodes_treenode',
'managed': False,
},
),
migrations.CreateModel(
name='CastNode',
fields=[
('treenode_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='treenode.treenode')),
('nadpis', models.CharField(help_text='Nadpis podvěšené části obsahu', max_length=100, verbose_name='Nadpis')),
],
options={
'verbose_name': 'Část (Node)',
'verbose_name_plural': 'Části (Node)',
'db_table': 'seminar_nodes_cast',
'managed': False,
},
bases=('treenode.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='treenode.treenode')),
('cislo', models.OneToOneField(on_delete=django.db.models.deletion.PROTECT, to='tvorba.cislo', verbose_name='číslo')),
],
options={
'verbose_name': 'Číslo (Node)',
'verbose_name_plural': 'Čísla (Node)',
'db_table': 'seminar_nodes_cislo',
'managed': False,
},
bases=('treenode.treenode',),
),
migrations.CreateModel(
name='MezicisloNode',
fields=[
('treenode_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='treenode.treenode')),
],
options={
'verbose_name': 'Mezičíslo (Node)',
'verbose_name_plural': 'Mezičísla (Node)',
'db_table': 'seminar_nodes_mezicislo',
'managed': False,
},
bases=('treenode.treenode',),
),
migrations.CreateModel(
name='OrgTextNode',
fields=[
('treenode_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='treenode.treenode')),
('org_verejny', models.BooleanField(default=True, help_text='Pokud ano, bude org pod článkem podepsaný', verbose_name='Org je veřejný?')),
('organizator', models.ForeignKey( on_delete=django.db.models.deletion.DO_NOTHING, to='personalni.organizator', verbose_name='Organizátor')),
],
options={
'verbose_name': 'Organizátorský článek (Node)',
'verbose_name_plural': 'Organizátorské články (Node)',
'db_table': 'seminar_nodes_orgtextnode',
'managed': False,
},
bases=('treenode.treenode',),
),
migrations.CreateModel(
name='PohadkaNode',
fields=[
('treenode_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='treenode.treenode')),
('pohadka', models.OneToOneField(on_delete=django.db.models.deletion.PROTECT, to='tvorba.pohadka', verbose_name='pohádka')),
],
options={
'verbose_name': 'Pohádka (Node)',
'verbose_name_plural': 'Pohádky (Node)',
'db_table': 'seminar_nodes_pohadka',
'managed': False,
},
bases=('treenode.treenode',),
),
migrations.CreateModel(
name='ReseniNode',
fields=[
('treenode_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='treenode.treenode')),
('reseni', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='odevzdavatko.reseni', verbose_name='reseni')),
],
options={
'verbose_name': 'Otištěné řešení (Node)',
'verbose_name_plural': 'Otištěná řešení (Node)',
'db_table': 'seminar_nodes_otistene_reseni',
'managed': False,
},
bases=('treenode.treenode',),
),
migrations.CreateModel(
name='RocnikNode',
fields=[
('treenode_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='treenode.treenode')),
('rocnik', models.OneToOneField(on_delete=django.db.models.deletion.PROTECT, to='tvorba.rocnik', verbose_name='ročník')),
],
options={
'verbose_name': 'Ročník (Node)',
'verbose_name_plural': 'Ročníky (Node)',
'db_table': 'seminar_nodes_rocnik',
'managed': False,
},
bases=('treenode.treenode',),
),
migrations.CreateModel(
name='TemaVCisleNode',
fields=[
('treenode_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='treenode.treenode')),
('tema', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='tvorba.tema', verbose_name='téma v čísle')),
],
options={
'verbose_name': 'Téma v čísle (Node)',
'verbose_name_plural': 'Témata v čísle (Node)',
'db_table': 'seminar_nodes_temavcisle',
'managed': False,
},
bases=('treenode.treenode',),
),
migrations.CreateModel(
name='TextNode',
fields=[
('treenode_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='treenode.treenode')),
('text', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='treenode.text', verbose_name='text')),
],
options={
'verbose_name': 'Text (Node)',
'verbose_name_plural': 'Text (Node)',
'db_table': 'seminar_nodes_obsah',
'managed': False,
},
bases=('treenode.treenode',),
),
migrations.CreateModel(
name='UlohaVzorakNode',
fields=[
('treenode_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='treenode.treenode')),
('uloha', models.OneToOneField(null=True, on_delete=django.db.models.deletion.PROTECT, to='tvorba.uloha', verbose_name='úloha')),
],
options={
'verbose_name': 'Vzorák úlohy (Node)',
'verbose_name_plural': 'Vzoráky úloh (Node)',
'db_table': 'seminar_nodes_uloha_vzorak',
'managed': False,
},
bases=('treenode.treenode',),
),
migrations.CreateModel(
name='UlohaZadaniNode',
fields=[
('treenode_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='treenode.treenode')),
('uloha', models.OneToOneField(null=True, on_delete=django.db.models.deletion.PROTECT, to='tvorba.uloha', verbose_name='úloha')),
],
options={
'verbose_name': 'Zadání úlohy (Node)',
'verbose_name_plural': 'Zadání úloh (Node)',
'db_table': 'seminar_nodes_uloha_zadani',
'managed': False,
},
bases=('treenode.treenode',),
),
migrations.RunPython(nastav_nove_contenttypes, nastav_stare_contenttypes),
]

View file

@ -0,0 +1,70 @@
# Generated by Django 4.2.16 on 2024-11-02 20:50
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('treenode', '0001_odstrel_treenode_create'),
('seminar', '0142_odstrel_treenode_delete'),
]
operations = [
migrations.AlterModelOptions(
name='castnode',
options={'verbose_name': 'Část (Node)', 'verbose_name_plural': 'Části (Node)'},
),
migrations.AlterModelOptions(
name='cislonode',
options={'verbose_name': 'Číslo (Node)', 'verbose_name_plural': 'Čísla (Node)'},
),
migrations.AlterModelOptions(
name='mezicislonode',
options={'verbose_name': 'Mezičíslo (Node)', 'verbose_name_plural': 'Mezičísla (Node)'},
),
migrations.AlterModelOptions(
name='obrazek',
options={'verbose_name': 'obrázek', 'verbose_name_plural': 'obrázky'},
),
migrations.AlterModelOptions(
name='orgtextnode',
options={'verbose_name': 'Organizátorský článek (Node)', 'verbose_name_plural': 'Organizátorské články (Node)'},
),
migrations.AlterModelOptions(
name='pohadkanode',
options={'verbose_name': 'Pohádka (Node)', 'verbose_name_plural': 'Pohádky (Node)'},
),
migrations.AlterModelOptions(
name='reseninode',
options={'verbose_name': 'Otištěné řešení (Node)', 'verbose_name_plural': 'Otištěná řešení (Node)'},
),
migrations.AlterModelOptions(
name='rocniknode',
options={'verbose_name': 'Ročník (Node)', 'verbose_name_plural': 'Ročníky (Node)'},
),
migrations.AlterModelOptions(
name='temavcislenode',
options={'verbose_name': 'Téma v čísle (Node)', 'verbose_name_plural': 'Témata v čísle (Node)'},
),
migrations.AlterModelOptions(
name='text',
options={'verbose_name': 'text', 'verbose_name_plural': 'texty'},
),
migrations.AlterModelOptions(
name='textnode',
options={'verbose_name': 'Text (Node)', 'verbose_name_plural': 'Text (Node)'},
),
migrations.AlterModelOptions(
name='treenode',
options={'verbose_name': 'TreeNode', 'verbose_name_plural': 'TreeNody'},
),
migrations.AlterModelOptions(
name='ulohavzoraknode',
options={'verbose_name': 'Vzorák úlohy (Node)', 'verbose_name_plural': 'Vzoráky úloh (Node)'},
),
migrations.AlterModelOptions(
name='ulohazadaninode',
options={'verbose_name': 'Zadání úlohy (Node)', 'verbose_name_plural': 'Zadání úloh (Node)'},
),
]

View file

@ -0,0 +1,13 @@
# Generated by Django 4.2.16 on 2024-11-02 20:52
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('treenode', '0002_odstrel_treenode_manage'),
]
operations = [
]

View file

@ -8,11 +8,11 @@ from unidecode import unidecode # Používám pro získání ID odkazu (ještě
from polymorphic.models import PolymorphicModel from polymorphic.models import PolymorphicModel
from seminar.models import SeminarModelBase
from personalni.models import Organizator from personalni.models import Organizator
from odevzdavatko.models import Reseni from odevzdavatko.models import Reseni
from .pomocne import Text
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
import tvorba.models as am import tvorba.models as am
@ -234,6 +234,48 @@ class UlohaVzorakNode(TreeNode):
def getOdkazStr(self): def getOdkazStr(self):
return str(self.uloha) return str(self.uloha)
class ReseniNode(TreeNode):
class Meta:
db_table = 'seminar_nodes_otistene_reseni'
verbose_name = 'Otištěné řešení (Node)'
verbose_name_plural = 'Otištěná řešení (Node)'
reseni = models.ForeignKey(Reseni,
on_delete=models.PROTECT,
verbose_name = 'reseni')
def aktualizuj_nazev(self):
self.nazev = "ReseniNode: "+str(self.reseni)
def getOdkazStr(self):
return str(self.reseni)
class Text(SeminarModelBase):
class Meta:
db_table = 'seminar_texty'
verbose_name = 'text'
verbose_name_plural = 'texty'
na_web = models.TextField(
'text na web', blank=True,
help_text='Text ke zveřejnění na webu')
do_cisla = models.TextField(
'text do čísla', blank=True,
help_text='Text ke zveřejnění v čísle')
# má OneToOneField s:
# Reseni (je u něj jako reseni_cele)
# obrázky mají návaznost opačným směrem (vazba z druhé strany)
def save(self, *args, **kwargs):
super().save(*args, **kwargs)
# *Node.save() aktualizuje název *Nodu.
for tn in self.textnode_set.all():
tn.save()
def __str__(self):
return str(self.na_web)[:20]
class TextNode(TreeNode): class TextNode(TreeNode):
class Meta: class Meta:
@ -250,7 +292,6 @@ class TextNode(TreeNode):
def getOdkazStr(self): def getOdkazStr(self):
return str(self.text) return str(self.text)
class CastNode(TreeNode): class CastNode(TreeNode):
class Meta: class Meta:
db_table = 'seminar_nodes_cast' db_table = 'seminar_nodes_cast'
@ -266,17 +307,33 @@ class CastNode(TreeNode):
return str(self.nadpis) return str(self.nadpis)
class ReseniNode(TreeNode): class Obrazek(SeminarModelBase):
class Meta: class Meta:
db_table = 'seminar_nodes_otistene_reseni' db_table = 'seminar_obrazky'
verbose_name = 'Otištěné řešení (Node)' verbose_name = 'obrázek'
verbose_name_plural = 'Otištěná řešení (Node)' verbose_name_plural = 'obrázky'
reseni = models.ForeignKey(Reseni,
on_delete=models.PROTECT,
verbose_name = 'reseni')
def aktualizuj_nazev(self): # Interní ID
self.nazev = "ReseniNode: "+str(self.reseni) id = models.AutoField(primary_key=True)
na_web = models.ImageField(
'obrázek na web', upload_to='obrazky/%Y/%m/%d/',
null=True, blank=True)
text = models.ForeignKey(
Text, verbose_name='text',
help_text='text, ve kterém se obrázek vyskytuje',
null=False, blank=False, on_delete=models.CASCADE)
do_cisla_barevny = models.FileField(
'barevný obrázek do čísla',
help_text='Barevná verze obrázku do čísla',
upload_to='obrazky/%Y/%m/%d/', blank=True, null=True)
do_cisla_cernobily = models.FileField(
'černobílý obrázek do čísla',
help_text='Černobílá verze obrázku do čísla',
upload_to='obrazky/%Y/%m/%d/', blank=True, null=True)
# TODO placement hint - chci ho tady / pred textem / za textem
def getOdkazStr(self):
return str(self.reseni)

View file

@ -1 +0,0 @@
from seminar.models.treenode import *

View file

@ -1 +0,0 @@
from seminar.models.pomocne import *

View file

@ -5,7 +5,7 @@ from odevzdavatko.models import Reseni
from tvorba.models import Problem, Uloha from tvorba.models import Problem, Uloha
from .models import RocnikNode, CisloNode, MezicisloNode, TemaVCisleNode, OrgTextNode, PohadkaNode, TextNode, TreeNode, CastNode, UlohaZadaniNode, UlohaVzorakNode, ReseniNode from .models import RocnikNode, CisloNode, MezicisloNode, TemaVCisleNode, OrgTextNode, PohadkaNode, TextNode, TreeNode, CastNode, UlohaZadaniNode, UlohaVzorakNode, ReseniNode
from .models.pomocne import Text from .models import Text
from treenode import treelib from treenode import treelib
DEFAULT_NODE_DEPTH = 2 DEFAULT_NODE_DEPTH = 2

View file

@ -7,7 +7,7 @@ from django.contrib.auth.mixins import LoginRequiredMixin
from django.core.exceptions import PermissionDenied from django.core.exceptions import PermissionDenied
from .models import TemaVCisleNode, RocnikNode, CisloNode, UlohaVzorakNode, UlohaZadaniNode, TreeNode, CastNode, TextNode, ReseniNode, PohadkaNode, OrgTextNode from .models import TemaVCisleNode, RocnikNode, CisloNode, UlohaVzorakNode, UlohaZadaniNode, TreeNode, CastNode, TextNode, ReseniNode, PohadkaNode, OrgTextNode
from .models.pomocne import Text, Obrazek from .models import Text, Obrazek
from treenode import treelib from treenode import treelib
import treenode.forms as f import treenode.forms as f
import treenode.templatetags as tnltt import treenode.templatetags as tnltt

View file

@ -8,7 +8,7 @@ from odevzdavatko.models import Reseni
from tvorba.models import Problem, Uloha from tvorba.models import Problem, Uloha
from .models import TextNode, CastNode, UlohaVzorakNode, UlohaZadaniNode, ReseniNode from .models import TextNode, CastNode, UlohaVzorakNode, UlohaZadaniNode, ReseniNode
from .models.pomocne import Text from .models import Text
import treenode.serializers as views import treenode.serializers as views
from treenode.permissions import AllowWrite from treenode.permissions import AllowWrite

View file

@ -0,0 +1,13 @@
# Generated by Django 4.2.16 on 2024-11-02 19:45
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('tvorba', '0003_tvorba_post'),
]
operations = [
]

View file

@ -0,0 +1,14 @@
# Generated by Django 4.2.16 on 2024-11-02 20:52
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('tvorba', '0004_odstrel_treenode_pre'),
('treenode', '0003_odstrel_treenode_post'),
]
operations = [
]

View file

@ -11,7 +11,7 @@ from .models import Rocnik, Cislo, Deadline, Problem, Tema, Uloha, Clanek
from odevzdavatko.models import Reseni, Hodnoceni from odevzdavatko.models import Reseni, Hodnoceni
# TODO zbavit se treenodů do treenode.testutils (ty pak klidně volat odtud) # TODO zbavit se treenodů do treenode.testutils (ty pak klidně volat odtud)
from treenode.models import TextNode, UlohaZadaniNode, UlohaVzorakNode, RocnikNode, CisloNode, TemaVCisleNode, CastNode, MezicisloNode, ReseniNode from treenode.models import TextNode, UlohaZadaniNode, UlohaVzorakNode, RocnikNode, CisloNode, TemaVCisleNode, CastNode, MezicisloNode, ReseniNode
from treenode.models.pomocne import Text from treenode.models import Text
from treenode.treelib import all_children, insert_last_child, all_children_of_type, create_node_after from treenode.treelib import all_children, insert_last_child, all_children_of_type, create_node_after