From 1ff5c95193cc6ad40b8c88ad860311f5d1b550cf Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Valenta?= <git@imaniti.org>
Date: Wed, 20 Sep 2023 11:39:44 +0200
Subject: [PATCH] integrate new Nastenka API

---
 contracts/admin.py                            | 40 +++++++++++++------
 .../commands/import_old_contracts.py          |  3 +-
 ...tract_after_approval_nastenka_notice_id.py | 13 +++---
 ...in_progress_nastenka_notice_id_and_more.py | 30 ++++++++++++++
 contracts/models.py                           |  8 +++-
 contracts/settings.py                         |  2 +
 package-lock.json                             | 12 +++---
 registry/settings/base.py                     |  7 +++-
 8 files changed, 87 insertions(+), 28 deletions(-)
 create mode 100644 contracts/migrations/0069_contract_work_in_progress_nastenka_notice_id_and_more.py

diff --git a/contracts/admin.py b/contracts/admin.py
index 52dda10..6240321 100644
--- a/contracts/admin.py
+++ b/contracts/admin.py
@@ -314,7 +314,6 @@ class ContractAdmin(
 
     def save_model(self, request, obj, form, change):
         is_new = obj.created_by is None
-        print(is_new)
 
         # Need to generate primary keys first
         parent_save_response = super().save_model(request, obj, form, change)
@@ -338,7 +337,7 @@ class ContractAdmin(
         from users.models import User
 
         headers = {
-            "Authorization": f"Token {settings.NASTENKA_API_TOKEN}",
+            "Authorization": f"Token {Contract.settings.nastenka_api_key}",
             "Content-Type": "application/json",
         }
 
@@ -361,11 +360,17 @@ class ContractAdmin(
                         }
                     ),
                     headers=headers,
-                ).raise_for_status()
+                )
+
+                notice.raise_for_status()
+                notice = notice.json()
+
+                obj.work_in_progress_nastenka_notice_id = uuid.UUID(notice["id"])
+                obj.save()
 
                 if obj.after_approval_nastenka_notice_id is not None:
