1
1
from django .db .migrations import DeleteModel
2
2
from django_zero_downtime_migrations .backends .postgres .schema import UnsafeOperationException
3
3
4
- from sentry .new_migrations .monkey .state import DeletionAction
4
+ from sentry .db .postgres .schema import SafePostgresDatabaseSchemaEditor
5
+ from sentry .new_migrations .monkey .state import DeletionAction , SentryProjectState
5
6
6
7
7
8
class SafeDeleteModel (DeleteModel ):
8
- def __init__ (self , * args , deletion_action : DeletionAction | None = None , ** kwargs ):
9
- if deletion_action is None :
10
- raise UnsafeOperationException ("Deletion State is required" )
9
+ def __init__ (self , * args , deletion_action : DeletionAction , ** kwargs ):
11
10
super ().__init__ (* args , ** kwargs )
12
11
self .deletion_action = deletion_action
13
12
14
- def state_forwards (self , app_label , state ):
13
+ def state_forwards (self , app_label : str , state : SentryProjectState ) -> None : # type: ignore[override]
15
14
if self .deletion_action == DeletionAction .MOVE_TO_PENDING :
16
15
model = state .apps .get_model (app_label , self .name )
17
16
fields_with_constraints = [
@@ -25,22 +24,34 @@ def state_forwards(self, app_label, state):
25
24
)
26
25
state .remove_model (app_label , self .name_lower , deletion_action = self .deletion_action )
27
26
28
- def database_forwards (self , app_label , schema_editor , from_state , to_state ):
27
+ def database_forwards (
28
+ self ,
29
+ app_label : str ,
30
+ schema_editor : SafePostgresDatabaseSchemaEditor , # type: ignore[override]
31
+ from_state : SentryProjectState , # type: ignore[override]
32
+ to_state : SentryProjectState , # type: ignore[override]
33
+ ) -> None :
29
34
if self .deletion_action == DeletionAction .MOVE_TO_PENDING :
30
35
return
31
36
32
37
model = from_state .get_pending_deletion_model (app_label , self .name )
33
38
if self .allow_migrate_model (schema_editor .connection .alias , model ):
34
39
schema_editor .delete_model (model , is_safe = True )
35
40
36
- def database_backwards (self , app_label , schema_editor , from_state , to_state ):
41
+ def database_backwards (
42
+ self ,
43
+ app_label : str ,
44
+ schema_editor : SafePostgresDatabaseSchemaEditor , # type: ignore[override]
45
+ from_state : SentryProjectState , # type: ignore[override]
46
+ to_state : SentryProjectState , # type: ignore[override]
47
+ ) -> None :
37
48
if self .deletion_action == DeletionAction .MOVE_TO_PENDING :
38
49
return
39
50
model = to_state .get_pending_deletion_model (app_label , self .name )
40
51
if self .allow_migrate_model (schema_editor .connection .alias , model ):
41
52
schema_editor .create_model (model )
42
53
43
- def describe (self ):
54
+ def describe (self ) -> str :
44
55
if self .deletion_action == DeletionAction .MOVE_TO_PENDING :
45
56
return f"Moved model { self .name } to pending deletion state"
46
57
else :
0 commit comments