diff --git a/fetc/settings.py b/fetc/settings.py
index 6b753f47e..b76c91907 100644
--- a/fetc/settings.py
+++ b/fetc/settings.py
@@ -158,7 +158,7 @@
MENU_HIDE_EMPTY = False
# Base URL
-BASE_URL = "127.0.0.1:8000"
+BASE_URL = "https://127.0.0.1:8000"
# CSRF Setting
CSRF_FAILURE_VIEW = "main.error_views.csrf_failure"
diff --git a/locale/en/LC_MESSAGES/django.po b/locale/en/LC_MESSAGES/django.po
index bb8bff483..d4aad40aa 100644
--- a/locale/en/LC_MESSAGES/django.po
+++ b/locale/en/LC_MESSAGES/django.po
@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2024-03-28 14:43+0100\n"
+"POT-Creation-Date: 2024-04-04 11:51+0200\n"
"PO-Revision-Date: 2024-01-17 10:48+0100\n"
"Last-Translator: Anna Asbury Kies hier de geschikte route en commissieleden voor de aanvraag "
-"%(title)s. klik hier voor een "
+"%(title)s. Klik hier voor een "
"overzicht van de werkverdeling van deze commissie. Choose the appropriate route and committee members for the application "
@@ -3931,7 +3941,7 @@ msgid "Verplaats naar andere kamer"
msgstr "Move study to different reviewing chamber"
#: reviews/templates/reviews/vue_templates/review_list.html:95
-#: reviews/utils/review_actions.py:264
+#: reviews/utils/review_actions.py:266
msgid "Verberg aanvraag uit het archief"
msgstr "Remove this application from the archive"
@@ -4000,30 +4010,34 @@ msgid "Toestemmingsdocument observatie"
msgstr "Consent document for observation"
#: reviews/utils/review_actions.py:118
+msgid "Pas jouw beslissing en/of commentaar aan"
+msgstr "Edit your feedback on this proposal"
+
+#: reviews/utils/review_actions.py:120
msgid "Geef jouw beslissing en/of commentaar door"
msgstr "Provide feedback on this proposal"
-#: reviews/utils/review_actions.py:141
+#: reviews/utils/review_actions.py:143
msgid "Deze versie afhandelen"
msgstr "Conclude this version"
-#: reviews/utils/review_actions.py:169
+#: reviews/utils/review_actions.py:171
msgid "Beëindig definitief de afhandeling van deze aanvraag"
msgstr "Discontinue assessment of this application"
-#: reviews/utils/review_actions.py:197
+#: reviews/utils/review_actions.py:199
msgid "Verander aangestelde commissieleden"
msgstr "Change appointment of committee members"
-#: reviews/utils/review_actions.py:229
+#: reviews/utils/review_actions.py:231
msgid "Datum van bevestigingsbrief aanpassen"
msgstr "Change date of confirmation letter"
-#: reviews/utils/review_actions.py:266
+#: reviews/utils/review_actions.py:268
msgid "Plaats aanvraag in het archief."
msgstr "Add this application to the archive"
-#: reviews/utils/review_actions.py:283
+#: reviews/utils/review_actions.py:285
msgid "Startdatum wijzigen"
msgstr "Edit start date"
@@ -4164,11 +4178,11 @@ msgstr "My results"
msgid "Openstaande besluiten commissieleden"
msgstr "Pending decisions committee members"
-#: reviews/views.py:203
+#: reviews/views.py:208
msgid "Openstaande besluiten eindverantwoordelijken"
msgstr "Pending decisions supervisors"
-#: reviews/views.py:600
+#: reviews/views.py:605
msgid ""
"Deze aanvraag is al beoordeeld, dus je kan je beoordeling niet meer "
"toevoegen/aanpassen"
@@ -4901,8 +4915,8 @@ msgid ""
"Je hebt aangegeven dat traject {} sessie's en taken bevat, maar er zijn nog "
"geen sessie's aangemaakt."
msgstr ""
-"You have indicated that trajectory {} involves tasks and sessions, but "
-"no sessions have been added yet."
+"You have indicated that trajectory {} involves tasks and sessions, but no "
+"sessions have been added yet."
#: tasks/models.py:13
msgid "Hoe vaak wordt deze sessie uitgevoerd?"
@@ -5096,15 +5110,15 @@ msgstr ""
"Total duration: %(duration)s minutes, number of times to be performed: "
"%(repeats)s"
-#: tasks/templates/tasks/session_list.html:36
+#: tasks/templates/tasks/session_list.html:35
msgid "Nog geen sessies. Tijd om er één aan te maken!"
msgstr "No sessions yet. Time to create one!"
-#: tasks/templates/tasks/session_list.html:43
+#: tasks/templates/tasks/session_list.html:41
msgid "Nieuwe sessie tevoegen"
msgstr "Add new session"
-#: tasks/templates/tasks/session_list.html:45
+#: tasks/templates/tasks/session_list.html:43
msgid "Sessie aanmaken"
msgstr "Create session"
@@ -5258,165 +5272,3 @@ msgstr "Task edited"
#: tasks/views/task_views.py:70
msgid "Taak verwijderd"
msgstr "Task deleted"
-
-#~ msgid "Sessie overzicht:"
-#~ msgstr "Session overview:"
-
-#~ msgid "Taken overzicht:"
-#~ msgstr "Task overview:"
-
-#~ msgid "Deze sessie bestaat uit de volgende taken:"
-#~ msgstr "This session consists of the following tasks:"
-
-#~ msgid ""
-#~ "In de volgende vragen gaan we nader in op wat je in jouw onderzoek van je "
-#~ "deelnemers zal verlangen. Daarbij gelden de volgende definities:"
-#~ msgstr ""
-#~ "The following questions probe further into the demands of your task-based "
-#~ "study on your participants. The following definitions will apply:"
-
-#~ msgid ""
-#~ "Sessie: Het geheel van de voor je onderzoek benodigde "
-#~ "betrokkenheid die je op één dag van een deelnemer vraagt. Bij een "
-#~ "labonderzoek is dat bijvoorbeeld alles wat er van onderzoekswege gebeurt "
-#~ "vanaf het moment dat je de deelnemer ontvangt tot het moment dat je "
-#~ "afscheid neemt, inclusief de benodigde pauzes. En bij een internet-"
-#~ "vragenlijst is dat alles wat er van onderzoekswege gebeurt vanaf het "
-#~ "welkomstscherm tot de afronding van de (reeks) vragenlijst(en), wederom "
-#~ "inclusief benodigde pauzes. Bij veldwerk is dat de tijd dat je met de "
-#~ "deelnemer in interactie bent op één dag."
-#~ msgstr ""
-#~ "Session: The entirety of the commitment which you "
-#~ "require of a participant in one day. In lab-based research, for example, "
-#~ "that means everything which happens as part of the research from the "
-#~ "moment you welcome the participant to the moment you part company from "
-#~ "them, including any necessary breaks. In an internet survey this means "
-#~ "everything which happens as part of the research from the welcome screen "
-#~ "to the conclusion of the (series of) survey(s), again including any "
-#~ "necessary breaks. For fieldwork, it refers to the time that you interact "
-#~ "with the participant on one day."
-
-#~ msgid ""
-#~ "Taak: Een coherente verzameling handelingen die je via "
-#~ "een gesproken of geschreven taak-instructie aan de deelnemer oplegt, en "
-#~ "ook als zodanig als 'taak' in een artikel zou beschrijven (bijvoorbeeld: "
-#~ "\"Beluister de volgende 200 zinnetjes en druk op een knop als je een fout "
-#~ "ontdekt\", \"Vul persoonlijkheidsvragenlijst X in\", \"Speel 10 minuten "
-#~ "met je kind zoals je dat thuis doet\", “houd 1 week een dagboek bij van "
-#~ "jouw media-gebruik”, “wil je je gender identiteit beschrijven”, “maak "
-#~ "foto’s van plekken in jouw leefomgeving die je bedreigend en inspirerend "
-#~ "vindt”, “zoek en deel met ons 10 foto’s uit jouw prive-archief om je "
-#~ "levensverhaal te kunnen vertellen”). Indien de specifieke opdracht aan de "
-#~ "deelnemer per item varieert (bijvoorbeeld: \"bij een Nederlandse zin "
-#~ "beoordeel je de betekenis, bij een Engelse zin de grammatica\"), beschouw "
-#~ "dit dan gewoon als één taak."
-#~ msgstr ""
-#~ "Task: This refers to a coherent collection of actions "
-#~ "which you instruct the participant to perform via a spoken or written set "
-#~ "of instructions, and which would also be described as a 'task' in an "
-#~ "article (e.g. \"Listen to the following 200 sentences and press a button "
-#~ "when you hear a mistake\", \"Fill in personality questionnaire X\", "
-#~ "\"Play with your child for 10 minutes as you would at home\"). If the "
-#~ "specific task varies from item to item, with a single instruction "
-#~ "covering all items (e.g., ‘for a Dutch sentence judge the meaning, for an "
-#~ "English sentence judge the grammar’), this should be treated as one "
-#~ "task. "
-
-#~ msgid ""
-#~ "Het reglement van de Algemene Kamer (AK) of dat van de Linguïstiek Kamer "
-#~ "(LK)."
-#~ msgstr ""
-#~ "The regulations of the General Chamber or "
-#~ "those of the Linguistics Chamber."
-
-#~ msgid "Andere betrokkenen"
-#~ msgstr "Other people involved"
-
-#~ msgid "Maak een nieuwe sessie aan >>"
-#~ msgstr "Create a new session >>"
-
-#~ msgid "Maak een nieuwe taak aan >>"
-#~ msgstr "Create a new task >>"
-
-#~ msgid ""
-#~ "Voor elke sessie stellen we in de komende schermen steeds dezelfde vragen."
-#~ msgstr ""
-#~ "For each session we will ask the same questions in the following pages."
-
-#~ msgid "Takenonderzoek met de volgende opbouw:"
-#~ msgstr "Task-based research structured as follows:"
-
-#~ msgid "Herhalingen"
-#~ msgstr "Repeats"
-
-#~ msgid "Terug naar begin aanvraag"
-#~ msgstr "Return to start of application"
-
-#~ msgid "Terug naar begin traject"
-#~ msgstr "Back to the beginning of the trajectory"
-
-#~ msgid "Terug naar begin sessie"
-#~ msgstr "Back to the beginning of the session"
-
-#~ msgid "Opslaan en volgende stap >>"
-#~ msgstr "Save and go to next step >>"
-
-#~ msgid "Het takenonderzoek (traject {})"
-#~ msgstr "Task-based research: trajectory {}"
-
-#~ msgid "Hoeveel sessies met taakonderzoek zullen de deelnemers doorlopen?"
-#~ msgstr "How many sessions of tasks will the participants take part in?"
-
-#~ msgid ""
-#~ "Wanneer je bijvoorbeeld eerst de deelnemer een taak/aantal taken laat "
-#~ "doen tijdens een eerste bezoek aan het lab en je laat de deelnemer nog "
-#~ "een keer terugkomen om dezelfde taak/taken of andere taak/taken te doen, "
-#~ "dan spreken we van twee sessies. Wanneer je meerdere taken afneemt op "
-#~ "dezelfde dag, met pauzes daartussen, dan geldt dat toch als één sessie."
-#~ msgstr ""
-#~ "When the participant is asked to perform a task / multiple tasks during a "
-#~ "first visit to the lab and to return on a later day to perform the same "
-#~ "task(s) or a different task / multiple different tasks, we consider the "
-#~ "experiment to consist of two sessions. If multiple tasks are executed on "
-#~ "the same day, with breaks in between, this is still considered to be one "
-#~ "session."
-
-#, python-format
-#~ msgid "%(sessions_number)s sessie(s) voor studie %(title)s aangemaakt"
-#~ msgstr "%(sessions_number)s sessions for application %(title)s created"
-
-#~ msgid "Is deze sessie een kopie van een voorgaande sessie?"
-#~ msgstr "Is this session a copy of a previous session?"
-
-#~ msgid "Na het kopiëren zijn alle velden bewerkbaar."
-#~ msgstr "All fields can be edited after copying."
-
-#~ msgid "Te kopiëren sessie"
-#~ msgstr "Session to be copied"
-
-#~ msgid ""
-#~ "Hoeveel taken worden er binnen deze sessie bij de deelnemer afgenomen?"
-#~ msgstr ""
-#~ "How many tasks will each participant have to carry out in this session?"
-
-#~ msgid ""
-#~ "Wanneer je bijvoorbeeld eerst de deelnemer observeert en de deelnemer "
-#~ "vervolgens een vragenlijst afneemt, dan vul je hierboven \"2\" in. "
-#~ "Electrodes plakken, sessie-debriefing en kort (< 3 minuten) exit-"
-#~ "interview gelden niet als een taak."
-#~ msgstr ""
-#~ "For example, if you first observe the participant and then require them "
-#~ "to complete a questionnaire, please fill in \"2\" above. Putting on "
-#~ "electrodes, session debriefing and a short (<3 minute) exit interview are "
-#~ "not counted as tasks."
-
-#, python-format
-#~ msgid "%(tasks_number)s ta(a)k(en) aangemaakt"
-#~ msgstr "%(tasks_number)s task(s) created"
-
-#~ msgid "Taken toevoegen beëindigd"
-#~ msgstr "Finished adding tasks"
diff --git a/proposals/templates/proposals/proposal_confirmation.html b/proposals/templates/proposals/proposal_confirmation.html
index 915614cd8..7637fd475 100644
--- a/proposals/templates/proposals/proposal_confirmation.html
+++ b/proposals/templates/proposals/proposal_confirmation.html
@@ -33,10 +33,10 @@
"
msgstr "You can now (re)view this application here: %(title)s.
"
-#: reviews/templates/reviews/decision_form.html:35
+#: reviews/templates/reviews/decision_form.html:42
msgid ""
"Als de aanvraag (incl. geïnformeerde toestemmingsformulieren) in orde is, "
"klik dan op ‘goedgekeurd’ en ‘Beslissing opslaan’ hieronder; dan wordt de "
@@ -3639,7 +3649,7 @@ msgstr ""
"'endorsed' and 'Save decision' below; the application will then be submitted "
"to the FEtC-H. "
-#: reviews/templates/reviews/decision_form.html:42
+#: reviews/templates/reviews/decision_form.html:49
msgid ""
"Als de aanvraag nog niet in orde is, dan zijn er twee mogelijkheden om de "
"aanvraag aan te passen:"
@@ -3647,7 +3657,7 @@ msgstr ""
"If the application is not yet in order, there are two methods to amend the "
"study: "
-#: reviews/templates/reviews/decision_form.html:49
+#: reviews/templates/reviews/decision_form.html:56
#, python-format
msgid ""
"door de supervisor (jijzelf)
Als supervisor kan je deze aanvraag Indien je wilt dat de "
"indiener de aanvraag zelf aanpast voordat je de studie kunt goedkeuren en "
@@ -3675,7 +3685,7 @@ msgstr ""
"any comments, and click 'Save decision'. Once you have done this, the "
"submitter can make changes again.
"
-#: reviews/templates/reviews/decision_form.html:70
+#: reviews/templates/reviews/decision_form.html:77
msgid ""
"Als de indiener de gevraagde wijzigingen heeft doorgevoerd en opnieuw heeft "
"verstuurd, zal je de aangepaste aanvraag opnieuw moeten beoordelen."
@@ -3683,7 +3693,7 @@ msgstr ""
"Once the submitter has made the requested changes and resubmitted the "
"application, you will have to re-evaluate the application. "
-#: reviews/templates/reviews/decision_form.html:80
+#: reviews/templates/reviews/decision_form.html:87
#, python-format
msgid ""
"Dit is een revisie van of amendement op een vorige aanvraag. De verschillen "
@@ -3693,7 +3703,7 @@ msgstr ""
"differences compared to the previous application here."
-#: reviews/templates/reviews/decision_form.html:95
+#: reviews/templates/reviews/decision_form.html:102
msgid "Beslissing opslaan"
msgstr "Save decision"
@@ -3716,7 +3726,7 @@ msgstr "Appoint committee members"
#, python-format
msgid ""
"{% trans "Bevestigingsbrief versturen" %}
{{ form.as_table }}
+ {% trans "Terug naar de vorige pagina" %}
- {% trans "Terug naar de vorige pagina" %}
diff --git a/proposals/utils/pdf_diff_logic.py b/proposals/utils/pdf_diff_logic.py
index 8367c98b3..39a04534e 100644
--- a/proposals/utils/pdf_diff_logic.py
+++ b/proposals/utils/pdf_diff_logic.py
@@ -275,7 +275,7 @@ def get_object_list(self, object):
def handle_field_file(self, field_file):
if field_file:
output = format_html(
- "{}",
+ '{}',
f"{settings.BASE_URL}{field_file.url}",
_("Download"),
)
diff --git a/proposals/views/proposal_views.py b/proposals/views/proposal_views.py
index f37ad2dbf..141e94095 100644
--- a/proposals/views/proposal_views.py
+++ b/proposals/views/proposal_views.py
@@ -401,6 +401,16 @@ class ProposalUpdateDataManagement(GroupRequiredMixin, generic.UpdateView):
form_class = ProposalUpdateDataManagementForm
group_required = settings.GROUP_SECRETARY
+ def form_valid(self, form):
+ ret = super().form_valid(form)
+ # Always regenerate the PDF after updating the DMP
+ # This is necessary, as the canonical PDF protection might already
+ # have kicked in if the secretary changes the documents later than
+ # we initially expected.
+ self.object.generate_pdf(force_overwrite=True)
+
+ return ret
+
def get_success_url(self):
"""Continue to the URL specified in the 'next' POST parameter"""
return reverse("reviews:detail", args=[self.object.latest_review().pk])
@@ -416,6 +426,16 @@ class ProposalUpdateDateStart(GroupRequiredMixin, generic.UpdateView):
form_class = ProposalUpdateDateStartForm
group_required = settings.GROUP_SECRETARY
+ def form_valid(self, form):
+ ret = super().form_valid(form)
+ # Always regenerate the PDF after updating the DMP
+ # This is necessary, as the canonical PDF protection might already
+ # have kicked in if the secretary changes the documents later than
+ # we initially expected.
+ self.object.generate_pdf(force_overwrite=True)
+
+ return ret
+
def get_success_url(self):
"""Continue to the URL specified in the 'next' POST parameter"""
return reverse("reviews:detail", args=[self.object.latest_review().pk])
diff --git a/requirements.in b/requirements.in
index 72c5bbfd2..8343939d2 100644
--- a/requirements.in
+++ b/requirements.in
@@ -26,4 +26,5 @@ python-magic
pdftotext
bpython
black
-djlint
\ No newline at end of file
+djlint
+sentry-sdk[django]
\ No newline at end of file
diff --git a/requirements.txt b/requirements.txt
index a3d537aa8..0dad18191 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -2,7 +2,7 @@
# This file is autogenerated by pip-compile with Python 3.9
# by the following command:
#
-# pip-compile --resolver=backtracking
+# pip-compile -U
#
-e git+https://github.com/UiL-OTS-labs/python-docx2txt#egg=docx2txt
# via -r requirements.in
@@ -12,7 +12,7 @@ alabaster==0.7.16
# via sphinx
arabic-reshaper==3.0.0
# via xhtml2pdf
-asgiref==3.7.2
+asgiref==3.8.1
# via django
asn1crypto==1.5.1
# via
@@ -21,16 +21,18 @@ asn1crypto==1.5.1
# pyhanko-certvalidator
babel==2.14.0
# via sphinx
-black==23.12.1
+black==24.3.0
# via -r requirements.in
blessed==1.20.0
# via curtsies
bpython==0.24
# via -r requirements.in
-cdh-django-core @ git+https://github.com/CentreForDigitalHumanities/django-shared-core.git@v3.1.0
+cdh-django-core[federated-auth] @ git+https://github.com/CentreForDigitalHumanities/django-shared-core.git@v3.1.0
# via -r requirements.in
-certifi==2023.11.17
- # via requests
+certifi==2024.2.2
+ # via
+ # requests
+ # sentry-sdk
cffi==1.16.0
# via cryptography
chardet==5.2.0
@@ -46,13 +48,13 @@ closure==20191111
# via uil-django-core
colorama==0.4.6
# via djlint
-cryptography==41.0.7
+cryptography==42.0.5
# via
# pyhanko
# pyhanko-certvalidator
# pyopenssl
# pysaml2
-cssbeautifier==1.14.11
+cssbeautifier==1.15.1
# via djlint
cssselect2==0.7.0
# via svglib
@@ -68,7 +70,7 @@ defusedxml==0.7.1
# pysaml2
deprecated==1.2.14
# via cdh-django-core
-django==3.2.23
+django==3.2.25
# via
# -r requirements.in
# cdh-django-core
@@ -81,13 +83,14 @@ django==3.2.23
# django-user-agents
# djangorestframework
# djangosaml2
+ # sentry-sdk
# sphinxcontrib-django
# uil-django-core
-django-auth-ldap==4.6.0
+django-auth-ldap==4.7.0
# via -r requirements.in
django-braces==1.15.0
# via -r requirements.in
-django-debug-toolbar==4.2.0
+django-debug-toolbar==4.3.0
# via -r requirements.in
django-extensions==3.2.3
# via -r requirements.in
@@ -99,7 +102,7 @@ django-simple-menu==2.1.3
# via -r requirements.in
django-user-agents==0.4.0
# via -r requirements.in
-djangorestframework==3.14.0
+djangorestframework==3.15.1
# via
# -r requirements.in
# uil-django-core
@@ -113,16 +116,12 @@ docutils==0.20.1
# via
# sphinx
# sphinx-rtd-theme
-editorconfig==0.12.3
+editorconfig==0.12.4
# via
# cssbeautifier
# jsbeautifier
-elementpath==4.1.5
+elementpath==4.4.0
# via xmlschema
-freetype-py==2.3.0
- # via
- # reportlab
- # rlpycairo
greenlet==3.0.3
# via bpython
html-tag-names==0.1.2
@@ -137,21 +136,21 @@ idna==3.6
# via requests
imagesize==1.4.1
# via sphinx
-importlib-metadata==7.0.1
+importlib-metadata==7.1.0
# via sphinx
jinja2==3.1.3
# via sphinx
-jsbeautifier==1.14.11
+jsbeautifier==1.15.1
# via
# cssbeautifier
# djlint
-json5==0.9.14
+json5==0.9.24
# via djlint
lesscpy==0.15.1
# via uil-django-core
-lxml==5.1.0
+lxml==5.2.0
# via svglib
-markupsafe==2.1.3
+markupsafe==2.1.5
# via jinja2
mypy-extensions==1.0.0
# via black
@@ -159,7 +158,7 @@ mysqlclient==1.4.6
# via -r requirements.in
oscrypto==1.3.0
# via pyhanko-certvalidator
-packaging==23.2
+packaging==24.0
# via
# black
# sphinx
@@ -171,12 +170,12 @@ pbr==6.0.0
# via sphinxcontrib-apidoc
pdftotext==2.2.2
# via -r requirements.in
-pillow==10.2.0
+pillow==10.3.0
# via
# -r requirements.in
# reportlab
# xhtml2pdf
-platformdirs==4.1.0
+platformdirs==4.2.0
# via black
ply==3.11
# via lesscpy
@@ -184,22 +183,20 @@ pprintpp==0.4.0
# via sphinxcontrib-django
pscript==0.7.7
# via vbuild
-pyasn1==0.5.1
+pyasn1==0.6.0
# via
# pyasn1-modules
# python-ldap
-pyasn1-modules==0.3.0
+pyasn1-modules==0.4.0
# via python-ldap
-pycairo==1.25.1
- # via rlpycairo
-pycparser==2.21
+pycparser==2.22
# via cffi
pygments==2.17.2
# via
# -r requirements.in
# bpython
# sphinx
-pyhanko==0.21.0
+pyhanko==0.23.2
# via xhtml2pdf
pyhanko-certvalidator==0.26.3
# via
@@ -207,28 +204,27 @@ pyhanko-certvalidator==0.26.3
# xhtml2pdf
pyjwt==2.8.0
# via uil-django-core
-pyopenssl==23.3.0
+pyopenssl==24.1.0
# via pysaml2
-pypdf==3.17.4
+pypdf==4.1.0
# via xhtml2pdf
pypng==0.20220715.0
# via qrcode
-pysaml2==7.4.2
+pysaml2==7.5.0
# via djangosaml2
pyscss==1.4.0
# via uil-django-core
python-bidi==0.4.2
# via xhtml2pdf
-python-dateutil==2.8.2
+python-dateutil==2.9.0.post0
# via pysaml2
python-ldap==3.4.4
# via django-auth-ldap
python-magic==0.4.27
# via -r requirements.in
-pytz==2023.3.post1
+pytz==2024.1
# via
# django
- # djangorestframework
# pysaml2
pyxdg==0.28
# via bpython
@@ -240,7 +236,7 @@ qrcode==7.4.2
# via pyhanko
regex==2023.12.25
# via djlint
-reportlab[pycairo]==4.0.9
+reportlab==4.0.9
# via
# svglib
# xhtml2pdf
@@ -253,8 +249,8 @@ requests==2.31.0
# pysaml2
# sphinx
# uil-django-core
-rlpycairo==0.3.0
- # via reportlab
+sentry-sdk[django]==1.44.0
+ # via -r requirements.in
six==1.16.0
# via
# blessed
@@ -271,32 +267,27 @@ sphinx==7.2.6
# -r requirements.in
# sphinx-rtd-theme
# sphinxcontrib-apidoc
- # sphinxcontrib-applehelp
- # sphinxcontrib-devhelp
# sphinxcontrib-django
- # sphinxcontrib-htmlhelp
# sphinxcontrib-jquery
- # sphinxcontrib-qthelp
- # sphinxcontrib-serializinghtml
sphinx-rtd-theme==2.0.0
# via -r requirements.in
-sphinxcontrib-apidoc==0.4.0
+sphinxcontrib-apidoc==0.5.0
# via -r requirements.in
-sphinxcontrib-applehelp==1.0.7
+sphinxcontrib-applehelp==1.0.8
# via sphinx
-sphinxcontrib-devhelp==1.0.5
+sphinxcontrib-devhelp==1.0.6
# via sphinx
sphinxcontrib-django==2.5
# via -r requirements.in
-sphinxcontrib-htmlhelp==2.0.4
+sphinxcontrib-htmlhelp==2.0.5
# via sphinx
sphinxcontrib-jquery==4.1
# via sphinx-rtd-theme
sphinxcontrib-jsmath==1.0.1
# via sphinx
-sphinxcontrib-qthelp==1.0.6
+sphinxcontrib-qthelp==1.0.7
# via sphinx
-sphinxcontrib-serializinghtml==1.1.9
+sphinxcontrib-serializinghtml==1.1.10
# via sphinx
sqlparse==0.4.4
# via
@@ -312,9 +303,9 @@ tomli==2.0.1
# via
# black
# djlint
-tqdm==4.66.1
+tqdm==4.66.2
# via djlint
-typing-extensions==4.9.0
+typing-extensions==4.10.0
# via
# asgiref
# black
@@ -327,8 +318,10 @@ ua-parser==0.18.0
# via user-agents
uritools==4.0.2
# via pyhanko-certvalidator
-urllib3==2.1.0
- # via requests
+urllib3==2.2.1
+ # via
+ # requests
+ # sentry-sdk
user-agents==2.2.0
# via django-user-agents
vbuild==0.8.2
@@ -342,9 +335,9 @@ webencodings==0.5.1
# tinycss2
wrapt==1.16.0
# via deprecated
-xhtml2pdf==0.2.13
+xhtml2pdf==0.2.15
# via -r requirements.in
-xmlschema==3.0.1
+xmlschema==2.5.1
# via pysaml2
-zipp==3.17.0
+zipp==3.18.1
# via importlib-metadata
diff --git a/reviews/api/views.py b/reviews/api/views.py
index 420f9a212..7a3b48d00 100644
--- a/reviews/api/views.py
+++ b/reviews/api/views.py
@@ -98,6 +98,7 @@ def get_queryset_for_committee(self):
reviewer=self.request.user,
review__proposal__reviewing_committee=self.committee,
review__continuation__lt=Review.Continuations.DISCONTINUED,
+ review__is_committee_review=True,
)
for obj in objects:
@@ -121,6 +122,7 @@ def get_queryset_for_secretary(self):
reviewer__groups__name=settings.GROUP_SECRETARY,
review__proposal__reviewing_committee=self.committee,
review__continuation__lt=Review.Continuations.DISCONTINUED,
+ review__is_committee_review=True,
)
for obj in objects:
@@ -171,6 +173,7 @@ def get_queryset_for_committee(self):
go="",
review__proposal__reviewing_committee=self.committee,
review__continuation__lt=Review.Continuations.DISCONTINUED,
+ review__is_committee_review=True,
)
for obj in objects:
@@ -195,6 +198,7 @@ def get_queryset_for_secretary(self):
go="",
review__proposal__reviewing_committee=self.committee,
review__continuation__lt=Review.Continuations.DISCONTINUED,
+ review__is_committee_review=True,
)
for obj in objects:
@@ -238,7 +242,8 @@ def get_queryset(self):
go="",
review__proposal__reviewing_committee=self.committee,
review__continuation__lt=Review.Continuations.DISCONTINUED,
- ).exclude(review__stage=Review.Stages.SUPERVISOR)
+ review__is_committee_review=True,
+ )
for obj in objects:
proposal = obj.review.proposal
@@ -288,7 +293,7 @@ class OpenSupervisorDecisionApiView(BaseDecisionApiView):
default_sort = ("proposal.date_submitted_supervisor", "desc")
def get_queryset(self):
- """Returns all proposals that still need to be reviewed by the secretary"""
+ """Returns all proposals that still need to be reviewed by the supervisor"""
objects = Decision.objects.filter(
go="",
review__stage=Review.Stages.SUPERVISOR,
@@ -379,6 +384,7 @@ def get_queryset(self):
objects = (
Review.objects.filter(
stage__gte=Review.Stages.CLOSING,
+ is_committee_review=True,
proposal__status__gte=Proposal.Statuses.SUBMITTED,
proposal__date_confirmed=None,
proposal__reviewing_committee=self.committee,
@@ -440,6 +446,7 @@ def get_queryset(self):
proposal__reviewing_committee=self.committee,
stage=Review.Stages.CLOSED,
continuation=Review.Continuations.REVISION,
+ is_committee_review=True,
)
# 3. Finally, exclude candidates whose proposal
# has a child with a revision review
@@ -537,6 +544,7 @@ def get_queryset(self):
stage__gte=Review.Stages.ASSIGNMENT,
proposal__status__gte=Proposal.Statuses.SUBMITTED,
proposal__reviewing_committee=self.committee,
+ is_committee_review=True,
)
.select_related(
"proposal",
diff --git a/reviews/models.py b/reviews/models.py
index 24f5d8334..a86803074 100644
--- a/reviews/models.py
+++ b/reviews/models.py
@@ -80,6 +80,7 @@ def update_go(self, last_decision=None):
start_assignment_phase(self.proposal)
self.stage = self.Stages.CLOSED
+ self.save()
# On NO-GO, reset the Proposal status
else:
# See comment above
@@ -177,6 +178,17 @@ def save(self, *args, **kwargs):
super(Decision, self).save(*args, **kwargs)
self.review.update_go(last_decision=self)
+ def is_final_decision(self):
+ """
+ Checks if this is the final review in a reviewing round.
+
+ Will always return True on Supervisor reviews.
+ """
+ open_decisions = self.review.decision_set.filter(
+ go="",
+ )
+ return open_decisions.count() < 2
+
def __str__(self):
return "Decision #%d by %s on %s: %s" % (
self.pk,
diff --git a/reviews/templates/reviews/decision_form.html b/reviews/templates/reviews/decision_form.html
index 0f0d8b9ff..8a1c5d85b 100644
--- a/reviews/templates/reviews/decision_form.html
+++ b/reviews/templates/reviews/decision_form.html
@@ -24,6 +24,13 @@ {% trans "Aanvraag beoordelen" %}
De aanvraag is hier in te zien (downloadt als PDF).
{% endblocktrans %}
{% blocktrans trimmed with title=proposal.title %} diff --git a/reviews/templates/reviews/review_assign_form.html b/reviews/templates/reviews/review_assign_form.html index e639c5d94..3db20b2ba 100644 --- a/reviews/templates/reviews/review_assign_form.html +++ b/reviews/templates/reviews/review_assign_form.html @@ -31,7 +31,7 @@
Kies hier de geschikte route en commissieleden voor de aanvraag {{ title }}. - klik hier voor een overzicht van de werkverdeling van deze commissie. + Klik hier voor een overzicht van de werkverdeling van deze commissie.
{% endblocktrans %} diff --git a/tasks/templates/tasks/task_confirm_delete.html b/tasks/templates/tasks/task_confirm_delete.html index 8292de4f4..63bfe6d3b 100644 --- a/tasks/templates/tasks/task_confirm_delete.html +++ b/tasks/templates/tasks/task_confirm_delete.html @@ -17,7 +17,9 @@