From 4cd5a62b284d688f9f982c25ad693e9d0d60b027 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Valenta?= <git@imaniti.org>
Date: Thu, 27 Apr 2023 09:14:37 +0200
Subject: [PATCH] add ContractIssue for corresponding issue

---
 .../commands/import_old_contracts.py          | 45 +++++++++++++++++--
 package-lock.json                             | 16 ++++---
 shared/templates/shared/includes/base.html    |  6 +--
 3 files changed, 55 insertions(+), 12 deletions(-)

diff --git a/contracts/management/commands/import_old_contracts.py b/contracts/management/commands/import_old_contracts.py
index 4fcc248..e638be1 100644
--- a/contracts/management/commands/import_old_contracts.py
+++ b/contracts/management/commands/import_old_contracts.py
@@ -18,6 +18,7 @@ from ...models import (
     ContractFile,
     ContractFilingArea,
     ContractType,
+    ContractIssue,
     Contractee,
     Signee,
     SigneeSignature,
@@ -67,6 +68,14 @@ class Command(BaseCommand):
             help="Purge all previous contracts, types and filing areas before the import.",
         )
 
+    def use_issue(self, contract, name: str) -> None:
+        try:
+            issue = ContractIssue.objects.get(name=name)
+        except ContractIssue.DoesNotExist:
+            issue = ContractIssue(name=name)
+
+        return issue
+
     def normalize_type(self, type_name: str) -> str:
         type_name = string.capwords(type_name)
 
@@ -479,11 +488,13 @@ class Command(BaseCommand):
         signing_party: dict
     ) -> tuple[
         Contract|Signee,
+        list[ContractIssue],
         list[ContracteeSignatureRepresentative|SigneeSignatureRepresentative],
         bool,
         int
     ]:
         issue_count = 0
+        issues = []
 
         if (
             "jméno" not in signing_party
@@ -492,6 +503,7 @@ class Command(BaseCommand):
         ):
             issue_count += 1
             contract.notes += f"Nepojmenovaná smluvní strana, zdrojová data: {signing_party}\n"
