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.
Files changed (114) hide show
  1. zou/__init__.py +1 -1
  2. zou/app/blueprints/assets/resources.py +1060 -153
  3. zou/app/blueprints/auth/resources.py +368 -238
  4. zou/app/blueprints/breakdown/resources.py +584 -94
  5. zou/app/blueprints/chats/resources.py +176 -37
  6. zou/app/blueprints/comments/resources.py +409 -150
  7. zou/app/blueprints/concepts/resources.py +443 -63
  8. zou/app/blueprints/crud/asset_instance.py +272 -0
  9. zou/app/blueprints/crud/attachment_file.py +263 -0
  10. zou/app/blueprints/crud/base.py +176 -69
  11. zou/app/blueprints/crud/budget.py +278 -0
  12. zou/app/blueprints/crud/budget_entry.py +269 -0
  13. zou/app/blueprints/crud/chat.py +282 -0
  14. zou/app/blueprints/crud/chat_message.py +286 -0
  15. zou/app/blueprints/crud/comments.py +312 -1
  16. zou/app/blueprints/crud/custom_action.py +268 -0
  17. zou/app/blueprints/crud/day_off.py +298 -0
  18. zou/app/blueprints/crud/department.py +268 -0
  19. zou/app/blueprints/crud/entity.py +297 -3
  20. zou/app/blueprints/crud/entity_link.py +303 -0
  21. zou/app/blueprints/crud/entity_type.py +269 -0
  22. zou/app/blueprints/crud/event.py +197 -0
  23. zou/app/blueprints/crud/file_status.py +268 -0
  24. zou/app/blueprints/crud/hardware_item.py +268 -0
  25. zou/app/blueprints/crud/metadata_descriptor.py +312 -0
  26. zou/app/blueprints/crud/milestone.py +302 -1
  27. zou/app/blueprints/crud/news.py +285 -0
  28. zou/app/blueprints/crud/notification.py +287 -0
  29. zou/app/blueprints/crud/organisation.py +269 -0
  30. zou/app/blueprints/crud/output_file.py +34 -10
  31. zou/app/blueprints/crud/output_type.py +30 -10
  32. zou/app/blueprints/crud/person.py +407 -2
  33. zou/app/blueprints/crud/playlist.py +322 -4
  34. zou/app/blueprints/crud/plugin.py +269 -0
  35. zou/app/blueprints/crud/preview_background_file.py +272 -0
  36. zou/app/blueprints/crud/preview_file.py +280 -9
  37. zou/app/blueprints/crud/production_schedule_version.py +569 -0
  38. zou/app/blueprints/crud/project.py +440 -0
  39. zou/app/blueprints/crud/project_status.py +268 -0
  40. zou/app/blueprints/crud/salary_scale.py +185 -5
  41. zou/app/blueprints/crud/schedule_item.py +305 -0
  42. zou/app/blueprints/crud/search_filter.py +302 -0
  43. zou/app/blueprints/crud/search_filter_group.py +270 -0
  44. zou/app/blueprints/crud/software.py +30 -10
  45. zou/app/blueprints/crud/status_automation.py +296 -2
  46. zou/app/blueprints/crud/studio.py +268 -0
  47. zou/app/blueprints/crud/subscription.py +279 -0
  48. zou/app/blueprints/crud/task.py +325 -5
  49. zou/app/blueprints/crud/task_status.py +301 -0
  50. zou/app/blueprints/crud/task_type.py +283 -0
  51. zou/app/blueprints/crud/time_spent.py +327 -0
  52. zou/app/blueprints/crud/working_file.py +273 -10
  53. zou/app/blueprints/departments/resources.py +302 -68
  54. zou/app/blueprints/edits/resources.py +651 -81
  55. zou/app/blueprints/entities/resources.py +104 -39
  56. zou/app/blueprints/events/resources.py +96 -8
  57. zou/app/blueprints/export/csv/assets.py +15 -5
  58. zou/app/blueprints/export/csv/base.py +12 -3
  59. zou/app/blueprints/export/csv/casting.py +32 -5
  60. zou/app/blueprints/export/csv/edits.py +15 -5
  61. zou/app/blueprints/export/csv/persons.py +24 -0
  62. zou/app/blueprints/export/csv/playlists.py +16 -5
  63. zou/app/blueprints/export/csv/projects.py +23 -0
  64. zou/app/blueprints/export/csv/shots.py +15 -5
  65. zou/app/blueprints/export/csv/task_types.py +23 -0
  66. zou/app/blueprints/export/csv/tasks.py +24 -0
  67. zou/app/blueprints/export/csv/time_spents.py +24 -0
  68. zou/app/blueprints/files/resources.py +928 -377
  69. zou/app/blueprints/index/resources.py +49 -42
  70. zou/app/blueprints/news/resources.py +47 -27
  71. zou/app/blueprints/persons/resources.py +644 -271
  72. zou/app/blueprints/playlists/resources.py +154 -72
  73. zou/app/blueprints/previews/resources.py +473 -228
  74. zou/app/blueprints/projects/__init__.py +5 -0
  75. zou/app/blueprints/projects/resources.py +987 -420
  76. zou/app/blueprints/search/resources.py +44 -32
  77. zou/app/blueprints/shots/resources.py +1338 -88
  78. zou/app/blueprints/source/csv/assets.py +44 -6
  79. zou/app/blueprints/source/csv/casting.py +43 -6
  80. zou/app/blueprints/source/csv/edits.py +47 -9
  81. zou/app/blueprints/source/csv/persons.py +43 -4
  82. zou/app/blueprints/source/csv/shots.py +47 -6
  83. zou/app/blueprints/source/csv/task_type_estimations.py +95 -35
  84. zou/app/blueprints/source/kitsu.py +433 -11
  85. zou/app/blueprints/source/otio.py +215 -20
  86. zou/app/blueprints/source/shotgun/assets.py +146 -0
  87. zou/app/blueprints/source/shotgun/base.py +85 -14
  88. zou/app/blueprints/source/shotgun/episode.py +124 -0
  89. zou/app/blueprints/source/shotgun/import_errors.py +105 -14
  90. zou/app/blueprints/source/shotgun/notes.py +132 -0
  91. zou/app/blueprints/source/shotgun/person.py +163 -0
  92. zou/app/blueprints/source/shotgun/project.py +120 -0
  93. zou/app/blueprints/source/shotgun/scene.py +120 -0
  94. zou/app/blueprints/source/shotgun/sequence.py +134 -0
  95. zou/app/blueprints/source/shotgun/shot.py +166 -0
  96. zou/app/blueprints/source/shotgun/status.py +129 -0
  97. zou/app/blueprints/source/shotgun/steps.py +138 -0
  98. zou/app/blueprints/source/shotgun/tasks.py +199 -0
  99. zou/app/blueprints/source/shotgun/team.py +132 -0
  100. zou/app/blueprints/source/shotgun/versions.py +155 -0
  101. zou/app/blueprints/tasks/resources.py +1197 -308
  102. zou/app/blueprints/user/resources.py +1808 -215
  103. zou/app/models/metadata_descriptor.py +1 -0
  104. zou/app/services/persons_service.py +1 -1
  105. zou/app/services/projects_service.py +45 -1
  106. zou/app/services/time_spents_service.py +1 -1
  107. zou/app/swagger.py +100 -27
  108. zou/migrations/versions/a1b2c3d4e5f6_add_position_to_metadata_descriptor.py +32 -0
  109. {zou-0.20.82.dist-info → zou-0.20.84.dist-info}/METADATA +18 -18
  110. {zou-0.20.82.dist-info → zou-0.20.84.dist-info}/RECORD +114 -113
  111. {zou-0.20.82.dist-info → zou-0.20.84.dist-info}/WHEEL +0 -0
  112. {zou-0.20.82.dist-info → zou-0.20.84.dist-info}/entry_points.txt +0 -0
  113. {zou-0.20.82.dist-info → zou-0.20.84.dist-info}/licenses/LICENSE +0 -0
  114. {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 a person corresponding at given ID and return it as a JSON
263
- object.
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)