agendas: migrate booking check data into new model (#80371)

This commit is contained in:
Valentin Deniaud 2023-08-22 17:48:00 +02:00
parent 6d31c85dd7
commit bcae843c0d
2 changed files with 103 additions and 0 deletions

View File

@ -0,0 +1,56 @@
# Generated by Django 3.2.18 on 2023-08-22 15:47
from django.db import migrations
def migrate_booking_check_data(apps, schema_editor):
Booking = apps.get_model('agendas', 'Booking')
BookingCheck = apps.get_model('agendas', 'BookingCheck')
booking_checks = []
bookings = list(Booking.objects.filter(user_was_present__isnull=False))
for booking in bookings:
booking_check = BookingCheck(
booking=booking,
presence=booking.user_was_present,
start_time=booking.user_check_start_time,
end_time=booking.user_check_end_time,
type_slug=booking.user_check_type_slug,
type_label=booking.user_check_type_label,
)
booking_checks.append(booking_check)
BookingCheck.objects.bulk_create(booking_checks)
def reverse_migrate_booking_check_data(apps, schema_editor):
Booking = apps.get_model('agendas', 'Booking')
bookings = list(Booking.objects.filter(user_check__isnull=False).select_related('user_check'))
for booking in bookings:
booking.user_was_present = booking.user_check.presence
booking.user_check_start_time = booking.user_check.start_time
booking.user_check_end_time = booking.user_check.end_time
booking.user_check_type_slug = booking.user_check.type_slug
booking.user_check_type_label = booking.user_check.type_label
Booking.objects.bulk_update(
bookings,
fields=[
'user_was_present',
'user_check_start_time',
'user_check_end_time',
'user_check_type_slug',
'user_check_type_label',
],
)
class Migration(migrations.Migration):
dependencies = [
('agendas', '0161_add_booking_check_model'),
]
operations = [
migrations.RunPython(migrate_booking_check_data, reverse_migrate_booking_check_data),
]

View File

@ -390,3 +390,50 @@ def test_migration_convert_week_days(transactional_db):
assert Event.objects.get(slug='all').recurrence_days == [1, 2, 3, 4, 5, 6, 7]
assert SharedCustodyRule.objects.get().days == [1, 5, 7]
def test_migration_booking_check_data(transactional_db):
app = 'agendas'
migrate_from = [(app, '0161_add_booking_check_model')]
migrate_to = [(app, '0162_migrate_booking_check_data')]
executor = MigrationExecutor(connection)
old_apps = executor.loader.project_state(migrate_from).apps
executor.migrate(migrate_from)
Agenda = old_apps.get_model(app, 'Agenda')
Event = old_apps.get_model(app, 'Event')
Booking = old_apps.get_model(app, 'Booking')
agenda = Agenda.objects.create(label='Foo', kind='events')
event = Event.objects.create(start_datetime=now(), places=10, agenda=agenda, slug='event')
not_checked = Booking.objects.create(event=event)
present = Booking.objects.create(event=event, user_was_present=True)
absent = Booking.objects.create(event=event, user_was_present=False)
with_check_type = Booking.objects.create(
event=event,
user_was_present=False,
user_check_type_slug='xxx',
user_check_type_label='XXX',
user_check_start_time=datetime.time(12, 0),
user_check_end_time=datetime.time(14, 0),
)
executor = MigrationExecutor(connection)
executor.migrate(migrate_to)
executor.loader.build_graph()
apps = executor.loader.project_state(migrate_to).apps
Booking = apps.get_model(app, 'Booking')
assert not hasattr(Booking.objects.get(pk=not_checked.pk), 'user_check')
assert Booking.objects.get(pk=present.pk).user_check.presence is True
assert Booking.objects.get(pk=absent.pk).user_check.presence is False
with_check_type = Booking.objects.get(pk=with_check_type.pk)
assert with_check_type.user_check.presence is False
assert with_check_type.user_check.type_slug == 'xxx'
assert with_check_type.user_check.type_label == 'XXX'
assert with_check_type.user_check.start_time == datetime.time(12, 0)
assert with_check_type.user_check.end_time == datetime.time(14, 0)