diff options
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 |
commit | 79fdfeb620c9b95ad44c34a22d5d661baa55bc92 (patch) | |
tree | 5ff848a9ff7ac9a89794a153a5b249d7aecdb678 | |
parent | b596f92c7f96a3ee4cdcfd00b4f4ddb11d4e4711 (diff) | |
download | Ishtar-79fdfeb620c9b95ad44c34a22d5d661baa55bc92.tar.bz2 Ishtar-79fdfeb620c9b95ad44c34a22d5d661baa55bc92.zip |
♻️ django: fix warnings for v5 - migrate to timezone aware dates
-rw-r--r-- | archaeological_finds/forms_treatments.py | 8 | ||||
-rw-r--r-- | archaeological_finds/models_treatments.py | 6 | ||||
-rw-r--r-- | archaeological_warehouse/models.py | 3 | ||||
-rw-r--r-- | example_project/settings.py | 9 | ||||
-rw-r--r-- | ishtar_common/admin.py | 4 | ||||
-rw-r--r-- | ishtar_common/forms.py | 4 | ||||
-rw-r--r-- | ishtar_common/forms_common.py | 2 | ||||
-rw-r--r-- | ishtar_common/management/commands/gdpr_clean.py | 3 | ||||
-rw-r--r-- | ishtar_common/models.py | 31 | ||||
-rw-r--r-- | ishtar_common/models_common.py | 27 | ||||
-rw-r--r-- | ishtar_common/models_imports.py | 29 | ||||
-rw-r--r-- | ishtar_common/serializers_utils.py | 3 | ||||
-rw-r--r-- | ishtar_common/tasks.py | 13 | ||||
-rw-r--r-- | ishtar_common/utils.py | 7 | ||||
-rw-r--r-- | ishtar_common/views.py | 4 | ||||
-rw-r--r-- | ishtar_common/views_item.py | 6 | ||||
-rw-r--r-- | ishtar_common/wizards.py | 3 |
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"], |