diff options
author | Étienne Loks <etienne.loks@iggdrasil.net> | 2025-03-14 14:53:44 +0100 |
---|---|---|
committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2025-03-17 19:46:07 +0100 |
commit | 5a70796bc297e8e2b64d3925e3c916697770ae9b (patch) | |
tree | 4928b092da84b3b5c70362eca7681d9d16e1bfa0 | |
parent | 35cf272b8602d89fda1b13653442323fda46835c (diff) | |
download | Ishtar-5a70796bc297e8e2b64d3925e3c916697770ae9b.tar.bz2 Ishtar-5a70796bc297e8e2b64d3925e3c916697770ae9b.zip |
🐛 archaeological files: manage business for deadlines (refs #6218)
-rw-r--r-- | archaeological_files/forms.py | 32 | ||||
-rw-r--r-- | example_project/settings.py | 2 | ||||
-rw-r--r-- | ishtar_common/utils.py | 21 |
3 files changed, 42 insertions, 13 deletions
diff --git a/archaeological_files/forms.py b/archaeological_files/forms.py index 5cbb79d85..6b150a9d5 100644 --- a/archaeological_files/forms.py +++ b/archaeological_files/forms.py @@ -30,7 +30,7 @@ from django.core import validators from django.db.models import Q from django.forms.formsets import formset_factory from django.utils.safestring import mark_safe -from ishtar_common.utils import ugettext_lazy as _ +from ishtar_common.utils import add_business_days, ugettext_lazy as _ from ishtar_common.models import ( Area, @@ -667,18 +667,24 @@ class FileFormInstruction(CustomForm, IshtarForm): self.fields["numeric_reference"].initial = c_num + 1 if self.numeric_reference_is_readonly: self.fields["numeric_reference"].widget.attrs["readonly"] = True - if reception_date and saisine_type: - if type(reception_date) == str: - try: - reception_date = datetime.datetime.strptime( - reception_date, "%d/%m/%Y" - ) - self.fields["instruction_deadline"].initial = ( - reception_date - + datetime.timedelta(days=saisine_type.delay or 0) - ).strftime("%Y-%m-%d") - except ValueError: - pass + if not reception_date or not saisine_type: + return + if isinstance(reception_date, str): + try: + reception_date = datetime.datetime.strptime( + reception_date, "%d/%m/%Y" + ) + except ValueError: + return + delay = saisine_type.delay or 0 + try: + if settings.ISHTAR_FILE_EXCLUDE_BUSSINESS_DAYS: + deadline = add_business_days(reception_date, delay) + else: + deadline = reception_date + datetime.timedelta(days=delay) + self.fields["instruction_deadline"].initial = deadline.strftime("%Y-%m-%d") + except (TypeError, ValueError): + pass def clean_numeric_reference(self): if self.numeric_reference_is_readonly: diff --git a/example_project/settings.py b/example_project/settings.py index 623c7195b..ae1a8f642 100644 --- a/example_project/settings.py +++ b/example_project/settings.py @@ -276,6 +276,8 @@ ISHTAR_QRCODE_VERSION = 6 # density of the QR code ISHTAR_QRCODE_SCALE = 2 # scale of the QR code ISHTAR_DEFAULT_YEAR = 1900 ISHTAR_MUSEUM_GAM = False # France - AlimGAM export of exhibitions +# exclude business days from deadline calculation +ISHTAR_FILE_EXCLUDE_BUSSINESS_DAYS = True ISHTAR_SLUGS = { "document-publisher": ["publisher"], diff --git a/ishtar_common/utils.py b/ishtar_common/utils.py index af4ea06dc..4e80ac60a 100644 --- a/ishtar_common/utils.py +++ b/ishtar_common/utils.py @@ -3151,6 +3151,27 @@ def reverse_list_coordinates(lst): return list(reversed(lst)) +def add_business_days(from_date: datetime.datetime, + business_days_to_add: int) -> datetime.datetime: + """ + Add days to a date with exclusion of saturday and sunday. + """ + num_whole_weeks = business_days_to_add // 5 + extra_days = num_whole_weeks * 2 + + # manage the last week + first_weekday = from_date.weekday() + remainder_days = business_days_to_add % 5 + + if (first_weekday + remainder_days) > 4: + if first_weekday == 5: + extra_days += 1 + elif first_weekday != 6: + extra_days += 2 + + return from_date + datetime.timedelta(business_days_to_add + extra_days) + + class EachCharacterTypeValidator: def __init__(self, character_types=None): if not character_types: |