zou 0.20.83__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 (103) hide show
  1. zou/__init__.py +1 -1
  2. zou/app/blueprints/comments/resources.py +32 -35
  3. zou/app/blueprints/concepts/resources.py +23 -8
  4. zou/app/blueprints/crud/asset_instance.py +272 -0
  5. zou/app/blueprints/crud/attachment_file.py +263 -0
  6. zou/app/blueprints/crud/base.py +176 -69
  7. zou/app/blueprints/crud/budget.py +278 -0
  8. zou/app/blueprints/crud/budget_entry.py +269 -0
  9. zou/app/blueprints/crud/chat.py +282 -0
  10. zou/app/blueprints/crud/chat_message.py +286 -0
  11. zou/app/blueprints/crud/comments.py +312 -1
  12. zou/app/blueprints/crud/custom_action.py +268 -0
  13. zou/app/blueprints/crud/day_off.py +298 -0
  14. zou/app/blueprints/crud/department.py +268 -0
  15. zou/app/blueprints/crud/entity.py +297 -3
  16. zou/app/blueprints/crud/entity_link.py +303 -0
  17. zou/app/blueprints/crud/entity_type.py +269 -0
  18. zou/app/blueprints/crud/event.py +197 -0
  19. zou/app/blueprints/crud/file_status.py +268 -0
  20. zou/app/blueprints/crud/hardware_item.py +268 -0
  21. zou/app/blueprints/crud/metadata_descriptor.py +312 -0
  22. zou/app/blueprints/crud/milestone.py +302 -1
  23. zou/app/blueprints/crud/news.py +285 -0
  24. zou/app/blueprints/crud/notification.py +287 -0
  25. zou/app/blueprints/crud/organisation.py +269 -0
  26. zou/app/blueprints/crud/output_file.py +34 -10
  27. zou/app/blueprints/crud/output_type.py +30 -10
  28. zou/app/blueprints/crud/person.py +407 -2
  29. zou/app/blueprints/crud/playlist.py +322 -4
  30. zou/app/blueprints/crud/plugin.py +269 -0
  31. zou/app/blueprints/crud/preview_background_file.py +272 -0
  32. zou/app/blueprints/crud/preview_file.py +280 -9
  33. zou/app/blueprints/crud/production_schedule_version.py +569 -0
  34. zou/app/blueprints/crud/project.py +440 -0
  35. zou/app/blueprints/crud/project_status.py +268 -0
  36. zou/app/blueprints/crud/salary_scale.py +185 -5
  37. zou/app/blueprints/crud/schedule_item.py +305 -0
  38. zou/app/blueprints/crud/search_filter.py +302 -0
  39. zou/app/blueprints/crud/search_filter_group.py +270 -0
  40. zou/app/blueprints/crud/software.py +30 -10
  41. zou/app/blueprints/crud/status_automation.py +296 -2
  42. zou/app/blueprints/crud/studio.py +268 -0
  43. zou/app/blueprints/crud/subscription.py +279 -0
  44. zou/app/blueprints/crud/task.py +325 -5
  45. zou/app/blueprints/crud/task_status.py +301 -0
  46. zou/app/blueprints/crud/task_type.py +283 -0
  47. zou/app/blueprints/crud/time_spent.py +327 -0
  48. zou/app/blueprints/crud/working_file.py +273 -10
  49. zou/app/blueprints/export/csv/assets.py +15 -5
  50. zou/app/blueprints/export/csv/base.py +12 -3
  51. zou/app/blueprints/export/csv/casting.py +32 -5
  52. zou/app/blueprints/export/csv/edits.py +15 -5
  53. zou/app/blueprints/export/csv/persons.py +24 -0
  54. zou/app/blueprints/export/csv/playlists.py +16 -5
  55. zou/app/blueprints/export/csv/projects.py +23 -0
  56. zou/app/blueprints/export/csv/shots.py +15 -5
  57. zou/app/blueprints/export/csv/task_types.py +23 -0
  58. zou/app/blueprints/export/csv/tasks.py +24 -0
  59. zou/app/blueprints/export/csv/time_spents.py +24 -0
  60. zou/app/blueprints/files/resources.py +928 -377
  61. zou/app/blueprints/news/resources.py +7 -5
  62. zou/app/blueprints/persons/resources.py +644 -271
  63. zou/app/blueprints/playlists/resources.py +154 -72
  64. zou/app/blueprints/previews/resources.py +473 -228
  65. zou/app/blueprints/projects/__init__.py +5 -0
  66. zou/app/blueprints/projects/resources.py +987 -420
  67. zou/app/blueprints/search/resources.py +44 -32
  68. zou/app/blueprints/shots/resources.py +1338 -88
  69. zou/app/blueprints/source/csv/assets.py +44 -6
  70. zou/app/blueprints/source/csv/casting.py +43 -6
  71. zou/app/blueprints/source/csv/edits.py +47 -9
  72. zou/app/blueprints/source/csv/persons.py +43 -4
  73. zou/app/blueprints/source/csv/shots.py +47 -6
  74. zou/app/blueprints/source/csv/task_type_estimations.py +95 -35
  75. zou/app/blueprints/source/kitsu.py +433 -11
  76. zou/app/blueprints/source/otio.py +215 -20
  77. zou/app/blueprints/source/shotgun/assets.py +146 -0
  78. zou/app/blueprints/source/shotgun/base.py +85 -14
  79. zou/app/blueprints/source/shotgun/episode.py +124 -0
  80. zou/app/blueprints/source/shotgun/import_errors.py +105 -14
  81. zou/app/blueprints/source/shotgun/notes.py +132 -0
  82. zou/app/blueprints/source/shotgun/person.py +163 -0
  83. zou/app/blueprints/source/shotgun/project.py +120 -0
  84. zou/app/blueprints/source/shotgun/scene.py +120 -0
  85. zou/app/blueprints/source/shotgun/sequence.py +134 -0
  86. zou/app/blueprints/source/shotgun/shot.py +166 -0
  87. zou/app/blueprints/source/shotgun/status.py +129 -0
  88. zou/app/blueprints/source/shotgun/steps.py +138 -0
  89. zou/app/blueprints/source/shotgun/tasks.py +199 -0
  90. zou/app/blueprints/source/shotgun/team.py +132 -0
  91. zou/app/blueprints/source/shotgun/versions.py +155 -0
  92. zou/app/blueprints/tasks/resources.py +1197 -308
  93. zou/app/models/metadata_descriptor.py +1 -0
  94. zou/app/services/persons_service.py +1 -1
  95. zou/app/services/projects_service.py +45 -1
  96. zou/app/services/time_spents_service.py +1 -1
  97. zou/migrations/versions/a1b2c3d4e5f6_add_position_to_metadata_descriptor.py +32 -0
  98. {zou-0.20.83.dist-info → zou-0.20.84.dist-info}/METADATA +18 -18
  99. {zou-0.20.83.dist-info → zou-0.20.84.dist-info}/RECORD +103 -102
  100. {zou-0.20.83.dist-info → zou-0.20.84.dist-info}/WHEEL +0 -0
  101. {zou-0.20.83.dist-info → zou-0.20.84.dist-info}/entry_points.txt +0 -0
  102. {zou-0.20.83.dist-info → zou-0.20.84.dist-info}/licenses/LICENSE +0 -0
  103. {zou-0.20.83.dist-info → zou-0.20.84.dist-info}/top_level.txt +0 -0
@@ -27,10 +27,12 @@ class ShotResource(Resource, ArgsMixin):
27
27
  @jwt_required()
28
28
  def get(self, shot_id):
29
29
  """
30
- Retrieve given shot.
30
+ Get shot
31
31
  ---
32
32
  tags:
33
33
  - Shots
34
+ description: Get a shot by id. Returns full shot data. Use this to fetch
35
+ a single shot with all fields needed by the UI.
34
36
  parameters:
35
37
  - in: path
36
38
  name: shot_id
@@ -40,7 +42,33 @@ class ShotResource(Resource, ArgsMixin):
40
42
  example: a24a6ea4-ce75-4665-a070-57453082c25
41
43
  responses:
42
44
  200:
43
- description: Given shot
45
+ description: Shot found and returned
46
+ content:
47
+ application/json:
48
+ schema:
49
+ type: object
50
+ properties:
51
+ id:
52
+ type: string
53
+ format: uuid
54
+ example: a24a6ea4-ce75-4665-a070-57453082c25
55
+ name:
56
+ type: string
57
+ example: SH010
58
+ project_id:
59
+ type: string
60
+ format: uuid
61
+ example: b24a6ea4-ce75-4665-a070-57453082c25
62
+ parent_id:
63
+ type: string
64
+ format: uuid
65
+ example: c24a6ea4-ce75-4665-a070-57453082c25
66
+ nb_frames:
67
+ type: integer
68
+ example: 120
69
+ data:
70
+ type: object
71
+ example: {"camera": "camA", "cut_in": 1001}
44
72
  """
45
73
  shot = shots_service.get_full_shot(shot_id)
46
74
  if shot is None:
@@ -53,10 +81,12 @@ class ShotResource(Resource, ArgsMixin):
53
81
  @jwt_required()
54
82
  def put(self, shot_id):
55
83
  """
56
- Update given shot.
84
+ Update shot
57
85
  ---
58
86
  tags:
59
87
  - Shots
88
+ description: Update a shot by id. Only mutable fields are allowed. Send a
89
+ JSON body with the fields to change.
60
90
  parameters:
61
91
  - in: path
62
92
  name: shot_id
@@ -70,10 +100,51 @@ class ShotResource(Resource, ArgsMixin):
70
100
  application/json:
71
101
  schema:
72
102
  type: object
73
- description: Shot data to update
103
+ description: Data to update on the shot
104
+ properties:
105
+ name:
106
+ type: string
107
+ example: SH010 new name
108
+ description:
109
+ type: string
110
+ example: Update description for the shot
111
+ nb_frames:
112
+ type: integer
113
+ example: 24
114
+ data:
115
+ type: object
116
+ example: {"camera": "camA", "cut_in": 1001}
74
117
  responses:
75
118
  200:
76
- description: Update given shot
119
+ description: Shot updated
120
+ content:
121
+ application/json:
122
+ schema:
123
+ type: object
124
+ properties:
125
+ id:
126
+ type: string
127
+ format: uuid
128
+ example: a24a6ea4-ce75-4665-a070-57453082c25
129
+ name:
130
+ type: string
131
+ example: SH010
132
+ project_id:
133
+ type: string
134
+ format: uuid
135
+ example: b24a6ea4-ce75-4665-a070-57453082c25
136
+ parent_id:
137
+ type: string
138
+ format: uuid
139
+ example: c24a6ea4-ce75-4665-a070-57453082c25
140
+ nb_frames:
141
+ type: integer
142
+ example: 120
143
+ data:
144
+ type: object
145
+ example: {"camera": "camA", "cut_in": 1001}
146
+ 400:
147
+ description: Invalid body or unsupported fields
77
148
  """
