diff --git a/fet2020/fet2020/utils.py b/fet2020/fet2020/utils.py index 9e9ba755..abea0648 100644 --- a/fet2020/fet2020/utils.py +++ b/fet2020/fet2020/utils.py @@ -26,4 +26,4 @@ def add_log_action(request, form, app_label, model, add=True): ) def create_random_id(): - return str(uuid.uuid4())[:36] + return str(uuid.uuid4())[:8] diff --git a/fet2020/intern/migrations/0001_initial.py b/fet2020/intern/migrations/0001_initial.py index 8b161129..8f15595b 100644 --- a/fet2020/intern/migrations/0001_initial.py +++ b/fet2020/intern/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 4.0.6 on 2022-07-30 22:34 +# Generated by Django 4.1.2 on 2022-12-21 11:42 import datetime from django.db import migrations, models @@ -11,106 +11,219 @@ class Migration(migrations.Migration): initial = True dependencies = [ - ('tasks', '0002_alter_task_options_task_slug_task_slug_id_and_more'), + ("tasks", "0004_set_fields_unique"), ] operations = [ migrations.CreateModel( - name='Attachment', + name="Attachment", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('title', models.CharField(max_length=128, verbose_name='Titel')), - ('slug', models.SlugField()), - ('description', models.TextField(blank=True, null=True)), + ( + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("title", models.CharField(max_length=128, verbose_name="Titel")), + ("slug", models.SlugField()), + ("description", models.TextField(blank=True, null=True)), ], options={ - 'verbose_name': 'Anhang Ordner', - 'verbose_name_plural': 'Anhang Ordner', + "verbose_name": "Anhang Ordner", + "verbose_name_plural": "Anhang Ordner", }, ), migrations.CreateModel( - name='TopicGroup', + name="TopicGroup", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('title', models.CharField(max_length=128, verbose_name='Titel')), - ('shortterm', models.CharField(blank=True, max_length=128, unique=True)), - ('slug', models.SlugField(unique=True)), - ('short_description', models.TextField(blank=True, null=True)), - ('order', models.PositiveSmallIntegerField(blank=True, null=True, unique=True, verbose_name='Reihenfolge')), + ( + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("title", models.CharField(max_length=128, verbose_name="Titel")), + ( + "shortterm", + models.CharField(blank=True, max_length=128, unique=True), + ), + ("slug", models.SlugField(unique=True)), + ("short_description", models.TextField(blank=True, null=True)), + ( + "order", + models.PositiveSmallIntegerField( + blank=True, null=True, unique=True, verbose_name="Reihenfolge" + ), + ), ], options={ - 'verbose_name': 'Themenbereich', - 'verbose_name_plural': 'Themenbereiche', + "verbose_name": "Themenbereich", + "verbose_name_plural": "Themenbereiche", }, ), migrations.CreateModel( - name='Topic', + name="Topic", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('title', models.CharField(max_length=128, verbose_name='Titel')), - ('slug', models.SlugField()), - ('archive', models.BooleanField(default=False, verbose_name='Archiv')), - ('description', models.TextField(blank=True, null=True)), - ('task_list', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='tasks.tasklist')), - ('topic_group', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='intern.topicgroup', verbose_name='Themenbereich')), + ( + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("title", models.CharField(max_length=128, verbose_name="Titel")), + ("slug", models.SlugField()), + ("archive", models.BooleanField(default=False, verbose_name="Archiv")), + ("description", models.TextField(blank=True, null=True)), + ( + "task_list", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.CASCADE, + to="tasks.tasklist", + ), + ), + ( + "topic_group", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + to="intern.topicgroup", + verbose_name="Themenbereich", + ), + ), ], options={ - 'verbose_name': 'Thema', - 'verbose_name_plural': 'Themen', + "verbose_name": "Thema", + "verbose_name_plural": "Themen", }, ), migrations.CreateModel( - name='FileUpload', + name="FileUpload", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('title', models.CharField(blank=True, max_length=128, verbose_name='Titel')), - ('file_field', models.FileField(upload_to='uploads/intern/files/', verbose_name='Dokument')), - ('date', models.DateField(default=datetime.date.today, verbose_name='Datum')), - ('attachment', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='intern.attachment', verbose_name='Anhang Ordner')), + ( + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "title", + models.CharField(blank=True, max_length=128, verbose_name="Titel"), + ), + ( + "file_field", + models.FileField( + upload_to="uploads/intern/files/", verbose_name="Dokument" + ), + ), + ( + "date", + models.DateField(default=datetime.date.today, verbose_name="Datum"), + ), + ( + "attachment", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + to="intern.attachment", + verbose_name="Anhang Ordner", + ), + ), ], options={ - 'verbose_name': 'Datei', - 'verbose_name_plural': 'Dateien', + "verbose_name": "Datei", + "verbose_name_plural": "Dateien", }, ), migrations.CreateModel( - name='Etherpad', + name="Etherpad", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('title', models.CharField(max_length=128, verbose_name='Titel')), - ('slug_id', models.CharField(default=fet2020.utils.create_random_id, editable=False, max_length=8, unique=True)), - ('etherpad_key', models.CharField(blank=True, max_length=50)), - ('date', models.DateField(default=datetime.date.today, verbose_name='Datum')), - ('attachment', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='intern.attachment', verbose_name='Anhang Ordner')), + ( + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("title", models.CharField(max_length=128, verbose_name="Titel")), + ( + "slug_id", + models.CharField( + default=fet2020.utils.create_random_id, + editable=False, + max_length=8, + unique=True, + ), + ), + ("etherpad_key", models.CharField(blank=True, max_length=50)), + ( + "date", + models.DateField(default=datetime.date.today, verbose_name="Datum"), + ), + ( + "attachment", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + to="intern.attachment", + verbose_name="Anhang Ordner", + ), + ), ], options={ - 'verbose_name': 'Etherpad', - 'verbose_name_plural': 'Etherpads', + "verbose_name": "Etherpad", + "verbose_name_plural": "Etherpads", }, ), migrations.AddField( - model_name='attachment', - name='topic', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='intern.topic', verbose_name='Thema'), + model_name="attachment", + name="topic", + field=models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + to="intern.topic", + verbose_name="Thema", + ), ), migrations.AddConstraint( - model_name='topic', - constraint=models.UniqueConstraint(fields=('slug', 'topic_group'), name='unique_intern_slug_topic_group'), + model_name="topic", + constraint=models.UniqueConstraint( + fields=("slug", "topic_group"), name="unique_intern_slug_topic_group" + ), ), migrations.AddConstraint( - model_name='topic', - constraint=models.UniqueConstraint(fields=('title', 'topic_group'), name='unique_intern_title_topic_group'), + model_name="topic", + constraint=models.UniqueConstraint( + fields=("title", "topic_group"), name="unique_intern_title_topic_group" + ), ), migrations.AddConstraint( - model_name='etherpad', - constraint=models.UniqueConstraint(fields=('title', 'date', 'attachment'), name='unique_intern_etherpad'), + model_name="etherpad", + constraint=models.UniqueConstraint( + fields=("title", "date", "attachment"), name="unique_intern_etherpad" + ), ), migrations.AddConstraint( - model_name='attachment', - constraint=models.UniqueConstraint(fields=('slug', 'topic'), name='unique_intern_slug_topic'), + model_name="attachment", + constraint=models.UniqueConstraint( + fields=("slug", "topic"), name="unique_intern_slug_topic" + ), ), migrations.AddConstraint( - model_name='attachment', - constraint=models.UniqueConstraint(fields=('title', 'topic'), name='unique_intern_title_topic'), + model_name="attachment", + constraint=models.UniqueConstraint( + fields=("title", "topic"), name="unique_intern_title_topic" + ), ), ] diff --git a/fet2020/tasks/migrations/0002_alter_task_options_task_slug_task_slug_id_and_more.py b/fet2020/tasks/migrations/0002_alter_task_options_task_slug_task_slug_id_and_more.py index f1b5c8c2..9853d159 100644 --- a/fet2020/tasks/migrations/0002_alter_task_options_task_slug_task_slug_id_and_more.py +++ b/fet2020/tasks/migrations/0002_alter_task_options_task_slug_task_slug_id_and_more.py @@ -1,117 +1,103 @@ -# Generated by Django 4.0.6 on 2022-07-30 10:47 +# Generated by Django 4.1.2 on 2022-12-21 11:42 import datetime -import logging - -import fet2020.utils -import uuid from django.db import migrations, models import django.db.models.deletion -import django.db.models.expressions -from django.utils.text import slugify -import time -logger = logging.getLogger(__name__) - - -def forwards_func(apps, schema_editor): - Tasks = apps.get_model("tasks", "Task") - past_ids=[] - for elem in Tasks.objects.all(): - for i in range(4): - sid = fet2020.utils.create_random_id() - if not sid in past_ids: break - time.sleep(0.1) - elem.slug_id = sid - elem.slug = elem.slug_id + "-" + slugify(elem.title) - past_ids.append(sid) - - logger.info(f"Task: {elem}") - logger.info(f"Slug ID: {elem.slug_id}") - logger.info(f"Slug: {elem.slug}") - - elem.save() - - TaskLists = apps.get_model("tasks", "TaskList") - for elem in TaskLists.objects.all(): - elem.shortterm = slugify(elem.name) - elem.slug = slugify(elem.shortterm) - elem.save() +import fet2020.utils class Migration(migrations.Migration): dependencies = [ - ('tasks', '0001_initial'), + ("tasks", "0001_initial"), ] operations = [ migrations.AlterModelOptions( - name='task', - options={'ordering': ('task_list', django.db.models.expressions.OrderBy(django.db.models.expressions.F('due_date'), descending=True, nulls_first=True)), 'verbose_name': 'Aufgabe', 'verbose_name_plural': 'Aufgaben'}, - ), - # remove unique=True to set value, and then set option unique=True - migrations.AddField( - model_name='task', - name='slug', - field=models.SlugField(blank=True), - ), - # remove unique=True to set value, and then set option unique=True - migrations.AddField( - model_name='task', - name='slug_id', - field=models.CharField(default=fet2020.utils.create_random_id, editable=False, max_length=36), - ), - # remove unique=True to set value, and then set option unique=True - migrations.AddField( - model_name='tasklist', - name='shortterm', - field=models.CharField(blank=True, max_length=128), - ), - migrations.AlterField( - model_name='task', - name='title', - field=models.CharField(max_length=128, verbose_name='Titel'), - ), - migrations.AlterField( - model_name='tasklist', - name='name', - field=models.CharField(max_length=128), - ), - migrations.CreateModel( - name='Document', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('title', models.CharField(max_length=128, verbose_name='Titel')), - ('slug_id', models.CharField(default=fet2020.utils.create_random_id, editable=False, max_length=8, unique=True)), - ('etherpad_key', models.CharField(blank=True, max_length=50)), - ('date', models.DateField(default=datetime.date.today, verbose_name='Datum')), - ('task', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='tasks.task')), - ], + name="task", options={ - 'verbose_name': 'Dokument', - 'verbose_name_plural': 'Dokumente', + "ordering": ( + "task_list", + models.OrderBy( + models.F("due_date"), descending=True, nulls_first=True + ), + ), + "verbose_name": "Aufgabe", + "verbose_name_plural": "Aufgaben", }, ), - migrations.RunPython(forwards_func), - # unique=True after setting value - migrations.AlterField( - model_name='task', - name='slug', - field=models.SlugField(blank=True, unique=True), + migrations.AddField( + model_name="task", + name="slug", + field=models.SlugField(blank=True, null=True), + ), + migrations.AddField( + model_name="task", + name="slug_id", + field=models.CharField( + default=fet2020.utils.create_random_id, + editable=False, + max_length=8, + null=True, + ), + ), + migrations.AddField( + model_name="tasklist", + name="shortterm", + field=models.CharField(blank=True, max_length=128, null=True), ), migrations.AlterField( - model_name='task', - name='slug_id', - field=models.CharField(default=fet2020.utils.create_random_id, editable=False, max_length=36, unique=True), + model_name="task", + name="title", + field=models.CharField(max_length=128, verbose_name="Titel"), ), migrations.AlterField( - model_name='tasklist', - name='shortterm', - field=models.CharField(blank=True, max_length=128, unique=True), + model_name="tasklist", + name="name", + field=models.CharField(max_length=128), ), migrations.AlterField( - model_name='tasklist', - name='slug', - field=models.SlugField(blank=True, unique=True), + model_name="tasklist", + name="slug", + field=models.SlugField(blank=True, null=True), + ), + migrations.CreateModel( + name="Document", + fields=[ + ( + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("title", models.CharField(max_length=128, verbose_name="Titel")), + ( + "slug_id", + models.CharField( + default=fet2020.utils.create_random_id, + editable=False, + max_length=8, + unique=True, + ), + ), + ("etherpad_key", models.CharField(blank=True, max_length=50)), + ( + "date", + models.DateField(default=datetime.date.today, verbose_name="Datum"), + ), + ( + "task", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, to="tasks.task" + ), + ), + ], + options={ + "verbose_name": "Dokument", + "verbose_name_plural": "Dokumente", + }, ), ] diff --git a/fet2020/tasks/migrations/0003_populate_unique_values.py b/fet2020/tasks/migrations/0003_populate_unique_values.py new file mode 100644 index 00000000..503cd202 --- /dev/null +++ b/fet2020/tasks/migrations/0003_populate_unique_values.py @@ -0,0 +1,29 @@ +# Generated by Django 4.1.2 on 2022-12-21 11:43 + +from django.db import migrations +import fet2020.utils + + +def forwards_func(apps, schema_editor): + Tasks = apps.get_model("tasks", "Task") + for elem in Tasks.objects.all(): + elem.slug_id = fet2020.utils.create_random_id() + elem.slug = elem.slug_id + "-" + slugify(elem.title) + elem.save(update_fields=["slug_id", "slug"]) + + TaskLists = apps.get_model("tasks", "TaskList") + for elem in TaskLists.objects.all(): + elem.shortterm = slugify(elem.name) + elem.slug = slugify(elem.shortterm) + elem.save(update_fields=["shortterm", "slug"]) + + +class Migration(migrations.Migration): + + dependencies = [ + ("tasks", "0002_alter_task_options_task_slug_task_slug_id_and_more"), + ] + + operations = [ + migrations.RunPython(forwards_func, reverse_code=migrations.RunPython.noop), + ] diff --git a/fet2020/tasks/migrations/0004_set_fields_unique.py b/fet2020/tasks/migrations/0004_set_fields_unique.py new file mode 100644 index 00000000..bdfe32b6 --- /dev/null +++ b/fet2020/tasks/migrations/0004_set_fields_unique.py @@ -0,0 +1,39 @@ +# Generated by Django 4.1.2 on 2022-12-21 11:43 + +from django.db import migrations, models +import fet2020.utils + + +class Migration(migrations.Migration): + + dependencies = [ + ("tasks", "0003_populate_unique_values"), + ] + + operations = [ + migrations.AlterField( + model_name="task", + name="slug", + field=models.SlugField(blank=True, unique=True), + ), + migrations.AlterField( + model_name="task", + name="slug_id", + field=models.CharField( + default=fet2020.utils.create_random_id, + editable=False, + max_length=8, + unique=True, + ), + ), + migrations.AlterField( + model_name="tasklist", + name="shortterm", + field=models.CharField(blank=True, max_length=128, unique=True), + ), + migrations.AlterField( + model_name="tasklist", + name="slug", + field=models.SlugField(blank=True, unique=True), + ), + ]