zou 0.20.8__tar.gz → 0.20.12__tar.gz

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 (432) hide show
  1. {zou-0.20.8/zou.egg-info → zou-0.20.12}/PKG-INFO +12 -11
  2. {zou-0.20.8 → zou-0.20.12}/setup.cfg +9 -9
  3. zou-0.20.12/zou/__init__.py +1 -0
  4. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/comments/resources.py +5 -15
  5. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/crud/attachment_file.py +1 -4
  6. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/crud/project.py +4 -0
  7. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/crud/working_file.py +3 -7
  8. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/files/resources.py +7 -17
  9. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/previews/__init__.py +8 -3
  10. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/previews/resources.py +100 -60
  11. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/projects/resources.py +9 -0
  12. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/tasks/resources.py +8 -20
  13. {zou-0.20.8 → zou-0.20.12}/zou/app/models/person.py +10 -0
  14. {zou-0.20.8 → zou-0.20.12}/zou/app/services/assets_service.py +12 -0
  15. {zou-0.20.8 → zou-0.20.12}/zou/app/services/preview_files_service.py +5 -5
  16. {zou-0.20.8 → zou-0.20.12}/zou/app/services/user_service.py +11 -1
  17. {zou-0.20.8 → zou-0.20.12}/zou/app/utils/commands.py +17 -14
  18. zou-0.20.12/zou/event_stream.py +214 -0
  19. zou-0.20.12/zou/migrations/versions/539a3a00c417_for_departmentlink_index_person_id_.py +50 -0
  20. {zou-0.20.8 → zou-0.20.12/zou.egg-info}/PKG-INFO +12 -11
  21. {zou-0.20.8 → zou-0.20.12}/zou.egg-info/SOURCES.txt +1 -0
  22. {zou-0.20.8 → zou-0.20.12}/zou.egg-info/requires.txt +9 -9
  23. zou-0.20.8/zou/__init__.py +0 -1
  24. zou-0.20.8/zou/event_stream.py +0 -235
  25. {zou-0.20.8 → zou-0.20.12}/LICENSE +0 -0
  26. {zou-0.20.8 → zou-0.20.12}/README.rst +0 -0
  27. {zou-0.20.8 → zou-0.20.12}/pyproject.toml +0 -0
  28. {zou-0.20.8 → zou-0.20.12}/setup.py +0 -0
  29. {zou-0.20.8 → zou-0.20.12}/zou/app/__init__.py +0 -0
  30. {zou-0.20.8 → zou-0.20.12}/zou/app/api.py +0 -0
  31. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/__init__.py +0 -0
  32. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/assets/__init__.py +0 -0
  33. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/assets/resources.py +0 -0
  34. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/auth/__init__.py +0 -0
  35. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/auth/resources.py +0 -0
  36. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/breakdown/__init__.py +0 -0
  37. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/breakdown/resources.py +0 -0
  38. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/chats/__init__.py +0 -0
  39. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/chats/resources.py +0 -0
  40. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/comments/__init__.py +0 -0
  41. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/concepts/__init__.py +0 -0
  42. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/concepts/resources.py +0 -0
  43. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/crud/__init__.py +0 -0
  44. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/crud/asset_instance.py +0 -0
  45. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/crud/base.py +0 -0
  46. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/crud/chat.py +0 -0
  47. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/crud/chat_message.py +0 -0
  48. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/crud/comments.py +0 -0
  49. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/crud/custom_action.py +0 -0
  50. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/crud/day_off.py +0 -0
  51. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/crud/department.py +0 -0
  52. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/crud/entity.py +0 -0
  53. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/crud/entity_link.py +0 -0
  54. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/crud/entity_type.py +0 -0
  55. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/crud/event.py +0 -0
  56. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/crud/file_status.py +0 -0
  57. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/crud/metadata_descriptor.py +0 -0
  58. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/crud/milestone.py +0 -0
  59. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/crud/news.py +0 -0
  60. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/crud/notification.py +0 -0
  61. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/crud/organisation.py +0 -0
  62. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/crud/output_file.py +0 -0
  63. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/crud/output_type.py +0 -0
  64. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/crud/person.py +0 -0
  65. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/crud/playlist.py +0 -0
  66. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/crud/preview_background_file.py +0 -0
  67. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/crud/preview_file.py +0 -0
  68. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/crud/project_status.py +0 -0
  69. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/crud/schedule_item.py +0 -0
  70. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/crud/search_filter.py +0 -0
  71. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/crud/search_filter_group.py +0 -0
  72. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/crud/software.py +0 -0
  73. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/crud/status_automation.py +0 -0
  74. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/crud/studio.py +0 -0
  75. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/crud/subscription.py +0 -0
  76. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/crud/task.py +0 -0
  77. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/crud/task_status.py +0 -0
  78. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/crud/task_type.py +0 -0
  79. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/crud/time_spent.py +0 -0
  80. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/edits/__init__.py +0 -0
  81. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/edits/resources.py +0 -0
  82. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/entities/__init__.py +0 -0
  83. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/entities/resources.py +0 -0
  84. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/events/__init__.py +0 -0
  85. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/events/resources.py +0 -0
  86. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/export/__init__.py +0 -0
  87. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/export/csv/__init__.py +0 -0
  88. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/export/csv/assets.py +0 -0
  89. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/export/csv/base.py +0 -0
  90. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/export/csv/casting.py +0 -0
  91. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/export/csv/edits.py +0 -0
  92. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/export/csv/persons.py +0 -0
  93. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/export/csv/playlists.py +0 -0
  94. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/export/csv/projects.py +0 -0
  95. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/export/csv/shots.py +0 -0
  96. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/export/csv/task_types.py +0 -0
  97. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/export/csv/tasks.py +0 -0
  98. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/export/csv/time_spents.py +0 -0
  99. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/files/__init__.py +0 -0
  100. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/index/__init__.py +0 -0
  101. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/index/resources.py +0 -0
  102. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/news/__init__.py +0 -0
  103. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/news/resources.py +0 -0
  104. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/persons/__init__.py +0 -0
  105. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/persons/resources.py +0 -0
  106. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/playlists/__init__.py +0 -0
  107. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/playlists/resources.py +0 -0
  108. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/projects/__init__.py +0 -0
  109. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/search/__init__.py +0 -0
  110. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/search/resources.py +0 -0
  111. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/shots/__init__.py +0 -0
  112. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/shots/resources.py +0 -0
  113. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/source/__init__.py +0 -0
  114. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/source/csv/__init__.py +0 -0
  115. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/source/csv/assets.py +0 -0
  116. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/source/csv/base.py +0 -0
  117. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/source/csv/casting.py +0 -0
  118. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/source/csv/edits.py +0 -0
  119. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/source/csv/persons.py +0 -0
  120. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/source/csv/shots.py +0 -0
  121. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/source/csv/task_type_estimations.py +0 -0
  122. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/source/kitsu.py +0 -0
  123. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/source/otio.py +0 -0
  124. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/source/shotgun/__init__.py +0 -0
  125. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/source/shotgun/assets.py +0 -0
  126. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/source/shotgun/base.py +0 -0
  127. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/source/shotgun/episode.py +0 -0
  128. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/source/shotgun/exception.py +0 -0
  129. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/source/shotgun/import_errors.py +0 -0
  130. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/source/shotgun/notes.py +0 -0
  131. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/source/shotgun/person.py +0 -0
  132. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/source/shotgun/project.py +0 -0
  133. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/source/shotgun/scene.py +0 -0
  134. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/source/shotgun/sequence.py +0 -0
  135. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/source/shotgun/shot.py +0 -0
  136. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/source/shotgun/status.py +0 -0
  137. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/source/shotgun/steps.py +0 -0
  138. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/source/shotgun/tasks.py +0 -0
  139. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/source/shotgun/team.py +0 -0
  140. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/source/shotgun/versions.py +0 -0
  141. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/tasks/__init__.py +0 -0
  142. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/user/__init__.py +0 -0
  143. {zou-0.20.8 → zou-0.20.12}/zou/app/blueprints/user/resources.py +0 -0
  144. {zou-0.20.8 → zou-0.20.12}/zou/app/config.py +0 -0
  145. {zou-0.20.8 → zou-0.20.12}/zou/app/file_trees/default.json +0 -0
  146. {zou-0.20.8 → zou-0.20.12}/zou/app/file_trees/simple.json +0 -0
  147. {zou-0.20.8 → zou-0.20.12}/zou/app/indexer/__init__.py +0 -0
  148. {zou-0.20.8 → zou-0.20.12}/zou/app/indexer/indexing.py +0 -0
  149. {zou-0.20.8 → zou-0.20.12}/zou/app/mixin.py +0 -0
  150. {zou-0.20.8 → zou-0.20.12}/zou/app/models/__init__.py +0 -0
  151. {zou-0.20.8 → zou-0.20.12}/zou/app/models/asset_instance.py +0 -0
  152. {zou-0.20.8 → zou-0.20.12}/zou/app/models/attachment_file.py +0 -0
  153. {zou-0.20.8 → zou-0.20.12}/zou/app/models/base.py +0 -0
  154. {zou-0.20.8 → zou-0.20.12}/zou/app/models/build_job.py +0 -0
  155. {zou-0.20.8 → zou-0.20.12}/zou/app/models/chat.py +0 -0
  156. {zou-0.20.8 → zou-0.20.12}/zou/app/models/chat_message.py +0 -0
  157. {zou-0.20.8 → zou-0.20.12}/zou/app/models/comment.py +0 -0
  158. {zou-0.20.8 → zou-0.20.12}/zou/app/models/custom_action.py +0 -0
  159. {zou-0.20.8 → zou-0.20.12}/zou/app/models/data_import_error.py +0 -0
  160. {zou-0.20.8 → zou-0.20.12}/zou/app/models/day_off.py +0 -0
  161. {zou-0.20.8 → zou-0.20.12}/zou/app/models/department.py +0 -0
  162. {zou-0.20.8 → zou-0.20.12}/zou/app/models/desktop_login_log.py +0 -0
  163. {zou-0.20.8 → zou-0.20.12}/zou/app/models/entity.py +0 -0
  164. {zou-0.20.8 → zou-0.20.12}/zou/app/models/entity_type.py +0 -0
  165. {zou-0.20.8 → zou-0.20.12}/zou/app/models/event.py +0 -0
  166. {zou-0.20.8 → zou-0.20.12}/zou/app/models/file_status.py +0 -0
  167. {zou-0.20.8 → zou-0.20.12}/zou/app/models/login_log.py +0 -0
  168. {zou-0.20.8 → zou-0.20.12}/zou/app/models/metadata_descriptor.py +0 -0
  169. {zou-0.20.8 → zou-0.20.12}/zou/app/models/milestone.py +0 -0
  170. {zou-0.20.8 → zou-0.20.12}/zou/app/models/news.py +0 -0
  171. {zou-0.20.8 → zou-0.20.12}/zou/app/models/notification.py +0 -0
  172. {zou-0.20.8 → zou-0.20.12}/zou/app/models/organisation.py +0 -0
  173. {zou-0.20.8 → zou-0.20.12}/zou/app/models/output_file.py +0 -0
  174. {zou-0.20.8 → zou-0.20.12}/zou/app/models/output_type.py +0 -0
  175. {zou-0.20.8 → zou-0.20.12}/zou/app/models/playlist.py +0 -0
  176. {zou-0.20.8 → zou-0.20.12}/zou/app/models/preview_background_file.py +0 -0
  177. {zou-0.20.8 → zou-0.20.12}/zou/app/models/preview_file.py +0 -0
  178. {zou-0.20.8 → zou-0.20.12}/zou/app/models/project.py +0 -0
  179. {zou-0.20.8 → zou-0.20.12}/zou/app/models/project_status.py +0 -0
  180. {zou-0.20.8 → zou-0.20.12}/zou/app/models/schedule_item.py +0 -0
  181. {zou-0.20.8 → zou-0.20.12}/zou/app/models/search_filter.py +0 -0
  182. {zou-0.20.8 → zou-0.20.12}/zou/app/models/search_filter_group.py +0 -0
  183. {zou-0.20.8 → zou-0.20.12}/zou/app/models/serializer.py +0 -0
  184. {zou-0.20.8 → zou-0.20.12}/zou/app/models/software.py +0 -0
  185. {zou-0.20.8 → zou-0.20.12}/zou/app/models/status_automation.py +0 -0
  186. {zou-0.20.8 → zou-0.20.12}/zou/app/models/studio.py +0 -0
  187. {zou-0.20.8 → zou-0.20.12}/zou/app/models/subscription.py +0 -0
  188. {zou-0.20.8 → zou-0.20.12}/zou/app/models/task.py +0 -0
  189. {zou-0.20.8 → zou-0.20.12}/zou/app/models/task_status.py +0 -0
  190. {zou-0.20.8 → zou-0.20.12}/zou/app/models/task_type.py +0 -0
  191. {zou-0.20.8 → zou-0.20.12}/zou/app/models/time_spent.py +0 -0
  192. {zou-0.20.8 → zou-0.20.12}/zou/app/models/working_file.py +0 -0
  193. {zou-0.20.8 → zou-0.20.12}/zou/app/services/__init__.py +0 -0
  194. {zou-0.20.8 → zou-0.20.12}/zou/app/services/auth_service.py +0 -0
  195. {zou-0.20.8 → zou-0.20.12}/zou/app/services/backup_service.py +0 -0
  196. {zou-0.20.8 → zou-0.20.12}/zou/app/services/base_service.py +0 -0
  197. {zou-0.20.8 → zou-0.20.12}/zou/app/services/breakdown_service.py +0 -0
  198. {zou-0.20.8 → zou-0.20.12}/zou/app/services/chats_service.py +0 -0
  199. {zou-0.20.8 → zou-0.20.12}/zou/app/services/comments_service.py +0 -0
  200. {zou-0.20.8 → zou-0.20.12}/zou/app/services/concepts_service.py +0 -0
  201. {zou-0.20.8 → zou-0.20.12}/zou/app/services/custom_actions_service.py +0 -0
  202. {zou-0.20.8 → zou-0.20.12}/zou/app/services/deletion_service.py +0 -0
  203. {zou-0.20.8 → zou-0.20.12}/zou/app/services/edits_service.py +0 -0
  204. {zou-0.20.8 → zou-0.20.12}/zou/app/services/emails_service.py +0 -0
  205. {zou-0.20.8 → zou-0.20.12}/zou/app/services/entities_service.py +0 -0
  206. {zou-0.20.8 → zou-0.20.12}/zou/app/services/events_service.py +0 -0
  207. {zou-0.20.8 → zou-0.20.12}/zou/app/services/exception.py +0 -0
  208. {zou-0.20.8 → zou-0.20.12}/zou/app/services/file_tree_service.py +0 -0
  209. {zou-0.20.8 → zou-0.20.12}/zou/app/services/files_service.py +0 -0
  210. {zou-0.20.8 → zou-0.20.12}/zou/app/services/index_service.py +0 -0
  211. {zou-0.20.8 → zou-0.20.12}/zou/app/services/names_service.py +0 -0
  212. {zou-0.20.8 → zou-0.20.12}/zou/app/services/news_service.py +0 -0
  213. {zou-0.20.8 → zou-0.20.12}/zou/app/services/notifications_service.py +0 -0
  214. {zou-0.20.8 → zou-0.20.12}/zou/app/services/persons_service.py +0 -0
  215. {zou-0.20.8 → zou-0.20.12}/zou/app/services/playlists_service.py +0 -0
  216. {zou-0.20.8 → zou-0.20.12}/zou/app/services/projects_service.py +0 -0
  217. {zou-0.20.8 → zou-0.20.12}/zou/app/services/scenes_service.py +0 -0
  218. {zou-0.20.8 → zou-0.20.12}/zou/app/services/schedule_service.py +0 -0
  219. {zou-0.20.8 → zou-0.20.12}/zou/app/services/shots_service.py +0 -0
  220. {zou-0.20.8 → zou-0.20.12}/zou/app/services/stats_service.py +0 -0
  221. {zou-0.20.8 → zou-0.20.12}/zou/app/services/status_automations_service.py +0 -0
  222. {zou-0.20.8 → zou-0.20.12}/zou/app/services/sync_service.py +0 -0
  223. {zou-0.20.8 → zou-0.20.12}/zou/app/services/tasks_service.py +0 -0
  224. {zou-0.20.8 → zou-0.20.12}/zou/app/services/telemetry_services.py +0 -0
  225. {zou-0.20.8 → zou-0.20.12}/zou/app/services/time_spents_service.py +0 -0
  226. {zou-0.20.8 → zou-0.20.12}/zou/app/stores/__init__.py +0 -0
  227. {zou-0.20.8 → zou-0.20.12}/zou/app/stores/auth_tokens_store.py +0 -0
  228. {zou-0.20.8 → zou-0.20.12}/zou/app/stores/file_store.py +0 -0
  229. {zou-0.20.8 → zou-0.20.12}/zou/app/stores/publisher_store.py +0 -0
  230. {zou-0.20.8 → zou-0.20.12}/zou/app/stores/queue_store.py +0 -0
  231. {zou-0.20.8 → zou-0.20.12}/zou/app/swagger.py +0 -0
  232. {zou-0.20.8 → zou-0.20.12}/zou/app/utils/__init__.py +0 -0
  233. {zou-0.20.8 → zou-0.20.12}/zou/app/utils/api.py +0 -0
  234. {zou-0.20.8 → zou-0.20.12}/zou/app/utils/auth.py +0 -0
  235. {zou-0.20.8 → zou-0.20.12}/zou/app/utils/cache.py +0 -0
  236. {zou-0.20.8 → zou-0.20.12}/zou/app/utils/chats.py +0 -0
  237. {zou-0.20.8 → zou-0.20.12}/zou/app/utils/colors.py +0 -0
  238. {zou-0.20.8 → zou-0.20.12}/zou/app/utils/csv_utils.py +0 -0
  239. {zou-0.20.8 → zou-0.20.12}/zou/app/utils/date_helpers.py +0 -0
  240. {zou-0.20.8 → zou-0.20.12}/zou/app/utils/dbhelpers.py +0 -0
  241. {zou-0.20.8 → zou-0.20.12}/zou/app/utils/emails.py +0 -0
  242. {zou-0.20.8 → zou-0.20.12}/zou/app/utils/env.py +0 -0
  243. {zou-0.20.8 → zou-0.20.12}/zou/app/utils/events.py +0 -0
  244. {zou-0.20.8 → zou-0.20.12}/zou/app/utils/fido.py +0 -0
  245. {zou-0.20.8 → zou-0.20.12}/zou/app/utils/fields.py +0 -0
  246. {zou-0.20.8 → zou-0.20.12}/zou/app/utils/flask.py +0 -0
  247. {zou-0.20.8 → zou-0.20.12}/zou/app/utils/fs.py +0 -0
  248. {zou-0.20.8 → zou-0.20.12}/zou/app/utils/git.py +0 -0
  249. {zou-0.20.8 → zou-0.20.12}/zou/app/utils/logs.py +0 -0
  250. {zou-0.20.8 → zou-0.20.12}/zou/app/utils/monitoring.py +0 -0
  251. {zou-0.20.8 → zou-0.20.12}/zou/app/utils/permissions.py +0 -0
  252. {zou-0.20.8 → zou-0.20.12}/zou/app/utils/query.py +0 -0
  253. {zou-0.20.8 → zou-0.20.12}/zou/app/utils/redis.py +0 -0
  254. {zou-0.20.8 → zou-0.20.12}/zou/app/utils/remote_job.py +0 -0
  255. {zou-0.20.8 → zou-0.20.12}/zou/app/utils/saml.py +0 -0
  256. {zou-0.20.8 → zou-0.20.12}/zou/app/utils/shell.py +0 -0
  257. {zou-0.20.8 → zou-0.20.12}/zou/app/utils/string.py +0 -0
  258. {zou-0.20.8 → zou-0.20.12}/zou/app/utils/thumbnail.py +0 -0
  259. {zou-0.20.8 → zou-0.20.12}/zou/cli.py +0 -0
  260. {zou-0.20.8 → zou-0.20.12}/zou/debug.py +0 -0
  261. {zou-0.20.8 → zou-0.20.12}/zou/job_settings.py +0 -0
  262. {zou-0.20.8 → zou-0.20.12}/zou/migrations/README +0 -0
  263. {zou-0.20.8 → zou-0.20.12}/zou/migrations/__init__.py +0 -0
  264. {zou-0.20.8 → zou-0.20.12}/zou/migrations/alembic.ini +0 -0
  265. {zou-0.20.8 → zou-0.20.12}/zou/migrations/env.py +0 -0
  266. {zou-0.20.8 → zou-0.20.12}/zou/migrations/script.py.mako +0 -0
  267. {zou-0.20.8 → zou-0.20.12}/zou/migrations/utils/__init__.py +0 -0
  268. {zou-0.20.8 → zou-0.20.12}/zou/migrations/utils/base.py +0 -0
  269. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/003be8a91001_add_start_and_end_dates_to_projects.py +0 -0
  270. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/0596674df51d_add_department_mentions_to_comments.py +0 -0
  271. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/05ac7e8caa21_remove_unique_constraint_for_taskstatus_.py +0 -0
  272. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/05b7dc79a416_add_archived_fields_to_main_tables.py +0 -0
  273. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/0cf5e0e035fa_drop_column_tasktype_for_shots.py +0 -0
  274. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/0ec3762a745d_add_attachment_table.py +0 -0
  275. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/0ef6416a507b_.py +0 -0
  276. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/10cf267d95c9_fix_schedule_item.py +0 -0
  277. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/16328eae4b5f_add_new_constraint_for_timespent.py +0 -0
  278. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/16df47d76c64_add_some_indexes.py +0 -0
  279. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/17ef8f7be758_disallow_null_choicetype.py +0 -0
  280. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/1bb55759146f_add_table_studio.py +0 -0
  281. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/1cb44194db49_add_file_size_field_to_preview_file.py +0 -0
  282. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/1e150c2cea4d_add_nb_entities_out.py +0 -0
  283. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/1e2d77a2f0c4_add_hd_by_default_column.py +0 -0
  284. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/1fab8c420678_add_attachments_to_message_chats.py +0 -0
  285. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/20dfeb36142b_add_projecttaskstatuslink_roles_for_.py +0 -0
  286. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/23122f290ca2_add_entity_chat_models.py +0 -0
  287. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/269d41bfb73f_add_entity_entity_links.py +0 -0
  288. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/29df910f04a4_create_unique_constraint_project_id_.py +0 -0
  289. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/29fe01a6c9eb_add_status_automation_field.py +0 -0
  290. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/2adc020885fa_.py +0 -0
  291. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/2baede80b111_add_entity_status_field.py +0 -0
  292. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/306266361f4f_.py +0 -0
  293. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/328fd44c6347_add_entity_created_by.py +0 -0
  294. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/32f134ff1201_add_is_shared_flag_to_filters.py +0 -0
  295. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/346250b5304c_add_position_to_preview_files.py +0 -0
  296. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/3476e147e632_add_acks_to_comments.py +0 -0
  297. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/389cfb9de776_.py +0 -0
  298. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/38baa9a23b3d_.py +0 -0
  299. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/398150912a3f_validation_status_preview.py +0 -0
  300. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/3b0d1321079e_.py +0 -0
  301. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/3d5c93bafb9d_.py +0 -0
  302. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/3e0538ddf80f_.py +0 -0
  303. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/3fee3bd10f9d_.py +0 -0
  304. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/4095103c7d01_add_is_clients_isolated_flag_to_projects.py +0 -0
  305. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/40dea9555940_.py +0 -0
  306. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/42ec83db6a01_change_person_preferred_two_factor_.py +0 -0
  307. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/43d0cf0ed5e7_.py +0 -0
  308. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/443d1e78a932_.py +0 -0
  309. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/45c2de366e66_.py +0 -0
  310. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/45dafbb3f4e1_for_person_contract_type_disallow_null.py +0 -0
  311. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/4715c2586036_add_last_preview_file_fields.py +0 -0
  312. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/4e3738cdc34c_.py +0 -0
  313. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/4f2398ebcd49_.py +0 -0
  314. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/523ee9647bee_.py +0 -0
  315. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/54ee0d1d60ba_add_build_job_model.py +0 -0
  316. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/556526e47daa_.py +0 -0
  317. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/57222395f2be_add_statusautomation_import_last_revision.py +0 -0
  318. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/5798d2c9020b_change_person_role_to_choicetype.py +0 -0
  319. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/590aa1ffe731_add_notifications_enabled_flag.py +0 -0
  320. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/59a7445a966c_add_entity_is_shared.py +0 -0
  321. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/5a291251823c_add_max_retake_parameter.py +0 -0
  322. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/5ab9d7a75887_.py +0 -0
  323. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/5b0fcbb94f24_.py +0 -0
  324. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/5b7fa3e51701_add_is_client_allowed_flag_to_task_.py +0 -0
  325. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/5b980f0dc365_add_comment_links.py +0 -0
  326. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/5b9fd9ddfe43_add_homepage_and_contract_fields.py +0 -0
  327. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/5c0498e264bc_add_slack_fields.py +0 -0
  328. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/5e2ce62632a6_add_workflow_to_project.py +0 -0
  329. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/680c64565f9d_for_searchfiltergroup_is_shared.py +0 -0
  330. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/693cc511d28d_add_taskstatus_priority.py +0 -0
  331. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/6aa446ee4072_add_is_for_all_flage_to_playlists.py +0 -0
  332. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/6bd3b102d61b_.py +0 -0
  333. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/6c597e842afa_add_task_type_field_to_playlists.py +0 -0
  334. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/6d1b2c60f58b_add_milestone_model.py +0 -0
  335. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/6d7fa5a8e9a5_add_timesheets_locked_field_to_org.py +0 -0
  336. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/6eeaff945706_add_data_field_on_entity_links.py +0 -0
  337. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/6f6049877105_.py +0 -0
  338. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/7417c8eb70d8_add_for_entity_field_to_playlists.py +0 -0
  339. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/772a5e43f05b_.py +0 -0
  340. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/7748d3d22925_add_columns_to_searchfilter_table_to_.py +0 -0
  341. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/77d6820f494f_add_reply_to_notif.py +0 -0
  342. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/7b1f765677d8_.py +0 -0
  343. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/7bc746997e8d_add_slack_token_field_to_organisation.py +0 -0
  344. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/7dc79d4ed7cd_.py +0 -0
  345. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/818f7bda2528_.py +0 -0
  346. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/82e7f7a95e84_add_project_id_to_events.py +0 -0
  347. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/82ee682204ab_add_is_generated_from_ldap_column_to_.py +0 -0
  348. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/8588f254d6b8_add_archived_fields.py +0 -0
  349. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/8739ae9fa28b_add_for_client_field.py +0 -0
  350. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/87efceb6745b_add_ready_for_to_entity.py +0 -0
  351. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/892b264937ec_.py +0 -0
  352. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/8a1b4a1b7f4a_add_totp_columns_for_person.py +0 -0
  353. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/8e4f39e321f4_add_day_off_table.py +0 -0
  354. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/8e67c183bed7_add_preference_fields.py +0 -0
  355. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/8fbd40afbe5f_allow_to_set_float_values_for_.py +0 -0
  356. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/9010a64e5a2d_add_indices.py +0 -0
  357. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/9060dd4f6116_notification_uc.py +0 -0
  358. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/925771029620_.py +0 -0
  359. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/92b40d79ad3f_allow_message_attachments.py +0 -0
  360. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/92bdfe07e5f5_discord_integration.py +0 -0
  361. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/956659992419_add_columns_for_person_to_store_fido_.py +0 -0
  362. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/96c79d31e648_add_mail_otp_columns_for_person.py +0 -0
  363. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/96f58a4a2a58_person_partial_index_for_email_only_.py +0 -0
  364. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/971dbf5a0faf_add_short_name_for_asset_type_entity_.py +0 -0
  365. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/98c90621cf58_add_for_client_flag_to_playlist.py +0 -0
  366. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/99825b9cc778_.py +0 -0
  367. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/9a09467f9b2c_.py +0 -0
  368. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/9b85c14fa8a7_add_day_off_new_columns.py +0 -0
  369. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/9bd17364fc18_.py +0 -0
  370. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/9d3bb33c6fc6_add_department_keys_to_filter_models.py +0 -0
  371. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/9e5b3a9b0cee_add_new_column_metadatadescriptor_data_type_.py +0 -0
  372. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/9f8445f9b42c_add_man_days_fields.py +0 -0
  373. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/a23682ccc1f1_.py +0 -0
  374. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/a252a094e977_add_descriptions_for_entities_tasks_and_.py +0 -0
  375. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/a519c710877c_.py +0 -0
  376. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/a65bdadbae2f_.py +0 -0
  377. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/a66508788c53_add_nb_assets_ready.py +0 -0
  378. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/a6c25eed3ea1_add_login_failed_attemps_and_last_login_.py +0 -0
  379. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/a7c43f3fbc76_add_duration_column_to_the_preview_file.py +0 -0
  380. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/aa0a60033106_feedback_request.py +0 -0
  381. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/addbbefa7028_add_departments_link_to_metadata_.py +0 -0
  382. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/ae0127f2fc56_add_previewfile_width_and_previewfile_.py +0 -0
  383. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/af1790868e2c_.py +0 -0
  384. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/b45cb782bb9c_.py +0 -0
  385. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/b4dd0add5f79_.py +0 -0
  386. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/b8c0a0f9d054_drop_task_status_is_reviewable.py +0 -0
  387. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/b8ed0fb263f8_add_person_jti_and_jti_expiration_date.py +0 -0
  388. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/b97a71306fc8_add_is_casting_standby_column_to_entity.py +0 -0
  389. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/be56dc0fb760_for_is_shared_disallow_nullable.py +0 -0
  390. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/bf1347acdee2_.py +0 -0
  391. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/c49e41f1298b_add_previewbackground.py +0 -0
  392. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/c68c2a62cfac_add_mimetype_column_to_attachment.py +0 -0
  393. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/c726b98be194_.py +0 -0
  394. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/c81f3e83bdb5_.py +0 -0
  395. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/ca28796a2a62_add_is_done_field_to_the_task_model.py +0 -0
  396. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/cf3d365de164_add_entity_version_model.py +0 -0
  397. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/cf6cec6d6bf5_add_status_field_to_preview_file.py +0 -0
  398. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/d80267806131_task_status_new_column_is_default.py +0 -0
  399. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/d8dcd5196d57_add_casting_label.py +0 -0
  400. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/de8a3de227ef_.py +0 -0
  401. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/deeacd38d373_for_projecttaskstatuslink_set_default_.py +0 -0
  402. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/df1834485f57_.py +0 -0
  403. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/df9f8a147e80_change_file_size_to_big_integer.py +0 -0
  404. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/e1ef93f40d3d_.py +0 -0
  405. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/e29638428dfd_add_schedule_item_table.py +0 -0
  406. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/e3f6db74cc1e_.py +0 -0
  407. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/e839d6603c09_add_person_id_to_shot_history.py +0 -0
  408. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/ee2373fbe3a4_.py +0 -0
  409. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/f0567e8d0c62_.py +0 -0
  410. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/f0c6cbb61869_add_production_style_field.py +0 -0
  411. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/f344b867a911_for_description_of_entity_task_working_.py +0 -0
  412. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/f4ff5a73d283_add_person_ldap_uid.py +0 -0
  413. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/f5b113876a49_add_preferred_two_factor_authentication_.py +0 -0
  414. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/f5bdca075cdc_add_preview_download_flag_to_projects.py +0 -0
  415. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/f874ad5e898a_add_link_entity_type_task_type.py +0 -0
  416. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/f995b28fb749_.py +0 -0
  417. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/fb6b6f188497_.py +0 -0
  418. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/fb87feaaa094_add_missing_unique_constraints.py +0 -0
  419. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/fc322f908695_.py +0 -0
  420. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/fee7c696166e_.py +0 -0
  421. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/feffd3c5b806_introduce_concepts.py +0 -0
  422. {zou-0.20.8 → zou-0.20.12}/zou/migrations/versions/ffeed4956ab1_add_more_details_to_projects.py +0 -0
  423. {zou-0.20.8 → zou-0.20.12}/zou/remote/__init__.py +0 -0
  424. {zou-0.20.8 → zou-0.20.12}/zou/remote/config_payload.py +0 -0
  425. {zou-0.20.8 → zou-0.20.12}/zou/remote/normalize_movie.py +0 -0
  426. {zou-0.20.8 → zou-0.20.12}/zou/remote/playlist.py +0 -0
  427. {zou-0.20.8 → zou-0.20.12}/zou/utils/__init__.py +0 -0
  428. {zou-0.20.8 → zou-0.20.12}/zou/utils/movie.py +0 -0
  429. {zou-0.20.8 → zou-0.20.12}/zou.egg-info/dependency_links.txt +0 -0
  430. {zou-0.20.8 → zou-0.20.12}/zou.egg-info/entry_points.txt +0 -0
  431. {zou-0.20.8 → zou-0.20.12}/zou.egg-info/not-zip-safe +0 -0
  432. {zou-0.20.8 → zou-0.20.12}/zou.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.2
