Skip to content

Commit 4a328c9

Browse files
authored
allow admins change registration providers (#11145)
## Purpose allow admins change registration providers ## Changes - add a dropdown menu to provider section on admin UI - add endpoint that allows to update registration provider ## Ticket https://openscience.atlassian.net/browse/ENG-7977
1 parent bcd86db commit 4a328c9

File tree

5 files changed

+53
-6
lines changed

5 files changed

+53
-6
lines changed

admin/nodes/urls.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
re_path(r'^(?P<guid>[a-z0-9]+)/schema_responses/$', views.AdminNodeSchemaResponseView.as_view(),
2020
name='schema-responses'),
2121
re_path(r'^(?P<guid>[a-z0-9]+)/update_embargo/$', views.RegistrationUpdateEmbargoView.as_view(), name='update-embargo'),
22+
re_path(r'^(?P<guid>[a-z0-9]+)/change_provider/$', views.RegistrationChangeProviderView.as_view(), name='change-provider'),
2223
re_path(r'^(?P<guid>[a-z0-9]+)/remove/$', views.NodeDeleteView.as_view(), name='remove'),
2324
re_path(r'^(?P<guid>[a-z0-9]+)/restore/$', views.NodeDeleteView.as_view(), name='restore'),
2425
re_path(r'^(?P<guid>[a-z0-9]+)/confirm_spam/$', views.NodeConfirmSpamView.as_view(), name='confirm-spam'),

admin/nodes/views.py

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
ListView,
1717
TemplateView,
1818
)
19-
from django.shortcuts import redirect, reverse
19+
from django.shortcuts import redirect, reverse, get_object_or_404
2020
from django.urls import reverse_lazy
2121

2222
from admin.base.utils import change_embargo_date
@@ -33,6 +33,7 @@
3333
NodeLog,
3434
AbstractNode,
3535
Registration,
36+
RegistrationProvider,
3637
RegistrationApproval,
3738
SpamStatus
3839
)
@@ -398,6 +399,28 @@ def post(self, request, *args, **kwargs):
398399
return redirect(self.get_success_url())
399400

400401

402+
class RegistrationChangeProviderView(NodeMixin, View):
403+
""" Allows authorized users to update provider of a registration.
404+
"""
405+
permission_required = ('osf.change_node')
406+
407+
def post(self, request, *args, **kwargs):
408+
provider_id = int(request.POST.get('provider_id'))
409+
provider = get_object_or_404(RegistrationProvider, pk=provider_id)
410+
registration = self.get_object()
411+
412+
try:
413+
provider.validate_schema(registration.registration_schema)
414+
registration.provider = provider
415+
registration.save()
416+
except ValidationError as exc:
417+
messages.error(request, str(exc))
418+
else:
419+
messages.success(request, 'Provider successfully changed.')
420+
421+
return redirect(self.get_success_url())
422+
423+
401424
class NodeSpamList(PermissionRequiredMixin, ListView):
402425
""" Allows authorized users to view a list of nodes that have a particular spam status.
403426
"""

admin/templates/nodes/node.html

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -78,11 +78,9 @@ <h2>{{ node.type|cut:'osf.'|title }}: <b>{{ node.title }}</b> <a href="{{ node.a
7878
</tr>
7979
<tr>
8080
<td>Provider</td>
81-
{% if node.provider %}
82-
<td><a href="{{ node | reverse_registration_provider }}">{{ node.provider.name }}</a></td>
83-
{% else %}
84-
<td>None</td>
85-
{% endif %}
81+
<td>
82+
{% include "nodes/registration_provider.html" with node=node %}
83+
</td>
8684
</tr>
8785
<tr>
8886
<td>Parent</td>
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
{% load node_extras %}
2+
3+
{% if node.provider %}
4+
<form id="provider-list-form" method="post" action="{% url 'nodes:change-provider' guid=node.guid %}">
5+
{% csrf_token %}
6+
<select id="provider-list" name="provider_id" onchange="this.form.submit()">
7+
<option value="{{ node.provider.id }}">{{ node.provider.name }}</option> <!-- default value -->
8+
{% for provider in node.available_providers %}
9+
{% if not provider.id == node.provider.id %}
10+
<option value="{{ provider.id }}">{{ provider.name }}</option>
11+
{% endif %}
12+
{% endfor %}
13+
</select>
14+
</form>
15+
{% else %}
16+
<p>None</p>
17+
{% endif %}

osf/models/registrations.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -368,6 +368,14 @@ def date_withdrawn(self):
368368
def withdrawal_justification(self):
369369
return getattr(self.root.retraction, 'justification', None)
370370

371+
@property
372+
def available_providers(self):
373+
"""Return all providers that support current registration schema."""
374+
schema = self.registration_schema
375+
if not schema:
376+
return RegistrationProvider.objects.none()
377+
return RegistrationProvider.objects.filter(schemas=schema)
378+
371379
@property
372380
def provider_specific_metadata(self):
373381
"""Surfaces the additional_metadata fields supported by the provider.

0 commit comments

Comments
 (0)