From c838bc46cff092837281947c6572683d37891fe1 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Alexa=20Valentov=C3=A1?= <git@imaniti.org>
Date: Thu, 8 May 2025 11:57:32 +0200
Subject: [PATCH] Handle auto-imported contracts better

---
 Makefile           |  2 +-
 contracts/admin.py | 14 ++++++++++----
 contracts/forms.py |  1 +
 3 files changed, 12 insertions(+), 5 deletions(-)

diff --git a/Makefile b/Makefile
index 3dd614c..67fcce0 100644
--- a/Makefile
+++ b/Makefile
@@ -1,6 +1,6 @@
 #!/usr/bin/make -f
 
-PYTHON   = python3.11
+PYTHON   = python3.12
 VENV     = .venv
 PORT     = 8013
 SETTINGS = registry.settings.dev
diff --git a/contracts/admin.py b/contracts/admin.py
index ba5f4fd..fee77c6 100644
--- a/contracts/admin.py
+++ b/contracts/admin.py
@@ -88,7 +88,9 @@ class OwnPermissionsMixin(
     )
 ):
     def save_model(self, request, obj, form, change):
-        if obj.created_by is None:
+        # If there is a primary key already assigned, this is an auto-generated
+        # contract that shouldn't have an author at all.
+        if obj.created_by is None and obj.pk is None:
             obj.created_by = request.user
 
         return super().save_model(request, obj, form, change)
@@ -250,7 +252,7 @@ class ContractAdmin(
     search_fields = ("name",)
 
     readonly_fields = (
-        "created_by",
+        # "created_by",  -- Dynamic
         "created_on",
         "updated_on",
     )
@@ -606,8 +608,6 @@ class ContractAdmin(
         return parent_save_response
 
     def get_readonly_fields(self, request, obj=None):
-        readonly_fields = []
-
         fields = []
 
         for fieldset in self.get_fieldsets(request):
@@ -621,8 +621,14 @@ class ContractAdmin(
         ):
             fields.remove("status")
 
+            if request.user.is_superuser:
+                fields.remove("created_by")
+
             return fields
 
+        if not request.user.is_superuser:
+            return list(self.readonly_fields) + ["created_by"]
+
         return list(self.readonly_fields)
 
     def has_change_permission(self, request, obj=None):
diff --git a/contracts/forms.py b/contracts/forms.py
index bb3f457..d594115 100644
--- a/contracts/forms.py
+++ b/contracts/forms.py
@@ -94,6 +94,7 @@ class ContractAdminForm(forms.ModelForm):
                     and choice_key == Contract.StatusTypes.TO_BE_APPROVED
                     and self.current_user.has_perm("contracts.approve")
                 ):
+                    print("allowing")
                     allowed_choices.append(
                         (
                             choice_key,
-- 
GitLab