2
2
  Name: zou
3
- Version: 0.20.8
3
+ Version: 0.20.12
4
4
  Summary: API to store and manage the data of your animation production
5
5
  Home-page: https://zou.cg-wire.com
6
6
  Author: CG Wire
@@ -36,12 +36,12 @@ Requires-Dist: flask_mail==0.10.0
36
36
  Requires-Dist: flask_principal==0.4.0
37
37
  Requires-Dist: flask_restful==0.3.10
38
38
  Requires-Dist: flask_sqlalchemy==3.1.1
39
- Requires-Dist: flask-fs2[s3,swift]==0.7.27
39
+ Requires-Dist: flask-fs2[s3,swift]==0.7.28
40
40
  Requires-Dist: flask-jwt-extended==4.7.1
41
- Requires-Dist: flask-migrate==4.0.7
41
+ Requires-Dist: flask-migrate==4.1.0
42
42
  Requires-Dist: flask-socketio==5.5.1
43
43
  Requires-Dist: flask==3.1.0
44
- Requires-Dist: gazu==0.10.22
44
+ Requires-Dist: gazu==0.10.23
45
45
  Requires-Dist: gevent-websocket==0.10.1
46
46
  Requires-Dist: gevent==24.11.1
47
47
  Requires-Dist: gunicorn==23.0.0
