From df13d6e7d23c3d349204746ed6fdb8cb90cadb27 Mon Sep 17 00:00:00 2001 From: Vlad0n20 Date: Fri, 19 Sep 2025 01:55:52 +0300 Subject: [PATCH 1/4] Add ability for registration created date to be changed in admin --- admin/nodes/urls.py | 1 + admin/nodes/views.py | 22 ++++++++++++++++++++++ admin/templates/nodes/node.html | 22 ++++++++++++++++++++++ 3 files changed, 45 insertions(+) diff --git a/admin/nodes/urls.py b/admin/nodes/urls.py index 1d5f6e0bac9..a697eccc968 100644 --- a/admin/nodes/urls.py +++ b/admin/nodes/urls.py @@ -18,6 +18,7 @@ re_path(r'^(?P[a-z0-9]+)/logs/$', views.AdminNodeLogView.as_view(), name='node-logs'), re_path(r'^(?P[a-z0-9]+)/schema_responses/$', views.AdminNodeSchemaResponseView.as_view(), name='schema-responses'), + re_path(r'^(?P[a-z0-9]+)/update_registration_date/$', views.RegistrationUpdateDateView.as_view(), name='update-registration-date'), re_path(r'^(?P[a-z0-9]+)/update_embargo/$', views.RegistrationUpdateEmbargoView.as_view(), name='update-embargo'), re_path(r'^(?P[a-z0-9]+)/change_provider/$', views.RegistrationChangeProviderView.as_view(), name='change-provider'), re_path(r'^(?P[a-z0-9]+)/remove/$', views.NodeDeleteView.as_view(), name='remove'), diff --git a/admin/nodes/views.py b/admin/nodes/views.py index db0f0119f18..087cf1aff30 100644 --- a/admin/nodes/views.py +++ b/admin/nodes/views.py @@ -22,6 +22,7 @@ from admin.base.views import GuidView from admin.base.forms import GuidForm from admin.notifications.views import delete_selected_notifications +from admin.nodes.forms import RegistrationDateForm from api.share.utils import update_share from api.caching.tasks import update_storage_usage_cache @@ -89,6 +90,24 @@ def get_success_url(self): return reverse('nodes:node', kwargs={'guid': self.kwargs['guid']}) +class RegistrationUpdateDateView(NodeMixin, View): + permission_required = 'osf.change_node' + raise_exception = True + + def post(self, request, *args, **kwargs): + node = self.get_object() + form = RegistrationDateForm(request.POST) + if form.is_valid(): + new_date = form.cleaned_data['registered_date'] + node.registered_date = new_date + node.created = new_date + node.save() + messages.success(request, 'Registration date updated successfully.') + else: + messages.error(request, 'Please enter a valid date.') + return redirect(self.get_success_url()) + + class NodeView(NodeMixin, GuidView): """ Allows authorized users to view node info. """ @@ -100,6 +119,9 @@ def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) node = self.get_object() + if isinstance(node, Registration): + context['registration_date_form'] = RegistrationDateForm(initial={'registered_date': node.registered_date}) + children = node.get_nodes(is_node_link=False) # Annotate guid because django templates prohibit accessing attributes that start with underscores children = AbstractNode.objects.filter( diff --git a/admin/templates/nodes/node.html b/admin/templates/nodes/node.html index caf8bd5ebc6..177b29ddaf6 100644 --- a/admin/templates/nodes/node.html +++ b/admin/templates/nodes/node.html @@ -42,6 +42,28 @@

