From a6d74210bb4f8939726334cb3d59f501cf6888a0 Mon Sep 17 00:00:00 2001
From: George Katsikas <giorgakis.katsikas@gmail.com>
Date: Tue, 4 Feb 2025 17:53:08 +0100
Subject: [PATCH] =?UTF-8?q?feat:=20=E2=9C=A8=20specify=20optional=20merge?=
 =?UTF-8?q?=20profile=20duplicate=20ids?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../profiles/profile_duplicates.html          |  8 +++++-
 scipost_django/profiles/urls.py               | 10 ++++++++
 scipost_django/profiles/views.py              | 25 ++++++++++++++++---
 3 files changed, 38 insertions(+), 5 deletions(-)

diff --git a/scipost_django/profiles/templates/profiles/profile_duplicates.html b/scipost_django/profiles/templates/profiles/profile_duplicates.html
index 10e72204a..40468916d 100644
--- a/scipost_django/profiles/templates/profiles/profile_duplicates.html
+++ b/scipost_django/profiles/templates/profiles/profile_duplicates.html
@@ -20,7 +20,13 @@
 
       <div id="merge-form"
            hx-trigger="intersect once"
-           hx-get="{% url 'profiles:_hx_profile_merge' to_merge=0 to_merge_into=0 %}"></div>
+           {% if to_merge and to_merge_into %}
+            hx-get="{% url 'profiles:_hx_profile_merge' to_merge to_merge_into %}"
+           {% else %}
+            hx-get="{% url 'profiles:_hx_profile_merge' %}"
+           {% endif %}
+           >
+      </div>
     </div>
   </div>
 {% endblock content %}
diff --git a/scipost_django/profiles/urls.py b/scipost_django/profiles/urls.py
index 69fa6aa98..c7eaf73da 100644
--- a/scipost_django/profiles/urls.py
+++ b/scipost_django/profiles/urls.py
@@ -67,6 +67,11 @@ urlpatterns = [
         ),
     ),
     # Duplicates and merging
+    path(
+        "duplicates/<int:to_merge>/<int:to_merge_into>",
+        views.profile_duplicates,
+        name="duplicates",
+    ),
     path("duplicates/", views.profile_duplicates, name="duplicates"),
     path(
         "_hx_profile_comparison",
@@ -78,6 +83,11 @@ urlpatterns = [
         views._hx_profile_merge,
         name="_hx_profile_merge",
     ),
+    path(
+        "_hx_profile_merge/",
+        views._hx_profile_merge,
+        name="_hx_profile_merge",
+    ),
     path(
         "_hx_profile_mark_non_duplicate/<int:profile1>/<int:profile2>",
         views._hx_profile_mark_non_duplicate,
diff --git a/scipost_django/profiles/views.py b/scipost_django/profiles/views.py
index 642674456..1f1222e99 100644
--- a/scipost_django/profiles/views.py
+++ b/scipost_django/profiles/views.py
@@ -332,7 +332,9 @@ class ProfileListView(PermissionsMixin, PaginationMixin, ListView):
 
 @login_required
 @permission_required("scipost.can_merge_profiles")
-def profile_duplicates(request):
+def profile_duplicates(
+    request, to_merge: int | None = None, to_merge_into: int | None = None
+):
     """
     List Profiles with potential duplicates; allow to merge if necessary.
     """
@@ -340,7 +342,14 @@ def profile_duplicates(request):
     # context = {
     #     "profile_duplicates": profile_duplicates,
     # }
-    return render(request, "profiles/profile_duplicates.html")
+    return render(
+        request,
+        "profiles/profile_duplicates.html",
+        {
+            "to_merge": to_merge,
+            "to_merge_into": to_merge_into,
+        },
+    )
 
 
 @transaction.atomic
@@ -365,7 +374,9 @@ def _hx_profile_mark_non_duplicate(request, profile1: int, profile2: int):
     "scipost.can_merge_profiles",
     "You do not have permission to create profiles.",
 )
-def _hx_profile_merge(request, to_merge: int, to_merge_into: int):
+def _hx_profile_merge(
+    request, to_merge: int | None = None, to_merge_into: int | None = None
+):
     # Update the post data with the profiles to merge
     duplicate_profiles = Profile.objects.potential_duplicates()
 
@@ -379,7 +390,13 @@ def _hx_profile_merge(request, to_merge: int, to_merge_into: int):
         if merge_form.is_valid():
             profile = merge_form.save()
             messages.success(request, "Profiles merged successfully.")
-
+    elif to_merge and to_merge_into:
+        # A specific pair of profiles to merge was provided,
+        # fetch the profiles even if they are not duplicates
+        merge_form = ProfileMergeForm(
+            queryset=Profile.objects.filter(id__in=[to_merge, to_merge_into]),
+            initial={"to_merge": to_merge, "to_merge_into": to_merge_into},
+        )
     else:
         merge_form = ProfileMergeForm(
             queryset=duplicate_profiles,
-- 
GitLab