78
149
  shot = shots_service.get_shot(shot_id)
79
150
  user_service.check_manager_project_access(shot["project_id"])
@@ -102,10 +173,12 @@ class ShotResource(Resource, ArgsMixin):
102
173
  @jwt_required()
103
174
  def delete(self, shot_id):
104
175
  """
105
- Delete given shot.
176
+ Delete shot
106
177
  ---
107
178
  tags:
108
179
  - Shots
180
+ description: Delete a shot by id. Requires manager access or ownership of
181
+ the shot.
109
182
  parameters:
110
183
  - in: path
111
184
  name: shot_id
@@ -115,7 +188,7 @@ class ShotResource(Resource, ArgsMixin):
115
188
  example: a24a6ea4-ce75-4665-a070-57453082c25
116
189
  responses:
117
190
  204:
118
- description: Given shot deleted
191
+ description: Shot deleted
119
192
  """
120
193
  force = self.get_force()
121
194
  shot = shots_service.get_shot(shot_id)
@@ -131,10 +204,11 @@ class SceneResource(Resource):
131
204
  @jwt_required()
132
205
  def get(self, scene_id):
133
206
  """
134
- Retrieve given scene.
207
+ Get scene
135
208
  ---
136
209
  tags:
137
210
  - Shots
211
+ description: Get a scene by id. Returns full scene data needed by clients.
138
212
  parameters:
139
213
  - in: path
140
214
  name: scene_id
@@ -144,7 +218,23 @@ class SceneResource(Resource):
144
218
  example: a24a6ea4-ce75-4665-a070-57453082c25
145
219
  responses:
146
220
  200:
147
- description: Given scene
221
+ description: Scene found and returned
222
+ content:
223
+ application/json:
224
+ schema:
225
+ type: object
226
+ properties:
227
+ id:
228
+ type: string
229
+ format: uuid
230
+ example: a24a6ea4-ce75-4665-a070-57453082c25
231
+ name:
232
+ type: string
233
+ example: SC001
234
+ project_id:
235
+ type: string
236
+ format: uuid
237
+ example: b24a6ea4-ce75-4665-a070-57453082c25
148
238
  """
149
239
  scene = shots_service.get_full_scene(scene_id)
150
240
  user_service.check_project_access(scene["project_id"])
@@ -154,10 +244,11 @@ class SceneResource(Resource):
154
244
  @jwt_required()
155
245
  def delete(self, scene_id):
156
246
  """
157
- Delete given scene.
247
+ Delete scene
158
248
  ---
159
249
  tags:
160
250
  - Shots
251
+ description: Delete a scene by id. Requires manager access or ownership.
161
252
  parameters:
162
253
  - in: path
163
254
  name: scene_id
@@ -167,7 +258,7 @@ class SceneResource(Resource):
167
258
  example: a24a6ea4-ce75-4665-a070-57453082c25
168
259
  responses:
169
260
  204:
170
- description: Given scene deleted
261
+ description: Scene deleted
171
262
  """
172
263
  scene = shots_service.get_scene(scene_id)
173
264
  if scene["created_by"] == persons_service.get_current_user()["id"]:
@@ -182,11 +273,12 @@ class ShotsResource(Resource):
182
273
  @jwt_required()
183
274
  def get(self):
184
275
  """
185
- Retrieve all shot entries.
276
+ Get shots
186
277
  ---
187
278
  tags:
188
279
  - Shots
189
- description: Filters can be specified in the query string.
280
+ description: Get shots with optional filters. Use query params like
281
+ project_id, sequence_id or parent_id to filter results.
190
282
  parameters:
191
283
  - in: query
192
284
  name: sequence_id
@@ -209,6 +301,28 @@ class ShotsResource(Resource):
209
301
  responses:
210
302
  200:
211
303
  description: All shot entries
304
+ content:
305
+ application/json:
306
+ schema:
307
+ type: array
308
+ items:
309
+ type: object
310
+ properties:
311
+ id:
312
+ type: string
313
+ format: uuid
314
+ example: a24a6ea4-ce75-4665-a070-57453082c25
315
+ name:
316
+ type: string
317
+ example: SH010
318
+ project_id:
319
+ type: string
320
+ format: uuid
321
+ example: b24a6ea4-ce75-4665-a070-57453082c25
322
+ parent_id:
323
+ type: string
324
+ format: uuid
325
+ example: c24a6ea4-ce75-4665-a070-57453082c25
212
326
  """
213
327
  criterions = query.get_query_criterions_from_request(request)
214
328
  if "sequence_id" in criterions:
@@ -228,11 +342,12 @@ class AllShotsResource(Resource):
228
342
  @jwt_required()
229
343
  def get(self):
230
344
  """
231
- Retrieve all shot entries.
345
+ Get all shots
232
346
  ---
233
347
  tags:
234
348
  - Shots
235
- description: Filters can be specified in the query string.
349
+ description: Get all shots across projects with optional filters. Use
350
+ sequence_id, project_id, or parent_id to filter.
236
351
  parameters:
237
352
  - in: query
238
353
  name: sequence_id
@@ -255,6 +370,28 @@ class AllShotsResource(Resource):
255
370
  responses:
256
371
  200:
257
372
  description: All shot entries
373
+ content:
374
+ application/json:
375
+ schema:
376
+ type: array
377
+ items:
378
+ type: object
379
+ properties:
380
+ id:
381
+ type: string
382
+ format: uuid
383
+ example: a24a6ea4-ce75-4665-a070-57453082c25
384
+ name:
385
+ type: string
386
+ example: SH020
387
+ project_id:
388
+ type: string
389
+ format: uuid
390
+ example: b24a6ea4-ce75-4665-a070-57453082c25
391
+ parent_id:
392
+ type: string
393
+ format: uuid
394
+ example: c24a6ea4-ce75-4665-a070-57453082c25
258
395
  """
259
396
  criterions = query.get_query_criterions_from_request(request)
260
397
  if "sequence_id" in criterions:
@@ -274,11 +411,12 @@ class ScenesResource(Resource):
274
411
  @jwt_required()
275
412
  def get(self):
276
413
  """
277
- Retrieve all scene entries.
414
+ Get scenes
278
415
  ---
279
416
  tags:
280
417
  - Shots
281
- description: Filters can be specified in the query string.
418
+ description: Get scenes with optional filters. Use project_id to filter
419
+ by project.
282
420
  parameters:
283
421
  - in: query
284
422
  name: project_id
@@ -289,6 +427,24 @@ class ScenesResource(Resource):
289
427
  responses:
290
428
  200:
291
429
  description: All scene entries
430
+ content:
431
+ application/json:
432
+ schema:
433
+ type: array
434
+ items:
435
+ type: object
436
+ properties:
437
+ id:
438
+ type: string
439
+ format: uuid
440
+ example: a24a6ea4-ce75-4665-a070-57453082c25
441
+ name:
442
+ type: string
443
+ example: SC001
444
+ project_id:
445
+ type: string
446
+ format: uuid
447
+ example: b24a6ea4-ce75-4665-a070-57453082c25
292
448
  """
293
449
  criterions = query.get_query_criterions_from_request(request)
294
450
  user_service.check_project_access(criterions.get("project_id", None))
@@ -299,10 +455,12 @@ class ShotAssetsResource(Resource):
299
455
  @jwt_required()
300
456
  def get(self, shot_id):
301
457
  """
302
- Retrieve all assets for a given shot.
458
+ Get shot assets
303
459
  ---
304
460
  tags:
305
461
  - Shots
462
+ description: Get assets linked to a shot. Returns the breakdown casting
463
+ for the shot.
306
464
  parameters:
307
465
  - in: path
308
466
  name: shot_id
@@ -313,6 +471,24 @@ class ShotAssetsResource(Resource):
313
471
  responses:
314
472
  200:
315
473
  description: All assets for given shot
474
+ content:
475
+ application/json:
476
+ schema:
477
+ type: array
478
+ items:
479
+ type: object
480
+ properties:
481
+ id:
482
+ type: string
483
+ format: uuid
484
+ example: a24a6ea4-ce75-4665-a070-57453082c25
485
+ name:
486
+ type: string
487
+ example: Character A
488
+ entity_type_id:
489
+ type: string
490
+ format: uuid
491
+ example: b24a6ea4-ce75-4665-a070-57453082c25
316
492
  """
317
493
  shot = shots_service.get_shot(shot_id)
318
494
  user_service.check_project_access(shot["project_id"])
@@ -324,10 +500,11 @@ class ShotTaskTypesResource(Resource):
324
500
  @jwt_required()
325
501
  def get(self, shot_id):
326
502
  """
327
- Retrieve all task types related to a given shot.
503
+ Get shot task types
328
504
  ---
329
505
  tags:
330
506
  - Shots
507
+ description: Get task types for a shot.
331
508
  parameters:
332
509
  - in: path
333
510
  name: shot_id
@@ -338,6 +515,20 @@ class ShotTaskTypesResource(Resource):
338
515
  responses:
339
516
  200:
340
517
  description: All task types related to given shot
518
+ content:
519
+ application/json:
520
+ schema:
521
+ type: array
522
+ items:
523
+ type: object
524
+ properties:
525
+ id:
526
+ type: string
527
+ format: uuid
528
+ example: a24a6ea4-ce75-4665-a070-57453082c25
529
+ name:
530
+ type: string
531
+ example: Animation
341
532
  """
342
533
  shot = shots_service.get_shot(shot_id)
343
534
  user_service.check_project_access(shot["project_id"])
@@ -349,10 +540,12 @@ class ShotTasksResource(Resource, ArgsMixin):
349
540
  @jwt_required()
350
541
  def get(self, shot_id):
351
542
  """
352
- Retrieve all tasks related to a given shot.
543
+ Get shot tasks
353
544
  ---
354
545
  tags:
355
546
  - Shots
547
+ description: Get tasks for a shot. Optionally include relations using
548
+ query params.
356
549
  parameters:
357
550
  - in: path
358
551
  name: shot_id
@@ -363,6 +556,42 @@ class ShotTasksResource(Resource, ArgsMixin):
363
556
  responses:
364
557
  200:
365
558
  description: All tasks related to given shot
559
+ content:
560
+ application/json:
561
+ schema:
562
+ type: array
563
+ items:
564
+ type: object
565
+ properties:
566
+ id:
567
+ type: string
568
+ format: uuid
569
+ example: a24a6ea4-ce75-4665-a070-57453082c25
570
+ name:
571
+ type: string
572
+ example: SH010 Animation
573
+ task_type_id:
574
+ type: string
575
+ format: uuid
576
+ example: b24a6ea4-ce75-4665-a070-57453082c25
577
+ task_status_id:
578
+ type: string
579
+ format: uuid
580
+ example: c24a6ea4-ce75-4665-a070-57453082c25
581
+ entity_id:
582
+ type: string
583
+ format: uuid
584
+ example: d24a6ea4-ce75-4665-a070-57453082c25
585
+ project_id:
586
+ type: string
587
+ format: uuid
588
+ example: e24a6ea4-ce75-4665-a070-57453082c25
589
+ assignees:
590
+ type: array
591
+ items:
592
+ type: string
593
+ format: uuid
594
+ example: ["f24a6ea4-ce75-4665-a070-57453082c25"]
366
595
  """