{{ node.type|cut:'osf.'|title }}: {{ node.title }} + {% csrf_token %} + {{ registration_date_form.as_p }} + + + + + {% endif %} + {% endif %} Title {{ node.title }} From da9a2156d02b4771757f30958a54937ec03a9ed5 Mon Sep 17 00:00:00 2001 From: Vlad0n20 Date: Fri, 19 Sep 2025 12:27:08 +0300 Subject: [PATCH 2/4] Add form --- admin/nodes/forms.py | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 admin/nodes/forms.py diff --git a/admin/nodes/forms.py b/admin/nodes/forms.py new file mode 100644 index 00000000000..553c465da4a --- /dev/null +++ b/admin/nodes/forms.py @@ -0,0 +1,7 @@ +from django import forms + + +class RegistrationDateForm(forms.Form): + registered_date = forms.DateTimeField( + widget=forms.DateTimeInput(attrs={'class': 'form-control'}), + ) From 0013111866208a1cc7287798ad13be30226253cb Mon Sep 17 00:00:00 2001 From: Ihor Sokhan Date: Tue, 23 Sep 2025 17:00:19 +0300 Subject: [PATCH 3/4] added log for registration date updated action in admin --- admin/nodes/views.py | 12 ++++++++++++ osf/models/nodelog.py | 1 + 2 files changed, 13 insertions(+) diff --git a/admin/nodes/views.py b/admin/nodes/views.py index 087cf1aff30..a363c62ee37 100644 --- a/admin/nodes/views.py +++ b/admin/nodes/views.py @@ -98,10 +98,22 @@ def post(self, request, *args, **kwargs): node = self.get_object() form = RegistrationDateForm(request.POST) if form.is_valid(): + last_date = node.registered_date new_date = form.cleaned_data['registered_date'] node.registered_date = new_date node.created = new_date node.save() + + node.add_log( + action=NodeLog.REGISTRATION_DATE_UPDATED, + auth=request, + params={ + 'last_date': str(last_date), + 'new_date': str(new_date) + }, + log_date=timezone.now(), + should_hide=True, + ) messages.success(request, 'Registration date updated successfully.') else: messages.error(request, 'Please enter a valid date.') diff --git a/osf/models/nodelog.py b/osf/models/nodelog.py index 0297c42bdec..a098a7a0ef8 100644 --- a/osf/models/nodelog.py +++ b/osf/models/nodelog.py @@ -86,6 +86,7 @@ class NodeLog(ObjectIDMixin, BaseModel): CATEGORY_UPDATED = 'category_updated' ARTICLE_DOI_UPDATED = 'article_doi_updated' + REGISTRATION_DATE_UPDATED = 'registration_date_updated' ADDON_ADDED = 'addon_added' ADDON_REMOVED = 'addon_removed' From 2ff111d3f3133bb4ae9a715a648392893068b56f Mon Sep 17 00:00:00 2001 From: Vlad0n20 Date: Wed, 24 Sep 2025 20:47:39 +0300 Subject: [PATCH 4/4] Add REGISTRATION_DATE_UPDATED to activity logs --- admin/nodes/views.py | 2 +- osf/models/nodelog.py | 2 +- website/static/js/logActionsList.json | 1 + 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/admin/nodes/views.py b/admin/nodes/views.py index a363c62ee37..8a67d2b092e 100644 --- a/admin/nodes/views.py +++ b/admin/nodes/views.py @@ -112,7 +112,7 @@ def post(self, request, *args, **kwargs): 'new_date': str(new_date) }, log_date=timezone.now(), - should_hide=True, + should_hide=False, ) messages.success(request, 'Registration date updated successfully.') else: diff --git a/osf/models/nodelog.py b/osf/models/nodelog.py index a098a7a0ef8..b4c39497087 100644 --- a/osf/models/nodelog.py +++ b/osf/models/nodelog.py @@ -154,7 +154,7 @@ class NodeLog(ObjectIDMixin, BaseModel): WIKI_DELETED, WIKI_RENAMED, MADE_WIKI_PUBLIC, MADE_WIKI_PRIVATE, CONTRIB_ADDED, CONTRIB_REMOVED, CONTRIB_REORDERED, CURATOR_ADDED, CURATOR_REMOVED, PERMISSIONS_UPDATED, MADE_PRIVATE, MADE_PUBLIC, TAG_ADDED, TAG_REMOVED, EDITED_TITLE, - EDITED_DESCRIPTION, UPDATED_FIELDS, FILE_MOVED, FILE_COPIED, FILE_METADATA_UPDATED, + EDITED_DESCRIPTION, REGISTRATION_DATE_UPDATED, UPDATED_FIELDS, FILE_MOVED, FILE_COPIED, FILE_METADATA_UPDATED, FOLDER_CREATED, FILE_ADDED, FILE_UPDATED, FILE_REMOVED, FILE_RESTORED, ADDON_ADDED, ADDON_REMOVED, COMMENT_ADDED, COMMENT_REMOVED, COMMENT_UPDATED, COMMENT_RESTORED, MADE_CONTRIBUTOR_VISIBLE, CONFIRM_HAM, FLAG_SPAM, CONFIRM_SPAM, diff --git a/website/static/js/logActionsList.json b/website/static/js/logActionsList.json index 53c5ef02f04..8545c89b8c8 100644 --- a/website/static/js/logActionsList.json +++ b/website/static/js/logActionsList.json @@ -95,6 +95,7 @@ "subjects_updated": "${user} updated the subjects on ${node}", "view_only_link_added": "${user} created ${anonymous_link} view-only link to ${node}", "view_only_link_removed": "${user} removed ${anonymous_link} view-only link to ${node}", + "registration_date_updated": "${user} updated registration date of ${node} from ${last_date} to ${new_date}", "has_coi_updated": "${user} changed the conflict of interest statement availability for ${preprint}.", "coi_statement_updated": "${user} changed the conflict of interest statement for ${preprint}.", "has_data_links_updated": "${user} has updated the has links to data field to ${value}",