3
3
from django .db import migrations , models
4
4
5
5
6
+ def populate_group_by_on_rollback (apps , schema_editor ):
7
+ """Populate group_by field with start date for rollback compatibility."""
8
+ Event = apps .get_model ("main" , "Event" )
9
+
10
+ # Group events by deployment to handle uniqueness
11
+ from collections import defaultdict
12
+
13
+ deployment_counters = defaultdict (lambda : defaultdict (int ))
14
+
15
+ for event in Event .objects .all ().order_by ("deployment_id" , "start" ):
16
+ if event .start :
17
+ date_key = event .start .date ().isoformat ()
18
+ deployment_counters [event .deployment_id ][date_key ] += 1
19
+ counter = deployment_counters [event .deployment_id ][date_key ]
20
+
21
+ # Make group_by unique by appending counter if needed
22
+ if counter == 1 :
23
+ event .group_by = date_key
24
+ else :
25
+ event .group_by = f"{ date_key } -{ counter } "
26
+
27
+ event .save (update_fields = ["group_by" ])
28
+
29
+
6
30
class Migration (migrations .Migration ):
7
31
dependencies = [
8
32
("main" , "0060_alter_sourceimagecollection_method" ),
@@ -17,6 +41,25 @@ class Migration(migrations.Migration):
17
41
model_name = "event" ,
18
42
name = "main_event_group_b_6ce666_idx" ,
19
43
),
44
+ # Step 1: Make the field nullable with a default for rollback safety
45
+ migrations .AlterField (
46
+ model_name = "event" ,
47
+ name = "group_by" ,
48
+ field = models .CharField (
49
+ db_index = True ,
50
+ help_text = "A unique identifier for this event, used to group images into events." ,
51
+ max_length = 255 ,
52
+ null = True ,
53
+ blank = True ,
54
+ default = None ,
55
+ ),
56
+ ),
57
+ # Step 2: Populate data on rollback
58
+ migrations .RunPython (
59
+ code = migrations .RunPython .noop ,
60
+ reverse_code = populate_group_by_on_rollback ,
61
+ ),
62
+ # Step 3: Remove the field
20
63
migrations .RemoveField (
21
64
model_name = "event" ,
22
65
name = "group_by" ,
0 commit comments