zou 0.20.82__py3-none-any.whl → 0.20.84__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- zou/__init__.py +1 -1
- zou/app/blueprints/assets/resources.py +1060 -153
- zou/app/blueprints/auth/resources.py +368 -238
- zou/app/blueprints/breakdown/resources.py +584 -94
- zou/app/blueprints/chats/resources.py +176 -37
- zou/app/blueprints/comments/resources.py +409 -150
- zou/app/blueprints/concepts/resources.py +443 -63
- zou/app/blueprints/crud/asset_instance.py +272 -0
- zou/app/blueprints/crud/attachment_file.py +263 -0
- zou/app/blueprints/crud/base.py +176 -69
- zou/app/blueprints/crud/budget.py +278 -0
- zou/app/blueprints/crud/budget_entry.py +269 -0
- zou/app/blueprints/crud/chat.py +282 -0
- zou/app/blueprints/crud/chat_message.py +286 -0
- zou/app/blueprints/crud/comments.py +312 -1
- zou/app/blueprints/crud/custom_action.py +268 -0
- zou/app/blueprints/crud/day_off.py +298 -0
- zou/app/blueprints/crud/department.py +268 -0
- zou/app/blueprints/crud/entity.py +297 -3
- zou/app/blueprints/crud/entity_link.py +303 -0
- zou/app/blueprints/crud/entity_type.py +269 -0
- zou/app/blueprints/crud/event.py +197 -0
- zou/app/blueprints/crud/file_status.py +268 -0
- zou/app/blueprints/crud/hardware_item.py +268 -0
- zou/app/blueprints/crud/metadata_descriptor.py +312 -0
- zou/app/blueprints/crud/milestone.py +302 -1
- zou/app/blueprints/crud/news.py +285 -0
- zou/app/blueprints/crud/notification.py +287 -0
- zou/app/blueprints/crud/organisation.py +269 -0
- zou/app/blueprints/crud/output_file.py +34 -10
- zou/app/blueprints/crud/output_type.py +30 -10
- zou/app/blueprints/crud/person.py +407 -2
- zou/app/blueprints/crud/playlist.py +322 -4
- zou/app/blueprints/crud/plugin.py +269 -0
- zou/app/blueprints/crud/preview_background_file.py +272 -0
- zou/app/blueprints/crud/preview_file.py +280 -9
- zou/app/blueprints/crud/production_schedule_version.py +569 -0
- zou/app/blueprints/crud/project.py +440 -0
- zou/app/blueprints/crud/project_status.py +268 -0
- zou/app/blueprints/crud/salary_scale.py +185 -5
- zou/app/blueprints/crud/schedule_item.py +305 -0
- zou/app/blueprints/crud/search_filter.py +302 -0
- zou/app/blueprints/crud/search_filter_group.py +270 -0
- zou/app/blueprints/crud/software.py +30 -10
- zou/app/blueprints/crud/status_automation.py +296 -2
- zou/app/blueprints/crud/studio.py +268 -0
- zou/app/blueprints/crud/subscription.py +279 -0
- zou/app/blueprints/crud/task.py +325 -5
- zou/app/blueprints/crud/task_status.py +301 -0
- zou/app/blueprints/crud/task_type.py +283 -0
- zou/app/blueprints/crud/time_spent.py +327 -0
- zou/app/blueprints/crud/working_file.py +273 -10
- zou/app/blueprints/departments/resources.py +302 -68
- zou/app/blueprints/edits/resources.py +651 -81
- zou/app/blueprints/entities/resources.py +104 -39
- zou/app/blueprints/events/resources.py +96 -8
- zou/app/blueprints/export/csv/assets.py +15 -5
- zou/app/blueprints/export/csv/base.py +12 -3
- zou/app/blueprints/export/csv/casting.py +32 -5
- zou/app/blueprints/export/csv/edits.py +15 -5
- zou/app/blueprints/export/csv/persons.py +24 -0
- zou/app/blueprints/export/csv/playlists.py +16 -5
- zou/app/blueprints/export/csv/projects.py +23 -0
- zou/app/blueprints/export/csv/shots.py +15 -5
- zou/app/blueprints/export/csv/task_types.py +23 -0
- zou/app/blueprints/export/csv/tasks.py +24 -0
- zou/app/blueprints/export/csv/time_spents.py +24 -0
- zou/app/blueprints/files/resources.py +928 -377
- zou/app/blueprints/index/resources.py +49 -42
- zou/app/blueprints/news/resources.py +47 -27
- zou/app/blueprints/persons/resources.py +644 -271
- zou/app/blueprints/playlists/resources.py +154 -72
- zou/app/blueprints/previews/resources.py +473 -228
- zou/app/blueprints/projects/__init__.py +5 -0
- zou/app/blueprints/projects/resources.py +987 -420
- zou/app/blueprints/search/resources.py +44 -32
- zou/app/blueprints/shots/resources.py +1338 -88
- zou/app/blueprints/source/csv/assets.py +44 -6
- zou/app/blueprints/source/csv/casting.py +43 -6
- zou/app/blueprints/source/csv/edits.py +47 -9
- zou/app/blueprints/source/csv/persons.py +43 -4
- zou/app/blueprints/source/csv/shots.py +47 -6
- zou/app/blueprints/source/csv/task_type_estimations.py +95 -35
- zou/app/blueprints/source/kitsu.py +433 -11
- zou/app/blueprints/source/otio.py +215 -20
- zou/app/blueprints/source/shotgun/assets.py +146 -0
- zou/app/blueprints/source/shotgun/base.py +85 -14
- zou/app/blueprints/source/shotgun/episode.py +124 -0
- zou/app/blueprints/source/shotgun/import_errors.py +105 -14
- zou/app/blueprints/source/shotgun/notes.py +132 -0
- zou/app/blueprints/source/shotgun/person.py +163 -0
- zou/app/blueprints/source/shotgun/project.py +120 -0
- zou/app/blueprints/source/shotgun/scene.py +120 -0
- zou/app/blueprints/source/shotgun/sequence.py +134 -0
- zou/app/blueprints/source/shotgun/shot.py +166 -0
- zou/app/blueprints/source/shotgun/status.py +129 -0
- zou/app/blueprints/source/shotgun/steps.py +138 -0
- zou/app/blueprints/source/shotgun/tasks.py +199 -0
- zou/app/blueprints/source/shotgun/team.py +132 -0
- zou/app/blueprints/source/shotgun/versions.py +155 -0
- zou/app/blueprints/tasks/resources.py +1197 -308
- zou/app/blueprints/user/resources.py +1808 -215
- zou/app/models/metadata_descriptor.py +1 -0
- zou/app/services/persons_service.py +1 -1
- zou/app/services/projects_service.py +45 -1
- zou/app/services/time_spents_service.py +1 -1
- zou/app/swagger.py +100 -27
- zou/migrations/versions/a1b2c3d4e5f6_add_position_to_metadata_descriptor.py +32 -0
- {zou-0.20.82.dist-info → zou-0.20.84.dist-info}/METADATA +18 -18
- {zou-0.20.82.dist-info → zou-0.20.84.dist-info}/RECORD +114 -113
- {zou-0.20.82.dist-info → zou-0.20.84.dist-info}/WHEEL +0 -0
- {zou-0.20.82.dist-info → zou-0.20.84.dist-info}/entry_points.txt +0 -0
- {zou-0.20.82.dist-info → zou-0.20.84.dist-info}/licenses/LICENSE +0 -0
- {zou-0.20.82.dist-info → zou-0.20.84.dist-info}/top_level.txt +0 -0
|
@@ -31,6 +31,190 @@ class PersonsResource(BaseModelsResource):
|
|
|
31
31
|
def __init__(self):
|
|
32
32
|
BaseModelsResource.__init__(self, Person)
|
|
33
33
|
|
|
34
|
+
@jwt_required()
|
|
35
|
+
def get(self):
|
|
36
|
+
"""
|
|
37
|
+
Get persons
|
|
38
|
+
---
|
|
39
|
+
tags:
|
|
40
|
+
- Crud
|
|
41
|
+
description: Retrieve all persons. Supports filtering via query
|
|
42
|
+
parameters and pagination. Admin users can include password
|
|
43
|
+
hashes. Non-admin users only see minimal information.
|
|
44
|
+
parameters:
|
|
45
|
+
- in: query
|
|
46
|
+
name: page
|
|
47
|
+
required: false
|
|
48
|
+
schema:
|
|
49
|
+
type: integer
|
|
50
|
+
example: 1
|
|
51
|
+
description: Page number for pagination
|
|
52
|
+
- in: query
|
|
53
|
+
name: limit
|
|
54
|
+
required: false
|
|
55
|
+
schema:
|
|
56
|
+
type: integer
|
|
57
|
+
example: 50
|
|
58
|
+
description: Number of results per page
|
|
59
|
+
- in: query
|
|
60
|
+
name: relations
|
|
61
|
+
required: false
|
|
62
|
+
schema:
|
|
63
|
+
type: boolean
|
|
64
|
+
default: false
|
|
65
|
+
example: false
|
|
66
|
+
description: Whether to include relations
|
|
67
|
+
- in: query
|
|
68
|
+
name: with_pass_hash
|
|
69
|
+
required: false
|
|
70
|
+
schema:
|
|
71
|
+
type: boolean
|
|
72
|
+
default: false
|
|
73
|
+
example: false
|
|
74
|
+
description: Include password hash (admin only)
|
|
75
|
+
responses:
|
|
76
|
+
200:
|
|
77
|
+
description: Persons retrieved successfully
|
|
78
|
+
content:
|
|
79
|
+
application/json:
|
|
80
|
+
schema:
|
|
81
|
+
oneOf:
|
|
82
|
+
- type: array
|
|
83
|
+
items:
|
|
84
|
+
type: object
|
|
85
|
+
- type: object
|
|
86
|
+
properties:
|
|
87
|
+
data:
|
|
88
|
+
type: array
|
|
89
|
+
items:
|
|
90
|
+
type: object
|
|
91
|
+
example: []
|
|
92
|
+
total:
|
|
93
|
+
type: integer
|
|
94
|
+
example: 100
|
|
95
|
+
nb_pages:
|
|
96
|
+
type: integer
|
|
97
|
+
example: 2
|
|
98
|
+
limit:
|
|
99
|
+
type: integer
|
|
100
|
+
example: 50
|
|
101
|
+
offset:
|
|
102
|
+
type: integer
|
|
103
|
+
example: 0
|
|
104
|
+
page:
|
|
105
|
+
type: integer
|
|
106
|
+
example: 1
|
|
107
|
+
400:
|
|
108
|
+
description: Invalid filter format or query error
|
|
109
|
+
"""
|
|
110
|
+
return super().get()
|
|
111
|
+
|
|
112
|
+
@jwt_required()
|
|
113
|
+
def post(self):
|
|
114
|
+
"""
|
|
115
|
+
Create person
|
|
116
|
+
---
|
|
117
|
+
tags:
|
|
118
|
+
- Crud
|
|
119
|
+
description: Create a new person with data provided in the
|
|
120
|
+
request body. JSON format is expected. Requires admin
|
|
121
|
+
permissions. Validates role, contract_type, two_factor_authentication,
|
|
122
|
+
email, and expiration_date. Checks user limit for active non-bot users.
|
|
123
|
+
requestBody:
|
|
124
|
+
required: true
|
|
125
|
+
content:
|
|
126
|
+
application/json:
|
|
127
|
+
schema:
|
|
128
|
+
type: object
|
|
129
|
+
required:
|
|
130
|
+
- first_name
|
|
131
|
+
- last_name
|
|
132
|
+
- email
|
|
133
|
+
properties:
|
|
134
|
+
first_name:
|
|
135
|
+
type: string
|
|
136
|
+
example: John
|
|
137
|
+
last_name:
|
|
138
|
+
type: string
|
|
139
|
+
example: Doe
|
|
140
|
+
email:
|
|
141
|
+
type: string
|
|
142
|
+
format: email
|
|
143
|
+
example: john.doe@example.com
|
|
144
|
+
password:
|
|
145
|
+
type: string
|
|
146
|
+
example: securepassword123
|
|
147
|
+
role:
|
|
148
|
+
type: string
|
|
149
|
+
example: user
|
|
150
|
+
active:
|
|
151
|
+
type: boolean
|
|
152
|
+
default: true
|
|
153
|
+
example: true
|
|
154
|
+
contract_type:
|
|
155
|
+
type: string
|
|
156
|
+
example: permanent
|
|
157
|
+
two_factor_authentication:
|
|
158
|
+
type: string
|
|
159
|
+
example: none
|
|
160
|
+
expiration_date:
|
|
161
|
+
type: string
|
|
162
|
+
format: date
|
|
163
|
+
example: "2025-12-31"
|
|
164
|
+
is_bot:
|
|
165
|
+
type: boolean
|
|
166
|
+
default: false
|
|
167
|
+
example: false
|
|
168
|
+
responses:
|
|
169
|
+
201:
|
|
170
|
+
description: Person created successfully
|
|
171
|
+
content:
|
|
172
|
+
application/json:
|
|
173
|
+
schema:
|
|
174
|
+
type: object
|
|
175
|
+
properties:
|
|
176
|
+
id:
|
|
177
|
+
type: string
|
|
178
|
+
format: uuid
|
|
179
|
+
example: a24a6ea4-ce75-4665-a070-57453082c25
|
|
180
|
+
first_name:
|
|
181
|
+
type: string
|
|
182
|
+
example: John
|
|
183
|
+
last_name:
|
|
184
|
+
type: string
|
|
185
|
+
example: Doe
|
|
186
|
+
email:
|
|
187
|
+
type: string
|
|
188
|
+
format: email
|
|
189
|
+
example: john.doe@example.com
|
|
190
|
+
role:
|
|
191
|
+
type: string
|
|
192
|
+
example: user
|
|
193
|
+
active:
|
|
194
|
+
type: boolean
|
|
195
|
+
example: true
|
|
196
|
+
contract_type:
|
|
197
|
+
type: string
|
|
198
|
+
example: permanent
|
|
199
|
+
two_factor_authentication:
|
|
200
|
+
type: string
|
|
201
|
+
example: none
|
|
202
|
+
access_token:
|
|
203
|
+
type: string
|
|
204
|
+
example: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
|
|
205
|
+
created_at:
|
|
206
|
+
type: string
|
|
207
|
+
format: date-time
|
|
208
|
+
example: "2024-01-15T10:30:00Z"
|
|
209
|
+
updated_at:
|
|
210
|
+
type: string
|
|
211
|
+
format: date-time
|
|
212
|
+
example: "2024-01-15T10:30:00Z"
|
|
213
|
+
400:
|
|
214
|
+
description: Invalid data format or validation error or user limit reached
|
|
215
|
+
"""
|
|
216
|
+
return super().post()
|
|
217
|
+
|
|
34
218
|
def all_entries(self, query=None, relations=False):
|
|
35
219
|
if query is None:
|
|
36
220
|
query = self.model.query
|
|
@@ -138,6 +322,202 @@ class PersonResource(BaseModelResource, ArgsMixin):
|
|
|
138
322
|
def check_read_permissions(self, instance):
|
|
139
323
|
return True
|
|
140
324
|
|
|
325
|
+
@jwt_required()
|
|
326
|
+
def get(self, instance_id):
|
|
327
|
+
"""
|
|
328
|
+
Get person
|
|
329
|
+
---
|
|
330
|
+
tags:
|
|
331
|
+
- Crud
|
|
332
|
+
description: Retrieve a person by their ID and return it as a
|
|
333
|
+
JSON object. Supports including relations. Managers see safe
|
|
334
|
+
serialization, others see minimal information.
|
|
335
|
+
parameters:
|
|
336
|
+
- in: path
|
|
337
|
+
name: instance_id
|
|
338
|
+
required: true
|
|
339
|
+
schema:
|
|
340
|
+
type: string
|
|
341
|
+
format: uuid
|
|
342
|
+
example: a24a6ea4-ce75-4665-a070-57453082c25
|
|
343
|
+
- in: query
|
|
344
|
+
name: relations
|
|
345
|
+
required: false
|
|
346
|
+
schema:
|
|
347
|
+
type: boolean
|
|
348
|
+
default: true
|
|
349
|
+
example: true
|
|
350
|
+
description: Whether to include relations
|
|
351
|
+
responses:
|
|
352
|
+
200:
|
|
353
|
+
description: Person retrieved successfully
|
|
354
|
+
content:
|
|
355
|
+
application/json:
|
|
356
|
+
schema:
|
|
357
|
+
type: object
|
|
358
|
+
properties:
|
|
359
|
+
id:
|
|
360
|
+
type: string
|
|
361
|
+
format: uuid
|
|
362
|
+
example: a24a6ea4-ce75-4665-a070-57453082c25
|
|
363
|
+
first_name:
|
|
364
|
+
type: string
|
|
365
|
+
example: John
|
|
366
|
+
last_name:
|
|
367
|
+
type: string
|
|
368
|
+
example: Doe
|
|
369
|
+
email:
|
|
370
|
+
type: string
|
|
371
|
+
format: email
|
|
372
|
+
example: john.doe@example.com
|
|
373
|
+
role:
|
|
374
|
+
type: string
|
|
375
|
+
example: user
|
|
376
|
+
active:
|
|
377
|
+
type: boolean
|
|
378
|
+
example: true
|
|
379
|
+
contract_type:
|
|
380
|
+
type: string
|
|
381
|
+
example: permanent
|
|
382
|
+
two_factor_authentication:
|
|
383
|
+
type: string
|
|
384
|
+
example: none
|
|
385
|
+
departments:
|
|
386
|
+
type: array
|
|
387
|
+
items:
|
|
388
|
+
type: string
|
|
389
|
+
format: uuid
|
|
390
|
+
example: []
|
|
391
|
+
created_at:
|
|
392
|
+
type: string
|
|
393
|
+
format: date-time
|
|
394
|
+
example: "2024-01-15T10:30:00Z"
|
|
395
|
+
updated_at:
|
|
396
|
+
type: string
|
|
397
|
+
format: date-time
|
|
398
|
+
example: "2024-01-15T10:30:00Z"
|
|
399
|
+
400:
|
|
400
|
+
description: Invalid ID format or query error
|
|
401
|
+
"""
|
|
402
|
+
return super().get(instance_id)
|
|
403
|
+
|
|
404
|
+
@jwt_required()
|
|
405
|
+
def put(self, instance_id):
|
|
406
|
+
"""
|
|
407
|
+
Update person
|
|
408
|
+
---
|
|
409
|
+
tags:
|
|
410
|
+
- Crud
|
|
411
|
+
description: Update a person with data provided in the request
|
|
412
|
+
body. JSON format is expected. Users can only update themselves
|
|
413
|
+
unless they have admin permissions. Non-admins cannot change
|
|
414
|
+
certain protected fields. Validates role, contract_type,
|
|
415
|
+
two_factor_authentication, email, and expiration_date. Checks
|
|
416
|
+
user limit when activating non-bot users. Protected accounts
|
|
417
|
+
have restrictions.
|
|
418
|
+
parameters:
|
|
419
|
+
- in: path
|
|
420
|
+
name: instance_id
|
|
421
|
+
required: true
|
|
422
|
+
schema:
|
|
423
|
+
type: string
|
|
424
|
+
format: uuid
|
|
425
|
+
example: a24a6ea4-ce75-4665-a070-57453082c25
|
|
426
|
+
requestBody:
|
|
427
|
+
required: true
|
|
428
|
+
content:
|
|
429
|
+
application/json:
|
|
430
|
+
schema:
|
|
431
|
+
type: object
|
|
432
|
+
properties:
|
|
433
|
+
first_name:
|
|
434
|
+
type: string
|
|
435
|
+
example: Jane
|
|
436
|
+
last_name:
|
|
437
|
+
type: string
|
|
438
|
+
example: Smith
|
|
439
|
+
email:
|
|
440
|
+
type: string
|
|
441
|
+
format: email
|
|
442
|
+
example: jane.smith@example.com
|
|
443
|
+
password:
|
|
444
|
+
type: string
|
|
445
|
+
example: newsecurepassword123
|
|
446
|
+
role:
|
|
447
|
+
type: string
|
|
448
|
+
example: manager
|
|
449
|
+
description: Admin only
|
|
450
|
+
active:
|
|
451
|
+
type: boolean
|
|
452
|
+
example: true
|
|
453
|
+
description: Admin only
|
|
454
|
+
contract_type:
|
|
455
|
+
type: string
|
|
456
|
+
example: freelance
|
|
457
|
+
two_factor_authentication:
|
|
458
|
+
type: string
|
|
459
|
+
example: totp
|
|
460
|
+
expiration_date:
|
|
461
|
+
type: string
|
|
462
|
+
format: date
|
|
463
|
+
example: "2025-12-31"
|
|
464
|
+
description: Person or admin only
|
|
465
|
+
responses:
|
|
466
|
+
200:
|
|
467
|
+
description: Person updated successfully
|
|
468
|
+
content:
|
|
469
|
+
application/json:
|
|
470
|
+
schema:
|
|
471
|
+
type: object
|
|
472
|
+
properties:
|
|
473
|
+
id:
|
|
474
|
+
type: string
|
|
475
|
+
format: uuid
|
|
476
|
+
example: a24a6ea4-ce75-4665-a070-57453082c25
|
|
477
|
+
first_name:
|
|
478
|
+
type: string
|
|
479
|
+
example: Jane
|
|
480
|
+
last_name:
|
|
481
|
+
type: string
|
|
482
|
+
example: Smith
|
|
483
|
+
email:
|
|
484
|
+
type: string
|
|
485
|
+
format: email
|
|
486
|
+
example: jane.smith@example.com
|
|
487
|
+
role:
|
|
488
|
+
type: string
|
|
489
|
+
example: manager
|
|
490
|
+
active:
|
|
491
|
+
type: boolean
|
|
492
|
+
example: true
|
|
493
|
+
contract_type:
|
|
494
|
+
type: string
|
|
495
|
+
example: freelance
|
|
496
|
+
two_factor_authentication:
|
|
497
|
+
type: string
|
|
498
|
+
example: totp
|
|
499
|
+
departments:
|
|
500
|
+
type: array
|
|
501
|
+
items:
|
|
502
|
+
type: string
|
|
503
|
+
format: uuid
|
|
504
|
+
example: []
|
|
505
|
+
access_token:
|
|
506
|
+
type: string
|
|
507
|
+
example: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
|
|
508
|
+
created_at:
|
|
509
|
+
type: string
|
|
510
|
+
format: date-time
|
|
511
|
+
example: "2024-01-15T10:30:00Z"
|
|
512
|
+
updated_at:
|
|
513
|
+
type: string
|
|
514
|
+
format: date-time
|
|
515
|
+
example: "2024-01-15T11:00:00Z"
|
|
516
|
+
400:
|
|
517
|
+
description: Invalid data format or validation error or user limit reached or protected account restriction
|
|
518
|
+
"""
|
|
519
|
+
return super().put(instance_id)
|
|
520
|
+
|
|
141
521
|
def check_update_permissions(self, instance_dict, data):
|
|
142
522
|
if instance_dict["id"] != persons_service.get_current_user()["id"]:
|
|
143
523
|
permissions.check_admin_permissions()
|
|
@@ -259,8 +639,33 @@ class PersonResource(BaseModelResource, ArgsMixin):
|
|
|
259
639
|
@jwt_required()
|
|
260
640
|
def delete(self, instance_id):
|
|
261
641
|
"""
|
|
262
|
-
Delete
|
|
263
|
-
|
|
642
|
+
Delete person
|
|
643
|
+
---
|
|
644
|
+
tags:
|
|
645
|
+
- Crud
|
|
646
|
+
description: Delete a person by their ID. Returns empty response
|
|
647
|
+
on success. Cannot delete yourself.
|
|
648
|
+
parameters:
|
|
649
|
+
- in: path
|
|
650
|
+
name: instance_id
|
|
651
|
+
required: true
|
|
652
|
+
schema:
|
|
653
|
+
type: string
|
|
654
|
+
format: uuid
|
|
655
|
+
example: a24a6ea4-ce75-4665-a070-57453082c25
|
|
656
|
+
- in: query
|
|
657
|
+
name: force
|
|
658
|
+
required: false
|
|
659
|
+
schema:
|
|
660
|
+
type: boolean
|
|
661
|
+
default: false
|
|
662
|
+
example: false
|
|
663
|
+
description: Force deletion even if person has associated data
|
|
664
|
+
responses:
|
|
665
|
+
204:
|
|
666
|
+
description: Person deleted successfully
|
|
667
|
+
400:
|
|
668
|
+
description: Cannot delete person or integrity error
|
|
264
669
|
"""
|
|
265
670
|
force = self.get_force()
|
|
266
671
|
person = self.get_model_or_404(instance_id)
|