Skip to content

Commit 2cbcfc8

Browse files
[ENG-8481] added systems tags management in admin for nodes and preprints (#11371)
* added systems tags management in admin for nodes and preprints * added the ability to remove tags from nodes/registrations/preprints/users
1 parent 7d6c24c commit 2cbcfc8

File tree

18 files changed

+198
-70
lines changed

18 files changed

+198
-70
lines changed

admin/nodes/forms.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
from django import forms
22

33

4+
class AddSystemTagForm(forms.Form):
5+
system_tag_to_add = forms.CharField(label='system_tag_to_add', min_length=1, max_length=1024, required=True)
6+
7+
48
class RegistrationDateForm(forms.Form):
59
registered_date = forms.DateTimeField(
610
widget=forms.DateTimeInput(attrs={'class': 'form-control'}),

admin/nodes/templatetags/node_extras.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,3 +88,8 @@ def get_spam_status(resource):
8888
return mark_safe('<span class="label label-danger">Spam</span>')
8989
elif resource.spam_status == SpamStatus.HAM:
9090
return mark_safe('<span class="label label-success">Ham</span>')
91+
92+
93+
@register.filter
94+
def get_class_name(resource):
95+
return resource.__class__.__name__.lower()

admin/nodes/urls.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,5 +47,7 @@
4747
re_path(r'^(?P<guid>[a-z0-9]+)/update_moderation_state/$', views.NodeUpdateModerationStateView.as_view(), name='node-update-mod-state'),
4848
re_path(r'^(?P<guid>[a-z0-9]+)/resync_datacite/$', views.NodeResyncDataCiteView.as_view(), name='resync-datacite'),
4949
re_path(r'^(?P<guid>[a-z0-9]+)/revert/$', views.NodeRevertToDraft.as_view(), name='revert-to-draft'),
50+
re_path(r'^(?P<guid>[a-z0-9]+)/system_tags/add/$', views.NodeAddSystemTag.as_view(), name='add-system-tag'),
51+
re_path(r'^(?P<guid>[a-z0-9]+)/system_tags/(?P<tag_id>[a-z0-9]+)/remove/$', views.NodeRemoveSystemTag.as_view(), name='remove-system-tag'),
5052
re_path(r'^(?P<guid>[a-z0-9]+)/update_permissions/$', views.NodeUpdatePermissionsView.as_view(), name='update-permissions'),
5153
]

admin/nodes/views.py

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
from admin.base.views import GuidView
2323
from admin.base.forms import GuidForm
2424
from admin.notifications.views import detect_duplicate_notifications, delete_selected_notifications
25-
from admin.nodes.forms import RegistrationDateForm
25+
from admin.nodes.forms import AddSystemTagForm, RegistrationDateForm
2626

2727
from api.share.utils import update_share
2828
from api.caching.tasks import update_storage_usage_cache
@@ -921,3 +921,32 @@ def post(self, request, *args, **kwargs):
921921
registration = self.get_object()
922922
registration.to_draft()
923923
return redirect(self.get_success_url())
924+
925+
926+
class NodeAddSystemTag(NodeMixin, FormView):
927+
""" Allows authorized users to add system tags to a node.
928+
"""
929+
permission_required = 'osf.change_node'
930+
raise_exception = True
931+
form_class = AddSystemTagForm
932+
933+
def form_valid(self, form):
934+
resource = self.get_object()
935+
system_tag_to_add = form.cleaned_data['system_tag_to_add']
936+
resource.add_system_tag(system_tag_to_add)
937+
resource.save()
938+
939+
return super().form_valid(form)
940+
941+
942+
class NodeRemoveSystemTag(NodeMixin, View):
943+
""" Allows authorized users to remove system tags from a node.
944+
"""
945+
permission_required = 'osf.change_node'
946+
raise_exception = True
947+
948+
def post(self, request, *args, **kwargs):
949+
resource = self.get_object()
950+
tag = resource.system_tags_objects.get(id=kwargs['tag_id'])
951+
resource.remove_tag(tag.name, auth=request.user)
952+
return redirect(self.get_success_url())

admin/preprints/urls.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,5 +30,7 @@
3030
re_path(r'^(?P<guid>\w+)/resync_crossref/$', views.PreprintResyncCrossRefView.as_view(), name='resync-crossref'),
3131
re_path(r'^(?P<guid>\w+)/make_published/$', views.PreprintMakePublishedView.as_view(), name='make-published'),
3232
re_path(r'^(?P<guid>\w+)/unwithdraw/$', views.PreprintUnwithdrawView.as_view(), name='unwithdraw'),
33+
re_path(r'^(?P<guid>\w+)/system_tags/add/$', views.PreprintAddSystemTag.as_view(), name='add-system-tag'),
34+
re_path(r'^(?P<guid>\w+)/system_tags/(?P<tag_id>[a-z0-9]+)/remove/$', views.PreprintRemoveSystemTag.as_view(), name='remove-system-tag'),
3335
re_path(r'^(?P<guid>\w+)/update_permissions/$', views.PreprintUpdatePermissionsView.as_view(), name='update-permissions'),
3436
]

