summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@iggdrasil.net>2025-03-27 14:47:12 +0100
committerÉtienne Loks <etienne.loks@iggdrasil.net>2025-10-15 19:32:59 +0200
commit79fdfeb620c9b95ad44c34a22d5d661baa55bc92 (patch)
tree5ff848a9ff7ac9a89794a153a5b249d7aecdb678
parentb596f92c7f96a3ee4cdcfd00b4f4ddb11d4e4711 (diff)
downloadIshtar-79fdfeb620c9b95ad44c34a22d5d661baa55bc92.tar.bz2
Ishtar-79fdfeb620c9b95ad44c34a22d5d661baa55bc92.zip
♻️ django: fix warnings for v5 - migrate to timezone aware dates
-rw-r--r--archaeological_finds/forms_treatments.py8
-rw-r--r--archaeological_finds/models_treatments.py6
-rw-r--r--archaeological_warehouse/models.py3
-rw-r--r--example_project/settings.py9
-rw-r--r--ishtar_common/admin.py4
-rw-r--r--ishtar_common/forms.py4
-rw-r--r--ishtar_common/forms_common.py2
-rw-r--r--ishtar_common/management/commands/gdpr_clean.py3
-rw-r--r--ishtar_common/models.py31
-rw-r--r--ishtar_common/models_common.py27
-rw-r--r--ishtar_common/models_imports.py29
-rw-r--r--ishtar_common/serializers_utils.py3
-rw-r--r--ishtar_common/tasks.py13
-rw-r--r--ishtar_common/utils.py7
-rw-r--r--ishtar_common/views.py4
-rw-r--r--ishtar_common/views_item.py6
-rw-r--r--ishtar_common/wizards.py3
17 files changed, 90 insertions, 72 deletions
diff --git a/archaeological_finds/forms_treatments.py b/archaeological_finds/forms_treatments.py
index 34cec6eb3..9790a0e93 100644
--- a/archaeological_finds/forms_treatments.py
+++ b/archaeological_finds/forms_treatments.py
@@ -24,6 +24,7 @@ from collections import OrderedDict
from bootstrap_datepicker.widgets import DateField
from django import forms
from django.core import validators
+from django.utils import timezone
from ishtar_common.utils import gettext_lazy as _
from ishtar_common.forms import FormHeader
@@ -469,7 +470,8 @@ class QABasePackagingForm(CustomForm, IshtarForm):
label=_("Year"), initial=lambda: datetime.datetime.now().year,
validators=[validators.MinValueValidator(1000),
validators.MaxValueValidator(2100)], required=False)
- start_date = DateField(label=_("Precise date"), required=False, initial=lambda: datetime.datetime.today())
+ start_date = DateField(label=_("Precise date"), required=False,
+ initial=lambda: datetime.date.today())
person = forms.IntegerField(
label=_("Responsible"),
widget=widgets.JQueryAutoComplete(
@@ -811,10 +813,10 @@ class TreatmentFileForm(CustomForm, ManageOldType):
widget=forms.Textarea, required=False)
reception_date = DateField(
label=_("Reception date"), required=False,
- initial=lambda: datetime.datetime.now()
+ initial=lambda: timezone.now()
)
creation_date = DateField(label=_("Start date"), required=False,
- initial=lambda: datetime.datetime.now())
+ initial=lambda: timezone.now())
end_date = DateField(label=_("End date"), required=False)
TYPES = [
diff --git a/archaeological_finds/models_treatments.py b/archaeological_finds/models_treatments.py
index 2675e3ec6..a4dedbef9 100644
--- a/archaeological_finds/models_treatments.py
+++ b/archaeological_finds/models_treatments.py
@@ -31,8 +31,9 @@ from django.contrib.postgres.indexes import GinIndex
from django.db.models import Max, Q
from django.db.models.signals import post_save, post_delete, pre_delete, m2m_changed
from django.template.defaultfilters import slugify
+from django.utils import timezone
from django.urls import reverse
-from ishtar_common.utils import gettext_lazy as _, pgettext_lazy, SheetItem
+from ishtar_common.utils import gettext_lazy as _, pgettext_lazy
from archaeological_finds.models_finds import Find, FindBasket, TreatmentType, \
FindTreatment
@@ -56,7 +57,6 @@ from ishtar_common.models import (
Person,
post_save_cache,
SearchVectorConfig,
- ShortMenuItem,
ValueGetter,
)
from ishtar_common.models_common import CompleteIdentifierItem, HistoricalRecords
@@ -435,7 +435,7 @@ class Treatment(
goal = models.TextField(_("Goal"), blank=True, default="")
start_date = models.DateField(_("Start date"), blank=True, null=True)
end_date = models.DateField(_("End date"), blank=True, null=True)
- creation_date = models.DateTimeField(default=datetime.datetime.now)
+ creation_date = models.DateTimeField(default=timezone.now)
container = models.ForeignKey(
Container,
verbose_name=_("Container"),
diff --git a/archaeological_warehouse/models.py b/archaeological_warehouse/models.py
index e9588668c..2d10fde1d 100644
--- a/archaeological_warehouse/models.py
+++ b/archaeological_warehouse/models.py
@@ -29,6 +29,7 @@ from django.db.models import Q, Max
from django.db.models.signals import post_save, post_delete, m2m_changed, pre_delete
from django.template.defaultfilters import slugify
from django.urls import reverse, reverse_lazy
+from django.utils import timezone
from ishtar_common.utils import gettext_lazy as _, pgettext_lazy
from django.apps import apps
@@ -1240,7 +1241,7 @@ class Container(
blank=True,
null=True,
)
- history_date_deprecated = models.DateTimeField(default=datetime.datetime.now)
+ history_date_deprecated = models.DateTimeField(default=timezone.now)
history = HistoricalRecords(bases=[HistoryModel])
DISABLE_POLYGONS = False
diff --git a/example_project/settings.py b/example_project/settings.py
index e8539e71f..ba88e842a 100644
--- a/example_project/settings.py
+++ b/example_project/settings.py
@@ -104,6 +104,8 @@ SHORT_DATE_FORMAT = "%d/%m/%Y"
SITE_ID = 1
+USE_TZ = True
+
# If you set this to False, Django will make some optimizations so as not
# to load the internationalization machinery.
USE_I18N = True
@@ -117,7 +119,12 @@ LANGUAGES = (
("en", "English"),
)
DEFAULT_LANGUAGE = 1
-DEFAULT_FILE_STORAGE = "ishtar_common.utils.IshtarFileSystemStorage"
+STORAGES = {
+ "default": {"BACKEND": "ishtar_common.utils.IshtarFileSystemStorage"},
+ "staticfiles": {
+ "BACKEND": "django.contrib.staticfiles.storage.StaticFilesStorage",
+ },
+}
# Absolute path to the directory that holds media.
# Example: "/home/media/media.lawrence.com/"
diff --git a/ishtar_common/admin.py b/ishtar_common/admin.py
index fd1b4e5c3..9b0bf8fac 100644
--- a/ishtar_common/admin.py
+++ b/ishtar_common/admin.py
@@ -18,7 +18,6 @@
# See the file COPYING for details.
import csv
-import datetime
import json
from io import TextIOWrapper, BytesIO
import os
@@ -61,6 +60,7 @@ from django.forms import BaseInlineFormSet
from django.http import HttpResponseRedirect, HttpResponse, Http404
from django.shortcuts import render
from django.urls import re_path, reverse
+from django.utils import timezone
from django.utils.decorators import method_decorator
from django.utils.text import slugify
from django.utils.safestring import mark_safe
@@ -1073,7 +1073,7 @@ class GDPRLogAdmin(admin.ModelAdmin):
return False
def get_csv_name(self):
- now = datetime.datetime.now()
+ now = timezone.now()
lbl = str(_("export-gdpr"))
return f"{now.strftime('%Y-%m-%d-%H%M')}-{lbl}"
diff --git a/ishtar_common/forms.py b/ishtar_common/forms.py
index ac0c638e1..7856d2d64 100644
--- a/ishtar_common/forms.py
+++ b/ishtar_common/forms.py
@@ -35,7 +35,7 @@ from django.core.exceptions import ValidationError
from django.core import validators
from django.forms.formsets import BaseFormSet, DELETION_FIELD_NAME
from django.urls import reverse
-from django.utils import formats, translation
+from django.utils import formats, translation, timezone
from django.utils.functional import lazy
from django.utils.safestring import mark_safe
from django.utils.text import slugify
@@ -1178,7 +1178,7 @@ class DocumentItemSelect(ImportSelect):
def get_now():
- return datetime.datetime.now().strftime(formats.get_format("DATE_INPUT_FORMATS")[0])
+ return timezone.now().strftime(formats.get_format("DATE_INPUT_FORMATS")[0])
class ClosingDateFormSelection(IshtarForm):
diff --git a/ishtar_common/forms_common.py b/ishtar_common/forms_common.py
index ed4b8a2dd..4a6e7dc76 100644
--- a/ishtar_common/forms_common.py
+++ b/ishtar_common/forms_common.py
@@ -1968,6 +1968,8 @@ class MergeForm(forms.ModelForm):
from_item.merge_exclusion.add(to_item)
else:
return
+ to_item.save()
+ from_item.save()
try:
self.instance.__class__.objects.get(
**{self.TO_KEY: from_item, self.FROM_KEY: to_item}
diff --git a/ishtar_common/management/commands/gdpr_clean.py b/ishtar_common/management/commands/gdpr_clean.py
index 1f3f413f6..c53d24fcc 100644
--- a/ishtar_common/management/commands/gdpr_clean.py
+++ b/ishtar_common/management/commands/gdpr_clean.py
@@ -4,6 +4,7 @@
import datetime
from django.conf import settings
from django.core.management.base import BaseCommand
+from django.utils import timezone
import sys
from ishtar_common.models import GDPRLog, GDPRPerson
@@ -15,7 +16,7 @@ def get_time():
def clean_gdpr():
- date = datetime.datetime.now() - (
+ date = timezone.now() - (
datetime.timedelta(days=settings.GDPR_RETENTION_PERIOD)
)
q = GDPRLog.objects.filter(date__lte=date)
diff --git a/ishtar_common/models.py b/ishtar_common/models.py
index a26eab5c9..9cc61742a 100644
--- a/ishtar_common/models.py
+++ b/ishtar_common/models.py
@@ -78,6 +78,7 @@ from django.db.utils import DatabaseError
from django.template import Context, Template
from django.template.defaultfilters import slugify
from django.urls import reverse
+from django.utils import timezone
from django.utils.functional import lazy
from django.utils.safestring import mark_safe
from ishtar_common.data_importer import ImporterError, post_importer_action
@@ -1997,7 +1998,7 @@ class StatsCache(models.Model):
model = models.CharField(_("Model name"), max_length=200)
model_pk = models.IntegerField(_("Associated primary key"))
values = JSONField(default=dict, blank=True)
- updated = models.DateTimeField(default=datetime.datetime.now)
+ updated = models.DateTimeField(default=timezone.now)
update_requested = models.DateTimeField(blank=True, null=True)
class Meta:
@@ -2482,7 +2483,7 @@ class DocumentTemplate(models.Model):
+ os.path.sep
+ slugify(self.name.replace(" ", "_").lower())
+ "-"
- + datetime.datetime.now().strftime("%Y-%m-%d-%H%M%S")
+ + timezone.now().strftime("%Y-%m-%d-%H%M%S")
)
suffix = "." + self.template.name.split(".")[-1]
len_objects = len(objects)
@@ -3500,7 +3501,7 @@ class GDPRPerson(models.Model):
class GDPRLog(models.Model):
user = models.ForeignKey(User, verbose_name=_("User"), on_delete=models.PROTECT, blank=True,
null=True)
- date = models.DateTimeField(verbose_name=_("Date"), default=datetime.datetime.now)
+ date = models.DateTimeField(verbose_name=_("Date"), default=timezone.now)
ip = models.GenericIPAddressField(verbose_name=_("IP"), blank=True, null=True)
routable_ip = models.BooleanField(verbose_name=_("Routable IP"), default=False)
activity = models.CharField(_("Activity"), max_length=2, choices=GDPR_ACTIVITY)
@@ -4001,7 +4002,7 @@ class BackgroundTask(models.Model):
state = models.CharField(
_("State"), max_length=2, choices=TASK_STATE, default="S"
)
- creation_date = models.DateTimeField(default=datetime.datetime.now)
+ creation_date = models.DateTimeField(default=timezone.now)
launch_date = models.DateTimeField(null=True, blank=True)
finished_date = models.DateTimeField(null=True, blank=True)
result = models.FileField(_("Result"), null=True, blank=True)
@@ -5632,7 +5633,7 @@ class Document(
for path in self._get_base_image_paths():
if path:
return path
- n = datetime.datetime.now()
+ n = timezone.now()
return "upload/{}/{:02d}/{:02d}".format(n.year, n.month, n.day)
def _get_available_filename(self, path, test_link=None):
@@ -6090,7 +6091,7 @@ class AdministrationTask(models.Model):
state = models.CharField(
_("State"), max_length=2, choices=SCRIPT_STATE, default="S"
)
- creation_date = models.DateTimeField(default=datetime.datetime.now)
+ creation_date = models.DateTimeField(default=timezone.now)
launch_date = models.DateTimeField(null=True, blank=True)
finished_date = models.DateTimeField(null=True, blank=True)
result = models.TextField(_("Result"), blank=True, default="")
@@ -6110,7 +6111,7 @@ class AdministrationTask(models.Model):
def execute(self):
if self.state != "S":
return
- self.launch_date = datetime.datetime.now()
+ self.launch_date = timezone.now()
script_dir = settings.ISHTAR_SCRIPT_DIR
@@ -6122,7 +6123,7 @@ class AdministrationTask(models.Model):
)
)
self.state = "FE"
- self.finished_date = datetime.datetime.now()
+ self.finished_date = timezone.now()
self.save()
return
@@ -6136,7 +6137,7 @@ class AdministrationTask(models.Model):
)
)
self.state = "FE"
- self.finished_date = datetime.datetime.now()
+ self.finished_date = timezone.now()
self.save()
return
@@ -6145,7 +6146,7 @@ class AdministrationTask(models.Model):
_('Your ISHTAR_SCRIPT_DIR: "{}" is not a valid directory.')
).format(script_dir)
self.state = "FE"
- self.finished_date = datetime.datetime.now()
+ self.finished_date = timezone.now()
self.save()
return
@@ -6165,13 +6166,13 @@ class AdministrationTask(models.Model):
)
).format(self.script.path)
self.state = "FE"
- self.finished_date = datetime.datetime.now()
+ self.finished_date = timezone.now()
self.save()
return
self.state = "P"
self.save()
- self.finished_date = datetime.datetime.now()
+ self.finished_date = timezone.now()
try:
# nosec: only script inside the script directory can be executed
# this script directory is not web available
@@ -6183,7 +6184,7 @@ class AdministrationTask(models.Model):
self.save()
return
- self.finished_date = datetime.datetime.now()
+ self.finished_date = timezone.now()
if stderr:
self.state = "FE"
self.result = "Error: {}".format(stderr.decode("utf-8"))
@@ -6248,7 +6249,7 @@ class ExportTask(models.Model):
export_dir = models.BooleanField(_("Export directory"), default=True)
export_docs = models.BooleanField(_("Export documents"), default=True)
export_items = models.BooleanField(_("Export main items"), default=True)
- creation_date = models.DateTimeField(default=datetime.datetime.now)
+ creation_date = models.DateTimeField(default=timezone.now)
launch_date = models.DateTimeField(null=True, blank=True)
finished_date = models.DateTimeField(null=True, blank=True)
result = models.FileField(
@@ -6287,7 +6288,7 @@ class ExportTask(models.Model):
class ImportTask(models.Model):
- creation_date = models.DateTimeField(default=datetime.datetime.now)
+ creation_date = models.DateTimeField(default=timezone.now)
launch_date = models.DateTimeField(null=True, blank=True)
finished_date = models.DateTimeField(null=True, blank=True)
import_user = models.ForeignKey(
diff --git a/ishtar_common/models_common.py b/ishtar_common/models_common.py
index ea7303089..dcb4f05a3 100644
--- a/ishtar_common/models_common.py
+++ b/ishtar_common/models_common.py
@@ -43,6 +43,7 @@ from django.db.models import JSONField, Q, Count, Max
from django.db.models.signals import post_save, post_delete, m2m_changed
from django.template import loader
from django.template.defaultfilters import slugify
+from django.utils import timezone
from django.utils.safestring import SafeText, mark_safe
from django.utils.translation import activate, deactivate
from ishtar_common.utils import (
@@ -1580,7 +1581,7 @@ class HistoricalRecords(BaseHistoricalRecords):
return
if not history_modifier:
return
- history_date = getattr(instance, "_history_date", datetime.datetime.now())
+ history_date = getattr(instance, "_history_date", timezone.now())
history_change_reason = getattr(instance, "changeReason", None)
force = getattr(instance, "_force_history", False)
manager = getattr(instance, self.manager_name)
@@ -1608,7 +1609,7 @@ class HistoricalRecords(BaseHistoricalRecords):
old_instance = q_history.all()[0]
# multiple saving by the same user in a very short time are generaly
# caused by post_save signals it is not relevant to keep them
- min_history_date = datetime.datetime.now() - datetime.timedelta(seconds=5)
+ min_history_date = timezone.now() - datetime.timedelta(seconds=5)
q = q_history.filter(
history_date__isnull=False, history_date__gt=min_history_date
).order_by("-history_date", "-history_id")
@@ -1670,8 +1671,8 @@ class BaseHistorizedItem(
blank=True,
null=True,
)
- last_modified = models.DateTimeField(blank=True, default=datetime.datetime.now)
- created = models.DateTimeField(blank=True, default=datetime.datetime.now)
+ last_modified = models.DateTimeField(blank=True, default=timezone.now)
+ created = models.DateTimeField(blank=True, default=timezone.now)
history_m2m = JSONField(default=dict, blank=True)
need_update = models.BooleanField(verbose_name=_("Need update"), default=False)
locked = models.BooleanField(
@@ -1800,11 +1801,13 @@ class BaseHistorizedItem(
else:
item = historized[step]
else:
+ date_match = False
for step, item in enumerate(historized):
- if item.history_date == date:
+ if item.history_date == timezone.make_aware(date, item.history_date.tzinfo):
+ date_match = True
break
# ended with no match
- if item.history_date != date:
+ if not date_match:
return
item._step = step
if len(historized) != (step + 1):
@@ -1943,7 +1946,7 @@ class BaseHistorizedItem(
if (not getattr(self, "skip_history_when_saving", False)
and not getattr(self, "_no_last_modified_update", False)) \
or not self.last_modified:
- self.last_modified = datetime.datetime.now()
+ self.last_modified = timezone.now()
if not getattr(self, "skip_history_when_saving", False):
if not hasattr(self, "history_modifier"):
raise NotImplementedError("Should have a history_modifier field.")
@@ -1981,7 +1984,7 @@ class BaseHistorizedItem(
class LightHistorizedItem(BaseHistorizedItem):
- history_date = models.DateTimeField(default=datetime.datetime.now)
+ history_date = models.DateTimeField(default=timezone.now)
class Meta:
abstract = True
@@ -4493,7 +4496,7 @@ def _update_stats(app, model, model_pk, funcname):
current_values[funcname] = value
sc.values = current_values
sc.update_requested = None
- sc.updated = datetime.datetime.now()
+ sc.updated = timezone.now()
sc.save()
@@ -4505,11 +4508,11 @@ def update_stats(statscache, item, funcname):
value = getattr(item, funcname)()
current_values[funcname] = value
statscache.values = current_values
- statscache.updated = datetime.datetime.now()
+ statscache.updated = timezone.now()
statscache.save()
return current_values
- now = datetime.datetime.now()
+ now = timezone.now()
app_name = item._meta.app_label
model_name = item._meta.model_name
statscache.update_requested = now.isoformat()
@@ -4870,7 +4873,7 @@ class ImageContainerModel:
return "{}/{}".format(self._get_base_image_path(), filename)
def _get_base_image_path(self):
- n = datetime.datetime.now()
+ n = timezone.now()
return "upload/{}/{:02d}/{:02d}".format(n.year, n.month, n.day)
diff --git a/ishtar_common/models_imports.py b/ishtar_common/models_imports.py
index 2747ebc01..273b0eab5 100644
--- a/ishtar_common/models_imports.py
+++ b/ishtar_common/models_imports.py
@@ -52,6 +52,7 @@ from django.db.models import Q
from django.db.models.base import ModelBase
from django.db.models.signals import pre_delete
from django.template.defaultfilters import slugify
+from django.utils import timezone
from django.utils.functional import cached_property
from django.utils.translation import gettext_lazy as _, pgettext_lazy
@@ -1536,7 +1537,7 @@ class BaseImport(models.Model, OwnPerms, SheetItem):
def archive(self):
self.state = "AC"
- self.end_date = datetime.datetime.now()
+ self.end_date = timezone.now()
self._archive()
def unarchive(self, state):
@@ -1556,7 +1557,7 @@ class BaseImport(models.Model, OwnPerms, SheetItem):
"info",
)
self.state = "IQ"
- self.end_date = datetime.datetime.now()
+ self.end_date = timezone.now()
self.save()
if self.SLUG == "import":
return delayed_import.delay(self.pk)
@@ -1688,12 +1689,12 @@ class ImportGroup(BaseImport):
def initialize(self, user=None, session_key=None):
self.state = "AP"
- self.end_date = datetime.datetime.now()
+ self.end_date = timezone.now()
self.save()
for imp in self.imports.all():
imp.initialize(user, session_key)
self.state = "A"
- self.end_date = datetime.datetime.now()
+ self.end_date = timezone.now()
self.save()
def importation(
@@ -1708,7 +1709,7 @@ class ImportGroup(BaseImport):
if not q.count():
return
self.state = "IP"
- self.end_date = datetime.datetime.now()
+ self.end_date = timezone.now()
self.save()
first = self.import_list()[0]
first.importation(
@@ -1724,7 +1725,7 @@ class ImportGroup(BaseImport):
self.state = "FE"
else:
self.state = "F"
- self.end_date = datetime.datetime.now()
+ self.end_date = timezone.now()
self.save()
def _unarchive(self):
@@ -2236,7 +2237,7 @@ class Import(BaseImport):
data.to_csv(filename, index=False, columns=data.columns[range(last_column)],
float_format=np_format_int_float)
except IndexError:
- error_file = f"{slugify(self.name)}_errors_{datetime.datetime.now().strftime('%Y-%m-%d-%H%M')}.csv"
+ error_file = f"{slugify(self.name)}_errors_{timezone.now().strftime('%Y-%m-%d-%H%M')}.csv"
error = str(_("Error while opening the file. Particularly check the number of columns of your file."))
csv_file = f"line,error\n-,{error}"
self.error_file.save(
@@ -2568,7 +2569,7 @@ class Import(BaseImport):
def initialize(self, user=None, session_key=None):
self.state = "AP"
- self.end_date = datetime.datetime.now()
+ self.end_date = timezone.now()
if user and not self.user:
self.user = user
self.save()
@@ -2583,7 +2584,7 @@ class Import(BaseImport):
self.save()
return
self.state = "A"
- self.end_date = datetime.datetime.now()
+ self.end_date = timezone.now()
self.save()
def delayed_check_modified(self, session_key):
@@ -2595,13 +2596,13 @@ class Import(BaseImport):
"info",
)
self.state = "HQ"
- self.end_date = datetime.datetime.now()
+ self.end_date = timezone.now()
self.save()
return delayed_check.delay(self.pk)
def check_modified(self, session_key=None):
self.state = "HP"
- self.end_date = datetime.datetime.now()
+ self.end_date = timezone.now()
self.changed_line_numbers = ""
self.changed_checked = False
self.save()
@@ -2664,7 +2665,7 @@ class Import(BaseImport):
verbose=False
):
self.state = "IP"
- self.end_date = datetime.datetime.now()
+ self.end_date = timezone.now()
if not line_to_process: # full import
self.imported_line_numbers = ""
self.current_line = 0
@@ -2702,7 +2703,7 @@ class Import(BaseImport):
return importer, None
# result file
filename = slugify(self.importer_type.name)
- now = datetime.datetime.now().isoformat("-").replace(":", "")
+ now = timezone.now().isoformat("-").replace(":", "")
result_file = filename + "_result_%s.csv" % now
self.result_file.save(
result_file, ContentFile(importer.get_csv_result().encode("utf-8"))
@@ -2742,7 +2743,7 @@ class Import(BaseImport):
self.match_file.save(
match_file, ContentFile(importer.get_csv_matches().encode("utf-8"))
)
- self.end_date = datetime.datetime.now()
+ self.end_date = timezone.now()
self.save()
if self.next_import and not importer.errors:
return self.next_import.importation(
diff --git a/ishtar_common/serializers_utils.py b/ishtar_common/serializers_utils.py
index a4494d9c9..d9866f5da 100644
--- a/ishtar_common/serializers_utils.py
+++ b/ishtar_common/serializers_utils.py
@@ -13,6 +13,7 @@ from django.contrib.contenttypes.models import ContentType
from django.contrib.sites.models import Site
from django.core.serializers import serialize
from django.db.models import Q
+from django.utils import timezone
from ishtar_common.version import get_version
from . import models
@@ -46,7 +47,7 @@ def serialization_info(info=None):
"ishtar-version": get_version(),
"domain": site.domain,
"name": site.name,
- "date": datetime.datetime.now().isoformat(),
+ "date": timezone.now().isoformat(),
}
if info:
base_info.update(info)
diff --git a/ishtar_common/tasks.py b/ishtar_common/tasks.py
index 24ae02dcc..08f5dd10d 100644
--- a/ishtar_common/tasks.py
+++ b/ishtar_common/tasks.py
@@ -17,14 +17,11 @@
# See the file COPYING for details.
-import datetime
-
import os
import sys
-from django.conf import settings
from django.core.files import File
-from django.db.models import Q
+from django.utils import timezone
from django.utils.translation import gettext_lazy as _
from ishtar_common.models_common import Town, Department
@@ -56,7 +53,7 @@ def launch_import(import_task_id):
return
if import_task.state != "S":
return
- import_task.launch_date = datetime.datetime.now()
+ import_task.launch_date = timezone.now()
import_task.state = "P"
import_task.save()
@@ -66,7 +63,7 @@ def launch_import(import_task_id):
delete_existing=import_task.delete_before,
release_locks=import_task.releasing_locks,
)
- import_task.finished_date = datetime.datetime.now()
+ import_task.finished_date = timezone.now()
import_task.state = "F"
import_task.save()
@@ -79,7 +76,7 @@ def launch_export(export_task_id):
return
if export_task.state != "S":
return
- export_task.launch_date = datetime.datetime.now()
+ export_task.launch_date = timezone.now()
export_task.state = "P"
export_task.save()
@@ -176,7 +173,7 @@ def launch_export(export_task_id):
with open(archive_name, "rb") as result:
export_task.result.save(archive_name.split(os.sep)[-1], File(result))
os.remove(archive_name)
- export_task.finished_date = datetime.datetime.now()
+ export_task.finished_date = timezone.now()
export_task.state = "F"
export_task.result_info = str(_("Export finished"))
export_task.save()
diff --git a/ishtar_common/utils.py b/ishtar_common/utils.py
index 8d5f5ec20..e3a1a00fc 100644
--- a/ishtar_common/utils.py
+++ b/ishtar_common/utils.py
@@ -70,6 +70,7 @@ from django.db.models import Q
from django.db.models.functions import Length
from django.http import HttpResponseRedirect
from django.urls import re_path, reverse, NoReverseMatch
+from django.utils import timezone
from django.utils.crypto import get_random_string
from django.utils.datastructures import MultiValueDict as BaseMultiValueDict
from django.utils.formats import date_format
@@ -943,7 +944,7 @@ def get_file_from_link(file_link):
def get_current_year():
- return datetime.datetime.now().year
+ return datetime.date.today().year
def get_cache(cls, extra_args=tuple(), app_label=None):
@@ -2384,7 +2385,7 @@ def m2m_historization_changed(sender, **kwargs):
if q.count():
hist = q.all()[0]
hist.history_m2m = hist_values
- hist.history_date = hist.last_modified = datetime.datetime.now()
+ hist.history_date = hist.last_modified = timezone.now()
hist.save()
obj.skip_history_when_saving = True
elif not obj.history_modifier:
@@ -2990,7 +2991,7 @@ def duplicate_item(item, user=None, data=None):
def get_image_path(instance, filename):
# when using migrations instance is not a real ImageModel instance
if not hasattr(instance, "_get_image_path"):
- n = datetime.datetime.now()
+ n = datetime.date.today()
return "upload/{}/{:02d}/{:02d}/{}".format(n.year, n.month, n.day, filename)
return instance._get_image_path(filename)
diff --git a/ishtar_common/views.py b/ishtar_common/views.py
index e37136bcd..df3fe9fed 100644
--- a/ishtar_common/views.py
+++ b/ishtar_common/views.py
@@ -55,7 +55,7 @@ from django.http import (
)
from django.shortcuts import redirect, render, get_object_or_404
from django.urls import reverse, NoReverseMatch
-from django.utils import translation
+from django.utils import timezone, translation
from django.utils.decorators import method_decorator
from django.utils.translation import gettext, gettext_lazy as _
from django.views.generic import ListView, TemplateView, View
@@ -1908,7 +1908,7 @@ class ImportListView(IshtarMixin, LoginRequiredMixin, ListView):
imprt.importation()
except ImporterError as e:
imprt.state = "FE"
- imprt.end_date = datetime.datetime.now()
+ imprt.end_date = timezone.now()
imprt.save()
put_session_message(
request.session.session_key,
diff --git a/ishtar_common/views_item.py b/ishtar_common/views_item.py
index 95ef1d8ad..bb61745ef 100644
--- a/ishtar_common/views_item.py
+++ b/ishtar_common/views_item.py
@@ -56,6 +56,7 @@ from django.http import HttpResponse, Http404
from django.shortcuts import render
from django.template import loader
from django.urls import reverse, NoReverseMatch
+from django.utils import timezone
from django.utils.translation import (
activate,
deactivate,
@@ -584,7 +585,6 @@ def show_item(model, name, extra_dct=None, model_for_perms=None, callback=None):
dct["get_import_updated"] = item.get_imports_updated(request.user, limit=5)
if hasattr(item, "history") and request.user.is_superuser:
-
if date:
try:
if not isinstance(date, datetime.datetime):
@@ -3155,7 +3155,7 @@ def get_item(
return HttpResponse(data, content_type="application/json")
elif data_type == "csv":
response = HttpResponse(content_type="text/csv", charset=ENCODING)
- n = datetime.datetime.now()
+ n = timezone.now()
filename = "%s_%s.csv" % (default_name, n.strftime("%Y%m%d-%H%M%S"))
response["Content-Disposition"] = "attachment; filename=%s" % filename
writer = csv.writer(response, **CSV_OPTIONS)
@@ -3351,7 +3351,7 @@ def external_export(request, source_id, model_name, slug):
return HttpResponse(lbl, status=response.status_code)
response = HttpResponse(response.text, content_type="text/csv")
- n = datetime.datetime.now()
+ n = timezone.now()
filename = f"{model_name}-{n.strftime('%Y%m%d-%H%M%S')}.csv"
response["Content-Disposition"] = "attachment; filename=%s" % filename
return response
diff --git a/ishtar_common/wizards.py b/ishtar_common/wizards.py
index 8d58b4146..d29ebf365 100644
--- a/ishtar_common/wizards.py
+++ b/ishtar_common/wizards.py
@@ -47,6 +47,7 @@ from django.http import HttpResponseRedirect, Http404
from django.forms import ValidationError
from django.shortcuts import redirect, render, reverse
from django.template import loader
+from django.utils import timezone
from django.utils.translation import gettext_lazy as _
from django.utils.safestring import mark_safe
@@ -2117,7 +2118,7 @@ class AccountWizard(Wizard):
account.username = dct["username"]
account.email = dct["email"]
except ObjectDoesNotExist:
- now = datetime.datetime.now()
+ now = timezone.now()
account = models.User.objects.create(
username=dct["username"],
email=dct["email"],