@@ -52,14 +52,14 @@ Requires-Dist: ldap3==2.9.1
52
52
  Requires-Dist: matterhook==0.2
53
53
  Requires-Dist: meilisearch==0.33.1
54
54
  Requires-Dist: numpy==2.0.1; python_version == "3.9"
55
- Requires-Dist: numpy==2.2.1; python_version >= "3.10"
56
- Requires-Dist: opencv-python==4.10.0.84
55
+ Requires-Dist: numpy==2.2.2; python_version >= "3.10"
56
+ Requires-Dist: opencv-python==4.11.0.86
57
57
  Requires-Dist: OpenTimelineIO==0.17.0
58
58
  Requires-Dist: OpenTimelineIO-Plugins==0.17.0
59
- Requires-Dist: orjson==3.10.13
59
+ Requires-Dist: orjson==3.10.15
60
60
  Requires-Dist: pillow==11.1.0
61
61
  Requires-Dist: psutil==6.1.1
62
- Requires-Dist: psycopg[binary]==3.2.3
62
+ Requires-Dist: psycopg[binary]==3.2.4
63
63
  Requires-Dist: pyotp==2.9.0
64
64
  Requires-Dist: pysaml2==7.5.0
65
65
  Requires-Dist: python-nomad==2.0.1
@@ -71,7 +71,7 @@ Requires-Dist: requests==2.32.3
71
71
  Requires-Dist: rq==2.1.0