admin/preprints/views.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515

1616
from admin.base.views import GuidView
1717
from admin.base.forms import GuidForm
18-
from admin.nodes.views import NodeRemoveContributorView, NodeUpdatePermissionsView
18+
from admin.nodes.views import NodeRemoveContributorView, NodeAddSystemTag, NodeRemoveSystemTag, NodeUpdatePermissionsView
1919
from admin.preprints.forms import ChangeProviderForm, MachineStateForm
2020
from admin.base.utils import osf_staff_check
2121

@@ -743,3 +743,15 @@ def post(self, request, *args, **kwargs):
743743

744744
preprint.save()
745745
return redirect(self.get_success_url())
746+
747+
748+
class PreprintAddSystemTag(PreprintMixin, NodeAddSystemTag):
749+
""" Allows authorized users to add system tags to a preprint.
750+
"""
751+
permission_required = 'osf.change_preprint'
752+
753+
754+
class PreprintRemoveSystemTag(PreprintMixin, NodeRemoveSystemTag):
755+
""" Allows authorized users to remove system tags from a preprint.
756+
"""
757+
permission_required = 'osf.change_preprint'
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
{% load node_extras %}
2+
<tr>
3+
<td>System tags</td>
4+
<td>
5+
<div style="display: flex; justify-content: start;">
6+
{% for system_tag in resource.system_tags_objects %}
7+
{% if resource|get_class_name == 'node' or resource|get_class_name == 'registration' %}
8+
<form method="post" action="{% url 'nodes:remove-system-tag' guid=resource.guid tag_id=system_tag.id %}">
9+
{% elif resource|get_class_name == 'preprint' %}
10+
<form method="post" action="{% url 'preprints:remove-system-tag' guid=resource.guid tag_id=system_tag.id %}">
11+
{% else %}
12+
<form method="post" action="{% url 'users:remove-system-tag' guid=resource.guid tag_id=system_tag.id %}">
13+
{% endif %}
14+
<div>
15+
{% csrf_token %}
16+
<div class="modal-footer">
17+
<span>{{ system_tag.name }}</span>
18+
<input class="btn btn-danger" type="submit" value="Remove" />
19+
</div>
20+
</div>
21+
</form>
22+
{% endfor %}
23+
</div>
24+
<br>
25+
<a class="btn btn-default" data-toggle="modal" data-target="#systemTagModal">
26+
Add system tag
27+
</a>
28+
<div class="modal" id="systemTagModal">
29+
<div class="modal-dialog">
30+
<div class="modal-content">
31+
{% if resource|get_class_name == 'node' or resource|get_class_name == 'registration' %}
32+
<form class="well" method="post" action="{% url 'nodes:add-system-tag' guid=resource.guid %}">
33+
{% elif resource|get_class_name == 'preprint' %}
34+
<form class="well" method="post" action="{% url 'preprints:add-system-tag' guid=resource.guid %}">
35+
{% else %}
36+
<form class="well" method="post" action="{% url 'users:add-system-tag' guid=resource.guid %}">
37+
{% endif%}
38+
<div class="modal-header">
39+
<button type="button" class="close" data-dismiss="modal">x</button>
40+
<h3>Add a system tag to this resource</h3>
41+
</div>
42+
<div class="modal-body">
43+
{% csrf_token %}
44+
<input placeholder="Enter system tag" name="system_tag_to_add">
45+
</div>
46+
<div class="modal-footer">
47+
<input class="btn btn-danger" type="submit" value="Confirm" />
48+
<button type="button" class="btn btn-default"
49+
data-dismiss="modal">
50+
Cancel
51+
</button>
52+
</div>
53+
</form>
54+
</div>
55+
</div>
56+
</div>
57+
</td>
58+
</tr>
59+

admin/templates/nodes/node.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,7 @@ <h2>{{ node.type|cut:'osf.'|title }}: <b>{{ node.title }}</b> <a href="{{ node.a
119119
<td>IA url</td>
120120
<td>{{ node.ia_url }}</td>
121121
</tr>
122+
{% include "nodes/add_system_tags.html" with resource=node %}
122123
{% include "nodes/contributors.html" with node=node %}
123124
{% include "nodes/spam_status.html" with resource=node %}
124125
{% include "nodes/draft_registrations.html" with draft_registrations=node.draft_registrations.all %}

admin/templates/preprints/preprint.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,7 @@ <h2>Preprint: <b>{{ preprint.title }}</b> <a href="{{ preprint.absolute_url }}">
116116
</ul>
117117
</td>
118118
</tr>
119+
{% include "nodes/add_system_tags.html" with resource=preprint %}
119120
{% include "preprints/contributors.html" with preprint=preprint %}
120121
{% include "nodes/spam_status.html" with resource=preprint %}
121122
{% include "preprints/withdraw_request.html" with preprint=preprint %}

admin/templates/users/add_system_tags.html

Lines changed: 0 additions & 35 deletions
This file was deleted.

0 commit comments

Comments
 (0)