From f32c1f8d11bde4e79f1a440150bf08a92dc69189 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Valenta?= <git@imaniti.org>
Date: Sun, 16 Apr 2023 09:39:12 +0200
Subject: [PATCH] alter contract types

---
 contracts/admin.py                            |  5 +++--
 contracts/forms.py                            | 17 +++++++++++++++++
 ...tracteesignaturerepresentative_function.py | 19 +++++++++++++++++++
 .../0046_alter_contract_paper_form_state.py   | 18 ++++++++++++++++++
 contracts/models.py                           | 11 +++++++----
 package-lock.json                             |  2 +-
 package.json                                  |  2 +-
 7 files changed, 66 insertions(+), 8 deletions(-)
 create mode 100644 contracts/migrations/0045_alter_contracteesignaturerepresentative_function.py
 create mode 100644 contracts/migrations/0046_alter_contract_paper_form_state.py

diff --git a/contracts/admin.py b/contracts/admin.py
index 558993c..b2c9725 100644
--- a/contracts/admin.py
+++ b/contracts/admin.py
@@ -10,7 +10,7 @@ from rangefilter.filters import DateRangeFilter
 
 from shared.admin import FieldsetInlineOrder, MarkdownxGuardedModelAdmin
 
-from .forms import ContractAdminForm, ContractFileAdminForm, SigneeAdminForm
+from .forms import ContractAdminForm, ContractFileAdminForm, SigneeAdminForm, AtLeastOneRequiredInlineFormSet
 from .models import (
     Contract,
     Contractee,
@@ -111,7 +111,8 @@ class ContractFileAdmin(
 
 class ContracteeSignatureRepresentativeInline(NestedStackedInline):
     model = ContracteeSignatureRepresentative
-    extra = 0
+    extra = 1
+    formset = AtLeastOneRequiredInlineFormSet
 
 
 class ContracteeSignatureInline(NestedStackedInline):
diff --git a/contracts/forms.py b/contracts/forms.py
index 9453e76..e25eea8 100644
--- a/contracts/forms.py
+++ b/contracts/forms.py
@@ -1,10 +1,27 @@
 from django import forms
 from django.core.exceptions import ValidationError
+from django.forms.models import BaseInlineFormSet
 from webpack_loader.loader import WebpackLoader
 
 from .models import Contract, ContracteeSignature, SigneeSignature
 
 
+class AtLeastOneRequiredInlineFormSet(BaseInlineFormSet):
+    def clean(self):
+        """Check that at least one item has been entered."""
+
+        super().clean()
+
+        if any(self.errors):
+            return
+
+        if not any(
+            cleaned_data and not cleaned_data.get('DELETE', False)
+            for cleaned_data in self.cleaned_data
+        ):
+            raise forms.ValidationError("Vyžadován aspoň jeden záznam.")
+
+
 class ContractAdminForm(forms.ModelForm):
     def clean(self):
         clean_data = super().clean()
diff --git a/contracts/migrations/0045_alter_contracteesignaturerepresentative_function.py b/contracts/migrations/0045_alter_contracteesignaturerepresentative_function.py
new file mode 100644
index 0000000..365c6ee
--- /dev/null
+++ b/contracts/migrations/0045_alter_contracteesignaturerepresentative_function.py
@@ -0,0 +1,19 @@
+# Generated by Django 4.1.4 on 2023-04-16 07:36
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('contracts', '0044_alter_contract_tender_url'),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='contracteesignaturerepresentative',
+            name='function',
+            field=models.CharField(default='k vyplnění', max_length=256, verbose_name='Funkce'),
+            preserve_default=False,
+        ),
+    ]
diff --git a/contracts/migrations/0046_alter_contract_paper_form_state.py b/contracts/migrations/0046_alter_contract_paper_form_state.py
new file mode 100644
index 0000000..c8783c8
--- /dev/null
+++ b/contracts/migrations/0046_alter_contract_paper_form_state.py
@@ -0,0 +1,18 @@
+# Generated by Django 4.1.4 on 2023-04-16 07:39
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('contracts', '0045_alter_contracteesignaturerepresentative_function'),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='contract',
+            name='paper_form_state',
+            field=models.CharField(choices=[('on_the_way', 'Na cestě'), ('sent', 'Odeslaný'), ('mailbox', 'Ve schránce'), ('to_shred', 'Ke skartaci'), ('shredded', 'Skartovaný'), ('stored', 'Uložený'), ('lost', 'Ztracený')], max_length=10, verbose_name='Stav fyzického dokumentu'),
+        ),
+    ]
diff --git a/contracts/models.py b/contracts/models.py
index 0b44dcd..8490179 100644
--- a/contracts/models.py
+++ b/contracts/models.py
@@ -540,10 +540,15 @@ class Contract(NameStrMixin, models.Model):
         NO = "no", "Neveřejná"
 
     class PaperFormStates(models.TextChoices):
+        ON_THE_WAY = "on_the_way", "Na cestě"
         SENT = "sent", "Odeslaný"
-        STORED = "stored", "Uložený"
+        MAILBOX = "mailbox", "Ve schránce"
+
         TO_SHRED = "to_shred", "Ke skartaci"
         SHREDDED = "shredded", "Skartovaný"
+
+        STORED = "stored", "Uložený"
+
         LOST = "lost", "Ztracený"
 
     legal_state = models.CharField(
@@ -568,7 +573,7 @@ class Contract(NameStrMixin, models.Model):
     )  # WARNING: public status dependent
 
     paper_form_state = models.CharField(
-        max_length=8,
+        max_length=10,
         choices=PaperFormStates.choices,
         verbose_name="Stav fyzického dokumentu",
     )
@@ -950,8 +955,6 @@ class ContracteeSignatureRepresentative(RepresentativeMixin, models.Model):
 
     function = models.CharField(
         max_length=256,
-        blank=True,
-        null=True,
         verbose_name="Funkce",
     )
 
diff --git a/package-lock.json b/package-lock.json
index 025b1d6..9a705a8 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -12,7 +12,7 @@
         "@tailwindcss/typography": "^0.5.9",
         "alertifyjs": "^1.13.1",
         "css-loader": "^6.7.3",
-        "jquery": "^3.6.3",
+        "jquery": "^3.6.4",
         "style-loader": "^3.3.1",
         "tailwindcss": "^3.2.4",
         "tippy.js": "^6.3.7",
diff --git a/package.json b/package.json
index 528abd8..77aef2b 100644
--- a/package.json
+++ b/package.json
@@ -15,7 +15,7 @@
     "@tailwindcss/typography": "^0.5.9",
     "alertifyjs": "^1.13.1",
     "css-loader": "^6.7.3",
-    "jquery": "^3.6.3",
+    "jquery": "^3.6.4",
     "style-loader": "^3.3.1",
     "tailwindcss": "^3.2.4",
     "tippy.js": "^6.3.7",
-- 
GitLab