0
0
mirror of https://github.com/wagtail/wagtail.git synced 2024-12-01 03:31:04 +01:00

Add error logging to the timestamp migration and improved migration

This also changes the migration of items with 2 timestamps, so it still
migrates the valid one, if the other is invalid.

See #9590
This commit is contained in:
Stefan Hammer 2023-07-13 09:15:02 +02:00 committed by LB (Ben Johnston)
parent 74af3e3b45
commit 73e29e2585

View File

@ -1,12 +1,15 @@
# Generated by Django 3.2.6 on 2022-11-09 07:50
import datetime
import logging
import django.core.serializers.json
from django.conf import settings
from django.db import migrations, models
from django.utils import timezone, dateparse
logger = logging.getLogger("wagtail.migrations")
def legacy_to_iso_format(date_string, tz=None):
dt = datetime.datetime.strptime(date_string, "%d %b %Y %H:%M")
@ -43,7 +46,13 @@ def migrate_logs_with_created_only(model, converter):
# to UTC by django.
item.data["revision"]["created"] = converter(created)
except ValueError:
# TODO TBD: log error?
logger.warning(
"Failed to migrate 'created' timestamp '%s' of %s %s (%s)",
item.data["revision"]["created"],
model.__name__,
item.pk,
converter.__name__,
)
continue
except KeyError:
continue
@ -62,24 +71,42 @@ def migrate_schedule_logs(model, converter):
created = item.data["revision"]["created"]
# May be unset for "wagtail.schedule.cancel"-logs.
go_live_at = item.data["revision"].get("go_live_at")
changed = False
try:
# "created" is set to timezone.now() for new revisions ("wagtail.publish.schedule")
# and to self.created_at for "wagtail.schedule.cancel", which is set to UTC
# by django.
item.data["revision"]["created"] = converter(created)
changed = True
except ValueError:
logger.warning(
"Failed to migrate 'created' timestamp '%s' of %s %s (%s)",
created,
model.__name__,
item.pk,
converter.__name__,
)
if go_live_at:
# The go_live_at date is set to the revision object's "go_live_at".
# The revision's object is created by deserializing the json data (see wagtail.models.Revision.as_object()),
# and this process converts all datetime objects to the local timestamp (see https://github.com/wagtail/django-modelcluster/blob/8666f16eaf23ca98afc160b0a4729864411c0563/modelcluster/models.py#L109-L115).
# That's the reason, why this date is the only date, which is not stored in the log's JSON as UTC, but in the default timezone.
if go_live_at:
# The go_live_at date is set to the revision object's "go_live_at".
# The revision's object is created by deserializing the json data (see wagtail.models.Revision.as_object()),
# and this process converts all datetime objects to the local timestamp (see https://github.com/wagtail/django-modelcluster/blob/8666f16eaf23ca98afc160b0a4729864411c0563/modelcluster/models.py#L109-L115).
# That's the reason, why this date is the only date, which is not stored in the log's JSON as UTC, but in the default timezone.
try:
item.data["revision"]["go_live_at"] = converter(
go_live_at, tz=timezone.get_default_timezone()
)
except ValueError:
# TODO TBD: log error?
continue
else:
changed = True
except ValueError:
logger.warning(
"Failed to migrate 'go_live_at' timestamp '%s' of %s %s (%s)",
go_live_at,
model.__name__,
item.pk,
converter.__name__,
)
if changed:
item.save(update_fields=["data"])