367
596
  shot = shots_service.get_shot(shot_id)
368
597
  user_service.check_project_access(shot["project_id"])
@@ -375,10 +604,12 @@ class SequenceShotTasksResource(Resource, ArgsMixin):
375
604
  @jwt_required()
376
605
  def get(self, sequence_id):
377
606
  """
378
- Retrieve all tasks related to a given sequence.
607
+ Get sequence shot tasks
379
608
  ---
380
609
  tags:
381
610
  - Shots
611
+ description: Get shot tasks for a sequence. Restricted for vendor
612
+ permissions.
382
613
  parameters:
383
614
  - in: path
384
615
  name: sequence_id
@@ -388,7 +619,33 @@ class SequenceShotTasksResource(Resource, ArgsMixin):
388
619
  example: a24a6ea4-ce75-4665-a070-57453082c25
389
620
  responses:
390
621
  200:
391
- description: All task types related to given sequence
622
+ description: All shot tasks related to given sequence
623
+ content:
624
+ application/json:
625
+ schema:
626
+ type: array
627
+ items:
628
+ type: object
629
+ properties:
630
+ id:
631
+ type: string
632
+ format: uuid
633
+ example: a24a6ea4-ce75-4665-a070-57453082c25
634
+ name:
635
+ type: string
636
+ example: SH010 Animation
637
+ task_type_id:
638
+ type: string
639
+ format: uuid
640
+ example: b24a6ea4-ce75-4665-a070-57453082c25
641
+ entity_id:
642
+ type: string
643
+ format: uuid
644
+ example: c24a6ea4-ce75-4665-a070-57453082c25
645
+ task_status_id:
646
+ type: string
647
+ format: uuid
648
+ example: d24a6ea4-ce75-4665-a070-57453082c25
392
649
  """
393
650
  sequence = shots_service.get_sequence(sequence_id)
394
651
  user_service.check_project_access(sequence["project_id"])
@@ -405,10 +662,12 @@ class EpisodeShotTasksResource(Resource, ArgsMixin):
405
662
  @jwt_required()
406
663
  def get(self, episode_id):
407
664
  """
408
- Retrieve all shots tasks related to a given episode.
665
+ Get episode shot tasks
409
666
  ---
410
667
  tags:
411
668
  - Shots
669
+ description: Get shot tasks for an episode. Restricted for vendor
670
+ permissions.
412
671
  parameters:
413
672
  - in: path
414
673
  name: episode_id
@@ -418,7 +677,33 @@ class EpisodeShotTasksResource(Resource, ArgsMixin):
418
677
  example: a24a6ea4-ce75-4665-a070-57453082c25
419
678
  responses:
420
679
  200:
421
- description: All shots tasks related to given episode
680
+ description: All shot tasks related to given episode
681
+ content:
682
+ application/json:
683
+ schema:
684
+ type: array
685
+ items:
686
+ type: object
687
+ properties:
688
+ id:
689
+ type: string
690
+ format: uuid
691
+ example: a24a6ea4-ce75-4665-a070-57453082c25
692
+ name:
693
+ type: string
694
+ example: EP01 Layout
695
+ task_type_id:
696
+ type: string
697
+ format: uuid
698
+ example: b24a6ea4-ce75-4665-a070-57453082c25
699
+ entity_id:
700
+ type: string
701
+ format: uuid
702
+ example: c24a6ea4-ce75-4665-a070-57453082c25
703
+ task_status_id:
704
+ type: string
705
+ format: uuid
706
+ example: d24a6ea4-ce75-4665-a070-57453082c25
422
707
  """
423
708
  episode = shots_service.get_episode(episode_id)
424
709
  user_service.check_project_access(episode["project_id"])
@@ -435,10 +720,12 @@ class EpisodeAssetTasksResource(Resource, ArgsMixin):
435
720
  @jwt_required()
436
721
  def get(self, episode_id):
437
722
  """
438
- Retrieve all assets tasks related to a given episode.
723
+ Get episode asset tasks
439
724
  ---
440
725
  tags:
441
726
  - Shots
727
+ description: Get asset tasks for an episode. Restricted for vendor
728
+ permissions.
442
729
  parameters:
443
730
  - in: path
444
731
  name: episode_id
@@ -449,6 +736,32 @@ class EpisodeAssetTasksResource(Resource, ArgsMixin):
449
736
  responses:
450
737
  200:
451
738
  description: All assets tasks related to given episode
739
+ content:
740
+ application/json:
741
+ schema:
742
+ type: array
743
+ items:
744
+ type: object
745
+ properties:
746
+ id:
747
+ type: string
748
+ format: uuid
749
+ example: a24a6ea4-ce75-4665-a070-57453082c25
750
+ name:
751
+ type: string
752
+ example: Character Modeling
753
+ task_type_id:
754
+ type: string
755
+ format: uuid
756
+ example: b24a6ea4-ce75-4665-a070-57453082c25
757
+ entity_id:
758
+ type: string
759
+ format: uuid
760
+ example: c24a6ea4-ce75-4665-a070-57453082c25
761
+ task_status_id:
762
+ type: string
763
+ format: uuid
764
+ example: d24a6ea4-ce75-4665-a070-57453082c25
452
765
  """
453
766
  episode = shots_service.get_episode(episode_id)
454
767
  user_service.check_project_access(episode["project_id"])
@@ -465,10 +778,12 @@ class EpisodeShotsResource(Resource, ArgsMixin):
465
778
  @jwt_required()
466
779
  def get(self, episode_id):
467
780
  """
468
- Retrieve all shots related to a given episode.
781
+ Get episode shots
469
782
  ---
470
783
  tags:
471
784
  - Shots
785
+ description: Get shots for an episode. Supports including relations via
786
+ query params.
472
787
  parameters:
473
788
  - in: path
474
789
  name: episode_id
@@ -479,6 +794,28 @@ class EpisodeShotsResource(Resource, ArgsMixin):
479
794
  responses:
480
795
  200:
481
796
  description: All shots related to given episode
797
+ content:
798
+ application/json:
799
+ schema:
800
+ type: array
801
+ items:
802
+ type: object
803
+ properties:
804
+ id:
805
+ type: string
806
+ format: uuid
807
+ example: a24a6ea4-ce75-4665-a070-57453082c25
808
+ name:
809
+ type: string
810
+ example: SH010
811
+ project_id:
812
+ type: string
813
+ format: uuid
814
+ example: b24a6ea4-ce75-4665-a070-57453082c25
815
+ parent_id:
816
+ type: string
817
+ format: uuid
818
+ example: c24a6ea4-ce75-4665-a070-57453082c25
482
819
  """
483
820
  episode = shots_service.get_episode(episode_id)
484
821
  user_service.check_project_access(episode["project_id"])
@@ -493,12 +830,12 @@ class ShotPreviewsResource(Resource):
493
830
  @jwt_required()
494
831
  def get(self, shot_id):
495
832
  """
496
- Retrieve all previews related to a given shot.
833
+ Get shot previews
497
834
  ---
498
835
  tags:
499
836
  - Shots
500
- description: It sends them as a dict.
501
- Keys are related task type ids and values are arrays of preview for this task type.
837
+ description: Return previews for a shot as a dict keyed by task type id.
838
+ Each value is an array of previews for that task type.
502
839
  parameters:
503
840
  - in: path
504
841
  name: shot_id
@@ -508,7 +845,35 @@ class ShotPreviewsResource(Resource):
508
845
  example: a24a6ea4-ce75-4665-a070-57453082c25
509
846
  responses:
510
847
  200:
511
- description: All previews related to given episode
848
+ description: All previews related to given shot
849
+ content:
850
+ application/json:
851
+ schema:
852
+ type: object
853
+ additionalProperties:
854
+ type: array
855
+ items:
856
+ type: object
857
+ properties:
858
+ id:
859
+ type: string
860
+ format: uuid
861
+ example: b24a6ea4-ce75-4665-a070-57453082c25
862
+ revision:
863
+ type: integer
864
+ example: 3
865
+ file_id:
866
+ type: string
867
+ format: uuid
868
+ example: c24a6ea4-ce75-4665-a070-57453082c25
869
+ example:
870
+ "a24a6ea4-ce75-4665-a070-57453082c25": [
871
+ {
872
+ "id": "b24a6ea4-ce75-4665-a070-57453082c25",
873
+ "revision": 3,
874
+ "file_id": "c24a6ea4-ce75-4665-a070-57453082c25"
875
+ }
876
+ ]
512
877
  """
513
878
  shot = shots_service.get_shot(shot_id)
514
879
  user_service.check_project_access(shot["project_id"])
@@ -520,10 +885,12 @@ class SequenceTasksResource(Resource, ArgsMixin):
520
885
  @jwt_required()
521
886
  def get(self, sequence_id):
522
887
  """
523
- Retrieve all tasks related to a given shot.
888
+ Get sequence tasks
524
889
  ---
525
890
  tags:
526
891
  - Shots
892
+ description: Get tasks for a sequence. Optionally include relations using
893
+ query params.
527
894
  parameters:
528
895
  - in: path
529
896
  name: sequence_id
@@ -534,6 +901,36 @@ class SequenceTasksResource(Resource, ArgsMixin):
534
901
  responses:
535
902
  200:
536
903
  description: All tasks related to given shot
904
+ content:
905
+ application/json:
906
+ schema:
907
+ type: array
908
+ items:
909
+ type: object
910
+ properties:
911
+ id:
912
+ type: string
913
+ format: uuid
914
+ example: a24a6ea4-ce75-4665-a070-57453082c25
915
+ name:
916
+ type: string
917
+ example: SH010 Animation
918
+ task_type_id:
919
+ type: string
920
+ format: uuid
921
+ example: b24a6ea4-ce75-4665-a070-57453082c25
922
+ task_status_id:
923
+ type: string
924
+ format: uuid
925
+ example: c24a6ea4-ce75-4665-a070-57453082c25
926
+ entity_id:
927
+ type: string
928
+ format: uuid
929
+ example: d24a6ea4-ce75-4665-a070-57453082c25
930
+ project_id:
931
+ type: string
932
+ format: uuid
933
+ example: e24a6ea4-ce75-4665-a070-57453082c25
537
934
  """
538
935
  sequence = shots_service.get_sequence(sequence_id)
