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 %}
+