diff --git a/chrono/agendas/management/commands/anonymize_bookings.py b/chrono/agendas/management/commands/anonymize_bookings.py index e4540e87..0e4ba188 100644 --- a/chrono/agendas/management/commands/anonymize_bookings.py +++ b/chrono/agendas/management/commands/anonymize_bookings.py @@ -18,9 +18,9 @@ from datetime import timedelta from django.core.management.base import BaseCommand from django.db.models import F -from django.utils import timezone from chrono.agendas.models import Booking +from chrono.utils import timezone class Command(BaseCommand): diff --git a/chrono/agendas/management/commands/cancel_events.py b/chrono/agendas/management/commands/cancel_events.py index 37ff4af8..880fba4f 100644 --- a/chrono/agendas/management/commands/cancel_events.py +++ b/chrono/agendas/management/commands/cancel_events.py @@ -18,10 +18,10 @@ from datetime import timedelta from django.core.management.base import BaseCommand from django.db import transaction -from django.utils import timezone from requests import RequestException from chrono.agendas.models import Event, EventCancellationReport +from chrono.utils import timezone class Command(BaseCommand): diff --git a/chrono/agendas/management/commands/send_booking_reminders.py b/chrono/agendas/management/commands/send_booking_reminders.py index cf9c22b7..0fa44826 100644 --- a/chrono/agendas/management/commands/send_booking_reminders.py +++ b/chrono/agendas/management/commands/send_booking_reminders.py @@ -20,9 +20,10 @@ import pytz from django.conf import settings from django.core.management.base import BaseCommand from django.db.models import F -from django.utils import timezone, translation +from django.utils import translation from chrono.agendas.models import Booking +from chrono.utils import timezone from .utils import send_reminder diff --git a/chrono/agendas/management/commands/send_email_notifications.py b/chrono/agendas/management/commands/send_email_notifications.py index f1f8f559..ba39074d 100644 --- a/chrono/agendas/management/commands/send_email_notifications.py +++ b/chrono/agendas/management/commands/send_email_notifications.py @@ -22,10 +22,11 @@ from django.core.mail import send_mail from django.core.management.base import BaseCommand from django.db.transaction import atomic from django.template.loader import render_to_string -from django.utils import timezone, translation +from django.utils import translation from django.utils.translation import gettext_lazy as _ from chrono.agendas.models import Agenda +from chrono.utils import timezone class Command(BaseCommand): diff --git a/chrono/agendas/management/commands/utils.py b/chrono/agendas/management/commands/utils.py index edec8362..27c8c974 100644 --- a/chrono/agendas/management/commands/utils.py +++ b/chrono/agendas/management/commands/utils.py @@ -5,10 +5,10 @@ from django.core.mail import send_mail from django.db.transaction import atomic from django.template import Context, Template, TemplateSyntaxError, VariableDoesNotExist from django.template.loader import render_to_string -from django.utils import timezone from django.utils.translation import gettext_lazy as _ from requests import RequestException +from chrono.utils import timezone from chrono.utils.requests_wrapper import requests diff --git a/chrono/agendas/migrations/0006_auto_20160707_1357.py b/chrono/agendas/migrations/0006_auto_20160707_1357.py index 7ae48771..2de368c3 100644 --- a/chrono/agendas/migrations/0006_auto_20160707_1357.py +++ b/chrono/agendas/migrations/0006_auto_20160707_1357.py @@ -1,7 +1,8 @@ import datetime from django.db import migrations, models -from django.utils.timezone import utc + +from chrono.utils.timezone import utc class Migration(migrations.Migration): diff --git a/chrono/agendas/migrations/0020_auto_20171102_1021.py b/chrono/agendas/migrations/0020_auto_20171102_1021.py index 6686bd2f..bc56bff9 100644 --- a/chrono/agendas/migrations/0020_auto_20171102_1021.py +++ b/chrono/agendas/migrations/0020_auto_20171102_1021.py @@ -1,7 +1,8 @@ import datetime from django.db import migrations, models -from django.utils.timezone import utc + +from chrono.utils.timezone import utc class Migration(migrations.Migration): diff --git a/chrono/agendas/migrations/0102_publication_datetime.py b/chrono/agendas/migrations/0102_publication_datetime.py index 6b560a46..2f79d86b 100644 --- a/chrono/agendas/migrations/0102_publication_datetime.py +++ b/chrono/agendas/migrations/0102_publication_datetime.py @@ -1,7 +1,8 @@ import datetime from django.db import migrations -from django.utils.timezone import localtime, make_aware + +from chrono.utils.timezone import localtime, make_aware def forwards(apps, schema_editor): diff --git a/chrono/agendas/migrations/0138_sharedcustodyagenda_date_start.py b/chrono/agendas/migrations/0138_sharedcustodyagenda_date_start.py index 29bb4625..371c346a 100644 --- a/chrono/agendas/migrations/0138_sharedcustodyagenda_date_start.py +++ b/chrono/agendas/migrations/0138_sharedcustodyagenda_date_start.py @@ -1,8 +1,9 @@ # Generated by Django 2.2.26 on 2022-06-29 13:14 -import django.utils.timezone from django.db import migrations, models +import chrono.utils.timezone + class Migration(migrations.Migration): @@ -14,7 +15,7 @@ class Migration(migrations.Migration): migrations.AddField( model_name='sharedcustodyagenda', name='date_start', - field=models.DateTimeField(default=django.utils.timezone.now, verbose_name='Start'), + field=models.DateTimeField(default=chrono.utils.timezone.now, verbose_name='Start'), preserve_default=False, ), ] diff --git a/chrono/agendas/models.py b/chrono/agendas/models.py index 6e100285..6ad8690f 100644 --- a/chrono/agendas/models.py +++ b/chrono/agendas/models.py @@ -63,7 +63,6 @@ from django.utils.html import escape from django.utils.module_loading import import_string from django.utils.safestring import mark_safe from django.utils.text import slugify -from django.utils.timezone import is_aware, localtime, make_aware, make_naive, now, utc from django.utils.translation import gettext from django.utils.translation import gettext_lazy as _ from django.utils.translation import ngettext, pgettext_lazy @@ -74,6 +73,7 @@ from chrono.utils.db import ArraySubquery, SumCardinality from chrono.utils.misc import AgendaImportError, ICSError, clean_import_data, generate_slug from chrono.utils.publik_urls import translate_from_publik_url from chrono.utils.requests_wrapper import requests as requests_wrapper +from chrono.utils.timezone import is_aware, localtime, make_aware, make_naive, now, utc AGENDA_KINDS = ( ('events', _('Events')), @@ -2973,7 +2973,7 @@ class TimePeriodException(models.Model): def import_datetime(s): '''Import datetime as a naive ISO8601 serialization''' try: - return make_aware(datetime.datetime.strptime(s, '%Y-%m-%d %H:%M:%S'), is_dst=True) + return make_aware(datetime.datetime.strptime(s, '%Y-%m-%d %H:%M:%S')) except ValueError: raise AgendaImportError(_('Bad datetime format "%s"') % s) diff --git a/chrono/api/views.py b/chrono/api/views.py index 4a8b0f79..7ae8a818 100644 --- a/chrono/api/views.py +++ b/chrono/api/views.py @@ -32,7 +32,6 @@ from django.urls import reverse from django.utils.dates import WEEKDAYS from django.utils.encoding import force_str from django.utils.formats import date_format -from django.utils.timezone import localtime, make_aware, now from django.utils.translation import gettext from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_noop as N_ @@ -58,6 +57,7 @@ from chrono.api import serializers from chrono.api.utils import APIError, APIErrorBadRequest, Response from chrono.interval import IntervalSet from chrono.utils.publik_urls import translate_to_publik_url +from chrono.utils.timezone import localtime, make_aware, now def format_response_datetime(dt): diff --git a/chrono/manager/forms.py b/chrono/manager/forms.py index b1fce2aa..4192dea3 100644 --- a/chrono/manager/forms.py +++ b/chrono/manager/forms.py @@ -37,7 +37,6 @@ from django.template import Context, Template, TemplateSyntaxError, VariableDoes from django.utils.encoding import force_str from django.utils.formats import date_format from django.utils.html import format_html, mark_safe -from django.utils.timezone import localtime, make_aware, now from django.utils.translation import gettext_lazy as _ from chrono.agendas.models import ( @@ -68,6 +67,7 @@ from chrono.agendas.models import ( generate_slug, ) from chrono.utils.lingo import get_agenda_check_types +from chrono.utils.timezone import localtime, make_aware, now from . import widgets from .widgets import SplitDateTimeField, WeekdaysWidget diff --git a/chrono/manager/views.py b/chrono/manager/views.py index 7a548a45..0411c90a 100644 --- a/chrono/manager/views.py +++ b/chrono/manager/views.py @@ -42,7 +42,6 @@ from django.utils.dates import MONTHS from django.utils.encoding import force_str from django.utils.formats import date_format from django.utils.html import format_html -from django.utils.timezone import localtime, make_aware, make_naive, now from django.utils.translation import gettext_lazy as _ from django.utils.translation import ngettext from django.views.generic import ( @@ -88,6 +87,7 @@ from chrono.agendas.models import ( VirtualMember, ) from chrono.utils.date import get_weekday_index +from chrono.utils.timezone import localtime, make_aware, make_naive, now from .forms import ( AgendaAddForm, diff --git a/chrono/utils/timezone.py b/chrono/utils/timezone.py new file mode 100644 index 00000000..74dfa9d2 --- /dev/null +++ b/chrono/utils/timezone.py @@ -0,0 +1,66 @@ +# chrono - agendas system +# Copyright (C) 2023 Entr'ouvert +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU Affero General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . + +import datetime +import functools +import zoneinfo + +import django.utils.timezone +from django.conf import settings + +utc = zoneinfo.ZoneInfo('UTC') + + +@functools.lru_cache() +def get_default_timezone(): + """ + Return the default time zone as a tzinfo instance. + + This is the time zone defined by settings.TIME_ZONE. + """ + return zoneinfo.ZoneInfo(settings.TIME_ZONE) + + +def localtime(value=None, timezone=None): + if timezone is None: + timezone = get_default_timezone() + return django.utils.timezone.localtime(value=value, timezone=timezone) + + +is_aware = django.utils.timezone.is_aware + + +def make_aware(value, timezone=None, is_dst=None): + if timezone is None: + timezone = get_default_timezone() + return django.utils.timezone.make_aware(value, timezone=timezone, is_dst=is_dst) + + +def make_naive(value, timezone=None): + if timezone is None: + timezone = get_default_timezone() + return django.utils.timezone.make_naive(value, timezone=timezone) + + +def now(): + """ + Return an aware or naive datetime.datetime, depending on settings.USE_TZ. + """ + if settings.USE_TZ: + # timeit shows that datetime.now(tz=utc) is 24% slower + return datetime.datetime.utcnow().replace(tzinfo=utc) + else: + return datetime.datetime.now() diff --git a/tests/api/conftest.py b/tests/api/conftest.py index 06109231..a6631644 100644 --- a/tests/api/conftest.py +++ b/tests/api/conftest.py @@ -2,9 +2,9 @@ import datetime import pytest from django.contrib.auth import get_user_model -from django.utils.timezone import localtime, make_aware, now from chrono.agendas.models import Agenda, Desk, Event, MeetingType, TimePeriod, VirtualMember +from chrono.utils.timezone import localtime, make_aware, now User = get_user_model() diff --git a/tests/api/datetimes/test_all.py b/tests/api/datetimes/test_all.py index 6c9a1039..72b71aee 100644 --- a/tests/api/datetimes/test_all.py +++ b/tests/api/datetimes/test_all.py @@ -5,9 +5,9 @@ import pytest from django.db import connection from django.test import override_settings from django.test.utils import CaptureQueriesContext -from django.utils.timezone import localtime, make_aware, make_naive, now from chrono.agendas.models import Agenda, Booking, Desk, Event, EventsType, TimePeriodException +from chrono.utils.timezone import localtime, make_aware, make_naive, now from tests.utils import login pytestmark = pytest.mark.django_db diff --git a/tests/api/datetimes/test_events_multiple_agendas.py b/tests/api/datetimes/test_events_multiple_agendas.py index c351f6c8..43d4a2c7 100644 --- a/tests/api/datetimes/test_events_multiple_agendas.py +++ b/tests/api/datetimes/test_events_multiple_agendas.py @@ -3,7 +3,6 @@ import datetime import pytest from django.db import connection from django.test.utils import CaptureQueriesContext -from django.utils.timezone import localtime, make_aware, now from chrono.agendas.models import ( Agenda, @@ -22,6 +21,7 @@ from chrono.agendas.models import ( TimePeriodExceptionGroup, UnavailabilityCalendar, ) +from chrono.utils.timezone import localtime, make_aware, now pytestmark = pytest.mark.django_db diff --git a/tests/api/datetimes/test_meetings.py b/tests/api/datetimes/test_meetings.py index 3b35a288..6f953d76 100644 --- a/tests/api/datetimes/test_meetings.py +++ b/tests/api/datetimes/test_meetings.py @@ -3,7 +3,6 @@ import datetime import pytest from django.db import connection from django.test.utils import CaptureQueriesContext -from django.utils.timezone import localtime, make_aware, now from chrono.agendas.models import ( Agenda, @@ -17,6 +16,7 @@ from chrono.agendas.models import ( UnavailabilityCalendar, VirtualMember, ) +from chrono.utils.timezone import localtime, make_aware, now pytestmark = pytest.mark.django_db diff --git a/tests/api/datetimes/test_recurring_events.py b/tests/api/datetimes/test_recurring_events.py index 78b5a7c6..7ea8a660 100644 --- a/tests/api/datetimes/test_recurring_events.py +++ b/tests/api/datetimes/test_recurring_events.py @@ -3,7 +3,6 @@ import datetime import pytest from django.db import connection from django.test.utils import CaptureQueriesContext -from django.utils.timezone import make_aware, now from chrono.agendas.models import ( Agenda, @@ -22,6 +21,7 @@ from chrono.agendas.models import ( TimePeriodExceptionGroup, UnavailabilityCalendar, ) +from chrono.utils.timezone import make_aware, now pytestmark = pytest.mark.django_db diff --git a/tests/api/fillslot/test_all.py b/tests/api/fillslot/test_all.py index c750f7ba..b16a9eb4 100644 --- a/tests/api/fillslot/test_all.py +++ b/tests/api/fillslot/test_all.py @@ -6,7 +6,6 @@ from unittest import mock import pytest from django.db import IntegrityError, connection from django.test.utils import CaptureQueriesContext -from django.utils.timezone import localtime, now from chrono.agendas.models import ( Agenda, @@ -19,6 +18,7 @@ from chrono.agendas.models import ( TimePeriod, VirtualMember, ) +from chrono.utils.timezone import localtime, now pytestmark = pytest.mark.django_db diff --git a/tests/api/fillslot/test_events.py b/tests/api/fillslot/test_events.py index 1aa770bf..5b4a9624 100644 --- a/tests/api/fillslot/test_events.py +++ b/tests/api/fillslot/test_events.py @@ -3,9 +3,9 @@ import datetime import pytest from django.db import connection from django.test.utils import CaptureQueriesContext -from django.utils.timezone import localtime, now from chrono.agendas.models import Agenda, Booking, Event, EventsType +from chrono.utils.timezone import localtime, now pytestmark = pytest.mark.django_db diff --git a/tests/api/fillslot/test_events_multiple_agendas.py b/tests/api/fillslot/test_events_multiple_agendas.py index a2daf1ac..04e5d173 100644 --- a/tests/api/fillslot/test_events_multiple_agendas.py +++ b/tests/api/fillslot/test_events_multiple_agendas.py @@ -3,7 +3,6 @@ import datetime import pytest from django.db import connection from django.test.utils import CaptureQueriesContext -from django.utils.timezone import localtime, make_aware, now from chrono.agendas.models import ( Agenda, @@ -17,6 +16,7 @@ from chrono.agendas.models import ( SharedCustodyRule, Subscription, ) +from chrono.utils.timezone import localtime, make_aware, now pytestmark = pytest.mark.django_db diff --git a/tests/api/fillslot/test_recurring_events.py b/tests/api/fillslot/test_recurring_events.py index 74612d86..dd67f3f7 100644 --- a/tests/api/fillslot/test_recurring_events.py +++ b/tests/api/fillslot/test_recurring_events.py @@ -3,7 +3,6 @@ import datetime import pytest from django.db import connection from django.test.utils import CaptureQueriesContext -from django.utils.timezone import now from chrono.agendas.models import ( Agenda, @@ -17,6 +16,7 @@ from chrono.agendas.models import ( SharedCustodyRule, Subscription, ) +from chrono.utils.timezone import now pytestmark = pytest.mark.django_db diff --git a/tests/api/test_agenda.py b/tests/api/test_agenda.py index eb5381bb..e0fd3577 100644 --- a/tests/api/test_agenda.py +++ b/tests/api/test_agenda.py @@ -4,7 +4,6 @@ import pytest from django.contrib.auth.models import Group from django.db import connection from django.test.utils import CaptureQueriesContext -from django.utils.timezone import localtime, now from chrono.agendas.models import ( Agenda, @@ -16,6 +15,7 @@ from chrono.agendas.models import ( Resource, TimePeriodException, ) +from chrono.utils.timezone import localtime, now pytestmark = pytest.mark.django_db diff --git a/tests/api/test_booking.py b/tests/api/test_booking.py index 41bdf73b..bc2b1d53 100644 --- a/tests/api/test_booking.py +++ b/tests/api/test_booking.py @@ -4,10 +4,10 @@ from unittest import mock import pytest from django.db import connection from django.test.utils import CaptureQueriesContext -from django.utils.timezone import localtime, make_aware, now from chrono.agendas.models import Agenda, Booking, BookingColor, Category, Desk, Event, MeetingType from chrono.utils.lingo import CheckType +from chrono.utils.timezone import localtime, make_aware, now pytestmark = pytest.mark.django_db diff --git a/tests/api/test_event.py b/tests/api/test_event.py index a5b7b002..3c3aad3e 100644 --- a/tests/api/test_event.py +++ b/tests/api/test_event.py @@ -3,9 +3,9 @@ import datetime import pytest from django.db import connection from django.test.utils import CaptureQueriesContext -from django.utils.timezone import localtime, make_aware, now from chrono.agendas.models import Agenda, Booking, Event, EventsType, Subscription +from chrono.utils.timezone import localtime, make_aware, now pytestmark = pytest.mark.django_db diff --git a/tests/api/test_serializer.py b/tests/api/test_serializer.py index d5f927bc..4771caae 100644 --- a/tests/api/test_serializer.py +++ b/tests/api/test_serializer.py @@ -1,10 +1,10 @@ import datetime import pytest -from django.utils.timezone import now from chrono.agendas.models import Agenda, Subscription from chrono.api.serializers import AgendaOrSubscribedSlugsSerializer +from chrono.utils.timezone import now pytestmark = pytest.mark.django_db diff --git a/tests/api/test_shared_custody.py b/tests/api/test_shared_custody.py index f2061d7a..2802b901 100644 --- a/tests/api/test_shared_custody.py +++ b/tests/api/test_shared_custody.py @@ -2,9 +2,9 @@ import datetime import pytest from django.core.files.base import ContentFile -from django.utils.timezone import now from chrono.agendas.models import Person, SharedCustodyAgenda, SharedCustodySettings, UnavailabilityCalendar +from chrono.utils.timezone import now pytestmark = pytest.mark.django_db diff --git a/tests/api/test_statistics.py b/tests/api/test_statistics.py index 639a0d1a..529885f9 100644 --- a/tests/api/test_statistics.py +++ b/tests/api/test_statistics.py @@ -1,7 +1,7 @@ import pytest -from django.utils.timezone import now from chrono.agendas.models import Agenda, Booking, Category, Event +from chrono.utils.timezone import now pytestmark = pytest.mark.django_db diff --git a/tests/api/test_subscription.py b/tests/api/test_subscription.py index 5e11a332..3745d0ca 100644 --- a/tests/api/test_subscription.py +++ b/tests/api/test_subscription.py @@ -1,9 +1,9 @@ import datetime import pytest -from django.utils.timezone import make_aware, now from chrono.agendas.models import Agenda, Booking, Event, Subscription +from chrono.utils.timezone import make_aware, now pytestmark = pytest.mark.django_db diff --git a/tests/manager/test_all.py b/tests/manager/test_all.py index 636808ed..b0b15427 100644 --- a/tests/manager/test_all.py +++ b/tests/manager/test_all.py @@ -10,7 +10,6 @@ from django.core.management import call_command from django.db import connection from django.test import override_settings from django.test.utils import CaptureQueriesContext -from django.utils.timezone import localtime, make_aware, now from chrono.agendas.models import ( Agenda, @@ -26,6 +25,7 @@ from chrono.agendas.models import ( VirtualMember, ) from chrono.utils.signature import check_query +from chrono.utils.timezone import localtime, make_aware, now from tests.utils import login pytestmark = pytest.mark.django_db @@ -1311,7 +1311,7 @@ def test_agenda_events_week_view(app, admin_user): assert len(resp.pyquery.find('.event-title')) == 2 time = localtime(event.start_datetime).strftime('%H%M') - resp = resp.click('Dec. 9, 2020, 1 a.m.', index=1) + resp = resp.click('Dec. 9, 2020, 2 a.m.', index=1) resp = resp.click('Options') resp.form['start_datetime_1'] = '13:12' resp = resp.form.submit(status=302).follow() @@ -1412,7 +1412,7 @@ def test_agenda_events_month_view(app, admin_user): assert len(resp.pyquery.find('.event-title')) == 10 time = localtime(event.start_datetime).strftime('%H%M') - resp = resp.click('Dec. 9, 2020, 1 a.m.', index=1) + resp = resp.click('Dec. 9, 2020, 2 a.m.', index=1) resp = resp.click('Options') resp.form['start_datetime_1'] = '13:12' resp = resp.form.submit(status=302).follow() diff --git a/tests/manager/test_event.py b/tests/manager/test_event.py index 8b48d005..eaf998b6 100644 --- a/tests/manager/test_event.py +++ b/tests/manager/test_event.py @@ -8,11 +8,11 @@ from django.core.management import call_command from django.db import connection from django.test import override_settings from django.test.utils import CaptureQueriesContext -from django.utils.timezone import localtime, make_aware, now from webtest import Upload from chrono.agendas.models import Agenda, Booking, Desk, Event, EventsType, Subscription from chrono.utils.lingo import CheckType +from chrono.utils.timezone import localtime, make_aware, now from tests.utils import login pytestmark = pytest.mark.django_db diff --git a/tests/manager/test_event_timesheet.py b/tests/manager/test_event_timesheet.py index c7c913ff..4426a81a 100644 --- a/tests/manager/test_event_timesheet.py +++ b/tests/manager/test_event_timesheet.py @@ -4,9 +4,9 @@ import itertools import pytest from django.db import connection from django.test.utils import CaptureQueriesContext -from django.utils.timezone import make_aware, now from chrono.agendas.models import Agenda, Booking, Event, Subscription +from chrono.utils.timezone import make_aware, now from tests.utils import login pytestmark = pytest.mark.django_db diff --git a/tests/manager/test_exception.py b/tests/manager/test_exception.py index e4e0f8c0..7fb30e9f 100644 --- a/tests/manager/test_exception.py +++ b/tests/manager/test_exception.py @@ -10,7 +10,6 @@ from django.db import connection from django.test import override_settings from django.test.utils import CaptureQueriesContext from django.urls import reverse -from django.utils.timezone import localtime, make_aware, now from webtest import Upload from chrono.agendas.models import ( @@ -25,6 +24,7 @@ from chrono.agendas.models import ( UnavailabilityCalendar, ) from chrono.manager.forms import TimePeriodExceptionForm +from chrono.utils.timezone import localtime, make_aware, now from tests.utils import login pytestmark = pytest.mark.django_db diff --git a/tests/manager/test_import_export.py b/tests/manager/test_import_export.py index 698b13fb..eb513666 100644 --- a/tests/manager/test_import_export.py +++ b/tests/manager/test_import_export.py @@ -4,7 +4,6 @@ import json import freezegun import pytest from django.utils.encoding import force_str -from django.utils.timezone import now from webtest import Upload from chrono.agendas.models import ( @@ -16,6 +15,7 @@ from chrono.agendas.models import ( SharedCustodySettings, UnavailabilityCalendar, ) +from chrono.utils.timezone import now from tests.utils import login pytestmark = pytest.mark.django_db diff --git a/tests/manager/test_meetings_agenda_options.py b/tests/manager/test_meetings_agenda_options.py index 50dfb6af..70975933 100644 --- a/tests/manager/test_meetings_agenda_options.py +++ b/tests/manager/test_meetings_agenda_options.py @@ -4,7 +4,6 @@ import pytest from django.db import connection from django.test import override_settings from django.test.utils import CaptureQueriesContext -from django.utils.timezone import localtime, now from chrono.agendas.models import ( Agenda, @@ -17,6 +16,7 @@ from chrono.agendas.models import ( TimePeriodExceptionSource, UnavailabilityCalendar, ) +from chrono.utils.timezone import localtime, now from tests.utils import login pytestmark = pytest.mark.django_db diff --git a/tests/manager/test_resource.py b/tests/manager/test_resource.py index cbc70e87..aa4ac94f 100644 --- a/tests/manager/test_resource.py +++ b/tests/manager/test_resource.py @@ -4,9 +4,9 @@ import freezegun import pytest from django.db import connection from django.test.utils import CaptureQueriesContext -from django.utils.timezone import localtime, make_aware, now from chrono.agendas.models import Agenda, Booking, Desk, Event, MeetingType, Resource, TimePeriod +from chrono.utils.timezone import localtime, make_aware, now from tests.utils import login pytestmark = pytest.mark.django_db diff --git a/tests/manager/test_shared_custody_agenda.py b/tests/manager/test_shared_custody_agenda.py index f2d4b0e5..e6661311 100644 --- a/tests/manager/test_shared_custody_agenda.py +++ b/tests/manager/test_shared_custody_agenda.py @@ -4,7 +4,6 @@ import pytest from django.core.files.base import ContentFile from django.db import connection from django.test.utils import CaptureQueriesContext -from django.utils.timezone import now from chrono.agendas.models import ( Person, @@ -16,6 +15,7 @@ from chrono.agendas.models import ( TimePeriodExceptionGroup, UnavailabilityCalendar, ) +from chrono.utils.timezone import now from tests.utils import login pytestmark = pytest.mark.django_db diff --git a/tests/manager/test_unavailability_calendar.py b/tests/manager/test_unavailability_calendar.py index 567f9fcc..30e8733b 100644 --- a/tests/manager/test_unavailability_calendar.py +++ b/tests/manager/test_unavailability_calendar.py @@ -1,7 +1,6 @@ import datetime import pytest -from django.utils.timezone import localtime, make_aware, now from chrono.agendas.models import ( Agenda, @@ -12,6 +11,7 @@ from chrono.agendas.models import ( TimePeriodException, UnavailabilityCalendar, ) +from chrono.utils.timezone import localtime, make_aware, now from tests.utils import login pytestmark = pytest.mark.django_db diff --git a/tests/test_agendas.py b/tests/test_agendas.py index 946c6694..9cf745c4 100644 --- a/tests/test_agendas.py +++ b/tests/test_agendas.py @@ -11,7 +11,6 @@ from django.core.management import call_command from django.db import IntegrityError, connection, transaction from django.db.models import Q from django.test import override_settings -from django.utils.timezone import localtime, make_aware, now from chrono.agendas.models import ( Agenda, @@ -37,6 +36,7 @@ from chrono.agendas.models import ( UnavailabilityCalendar, VirtualMember, ) +from chrono.utils.timezone import localtime, make_aware, now pytestmark = pytest.mark.django_db diff --git a/tests/test_import_export.py b/tests/test_import_export.py index 9f86d258..7bc130c0 100644 --- a/tests/test_import_export.py +++ b/tests/test_import_export.py @@ -13,7 +13,6 @@ from django.contrib.auth.models import Group from django.core.management import CommandError, call_command from django.test import override_settings from django.utils.encoding import force_bytes -from django.utils.timezone import make_aware, now from chrono.agendas.models import ( Agenda, @@ -34,6 +33,7 @@ from chrono.agendas.models import ( VirtualMember, ) from chrono.manager.utils import import_site +from chrono.utils.timezone import make_aware, now pytestmark = pytest.mark.django_db @@ -1102,36 +1102,6 @@ def test_export_deleted_meetingtype(app): assert len(json.loads(output)['agendas'][0]['meetingtypes']) == 0 -def test_import_export_exception_dst_change(app): - agenda_meetings = Agenda.objects.create(label='Meetings Agenda', kind='meetings') - desk = Desk.objects.create(agenda=agenda_meetings, label='Desk') - - # create exception starting on dst change - start = make_aware(datetime.datetime(2022, 10, 30, 2, 0), is_dst=True) - end = make_aware(datetime.datetime(2022, 10, 31, 2, 0)) - TimePeriodException.objects.create(desk=desk, start_datetime=start, end_datetime=end) - - output = get_output_of_command('export_site') - payload = json.loads(output) - assert payload['agendas'][0]['desks'][0]['exceptions'][0]['start_datetime'] == '2022-10-30 02:00:00' - - import_site(data=payload, overwrite=True) - exception = TimePeriodException.objects.get() - assert exception.start_datetime == start - assert exception.end_datetime == end - - start = exception.start_datetime = make_aware(datetime.datetime(2022, 10, 30, 2, 0), is_dst=False) - exception.save() - output = get_output_of_command('export_site') - payload = json.loads(output) - assert payload['agendas'][0]['desks'][0]['exceptions'][0]['start_datetime'] == '2022-10-30 02:00:00' - - import_site(data=payload, overwrite=True) - exception = TimePeriodException.objects.get() - # dst was forced on import - assert exception.start_datetime == start - datetime.timedelta(hours=1) - - def test_import_export_agenda_update(app): agenda = Agenda.objects.create(label='Foo Bar', kind='meetings') diff --git a/tests/test_misc.py b/tests/test_misc.py index 0ffb2260..c74dbdb8 100644 --- a/tests/test_misc.py +++ b/tests/test_misc.py @@ -4,9 +4,9 @@ import pytest from django.db import IntegrityError, ProgrammingError, connection, transaction from django.db.migrations.executor import MigrationExecutor from django.test import override_settings -from django.utils.timezone import now from chrono.agendas.models import Agenda, Booking, Desk, Event, MeetingType +from chrono.utils.timezone import now pytestmark = pytest.mark.django_db diff --git a/tests/test_time_periods.py b/tests/test_time_periods.py index 92666d4a..0411e975 100644 --- a/tests/test_time_periods.py +++ b/tests/test_time_periods.py @@ -5,9 +5,9 @@ from django.db import IntegrityError, transaction from django.db.models import Q from django.test import override_settings from django.utils.encoding import force_str -from django.utils.timezone import localtime, make_aware from chrono.agendas.models import Agenda, Desk, MeetingType, TimePeriod, TimePeriodException +from chrono.utils.timezone import localtime, make_aware pytestmark = pytest.mark.django_db