From 2a9beafca3eb0e92eaa872dcd33810ae0785eff9 Mon Sep 17 00:00:00 2001 From: Esther Verreau Date: Tue, 26 Mar 2024 09:34:56 -0500 Subject: [PATCH 1/3] use timezone when recording date_published at preprint acceptance --- src/repository/models.py | 18 ++++------------ src/repository/tests/test_views.py | 21 +++++++++++++++++++ src/repository/views.py | 7 +++++-- .../elements/repository/accept_preprint.html | 15 +++++++------ 4 files changed, 37 insertions(+), 24 deletions(-) diff --git a/src/repository/models.py b/src/repository/models.py index a7624ed505..54ea4d63ee 100755 --- a/src/repository/models.py +++ b/src/repository/models.py @@ -642,25 +642,15 @@ def make_new_version(self, file): version=self.next_version_number(), ) - def update_date_published(self, date, time): - self.date_published = dateparser.parse( - '{date} {time}'.format( - date=date, - time=time, - ) - ) + def update_date_published(self, date_published): + self.date_published = date_published self.save() - def accept(self, date, time): + def accept(self, date_published): self.date_accepted = timezone.now() self.date_declined = None self.stage = STAGE_PREPRINT_PUBLISHED - self.date_published = dateparser.parse( - '{date} {time}'.format( - date=date, - time=time, - ) - ) + self.date_published = date_published self.save() def decline(self, note): diff --git a/src/repository/tests/test_views.py b/src/repository/tests/test_views.py index 61af74195b..bb93f1cf93 100644 --- a/src/repository/tests/test_views.py +++ b/src/repository/tests/test_views.py @@ -13,7 +13,11 @@ from utils.install import update_settings from core import models as cm from repository import models as rm, install +from freezegun import freeze_time +from dateutil import tz + +FROZEN_DATETIME = timezone.datetime(2024, 3, 25, 10, 0, tzinfo=tz.gettz("America/Chicago")) class TestModels(TestCase): def setUp(self): @@ -269,3 +273,20 @@ def test_edit_review_comment(self): comment.body, 'This is my slightly different review.', ) + + @override_settings(URL_CONFIG='domain') + @freeze_time(FROZEN_DATETIME, tz_offset=5) + def test_accept_preprint(self): + self.preprint_one.make_new_version(self.preprint_one.submission_file) + path = reverse('repository_manager_article', + kwargs={'preprint_id': self.preprint_one.pk,}) + self.client.force_login(self.repo_manager) + self.client.post(path, + data={ + 'accept': '', + 'datetime': "2024-03-25 10:00", + 'timezone': "America/Chicago" + }, + SERVER_NAME=self.server_name,) + p = rm.Preprint.objects.get(pk=self.preprint_one.pk) + self.assertEqual(p.date_published, p.date_accepted) diff --git a/src/repository/views.py b/src/repository/views.py index ae9941471d..d927afd8c5 100644 --- a/src/repository/views.py +++ b/src/repository/views.py @@ -6,6 +6,7 @@ import operator from dateutil.relativedelta import relativedelta from datetime import datetime +from dateutil import tz from django.shortcuts import render, redirect, get_object_or_404 from django.utils import timezone @@ -879,9 +880,11 @@ def repository_manager_article(request, preprint_id): 'You must assign at least one galley file.', ) else: + d = datetime.fromisoformat(request.POST.get('datetime', timezone.now().strftime("%Y-%m-%d %H:%M"))) + t = tz.gettz(request.POST.get('timezone', str(timezone.get_current_timezone()))) + date_published = datetime(d.year, d.month, d.day, d.hour, d.minute, tzinfo=t) date_kwargs = { - 'date': request.POST.get('date', timezone.now().date()), - 'time': request.POST.get('time', timezone.now().time()), + 'date_published': date_published } if preprint.date_published: preprint.update_date_published(**date_kwargs) diff --git a/src/templates/admin/elements/repository/accept_preprint.html b/src/templates/admin/elements/repository/accept_preprint.html index a42626e424..b7b71bd5e7 100644 --- a/src/templates/admin/elements/repository/accept_preprint.html +++ b/src/templates/admin/elements/repository/accept_preprint.html @@ -1,3 +1,4 @@ +{% load tz %}
@@ -19,14 +20,12 @@

