From cdc147259589d445fc881a78febec15e95912088 Mon Sep 17 00:00:00 2001 From: "Pavel \"LEdoian\" Turinsky" Date: Wed, 1 May 2024 00:46:31 +0200 Subject: [PATCH 1/4] =?UTF-8?q?Pre,=20unmanage,=20create.=20Snad=20ve=20fi?= =?UTF-8?q?n=C3=A1ln=C3=AD=20podob=C4=9B.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../migrations/0011_pre_split_soustredeni.py | 13 ++ .../migrations/0006_pre_split_soustredeni.py | 13 ++ .../migrations/0016_pre_split_soustredeni.py | 13 ++ .../migrations/0122_pre_split_soustredeni.py | 16 ++ .../migrations/0123_soustredeni_unmanage.py | 33 +++ seminar/models/soustredeni.py | 25 +- .../migrations/0001_split_from_seminar.py | 119 ++++++++++ soustredeni/models.py | 221 ++++++++++++++++++ split-apps-meta/create.notes | 3 +- split-apps-meta/unmanage.notes | 3 + 10 files changed, 453 insertions(+), 6 deletions(-) create mode 100644 galerie/migrations/0011_pre_split_soustredeni.py create mode 100644 personalni/migrations/0006_pre_split_soustredeni.py create mode 100644 prednasky/migrations/0016_pre_split_soustredeni.py create mode 100644 seminar/migrations/0122_pre_split_soustredeni.py create mode 100644 seminar/migrations/0123_soustredeni_unmanage.py create mode 100644 soustredeni/migrations/0001_split_from_seminar.py create mode 100644 soustredeni/models.py diff --git a/galerie/migrations/0011_pre_split_soustredeni.py b/galerie/migrations/0011_pre_split_soustredeni.py new file mode 100644 index 00000000..a038ca44 --- /dev/null +++ b/galerie/migrations/0011_pre_split_soustredeni.py @@ -0,0 +1,13 @@ +# Generated by Django 4.2.11 on 2024-04-30 21:53 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('galerie', '0010_auto_20200819_0947'), + ] + + operations = [ + ] diff --git a/personalni/migrations/0006_pre_split_soustredeni.py b/personalni/migrations/0006_pre_split_soustredeni.py new file mode 100644 index 00000000..ce2b4de1 --- /dev/null +++ b/personalni/migrations/0006_pre_split_soustredeni.py @@ -0,0 +1,13 @@ +# Generated by Django 4.2.11 on 2024-04-30 21:53 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('personalni', '0005_personalni_post_migrate'), + ] + + operations = [ + ] diff --git a/prednasky/migrations/0016_pre_split_soustredeni.py b/prednasky/migrations/0016_pre_split_soustredeni.py new file mode 100644 index 00000000..77ade0d0 --- /dev/null +++ b/prednasky/migrations/0016_pre_split_soustredeni.py @@ -0,0 +1,13 @@ +# Generated by Django 4.2.11 on 2024-04-30 21:53 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('prednasky', '0015_personalni_post_migrate'), + ] + + operations = [ + ] diff --git a/seminar/migrations/0122_pre_split_soustredeni.py b/seminar/migrations/0122_pre_split_soustredeni.py new file mode 100644 index 00000000..58e9d479 --- /dev/null +++ b/seminar/migrations/0122_pre_split_soustredeni.py @@ -0,0 +1,16 @@ +# Generated by Django 4.2.11 on 2024-04-30 21:54 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('seminar', '0121_personalni_post_migrate'), + ('personalni', '0006_pre_split_soustredeni'), + ('galerie', '0011_pre_split_soustredeni'), + ('prednasky', '0016_pre_split_soustredeni'), + ] + + operations = [ + ] diff --git a/seminar/migrations/0123_soustredeni_unmanage.py b/seminar/migrations/0123_soustredeni_unmanage.py new file mode 100644 index 00000000..a7b87ff3 --- /dev/null +++ b/seminar/migrations/0123_soustredeni_unmanage.py @@ -0,0 +1,33 @@ +# Generated by Django 4.2.11 on 2024-04-30 22:17 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('seminar', '0122_pre_split_soustredeni'), + ] + + operations = [ + migrations.AlterModelOptions( + name='konfera', + options={'managed': False, 'verbose_name': 'Konfera', 'verbose_name_plural': 'Konfery'}, + ), + migrations.AlterModelOptions( + name='konfery_ucastnici', + options={'managed': False, 'ordering': ['konfera', 'resitel'], 'verbose_name': 'Účast na konfeře', 'verbose_name_plural': 'Účasti na konfeře'}, + ), + migrations.AlterModelOptions( + name='soustredeni', + options={'managed': False, 'ordering': ['-rocnik__rocnik', '-datum_zacatku'], 'verbose_name': 'Soustředění', 'verbose_name_plural': 'Soustředění'}, + ), + migrations.AlterModelOptions( + name='soustredeni_organizatori', + options={'managed': False, 'ordering': ['soustredeni', 'organizator'], 'verbose_name': 'Účast organizátorů na soustředění', 'verbose_name_plural': 'Účasti organizátorů na soustředění'}, + ), + migrations.AlterModelOptions( + name='soustredeni_ucastnici', + options={'managed': False, 'ordering': ['soustredeni', 'resitel'], 'verbose_name': 'Účast na soustředění', 'verbose_name_plural': 'Účasti na soustředění'}, + ), + ] diff --git a/seminar/models/soustredeni.py b/seminar/models/soustredeni.py index 275224a3..3f761444 100644 --- a/seminar/models/soustredeni.py +++ b/seminar/models/soustredeni.py @@ -20,6 +20,7 @@ logger = logging.getLogger(__name__) class Soustredeni(SeminarModelBase): class Meta: + managed = False db_table = 'seminar_soustredeni' verbose_name = 'Soustředění' verbose_name_plural = 'Soustředění' @@ -28,7 +29,7 @@ class Soustredeni(SeminarModelBase): # Interní ID id = models.AutoField(primary_key = True) - rocnik = models.ForeignKey(am.Rocnik, verbose_name='ročník', related_name='soustredeni', + rocnik = models.ForeignKey(am.Rocnik, verbose_name='ročník', related_name='soustredeni_old', on_delete=models.PROTECT) datum_zacatku = models.DateField('datum začátku', blank=True, null=True, @@ -43,9 +44,11 @@ class Soustredeni(SeminarModelBase): help_text='Místo (název obce, volitelně též objektu') ucastnici = models.ManyToManyField(Resitel, verbose_name='účastníci soustředění', + related_name='soustredeni_old', help_text='Seznam účastníků soustředění', through='Soustredeni_Ucastnici') organizatori = models.ManyToManyField(Organizator, + related_name='soustredeni_old', verbose_name='Organizátoři soustředění', help_text='Seznam organizátorů soustředění', through='Soustredeni_Organizatori') @@ -84,6 +87,7 @@ class Soustredeni_Ucastnici(SeminarModelBase): # zmena dedicnosti z models.Model na SeminarModelBase, potencialni vznik bugu class Meta: + managed = False db_table = 'seminar_soustredeni_ucastnici' verbose_name = 'Účast na soustředění' verbose_name_plural = 'Účasti na soustředění' @@ -92,9 +96,12 @@ class Soustredeni_Ucastnici(SeminarModelBase): # Interní ID id = models.AutoField(primary_key = True) - resitel = models.ForeignKey(Resitel, verbose_name='řešitel', on_delete=models.PROTECT) + resitel = models.ForeignKey(Resitel, verbose_name='řešitel', + related_name='sous_ucastnici', + on_delete=models.PROTECT) soustredeni = models.ForeignKey(Soustredeni, verbose_name='soustředění', + related_name='sous_ucastnici', on_delete=models.PROTECT) poznamka = models.TextField('neveřejná poznámka', blank=True, @@ -110,6 +117,7 @@ class Soustredeni_Organizatori(SeminarModelBase): # zmena dedicnosti z models.Model na SeminarModelBase, potencialni vznik bugu class Meta: + managed = False db_table = 'seminar_soustredeni_organizatori' verbose_name = 'Účast organizátorů na soustředění' verbose_name_plural = 'Účasti organizátorů na soustředění' @@ -119,9 +127,11 @@ class Soustredeni_Organizatori(SeminarModelBase): id = models.AutoField(primary_key = True) organizator = models.ForeignKey(Organizator, verbose_name='organizátor', + related_name='sous_orgove', on_delete=models.PROTECT) soustredeni = models.ForeignKey(Soustredeni, verbose_name='soustředění', + related_name='sous_orgove', on_delete=models.PROTECT) poznamka = models.TextField('neveřejná poznámka', blank=True, @@ -152,10 +162,13 @@ def generate_filename_konfera(self, filename): @reversion.register(ignore_duplicates=True) class Konfera(am.Problem): class Meta: + managed = False db_table = 'seminar_konfera' verbose_name = 'Konfera' verbose_name_plural = 'Konfery' + problem_ptr_old = models.OneToOneField(am.Problem, parent_link=True, related_name='konfera_old', on_delete=models.PROTECT, primary_key=True) + anotace = models.TextField('anotace', blank=True, help_text='Popis, o čem bude konfera.') @@ -164,10 +177,11 @@ class Konfera(am.Problem): # FIXME: Umíme omezit jen na účastníky daného soustřeďka? ucastnici = models.ManyToManyField(Resitel, verbose_name='účastníci konfery', + related_name='konfera_old', help_text='Seznam účastníků konfery', through='Konfery_Ucastnici') soustredeni = models.ForeignKey(Soustredeni, verbose_name='soustředění', - related_name='konfery', on_delete = models.SET_NULL, null=True) + related_name='konfery_old', on_delete = models.SET_NULL, null=True) TYP_VELETRH = 'veletrh' TYP_PREZENTACE = 'prezentace' @@ -196,6 +210,7 @@ class Konfera(am.Problem): class Konfery_Ucastnici(models.Model): class Meta: + managed = False db_table = 'seminar_konfery_ucastnici' verbose_name = 'Účast na konfeře' verbose_name_plural = 'Účasti na konfeře' @@ -204,9 +219,9 @@ class Konfery_Ucastnici(models.Model): # Interní ID id = models.AutoField(primary_key = True) - resitel = models.ForeignKey(Resitel, verbose_name='řešitel', on_delete=models.PROTECT) + resitel = models.ForeignKey(Resitel, verbose_name='řešitel', on_delete=models.PROTECT, related_name='konf_uc') - konfera = models.ForeignKey(Konfera, verbose_name='konfera', on_delete=models.CASCADE) + konfera = models.ForeignKey(Konfera, verbose_name='konfera', on_delete=models.CASCADE, related_name='konf_uc') poznamka = models.TextField('neveřejná poznámka', blank=True, help_text='Neveřejná poznámka k účasti (plain text)') diff --git a/soustredeni/migrations/0001_split_from_seminar.py b/soustredeni/migrations/0001_split_from_seminar.py new file mode 100644 index 00000000..745f62e7 --- /dev/null +++ b/soustredeni/migrations/0001_split_from_seminar.py @@ -0,0 +1,119 @@ +# Generated by Django 4.2.11 on 2024-04-30 22:53 + +from django.db import migrations, models +import django.db.models.deletion +import soustredeni.models + +def nastav_nove_contenttypes(apps, schema_editor): + ContentType = apps.get_model('contenttypes', 'ContentType') + for m in ('konfera', 'soustredeni', 'soustredeni_ucastnici', 'soustredeni_organizatori', 'konfery_ucastnici'): + oct = ContentType.objects.filter(app_label='seminar', model=m) + oct.update(app_label='soustredeni') + +def nastav_stare_contenttypes(apps, schema_editor): + ContentType = apps.get_model('contenttypes', 'ContentType') + for m in ('konfera', 'soustredeni', 'soustredeni_ucastnici', 'soustredeni_organizatori', 'konfery_ucastnici'): + nct = ContentType.objects.filter(app_label='soustredeni', model=m) + nct.update(app_label='seminar') + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('seminar', '0123_soustredeni_unmanage'), + ] + + operations = [ + migrations.RunPython(nastav_nove_contenttypes, nastav_stare_contenttypes), + + migrations.CreateModel( + name='Konfera', + fields=[ + ('problem_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='seminar.problem')), + ('anotace', models.TextField(blank=True, help_text='Popis, o čem bude konfera.', verbose_name='anotace')), + ('abstrakt', models.TextField(blank=True, help_text='Abstrakt konfery tak, jak byl uveden ve sborníku', verbose_name='abstrakt')), + ('typ_prezentace', models.CharField(choices=[('veletrh', 'Veletrh (postery)'), ('prezentace', 'Prezentace (přednáška)')], default='veletrh', max_length=16, verbose_name='typ prezentace')), + ('prezentace', models.FileField(blank=True, help_text='Prezentace nebo fotka posteru', upload_to=soustredeni.models.generate_filename_konfera, verbose_name='prezentace')), + ('materialy', models.FileField(blank=True, help_text='Další materiály ke konfeře zabalené do jednoho souboru', upload_to=soustredeni.models.generate_filename_konfera, verbose_name='materialy')), + ('soustredeni', models.ForeignKey(to='soustredeni.soustredeni', verbose_name='soustředění', on_delete=models.PROTECT)), + ], + options={ + 'verbose_name': 'Konfera', + 'verbose_name_plural': 'Konfery', + 'db_table': 'seminar_konfera', + 'managed': False, + }, + bases=('seminar.problem',), + ), + migrations.CreateModel( + name='Konfery_Ucastnici', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False)), + ('poznamka', models.TextField(blank=True, help_text='Neveřejná poznámka k účasti (plain text)', verbose_name='neveřejná poznámka')), + ('resitel', models.ForeignKey(to='personalni.resitel', verbose_name='řešitel', on_delete=models.PROTECT)), + ('konfera', models.ForeignKey(to='soustredeni.konfera', verbose_name='konfera', on_delete=models.CASCADE)), + ], + options={ + 'verbose_name': 'Účast na konfeře', + 'verbose_name_plural': 'Účasti na konfeře', + 'db_table': 'seminar_konfery_ucastnici', + 'ordering': ['konfera', 'resitel'], + 'managed': False, + }, + ), + migrations.CreateModel( + name='Soustredeni', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False)), + ('datum_zacatku', models.DateField(blank=True, help_text='První den soustředění', null=True, verbose_name='datum začátku')), + ('datum_konce', models.DateField(blank=True, help_text='Poslední den soustředění', null=True, verbose_name='datum konce')), + ('verejne_db', models.BooleanField(db_column='verejne', default=False, verbose_name='soustředění zveřejněno')), + ('misto', models.CharField(blank=True, default='', help_text='Místo (název obce, volitelně též objektu', max_length=256, verbose_name='místo soustředění')), + ('text', models.TextField(blank=True, default='', verbose_name='text k soustředění (HTML)')), + ('typ', models.CharField(choices=[('jarni', 'Jarní soustředění'), ('podzimni', 'Podzimní soustředění'), ('vikend', 'Víkendový sraz'), ('vylet', 'Výlet')], default='podzimni', max_length=16, verbose_name='typ akce')), + ('exportovat', models.BooleanField(db_column='exportovat', default=False, help_text='Exportuje se jen podle tohoto flagu (ne veřejnosti)', verbose_name='export do AESOPa')), + ('rocnik', models.ForeignKey(to='seminar.rocnik', verbose_name='ročník', related_name='soustredeni', on_delete=models.PROTECT)), + ], + options={ + 'verbose_name': 'Soustředění', + 'verbose_name_plural': 'Soustředění', + 'db_table': 'seminar_soustredeni', + 'ordering': ['-rocnik__rocnik', '-datum_zacatku'], + 'managed': False, + }, + ), + migrations.CreateModel( + name='Soustredeni_Organizatori', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False)), + ('poznamka', models.TextField(blank=True, help_text='Neveřejná poznámka k účasti organizátora (plain text)', verbose_name='neveřejná poznámka')), + ('organizator', models.ForeignKey(to='personalni.organizator', verbose_name='organizátor', on_delete=models.PROTECT)), + ('soustredeni', models.ForeignKey(to='soustredeni.soustredeni', verbose_name='soustředění', on_delete=models.PROTECT)), + ], + options={ + 'verbose_name': 'Účast organizátorů na soustředění', + 'verbose_name_plural': 'Účasti organizátorů na soustředění', + 'db_table': 'seminar_soustredeni_organizatori', + 'ordering': ['soustredeni', 'organizator'], + 'managed': False, + }, + ), + migrations.CreateModel( + name='Soustredeni_Ucastnici', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False)), + ('poznamka', models.TextField(blank=True, help_text='Neveřejná poznámka k účasti (plain text)', verbose_name='neveřejná poznámka')), + ('resitel', models.ForeignKey(to='personalni.resitel', verbose_name='řešitel', on_delete=models.PROTECT)), + ('soustredeni', models.ForeignKey(to='soustredeni.soustredeni', verbose_name='soustředění', on_delete=models.PROTECT)), + ], + options={ + 'verbose_name': 'Účast na soustředění', + 'verbose_name_plural': 'Účasti na soustředění', + 'db_table': 'seminar_soustredeni_ucastnici', + 'ordering': ['soustredeni', 'resitel'], + 'managed': False, + }, + ), + ] diff --git a/soustredeni/models.py b/soustredeni/models.py new file mode 100644 index 00000000..4429e2bf --- /dev/null +++ b/soustredeni/models.py @@ -0,0 +1,221 @@ +# -*- coding: utf-8 -*- +import logging +import os + +from django.db import models +from django.urls import reverse +from reversion import revisions as reversion + +from django.conf import settings + +from personalni.models import Resitel, Organizator + +from seminar.models.base import SeminarModelBase +from seminar.models import tvorba as am + +logger = logging.getLogger(__name__) + + +@reversion.register(ignore_duplicates=True) +class Soustredeni(SeminarModelBase): + + class Meta: + managed = False + db_table = 'seminar_soustredeni' + verbose_name = 'Soustředění' + verbose_name_plural = 'Soustředění' + ordering = ['-rocnik__rocnik', '-datum_zacatku'] + + # Interní ID + id = models.AutoField(primary_key = True) + + rocnik = models.ForeignKey(am.Rocnik, verbose_name='ročník', related_name='soustredeni', + on_delete=models.PROTECT) + + datum_zacatku = models.DateField('datum začátku', blank=True, null=True, + help_text='První den soustředění') + + datum_konce = models.DateField('datum konce', blank=True, null=True, + help_text='Poslední den soustředění') + + verejne_db = models.BooleanField('soustředění zveřejněno', db_column='verejne', default=False) + + misto = models.CharField('místo soustředění', max_length=256, blank=True, default='', + help_text='Místo (název obce, volitelně též objektu') + + ucastnici = models.ManyToManyField(Resitel, verbose_name='účastníci soustředění', + help_text='Seznam účastníků soustředění', through='Soustredeni_Ucastnici') + + organizatori = models.ManyToManyField(Organizator, + verbose_name='Organizátoři soustředění', + help_text='Seznam organizátorů soustředění', + through='Soustredeni_Organizatori') + + text = models.TextField('text k soustředění (HTML)', blank=True, default='') + + TYP_JARNI = 'jarni' + TYP_PODZIMNI = 'podzimni' + TYP_VIKEND = 'vikend' + TYP_VYLET = 'vylet' + TYP_CHOICES = [ + (TYP_JARNI, 'Jarní soustředění'), + (TYP_PODZIMNI, 'Podzimní soustředění'), + (TYP_VIKEND, 'Víkendový sraz'), + (TYP_VYLET, 'Výlet'), + ] + typ = models.CharField('typ akce', max_length=16, choices=TYP_CHOICES, blank=False, default=TYP_PODZIMNI) + + exportovat = models.BooleanField('export do AESOPa', db_column='exportovat', default=False, + help_text='Exportuje se jen podle tohoto flagu (ne veřejnosti)') + + def __str__(self): + return '{} ({})'.format(self.misto, self.datum_zacatku) + + def verejne(self): + return self.verejne_db + verejne.boolean = True + + def verejne_url(self): + #return reverse('seminar_soustredeni', kwargs={'pk': self.id}) + return reverse('seminar_seznam_soustredeni') + + +@reversion.register(ignore_duplicates=True) +class Soustredeni_Ucastnici(SeminarModelBase): +# zmena dedicnosti z models.Model na SeminarModelBase, potencialni vznik bugu + + class Meta: + managed = False + db_table = 'seminar_soustredeni_ucastnici' + verbose_name = 'Účast na soustředění' + verbose_name_plural = 'Účasti na soustředění' + ordering = ['soustredeni', 'resitel'] + + # Interní ID + id = models.AutoField(primary_key = True) + + resitel = models.ForeignKey(Resitel, verbose_name='řešitel', on_delete=models.PROTECT) + + soustredeni = models.ForeignKey(Soustredeni, verbose_name='soustředění', + on_delete=models.PROTECT) + + poznamka = models.TextField('neveřejná poznámka', blank=True, + help_text='Neveřejná poznámka k účasti (plain text)') + + def __str__(self): + return '{} na {}'.format(self.resitel, self.soustredeni) + # NOTE: Poteciální DB HOG bez select_related + + +@reversion.register(ignore_duplicates=True) +class Soustredeni_Organizatori(SeminarModelBase): +# zmena dedicnosti z models.Model na SeminarModelBase, potencialni vznik bugu + + class Meta: + managed = False + db_table = 'seminar_soustredeni_organizatori' + verbose_name = 'Účast organizátorů na soustředění' + verbose_name_plural = 'Účasti organizátorů na soustředění' + ordering = ['soustredeni', 'organizator'] + + # Interní ID + id = models.AutoField(primary_key = True) + + organizator = models.ForeignKey(Organizator, verbose_name='organizátor', + on_delete=models.PROTECT) + + soustredeni = models.ForeignKey(Soustredeni, verbose_name='soustředění', + on_delete=models.PROTECT) + + poznamka = models.TextField('neveřejná poznámka', blank=True, + help_text='Neveřejná poznámka k účasti organizátora (plain text)') + + def __str__(self): + return '{} na {}'.format(self.organizator, self.soustredeni) + # NOTE: Poteciální DB HOG bez select_related + + +# FIXME cycle import + + +# Django neumí jednoduše serializovat partial nebo třídu s __call__ +# (https://docs.djangoproject.com/en/1.8/topics/migrations/), +# neprojdou pak migrace. Takže rozlišení funkcí generujících názvy souboru +# podle adresáře řešíme takto. + +## +def generate_filename_konfera(self, filename): + return os.path.join( + settings.SEMINAR_KONFERY_DIR, + am.aux_generate_filename(self, filename) + ) + +## + +@reversion.register(ignore_duplicates=True) +class Konfera(am.Problem): + class Meta: + managed = False + db_table = 'seminar_konfera' + verbose_name = 'Konfera' + verbose_name_plural = 'Konfery' + + anotace = models.TextField('anotace', blank=True, + help_text='Popis, o čem bude konfera.') + + abstrakt = models.TextField('abstrakt', blank=True, + help_text='Abstrakt konfery tak, jak byl uveden ve sborníku') + + # FIXME: Umíme omezit jen na účastníky daného soustřeďka? + ucastnici = models.ManyToManyField(Resitel, verbose_name='účastníci konfery', + help_text='Seznam účastníků konfery', through='Konfery_Ucastnici') + + soustredeni = models.ForeignKey(Soustredeni, verbose_name='soustředění', + related_name='konfery', on_delete = models.SET_NULL, null=True) + + TYP_VELETRH = 'veletrh' + TYP_PREZENTACE = 'prezentace' + TYP_CHOICES = [ + (TYP_VELETRH, 'Veletrh (postery)'), + (TYP_PREZENTACE, 'Prezentace (přednáška)'), + ] + typ_prezentace = models.CharField('typ prezentace', max_length=16, choices=TYP_CHOICES, + blank=False, default=TYP_VELETRH) + + prezentace = models.FileField('prezentace',help_text = 'Prezentace nebo fotka posteru', + upload_to = generate_filename_konfera, blank=True) + + materialy = models.FileField('materialy', + help_text = 'Další materiály ke konfeře zabalené do jednoho souboru', + upload_to = generate_filename_konfera, blank=True) + + def __str__(self): + return "{}: ({})".format(self.nazev, self.soustredeni) + + def cislo_node(self): + return None + + +@reversion.register(ignore_duplicates=True) +class Konfery_Ucastnici(models.Model): + + class Meta: + managed = False + db_table = 'seminar_konfery_ucastnici' + verbose_name = 'Účast na konfeře' + verbose_name_plural = 'Účasti na konfeře' + ordering = ['konfera', 'resitel'] + + # Interní ID + id = models.AutoField(primary_key = True) + + resitel = models.ForeignKey(Resitel, verbose_name='řešitel', on_delete=models.PROTECT) + + konfera = models.ForeignKey(Konfera, verbose_name='konfera', on_delete=models.CASCADE) + + poznamka = models.TextField('neveřejná poznámka', blank=True, + help_text='Neveřejná poznámka k účasti (plain text)') + + def __str__(self): + return '{} na {}'.format(self.resitel, self.konfera) + # NOTE: Poteciální DB HOG bez select_related diff --git a/split-apps-meta/create.notes b/split-apps-meta/create.notes index 8d3174e3..606f76d8 100644 --- a/split-apps-meta/create.notes +++ b/split-apps-meta/create.notes @@ -1,6 +1,7 @@ Prostě zkopírovat vedle, s původními (=správnými) related names. + (Případně opravit *všechny* relativní importy) makemigrations ! Doplnit hack kolem content-types (jako první operace při migraci) -! Doplnit ForeignKeys (TODO: jak? Já jsem je ukradl až zpětně…) +! Doplnit ForeignKeys (Vypadá to, že se dá vesměs zkopírovat předpis z models.py, jen místo prvního fieldu dát `to='app.model'. Dokonce asi funguje použít už novou aplikaci pro vazby v rámci aplikace.) doplnit závislost na unmanage migrate diff --git a/split-apps-meta/unmanage.notes b/split-apps-meta/unmanage.notes index 846b7314..bce419bf 100644 --- a/split-apps-meta/unmanage.notes +++ b/split-apps-meta/unmanage.notes @@ -16,6 +16,9 @@ vim seminar/models/whatever HINT: Add or change a related_name argument to the definition for 'seminar.Resitel.osoba' or 'seminar.Prijemce.osoba'. Snadné řešení: dočasné related names mít unikátní. Stejně to nikoho nezajímá. !! Zkontrolovat, že všechno má nastavenou db_table (jinak se to potom pokusí vybastlit jméno tabulky podle aplikace…) + Pro tip: related names nejsou součástí DB schématu, takže když se tohle opraví později (typicky při create spadne makemigrations), nevadí to a nemělo by být potřeba měnit migrace). + Pro multi-table inheritance je potřeba explicitně přidat 1to1Field s parent_link=True () + Je potřeba to udělat správně (třeba nemít FK), migrace potřeba není, protože je to stejně unmanaged… makemigrations, bez úprav migrate? From e3771f865d70835e6e84e7200399be0373908216 Mon Sep 17 00:00:00 2001 From: "Pavel \"LEdoian\" Turinsky" Date: Wed, 1 May 2024 15:37:54 +0200 Subject: [PATCH 2/4] =?UTF-8?q?Relink=20=E2=80=93=20post,=20asi=20done=3F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- galerie/migrations/0012_soustredeni_relink.py | 20 ++ .../migrations/0013_post_split_soustredeni.py | 14 ++ galerie/models.py | 2 +- .../migrations/0017_soustredeni_relink.py | 20 ++ .../migrations/0018_post_split_soustredeni.py | 14 ++ prednasky/models.py | 2 +- .../0124_remove_sous_from_seminar.py | 67 +++++ .../migrations/0125_post_split_soustredeni.py | 14 ++ seminar/models/__init__.py | 5 +- seminar/models/soustredeni.py | 231 ------------------ soustredeni/admin.py | 2 +- .../migrations/0001_split_from_seminar.py | 5 +- .../migrations/0002_manage_soustredeni.py | 34 +++ .../migrations/0003_post_split_soustredeni.py | 13 + soustredeni/models.py | 5 - split-apps-meta/create.notes | 2 + 16 files changed, 209 insertions(+), 241 deletions(-) create mode 100644 galerie/migrations/0012_soustredeni_relink.py create mode 100644 galerie/migrations/0013_post_split_soustredeni.py create mode 100644 prednasky/migrations/0017_soustredeni_relink.py create mode 100644 prednasky/migrations/0018_post_split_soustredeni.py create mode 100644 seminar/migrations/0124_remove_sous_from_seminar.py create mode 100644 seminar/migrations/0125_post_split_soustredeni.py delete mode 100644 seminar/models/soustredeni.py create mode 100644 soustredeni/migrations/0002_manage_soustredeni.py create mode 100644 soustredeni/migrations/0003_post_split_soustredeni.py diff --git a/galerie/migrations/0012_soustredeni_relink.py b/galerie/migrations/0012_soustredeni_relink.py new file mode 100644 index 00000000..0b8cbaff --- /dev/null +++ b/galerie/migrations/0012_soustredeni_relink.py @@ -0,0 +1,20 @@ +# Generated by Django 4.2.11 on 2024-05-01 13:07 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('soustredeni', '0001_split_from_seminar'), + ('galerie', '0011_pre_split_soustredeni'), + ] + + operations = [ + migrations.AlterField( + model_name='galerie', + name='soustredeni', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='soustredeni.soustredeni'), + ), + ] diff --git a/galerie/migrations/0013_post_split_soustredeni.py b/galerie/migrations/0013_post_split_soustredeni.py new file mode 100644 index 00000000..de3cfa60 --- /dev/null +++ b/galerie/migrations/0013_post_split_soustredeni.py @@ -0,0 +1,14 @@ +# Generated by Django 4.2.11 on 2024-05-01 13:35 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('galerie', '0012_soustredeni_relink'), + ('soustredeni', '0003_post_split_soustredeni'), + ] + + operations = [ + ] diff --git a/galerie/models.py b/galerie/models.py index 78551969..96225101 100644 --- a/galerie/models.py +++ b/galerie/models.py @@ -7,7 +7,7 @@ from imagekit.processors import ResizeToFit, Transpose import os -from seminar.models import Soustredeni +from soustredeni.models import Soustredeni VZDY=0 ORG=1 diff --git a/prednasky/migrations/0017_soustredeni_relink.py b/prednasky/migrations/0017_soustredeni_relink.py new file mode 100644 index 00000000..6542b51d --- /dev/null +++ b/prednasky/migrations/0017_soustredeni_relink.py @@ -0,0 +1,20 @@ +# Generated by Django 4.2.11 on 2024-05-01 13:07 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('soustredeni', '0001_split_from_seminar'), + ('prednasky', '0016_pre_split_soustredeni'), + ] + + operations = [ + migrations.AlterField( + model_name='seznam', + name='soustredeni', + field=models.ForeignKey(default=None, null=True, on_delete=django.db.models.deletion.PROTECT, to='soustredeni.soustredeni'), + ), + ] diff --git a/prednasky/migrations/0018_post_split_soustredeni.py b/prednasky/migrations/0018_post_split_soustredeni.py new file mode 100644 index 00000000..bd59819d --- /dev/null +++ b/prednasky/migrations/0018_post_split_soustredeni.py @@ -0,0 +1,14 @@ +# Generated by Django 4.2.11 on 2024-05-01 13:35 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('prednasky', '0017_soustredeni_relink'), + ('soustredeni', '0003_post_split_soustredeni'), + ] + + operations = [ + ] diff --git a/prednasky/models.py b/prednasky/models.py index 7045f4d5..54764381 100644 --- a/prednasky/models.py +++ b/prednasky/models.py @@ -2,7 +2,7 @@ from django.db import models -from seminar.models import Soustredeni +from soustredeni.models import Soustredeni from personalni.models import Organizator STAV_NAVRH = 1 diff --git a/seminar/migrations/0124_remove_sous_from_seminar.py b/seminar/migrations/0124_remove_sous_from_seminar.py new file mode 100644 index 00000000..9acc3bc4 --- /dev/null +++ b/seminar/migrations/0124_remove_sous_from_seminar.py @@ -0,0 +1,67 @@ +# Generated by Django 4.2.11 on 2024-05-01 13:13 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('seminar', '0123_soustredeni_unmanage'), + ('soustredeni', '0001_split_from_seminar'), + ('galerie', '0012_soustredeni_relink'), + ('prednasky', '0017_soustredeni_relink'), + ] + + operations = [ + migrations.RemoveField( + model_name='konfery_ucastnici', + name='konfera', + ), + migrations.RemoveField( + model_name='konfery_ucastnici', + name='resitel', + ), + migrations.RemoveField( + model_name='soustredeni', + name='organizatori', + ), + migrations.RemoveField( + model_name='soustredeni', + name='rocnik', + ), + migrations.RemoveField( + model_name='soustredeni', + name='ucastnici', + ), + migrations.RemoveField( + model_name='soustredeni_organizatori', + name='organizator', + ), + migrations.RemoveField( + model_name='soustredeni_organizatori', + name='soustredeni', + ), + migrations.RemoveField( + model_name='soustredeni_ucastnici', + name='resitel', + ), + migrations.RemoveField( + model_name='soustredeni_ucastnici', + name='soustredeni', + ), + migrations.DeleteModel( + name='Konfera', + ), + migrations.DeleteModel( + name='Konfery_Ucastnici', + ), + migrations.DeleteModel( + name='Soustredeni', + ), + migrations.DeleteModel( + name='Soustredeni_Organizatori', + ), + migrations.DeleteModel( + name='Soustredeni_Ucastnici', + ), + ] diff --git a/seminar/migrations/0125_post_split_soustredeni.py b/seminar/migrations/0125_post_split_soustredeni.py new file mode 100644 index 00000000..3d8c8c58 --- /dev/null +++ b/seminar/migrations/0125_post_split_soustredeni.py @@ -0,0 +1,14 @@ +# Generated by Django 4.2.11 on 2024-05-01 13:35 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('seminar', '0124_remove_sous_from_seminar'), + ('soustredeni', '0003_post_split_soustredeni'), + ] + + operations = [ + ] diff --git a/seminar/models/__init__.py b/seminar/models/__init__.py index e3026a2c..121aeb04 100644 --- a/seminar/models/__init__.py +++ b/seminar/models/__init__.py @@ -1,10 +1,13 @@ from .tvorba import * from .odevzdavatko import * from .base import * -from .soustredeni import * from .pomocne import * from .treenode import * from .novinky import * from various.models import Nastaveni from personalni.models import Organizator, Resitel, Skola, Prijemce, Osoba +from soustredeni.models import Soustredeni, Soustredeni_Ucastnici, Soustredeni_Organizatori, Konfera, Konfery_Ucastnici + +# Kvůli migr. 0041 +from soustredeni.models import generate_filename_konfera diff --git a/seminar/models/soustredeni.py b/seminar/models/soustredeni.py deleted file mode 100644 index 3f761444..00000000 --- a/seminar/models/soustredeni.py +++ /dev/null @@ -1,231 +0,0 @@ -# -*- coding: utf-8 -*- -import logging -import os - -from django.db import models -from django.urls import reverse -from reversion import revisions as reversion - -from django.conf import settings - -from personalni.models import Resitel, Organizator - -from .base import SeminarModelBase -from seminar.models import tvorba as am - -logger = logging.getLogger(__name__) - - -@reversion.register(ignore_duplicates=True) -class Soustredeni(SeminarModelBase): - - class Meta: - managed = False - db_table = 'seminar_soustredeni' - verbose_name = 'Soustředění' - verbose_name_plural = 'Soustředění' - ordering = ['-rocnik__rocnik', '-datum_zacatku'] - - # Interní ID - id = models.AutoField(primary_key = True) - - rocnik = models.ForeignKey(am.Rocnik, verbose_name='ročník', related_name='soustredeni_old', - on_delete=models.PROTECT) - - datum_zacatku = models.DateField('datum začátku', blank=True, null=True, - help_text='První den soustředění') - - datum_konce = models.DateField('datum konce', blank=True, null=True, - help_text='Poslední den soustředění') - - verejne_db = models.BooleanField('soustředění zveřejněno', db_column='verejne', default=False) - - misto = models.CharField('místo soustředění', max_length=256, blank=True, default='', - help_text='Místo (název obce, volitelně též objektu') - - ucastnici = models.ManyToManyField(Resitel, verbose_name='účastníci soustředění', - related_name='soustredeni_old', - help_text='Seznam účastníků soustředění', through='Soustredeni_Ucastnici') - - organizatori = models.ManyToManyField(Organizator, - related_name='soustredeni_old', - verbose_name='Organizátoři soustředění', - help_text='Seznam organizátorů soustředění', - through='Soustredeni_Organizatori') - - text = models.TextField('text k soustředění (HTML)', blank=True, default='') - - TYP_JARNI = 'jarni' - TYP_PODZIMNI = 'podzimni' - TYP_VIKEND = 'vikend' - TYP_VYLET = 'vylet' - TYP_CHOICES = [ - (TYP_JARNI, 'Jarní soustředění'), - (TYP_PODZIMNI, 'Podzimní soustředění'), - (TYP_VIKEND, 'Víkendový sraz'), - (TYP_VYLET, 'Výlet'), - ] - typ = models.CharField('typ akce', max_length=16, choices=TYP_CHOICES, blank=False, default=TYP_PODZIMNI) - - exportovat = models.BooleanField('export do AESOPa', db_column='exportovat', default=False, - help_text='Exportuje se jen podle tohoto flagu (ne veřejnosti)') - - def __str__(self): - return '{} ({})'.format(self.misto, self.datum_zacatku) - - def verejne(self): - return self.verejne_db - verejne.boolean = True - - def verejne_url(self): - #return reverse('seminar_soustredeni', kwargs={'pk': self.id}) - return reverse('seminar_seznam_soustredeni') - - -@reversion.register(ignore_duplicates=True) -class Soustredeni_Ucastnici(SeminarModelBase): -# zmena dedicnosti z models.Model na SeminarModelBase, potencialni vznik bugu - - class Meta: - managed = False - db_table = 'seminar_soustredeni_ucastnici' - verbose_name = 'Účast na soustředění' - verbose_name_plural = 'Účasti na soustředění' - ordering = ['soustredeni', 'resitel'] - - # Interní ID - id = models.AutoField(primary_key = True) - - resitel = models.ForeignKey(Resitel, verbose_name='řešitel', - related_name='sous_ucastnici', - on_delete=models.PROTECT) - - soustredeni = models.ForeignKey(Soustredeni, verbose_name='soustředění', - related_name='sous_ucastnici', - on_delete=models.PROTECT) - - poznamka = models.TextField('neveřejná poznámka', blank=True, - help_text='Neveřejná poznámka k účasti (plain text)') - - def __str__(self): - return '{} na {}'.format(self.resitel, self.soustredeni) - # NOTE: Poteciální DB HOG bez select_related - - -@reversion.register(ignore_duplicates=True) -class Soustredeni_Organizatori(SeminarModelBase): -# zmena dedicnosti z models.Model na SeminarModelBase, potencialni vznik bugu - - class Meta: - managed = False - db_table = 'seminar_soustredeni_organizatori' - verbose_name = 'Účast organizátorů na soustředění' - verbose_name_plural = 'Účasti organizátorů na soustředění' - ordering = ['soustredeni', 'organizator'] - - # Interní ID - id = models.AutoField(primary_key = True) - - organizator = models.ForeignKey(Organizator, verbose_name='organizátor', - related_name='sous_orgove', - on_delete=models.PROTECT) - - soustredeni = models.ForeignKey(Soustredeni, verbose_name='soustředění', - related_name='sous_orgove', - on_delete=models.PROTECT) - - poznamka = models.TextField('neveřejná poznámka', blank=True, - help_text='Neveřejná poznámka k účasti organizátora (plain text)') - - def __str__(self): - return '{} na {}'.format(self.organizator, self.soustredeni) - # NOTE: Poteciální DB HOG bez select_related - - -# FIXME cycle import - - -# Django neumí jednoduše serializovat partial nebo třídu s __call__ -# (https://docs.djangoproject.com/en/1.8/topics/migrations/), -# neprojdou pak migrace. Takže rozlišení funkcí generujících názvy souboru -# podle adresáře řešíme takto. - -## -def generate_filename_konfera(self, filename): - return os.path.join( - settings.SEMINAR_KONFERY_DIR, - am.aux_generate_filename(self, filename) - ) - -## - -@reversion.register(ignore_duplicates=True) -class Konfera(am.Problem): - class Meta: - managed = False - db_table = 'seminar_konfera' - verbose_name = 'Konfera' - verbose_name_plural = 'Konfery' - - problem_ptr_old = models.OneToOneField(am.Problem, parent_link=True, related_name='konfera_old', on_delete=models.PROTECT, primary_key=True) - - anotace = models.TextField('anotace', blank=True, - help_text='Popis, o čem bude konfera.') - - abstrakt = models.TextField('abstrakt', blank=True, - help_text='Abstrakt konfery tak, jak byl uveden ve sborníku') - - # FIXME: Umíme omezit jen na účastníky daného soustřeďka? - ucastnici = models.ManyToManyField(Resitel, verbose_name='účastníci konfery', - related_name='konfera_old', - help_text='Seznam účastníků konfery', through='Konfery_Ucastnici') - - soustredeni = models.ForeignKey(Soustredeni, verbose_name='soustředění', - related_name='konfery_old', on_delete = models.SET_NULL, null=True) - - TYP_VELETRH = 'veletrh' - TYP_PREZENTACE = 'prezentace' - TYP_CHOICES = [ - (TYP_VELETRH, 'Veletrh (postery)'), - (TYP_PREZENTACE, 'Prezentace (přednáška)'), - ] - typ_prezentace = models.CharField('typ prezentace', max_length=16, choices=TYP_CHOICES, - blank=False, default=TYP_VELETRH) - - prezentace = models.FileField('prezentace',help_text = 'Prezentace nebo fotka posteru', - upload_to = generate_filename_konfera, blank=True) - - materialy = models.FileField('materialy', - help_text = 'Další materiály ke konfeře zabalené do jednoho souboru', - upload_to = generate_filename_konfera, blank=True) - - def __str__(self): - return "{}: ({})".format(self.nazev, self.soustredeni) - - def cislo_node(self): - return None - - -@reversion.register(ignore_duplicates=True) -class Konfery_Ucastnici(models.Model): - - class Meta: - managed = False - db_table = 'seminar_konfery_ucastnici' - verbose_name = 'Účast na konfeře' - verbose_name_plural = 'Účasti na konfeře' - ordering = ['konfera', 'resitel'] - - # Interní ID - id = models.AutoField(primary_key = True) - - resitel = models.ForeignKey(Resitel, verbose_name='řešitel', on_delete=models.PROTECT, related_name='konf_uc') - - konfera = models.ForeignKey(Konfera, verbose_name='konfera', on_delete=models.CASCADE, related_name='konf_uc') - - poznamka = models.TextField('neveřejná poznámka', blank=True, - help_text='Neveřejná poznámka k účasti (plain text)') - - def __str__(self): - return '{} na {}'.format(self.resitel, self.konfera) - # NOTE: Poteciální DB HOG bez select_related diff --git a/soustredeni/admin.py b/soustredeni/admin.py index c6f048db..048b9ec3 100644 --- a/soustredeni/admin.py +++ b/soustredeni/admin.py @@ -2,7 +2,7 @@ from django.contrib import admin from django.forms import widgets from django.db import models -from seminar.models import soustredeni as m +import soustredeni.models as m class SoustredeniUcastniciInline(admin.TabularInline): diff --git a/soustredeni/migrations/0001_split_from_seminar.py b/soustredeni/migrations/0001_split_from_seminar.py index 745f62e7..c5e432d3 100644 --- a/soustredeni/migrations/0001_split_from_seminar.py +++ b/soustredeni/migrations/0001_split_from_seminar.py @@ -37,7 +37,8 @@ class Migration(migrations.Migration): ('typ_prezentace', models.CharField(choices=[('veletrh', 'Veletrh (postery)'), ('prezentace', 'Prezentace (přednáška)')], default='veletrh', max_length=16, verbose_name='typ prezentace')), ('prezentace', models.FileField(blank=True, help_text='Prezentace nebo fotka posteru', upload_to=soustredeni.models.generate_filename_konfera, verbose_name='prezentace')), ('materialy', models.FileField(blank=True, help_text='Další materiály ke konfeře zabalené do jednoho souboru', upload_to=soustredeni.models.generate_filename_konfera, verbose_name='materialy')), - ('soustredeni', models.ForeignKey(to='soustredeni.soustredeni', verbose_name='soustředění', on_delete=models.PROTECT)), + ('soustredeni', models.ForeignKey(to='soustredeni.soustredeni', verbose_name='soustředění', on_delete=models.SET_NULL, null=True, related_name='konfery')), + ('ucastnici', models.ManyToManyField(help_text='Seznam účastníků konfery', through='soustredeni.Konfery_Ucastnici', to='personalni.resitel', verbose_name='účastníci konfery')), ], options={ 'verbose_name': 'Konfera', @@ -75,6 +76,8 @@ class Migration(migrations.Migration): ('typ', models.CharField(choices=[('jarni', 'Jarní soustředění'), ('podzimni', 'Podzimní soustředění'), ('vikend', 'Víkendový sraz'), ('vylet', 'Výlet')], default='podzimni', max_length=16, verbose_name='typ akce')), ('exportovat', models.BooleanField(db_column='exportovat', default=False, help_text='Exportuje se jen podle tohoto flagu (ne veřejnosti)', verbose_name='export do AESOPa')), ('rocnik', models.ForeignKey(to='seminar.rocnik', verbose_name='ročník', related_name='soustredeni', on_delete=models.PROTECT)), + ('organizatori', models.ManyToManyField(help_text='Seznam organizátorů soustředění', through='soustredeni.Soustredeni_Organizatori', to='personalni.organizator', verbose_name='Organizátoři soustředění')), + ('ucastnici', models.ManyToManyField(help_text='Seznam účastníků soustředění', through='soustredeni.Soustredeni_Ucastnici', to='personalni.resitel', verbose_name='účastníci soustředění')), ], options={ 'verbose_name': 'Soustředění', diff --git a/soustredeni/migrations/0002_manage_soustredeni.py b/soustredeni/migrations/0002_manage_soustredeni.py new file mode 100644 index 00000000..1a535eb0 --- /dev/null +++ b/soustredeni/migrations/0002_manage_soustredeni.py @@ -0,0 +1,34 @@ +# Generated by Django 4.2.11 on 2024-05-01 13:18 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('soustredeni', '0001_split_from_seminar'), + ('seminar', '0124_remove_sous_from_seminar'), + ] + + operations = [ + migrations.AlterModelOptions( + name='konfera', + options={'verbose_name': 'Konfera', 'verbose_name_plural': 'Konfery'}, + ), + migrations.AlterModelOptions( + name='konfery_ucastnici', + options={'ordering': ['konfera', 'resitel'], 'verbose_name': 'Účast na konfeře', 'verbose_name_plural': 'Účasti na konfeře'}, + ), + migrations.AlterModelOptions( + name='soustredeni', + options={'ordering': ['-rocnik__rocnik', '-datum_zacatku'], 'verbose_name': 'Soustředění', 'verbose_name_plural': 'Soustředění'}, + ), + migrations.AlterModelOptions( + name='soustredeni_organizatori', + options={'ordering': ['soustredeni', 'organizator'], 'verbose_name': 'Účast organizátorů na soustředění', 'verbose_name_plural': 'Účasti organizátorů na soustředění'}, + ), + migrations.AlterModelOptions( + name='soustredeni_ucastnici', + options={'ordering': ['soustredeni', 'resitel'], 'verbose_name': 'Účast na soustředění', 'verbose_name_plural': 'Účasti na soustředění'}, + ), + ] diff --git a/soustredeni/migrations/0003_post_split_soustredeni.py b/soustredeni/migrations/0003_post_split_soustredeni.py new file mode 100644 index 00000000..ad1821ee --- /dev/null +++ b/soustredeni/migrations/0003_post_split_soustredeni.py @@ -0,0 +1,13 @@ +# Generated by Django 4.2.11 on 2024-05-01 13:35 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('soustredeni', '0002_manage_soustredeni'), + ] + + operations = [ + ] diff --git a/soustredeni/models.py b/soustredeni/models.py index 4429e2bf..78582565 100644 --- a/soustredeni/models.py +++ b/soustredeni/models.py @@ -20,7 +20,6 @@ logger = logging.getLogger(__name__) class Soustredeni(SeminarModelBase): class Meta: - managed = False db_table = 'seminar_soustredeni' verbose_name = 'Soustředění' verbose_name_plural = 'Soustředění' @@ -85,7 +84,6 @@ class Soustredeni_Ucastnici(SeminarModelBase): # zmena dedicnosti z models.Model na SeminarModelBase, potencialni vznik bugu class Meta: - managed = False db_table = 'seminar_soustredeni_ucastnici' verbose_name = 'Účast na soustředění' verbose_name_plural = 'Účasti na soustředění' @@ -112,7 +110,6 @@ class Soustredeni_Organizatori(SeminarModelBase): # zmena dedicnosti z models.Model na SeminarModelBase, potencialni vznik bugu class Meta: - managed = False db_table = 'seminar_soustredeni_organizatori' verbose_name = 'Účast organizátorů na soustředění' verbose_name_plural = 'Účasti organizátorů na soustředění' @@ -155,7 +152,6 @@ def generate_filename_konfera(self, filename): @reversion.register(ignore_duplicates=True) class Konfera(am.Problem): class Meta: - managed = False db_table = 'seminar_konfera' verbose_name = 'Konfera' verbose_name_plural = 'Konfery' @@ -200,7 +196,6 @@ class Konfera(am.Problem): class Konfery_Ucastnici(models.Model): class Meta: - managed = False db_table = 'seminar_konfery_ucastnici' verbose_name = 'Účast na konfeře' verbose_name_plural = 'Účasti na konfeře' diff --git a/split-apps-meta/create.notes b/split-apps-meta/create.notes index 606f76d8..a48a17f8 100644 --- a/split-apps-meta/create.notes +++ b/split-apps-meta/create.notes @@ -3,5 +3,7 @@ Prostě zkopírovat vedle, s původními (=správnými) related names. makemigrations ! Doplnit hack kolem content-types (jako první operace při migraci) ! Doplnit ForeignKeys (Vypadá to, že se dá vesměs zkopírovat předpis z models.py, jen místo prvního fieldu dát `to='app.model'. Dokonce asi funguje použít už novou aplikaci pro vazby v rámci aplikace.) + To samé s ManyToManyFieldy (through= musí taky být 'app.model') +(Zdá se, že jde dobastlit tuhle migraci polozpětně – doplnit co chybělo až podle toho, co vygeneruje migrace po zamanagování nového modelu.) doplnit závislost na unmanage migrate From 8c4bf4d19a99980e3e3430c26bc759d18a9df8d8 Mon Sep 17 00:00:00 2001 From: "Pavel \"LEdoian\" Turinsky" Date: Wed, 1 May 2024 15:48:33 +0200 Subject: [PATCH 3/4] =?UTF-8?q?Oprava=20jmen=20model=C5=AF=20v=20org=20pr?= =?UTF-8?q?=C3=A1vech?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- deploy_v2/admin_org_prava.json | 70 +++++++++++++++++----------------- 1 file changed, 35 insertions(+), 35 deletions(-) diff --git a/deploy_v2/admin_org_prava.json b/deploy_v2/admin_org_prava.json index 3ef169a5..01de7476 100644 --- a/deploy_v2/admin_org_prava.json +++ b/deploy_v2/admin_org_prava.json @@ -271,42 +271,42 @@ }, { "codename": "add_konfera", - "ct_app_label": "seminar", + "ct_app_label": "soustredeni", "ct_model": "konfera" }, { "codename": "change_konfera", - "ct_app_label": "seminar", + "ct_app_label": "soustredeni", "ct_model": "konfera" }, { "codename": "delete_konfera", - "ct_app_label": "seminar", + "ct_app_label": "soustredeni", "ct_model": "konfera" }, { "codename": "view_konfera", - "ct_app_label": "seminar", + "ct_app_label": "soustredeni", "ct_model": "konfera" }, { "codename": "add_konfery_ucastnici", - "ct_app_label": "seminar", + "ct_app_label": "soustredeni", "ct_model": "konfery_ucastnici" }, { "codename": "change_konfery_ucastnici", - "ct_app_label": "seminar", + "ct_app_label": "soustredeni", "ct_model": "konfery_ucastnici" }, { "codename": "delete_konfery_ucastnici", - "ct_app_label": "seminar", + "ct_app_label": "soustredeni", "ct_model": "konfery_ucastnici" }, { "codename": "view_konfery_ucastnici", - "ct_app_label": "seminar", + "ct_app_label": "soustredeni", "ct_model": "konfery_ucastnici" }, { @@ -351,22 +351,22 @@ }, { "codename": "change_organizator", - "ct_app_label": "seminar", + "ct_app_label": "personalni", "ct_model": "organizator" }, { "codename": "view_organizator", - "ct_app_label": "seminar", + "ct_app_label": "personalni", "ct_model": "organizator" }, { "codename": "change_osoba", - "ct_app_label": "seminar", + "ct_app_label": "personalni", "ct_model": "osoba" }, { "codename": "view_osoba", - "ct_app_label": "seminar", + "ct_app_label": "personalni", "ct_model": "osoba" }, { @@ -391,22 +391,22 @@ }, { "codename": "add_prijemce", - "ct_app_label": "seminar", + "ct_app_label": "personalni", "ct_model": "prijemce" }, { "codename": "change_prijemce", - "ct_app_label": "seminar", + "ct_app_label": "personalni", "ct_model": "prijemce" }, { "codename": "delete_prijemce", - "ct_app_label": "seminar", + "ct_app_label": "personalni", "ct_model": "prijemce" }, { "codename": "view_prijemce", - "ct_app_label": "seminar", + "ct_app_label": "personalni", "ct_model": "prijemce" }, { @@ -431,12 +431,12 @@ }, { "codename": "change_resitel", - "ct_app_label": "seminar", + "ct_app_label": "personalni", "ct_model": "resitel" }, { "codename": "view_resitel", - "ct_app_label": "seminar", + "ct_app_label": "personalni", "ct_model": "resitel" }, { @@ -461,82 +461,82 @@ }, { "codename": "add_skola", - "ct_app_label": "seminar", + "ct_app_label": "personalni", "ct_model": "skola" }, { "codename": "change_skola", - "ct_app_label": "seminar", + "ct_app_label": "personalni", "ct_model": "skola" }, { "codename": "delete_skola", - "ct_app_label": "seminar", + "ct_app_label": "personalni", "ct_model": "skola" }, { "codename": "view_skola", - "ct_app_label": "seminar", + "ct_app_label": "personalni", "ct_model": "skola" }, { "codename": "add_soustredeni", - "ct_app_label": "seminar", + "ct_app_label": "soustredeni", "ct_model": "soustredeni" }, { "codename": "change_soustredeni", - "ct_app_label": "seminar", + "ct_app_label": "soustredeni", "ct_model": "soustredeni" }, { "codename": "delete_soustredeni", - "ct_app_label": "seminar", + "ct_app_label": "soustredeni", "ct_model": "soustredeni" }, { "codename": "view_soustredeni", - "ct_app_label": "seminar", + "ct_app_label": "soustredeni", "ct_model": "soustredeni" }, { "codename": "add_soustredeni_organizatori", - "ct_app_label": "seminar", + "ct_app_label": "soustredeni", "ct_model": "soustredeni_organizatori" }, { "codename": "change_soustredeni_organizatori", - "ct_app_label": "seminar", + "ct_app_label": "soustredeni", "ct_model": "soustredeni_organizatori" }, { "codename": "delete_soustredeni_organizatori", - "ct_app_label": "seminar", + "ct_app_label": "soustredeni", "ct_model": "soustredeni_organizatori" }, { "codename": "view_soustredeni_organizatori", - "ct_app_label": "seminar", + "ct_app_label": "soustredeni", "ct_model": "soustredeni_organizatori" }, { "codename": "add_soustredeni_ucastnici", - "ct_app_label": "seminar", + "ct_app_label": "soustredeni", "ct_model": "soustredeni_ucastnici" }, { "codename": "change_soustredeni_ucastnici", - "ct_app_label": "seminar", + "ct_app_label": "soustredeni", "ct_model": "soustredeni_ucastnici" }, { "codename": "delete_soustredeni_ucastnici", - "ct_app_label": "seminar", + "ct_app_label": "soustredeni", "ct_model": "soustredeni_ucastnici" }, { "codename": "view_soustredeni_ucastnici", - "ct_app_label": "seminar", + "ct_app_label": "soustredeni", "ct_model": "soustredeni_ucastnici" }, { @@ -619,4 +619,4 @@ "ct_app_label": "taggit", "ct_model": "taggeditem" } -] \ No newline at end of file +] From 6c59c3c2ed1169b0e3e3c5d421a7eec043adf873 Mon Sep 17 00:00:00 2001 From: "Pavel \"LEdoian\" Turinsky" Date: Wed, 1 May 2024 16:31:54 +0200 Subject: [PATCH 4/4] =?UTF-8?q?Oprava=20jmen=20model=C5=AF=20po=20odst?= =?UTF-8?q?=C5=99elu=20nastaven=C3=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- deploy_v2/admin_org_prava.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/deploy_v2/admin_org_prava.json b/deploy_v2/admin_org_prava.json index 01de7476..9caa6eb2 100644 --- a/deploy_v2/admin_org_prava.json +++ b/deploy_v2/admin_org_prava.json @@ -311,22 +311,22 @@ }, { "codename": "add_nastaveni", - "ct_app_label": "seminar", + "ct_app_label": "various", "ct_model": "nastaveni" }, { "codename": "change_nastaveni", - "ct_app_label": "seminar", + "ct_app_label": "various", "ct_model": "nastaveni" }, { "codename": "delete_nastaveni", - "ct_app_label": "seminar", + "ct_app_label": "various", "ct_model": "nastaveni" }, { "codename": "view_nastaveni", - "ct_app_label": "seminar", + "ct_app_label": "various", "ct_model": "nastaveni" }, {