1
- from typing import FrozenSet
1
+ from typing import FrozenSet , Optional
2
2
3
3
from django .conf import settings
4
4
from django .db import models
5
5
6
- from sentry .backup .scopes import RelocationScope
6
+ from sentry .backup .dependencies import PrimaryKeyMap
7
+ from sentry .backup .helpers import ImportFlags
8
+ from sentry .backup .scopes import ImportScope , RelocationScope
7
9
from sentry .db .models import ArrayField , DefaultFieldsModel , control_silo_only_model , sane_repr
8
10
from sentry .db .models .fields .foreignkey import FlexibleForeignKey
11
+ from sentry .db .models .utils import unique_db_instance
9
12
from sentry .signals import post_upgrade
10
13
from sentry .silo import SiloMode
11
14
15
+ MAX_USER_ROLE_NAME_LENGTH = 32
16
+
12
17
13
18
@control_silo_only_model
14
19
class UserRole (DefaultFieldsModel ):
@@ -18,7 +23,7 @@ class UserRole(DefaultFieldsModel):
18
23
19
24
__relocation_scope__ = RelocationScope .Config
20
25
21
- name = models .CharField (max_length = 32 , unique = True )
26
+ name = models .CharField (max_length = MAX_USER_ROLE_NAME_LENGTH , unique = True )
22
27
permissions = ArrayField ()
23
28
users = models .ManyToManyField ("sentry.User" , through = "sentry.UserRoleUser" )
24
29
@@ -39,6 +44,25 @@ def permissions_for_user(cls, user_id: int) -> FrozenSet[str]:
39
44
for i in sl
40
45
)
41
46
47
+ def normalize_before_relocation_import (
48
+ self , pk_map : PrimaryKeyMap , scope : ImportScope , flags : ImportFlags
49
+ ) -> Optional [int ]:
50
+
51
+ old_pk = super ().normalize_before_relocation_import (pk_map , scope , flags )
52
+ if old_pk is None :
53
+ return None
54
+
55
+ # Circumvent unique name collisions.
56
+ if self .objects .filter (name__exact = self .name ):
57
+ unique_db_instance (
58
+ self ,
59
+ self .name ,
60
+ max_length = MAX_USER_ROLE_NAME_LENGTH ,
61
+ field_name = "name" ,
62
+ )
63
+
64
+ return old_pk
65
+
42
66
43
67
@control_silo_only_model
44
68
class UserRoleUser (DefaultFieldsModel ):
0 commit comments