72
72
  Requires-Dist: slackclient==2.9.4
73
73
  Requires-Dist: sqlalchemy_utils==0.41.2
74
- Requires-Dist: sqlalchemy==2.0.36
74
+ Requires-Dist: sqlalchemy==2.0.37
75
75
  Requires-Dist: ua-parser==1.0.0
76
76
  Requires-Dist: werkzeug==3.1.3
77
77
  Provides-Extra: prod
@@ -87,11 +87,12 @@ Requires-Dist: pytest==8.3.4; extra == "test"
87
87
  Provides-Extra: monitoring
88
88
  Requires-Dist: prometheus-flask-exporter==0.23.1; extra == "monitoring"
89
89
  Requires-Dist: pygelf==0.4.2; extra == "monitoring"
90
- Requires-Dist: sentry-sdk==2.19.2; extra == "monitoring"
90
+ Requires-Dist: sentry-sdk==2.20.0; extra == "monitoring"
91
91
  Provides-Extra: lint
92
92
  Requires-Dist: autoflake==2.3.1; extra == "lint"
93
93
  Requires-Dist: black==24.10.0; extra == "lint"
94
94
  Requires-Dist: pre-commit==4.0.1; extra == "lint"
95
+ Dynamic: requires-python
95
96
 
96
97
  .. figure:: https://zou.cg-wire.com/kitsu.png
