diff --git a/korektury/admin.py b/korektury/admin.py index 61c06f1b..aad8fd20 100644 --- a/korektury/admin.py +++ b/korektury/admin.py @@ -1,6 +1,6 @@ from django.contrib import admin from reversion.admin import VersionAdmin -from korektury.models import KorekturovanePDF, Oprava +from korektury.models import KorekturovanePDF, Oprava, KorekturaTag from django.core.mail import EmailMessage from django.urls import reverse @@ -66,6 +66,7 @@ admin.site.register(KorekturovanePDF, KorekturovanePDFAdmin) class OpravaAdmin(admin.ModelAdmin): model = Oprava - filter_horizontal = ("informovani_orgove", ) + filter_horizontal = ("informovani_orgove", "tagy",) admin.site.register(Oprava, OpravaAdmin) +admin.site.register(KorekturaTag) diff --git a/korektury/api/views.py b/korektury/api/views.py index bb184a81..86d14c71 100644 --- a/korektury/api/views.py +++ b/korektury/api/views.py @@ -6,7 +6,7 @@ from django.views.decorators.csrf import csrf_exempt from rest_framework import serializers from korektury.utils import send_email_notification_komentar -from korektury.models import Oprava, KorekturovanePDF, Komentar +from korektury.models import Oprava, KorekturovanePDF, Komentar, KorekturaTag from personalni.models import Organizator, Osoba @@ -45,6 +45,12 @@ class KomentarSerializer(serializers.ModelSerializer): ret["text"] = linebreaks(ret["text"], autoescape=True) # Autora není třeba escapovat, ten se vkládá jako text. return ret +class KorekturaTagSerializer(serializers.ModelSerializer): + class Meta: + model = KorekturaTag + fields = '__all__' + + class OpravaSerializer(serializers.ModelSerializer): class Meta: model = Oprava @@ -53,6 +59,7 @@ class OpravaSerializer(serializers.ModelSerializer): def to_representation(self, instance): ret = super().to_representation(instance) ret["komentare"] = [KomentarSerializer(komentar).data for komentar in instance.komentar_set.all()] + ret["tagy"] = [KorekturaTagSerializer(tag).data for tag in instance.tagy.all()] return ret # komentar_set = serializers.ListField(child=KomentarSerializer()) @@ -82,6 +89,7 @@ def opravy_a_komentare_view(request, pdf_id: int, **kwargs): if oprava_id != -1: oprava = get_object_or_404(Oprava, id=oprava_id) else: + tagy = list(map(int, q.get('tagy').split(","))) pdf = get_object_or_404(KorekturovanePDF, id=pdf_id) oprava = Oprava.objects.create( pdf=pdf, @@ -89,6 +97,7 @@ def opravy_a_komentare_view(request, pdf_id: int, **kwargs): x=x, y=y, ) + oprava.tagy.add(*KorekturaTag.objects.filter(id__in=tagy)) Komentar.objects.create(oprava=oprava, autor=autor, text=text) diff --git a/korektury/migrations/0027_korekturatag_oprava_tagy.py b/korektury/migrations/0027_korekturatag_oprava_tagy.py new file mode 100644 index 00000000..c5445957 --- /dev/null +++ b/korektury/migrations/0027_korekturatag_oprava_tagy.py @@ -0,0 +1,27 @@ +# Generated by Django 4.2.16 on 2025-02-11 16:07 + +import colorfield.fields +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('korektury', '0026_oprava_informovani_orgove'), + ] + + operations = [ + migrations.CreateModel( + name='KorekturaTag', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('nazev', models.CharField(help_text='Název daného tagu, <20 znaků', max_length=20, verbose_name='název tagu')), + ('barva', colorfield.fields.ColorField(default='#FFFFFF', image_field=None, max_length=25, samples=None, verbose_name='barva daného tagu')), + ], + ), + migrations.AddField( + model_name='oprava', + name='tagy', + field=models.ManyToManyField(blank=True, default=None, to='korektury.korekturatag'), + ), + ] diff --git a/korektury/models.py b/korektury/models.py index c5de1a7b..6da05b64 100644 --- a/korektury/models.py +++ b/korektury/models.py @@ -1,4 +1,7 @@ import os + +from colorfield.fields import ColorField + from django.db import models from django.urls import reverse from django.utils import timezone @@ -131,6 +134,14 @@ class KorekturovanePDF(models.Model): return reverse('korektury', kwargs={'pdf': self.id}) +class KorekturaTag(models.Model): + nazev = models.CharField("název tagu", blank = False, max_length=20, help_text="Název daného tagu, <20 znaků") + barva = ColorField("barva daného tagu", default="#FFFFFF") + + def __str__(self): + return self.nazev + + @reversion.register(ignore_duplicates=True) class Oprava(models.Model): class Meta: @@ -164,6 +175,8 @@ class Oprava(models.Model): related_name='informovan_o_opravach', ) + tagy = models.ManyToManyField(KorekturaTag, blank=True, default=None,) + @reversion.register(ignore_duplicates=True) class Komentar(models.Model): diff --git a/korektury/static/korektury/opraf.css b/korektury/static/korektury/opraf.css index 184f060d..bdc8aa83 100644 --- a/korektury/static/korektury/opraf.css +++ b/korektury/static/korektury/opraf.css @@ -137,6 +137,14 @@ form { opacity: 80%; } +.korektury-tag { + border-radius: 5px; + margin: 2px; + padding: 2px; + + &[data-selected="false"] { opacity: 0.5; } +} + /**** ROZLIŠENÍ MEZI LOKÁLNÍM, TESTOVACÍM A PRODUKČNÍM WEBEM ****/ body.localweb, body.testweb, body.suprodweb { diff --git a/korektury/templates/korektury/korekturovatko/__edit_komentar.html b/korektury/templates/korektury/korekturovatko/__edit_komentar.html index 4c07c3aa..b1913bfb 100644 --- a/korektury/templates/korektury/korekturovatko/__edit_komentar.html +++ b/korektury/templates/korektury/korekturovatko/__edit_komentar.html @@ -5,6 +5,11 @@

+ + {% for tag in tagy %} + + {% endfor %} +