From b059cc2fdbee3d01c2eb67301cf6330f22e774b5 Mon Sep 17 00:00:00 2001
From: Jonathan Weth <git@jonathanweth.de>
Date: Fri, 5 Nov 2021 12:08:08 +0100
Subject: [PATCH] Refactor edit and create views for OAuth2 applications to use
 the same custom form

---
 aleksis/core/forms.py                         | 13 +++++++++++
 .../oauth2_provider/application/create.html   | 17 ++++++++++++++
 .../oauth2_provider/application/edit.html     | 17 ++++++++++++++
 .../oauth2_provider/application_detail.html   | 10 +--------
 .../oauth2_provider/application_form.html     | 21 ------------------
 .../oauth2_provider/application_list.html     |  5 ++---
 aleksis/core/urls.py                          | 11 +++++++++-
 aleksis/core/views.py                         | 22 +++++++++++--------
 8 files changed, 73 insertions(+), 43 deletions(-)
 create mode 100644 aleksis/core/templates/oauth2_provider/application/create.html
 create mode 100644 aleksis/core/templates/oauth2_provider/application/edit.html
 delete mode 100644 aleksis/core/templates/oauth2_provider/application_form.html

diff --git a/aleksis/core/forms.py b/aleksis/core/forms.py
index 740fd24b3..d8f5d0dee 100644
--- a/aleksis/core/forms.py
+++ b/aleksis/core/forms.py
@@ -22,6 +22,7 @@ from .models import (
     DashboardWidget,
     Group,
     GroupType,
+    OAuthApplication,
     Person,
     SchoolTerm,
 )
@@ -590,3 +591,15 @@ class ListActionForm(ActionForm):
         self.items = items
         super().__init__(request, *args, **kwargs)
         self.fields["selected_objects"].choices = self._get_choices()
+
+
+class OAuthApplicationForm(forms.ModelForm):
+    class Meta:
+        model = OAuthApplication
+        fields = (
+            "name",
+            "client_id",
+            "client_secret",
+            "client_type",
+            "redirect_uris",
+        )
diff --git a/aleksis/core/templates/oauth2_provider/application/create.html b/aleksis/core/templates/oauth2_provider/application/create.html
new file mode 100644
index 000000000..38b9a8d02
--- /dev/null
+++ b/aleksis/core/templates/oauth2_provider/application/create.html
@@ -0,0 +1,17 @@
+{% extends "core/base.html" %}
+
+{% load i18n material_form %}
+
+{% block browser_title %}{% blocktrans %}Register OAuth2 Application{% endblocktrans %}{% endblock %}
+{% block page_title %}{% blocktrans %}Register OAuth2 Application{% endblocktrans %}{% endblock %}
+
+{% block content %}
+  <form method="post">
+    {% csrf_token %}
+    {% form form=form %}{% endform %}
+    {% include "core/partials/save_button.html" %}
+    <a class="btn waves-effect red waves-light" href="{% url "oauth_list" %}">
+      <i class="material-icons left">clear</i> {% trans "Cancel" %}
+    </a>
+  </form>
+{% endblock %}
diff --git a/aleksis/core/templates/oauth2_provider/application/edit.html b/aleksis/core/templates/oauth2_provider/application/edit.html
new file mode 100644
index 000000000..ac2b7d346
--- /dev/null
+++ b/aleksis/core/templates/oauth2_provider/application/edit.html
@@ -0,0 +1,17 @@
+{% extends "core/base.html" %}
+
+{% load i18n material_form %}
+
+{% block browser_title %}{% blocktrans %}Edit OAuth2 Application{% endblocktrans %}{% endblock %}
+{% block page_title %}{% blocktrans %}Edit OAuth2 Application{% endblocktrans %}{% endblock %}
+
+{% block content %}
+  <form method="post">
+    {% csrf_token %}
+    {% form form=form %}{% endform %}
+    {% include "core/partials/save_button.html" %}
+    <a class="btn waves-effect red waves-light" href="{% url "oauth_detail" application.id %}">
+      <i class="material-icons left">clear</i> {% trans "Cancel" %}
+    </a>
+  </form>
+{% endblock %}
diff --git a/aleksis/core/templates/oauth2_provider/application_detail.html b/aleksis/core/templates/oauth2_provider/application_detail.html
index 63f51ad51..093bc3719 100644
--- a/aleksis/core/templates/oauth2_provider/application_detail.html
+++ b/aleksis/core/templates/oauth2_provider/application_detail.html
@@ -12,7 +12,7 @@
 {% endblock %}
 
 {% block content %}
-  <a class="btn waves-effect waves-light btn-margin" href="{% url "oauth_update" application.id %}">
+  <a class="btn waves-effect waves-light btn-margin" href="{% url "edit_oauth_application" application.id %}">
     <i class="material-icons left">edit</i>
     {% trans "Edit" %}
   </a>
@@ -46,14 +46,6 @@
           {{ application.client_type }}
         </td>
       </tr>
-      <tr>
-        <th>
-          {% trans "Authorization Grant Type"%}
-        </td>
-        <td>
-          {{ application.authorization_grant_type }}
-        </td>
-      </tr>
       <tr>
         <th>
           {% trans "Redirect URIs"%}
