diff options
| author | 2022-02-26 14:36:53 +0100 | |
|---|---|---|
| committer | 2022-03-02 19:46:22 +0100 | |
| commit | 66061855ca2098fae7e80fa2e1abb29f810495f1 (patch) | |
| tree | 5e024c49b1c2a863e566de821667f4829561a0c7 | |
| parent | Merge pull request #683 from python-discord/readme-for-project-directory (diff) | |
Fix timezone awareness warnings
Add a `warnings.warnings` clause to prevent these from being raised
again in the future, and raise a full traceback if they don't.
| -rw-r--r-- | pydis_site/apps/api/tests/test_infractions.py | 4 | ||||
| -rw-r--r-- | pydis_site/apps/api/tests/test_models.py | 7 | ||||
| -rw-r--r-- | pydis_site/apps/api/tests/test_reminders.py | 17 | ||||
| -rw-r--r-- | pydis_site/apps/api/viewsets/bot/infraction.py | 11 | ||||
| -rw-r--r-- | pydis_site/settings.py | 17 | 
5 files changed, 36 insertions, 20 deletions
| diff --git a/pydis_site/apps/api/tests/test_infractions.py b/pydis_site/apps/api/tests/test_infractions.py index aa0604f6..f1107734 100644 --- a/pydis_site/apps/api/tests/test_infractions.py +++ b/pydis_site/apps/api/tests/test_infractions.py @@ -80,7 +80,7 @@ class InfractionTests(AuthenticatedAPITestCase):              type='superstar',              reason='This one doesn\'t matter anymore.',              active=True, -            expires_at=datetime.datetime.utcnow() + datetime.timedelta(hours=5) +            expires_at=dt.now(timezone.utc) + datetime.timedelta(hours=5)          )          cls.voiceban_expires_later = Infraction.objects.create(              user_id=cls.user.id, @@ -88,7 +88,7 @@ class InfractionTests(AuthenticatedAPITestCase):              type='voice_ban',              reason='Jet engine mic',              active=True, -            expires_at=datetime.datetime.utcnow() + datetime.timedelta(days=5) +            expires_at=dt.now(timezone.utc) + datetime.timedelta(days=5)          )      def test_list_all(self): diff --git a/pydis_site/apps/api/tests/test_models.py b/pydis_site/apps/api/tests/test_models.py index 5c9ddea4..0fad467c 100644 --- a/pydis_site/apps/api/tests/test_models.py +++ b/pydis_site/apps/api/tests/test_models.py @@ -1,8 +1,7 @@ -from datetime import datetime as dt +from datetime import datetime as dt, timezone  from django.core.exceptions import ValidationError  from django.test import SimpleTestCase, TestCase -from django.utils import timezone  from pydis_site.apps.api.models import (      DeletedMessage, @@ -41,7 +40,7 @@ class NitroMessageLengthTest(TestCase):          self.context = MessageDeletionContext.objects.create(              id=50,              actor=self.user, -            creation=dt.utcnow() +            creation=dt.now(timezone.utc)          )      def test_create(self): @@ -99,7 +98,7 @@ class StringDunderMethodTests(SimpleTestCase):                          name='shawn',                          discriminator=555,                      ), -                    creation=dt.utcnow() +                    creation=dt.now(timezone.utc)                  ),                  embeds=[]              ), diff --git a/pydis_site/apps/api/tests/test_reminders.py b/pydis_site/apps/api/tests/test_reminders.py index 709685bc..e17569f0 100644 --- a/pydis_site/apps/api/tests/test_reminders.py +++ b/pydis_site/apps/api/tests/test_reminders.py @@ -1,4 +1,4 @@ -from datetime import datetime +from datetime import datetime, timezone  from django.forms.models import model_to_dict  from django.urls import reverse @@ -91,7 +91,7 @@ class ReminderDeletionTests(AuthenticatedAPITestCase):          cls.reminder = Reminder.objects.create(              author=cls.author,              content="Don't forget to set yourself a reminder", -            expiration=datetime.utcnow().isoformat(), +            expiration=datetime.now(timezone.utc),              jump_url="https://www.decliningmentalfaculties.com",              channel_id=123          ) @@ -122,7 +122,7 @@ class ReminderListTests(AuthenticatedAPITestCase):          cls.reminder_one = Reminder.objects.create(              author=cls.author,              content="We should take Bikini Bottom, and push it somewhere else!", -            expiration=datetime.utcnow().isoformat(), +            expiration=datetime.now(timezone.utc),              jump_url="https://www.icantseemyforehead.com",              channel_id=123          ) @@ -130,16 +130,17 @@ class ReminderListTests(AuthenticatedAPITestCase):          cls.reminder_two = Reminder.objects.create(              author=cls.author,              content="Gahhh-I love being purple!", -            expiration=datetime.utcnow().isoformat(), +            expiration=datetime.now(timezone.utc),              jump_url="https://www.goofygoobersicecreampartyboat.com",              channel_id=123,              active=False          ) +        drf_format = '%Y-%m-%dT%H:%M:%S.%fZ'          cls.rem_dict_one = model_to_dict(cls.reminder_one) -        cls.rem_dict_one['expiration'] += 'Z'  # Massaging a quirk of the response time format +        cls.rem_dict_one['expiration'] = cls.rem_dict_one['expiration'].strftime(drf_format)          cls.rem_dict_two = model_to_dict(cls.reminder_two) -        cls.rem_dict_two['expiration'] += 'Z'  # Massaging a quirk of the response time format +        cls.rem_dict_two['expiration'] = cls.rem_dict_two['expiration'].strftime(drf_format)      def test_reminders_in_full_list(self):          url = reverse('api:bot:reminder-list') @@ -175,7 +176,7 @@ class ReminderRetrieveTests(AuthenticatedAPITestCase):          cls.reminder = Reminder.objects.create(              author=cls.author,              content="Reminder content", -            expiration=datetime.utcnow().isoformat(), +            expiration=datetime.now(timezone.utc),              jump_url="http://example.com/",              channel_id=123          ) @@ -203,7 +204,7 @@ class ReminderUpdateTests(AuthenticatedAPITestCase):          cls.reminder = Reminder.objects.create(              author=cls.author,              content="Squash those do-gooders", -            expiration=datetime.utcnow().isoformat(), +            expiration=datetime.now(timezone.utc),              jump_url="https://www.decliningmentalfaculties.com",              channel_id=123          ) diff --git a/pydis_site/apps/api/viewsets/bot/infraction.py b/pydis_site/apps/api/viewsets/bot/infraction.py index 7e7adbca..d82090aa 100644 --- a/pydis_site/apps/api/viewsets/bot/infraction.py +++ b/pydis_site/apps/api/viewsets/bot/infraction.py @@ -3,6 +3,7 @@ from datetime import datetime  from django.db import IntegrityError  from django.db.models import QuerySet  from django.http.request import HttpRequest +from django.utils import timezone  from django_filters.rest_framework import DjangoFilterBackend  from rest_framework.decorators import action  from rest_framework.exceptions import ValidationError @@ -184,20 +185,18 @@ class InfractionViewSet(          filter_expires_after = self.request.query_params.get('expires_after')          if filter_expires_after:              try: -                additional_filters['expires_at__gte'] = datetime.fromisoformat( -                    filter_expires_after -                ) +                expires_after_parsed = datetime.fromisoformat(filter_expires_after)              except ValueError:                  raise ValidationError({'expires_after': ['failed to convert to datetime']}) +            additional_filters['expires_at__gte'] = timezone.make_aware(expires_after_parsed)          filter_expires_before = self.request.query_params.get('expires_before')          if filter_expires_before:              try: -                additional_filters['expires_at__lte'] = datetime.fromisoformat( -                    filter_expires_before -                ) +                expires_before_parsed = datetime.fromisoformat(filter_expires_before)              except ValueError:                  raise ValidationError({'expires_before': ['failed to convert to datetime']}) +            additional_filters['expires_at__lte'] = timezone.make_aware(expires_before_parsed)          if 'expires_at__lte' in additional_filters and 'expires_at__gte' in additional_filters:              if additional_filters['expires_at__gte'] > additional_filters['expires_at__lte']: diff --git a/pydis_site/settings.py b/pydis_site/settings.py index 4f2b4aef..17f220f3 100644 --- a/pydis_site/settings.py +++ b/pydis_site/settings.py @@ -13,6 +13,7 @@ https://docs.djangoproject.com/en/2.1/ref/settings/  import os  import secrets  import sys +import warnings  from pathlib import Path  from socket import gethostbyname, gethostname @@ -53,10 +54,26 @@ if DEBUG:      ALLOWED_HOSTS = env.list('ALLOWED_HOSTS', default=['*'])      SECRET_KEY = "yellow polkadot bikini"  # noqa: S105 +    # Prevent verbose warnings emitted when passing a non-timezone aware +    # datetime object to the database, whilst we have time zone support +    # active. See the Django documentation for more details: +    # https://docs.djangoproject.com/en/dev/topics/i18n/timezones/ +    warnings.filterwarnings( +        'error', r"DateTimeField .* received a naive datetime", +        RuntimeWarning, r'django\.db\.models\.fields', +    ) +  elif 'CI' in os.environ:      ALLOWED_HOSTS = ['*']      SECRET_KEY = secrets.token_urlsafe(32) +    # See above. We run with `CI=true`, but debug unset in GitHub Actions, +    # so we also want to filter it there. +    warnings.filterwarnings( +        'error', r"DateTimeField .* received a naive datetime", +        RuntimeWarning, r'django\.db\.models\.fields', +    ) +  else:      ALLOWED_HOSTS = env.list(          'ALLOWED_HOSTS', | 