539
936
  user_service.check_project_access(sequence["project_id"])
@@ -547,10 +944,11 @@ class SequenceTaskTypesResource(Resource):
547
944
  @jwt_required()
548
945
  def get(self, sequence_id):
549
946
  """
550
- Retrieve all task types related to a given shot.
947
+ Get sequence task types
551
948
  ---
552
949
  tags:
553
950
  - Shots
951
+ description: Get task types for a sequence.
554
952
  parameters:
555
953
  - in: path
556
954
  name: sequence_id
@@ -561,6 +959,20 @@ class SequenceTaskTypesResource(Resource):
561
959
  responses:
562
960
  200:
563
961
  description: All task types related to given shot
962
+ content:
963
+ application/json:
964
+ schema:
965
+ type: array
966
+ items:
967
+ type: object
968
+ properties:
969
+ id:
970
+ type: string
971
+ format: uuid
972
+ example: a24a6ea4-ce75-4665-a070-57453082c25
973
+ name:
974
+ type: string
975
+ example: Animation
564
976
  """
565
977
  sequence = shots_service.get_sequence(sequence_id)
566
978
  user_service.check_project_access(sequence["project_id"])
@@ -572,10 +984,11 @@ class ShotsAndTasksResource(Resource):
572
984
  @jwt_required()
573
985
  def get(self):
574
986
  """
575
- Retrieve all shots, adds project name and asset type name and all related tasks.
987
+ Get shots and tasks
576
988
  ---
577
989
  tags:
578
990
  - Shots
991
+ description: Get shots and their related tasks. Optionally filter by project.
579
992
  parameters:
580
993
  - in: query
581
994
  name: project_id
@@ -586,6 +999,36 @@ class ShotsAndTasksResource(Resource):
586
999
  responses:
587
1000
  200:
588
1001
  description: All shots
1002
+ content:
1003
+ application/json:
1004
+ schema:
1005
+ type: array
1006
+ items:
1007
+ type: object
1008
+ properties:
1009
+ id:
1010
+ type: string
1011
+ format: uuid
1012
+ example: a24a6ea4-ce75-4665-a070-57453082c25
1013
+ name:
1014
+ type: string
1015
+ example: SH010
1016
+ project_id:
1017
+ type: string
1018
+ format: uuid
1019
+ example: b24a6ea4-ce75-4665-a070-57453082c25
1020
+ tasks:
1021
+ type: array
1022
+ items:
1023
+ type: object
1024
+ properties:
1025
+ id:
1026
+ type: string
1027
+ format: uuid
1028
+ example: c24a6ea4-ce75-4665-a070-57453082c25
1029
+ name:
1030
+ type: string
1031
+ example: SH010 Animation
589
1032
  """
590
1033
  criterions = query.get_query_criterions_from_request(request)
591
1034
  user_service.check_project_access(criterions.get("project_id", None))
@@ -604,10 +1047,11 @@ class SceneAndTasksResource(Resource):
604
1047
  @jwt_required()
605
1048
  def get(self):
606
1049
  """
607
- Retrieve all scenes, adds project name and asset type name and all related tasks.
1050
+ Get scenes and tasks
608
1051
  ---
609
1052
  tags:
610
1053
  - Shots
1054
+ description: Get scenes and their related tasks. Optionally filter by project.
611
1055
  parameters:
612
1056
  - in: query
613
1057
  name: project_id
@@ -618,6 +1062,36 @@ class SceneAndTasksResource(Resource):
618
1062
  responses:
619
1063
  200:
620
1064
  description: All scenes
1065
+ content:
1066
+ application/json:
1067
+ schema:
1068
+ type: array
1069
+ items:
1070
+ type: object
1071
+ properties:
1072
+ id:
1073
+ type: string
1074
+ format: uuid
1075
+ example: a24a6ea4-ce75-4665-a070-57453082c25
1076
+ name:
1077
+ type: string
1078
+ example: SC001
1079
+ project_id:
1080
+ type: string
1081
+ format: uuid
1082
+ example: b24a6ea4-ce75-4665-a070-57453082c25
1083
+ tasks:
1084
+ type: array
1085
+ items:
1086
+ type: object
1087
+ properties:
1088
+ id:
1089
+ type: string
1090
+ format: uuid
1091
+ example: c24a6ea4-ce75-4665-a070-57453082c25
1092
+ name:
1093
+ type: string
1094
+ example: Layout
621
1095
  """
622
1096
  criterions = query.get_query_criterions_from_request(request)
623
1097
  user_service.check_project_access(criterions.get("project_id", None))
@@ -629,10 +1103,12 @@ class SequenceAndTasksResource(Resource):
629
1103
  @jwt_required()
630
1104
  def get(self):
631
1105
  """
632
- Retrieve all sequences, adds project name and asset type name and all related tasks.
1106
+ Get sequences and tasks
633
1107
  ---
634
1108
  tags:
635
1109
  - Shots
1110
+ description: Get sequences and their related tasks.
1111
+ Optionally filter by project.
636
1112
  parameters:
637
1113
  - in: query
638
1114
  name: project_id
@@ -643,6 +1119,36 @@ class SequenceAndTasksResource(Resource):
643
1119
  responses:
644
1120
  200:
645
1121
  description: All sequences
1122
+ content:
1123
+ application/json:
1124
+ schema:
1125
+ type: array
1126
+ items:
1127
+ type: object
1128
+ properties:
1129
+ id:
1130
+ type: string
1131
+ format: uuid
1132
+ example: a24a6ea4-ce75-4665-a070-57453082c25
1133
+ name:
1134
+ type: string
1135
+ example: SQ010
1136
+ project_id:
1137
+ type: string
1138
+ format: uuid
1139
+ example: b24a6ea4-ce75-4665-a070-57453082c25
1140
+ tasks:
1141
+ type: array
1142
+ items:
1143
+ type: object
1144
+ properties:
1145
+ id:
1146
+ type: string
1147
+ format: uuid
1148
+ example: c24a6ea4-ce75-4665-a070-57453082c25
1149
+ name:
1150
+ type: string
1151
+ example: SQ010 Editing
646
1152
  """
647
1153
  criterions = query.get_query_criterions_from_request(request)
648
1154
  user_service.check_project_access(criterions.get("project_id", None))
@@ -654,10 +1160,12 @@ class EpisodeAndTasksResource(Resource):
654
1160
  @jwt_required()
655
1161
  def get(self):
656
1162
  """
657
- Retrieve all episodes, adds project name and asset type name and all related tasks.
1163
+ Get episodes and tasks
658
1164
  ---
659
1165
  tags:
660
1166
  - Shots
1167
+ description: Get episodes and their related tasks.
1168
+ Optionally filter by project.
661
1169
  parameters:
662
1170
  - in: query
663
1171
  name: project_id
@@ -668,6 +1176,36 @@ class EpisodeAndTasksResource(Resource):
668
1176
  responses:
669
1177
  200:
670
1178
  description: All episodes
1179
+ content:
1180
+ application/json:
1181
+ schema:
1182
+ type: array
1183
+ items:
1184
+ type: object
1185
+ properties:
1186
+ id:
1187
+ type: string
1188
+ format: uuid
1189
+ example: a24a6ea4-ce75-4665-a070-57453082c25
1190
+ name:
1191
+ type: string
1192
+ example: EP01
1193
+ project_id:
1194
+ type: string
1195
+ format: uuid
1196
+ example: b24a6ea4-ce75-4665-a070-57453082c25
1197
+ tasks:
1198
+ type: array
1199
+ items:
1200
+ type: object
1201
+ properties:
1202
+ id:
1203
+ type: string
1204
+ format: uuid
1205
+ example: c24a6ea4-ce75-4665-a070-57453082c25
1206
+ name:
1207
+ type: string
1208
+ example: EP01 Layout
671
1209
  """
672
1210
  criterions = query.get_query_criterions_from_request(request)
673
1211
  user_service.check_project_access(criterions.get("project_id", None))
@@ -679,10 +1217,12 @@ class ProjectShotsResource(Resource, ArgsMixin):
679
1217
  @jwt_required()
680
1218
  def get(self, project_id):
681
1219
  """
682
- Retrieve all shots related to a given project.
1220
+ Get project shots
683
1221
  ---
684
1222
  tags:
685
1223
  - Shots
1224
+ description: Get shots for a project. May limit to assigned shots for
1225
+ vendor users.
686
1226
  parameters:
687
1227
  - in: path
688
1228
  name: project_id
@@ -693,6 +1233,28 @@ class ProjectShotsResource(Resource, ArgsMixin):
693
1233
  responses:
694
1234
  200:
695
1235
  description: All shots related to given project
1236
+ content:
1237
+ application/json:
1238
+ schema:
1239
+ type: array
1240
+ items:
1241
+ type: object
1242
+ properties:
1243
+ id:
1244
+ type: string
1245
+ format: uuid
1246
+ example: a24a6ea4-ce75-4665-a070-57453082c25
1247
+ name:
1248
+ type: string
1249
+ example: SH010
1250
+ project_id:
1251
+ type: string
1252
+ format: uuid
1253
+ example: b24a6ea4-ce75-4665-a070-57453082c25
1254
+ parent_id:
1255
+ type: string
1256
+ format: uuid
1257
+ example: c24a6ea4-ce75-4665-a070-57453082c25
696
1258
  """
697
1259
  projects_service.get_project(project_id)
698
1260
  user_service.check_project_access(project_id)
@@ -703,10 +1265,12 @@ class ProjectShotsResource(Resource, ArgsMixin):
703
1265
  @jwt_required()
704
1266
  def post(self, project_id):
705
1267
  """
706
- Create a shot for given project.
1268
+ Create project shot
707
1269
  ---
708
1270
  tags:
709
1271
  - Shots
1272
+ description: Create a shot in a project. Provide name and optional
1273
+ fields like description, sequence_id and nb_frames.
710
1274
  parameters:
711
1275
  - in: path
712
1276
  name: project_id
@@ -726,11 +1290,11 @@ class ProjectShotsResource(Resource, ArgsMixin):
726
1290
  name:
727
1291
  type: string
728
1292
  required: true
729
- example: "Name of shot"
1293
+ example: SH010
730
1294
  description:
731
1295
  type: string
732
1296
  required: false
733
- example: "Description of shot"
1297
+ example: A short description of the shot
734
1298
  sequence_id:
735
1299
  type: string
736
1300
  format: uuid
@@ -742,7 +1306,33 @@ class ProjectShotsResource(Resource, ArgsMixin):
742
1306
  example: 24
743
1307
  responses:
744
1308
  201:
745
- description: Shot created for given project
1309
+ description: Shot created
1310
+ content:
1311
+ application/json:
1312
+ schema:
1313
+ type: object
1314
+ properties:
1315
+ id:
1316
+ type: string
1317
+ format: uuid
1318
+ example: a24a6ea4-ce75-4665-a070-57453082c25
1319
+ name:
1320
+ type: string
1321
+ example: SH010
1322
+ project_id:
1323
+ type: string
1324
+ format: uuid
1325
+ example: b24a6ea4-ce75-4665-a070-57453082c25
1326
+ sequence_id:
1327
+ type: string
1328
+ format: uuid
1329
+ example: c24a6ea4-ce75-4665-a070-57453082c25
1330
+ nb_frames:
1331
+ type: integer
1332
+ example: 24
1333
+ description:
1334
+ type: string
1335
+ example: A short description of the shot
746
1336
  """