{% csrf_token %}
-
- - -
-
- - -
+
+ + + {% get_current_timezone as TIME_ZONE %} + +
From 28559c214a15150d8102d0b99e03cf6d39d556c8 Mon Sep 17 00:00:00 2001 From: Esther Verreau Date: Mon, 8 Apr 2024 10:43:52 -0500 Subject: [PATCH 2/3] make label a little more clear --- src/templates/admin/elements/repository/accept_preprint.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/templates/admin/elements/repository/accept_preprint.html b/src/templates/admin/elements/repository/accept_preprint.html index b7b71bd5e7..d16a55a36c 100644 --- a/src/templates/admin/elements/repository/accept_preprint.html +++ b/src/templates/admin/elements/repository/accept_preprint.html @@ -21,7 +21,7 @@

{% csrf_token %}
- + {% get_current_timezone as TIME_ZONE %} From e1710f7e64a8e461c0a67966fd68712afefb459d Mon Sep 17 00:00:00 2001 From: Esther Verreau Date: Tue, 16 Apr 2024 11:25:20 -0500 Subject: [PATCH 3/3] handle invalid date --- src/repository/tests/test_views.py | 21 ++++++++++- src/repository/views.py | 58 ++++++++++++++++++------------ 2 files changed, 56 insertions(+), 23 deletions(-) diff --git a/src/repository/tests/test_views.py b/src/repository/tests/test_views.py index bb93f1cf93..2361345dcc 100644 --- a/src/repository/tests/test_views.py +++ b/src/repository/tests/test_views.py @@ -289,4 +289,23 @@ def test_accept_preprint(self): }, SERVER_NAME=self.server_name,) p = rm.Preprint.objects.get(pk=self.preprint_one.pk) - self.assertEqual(p.date_published, p.date_accepted) + self.assertEqual(p.date_published, FROZEN_DATETIME) + self.assertEqual(p.date_accepted, FROZEN_DATETIME) + + @override_settings(URL_CONFIG='domain') + @freeze_time(FROZEN_DATETIME, tz_offset=5) + def test_accept_preprint_bad_date(self): + self.preprint_one.make_new_version(self.preprint_one.submission_file) + path = reverse('repository_manager_article', + kwargs={'preprint_id': self.preprint_one.pk,}) + self.client.force_login(self.repo_manager) + self.client.post(path, + data={ + 'accept': '', + 'datetime': "2024-35-35 10:00", + 'timezone': "America/Chicago" + }, + SERVER_NAME=self.server_name,) + p = rm.Preprint.objects.get(pk=self.preprint_one.pk) + self.assertIsNone(p.date_published) + self.assertIsNone(p.date_accepted) diff --git a/src/repository/views.py b/src/repository/views.py index d927afd8c5..e205ce0311 100644 --- a/src/repository/views.py +++ b/src/repository/views.py @@ -879,32 +879,46 @@ def repository_manager_article(request, preprint_id): messages.WARNING, 'You must assign at least one galley file.', ) + redirect_request = False else: - d = datetime.fromisoformat(request.POST.get('datetime', timezone.now().strftime("%Y-%m-%d %H:%M"))) - t = tz.gettz(request.POST.get('timezone', str(timezone.get_current_timezone()))) - date_published = datetime(d.year, d.month, d.day, d.hour, d.minute, tzinfo=t) - date_kwargs = { - 'date_published': date_published - } - if preprint.date_published: - preprint.update_date_published(**date_kwargs) - else: - preprint.accept(**date_kwargs) - event_logic.Events.raise_event( - event_logic.Events.ON_PREPRINT_PUBLICATION, - **{ - 'request': request, - 'preprint': preprint, - }, - ) - return redirect( - reverse( - 'repository_notification', - kwargs={'preprint_id': preprint.pk}, + try: + d = datetime.fromisoformat(request.POST.get('datetime', timezone.now().strftime("%Y-%m-%d %H:%M"))) + t = tz.gettz(request.POST.get('timezone', str(timezone.get_current_timezone()))) + + date_published = datetime(d.year, d.month, d.day, d.hour, d.minute, tzinfo=t) + date_kwargs = { + 'date_published': date_published + } + if preprint.date_published: + preprint.update_date_published(**date_kwargs) + else: + preprint.accept(**date_kwargs) + event_logic.Events.raise_event( + event_logic.Events.ON_PREPRINT_PUBLICATION, + **{ + 'request': request, + 'preprint': preprint, + }, + ) + return redirect( + reverse( + 'repository_notification', + kwargs={'preprint_id': preprint.pk}, + ) ) + redirect_request = True + except ValueError: + # This is unlikely to happen because the form widget + # does not accept invalid dates. If we somehow get a bad + # date just send the user back to the accept_preprint modal + redirect_request = False + modal = "accept_preprint" + messages.add_message( + request, + messages.ERROR, + 'Invalid publication date selected', ) - redirect_request = True if 'decline' in request.POST: note = request.POST.get('decline_note')