97
98
  :alt: Kitsu Logo
@@ -42,12 +42,12 @@ install_requires =
42
42
  flask_principal==0.4.0
43
43
  flask_restful==0.3.10
44
44
  flask_sqlalchemy==3.1.1
45
- flask-fs2[swift, s3]==0.7.27
45
+ flask-fs2[swift, s3]==0.7.28
46
46
  flask-jwt-extended==4.7.1
47
- flask-migrate==4.0.7
47
+ flask-migrate==4.1.0
48
48
  flask-socketio==5.5.1
49
49
  flask==3.1.0
50
- gazu==0.10.22
50
+ gazu==0.10.23
51
51
  gevent-websocket==0.10.1
52
52
  gevent==24.11.1
53
53
  gunicorn==23.0.0
@@ -58,14 +58,14 @@ install_requires =
58
58
  matterhook==0.2
59
59
  meilisearch==0.33.1
60
60
  numpy==2.0.1; python_version == '3.9'
61
- numpy==2.2.1; python_version >= '3.10'
62
- opencv-python==4.10.0.84
61
+ numpy==2.2.2; python_version >= '3.10'
62
+ opencv-python==4.11.0.86
63
63
  OpenTimelineIO==0.17.0
64
64
  OpenTimelineIO-Plugins==0.17.0