747
1337
  (
748
1338
  sequence_id,
@@ -789,10 +1379,12 @@ class ProjectSequencesResource(Resource, ArgsMixin):
789
1379
  @jwt_required()
790
1380
  def get(self, project_id):
791
1381
  """
792
- Retrieve all sequences related to a given project.
1382
+ Get project sequences
793
1383
  ---
794
1384
  tags:
795
1385
  - Shots
1386
+ description: Get sequences for a project. May limit to assigned items for
1387
+ vendor users.
796
1388
  parameters:
797
1389
  - in: path
798
1390
  name: project_id
@@ -803,6 +1395,28 @@ class ProjectSequencesResource(Resource, ArgsMixin):
803
1395
  responses:
804
1396
  200:
805
1397
  description: All sequences related to given project
1398
+ content:
1399
+ application/json:
1400
+ schema:
1401
+ type: array
1402
+ items:
1403
+ type: object
1404
+ properties:
1405
+ id:
1406
+ type: string
1407
+ format: uuid
1408
+ example: a24a6ea4-ce75-4665-a070-57453082c25
1409
+ name:
1410
+ type: string
1411
+ example: SQ01
1412
+ project_id:
1413
+ type: string
1414
+ format: uuid
1415
+ example: b24a6ea4-ce75-4665-a070-57453082c25
1416
+ episode_id:
1417
+ type: string
1418
+ format: uuid
1419
+ example: c24a6ea4-ce75-4665-a070-57453082c25
806
1420
  """
807
1421
  projects_service.get_project(project_id)
808
1422
  user_service.check_project_access(project_id)
@@ -813,10 +1427,12 @@ class ProjectSequencesResource(Resource, ArgsMixin):
813
1427
  @jwt_required()
814
1428
  def post(self, project_id):
815
1429
  """
816
- Create a sequence for given project.
1430
+ Create project sequence
817
1431
  ---
818
1432
  tags:
819
1433
  - Shots
1434
+ description: Create a sequence in a project. Provide name and optional
1435
+ episode_id.
820
1436
  parameters:
821
1437
  - in: path
822
1438
  name: project_id
@@ -836,7 +1452,7 @@ class ProjectSequencesResource(Resource, ArgsMixin):
836
1452
  name:
837
1453
  type: string
838
1454
  required: true
839
- example: "Name of sequence"
1455
+ example: SQ01
840
1456
  episode_id:
841
1457
  type: string
842
1458
  format: uuid
@@ -844,7 +1460,30 @@ class ProjectSequencesResource(Resource, ArgsMixin):
844
1460
  example: a24a6ea4-ce75-4665-a070-57453082c25
845
1461
  responses:
846
1462
  201:
847
- description: Sequence created for given project
1463
+ description: Sequence created
1464
+ content:
1465
+ application/json:
1466
+ schema:
1467
+ type: object
1468
+ properties:
1469
+ id:
1470
+ type: string
1471
+ format: uuid
1472
+ example: a24a6ea4-ce75-4665-a070-57453082c25
1473
+ name:
1474
+ type: string
1475
+ example: SQ01
1476
+ project_id:
1477
+ type: string
1478
+ format: uuid
1479
+ example: b24a6ea4-ce75-4665-a070-57453082c25
1480
+ episode_id:
1481
+ type: string
1482
+ format: uuid
1483
+ example: c24a6ea4-ce75-4665-a070-57453082c25
1484
+ description:
1485
+ type: string
1486
+ example: A sequence description
848
1487
  """
849
1488
  (episode_id, name, description, data) = self.get_arguments()
850
1489
  projects_service.get_project(project_id)
@@ -881,10 +1520,12 @@ class ProjectEpisodesResource(Resource, ArgsMixin):
881
1520
  @jwt_required()
882
1521
  def get(self, project_id):
883
1522
  """
884
- Retrieve all episodes related to a given project.
1523
+ Get project episodes
885
1524
  ---
886
1525
  tags:
887
1526
  - Shots
1527
+ description: Get episodes for a project. May limit to assigned items for
1528
+ vendor users.
888
1529
  parameters:
889
1530
  - in: path
890
1531
  name: project_id
@@ -895,6 +1536,30 @@ class ProjectEpisodesResource(Resource, ArgsMixin):
895
1536
  responses:
896
1537
  200:
897
1538
  description: All episodes related to given project
1539
+ content:
1540
+ application/json:
1541
+ schema:
1542
+ type: array
1543
+ items:
1544
+ type: object
1545
+ properties:
1546
+ id:
1547
+ type: string
1548
+ format: uuid
1549
+ example: a24a6ea4-ce75-4665-a070-57453082c25
1550
+ name:
1551
+ type: string
1552
+ example: EP01
1553
+ project_id:
1554
+ type: string
1555
+ format: uuid
1556
+ example: b24a6ea4-ce75-4665-a070-57453082c25
1557
+ description:
1558
+ type: string
1559
+ example: A short description of the episode
1560
+ status:
1561
+ type: string
1562
+ example: running
898
1563
  """
899
1564
  projects_service.get_project(project_id)
900
1565
  user_service.check_project_access(project_id)
@@ -905,10 +1570,12 @@ class ProjectEpisodesResource(Resource, ArgsMixin):
905
1570
  @jwt_required()
906
1571
  def post(self, project_id):
907
1572
  """
908
- Create an episode for given project.
1573
+ Create project episode
909
1574
  ---
910
1575
  tags:
911
1576
  - Shots
1577
+ description: Create an episode in a project. Provide name and
1578
+ description. Status is optional.
912
1579
  parameters:
913
1580
  - in: path
914
1581
  name: project_id
@@ -929,14 +1596,40 @@ class ProjectEpisodesResource(Resource, ArgsMixin):
929
1596
  name:
930
1597
  type: string
931
1598
  required: true
932
- example: "Name of the episode"
1599
+ example: EP01
933
1600
  description:
934
1601
  type: string
935
1602
  required: true
936
- example: "Description of the episode"
1603
+ example: A short description of the episode
1604
+ status:
1605
+ type: string
1606
+ required: false
1607
+ example: running
937
1608
  responses:
938
1609
  201:
939
- description: Episode created for given project
1610
+ description: Episode created
1611
+ content:
1612
+ application/json:
1613
+ schema:
1614
+ type: object
1615
+ properties:
1616
+ id:
1617
+ type: string
1618
+ format: uuid
1619
+ example: a24a6ea4-ce75-4665-a070-57453082c25
1620
+ name:
1621
+ type: string
1622
+ example: EP01
1623
+ project_id:
1624
+ type: string
1625
+ format: uuid
1626
+ example: b24a6ea4-ce75-4665-a070-57453082c25
1627
+ description:
1628
+ type: string
1629
+ example: A short description of the episode
1630
+ status:
1631
+ type: string
1632
+ example: running
940
1633
  """
941
1634
  name, status, description, data = self.get_arguments()
942
1635
  projects_service.get_project(project_id)
@@ -970,10 +1663,12 @@ class ProjectEpisodeStatsResource(Resource):
970
1663
  @jwt_required()
971
1664
  def get(self, project_id):
972
1665
  """
973
- Retrieve number of tasks by status, task_types and episodes for given project.
1666
+ Get episode stats
974
1667
  ---
975
1668
  tags:
976
1669
  - Shots
1670
+ description: Return number of tasks by status, task type and episode
1671
+ for the project.
977
1672
  parameters:
978
1673
  - in: path
979
1674
  name: project_id
@@ -984,6 +1679,43 @@ class ProjectEpisodeStatsResource(Resource):
984
1679
  responses:
985
1680
  200:
986
1681
  description: Number of tasks by status, task types and episodes for given project
1682
+ content:
1683
+ application/json:
1684
+ schema:
1685
+ type: object
1686
+ additionalProperties:
1687
+ type: object
1688
+ additionalProperties:
1689
+ type: object
1690
+ additionalProperties:
1691
+ type: object
1692
+ properties:
1693
+ count:
1694
+ type: integer
1695
+ example: 120
1696
+ frames:
1697
+ type: integer
1698
+ example: 1440
1699
+ drawings:
1700
+ type: integer
1701
+ example: 360
1702
+ example:
1703
+ episodeId1:
1704
+ taskTypeId1:
1705
+ taskStatusId1:
1706
+ count: 50
1707
+ frames: 600
1708
+ drawings: 150
1709
+ taskStatusId2:
1710
+ count: 70
1711
+ frames: 840
1712
+ drawings: 210
1713
+ all:
1714
+ all:
1715
+ taskStatusId1:
1716
+ count: 200
1717
+ frames: 2400
1718
+ drawings: 600
987
1719
  """
988
1720
  projects_service.get_project(project_id)
989
1721
  user_service.check_project_access(project_id)
@@ -996,10 +1728,12 @@ class ProjectEpisodeRetakeStatsResource(Resource):
996
1728
  @jwt_required()
997
1729
  def get(self, project_id):
998
1730
  """
999
- Retrieve number of tasks by status, task_types and episodes for given project.
1731
+ Get episode retake stats
1000
1732
  ---
1001
1733
  tags:
1002
1734
  - Shots
1735
+ description: Return retake and done counts by task type and episode.
1736
+ Includes evolution data and max retake count.
1003
1737
  parameters:
1004
1738
  - in: path
1005
1739
  name: project_id
@@ -1010,6 +1744,121 @@ class ProjectEpisodeRetakeStatsResource(Resource):
1010
1744
  responses:
1011
1745
  200:
1012
1746
  description: Number of tasks by status, task types and episodes for given project
1747
+ content:
1748
+ application/json:
1749
+ schema:
1750
+ type: object
1751
+ additionalProperties:
1752
+ type: object
1753
+ properties:
1754
+ max_retake_count:
1755
+ type: integer
1756
+ example: 4
1757
+ evolution:
1758
+ type: object
1759
+ additionalProperties:
1760
+ type: object
1761
+ properties:
1762
+ retake:
1763
+ type: object
1764
+ properties:
1765
+ count:
1766
+ type: integer
1767
+ example: 80
1768
+ frames:
1769
+ type: integer
1770
+ example: 7900
1771
+ drawings:
1772
+ type: integer
1773
+ example: 8000
1774
+ done:
1775
+ type: object
1776
+ properties:
1777
+ count:
1778
+ type: integer
1779
+ example: 117
1780
+ frames:
1781
+ type: integer
1782
+ example: 3900
1783
+ drawings:
1784
+ type: integer
1785
+ example: 8000
1786
+ done:
1787
+ type: object
1788
+ properties:
1789
+ count:
1790
+ type: integer
1791
+ example: 197
1792
+ frames:
1793
+ type: integer
1794
+ example: 16090
1795
+ drawings:
1796
+ type: integer
1797
+ example: 16090
1798
+ retake:
1799
+ type: object
1800
+ properties:
1801
+ count:
1802
+ type: integer
1803
+ example: 0
1804
+ frames:
1805
+ type: integer
1806
+ example: 0
1807
+ drawings:
1808
+ type: integer
1809
+ example: 0
1810
+ other:
1811
+ type: object
1812
+ properties:
1813
+ count:
1814
+ type: integer
1815
+ example: 5
1816
+ frames:
1817
+ type: integer
1818
+ example: 185
1819
+ drawings:
1820
+ type: integer
1821
+ example: 185
1822
+ example:
1823
+ episodeId1:
1824
+ max_retake_count: 4
1825
+ evolution:
1826
+ "1":
1827
+ retake:
1828
+ count: 80
1829
+ frames: 7900
1830
+ drawings: 8000
1831
+ done:
1832
+ count: 117
1833
+ frames: 3900
1834
+ drawings: 8000
1835
+ done:
1836
+ count: 197
1837
+ frames: 16090
1838
+ drawings: 16090
1839
+ retake:
1840
+ count: 0
1841
+ frames: 0
1842
+ drawings: 0
1843
+ other:
1844
+ count: 5
1845
+ frames: 185
1846
+ drawings: 185
1847
+ all:
1848
+ all:
1849
+ max_retake_count: 4
1850
+ done:
1851
+ count: 500
1852
+ frames: 50000
1853
+ drawings: 50000
1854
+ retake:
1855
+ count: 100
1856
+ frames: 10000
1857
+ drawings: 10000
1858
+ other:
1859
+ count: 10
1860
+ frames: 1000
1861
+ drawings: 1000
1013
1862
  """
1014
1863
  projects_service.get_project(project_id)
1015
1864
  user_service.check_project_access(project_id)
@@ -1022,10 +1871,12 @@ class EpisodeResource(Resource, ArgsMixin):
1022
1871
  @jwt_required()
1023
1872
  def get(self, episode_id):
1024
1873
  """
1025
- Retrieve given episode.
1874
+ Get episode
1026
1875
  ---
1027
1876
  tags:
1028
1877
  - Shots
1878
+ description: Get an episode by id.
1879
+ needs.
1029
1880
  parameters:
1030
1881
  - in: path
1031
1882
  name: episode_id
@@ -1035,7 +1886,29 @@ class EpisodeResource(Resource, ArgsMixin):
1035
1886
  example: a24a6ea4-ce75-4665-a070-57453082c25
1036
1887
  responses:
1037
1888
  200:
1038
- description: Given episode
1889
+ description: Episode found and returned
1890
+ content:
1891
+ application/json:
1892
+ schema:
1893
+ type: object
1894
+ properties:
1895
+ id:
1896
+ type: string
1897
+ format: uuid
1898
+ example: a24a6ea4-ce75-4665-a070-57453082c25
1899
+ name:
1900
+ type: string
1901
+ example: EP01
1902
+ project_id:
1903
+ type: string
1904
+ format: uuid
1905
+ example: b24a6ea4-ce75-4665-a070-57453082c25
1906
+ description:
1907
+ type: string
1908
+ example: A short description of the episode
1909
+ status:
1910
+ type: string
1911
+ example: running
1039
1912
  """
1040
1913
  episode = shots_service.get_full_episode(episode_id)
1041
1914
  user_service.check_project_access(episode["project_id"])
@@ -1044,10 +1917,12 @@ class EpisodeResource(Resource, ArgsMixin):
1044
1917
  @jwt_required()
1045
1918
  def delete(self, episode_id):
1046
1919
  """
1047
- Delete given episode.
1920
+ Delete episode
1048
1921
  ---
1049
1922
  tags:
1050
1923
  - Shots
1924
+ description: Delete an episode by id. Requires manager access or
1925
+ ownership.
1051
1926
  parameters:
1052
1927
  - in: path
1053
1928
  name: episode_id
@@ -1057,7 +1932,7 @@ class EpisodeResource(Resource, ArgsMixin):
1057
1932
  example: a24a6ea4-ce75-4665-a070-57453082c25
1058
1933
  responses:
1059
1934
  204:
1060
- description: Given episode deleted
1935
+ description: Episode deleted
1061
1936
  """
1062
1937
  force = self.get_force()
1063
1938
  episode = shots_service.get_episode(episode_id)
@@ -1073,11 +1948,12 @@ class EpisodesResource(Resource):
1073
1948
  @jwt_required()
1074
1949
  def get(self):
1075
1950
  """
1076
- Retrieve all episode entries.
1951
+ Get episodes
1077
1952
  ---
1078
1953
  tags:
1079
1954
  - Shots
1080
- description: Filters can be specified in the query string.
1955
+ description: Get episodes with optional filters. Use project_id to
1956
+ filter by project.
1081
1957
  parameters:
1082
1958
  - in: query
1083
1959
  name: project_id
@@ -1088,6 +1964,30 @@ class EpisodesResource(Resource):
1088
1964
  responses:
1089
1965
  200:
1090
1966
  description: All episode entries
1967
+ content:
1968
+ application/json:
1969
+ schema:
1970
+ type: array
1971
+ items:
1972
+ type: object
1973
+ properties:
1974
+ id:
1975
+ type: string
1976
+ format: uuid
1977
+ example: a24a6ea4-ce75-4665-a070-57453082c25
1978
+ name:
1979
+ type: string
1980
+ example: EP01
1981
+ project_id:
1982
+ type: string
1983
+ format: uuid
1984
+ example: b24a6ea4-ce75-4665-a070-57453082c25
1985
+ description:
1986
+ type: string
1987
+ example: A short description of the episode
1988
+ status:
1989
+ type: string
1990
+ example: running
1091
1991
  """
1092
1992
  criterions = query.get_query_criterions_from_request(request)
1093
1993
  user_service.check_project_access(criterions.get("project_id", None))
@@ -1098,11 +1998,12 @@ class EpisodeSequencesResource(Resource):
1098
1998
  @jwt_required()
1099
1999
  def get(self, episode_id):
1100
2000
  """
1101
- Retrieve all sequence entries for a given episode.
2001
+ Get episode sequences
1102
2002
  ---
1103
2003
  tags:
1104
2004
  - Shots
1105
- description: Filters can be specified in the query string.
2005
+ description: Get sequences for an episode. You can add query filters
2006
+ if needed.
1106
2007
  parameters:
1107
2008
  - in: path
1108
2009
  name: episode_id
@@ -1119,6 +2020,28 @@ class EpisodeSequencesResource(Resource):
1119
2020
  responses:
1120
2021
  200:
1121
2022
  description: All sequence entries for given episode
2023
+ content:
2024
+ application/json:
2025
+ schema:
2026
+ type: array
2027
+ items:
2028
+ type: object
2029
+ properties:
2030
+ id:
2031
+ type: string
2032
+ format: uuid
2033
+ example: a24a6ea4-ce75-4665-a070-57453082c25
2034
+ name:
2035
+ type: string
2036
+ example: SQ01
2037
+ project_id:
2038
+ type: string
2039
+ format: uuid
2040
+ example: b24a6ea4-ce75-4665-a070-57453082c25
2041
+ parent_id:
2042
+ type: string
2043
+ format: uuid
2044
+ example: c24a6ea4-ce75-4665-a070-57453082c25
1122
2045
  """
1123
2046
  if not fields.is_valid_id(episode_id):
1124
2047
  return []
@@ -1138,7 +2061,7 @@ class EpisodeTaskTypesResource(Resource):
1138
2061
  @jwt_required()
1139
2062
  def get(self, episode_id):
1140
2063
  """
1141
- Retrieve all task types related to a given episode.
2064
+ Get episode task types
1142
2065
  ---
1143
2066
  tags:
1144
2067
  - Shots
@@ -1152,6 +2075,20 @@ class EpisodeTaskTypesResource(Resource):
1152
2075
  responses:
1153
2076
  200:
1154
2077
  description: All task types related to given episode
2078
+ content:
2079
+ application/json:
2080
+ schema:
2081
+ type: array
2082
+ items:
2083
+ type: object
2084
+ properties:
2085
+ id:
2086
+ type: string
2087
+ format: uuid
2088
+ example: a24a6ea4-ce75-4665-a070-57453082c25
2089
+ name:
2090
+ type: string
2091
+ example: Animation
1155
2092
  """
1156
2093
  episode = shots_service.get_episode(episode_id)
1157
2094
  user_service.check_project_access(episode["project_id"])
@@ -1162,7 +2099,7 @@ class EpisodeTasksResource(Resource):
1162
2099
  @jwt_required()
1163
2100
  def get(self, episode_id):
1164
2101
  """
1165
- Retrieve all tasks related to a given episode.
2102
+ Get episode tasks
1166
2103
  ---
1167
2104
  tags:
1168
2105
  - Shots
@@ -1176,6 +2113,42 @@ class EpisodeTasksResource(Resource):
1176
2113
  responses:
1177
2114
  200:
1178
2115
  description: All tasks related to given episode
2116
+ content:
2117
+ application/json:
2118
+ schema:
2119
+ type: array
2120
+ items:
2121
+ type: object
2122
+ properties:
2123
+ id:
2124
+ type: string
2125
+ format: uuid
2126
+ example: a24a6ea4-ce75-4665-a070-57453082c25
2127
+ name:
2128
+ type: string
2129
+ example: EP01 Layout
2130
+ task_type_id:
2131
+ type: string
2132
+ format: uuid
2133
+ example: b24a6ea4-ce75-4665-a070-57453082c25
2134
+ task_status_id:
2135
+ type: string
2136
+ format: uuid
2137
+ example: c24a6ea4-ce75-4665-a070-57453082c25
2138
+ entity_id:
2139
+ type: string
2140
+ format: uuid
2141
+ example: d24a6ea4-ce75-4665-a070-57453082c25
2142
+ project_id:
2143
+ type: string
2144
+ format: uuid
2145
+ example: e24a6ea4-ce75-4665-a070-57453082c25
2146
+ assignees:
2147
+ type: array
2148
+ items:
2149
+ type: string
2150
+ format: uuid
2151
+ example: ["f24a6ea4-ce75-4665-a070-57453082c25"]
1179
2152
  """
1180
2153
  episode = shots_service.get_episode(episode_id)
1181
2154
  user_service.check_project_access(episode["project_id"])
@@ -1186,10 +2159,11 @@ class SequenceResource(Resource, ArgsMixin):
1186
2159
  @jwt_required()
1187
2160
  def get(self, sequence_id):
1188
2161
  """
1189
- Retrieve given sequence.
2162
+ Get sequence
1190
2163
  ---
1191
2164
  tags:
1192
2165
  - Shots
2166
+ description: Get a sequence by id.
1193
2167
  parameters:
1194
2168
  - in: path
1195
2169
  name: sequence_id
@@ -1199,7 +2173,27 @@ class SequenceResource(Resource, ArgsMixin):
1199
2173
  example: a24a6ea4-ce75-4665-a070-57453082c25
1200
2174
  responses:
1201
2175
  200:
1202
- description: Given sequence
2176
+ description: Sequence found and returned
2177
+ content:
2178
+ application/json:
2179
+ schema:
2180
+ type: object
2181
+ properties:
2182
+ id:
2183
+ type: string
2184
+ format: uuid
2185
+ example: a24a6ea4-ce75-4665-a070-57453082c25
2186
+ name:
2187
+ type: string
2188
+ example: SQ01
2189
+ project_id:
2190
+ type: string
2191
+ format: uuid
2192
+ example: b24a6ea4-ce75-4665-a070-57453082c25
2193
+ parent_id:
2194
+ type: string
2195
+ format: uuid
2196
+ example: c24a6ea4-ce75-4665-a070-57453082c25
1203
2197
  """
1204
2198
  sequence = shots_service.get_full_sequence(sequence_id)
1205
2199
  user_service.check_project_access(sequence["project_id"])
@@ -1208,10 +2202,12 @@ class SequenceResource(Resource, ArgsMixin):
1208
2202
  @jwt_required()
1209
2203
  def delete(self, sequence_id):
1210
2204
  """
1211
- Delete given sequence.
2205
+ Delete sequence
1212
2206
  ---
1213
2207
  tags:
1214
2208
  - Shots
2209
+ description: Delete a sequence by id. Requires manager access or
2210
+ ownership.
1215
2211
  parameters:
1216
2212
  - in: path
1217
2213
  name: sequence_id
@@ -1221,7 +2217,7 @@ class SequenceResource(Resource, ArgsMixin):
1221
2217
  example: a24a6ea4-ce75-4665-a070-57453082c25
1222
2218
  responses:
1223
2219
  204:
1224
- description: Given sequence deleted
2220
+ description: Sequence deleted
1225
2221
  """
1226
2222
  force = self.get_force()
1227
2223
  sequence = shots_service.get_sequence(sequence_id)
@@ -1237,11 +2233,12 @@ class SequencesResource(Resource):
1237
2233
  @jwt_required()
1238
2234
  def get(self):
1239
2235
  """
1240
- Retrieve all sequence entries.
2236
+ Get sequences
1241
2237
  ---
1242
2238
  tags:
1243
2239
  - Shots
1244
- description: Filters can be specified in the query string.
2240
+ description: Get sequences with optional filters. Use episode_id to
2241
+ filter by episode.
1245
2242
  parameters:
1246
2243
  - in: query
1247
2244
  name: episode_id
@@ -1252,6 +2249,28 @@ class SequencesResource(Resource):
1252
2249
  responses:
1253
2250
  200:
1254
2251
  description: All sequence entries
2252
+ content:
2253
+ application/json:
2254
+ schema:
2255
+ type: array
2256
+ items:
2257
+ type: object
2258
+ properties:
2259
+ id:
2260
+ type: string
2261
+ format: uuid
2262
+ example: a24a6ea4-ce75-4665-a070-57453082c25
2263
+ name:
2264
+ type: string
2265
+ example: SQ01
2266
+ project_id:
2267
+ type: string
2268
+ format: uuid
2269
+ example: b24a6ea4-ce75-4665-a070-57453082c25
2270
+ parent_id:
2271
+ type: string
2272
+ format: uuid
2273
+ example: c24a6ea4-ce75-4665-a070-57453082c25
1255
2274
  """
1256
2275
  criterions = query.get_query_criterions_from_request(request)
1257
2276
  if "episode_id" in criterions:
@@ -1267,11 +2286,12 @@ class SequenceShotsResource(Resource):
1267
2286
  @jwt_required()
1268
2287
  def get(self, sequence_id):
1269
2288
  """
1270
- Retrieve all shot entries for a given sequence.
2289
+ Get sequence shots
1271
2290
  ---
1272
2291
  tags:
1273
2292
  - Shots
1274
- description: Filters can be specified in the query string.
2293
+ description: Get shots for a sequence. Supports filtering using query
2294
+ params.
1275
2295
  parameters:
1276
2296
  - in: path
1277
2297
  name: sequence_id
@@ -1288,6 +2308,28 @@ class SequenceShotsResource(Resource):
1288
2308
  responses:
1289
2309
  200:
1290
2310
  description: All shot entries for given sequence
2311
+ content:
2312
+ application/json:
2313
+ schema:
2314
+ type: array
2315
+ items:
2316
+ type: object
2317
+ properties:
2318
+ id:
2319
+ type: string
2320
+ format: uuid
2321
+ example: a24a6ea4-ce75-4665-a070-57453082c25
2322
+ name:
2323
+ type: string
2324
+ example: SH010
2325
+ project_id:
2326
+ type: string
2327
+ format: uuid
2328
+ example: b24a6ea4-ce75-4665-a070-57453082c25
2329
+ parent_id:
2330
+ type: string
2331
+ format: uuid
2332
+ example: c24a6ea4-ce75-4665-a070-57453082c25
1291
2333
  """
1292
2334
  sequence = shots_service.get_sequence(sequence_id)
1293
2335
  user_service.check_project_access(sequence["project_id"])
@@ -1304,10 +2346,11 @@ class ProjectScenesResource(Resource, ArgsMixin):
1304
2346
  @jwt_required()
1305
2347
  def get(self, project_id):
1306
2348
  """
1307
- Retrieve all scenes related to a given project.
2349
+ Get project scenes
1308
2350
  ---
1309
2351
  tags:
1310
2352
  - Shots
2353
+ description: Get all scenes for a project.
1311
2354
  parameters:
1312
2355
  - in: path
1313
2356
  name: project_id
@@ -1318,6 +2361,28 @@ class ProjectScenesResource(Resource, ArgsMixin):
1318
2361
  responses:
1319
2362
  200:
1320
2363
  description: All scenes related to given project
2364
+ content:
2365
+ application/json:
2366
+ schema:
2367
+ type: array
2368
+ items:
2369
+ type: object
2370
+ properties:
2371
+ id:
2372
+ type: string
2373
+ format: uuid
2374
+ example: a24a6ea4-ce75-4665-a070-57453082c25
2375
+ name:
2376
+ type: string
2377
+ example: SC001
2378
+ project_id:
2379
+ type: string
2380
+ format: uuid
2381
+ example: b24a6ea4-ce75-4665-a070-57453082c25
2382
+ parent_id:
2383
+ type: string
2384
+ format: uuid
2385
+ example: c24a6ea4-ce75-4665-a070-57453082c25
1321
2386
  """
1322
2387
  projects_service.get_project(project_id)
1323
2388
  user_service.check_project_access(project_id)
@@ -1326,10 +2391,12 @@ class ProjectScenesResource(Resource, ArgsMixin):
1326
2391
  @jwt_required()
1327
2392
  def post(self, project_id):
1328
2393
  """
1329
- Create a scene for given project.
2394
+ Create project scene
1330
2395
  ---
1331
2396
  tags:
1332
2397
  - Shots
2398
+ description: Create a new scene in a project. Provide a name and the
2399
+ related sequence id.
1333
2400
  parameters:
1334
2401
  - in: path
1335
2402
  name: project_id
@@ -1359,6 +2426,26 @@ class ProjectScenesResource(Resource, ArgsMixin):
1359
2426
  responses:
1360
2427
  201:
1361
2428
  description: Scene created for given project
2429
+ content:
2430
+ application/json:
2431
+ schema:
2432
+ type: object
2433
+ properties:
2434
+ id:
2435
+ type: string
2436
+ format: uuid
2437
+ example: a24a6ea4-ce75-4665-a070-57453082c25
2438
+ name:
2439
+ type: string
2440
+ example: SC001
2441
+ project_id:
2442
+ type: string
2443
+ format: uuid
2444
+ example: b24a6ea4-ce75-4665-a070-57453082c25
2445
+ parent_id:
2446
+ type: string
2447
+ format: uuid
2448
+ example: c24a6ea4-ce75-4665-a070-57453082c25
1362
2449
  """
1363
2450
  (sequence_id, name) = self.get_arguments()
1364
2451
  projects_service.get_project(project_id)
@@ -1383,10 +2470,11 @@ class SequenceScenesResource(Resource):
1383
2470
  @jwt_required()
1384
2471
  def get(self, sequence_id):
1385
2472
  """
1386
- Retrieve all scenes related to a given sequence.
2473
+ Get sequence scenes
1387
2474
  ---
1388
2475
  tags:
1389
2476
  - Shots
2477
+ description: Get scenes that belong to a sequence.
1390
2478
  parameters:
1391
2479
  - in: path
1392
2480
  name: sequence_id
@@ -1397,6 +2485,28 @@ class SequenceScenesResource(Resource):
1397
2485
  responses:
1398
2486
  200:
1399
2487
  description: All scenes related to given sequence
2488
+ content:
2489
+ application/json:
2490
+ schema:
2491
+ type: array
2492
+ items:
2493
+ type: object
2494
+ properties:
2495
+ id:
2496
+ type: string
2497
+ format: uuid
2498
+ example: a24a6ea4-ce75-4665-a070-57453082c25
2499
+ name:
2500
+ type: string
2501
+ example: SC010
2502
+ project_id:
2503
+ type: string
2504
+ format: uuid
2505
+ example: b24a6ea4-ce75-4665-a070-57453082c25
2506
+ parent_id:
2507
+ type: string
2508
+ format: uuid
2509
+ example: c24a6ea4-ce75-4665-a070-57453082c25
1400
2510
  """
1401
2511
  sequence = shots_service.get_sequence(sequence_id)
1402
2512
  user_service.check_project_access(sequence["project_id"])
@@ -1407,10 +2517,11 @@ class SceneTaskTypesResource(Resource):
1407
2517
  @jwt_required()
1408
2518
  def get(self, scene_id):
1409
2519
  """
1410
- Retrieve all task types related to a given scene.
2520
+ Get scene task types
1411
2521
  ---
1412
2522
  tags:
1413
2523
  - Shots
2524
+ description: Get task types for a scene.
1414
2525
  parameters:
1415
2526
  - in: path
1416
2527
  name: scene_id
@@ -1421,6 +2532,20 @@ class SceneTaskTypesResource(Resource):
1421
2532
  responses:
1422
2533
  200:
1423
2534
  description: All task types related to given scene
2535
+ content:
2536
+ application/json:
2537
+ schema:
2538
+ type: array
2539
+ items:
2540
+ type: object
2541
+ properties:
2542
+ id:
2543
+ type: string
2544
+ format: uuid
2545
+ example: a24a6ea4-ce75-4665-a070-57453082c25
2546
+ name:
2547
+ type: string
2548
+ example: Animation
1424
2549
  """
1425
2550
  scene = shots_service.get_scene(scene_id)
1426
2551
  user_service.check_project_access(scene["project_id"])
@@ -1432,10 +2557,11 @@ class SceneTasksResource(Resource):
1432
2557
  @jwt_required()
1433
2558
  def get(self, scene_id):
1434
2559
  """
1435
- Retrieve all tasks related to a given scene.
2560
+ Get scene tasks
1436
2561
  ---
1437
2562
  tags:
1438
2563
  - Shots
2564
+ description: Get tasks for a scene.
1439
2565
  parameters:
1440
2566
  - in: path
1441
2567
  name: scene_id
@@ -1446,6 +2572,36 @@ class SceneTasksResource(Resource):
1446
2572
  responses:
1447
2573
  200:
1448
2574
  description: All tasks related to given scene
2575
+ content:
2576
+ application/json:
2577
+ schema:
2578
+ type: array
2579
+ items:
2580
+ type: object
2581
+ properties:
2582
+ id:
2583
+ type: string
2584
+ format: uuid
2585
+ example: a24a6ea4-ce75-4665-a070-57453082c25
2586
+ name:
2587
+ type: string
2588
+ example: SC001 Layout
2589
+ task_type_id:
2590
+ type: string
2591
+ format: uuid
2592
+ example: b24a6ea4-ce75-4665-a070-57453082c25
2593
+ task_status_id:
2594
+ type: string
2595
+ format: uuid
2596
+ example: c24a6ea4-ce75-4665-a070-57453082c25
2597
+ entity_id:
2598
+ type: string
2599
+ format: uuid
2600
+ example: d24a6ea4-ce75-4665-a070-57453082c25
2601
+ project_id:
2602
+ type: string
2603
+ format: uuid
2604
+ example: e24a6ea4-ce75-4665-a070-57453082c25
1449
2605
  """
1450
2606
  scene = shots_service.get_scene(scene_id)
1451
2607
  user_service.check_entity_access(scene["id"])
@@ -1456,10 +2612,11 @@ class SceneShotsResource(Resource, ArgsMixin):
1456
2612
  @jwt_required()
1457
2613
  def get(self, scene_id):
1458
2614
  """
1459
- Retrieve all shots that come from given scene.
2615
+ Get scene shots
1460
2616
  ---
1461
2617
  tags:
1462
2618
  - Shots
2619
+ description: Get shots that come from a scene.
1463
2620
  parameters:
1464
2621
  - in: path
1465
2622
  name: scene_id
@@ -1470,6 +2627,24 @@ class SceneShotsResource(Resource, ArgsMixin):
1470
2627
  responses:
1471
2628
  200:
1472
2629
  description: All shots that come from given scene
2630
+ content:
2631
+ application/json:
2632
+ schema:
2633
+ type: array
2634
+ items:
2635
+ type: object
2636
+ properties:
2637
+ id:
2638
+ type: string
2639
+ format: uuid
2640
+ example: a24a6ea4-ce75-4665-a070-57453082c25
2641
+ name:
2642
+ type: string
2643
+ example: SH010
2644
+ project_id:
2645
+ type: string
2646
+ format: uuid
2647
+ example: b24a6ea4-ce75-4665-a070-57453082c25
1473
2648
  """
1474
2649
  scene = shots_service.get_scene(scene_id)
1475
2650
  user_service.check_entity_access(scene["id"])
@@ -1478,10 +2653,11 @@ class SceneShotsResource(Resource, ArgsMixin):
1478
2653
  @jwt_required()
1479
2654
  def post(self, scene_id):
1480
2655
  """
1481
- Mark given scene as source of given shot.
2656
+ Link shot to scene
1482
2657
  ---
1483
2658
  tags:
1484
2659
  - Shots
2660
+ description: Link a shot to a scene as its source.
1485
2661
  parameters:
1486
2662
  - in: path
1487
2663
  name: scene_id
@@ -1504,8 +2680,21 @@ class SceneShotsResource(Resource, ArgsMixin):
1504
2680
  required: true
1505
2681
  example: a24a6ea4-ce75-4665-a070-57453082c25
1506
2682
  responses:
1507
- 200:
1508
- description: Given scene marked as source of given shot
2683
+ 201:
2684
+ description: Scene marked as source of shot
2685
+ content:
2686
+ application/json:
2687
+ schema:
2688
+ type: object
2689
+ properties:
2690
+ scene_id:
2691
+ type: string
2692
+ format: uuid
2693
+ example: a24a6ea4-ce75-4665-a070-57453082c25
2694
+ shot_id:
2695
+ type: string
2696
+ format: uuid
2697
+ example: b24a6ea4-ce75-4665-a070-57453082c25
1509
2698
  """
1510
2699
  args = self.get_args([("shot_id", None, True)])
1511
2700
 
@@ -1549,16 +2738,18 @@ class RemoveShotFromSceneResource(Resource):
1549
2738
 
1550
2739
  class ShotVersionsResource(Resource):
1551
2740
  """
1552
- Retrieve data versions of given shot.
2741
+ Get shot versions
1553
2742
  """
1554
2743
 
1555
2744
  @jwt_required()
1556
2745
  def get(self, shot_id):
1557
2746
  """
1558
- Retrieve data versions of given shot.
2747
+ Get shot versions
1559
2748
  ---
1560
2749
  tags:
1561
2750
  - Shots
2751
+ description: Get data versions of a shot. Use this to inspect version
2752
+ history.
1562
2753
  parameters:
1563
2754
  - in: path
1564
2755
  name: shot_id
@@ -1567,8 +2758,23 @@ class ShotVersionsResource(Resource):
1567
2758
  format: uuid
1568
2759
  example: a24a6ea4-ce75-4665-a070-57453082c25
1569
2760
  responses:
1570
- 204:
2761
+ 200:
1571
2762
  description: Data versions of given shot
2763
+ content:
2764
+ application/json:
2765
+ schema:
2766
+ type: array
2767
+ items:
2768
+ type: object
2769
+ properties:
2770
+ id:
2771
+ type: string
2772
+ format: uuid
2773
+ example: a24a6ea4-ce75-4665-a070-57453082c25
2774
+ created_at:
2775
+ type: string
2776
+ format: date-time
2777
+ example: "2024-01-15T10:30:00Z"
1572
2778
  """
1573
2779
  shot = shots_service.get_shot(shot_id)
1574
2780
  user_service.check_project_access(shot["project_id"])
@@ -1577,17 +2783,16 @@ class ShotVersionsResource(Resource):
1577
2783
 
1578
2784
 
1579
2785
  class ProjectQuotasResource(Resource, ArgsMixin):
1580
- """
1581
- Retrieve quotas statistics for shots
1582
- """
1583
2786
 
1584
2787
  @jwt_required()
1585
2788
  def get(self, project_id, task_type_id):
1586
2789
  """
1587
- Retrieve quotas statistics for shots.
2790
+ Get project quotas
1588
2791
  ---
1589
2792
  tags:
1590
2793
  - Shots
2794
+ description: Get quotas statistics for a project and task type. Supports
2795
+ weighted and raw modes with optional feedback filtering.
1591
2796
  parameters:
1592
2797
  - in: path
1593
2798
  name: project_id
@@ -1616,6 +2821,21 @@ class ProjectQuotasResource(Resource, ArgsMixin):
1616
2821
  responses:
1617
2822
  200:
1618
2823
  description: Quotas statistics for shots
2824
+ content:
2825
+ application/json:
2826
+ schema:
2827
+ type: object
2828
+ additionalProperties:
2829
+ type: object
2830
+ properties:
2831
+ count:
2832
+ type: integer
2833
+ example: 42
2834
+ frames:
2835
+ type: integer
2836
+ example: 1200
2837
+ 400:
2838
+ description: Invalid count_mode or parameter
1619
2839
  """
1620
2840
  projects_service.get_project(project_id)
1621
2841
  user_service.check_project_access(project_id)
@@ -1658,10 +2878,12 @@ class ProjectPersonQuotasResource(Resource, ArgsMixin):
1658
2878
  @jwt_required()
1659
2879
  def get(self, project_id, person_id):
1660
2880
  """
1661
- Retrieve quotas statistics for shots.
2881
+ Get project person quotas
1662
2882
  ---
1663
2883
  tags:
1664
2884
  - Shots
2885
+ description: Get quotas statistics for a person in a project. Supports
2886
+ weighted and raw modes with optional feedback filtering.
1665
2887
  parameters:
1666
2888
  - in: path
1667
2889
  name: project_id
@@ -1690,6 +2912,21 @@ class ProjectPersonQuotasResource(Resource, ArgsMixin):
1690
2912
  responses:
1691
2913
  200:
1692
2914
  description: Quotas statistics for shots
2915
+ content:
2916
+ application/json:
2917
+ schema:
2918
+ type: object
2919
+ additionalProperties:
2920
+ type: object
2921
+ properties:
2922
+ count:
2923
+ type: integer
2924
+ example: 15
2925
+ frames:
2926
+ type: integer
2927
+ example: 360
2928
+ 400:
2929
+ description: Invalid count_mode or parameter
1693
2930
  """
1694
2931
  projects_service.get_project(project_id)
1695
2932
  if (
@@ -1737,10 +2974,13 @@ class SetShotsFramesResource(Resource, ArgsMixin):
1737
2974
  @jwt_required()
1738
2975
  def post(self, project_id, task_type_id):
1739
2976
  """
1740
- Set frames for given shots.
2977
+ Set shots frames
1741
2978
  ---
1742
2979
  tags:
1743
2980
  - Shots
2981
+ description: Set number of frames on shots based on latest preview
2982
+ files for a task type. Optionally scope by episode via query
2983
+ param.
1744
2984
  requestBody:
1745
2985
  required: true
1746
2986
  content:
@@ -1766,6 +3006,16 @@ class SetShotsFramesResource(Resource, ArgsMixin):
1766
3006
  responses:
1767
3007
  200:
1768
3008
  description: Frames set for given shots
3009
+ content:
3010
+ application/json:
3011
+ schema:
3012
+ type: object
3013
+ properties:
3014
+ updated:
3015
+ type: integer
3016
+ example: 12
3017
+ 400:
3018
+ description: Invalid ids or parameters
1769
3019
  """
1770
3020
  user_service.check_manager_project_access(project_id)
1771
3021
  if not fields.is_valid_id(task_type_id) or not fields.is_valid_id(