diff --git a/freedoi/resolver/forms.py b/freedoi/resolver/forms.py
index 629c0e1..822355c 100644
--- a/freedoi/resolver/forms.py
+++ b/freedoi/resolver/forms.py
@@ -33,6 +33,12 @@ class SuffixForm(forms.ModelForm):
self.fields["prefix"].widget.attrs["readonly"] = True
+class SuffixApprovalForm(forms.ModelForm):
+ class Meta:
+ model = Suffix
+ fields = ["name", "suffix", "description"]
+
+
class IdentifierForm(forms.ModelForm):
class Meta:
model = Identifier
diff --git a/freedoi/resolver/migrations/0007_suffix_description.py b/freedoi/resolver/migrations/0007_suffix_description.py
new file mode 100644
index 0000000..5ff50f5
--- /dev/null
+++ b/freedoi/resolver/migrations/0007_suffix_description.py
@@ -0,0 +1,18 @@
+# Generated by Django 5.0.6 on 2024-06-23 08:00
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ("resolver", "0006_alter_suffix_options_alter_prefix_owner_and_more"),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name="suffix",
+ name="description",
+ field=models.TextField(blank=True),
+ ),
+ ]
diff --git a/freedoi/resolver/templates/base_generic.html b/freedoi/resolver/templates/base_generic.html
index 8a12f72..f68899f 100644
--- a/freedoi/resolver/templates/base_generic.html
+++ b/freedoi/resolver/templates/base_generic.html
@@ -34,16 +34,12 @@
{% if user.is_authenticated %}
{% if user.is_superuser or user.prefixes.exists %}
- Prefixes
+ Your Prefixes
{% endif %}
- Suffixes
+ Your Suffixes
-
- Identifiers
Logout
diff --git a/freedoi/resolver/templates/resolver/pending_suffixes_list.html b/freedoi/resolver/templates/resolver/pending_suffixes_list.html
new file mode 100644
index 0000000..745f421
--- /dev/null
+++ b/freedoi/resolver/templates/resolver/pending_suffixes_list.html
@@ -0,0 +1,13 @@
+{% extends "base_generic.html" %} {% block title %}Pending Suffixes
+{% endblock %} {% block content %}
+
+{% endblock %}
diff --git a/freedoi/resolver/templates/resolver/suffix_approval_form.html b/freedoi/resolver/templates/resolver/suffix_approval_form.html
new file mode 100644
index 0000000..cba7ce5
--- /dev/null
+++ b/freedoi/resolver/templates/resolver/suffix_approval_form.html
@@ -0,0 +1,13 @@
+{% extends "base_generic.html" %} {% block title %}Approve Suffix{% endblock %}
+{% load crispy_forms_tags %}{% block content %}
+
+{% endblock %}
diff --git a/freedoi/resolver/templates/resolver/suffix_detail.html b/freedoi/resolver/templates/resolver/suffix_detail.html
index b5829e7..8f31d7d 100644
--- a/freedoi/resolver/templates/resolver/suffix_detail.html
+++ b/freedoi/resolver/templates/resolver/suffix_detail.html
@@ -5,7 +5,10 @@
Suffix: {{ object.suffix }}
Prefix: {{ object.prefix }}
Type: {{ object.get_type_display }}
- Remote Resolver: {{ object.remote_resolver }}
+ {% if object.type == "remote" %}
+ Remote Resolver: {{ object.remote_resolver }}
+ {% endif %}
+ Approval: {% if object.approved %}Approved{% else %}Pending{% endif %}
Edit
diff --git a/freedoi/resolver/templates/resolver/suffix_list.html b/freedoi/resolver/templates/resolver/suffix_list.html
index 1af95f8..aa6699e 100644
--- a/freedoi/resolver/templates/resolver/suffix_list.html
+++ b/freedoi/resolver/templates/resolver/suffix_list.html
@@ -5,7 +5,7 @@
diff --git a/freedoi/resolver/urls.py b/freedoi/resolver/urls.py
index 0132fa0..ec910d5 100644
--- a/freedoi/resolver/urls.py
+++ b/freedoi/resolver/urls.py
@@ -12,17 +12,19 @@ from .views import (
SuffixCreateView,
SuffixUpdateView,
SuffixDeleteView,
- IdentifierListView,
+ SuffixIdentifierListView,
IdentifierDetailView,
IdentifierCreateView,
IdentifierUpdateView,
IdentifierDeleteView,
- SuffixIdentifierListView,
+ PermissionCreateView,
+ PendingSuffixesListView,
+ SuffixApprovalView,
)
urlpatterns = [
path("", HomeView.as_view(), name="home"),
- path(".//", resolve_doi, name="resolve_doi"),
+ path(".//", resolve_doi, name="resolve_doi"),
path("prefixes/", PrefixListView.as_view(), name="prefix_list"),
path("prefixes//", PrefixDetailView.as_view(), name="prefix_detail"),
path("prefixes/create/", PrefixCreateView.as_view(), name="prefix_create"),
@@ -33,28 +35,42 @@ urlpatterns = [
path("suffixes/create/", SuffixCreateView.as_view(), name="suffix_create"),
path("suffixes//update/", SuffixUpdateView.as_view(), name="suffix_update"),
path("suffixes//delete/", SuffixDeleteView.as_view(), name="suffix_delete"),
- path("identifiers/", IdentifierListView.as_view(), name="identifier_list"),
path(
- "identifiers//",
+ "suffixes//identifiers/",
+ SuffixIdentifierListView.as_view(),
+ name="identifier_list",
+ ),
+ path(
+ "suffixes//identifiers//",
IdentifierDetailView.as_view(),
name="identifier_detail",
),
path(
- "identifiers/create/", IdentifierCreateView.as_view(), name="identifier_create"
+ "suffixes//identifiers/create/",
+ IdentifierCreateView.as_view(),
+ name="identifier_create",
),
path(
- "identifiers//update/",
+ "suffixes//identifiers//update/",
IdentifierUpdateView.as_view(),
name="identifier_update",
),
path(
- "identifiers//delete/",
+ "suffixes//identifiers//delete/",
IdentifierDeleteView.as_view(),
name="identifier_delete",
),
- path('suffixes//identifiers/', SuffixIdentifierListView.as_view(), name='identifier_list'),
- path('suffixes//identifiers//', IdentifierDetailView.as_view(), name='identifier_detail'),
- path('suffixes//identifiers/create/', IdentifierCreateView.as_view(), name='identifier_create'),
- path('suffixes//identifiers//update/', IdentifierUpdateView.as_view(), name='identifier_update'),
- path('suffixes//identifiers//delete/', IdentifierDeleteView.as_view(), name='identifier_delete'),
+ path(
+ "permissions/create/",
+ PermissionCreateView.as_view(),
+ name="permission_create",
+ ),
+ path(
+ "pending-suffixes/", PendingSuffixesListView.as_view(), name="pending_suffixes"
+ ),
+ path(
+ "suffixes//approve/",
+ SuffixApprovalView.as_view(),
+ name="suffix_approval",
+ ),
]
diff --git a/freedoi/resolver/views.py b/freedoi/resolver/views.py
index e04a58c..75533c3 100644
--- a/freedoi/resolver/views.py
+++ b/freedoi/resolver/views.py
@@ -11,7 +11,13 @@ from django.views.generic import (
from django.shortcuts import get_object_or_404, redirect
from django.http import HttpResponseBadRequest, Http404
from .models import Prefix, Suffix, Identifier, Permission
-from .forms import PrefixForm, SuffixForm, IdentifierForm, PermissionForm
+from .forms import (
+ PrefixForm,
+ SuffixForm,
+ IdentifierForm,
+ PermissionForm,
+ SuffixApprovalForm,
+)
def resolve_doi(request, prefix, suffix, identifier):
@@ -154,6 +160,7 @@ class SuffixCreateView(LoginRequiredMixin, CreateView):
def dispatch(self, request, *args, **kwargs):
if request.user.suffix_set.count() >= request.user.maximum_suffixes:
return self.handle_no_permission()
+
return super().dispatch(request, *args, **kwargs)
def get_form_kwargs(self):
@@ -185,6 +192,30 @@ class SuffixUpdateView(LoginRequiredMixin, CustomPermissionMixin, UpdateView):
return kwargs
+class PendingSuffixesListView(LoginRequiredMixin, ListView):
+ model = Suffix
+ template_name = "resolver/pending_suffixes_list.html"
+ context_object_name = "pending_suffixes"
+
+ def get_queryset(self):
+ return Suffix.objects.filter(prefix__owner=self.request.user, approved=False)
+
+
+class SuffixApprovalView(LoginRequiredMixin, UpdateView):
+ model = Suffix
+ form_class = SuffixApprovalForm
+ template_name = "resolver/suffix_approval_form.html"
+ context_object_name = "suffix"
+ success_url = "/pending-suffixes/"
+
+ def get_queryset(self):
+ return Suffix.objects.filter(prefix__owner=self.request.user, approved=False)
+
+ def form_valid(self, form):
+ form.instance.approved = True
+ return super().form_valid(form)
+
+
class SuffixDeleteView(LoginRequiredMixin, CustomPermissionMixin, DeleteView):
model = Suffix
template_name = "resolver/suffix_confirm_delete.html"