agendas: split failing migration (#54969)

This commit is contained in:
Lauréline Guérin 2021-06-18 10:08:43 +02:00
parent 785341cecc
commit f9b5089f06
No known key found for this signature in database
GPG Key ID: 1FAB9B9B4F93D473
3 changed files with 92 additions and 44 deletions

View File

@ -1,44 +1,9 @@
# Generated by Django 2.2.19 on 2021-04-21 13:56
import django.contrib.postgres.fields
from dateutil.rrule import DAILY, WEEKLY
from django.db import migrations, models
def migrate_recurrence_fields(apps, schema_editor):
Event = apps.get_model('agendas', 'Event')
for event in Event.objects.filter(recurrence_rule__isnull=False):
if event.recurrence_rule['freq'] == DAILY:
event.recurrence_days = list(range(7))
elif event.recurrence_rule['freq'] == WEEKLY:
event.recurrence_days = event.recurrence_rule['byweekday']
event.recurrence_week_interval = event.recurrence_rule.get('interval', 1)
event.save()
def reverse_migrate_recurrence_fields(apps, schema_editor):
Event = apps.get_model('agendas', 'Event')
for event in Event.objects.filter(recurrence_days__isnull=False):
rrule = {}
if event.recurrence_days == list(range(7)):
event.repeat = 'daily'
rrule['freq'] = DAILY
else:
rrule['freq'] = WEEKLY
rrule['byweekday'] = event.recurrence_days
if event.recurrence_days == list(range(5)):
event.repeat = 'weekdays'
elif event.recurrence_week_interval == 2:
event.repeat = '2-weeks'
rrule['interval'] = 2
else:
event.repeat = 'weekly'
event.recurrence_rule = rrule
event.save()
class Migration(migrations.Migration):
dependencies = [
@ -68,13 +33,4 @@ class Migration(migrations.Migration):
verbose_name='Repeat',
),
),
migrations.RunPython(migrate_recurrence_fields, reverse_migrate_recurrence_fields),
migrations.RemoveField(
model_name='event',
name='recurrence_rule',
),
migrations.RemoveField(
model_name='event',
name='repeat',
),
]

View File

@ -0,0 +1,60 @@
from dateutil.rrule import DAILY, WEEKLY
from django.db import migrations
from django.db.utils import ProgrammingError
def migrate_recurrence_fields(apps, schema_editor):
Event = apps.get_model('agendas', 'Event')
for event in Event.objects.filter(recurrence_rule__isnull=False):
if event.recurrence_rule['freq'] == DAILY:
event.recurrence_days = list(range(7))
elif event.recurrence_rule['freq'] == WEEKLY:
event.recurrence_days = event.recurrence_rule['byweekday']
event.recurrence_week_interval = event.recurrence_rule.get('interval', 1)
event.save()
def reverse_migrate_recurrence_fields(apps, schema_editor):
Event = apps.get_model('agendas', 'Event')
for event in Event.objects.filter(recurrence_days__isnull=False):
rrule = {}
if event.recurrence_days == list(range(7)):
event.repeat = 'daily'
rrule['freq'] = DAILY
else:
rrule['freq'] = WEEKLY
rrule['byweekday'] = event.recurrence_days
if event.recurrence_days == list(range(5)):
event.repeat = 'weekdays'
elif event.recurrence_week_interval == 2:
event.repeat = '2-weeks'
rrule['interval'] = 2
else:
event.repeat = 'weekly'
event.recurrence_rule = rrule
event.save()
class Migration(migrations.Migration):
dependencies = [
('agendas', '0092_change_recurrence_fields'),
]
operations = [
migrations.RunPython(migrate_recurrence_fields, reverse_migrate_recurrence_fields),
]
def _check_db(self, project_state, schema_editor):
try:
# check if the column exists
schema_editor.execute('SELECT recurrence_rule FROM agendas_event')
except ProgrammingError:
# if not exists, ignore the migration
return project_state
def apply(self, project_state, schema_editor, *args, **kwargs):
result = self._check_db(project_state, schema_editor)
return result or super().apply(project_state, schema_editor, *args, **kwargs)

View File

@ -0,0 +1,32 @@
from django.db import migrations
from django.db.utils import ProgrammingError
class Migration(migrations.Migration):
dependencies = [
('agendas', '0093_change_recurrence_fields'),
]
operations = [
migrations.RemoveField(
model_name='event',
name='recurrence_rule',
),
migrations.RemoveField(
model_name='event',
name='repeat',
),
]
def _check_db(self, project_state, schema_editor):
try:
# check if the column exists
schema_editor.execute('SELECT recurrence_rule FROM agendas_event')
except ProgrammingError:
# if not exists, ignore the migration
return project_state
def apply(self, project_state, schema_editor, *args, **kwargs):
result = self._check_db(project_state, schema_editor)
return result or super().apply(project_state, schema_editor, *args, **kwargs)