From 31554b011048c21a7dffd4b6b7d932bacdb1ec31 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Simon=20K=C3=BCnzel?= <simonk@fsmpi.rwth-aachen.de>
Date: Sat, 17 May 2025 22:31:50 +0200
Subject: [PATCH] disallow deletion of publish media via API (process scheduler
 manages that)

---
 api/tests/routes/object_modifications.py      | 22 +++++++------------
 .../videoag_common/api_object/object_class.py |  4 +++-
 .../src/videoag_common/objects/medium.py      |  3 ++-
 3 files changed, 13 insertions(+), 16 deletions(-)

diff --git a/api/tests/routes/object_modifications.py b/api/tests/routes/object_modifications.py
index 1df90b6..5f5047d 100644
--- a/api/tests/routes/object_modifications.py
+++ b/api/tests/routes/object_modifications.py
@@ -1624,32 +1624,26 @@ class ObjectModificationsTest(ApiTest):
             assert_empty_response=True,
             use_moderator_login=True,
         )
-        self.do_json_request(
-            "DELETE",
-            f"/object_management/publish_medium/204",
-            assert_empty_response=True,
-            use_moderator_login=True,
-        )
         self.do_json_request(
             "POST",
-            f"/object_management/publish_medium/204/resurrect",
-            expected_response_status=HTTP_401_UNAUTHORIZED
+            f"/object_management/lecture/290000/resurrect",
+            expected_response_status=HTTP_404_NOT_FOUND,
+            use_moderator_login=True
         )
         self.do_json_request(
             "POST",
-            f"/object_management/publish_medium/12000/resurrect",
-            expected_response_status=HTTP_404_NOT_FOUND,
-            use_moderator_login=True
+            f"/object_management/lecture/29/resurrect",
+            expected_response_status=HTTP_401_UNAUTHORIZED
         )
         self.do_json_request(
             "POST",
-            f"/object_management/publish_medium/204/resurrect",
+            f"/object_management/lecture/29/resurrect",
             assert_empty_response=True,
-            use_moderator_login=True,
+            use_moderator_login=True
         )
         self.do_json_request(
             "POST",
-            f"/object_management/publish_medium/204/resurrect",
+            f"/object_management/lecture/29/resurrect",
             expected_response_status=HTTP_400_BAD_REQUEST,
             use_moderator_login=True
         )
diff --git a/common_py/src/videoag_common/api_object/object_class.py b/common_py/src/videoag_common/api_object/object_class.py
index ab0b362..ed5040b 100644
--- a/common_py/src/videoag_common/api_object/object_class.py
+++ b/common_py/src/videoag_common/api_object/object_class.py
@@ -31,11 +31,13 @@ class ApiObjectClass:
                  parent_relationship_config_ids: list[str] or None = None,
                  enable_config: bool or None = None,
                  config_allow_creation: bool = True,
+                 config_allow_deletion: bool = True,
                  enable_data: bool or None = None,
                  ):
         self._parent_relationship_config_ids = parent_relationship_config_ids
         self.enable_config = enable_config
         self.config_allow_creation = config_allow_creation
+        self.config_allow_deletion = config_allow_deletion
         self.enable_data = enable_data
         
         self.orm_class = None
@@ -356,7 +358,7 @@ class ApiObjectClass:
         return self._creation_config_json
     
     def is_deletion_allowed(self) -> bool:
-        return issubclass(self.orm_class, DeletableApiObject)
+        return issubclass(self.orm_class, DeletableApiObject) and self.config_allow_deletion
     
     def get_current_config(self, session: SessionDb, object_id: int):
         if not self.enable_config:
diff --git a/common_py/src/videoag_common/objects/medium.py b/common_py/src/videoag_common/objects/medium.py
index 3de3f29..1e81565 100644
--- a/common_py/src/videoag_common/objects/medium.py
+++ b/common_py/src/videoag_common/objects/medium.py
@@ -360,7 +360,8 @@ class MediumMetadata(ApiObject, Base):
 class PublishMedium(VisibilityApiObject, DeletableApiObject, Base):
     __api_class__ = ApiObjectClass(
         parent_relationship_config_ids=["lecture"],
-        config_allow_creation=False
+        config_allow_creation=False,
+        config_allow_deletion=False,
     )
     
     # Yes, this is a bit redundant since medium_metadata.file.lecture_id already has it. However, after struggling with
-- 
GitLab