65
- orjson==3.10.13
65
+ orjson==3.10.15
66
66
  pillow==11.1.0
67
67
  psutil==6.1.1
68
- psycopg[binary]==3.2.3
68
+ psycopg[binary]==3.2.4
69
69
  pyotp==2.9.0
70
70
  pysaml2==7.5.0
71
71
  python-nomad==2.0.1
@@ -77,7 +77,7 @@ install_requires =
77
77
  rq==2.1.0
78
78
  slackclient==2.9.4
79
79
  sqlalchemy_utils==0.41.2
80
- sqlalchemy==2.0.36
80
+ sqlalchemy==2.0.37
81
81
  ua-parser==1.0.0
82
82
  werkzeug==3.1.3
83
83
 
@@ -101,7 +101,7 @@ test =
101
101
  monitoring =
102
102
  prometheus-flask-exporter==0.23.1
103
103
  pygelf==0.4.2
104
- sentry-sdk==2.19.2
104
+ sentry-sdk==2.20.0
105
105
  lint =
106
106
  autoflake==2.3.1
107
107
  black==24.10.0
@@ -0,0 +1 @@
1
+ __version__ = "0.20.12"
@@ -57,9 +57,7 @@ class DownloadAttachmentResource(Resource):
57
57
  )
58
58
  if attachment_file["comment_id"] is not None:
59
59
  comment = tasks_service.get_comment(attachment_file["comment_id"])
60
- task = tasks_service.get_task(comment["object_id"])
61
- user_service.check_project_access(task["project_id"])
62
- user_service.check_entity_access(task["entity_id"])
60
+ user_service.check_task_access(comment["object_id"])
63
61
  elif attachment_file["chat_message_id"] is not None:
64
62
  message = chats_service.get_chat_message(
65
63
  attachment_file["chat_message_id"]
@@ -122,9 +120,7 @@ class AckCommentResource(Resource):
122
120
  200:
123
121
  description: Comment acknowledged
124
122
  """
125
- task = tasks_service.get_task(task_id)
126
- user_service.check_project_access(task["project_id"])
127
- user_service.check_entity_access(task["entity_id"])
123
+ user_service.check_task_access(task_id)
128
124
  return comments_service.acknowledge_comment(comment_id)
129
125
 
130
126
 
@@ -193,9 +189,7 @@ class CommentTaskResource(Resource):
193
189
  links,
194
190
  ) = self.get_arguments()
195
191
 
196
- task = tasks_service.get_task(task_id)
197
- user_service.check_project_access(task["project_id"])
198
- user_service.check_entity_access(task["entity_id"])
192
+ user_service.check_task_access(task_id)
199
193
  user_service.check_task_status_access(task_status_id)
200
194
  files = request.files
201
195
 
@@ -496,9 +490,7 @@ class ReplyCommentResource(Resource, ArgsMixin):
496
490
  ]
497
491
  )
498
492
 
499
- task = tasks_service.get_task(task_id)
500
- user_service.check_project_access(task["project_id"])
501
- user_service.check_entity_access(task["entity_id"])
493
+ user_service.check_task_access(task_id)
502
494
  return comments_service.reply_comment(comment_id, args["text"])
503
495
 
504
496
 
@@ -537,9 +529,7 @@ class DeleteReplyCommentResource(Resource):
537
529
  200:
538
530
  description: Given comment reply deleted
539
531
  """
540
- task = tasks_service.get_task(task_id)
541
- user_service.check_project_access(task["project_id"])
542
- user_service.check_entity_access(task["entity_id"])
532
+ user_service.check_task_access(task_id)
543
533
  reply = comments_service.get_reply(comment_id, reply_id)
544
534
  current_user = persons_service.get_current_user()
545
535
  if reply["person_id"] != current_user["id"]:
@@ -20,15 +20,12 @@ class AttachmentFileResource(BaseModelResource):
20
20
  attachment_file = instance
21
21
  if attachment_file["comment_id"] is not None:
22
22
  comment = tasks_service.get_comment(attachment_file["comment_id"])
23
- task = tasks_service.get_task(comment["object_id"])
24
- user_service.check_project_access(task["project_id"])
25
- user_service.check_entity_access(task["entity_id"])
23
+ user_service.check_task_access(comment["object_id"])
26
24
  elif attachment_file["chat_message_id"] is not None:
27
25
  message = chats_service.get_chat_message(
28
26
  attachment_file["chat_message_id"]
29
27
  )
30
28
  chat = chats_service.get_chat(message["chat_id"])
31
- print(chat)
32
29
  user_service.check_entity_access(chat["object_id"])
33
30
  else:
34
31
  raise PermissionDenied()
@@ -207,6 +207,8 @@ class ProjectTaskTypeLinksResource(Resource, ArgsMixin):
207
207
  ]
208
208
  )
209
209
 
210
+ user_service.check_manager_project_access(args["project_id"])
211
+
210
212
  task_type_link = projects_service.create_project_task_type_link(
211
213
  args["project_id"],
212
214
  args["task_type_id"],
@@ -234,6 +236,8 @@ class ProjectTaskStatusLinksResource(Resource, ArgsMixin):
234
236
  ]
235
237
  )
236
238
 
239
+ user_service.check_manager_project_access(args["project_id"])
240
+
237
241
  task_status_link = projects_service.create_project_task_status_link(
238
242
  args["project_id"],
239
243
  args["task_status_id"],
@@ -8,7 +8,7 @@ from zou.app.blueprints.crud.base import BaseModelsResource, BaseModelResource
8
8
  from zou.app.models.entity import Entity
9
9
  from zou.app.models.project import Project
10
10
  from zou.app.models.working_file import WorkingFile
11
- from zou.app.services import user_service, tasks_service, files_service
11
+ from zou.app.services import user_service, files_service
12
12
  from zou.app.utils import permissions
13
13
 
14
14
 
@@ -46,16 +46,12 @@ class WorkingFileResource(BaseModelResource):
46
46
 
47
47
  def check_read_permissions(self, instance):
48
48
  working_file = files_service.get_working_file(instance["id"])
49
- task = tasks_service.get_task(working_file["task_id"])
50
- user_service.check_project_access(task["project_id"])
51
- user_service.check_entity_access(task["entity_id"])
49
+ user_service.check_task_access(working_file["task_id"])
52
50
  return True
53
51
 
54
52
  def check_update_permissions(self, instance, data):
55
53
  working_file = files_service.get_working_file(instance["id"])
56
- task = tasks_service.get_task(working_file["task_id"])
57
- user_service.check_project_access(task["project_id"])
58
- user_service.check_entity_access(task["entity_id"])
54
+ user_service.check_task_access(working_file["task_id"])
59
55
  return True
60
56
 
61
57
  @jwt_required()
@@ -91,9 +91,7 @@ class WorkingFileFileResource(Resource):
91
91
 
92
92
  def check_access(self, working_file_id):
93
93
  working_file = files_service.get_working_file(working_file_id)
94
- task = tasks_service.get_task(working_file["task_id"])
95
- user_service.check_project_access(task["project_id"])
96
- user_service.check_entity_access(task["entity_id"])
94
+ user_service.check_task_access(working_file["task_id"])
97
95
  return working_file
98
96
 
99
97
  def save_uploaded_file_in_temporary_folder(self, working_file_id):
@@ -556,10 +554,8 @@ class LastWorkingFilesResource(Resource):
556
554
  description: Last working files revision for each file name for given task
557
555
  """
558
556
  result = {}
559
- task = tasks_service.get_task(task_id)
560
- user_service.check_project_access(task["project_id"])
561
- user_service.check_entity_access(task["entity_id"])
562
- result = files_service.get_last_working_files_for_task(task["id"])
557
+ user_service.check_task_access(task_id)
558
+ result = files_service.get_last_working_files_for_task(task_id)
563
559
 
564
560
  return result
565
561
 
@@ -588,10 +584,8 @@ class TaskWorkingFilesResource(Resource):
588
584
  description: Last working files revision for each file name for given task
589
585
  """
590
586
  result = {}
591
- task = tasks_service.get_task(task_id)
592
- user_service.check_project_access(task["project_id"])
593
- user_service.check_entity_access(task["entity_id"])
594
- result = files_service.get_working_files_for_task(task["id"])
587
+ user_service.check_task_access(task_id)
588
+ result = files_service.get_working_files_for_task(task_id)
595
589
 
596
590
  return result
597
591
 
@@ -774,9 +768,7 @@ class ModifiedFileResource(Resource):
774
768
  description: Working file modification date updated
775
769
  """
776
770
  working_file = files_service.get_working_file(working_file_id)
777
- task = tasks_service.get_task(working_file["task_id"])
778
- user_service.check_project_access(task["project_id"])
779
- user_service.check_entity_access(task["entity_id"])
771
+ user_service.check_task_access(working_file["task_id"])
780
772
  working_file = files_service.update_working_file(
781
773
  working_file_id,
782
774
  {"updated_at": date_helpers.get_utc_now_datetime()},
@@ -827,9 +819,7 @@ class CommentWorkingFileResource(Resource, ArgsMixin):
827
819
  )
828
820
 
829
821
  working_file = files_service.get_working_file(working_file_id)
830
- task = tasks_service.get_task(working_file["task_id"])
831
- user_service.check_project_access(task["project_id"])
832
- user_service.check_entity_access(task["entity_id"])
822
+ user_service.check_task_access(working_file["task_id"])
833
823
  working_file = self.update_comment(working_file_id, args["comment"])
834
824
  return working_file
835
825
 
@@ -2,7 +2,8 @@ from flask import Blueprint
2
2
  from zou.app.utils.api import configure_api_from_blueprint
3
3
 
4
4
  from zou.app.blueprints.previews.resources import (
5
- AddCommentsPreviewsResource,
5
+ AddTaskBatchCommentResource,
6
+ AddTasksBatchCommentResource,
6
7
  AttachmentThumbnailResource,
7
8
  CreatePreviewFilePictureResource,
8
9
  PreviewFileLowMovieResource,
@@ -39,8 +40,12 @@ routes = [
39
40
  CreatePreviewFilePictureResource,
40
41
  ),
41
42
  (
42
- "/actions/tasks/<task_id>/add-comments-previews",
43
- AddCommentsPreviewsResource,
43
+ "/actions/tasks/<task_id>/batch-comment",
44
+ AddTaskBatchCommentResource,
45
+ ),
46
+ (
47
+ "/actions/tasks/batch-comment",
48
+ AddTasksBatchCommentResource,
44
49
  ),
45
50
  (
46
51
  "/movies/originals/preview-files/<instance_id>.mp4",
@@ -397,11 +397,8 @@ class CreatePreviewFilePictureResource(
397
397
  200:
398
398
  description: Preview added
399
399
  """
400
- if not self.is_exist(instance_id):
401
- abort(404)
402
-
403
- if not self.is_allowed(instance_id):
404
- abort(403)
400
+ self.is_exist(instance_id)
401
+ self.is_allowed(instance_id)
405
402
 
406
403
  return (
407
404
  self.process_uploaded_file(
@@ -421,10 +418,8 @@ class CreatePreviewFilePictureResource(
421
418
  )
422
419
  raise PreviewFileReuploadNotAllowedException
423
420
 
424
- task = tasks_service.get_task(preview_file["task_id"])
425
421
  try:
426
- user_service.check_project_access(task["project_id"])
427
- user_service.check_entity_access(task["entity_id"])
422
+ user_service.check_task_access(preview_file["task_id"])
428
423
  return True
429
424
  except permissions.PermissionDenied:
430
425
  return False
@@ -436,47 +431,17 @@ class CreatePreviewFilePictureResource(
436
431
  return files_service.get_preview_file(preview_file_id) is not None
437
432
 
438
433
 
439
- class AddCommentsPreviewsResource(
440
- BaseNewPreviewFilePicture, Resource, ArgsMixin
441
- ):
434
+ class BaseBatchComment(BaseNewPreviewFilePicture, ArgsMixin):
442
435
  """
443
- Creates new comments for given task. Each comments requires a text, a
444
- task_status and a person as arguments.
436
+ Base class to add comments/previews/attachments.
445
437
  """
446
438
 
447
- @jwt_required()
448
- def post(self, task_id):
439
+ def get_comments_args(self):
449
440
  """
450
- Creates new comments for given task. Each comments requires a text, a
451
- task_status and a person as arguments.
452
- ---
453
- tags:
454
- - Comments
455
- description: Creates new comments for given task. Each comments requires
456
- a text, a task_status and a person as arguments.
457
- parameters:
458
- - in: path
459
- name: task_id
460
- required: True
461
- type: string
462
- format: UUID
463
- x-example: a24a6ea4-ce75-4665-a070-57453082c25
464
- - in: body
465
- name: Comment
466
- description: person ID, name, comment, revision and change status of task
467
- schema:
468
- type: object
469
- required:
470
- - comments
471
- properties:
472
- comments:
473
- type: string
474
- responses:
475
- 201:
476
- description: New comments created
441
+ Return comments arguments.
477
442
  """
478
443
  if request.is_json:
479
- args = self.get_args(
444
+ return self.get_args(
480
445
  [
481
446
  {
482
447
  "name": "comments",
@@ -500,22 +465,31 @@ class AddCommentsPreviewsResource(
500
465
  ],
501
466
  )
502
467
  args["comments"] = json.loads(args["comments"])
468
+ return args
503
469
 
504
- task = tasks_service.get_task(task_id)
505
- user_service.check_project_access(task["project_id"])
506
- user_service.check_entity_access(task["entity_id"])
470
+ def process_comments(self, task_id=None):
471
+ """
472
+ Process comments.
473
+ """
474
+ args = self.get_comments_args()
475
+
476
+ if task_id is not None:
477
+ user_service.check_task_access(task_id)
507
478
 
508
479
  new_comments = []
509
480
  for i, comment in enumerate(args["comments"]):
510
481
  user_service.check_task_status_access(comment["task_status_id"])
511
482
 
483
+ if task_id is None:
484
+ user_service.check_task_access(comment["task_id"])
485
+
512
486
  if not permissions.has_manager_permissions():
513
487
  comment["person_id"] = None
514
488
  comment["created_at"] = None
515
489
 
516
490
  new_comment = comments_service.create_comment(
517
491
  comment.get("person_id", None),
518
- task_id,
492
+ task_id or comment["task_id"],
519
493
  comment["task_status_id"],
520
494
  comment["text"],
521
495
  comment.get("checklist", []),
@@ -537,7 +511,7 @@ class AddCommentsPreviewsResource(
537
511
  new_preview_file = tasks_service.add_preview_file_to_comment(
538
512
  new_comment["id"],
539
513
  new_comment["person_id"],
540
- task_id,
514
+ task_id or comment["task_id"],
541
515
  )
542
516
  new_preview_file = self.process_uploaded_file(
543
517
  new_preview_file["id"],
@@ -552,6 +526,80 @@ class AddCommentsPreviewsResource(
552
526
  return new_comments, 201
553
527
 
554
528
 
529
+ class AddTaskBatchCommentResource(BaseBatchComment, Resource):
530
+ """
531
+ Creates new comments for given task. Each comments requires a text, a
532
+ task_status and a person as arguments.
533
+ """
534
+
535
+ @jwt_required()
536
+ def post(self, task_id):
537
+ """
538
+ Creates new comments for given task. Each comments requires a text, a
539
+ task_status and a person as arguments.
540
+ ---
541
+ tags:
542
+ - Comments
543
+ description: Creates new comments for given task. Each comments requires
544
+ a text, a task_status and a person as arguments.
545
+ parameters:
546
+ - in: path
547
+ name: task_id
548
+ required: True
549
+ type: string
550
+ format: UUID
551
+ x-example: a24a6ea4-ce75-4665-a070-57453082c25
552
+ - in: body
553
+ name: Comment
554
+ description: person ID, name, comment, revision and change status of task
555
+ schema:
556
+ type: object
557
+ required:
558
+ - comments
559
+ properties:
560
+ comments:
561
+ type: string
562
+ responses:
563
+ 201:
564
+ description: New comments created
565
+ """
566
+ return self.process_comments(task_id)
567
+
568
+
569
+ class AddTasksBatchCommentResource(BaseBatchComment, Resource):
570
+ """
571
+ Creates new comments for given tasks. Each comments requires a task_id,
572
+ text, a task_status and a person as arguments.
573
+ """
574
+
575
+ @jwt_required()
576
+ def post(self):
577
+ """
578
+ Creates new comments for given task. Each comments requires a task_id,
579
+ text, a task_status and a person as arguments.
580
+ ---
581
+ tags:
582
+ - Comments
583
+ description: Creates new comments for given task. Each comments requires
584
+ a task_id, a text, a task_status and a person as arguments.
585
+ parameters:
586
+ - in: body
587
+ name: Comment
588
+ description: person ID, name, comment, revision and change status of task
589
+ schema:
590
+ type: object
591
+ required:
592
+ - comments
593
+ properties:
594
+ comments:
595
+ type: string
596
+ responses:
597
+ 201:
598
+ description: New comments created
599
+ """
600
+ return self.process_comments()
601
+
602
+
555
603
  class BasePreviewFileResource(Resource):
556
604
  """
557
605
  Base class to download a preview file.
@@ -564,9 +612,7 @@ class BasePreviewFileResource(Resource):
564
612
 
565
613
  def is_allowed(self, preview_file_id):
566
614
  self.preview_file = files_service.get_preview_file(preview_file_id)
567
- task = tasks_service.get_task(self.preview_file["task_id"])
568
- user_service.check_project_access(task["project_id"])
569
- user_service.check_entity_access(task["entity_id"])
615
+ user_service.check_task_access(self.preview_file["task_id"])
570
616
  self.last_modified = date_helpers.get_datetime_from_string(
571
617
  self.preview_file["updated_at"]
572
618
  )
@@ -843,9 +889,7 @@ class AttachmentThumbnailResource(Resource):
843
889
  comment = tasks_service.get_comment(
844
890
  self.attachment_file["comment_id"]
845
891
  )
846
- task = tasks_service.get_task(comment["object_id"])
847
- user_service.check_project_access(task["project_id"])
848
- user_service.check_entity_access(task["entity_id"])
892
+ user_service.check_task_access(comment["object_id"])
849
893
  elif self.attachment_file["chat_message_id"] is not None:
850
894
  message = chats_service.get_chat_message(
851
895
  self.attachment_file["chat_message_id"]
@@ -1272,9 +1316,7 @@ class UpdatePreviewPositionResource(Resource, ArgsMixin):
1272
1316
  """
1273
1317
  args = self.get_args([{"name": "position", "default": 0, "type": int}])
1274
1318
  preview_file = files_service.get_preview_file(preview_file_id)
1275
- task = tasks_service.get_task(preview_file["task_id"])
1276
- user_service.check_manager_project_access(task["project_id"])
1277
- user_service.check_entity_access(task["entity_id"])
1319
+ user_service.check_task_access(preview_file["task_id"])
1278
1320
  return preview_files_service.update_preview_file_position(
1279
1321
  preview_file_id, args["position"]
1280
1322
  )
@@ -1424,9 +1466,7 @@ class ExtractTileFromPreview(Resource):
1424
1466
  @jwt_required()
1425
1467
  def get(self, preview_file_id):
1426
1468
  preview_file = files_service.get_preview_file(preview_file_id)
1427
- task = tasks_service.get_task(preview_file["task_id"])
1428
- user_service.check_manager_project_access(task["project_id"])
1429
- user_service.check_entity_access(task["entity_id"])
1469
+ user_service.check_task_access(preview_file["task_id"])
1430
1470
  extracted_tile_path = (
1431
1471
  preview_files_service.extract_tile_from_preview_file(preview_file)
1432
1472
  )
@@ -11,6 +11,7 @@ from zou.app.services import (
11
11
  )
12
12
  from zou.app.utils import permissions
13
13
  from zou.app.services.exception import WrongParameterException
14
+ from zou.app.models.metadata_descriptor import METADATA_DESCRIPTOR_TYPES
14
15
 
15
16
 
16
17
  class OpenProjectsResource(Resource, ArgsMixin):
@@ -715,6 +716,10 @@ class ProductionMetadataDescriptorsResource(Resource, ArgsMixin):
715
716
  if len(args["name"]) == 0:
716
717
  raise WrongParameterException("Name cannot be empty.")
717
718
 
719
+ types = [type_name for type_name, _ in METADATA_DESCRIPTOR_TYPES]
720
+ if args["data_type"] not in types:
721
+ raise WrongParameterException("Invalid data_type")
722
+
718
723
  return (
719
724
  projects_service.add_metadata_descriptor(
720
725
  project_id,
@@ -828,6 +833,10 @@ class ProductionMetadataDescriptorResource(Resource, ArgsMixin):
828
833
  if len(args["name"]) == 0:
829
834
  raise WrongParameterException("Name cannot be empty.")
830
835
 
836
+ types = [type_name for type_name, _ in METADATA_DESCRIPTOR_TYPES]
837
+ if args["data_type"] not in types:
838
+ raise WrongParameterException("Invalid data_type")
839
+
831
840
  args["for_client"] = args["for_client"] == "True"
832
841
 
833
842
  return projects_service.update_metadata_descriptor(descriptor_id, args)