summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
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
commit5a70796bc297e8e2b64d3925e3c916697770ae9b (patch)
tree4928b092da84b3b5c70362eca7681d9d16e1bfa0
parent35cf272b8602d89fda1b13653442323fda46835c (diff)
downloadIshtar-5a70796bc297e8e2b64d3925e3c916697770ae9b.tar.bz2
Ishtar-5a70796bc297e8e2b64d3925e3c916697770ae9b.zip
🐛 archaeological files: manage business for deadlines (refs #6218)
-rw-r--r--archaeological_files/forms.py32
-rw-r--r--example_project/settings.py2
-rw-r--r--ishtar_common/utils.py21
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: