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
@@ -16,23 +16,60 @@ from zou.app.utils import query, permissions
16
16
 
17
17
 
18
18
  class ConceptResource(Resource, ArgsMixin):
19
+
19
20
  @jwt_required()
20
21
  def get(self, concept_id):
21
22
  """
22
- Retrieve given concept.
23
+ Get concept
23
24
  ---
25
+ description: Retrieve detailed information about a specific concept
26
+ including metadata, project context, and related data.
24
27
  tags:
25
- - Concepts
28
+ - Concepts
26
29
  parameters:
27
30
  - in: path
28
31
  name: concept_id
29
- required: True
32
+ required: true
30
33
  type: string
31
34
  format: uuid
32
35
  example: a24a6ea4-ce75-4665-a070-57453082c25
36
+ description: Unique identifier of the concept
33
37
  responses:
34
- 200:
35
- description: Given concept
38
+ 200:
39
+ description: Concept information successfully retrieved
40
+ content:
41
+ application/json:
42
+ schema:
43
+ type: object
44
+ properties:
45
+ id:
46
+ type: string
47
+ format: uuid
48
+ description: Concept unique identifier
49
+ example: a24a6ea4-ce75-4665-a070-57453082c25
50
+ name:
51
+ type: string
52
+ description: Concept name
53
+ example: "Character Design"
54
+ description:
55
+ type: string
56
+ description: Concept description
57
+ example: "Main character concept art"
58
+ project_id:
59
+ type: string
60
+ format: uuid
61
+ description: Project identifier
62
+ example: b35b7fb5-df86-5776-b181-68564193d36
63
+ created_at:
64
+ type: string
65
+ format: date-time
66
+ description: Creation timestamp
67
+ example: "2023-01-01T12:00:00Z"
68
+ updated_at:
69
+ type: string
70
+ format: date-time
71
+ description: Last update timestamp
72
+ example: "2023-01-01T12:30:00Z"
36
73
  """
37
74
  concept = concepts_service.get_full_concept(concept_id)
38
75
  if concept is None:
@@ -47,20 +84,29 @@ class ConceptResource(Resource, ArgsMixin):
47
84
  @jwt_required()
48
85
  def delete(self, concept_id):
49
86
  """
50
- Delete given concept.
87
+ Delete concept
51
88
  ---
89
+ description: Permanently remove a concept from the system. Only concept
90
+ creators or project managers can delete concepts.
52
91
  tags:
53
- - Concepts
92
+ - Concepts
54
93
  parameters:
55
94
  - in: path
56
95
  name: concept_id
57
- required: True
96
+ required: true
58
97
  type: string
59
98
  format: uuid
60
99
  example: a24a6ea4-ce75-4665-a070-57453082c25
100
+ description: Unique identifier of the concept to delete
101
+ - in: query
102
+ name: force
103
+ type: boolean
104
+ required: false
105
+ description: Force deletion bypassing validation checks
106
+ example: false
61
107
  responses:
62
- 204:
63
- description: Given concept deleted
108
+ 204:
109
+ description: Concept successfully deleted
64
110
  """
65
111
  force = self.get_force()
66
112
  concept = concepts_service.get_concept(concept_id)
@@ -73,30 +119,75 @@ class ConceptResource(Resource, ArgsMixin):
73
119
 
74
120
 
75
121
  class AllConceptsResource(Resource):
122
+
76
123
  @jwt_required()
77
124
  def get(self):
78
125
  """
79
- Retrieve all concept entries.
126
+ Get all concepts
80
127
  ---
128
+ description: Retrieve all concept entries with filtering support.
129
+ Filters can be specified in the query string to narrow down results by
130
+ project or parent concept.
81
131
  tags:
82
- - Concepts
83
- description: Filters can be specified in the query string.
132
+ - Concepts
84
133
  parameters:
85
134
  - in: query
86
135
  name: project_id
87
- required: False
136
+ required: false
88
137
  type: string
89
138
  format: uuid
90
139
  example: a24a6ea4-ce75-4665-a070-57453082c25
140
+ description: Filter concepts by specific project
91
141
  - in: query
92
142
  name: parent_id
93
- required: False
143
+ required: false
94
144
  type: string
95
145
  format: uuid
96
- example: a24a6ea4-ce75-4665-a070-57453082c25
146
+ example: b35b7fb5-df86-5776-b181-68564193d36
147
+ description: Filter concepts by parent concept
97
148
  responses:
98
- 200:
99
- description: All concept entries
149
+ 200:
150
+ description: List of concepts successfully retrieved
151
+ content:
152
+ application/json:
153
+ schema:
154
+ type: array
155
+ items:
156
+ type: object
157
+ properties:
158
+ id:
159
+ type: string
160
+ format: uuid
161
+ description: Concept unique identifier
162
+ example: a24a6ea4-ce75-4665-a070-57453082c25
163
+ name:
164
+ type: string
165
+ description: Concept name
166
+ example: "Character Design"
167
+ description:
168
+ type: string
169
+ description: Concept description
170
+ example: "Main character concept art"
171
+ project_id:
172
+ type: string
173
+ format: uuid
174
+ description: Project identifier
175
+ example: b35b7fb5-df86-5776-b181-68564193d36
176
+ parent_id:
177
+ type: string
178
+ format: uuid
179
+ description: Parent concept identifier
180
+ example: c46c8gc6-eg97-6887-c292-79675204e47
181
+ created_at:
182
+ type: string
183
+ format: date-time
184
+ description: Creation timestamp
185
+ example: "2023-01-01T12:00:00Z"
186
+ updated_at:
187
+ type: string
188
+ format: date-time
189
+ description: Last update timestamp
190
+ example: "2023-01-01T12:30:00Z"
100
191
  """
101
192
  criterions = query.get_query_criterions_from_request(request)
102
193
  user_service.check_project_access(criterions.get("project_id", None))
@@ -109,23 +200,55 @@ class AllConceptsResource(Resource):
109
200
 
110
201
 
111
202
  class ConceptTaskTypesResource(Resource):
203
+
112
204
  @jwt_required()
113
205
  def get(self, concept_id):
114
206
  """
115
- Retrieve all task types related to a given concept.
207
+ Get concept task types
116
208
  ---
209
+ description: Retrieve all task types that are related to a specific
210
+ concept.
117
211
  tags:
118
- - Concepts
212
+ - Concepts
119
213
  parameters:
120
214
  - in: path
121
215
  name: concept_id
122
- required: True
216
+ required: true
123
217
  type: string
124
218
  format: uuid
125
219
  example: a24a6ea4-ce75-4665-a070-57453082c25
220
+ description: Unique identifier of the concept
126
221
  responses:
127
- 200:
128
- description: All task types related to given concept
222
+ 200:
223
+ description: List of concept task types successfully retrieved
224
+ content:
225
+ application/json:
226
+ schema:
227
+ type: array
228
+ items:
229
+ type: object
230
+ properties:
231
+ id:
232
+ type: string
233
+ format: uuid
234
+ description: Task type unique identifier
235
+ example: b35b7fb5-df86-5776-b181-68564193d36
236
+ name:
237
+ type: string
238
+ description: Task type name
239
+ example: "Concept Art"
240
+ short_name:
241
+ type: string
242
+ description: Task type short name
243
+ example: "CON"
244
+ color:
245
+ type: string
246
+ description: Task type color code
247
+ example: "#FF5733"
248
+ for_entity:
249
+ type: string
250
+ description: Entity type this task type is for
251
+ example: "Concept"
129
252
  """
130
253
  concept = concepts_service.get_concept(concept_id)
131
254
  user_service.check_project_access(concept["project_id"])
@@ -136,23 +259,78 @@ class ConceptTaskTypesResource(Resource):
136
259
 
137
260
 
138
261
  class ConceptTasksResource(Resource, ArgsMixin):
262
+
139
263
  @jwt_required()
140
264
  def get(self, concept_id):
141
265
  """
142
- Retrieve all tasks related to a given concept.
266
+ Get concept tasks
143
267
  ---
268
+ description: Retrieve all tasks that are related to a specific concept.
144
269
  tags:
145
- - Concepts
270
+ - Concepts
146
271
  parameters:
147
272
  - in: path
148
273
  name: concept_id
149
- required: True
274
+ required: true
150
275
  type: string
151
276
  format: uuid
152
277
  example: a24a6ea4-ce75-4665-a070-57453082c25
278
+ description: Unique identifier of the concept
279
+ - in: query
280
+ name: relations
281
+ type: boolean
282
+ required: false
283
+ description: Include related entity information
284
+ example: true
153
285
  responses:
154
- 200:
155
- description: All tasks related to given concept
286
+ 200:
287
+ description: List of concept tasks successfully retrieved
288
+ content:
289
+ application/json:
290
+ schema:
291
+ type: array
292
+ items:
293
+ type: object
294
+ properties:
295
+ id:
296
+ type: string
297
+ format: uuid
298
+ description: Task unique identifier
299
+ example: b35b7fb5-df86-5776-b181-68564193d36
300
+ name:
301
+ type: string
302
+ description: Task name
303
+ example: "Character Design Task"
304
+ task_type_id:
305
+ type: string
306
+ format: uuid
307
+ description: Task type identifier
308
+ example: c46c8gc6-eg97-6887-c292-79675204e47
309
+ task_status_id:
310
+ type: string
311
+ format: uuid
312
+ description: Task status identifier
313
+ example: d57d9hd7-fh08-7998-d403-80786315f58
314
+ entity_id:
315
+ type: string
316
+ format: uuid
317
+ description: Entity identifier
318
+ example: e68e0ie8-gi19-8009-e514-91897426g69
319
+ assigned_to:
320
+ type: string
321
+ format: uuid
322
+ description: Assigned person identifier
323
+ example: f79f1jf9-hj20-9010-f625-02998537h80
324
+ created_at:
325
+ type: string
326
+ format: date-time
327
+ description: Creation timestamp
328
+ example: "2023-01-01T12:00:00Z"
329
+ updated_at:
330
+ type: string
331
+ format: date-time
332
+ description: Last update timestamp
333
+ example: "2023-01-01T12:30:00Z"
156
334
  """
157
335
  concept = concepts_service.get_concept(concept_id)
158
336
  user_service.check_project_access(concept["project_id"])
@@ -166,25 +344,64 @@ class ConceptTasksResource(Resource, ArgsMixin):
166
344
 
167
345
 
168
346
  class ConceptPreviewsResource(Resource):
347
+
169
348
  @jwt_required()
170
349
  def get(self, concept_id):
171
350
  """
172
- Retrieve all previews related to a given concept.
351
+ Get concept previews
173
352
  ---
353
+ description: Retrieve all preview files related to a specific concept.
354
+ Returns them as a dictionary where keys are related task type IDs and
355
+ values are arrays of previews for that task type.
174
356
  tags:
175
- - Concepts
176
- description: It sends them as a dict.
177
- Keys are related task type ids and values are arrays of preview for this task type.
357
+ - Concepts
178
358
  parameters:
179
359
  - in: path
180
360
  name: concept_id
181
- required: True
361
+ required: true
182
362
  type: string
183
363
  format: uuid
184
364
  example: a24a6ea4-ce75-4665-a070-57453082c25
365
+ description: Unique identifier of the concept
185
366
  responses:
186
- 200:
187
- description: All previews related to given episode
367
+ 200:
368
+ description: Concept previews successfully retrieved
369
+ content:
370
+ application/json:
371
+ schema:
372
+ type: object
373
+ additionalProperties:
374
+ type: array
375
+ items:
376
+ type: object
377
+ properties:
378
+ id:
379
+ type: string
380
+ format: uuid
381
+ description: Preview unique identifier
382
+ example: b35b7fb5-df86-5776-b181-68564193d36
383
+ name:
384
+ type: string
385
+ description: Preview name
386
+ example: "concept_preview_01"
387
+ original_name:
388
+ type: string
389
+ description: Original file name
390
+ example: "character_concept.jpg"
391
+ file_path:
392
+ type: string
393
+ description: File path
394
+ example: "/previews/concept/concept_preview_01.jpg"
395
+ task_type_id:
396
+ type: string
397
+ format: uuid
398
+ description: Task type identifier
399
+ example: c46c8gc6-eg97-6887-c292-79675204e47
400
+ created_at:
401
+ type: string
402
+ format: date-time
403
+ description: Creation timestamp
404
+ example: "2023-01-01T12:00:00Z"
188
405
  """
189
406
  concept = concepts_service.get_concept(concept_id)
190
407
  user_service.check_project_access(concept["project_id"])
@@ -198,20 +415,85 @@ class ConceptsAndTasksResource(Resource):
198
415
  @jwt_required()
199
416
  def get(self):
200
417
  """
201
- Retrieve all concepts, adds project name and asset type name and all related tasks.
418
+ Get concepts and tasks
202
419
  ---
420
+ description: Retrieve all concepts and all related tasks included in the
421
+ response.
203
422
  tags:
204
- - Concepts
423
+ - Concepts
205
424
  parameters:
206
425
  - in: query
207
426
  name: project_id
208
- required: False
427
+ required: false
209
428
  type: string
210
429
  format: uuid
211
430
  example: a24a6ea4-ce75-4665-a070-57453082c25
431
+ description: Filter concepts by specific project
212
432
  responses:
213
- 200:
214
- description: All concepts
433
+ 200:
434
+ description: Concepts with tasks successfully retrieved
435
+ content:
436
+ application/json:
437
+ schema:
438
+ type: array
439
+ items:
440
+ type: object
441
+ properties:
442
+ id:
443
+ type: string
444
+ format: uuid
445
+ description: Concept unique identifier
446
+ example: a24a6ea4-ce75-4665-a070-57453082c25
447
+ name:
448
+ type: string
449
+ description: Concept name
450
+ example: "Character Design"
451
+ description:
452
+ type: string
453
+ description: Concept description
454
+ example: "Main character concept art"
455
+ project_id:
456
+ type: string
457
+ format: uuid
458
+ description: Project identifier
459
+ example: b35b7fb5-df86-5776-b181-68564193d36
460
+ project_name:
461
+ type: string
462
+ description: Project name
463
+ example: "My Animation Project"
464
+ asset_type_name:
465
+ type: string
466
+ description: Asset type name
467
+ example: "Character"
468
+ tasks:
469
+ type: array
470
+ items:
471
+ type: object
472
+ properties:
473
+ id:
474
+ type: string
475
+ format: uuid
476
+ description: Task unique identifier
477
+ example: c46c8gc6-eg97-6887-c292-79675204e47
478
+ name:
479
+ type: string
480
+ description: Task name
481
+ example: "Character Design Task"
482
+ task_type_id:
483
+ type: string
484
+ format: uuid
485
+ description: Task type identifier
486
+ example: d57d9hd7-fh08-7998-d403-80786315f58
487
+ created_at:
488
+ type: string
489
+ format: date-time
490
+ description: Creation timestamp
491
+ example: "2023-01-01T12:00:00Z"
492
+ updated_at:
493
+ type: string
494
+ format: date-time
495
+ description: Last update timestamp
496
+ example: "2023-01-01T12:30:00Z"
215
497
  """
216
498
  criterions = query.get_query_criterions_from_request(request)
217
499
  user_service.check_project_access(criterions.get("project_id", None))
@@ -227,20 +509,58 @@ class ProjectConceptsResource(Resource, ArgsMixin):
227
509
  @jwt_required()
228
510
  def get(self, project_id):
229
511
  """
230
- Retrieve all concepts related to a given project.
512
+ Get project concepts
231
513
  ---
514
+ description: Retrieve all concepts that are related to a specific
515
+ project.
232
516
  tags:
233
- - Concepts
517
+ - Concepts
234
518
  parameters:
235
519
  - in: path
236
520
  name: project_id
237
- required: True
521
+ required: true
238
522
  type: string
239
523
  format: uuid
240
524
  example: a24a6ea4-ce75-4665-a070-57453082c25
525
+ description: Unique identifier of the project
241
526
  responses:
242
- 200:
243
- description: All concepts related to given project
527
+ 200:
528
+ description: List of project concepts successfully retrieved
529
+ content:
530
+ application/json:
531
+ schema:
532
+ type: array
533
+ items:
534
+ type: object
535
+ properties:
536
+ id:
537
+ type: string
538
+ format: uuid
539
+ description: Concept unique identifier
540
+ example: a24a6ea4-ce75-4665-a070-57453082c25
541
+ name:
542
+ type: string
543
+ description: Concept name
544
+ example: "Character Design"
545
+ description:
546
+ type: string
547
+ description: Concept description
548
+ example: "Main character concept art"
549
+ project_id:
550
+ type: string
551
+ format: uuid
552
+ description: Project identifier
553
+ example: b35b7fb5-df86-5776-b181-68564193d36
554
+ created_at:
555
+ type: string
556
+ format: date-time
557
+ description: Creation timestamp
558
+ example: "2023-01-01T12:00:00Z"
559
+ updated_at:
560
+ type: string
561
+ format: date-time
562
+ description: Last update timestamp
563
+ example: "2023-01-01T12:30:00Z"
244
564
  """
245
565
  projects_service.get_project(project_id)
246
566
  user_service.check_project_access(project_id)
@@ -256,33 +576,93 @@ class ProjectConceptsResource(Resource, ArgsMixin):
256
576
  @jwt_required()
257
577
  def post(self, project_id):
258
578
  """
259
- Create a concept for given project.
579
+ Create concept
260
580
  ---
581
+ description: Create a new concept for a specific project with name,
582
+ description, and optional entity concept links.
261
583
  tags:
262
- - Concepts
584
+ - Concepts
263
585
  parameters:
264
586
  - in: path
265
587
  name: project_id
266
- required: True
588
+ required: true
267
589
  type: string
268
590
  format: uuid
269
591
  example: a24a6ea4-ce75-4665-a070-57453082c25
270
- - in: formData
271
- name: name
272
- required: True
273
- type: string
274
- example: Name of concept
275
- - in: formData
276
- name: description
277
- type: string
278
- example: Description of concept
279
- - in: formData
280
- name: entity_concept_links
281
- type: list of UUIDs
282
- example: ["a24a6ea4-ce75-4665-a070-57453082c25"]
592
+ description: Unique identifier of the project
593
+ requestBody:
594
+ required: true
595
+ content:
596
+ application/json:
597
+ schema:
598
+ type: object
599
+ required:
600
+ - name
601
+ properties:
602
+ name:
603
+ type: string
604
+ description: Concept name
605
+ example: "Character Design"
606
+ description:
607
+ type: string
608
+ description: Concept description
609
+ example: "Main character concept art"
610
+ data:
611
+ type: object
612
+ description: Additional concept data
613
+ example: {"style": "realistic", "mood": "heroic"}
614
+ entity_concept_links:
615
+ type: array
616
+ items:
617
+ type: string
618
+ format: uuid
619
+ description: List of entity concept link identifiers
620
+ example: ["b35b7fb5-df86-5776-b181-68564193d36", "c46c8gc6-eg97-6887-c292-79675204e47"]
283
621
  responses:
284
- 201:
285
- description: Concept created for given project
622
+ 201:
623
+ description: Concept successfully created
624
+ content:
625
+ application/json:
626
+ schema:
627
+ type: object
628
+ properties:
629
+ id:
630
+ type: string
631
+ format: uuid
632
+ description: Concept unique identifier
633
+ example: a24a6ea4-ce75-4665-a070-57453082c25
634
+ name:
635
+ type: string
636
+ description: Concept name
637
+ example: "Character Design"
638
+ description:
639
+ type: string
640
+ description: Concept description
641
+ example: "Main character concept art"
642
+ project_id:
643
+ type: string
644
+ format: uuid
645
+ description: Project identifier
646
+ example: b35b7fb5-df86-5776-b181-68564193d36
647
+ data:
648
+ type: object
649
+ description: Additional concept data
650
+ example: {"style": "realistic", "mood": "heroic"}
651
+ created_by:
652
+ type: string
653
+ format: uuid
654
+ description: Creator person identifier
655
+ example: d57d9hd7-fh08-7998-d403-80786315f58
656
+ created_at:
657
+ type: string
658
+ format: date-time
659
+ description: Creation timestamp
660
+ example: "2023-01-01T12:00:00Z"
661
+ updated_at:
662
+ type: string
663
+ format: date-time
664
+ description: Last update timestamp
665
+ example: "2023-01-01T12:00:00Z"
286
666
  """
287
667
  (name, data, description, entity_concept_links) = self.get_arguments()
288
668
  projects_service.get_project(project_id)