-
Notifications
You must be signed in to change notification settings - Fork 19
Expand file tree
/
Copy pathuser.py
More file actions
204 lines (161 loc) · 4.96 KB
/
user.py
File metadata and controls
204 lines (161 loc) · 4.96 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
"""User schemas."""
# Standard Python Libraries
from datetime import datetime
from enum import Enum
from typing import Any, Dict, List, Optional
from uuid import UUID
# Third-Party Libraries
from pydantic import BaseModel
from .api_key import ApiKey
from .role import Role
class UserType(Enum):
"""User Type."""
ANALYTICS = "analytics"
GLOBAL_ADMIN = "globalAdmin"
GLOBAL_VIEW = "globalView"
REGIONAL_ADMIN = "regionalAdmin"
READY_SET_CYBER = "readySetCyber"
STANDARD = "standard"
class User(BaseModel):
"""User schema."""
id: UUID
cognito_id: Optional[str]
login_gov_id: Optional[str]
created_at: datetime
updated_at: datetime
first_name: str
last_name: str
full_name: str
email: str
invite_pending: bool
login_blocked_by_maintenance: bool
cognito_use_case_description: Optional[str] = None
date_approved: Optional[datetime] = None
approved_by: Optional[Dict[str, str]] = None
date_accepted_terms: Optional[datetime]
accepted_terms_version: Optional[str]
last_logged_in: Optional[datetime]
user_type: UserType
region_id: Optional[str]
state: Optional[str]
okta_id: Optional[str]
roles: Optional[List[Role]] = []
api_keys: Optional[List[ApiKey]] = []
class UserResponse(BaseModel):
"""User response schema."""
cognito_id: Optional[str]
login_gov_id: Optional[str]
first_name: str
last_name: str
full_name: str
email: str
invite_pending: bool
login_blocked_by_maintenance: bool
date_accepted_terms: Optional[datetime]
accepted_terms_version: Optional[str]
last_logged_in: Optional[datetime]
user_type: UserType
region_id: Optional[str]
state: Optional[str]
okta_id: Optional[str]
roles: Optional[List[Role]] = []
api_keys: Optional[List[ApiKey]] = []
@classmethod
def model_validate(cls, obj):
"""Model validate."""
# Convert fields before passing to Pydantic Schema
user_dict = obj.__dict__.copy()
user_dict["roles"] = [
Role.model_validate(role).model_dump() for role in obj.roles.all()
]
user_dict["apiKeys"] = [
ApiKey.model_validate(api_key).model_dump() for api_key in obj.apiKeys.all()
]
[ApiKey.from_orm(api_key) for api_key in obj]
return cls(**user_dict)
def model_dump(self, **kwargs):
"""Override model_dump to handle UUID serialization."""
data = super().model_dump(**kwargs)
if isinstance(data.get("id"), UUID):
data["id"] = str(data["id"])
return data
class Config:
"""Config."""
from_attributes = True
class UserRoleOrg(BaseModel):
"""User role organization schema."""
id: str
name: str
class UserRole(BaseModel):
"""User role schema."""
id: str
role: str
approved: bool
organization: Optional[UserRoleOrg] = None
class NewUser(BaseModel):
"""New user schema."""
email: str
first_name: str
last_name: str
organization: Optional[str] = None
organization_admin: Optional[bool] = None
region_id: Optional[str] = None
state: Optional[str] = None
user_type: Optional[UserType] = None
class NewUserResponseModel(BaseModel):
"""New user response schema."""
id: str
first_name: str
last_name: str
email: str
invite_pending: bool
user_type: UserType
roles: Optional[List[UserRole]] = []
class UpdateUser(BaseModel):
"""Update user schema."""
first_name: Optional[str]
full_name: Optional[str]
invite_pending: Optional[bool]
last_name: Optional[str]
login_blocked_by_maintenance: Optional[bool]
organization: Optional[str]
region_d: Optional[str]
role: Optional[str]
state: Optional[str]
user_type: Optional[UserType]
class UpdateUserV2(BaseModel):
"""Schema for updating a user."""
first_name: Optional[str] = None
last_name: Optional[str] = None
email: Optional[str] = None
state: Optional[str] = None
user_type: Optional[str] = None
invite_pending: Optional[bool] = None
date_approved: Optional[datetime] = None
approved_by: Optional[Any] = None
class RegisterUserResponse(BaseModel):
"""Register or deny user response."""
status_code: int
body: str
class VersionModel(BaseModel):
"""Version model."""
version: str
class UserResponseV2(BaseModel):
"""Schema for returning user data."""
id: str
created_at: str
updated_at: str
first_name: str
last_name: str
full_name: str
email: str
accepted_terms_version: Optional[str] = None
date_accepted_terms: Optional[datetime] = None
cognito_use_case_description: Optional[str] = None
date_approved: Optional[datetime] = None
approved_by: Optional[Dict[str, str]] = None
last_logged_in: Optional[datetime] = None
region_id: Optional[str] = None
state: Optional[str] = None
user_type: Optional[str] = None
roles: List[Dict[str, Optional[Any]]]