diff --git a/aleksis/core/templates/oauth2_provider/application_form.html b/aleksis/core/templates/oauth2_provider/application_form.html
deleted file mode 100644
index 520fa1074..000000000
--- a/aleksis/core/templates/oauth2_provider/application_form.html
+++ /dev/null
@@ -1,21 +0,0 @@
-{% extends "core/base.html" %}
-
-{% load i18n material_form %}
-
-{% block browser_title %}{% blocktrans %}Create OAuth2 Application{% endblocktrans %}{% endblock %}
-
-{% block content %}
-  <h4 class="block-center-heading">
-    {% block app-form-title %}
-      {% blocktrans with application_name=application.name %}Edit application{% endblocktrans %}
-    {% endblock app-form-title %}
-  </h4>
-  <form method="post">
-    {% csrf_token %}
-    {% form form=form %}{% endform %}
-    {% include "core/partials/save_button.html" %}
-    <a class="btn waves-effect red waves-light" href="{% block app-form-back-url %}{% url "oauth_detail" application.id %}{% endblock app-form-back-url %}">
-      <i class="material-icons left">clear</i> {% trans "Cancel"%}
-    </a>
-  </form>
-{% endblock %}
diff --git a/aleksis/core/templates/oauth2_provider/application_list.html b/aleksis/core/templates/oauth2_provider/application_list.html
index 4b999bef2..894315940 100644
--- a/aleksis/core/templates/oauth2_provider/application_list.html
+++ b/aleksis/core/templates/oauth2_provider/application_list.html
@@ -6,10 +6,9 @@
 
 {% block content %}
   <h1>{% blocktrans %}OAuth2 applications{% endblocktrans %}</h1>
-  <a href="{% url "oauth2_provider:register" %}" class="btn green waves-effect
-  waves-light">
+  <a href="{% url "register_oauth_application" %}" class="btn green waves-effect waves-light">
     <i class="material-icons left">add</i>
-    {% blocktrans %}Register new applications{% endblocktrans %}
+    {% blocktrans %}Register new application{% endblocktrans %}
   </a>
   <ul class="collection">
   {% for application in applications %}
diff --git a/aleksis/core/urls.py b/aleksis/core/urls.py
index b3c2cc468..85f91a2cc 100644
--- a/aleksis/core/urls.py
+++ b/aleksis/core/urls.py
@@ -103,9 +103,18 @@ urlpatterns = [
         name="oidc_configuration",
     ),
     path("oauth/applications/", views.OAuth2List.as_view(), name="oauth_list"),
+    path(
+        "oauth/applications/register/",
+        views.OAuth2RegisterView.as_view(),
+        name="register_oauth_application",
+    ),
     path("oauth/applications/<int:pk>/detail", views.OAuth2Detail.as_view(), name="oauth_detail"),
     path("oauth/applications/<int:pk>/delete", views.OAuth2Delete.as_view(), name="oauth_delete"),
-    path("oauth/applications/<int:pk>/update", views.OAuth2Update.as_view(), name="oauth_update"),
+    path(
+        "oauth/applications/<int:pk>/edit/",
+        views.OAuth2EditView.as_view(),
+        name="edit_oauth_application",
+    ),
     path("oauth/", include("oauth2_provider.urls", namespace="oauth2_provider")),
     path("__i18n__/", include("django.conf.urls.i18n")),
     path(
diff --git a/aleksis/core/views.py b/aleksis/core/views.py
index e50799699..1a73deee1 100644
--- a/aleksis/core/views.py
+++ b/aleksis/core/views.py
@@ -26,7 +26,7 @@ from django.views.decorators.cache import never_cache
 from django.views.defaults import ERROR_500_TEMPLATE_NAME
 from django.views.generic.base import TemplateView, View
 from django.views.generic.detail import DetailView, SingleObjectMixin
-from django.views.generic.edit import DeleteView, UpdateView
+from django.views.generic.edit import DeleteView
 from django.views.generic.list import ListView
 
 import reversion
@@ -59,6 +59,7 @@ from .forms import (
     EditGroupForm,
     EditGroupTypeForm,
     GroupPreferenceForm,
+    OAuthApplicationForm,
     PersonForm,
     PersonPreferenceForm,
     SchoolTermForm,
@@ -1066,22 +1067,25 @@ class OAuth2Delete(PermissionRequiredMixin, DeleteView):
         return OAuthApplication.objects.all()
 
 
-class OAuth2Update(PermissionRequiredMixin, UpdateView):
+class OAuth2EditView(PermissionRequiredMixin, AdvancedEditView):
     """View used to update an application."""
 
     permission_required = "core.update_oauth_applications_rule"
     context_object_name = "application"
-    template_name = "oauth2_provider/application_form.html"
+    template_name = "oauth2_provider/application/edit.html"
+    form_class = OAuthApplicationForm
 
     def get_queryset(self):
         return OAuthApplication.objects.all()
 
-    def get_form_class(self):
-        """Return the form class for the application model."""
-        return modelform_factory(
-            OAuthApplication,
-            fields=("name", "client_id", "client_secret", "client_type", "redirect_uris",),
-        )
+
+class OAuth2RegisterView(PermissionRequiredMixin, AdvancedCreateView):
+    """View used to register an application."""
+
+    permission_required = "core.add_oauth_applications_rule"
+    context_object_name = "application"
+    template_name = "oauth2_provider/application/create.html"
+    form_class = OAuthApplicationForm
 
 
 class RedirectToPDFFile(SingleObjectMixin, View):
-- 
GitLab