+            issues.append(self.use_issue(contract, "Špatně pojmenovaná smluvní strana"))
 
             if self.verbosity >= 2:
                 self.stderr.write(
@@ -648,6 +660,7 @@ class Command(BaseCommand):
                     if not isinstance(signing_party_value, str):
                         issue_count += 1
                         contract.notes += f"Špatně zadané sídlo smluvní strany: {signing_party_value}\n"
+                        issues.append(self.use_issue(contract, "Špatně zadané sídlo smluvní strany"))
 
                         if self.verbosity >= 2:
                             self.stderr.write(
@@ -695,6 +708,7 @@ class Command(BaseCommand):
                     if not isinstance(signing_party_value, int|str):
                         issue_count += 1
                         contract.notes += f"Špatně zadané IČO smluvní strany: {signing_party_value}\n"
+                        issues.append(self.use_issue(contract, "Špatně zadané IČO smluvní strany"))
 
                         if self.verbosity >= 2:
                             self.stderr.write(
@@ -710,6 +724,7 @@ class Command(BaseCommand):
                     if not isinstance(signing_party_value, str|list):
                         issue_count += 1
                         contract.notes += f"Špatně zadaný zástupce smluvní strany: {signing_party_value}\n"
+                        issues.append(self.use_issue(contract, "Špatně zadaný zástupce smluvní strany"))
 
                         if self.verbosity >= 2:
                             self.stderr.write(
@@ -737,6 +752,7 @@ class Command(BaseCommand):
                             else:
                                 issue_count += 1
                                 contract.notes += f"Špatně zadaná funkce zástupce smluvní strany: {signing_party['funkce']}\n"
+                                issues.append(self.use_issue(contract, "Špatně zadaná funkce zástupce smluvní strany"))
 
                                 if self.verbosity >= 2:
                                     self.stderr.write(
@@ -756,6 +772,7 @@ class Command(BaseCommand):
                             if not isinstance(representative_name, str):
                                 issue_count += 1
                                 contract.notes += f"Špatně zadaný jeden ze zástupců smluvní strany: {representative_name}\n"
+                                issues.append(self.use_issue(contract, "Špatně zadaný zástupce smluvní strany"))
 
                                 if self.verbosity >= 2:
                                     self.stderr.write(
@@ -783,6 +800,7 @@ class Command(BaseCommand):
                     if not isinstance(signing_party_value, str):
                         issue_count += 1
                         contract.notes += f"Špatně zadaný orgán smluvní strany: {signing_party_value}\n"
+                        issues.append(self.use_issue(contract, "Špatně zadaný orgán smluvní strany"))
 
                         if self.verbosity >= 2:
                             self.stderr.write(
@@ -887,7 +905,7 @@ class Command(BaseCommand):
         else:
             instance.save()
 
-        return instance, representatives, is_contractee, issue_count
+        return instance, issues, representatives, is_contractee, issue_count
 
     def assign_contract_data(
         self,
@@ -901,6 +919,7 @@ class Command(BaseCommand):
         signees = []
         contractees = []
         files = []
+        issues = []
         is_already_imported = False
         observed_issues_count = 0
 
@@ -918,6 +937,7 @@ class Command(BaseCommand):
                     elif value is not None:
                         observed_issues_count += 1
                         contract.notes += f"Špatně zadaný začátek platnosti: {value}\n"
+                        issues.append(self.use_issue(contract, "Špatně zadaný začátek platnosti"))
 
                         if self.verbosity >= 2:
                             self.stderr.write(
@@ -934,6 +954,7 @@ class Command(BaseCommand):
                     ):
                         observed_issues_count += 1
                         contract.notes += f"Špatně zadaný konec platnosti: {value}\n"
+                        issues.append(self.use_issue(contract, "Špatně zadaný konec platnosti"))
 
                         if self.verbosity >= 2:
                             self.stderr.write(
@@ -969,6 +990,7 @@ class Command(BaseCommand):
                     elif not isinstance(value, list):
                         observed_issues_count += 1
                         contract.notes += f"Špatně zadané typy: {value}\n"
+                        issues.append(self.use_issue(contract, "Špatně zadané typy"))
 
                         if self.verbosity >= 2:
                             self.stderr.write(
@@ -982,7 +1004,8 @@ class Command(BaseCommand):
                     for type_name in value:
                         if not isinstance(type_name, str):
                             observed_issues_count += 1
-                            contract.notes += f"Nezaevidovaný typ: {type_name}\n"
+                            contract.notes += f"Špatně zadaný typ: {type_name}\n"
+                            issues.append(self.use_issue(contract, "Špatně zadaný typ"))
 
                             if self.verbosity >= 2:
                                 self.stderr.write(
@@ -1024,6 +1047,7 @@ class Command(BaseCommand):
                     else:
                         observed_issues_count += 1
                         contract.notes += f"Neznámý stav: {value}\n"
+                        issues.append(self.use_issue(contract, "Neznámý právní stav"))
 
                         if self.verbosity >= 2:
                             self.stderr.write(
@@ -1044,6 +1068,7 @@ class Command(BaseCommand):
                             contract.notes += (
                                 f"Původní, špatně zadané náklady: {value}\n"
                             )
+                            issues.append(self.use_issue(contract, "Špatně zadané náklady"))
 
                             if self.verbosity >= 2:
                                 self.stderr.write(
@@ -1071,6 +1096,7 @@ class Command(BaseCommand):
                         ):
                             observed_issues_count += 1
                             contract.notes += f"Původní, neropoznané náklady: {value}\n"
+                            issues.append(self.use_issue(contract, "Špatně zadané náklady"))
 
                             if self.verbosity >= 2:
                                 self.stderr.write(
@@ -1086,6 +1112,7 @@ class Command(BaseCommand):
                     elif value not in (None, "0"):
                         observed_issues_count += 1
                         contract.notes += f"Původní, neropoznané náklady: {value}\n"
+                        issues.append(self.use_issue(contract, "Špatně zadané náklady"))
 
                         if self.verbosity >= 2:
                             self.stderr.write(
@@ -1110,6 +1137,7 @@ class Command(BaseCommand):
                         else:
                             observed_issues_count += 1
                             contract.notes += f"Špatně zadaná spisovna: {value}\n"
+                            issues.append(self.use_issue(contract, "Špatně zadaná spisovna"))
 
                             if self.verbosity >= 2:
                                 self.stderr.write(
@@ -1121,6 +1149,7 @@ class Command(BaseCommand):
                     if not isinstance(value, list):
                         observed_issues_count += 1
                         contract.notes += f"Špatně zadané smluvní strany, nejsou seznam: {value}\n"
+                        issues.append(self.use_issue(contract, "Špatně zadaný smluvní strany"))
 
                         if self.verbosity >= 2:
                             self.stderr.write(
@@ -1135,6 +1164,7 @@ class Command(BaseCommand):
                         if not isinstance(signing_party, dict):
                             observed_issues_count += 1
                             contract.notes += f"Špatně zadaná smluvní strana: {signing_party}\n"
+                            issues.append(self.use_issue(contract, "Špatně zadaná smluvní strana"))
 
                             if self.verbosity >= 2:
                                 self.stderr.write(
@@ -1145,10 +1175,11 @@ class Command(BaseCommand):
 
                             continue
 
-                        instance, representatives, is_contractee, signing_party_issue_count = (
+                        instance, signing_party_issues, representatives, is_contractee, signing_party_issue_count = (
                             self.assign_signing_party_metadata(slug, contract, signing_party)
                         )
 
+                        issues += signing_party_issues
                         observed_issues_count += signing_party_issue_count
 
                         # Store representatives in relation to the instance, hacky but good enough
@@ -1162,6 +1193,7 @@ class Command(BaseCommand):
                     if not isinstance(value, list):
                         observed_issues_count += 1
                         contract.notes += f"Špatně zadané soubory.\n"
+                        issues.append(self.use_issue(contract, "Špatně zadané soubory"))
 
                         if self.verbosity >= 2:
                             self.stderr.write(
@@ -1176,6 +1208,7 @@ class Command(BaseCommand):
                         if not isinstance(file_data, dict):
                             observed_issues_count += 1
                             contract.notes += f"Špatně zadané informace o souboru: {file_data}.\n"
+                            issues.append(self.use_issue(contract, "Špatně zadané informace o souboru"))
 
                             if self.verbosity >= 2:
                                 self.stderr.write(
@@ -1195,6 +1228,7 @@ class Command(BaseCommand):
                             if not isinstance(file_value, str):
                                 observed_issues_count += 1
                                 contract.notes += f"Špatně zadaný název souboru {file_key}: {file_value}.\n"
+                                issues.append(self.use_issue(contract, "Neplatný název souboru"))
 
                                 if self.verbosity >= 2:
                                     self.stderr.write(
@@ -1213,6 +1247,7 @@ class Command(BaseCommand):
                             if not os.path.isfile(file_path):
                                 observed_issues_count += 1
                                 contract.notes += f"Neexistující soubor: {file_value}.\n"
+                                issues.append(self.use_issue(contract, "Neexistující soubor"))
 
                                 if self.verbosity >= 2:
                                     self.stderr.write(
@@ -1302,8 +1337,12 @@ class Command(BaseCommand):
             for file in files:
                 file.save()
 
+            for issue in issues:
+                issue.save()
+
             contract.filing_area = filing_area
             contract.types.set(types)
+            contract.issues.set(issues)
             contract.save()
         else:
             self.already_imported_count += 1
diff --git a/package-lock.json b/package-lock.json
index 555756a..b57b2e4 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -515,9 +515,9 @@
       }
     },
     "node_modules/caniuse-lite": {
-      "version": "1.0.30001468",
-      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001468.tgz",
-      "integrity": "sha512-zgAo8D5kbOyUcRAgSmgyuvBkjrGk5CGYG5TYgFdpQv+ywcyEpo1LOWoG8YmoflGnh+V+UsNuKYedsoYs0hzV5A==",
+      "version": "1.0.30001481",
+      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001481.tgz",
+      "integrity": "sha512-KCqHwRnaa1InZBtqXzP98LPg0ajCVujMKjqKDhZEthIpAsJl/YEIa3YvXjGXPVqzZVguccuu7ga9KOE1J9rKPQ==",
       "funding": [
         {
           "type": "opencollective",
@@ -526,6 +526,10 @@
         {
           "type": "tidelift",
           "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+        },
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/ai"
         }
       ]
     },
@@ -2568,9 +2572,9 @@
       "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA=="
     },
     "caniuse-lite": {
-      "version": "1.0.30001468",
-      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001468.tgz",
-      "integrity": "sha512-zgAo8D5kbOyUcRAgSmgyuvBkjrGk5CGYG5TYgFdpQv+ywcyEpo1LOWoG8YmoflGnh+V+UsNuKYedsoYs0hzV5A=="
+      "version": "1.0.30001481",
+      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001481.tgz",
+      "integrity": "sha512-KCqHwRnaa1InZBtqXzP98LPg0ajCVujMKjqKDhZEthIpAsJl/YEIa3YvXjGXPVqzZVguccuu7ga9KOE1J9rKPQ=="
     },
     "chokidar": {
       "version": "3.5.3",
diff --git a/shared/templates/shared/includes/base.html b/shared/templates/shared/includes/base.html
index 2755e32..5520d19 100644
--- a/shared/templates/shared/includes/base.html
+++ b/shared/templates/shared/includes/base.html
@@ -60,7 +60,7 @@
                         <div class="container container--default navbar__content" :class="{'navbar__content--initialized': true}">
                             <div class="navbar__brand my-4 flex items-center lg:pr-8 lg:my-0">
                                 <a href="/">
-                                    <img src="https://styleguide.pirati.cz/2.12.x/images/logo-round-white.svg" class="w-8" />
+                                    <img src="https://styleguide.pirati.cz/2.12.x/images/logo-round-white.svg" class="w-8">
                                 </a>
                                 <a href="/" class="pl-4 font-bold text-xl hover:no-underline lg:border-r lg:border-grey-300 lg:pr-8">Registr smluv</a>
                             </div>
@@ -190,8 +190,8 @@
                             </a>
                             <a href="https://nalodeni.pirati.cz" class="btn btn--icon btn--blue-300 btn--hoveractive text-lg btn--fullwidth sm:btn--autowidth">
                                 <div class="btn__body-wrap">
-                                    <div class="btn__body ">Naloď se</div>
-                                    <div class="btn__icon "><i class="ico--anchor"></i></div>
+                                    <div class="btn__body">Naloď se</div>
+                                    <div class="btn__icon"><i class="ico--anchor"></i></div>
                                 </div>
                             </a>
                         </div>
-- 
GitLab