-                    requests.delete(
-                        f"{settings.NASTENKA_API_URL}/{obj.after_approval_nastenka_notice_id}",
+                    requests.post(
+                        f"{settings.NASTENKA_API_URL}/{obj.after_approval_nastenka_notice_id}/all-hidden",
                         headers=headers,
                     ).raise_for_status()
 
@@ -373,8 +378,8 @@ class ContractAdmin(
                     obj.save()
 
                 if obj.to_be_approved_nastenka_notice_id is not None:
-                    requests.delete(
-                        f"{settings.NASTENKA_API_URL}/{obj.to_be_approved_nastenka_notice_id}",
+                    requests.post(
+                        f"{settings.NASTENKA_API_URL}/{obj.to_be_approved_nastenka_notice_id}/all-hidden",
                         headers=headers,
                     ).raise_for_status()
 
@@ -390,7 +395,9 @@ class ContractAdmin(
                 try:
                     sso_ids = []
 
-                    for user in User.objects.filter(is_staff=True).all():
+                    for user in User.objects.filter(
+                        models.Q(is_staff=True) & ~models.Q(sso_id="")
+                    ).all():
                         if user.has_perm("contracts.approve"):
                             sso_ids.append(user.sso_id)
 
@@ -416,6 +423,15 @@ class ContractAdmin(
 
                     obj.to_be_approved_nastenka_notice_id = uuid.UUID(notice["id"])
                     obj.save()
+
+                    if obj.work_in_progress_nastenka_notice_id is not None:
+                        requests.post(
+                            f"{settings.NASTENKA_API_URL}/{obj.work_in_progress_nastenka_notice_id}/all-hidden",
+                            headers=headers,
+                        ).raise_for_status()
+
+                        obj.work_in_progress_nastenka_notice_id = None
+                        obj.save()
                 except Exception as exception:
                     logger.error(
                         'Failed to send out notice "to be approved" Nástěnka notification: %s',
@@ -449,8 +465,8 @@ class ContractAdmin(
                     obj.save()
 
                     if obj.to_be_approved_nastenka_notice_id is not None:
-                        requests.delete(
-                            f"{settings.NASTENKA_API_URL}/{obj.to_be_approved_nastenka_notice_id}",
+                        requests.post(
+                            f"{settings.NASTENKA_API_URL}/{obj.to_be_approved_nastenka_notice_id}/all-hidden",
                             headers=headers,
                         ).raise_for_status()
 
@@ -489,8 +505,8 @@ class ContractAdmin(
                     obj.save()
 
                     if obj.to_be_approved_nastenka_notice_id is not None:
-                        requests.delete(
-                            f"{settings.NASTENKA_API_URL}/{obj.to_be_approved_nastenka_notice_id}",
+                        requests.post(
+                            f"{settings.NASTENKA_API_URL}/{obj.to_be_approved_nastenka_notice_id}/all-hidden",
                             headers=headers,
                         ).raise_for_status()
 
diff --git a/contracts/management/commands/import_old_contracts.py b/contracts/management/commands/import_old_contracts.py
index 312f625..ea613d2 100644
--- a/contracts/management/commands/import_old_contracts.py
+++ b/contracts/management/commands/import_old_contracts.py
@@ -10,9 +10,8 @@ from django.conf import settings
 from django.core.files import File
 from django.core.management.base import BaseCommand
 from django.db import models
-from postal.parser import parse_address
-
 from git import Repo
+from postal.parser import parse_address
 
 from ...models import (
     Contract,
diff --git a/contracts/migrations/0068_contract_after_approval_nastenka_notice_id.py b/contracts/migrations/0068_contract_after_approval_nastenka_notice_id.py
index b72787e..265f5da 100644
--- a/contracts/migrations/0068_contract_after_approval_nastenka_notice_id.py
+++ b/contracts/migrations/0068_contract_after_approval_nastenka_notice_id.py
@@ -4,15 +4,18 @@ from django.db import migrations, models
 
 
 class Migration(migrations.Migration):
-
     dependencies = [
-        ('contracts', '0067_alter_contractee_options_alter_signee_options'),
+        ("contracts", "0067_alter_contractee_options_alter_signee_options"),
     ]
 
     operations = [
         migrations.AddField(
-            model_name='contract',
-            name='after_approval_nastenka_notice_id',
-            field=models.UUIDField(blank=True, null=True, verbose_name='ID oznámení o schválení / vrácení v Nástěnce'),
+            model_name="contract",
+            name="after_approval_nastenka_notice_id",
+            field=models.UUIDField(
+                blank=True,
+                null=True,
+                verbose_name="ID oznámení o schválení / vrácení v Nástěnce",
+            ),
         ),
     ]
diff --git a/contracts/migrations/0069_contract_work_in_progress_nastenka_notice_id_and_more.py b/contracts/migrations/0069_contract_work_in_progress_nastenka_notice_id_and_more.py
new file mode 100644
index 0000000..fbaf08e
--- /dev/null
+++ b/contracts/migrations/0069_contract_work_in_progress_nastenka_notice_id_and_more.py
@@ -0,0 +1,30 @@
+# Generated by Django 4.1.4 on 2023-09-19 20:33
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+    dependencies = [
+        ("contracts", "0068_contract_after_approval_nastenka_notice_id"),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name="contract",
+            name="work_in_progress_nastenka_notice_id",
+            field=models.UUIDField(
+                blank=True,
+                null=True,
+                verbose_name="ID oznámení o vrácení k úpravě v Nástěnce",
+            ),
+        ),
+        migrations.AlterField(
+            model_name="contract",
+            name="after_approval_nastenka_notice_id",
+            field=models.UUIDField(
+                blank=True,
+                null=True,
+                verbose_name="ID oznámení o schválení / zamítnutí v Nástěnce",
+            ),
+        ),
+    ]
diff --git a/contracts/models.py b/contracts/models.py
index 17e70ac..185427b 100644
--- a/contracts/models.py
+++ b/contracts/models.py
@@ -698,10 +698,16 @@ class Contract(NameStrMixin, models.Model):
         blank=True, null=True, verbose_name="ID oznámení o nové smlouvě v Nástěnce"
     )
 
+    work_in_progress_nastenka_notice_id = models.UUIDField(
+        blank=True,
+        null=True,
+        verbose_name="ID oznámení o vrácení k úpravě v Nástěnce",
+    )
+
     after_approval_nastenka_notice_id = models.UUIDField(
         blank=True,
         null=True,
-        verbose_name="ID oznámení o schválení / vrácení v Nástěnce",
+        verbose_name="ID oznámení o schválení / zamítnutí v Nástěnce",
     )
 
     @property
diff --git a/contracts/settings.py b/contracts/settings.py
index 8cd2d50..922e586 100644
--- a/contracts/settings.py
+++ b/contracts/settings.py
@@ -8,3 +8,5 @@ class ContractSettings(dbsettings.Group):
         help_text="Poporuje formátování skrze Markdown.",
         widget=forms.Textarea,
     )
+
+    nastenka_api_key = dbsettings.StringValue("API Token pro Nástěnku")
diff --git a/package-lock.json b/package-lock.json
index b57b2e4..183b077 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1663,9 +1663,9 @@
       }
     },
     "node_modules/semver": {
-      "version": "7.3.8",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
-      "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
+      "version": "7.5.4",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
+      "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
       "dependencies": {
         "lru-cache": "^6.0.0"
       },
@@ -3336,9 +3336,9 @@
       }
     },
     "semver": {
-      "version": "7.3.8",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
-      "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
+      "version": "7.5.4",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
+      "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
       "requires": {
         "lru-cache": "^6.0.0"
       }
diff --git a/registry/settings/base.py b/registry/settings/base.py
index 083ea5d..469be13 100644
--- a/registry/settings/base.py
+++ b/registry/settings/base.py
@@ -201,7 +201,10 @@ USE_X_FORWARDED_HOST = True
 SECURE_PROXY_SSL_HEADER = ("HTTP_X_FORWARDED_PROTO", "https")
 
 X_FRAME_OPTIONS = "SAMEORIGIN"
-SILENCED_SYSTEM_CHECKS = ["security.W019"]
+SILENCED_SYSTEM_CHECKS = [
+    "security.W019",
+    "auth.W004",
+]
 
 
 ## Admin
@@ -247,7 +250,7 @@ if SENTRY_DSN != "":
 
 ## App-specific
 
-NASTENKA_API_URL = env.str("NASTENKA_API_URL")
+NASTENKA_API_URL = "http://localhost:8009/contracts/api/notices"
 NASTENKA_API_TOKEN = env.str("NASTENKA_API_TOKEN")
 
 DEFAULT_CONTRACTEE_NAME = env.str("DEFAULT_CONTRACTEE_NAME")
-- 
GitLab