zou 0.20.68__tar.gz → 0.20.69__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 (485) hide show
  1. {zou-0.20.68/zou.egg-info → zou-0.20.69}/PKG-INFO +4 -4
  2. {zou-0.20.68 → zou-0.20.69}/setup.cfg +3 -3
  3. zou-0.20.69/zou/__init__.py +1 -0
  4. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/comments/resources.py +21 -8
  5. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/shots/resources.py +124 -72
  6. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/tasks/resources.py +1 -1
  7. {zou-0.20.68 → zou-0.20.69}/zou/app/models/attachment_file.py +4 -0
  8. {zou-0.20.68 → zou-0.20.69}/zou/app/services/comments_service.py +41 -9
  9. {zou-0.20.68 → zou-0.20.69}/zou/app/services/tasks_service.py +1 -0
  10. zou-0.20.69/zou/migrations/versions/1b0ab951adca_add_reply_id_to_attachments.py +44 -0
  11. {zou-0.20.68 → zou-0.20.69/zou.egg-info}/PKG-INFO +4 -4
  12. {zou-0.20.68 → zou-0.20.69}/zou.egg-info/SOURCES.txt +1 -0
  13. {zou-0.20.68 → zou-0.20.69}/zou.egg-info/requires.txt +3 -3
  14. zou-0.20.68/zou/__init__.py +0 -1
  15. {zou-0.20.68 → zou-0.20.69}/LICENSE +0 -0
  16. {zou-0.20.68 → zou-0.20.69}/README.rst +0 -0
  17. {zou-0.20.68 → zou-0.20.69}/pyproject.toml +0 -0
  18. {zou-0.20.68 → zou-0.20.69}/setup.py +0 -0
  19. {zou-0.20.68 → zou-0.20.69}/zou/app/__init__.py +0 -0
  20. {zou-0.20.68 → zou-0.20.69}/zou/app/api.py +0 -0
  21. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/__init__.py +0 -0
  22. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/assets/__init__.py +0 -0
  23. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/assets/resources.py +0 -0
  24. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/auth/__init__.py +0 -0
  25. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/auth/resources.py +0 -0
  26. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/breakdown/__init__.py +0 -0
  27. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/breakdown/resources.py +0 -0
  28. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/chats/__init__.py +0 -0
  29. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/chats/resources.py +0 -0
  30. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/comments/__init__.py +0 -0
  31. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/concepts/__init__.py +0 -0
  32. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/concepts/resources.py +0 -0
  33. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/crud/__init__.py +0 -0
  34. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/crud/asset_instance.py +0 -0
  35. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/crud/attachment_file.py +0 -0
  36. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/crud/base.py +0 -0
  37. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/crud/budget.py +0 -0
  38. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/crud/budget_entry.py +0 -0
  39. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/crud/chat.py +0 -0
  40. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/crud/chat_message.py +0 -0
  41. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/crud/comments.py +0 -0
  42. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/crud/custom_action.py +0 -0
  43. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/crud/day_off.py +0 -0
  44. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/crud/department.py +0 -0
  45. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/crud/entity.py +0 -0
  46. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/crud/entity_link.py +0 -0
  47. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/crud/entity_type.py +0 -0
  48. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/crud/event.py +0 -0
  49. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/crud/file_status.py +0 -0
  50. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/crud/hardware_item.py +0 -0
  51. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/crud/metadata_descriptor.py +0 -0
  52. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/crud/milestone.py +0 -0
  53. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/crud/news.py +0 -0
  54. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/crud/notification.py +0 -0
  55. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/crud/organisation.py +0 -0
  56. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/crud/output_file.py +0 -0
  57. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/crud/output_type.py +0 -0
  58. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/crud/person.py +0 -0
  59. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/crud/playlist.py +0 -0
  60. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/crud/plugin.py +0 -0
  61. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/crud/preview_background_file.py +0 -0
  62. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/crud/preview_file.py +0 -0
  63. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/crud/production_schedule_version.py +0 -0
  64. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/crud/project.py +0 -0
  65. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/crud/project_status.py +0 -0
  66. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/crud/salary_scale.py +0 -0
  67. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/crud/schedule_item.py +0 -0
  68. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/crud/search_filter.py +0 -0
  69. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/crud/search_filter_group.py +0 -0
  70. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/crud/software.py +0 -0
  71. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/crud/status_automation.py +0 -0
  72. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/crud/studio.py +0 -0
  73. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/crud/subscription.py +0 -0
  74. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/crud/task.py +0 -0
  75. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/crud/task_status.py +0 -0
  76. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/crud/task_type.py +0 -0
  77. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/crud/time_spent.py +0 -0
  78. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/crud/working_file.py +0 -0
  79. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/departments/__init__.py +0 -0
  80. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/departments/resources.py +0 -0
  81. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/edits/__init__.py +0 -0
  82. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/edits/resources.py +0 -0
  83. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/entities/__init__.py +0 -0
  84. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/entities/resources.py +0 -0
  85. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/events/__init__.py +0 -0
  86. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/events/resources.py +0 -0
  87. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/export/__init__.py +0 -0
  88. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/export/csv/__init__.py +0 -0
  89. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/export/csv/assets.py +0 -0
  90. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/export/csv/base.py +0 -0
  91. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/export/csv/casting.py +0 -0
  92. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/export/csv/edits.py +0 -0
  93. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/export/csv/persons.py +0 -0
  94. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/export/csv/playlists.py +0 -0
  95. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/export/csv/projects.py +0 -0
  96. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/export/csv/shots.py +0 -0
  97. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/export/csv/task_types.py +0 -0
  98. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/export/csv/tasks.py +0 -0
  99. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/export/csv/time_spents.py +0 -0
  100. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/files/__init__.py +0 -0
  101. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/files/resources.py +0 -0
  102. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/index/__init__.py +0 -0
  103. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/index/resources.py +0 -0
  104. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/news/__init__.py +0 -0
  105. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/news/resources.py +0 -0
  106. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/persons/__init__.py +0 -0
  107. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/persons/resources.py +0 -0
  108. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/playlists/__init__.py +0 -0
  109. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/playlists/resources.py +0 -0
  110. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/previews/__init__.py +0 -0
  111. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/previews/resources.py +0 -0
  112. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/projects/__init__.py +0 -0
  113. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/projects/resources.py +0 -0
  114. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/search/__init__.py +0 -0
  115. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/search/resources.py +0 -0
  116. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/shots/__init__.py +0 -0
  117. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/source/__init__.py +0 -0
  118. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/source/csv/__init__.py +0 -0
  119. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/source/csv/assets.py +0 -0
  120. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/source/csv/base.py +0 -0
  121. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/source/csv/casting.py +0 -0
  122. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/source/csv/edits.py +0 -0
  123. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/source/csv/persons.py +0 -0
  124. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/source/csv/shots.py +0 -0
  125. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/source/csv/task_type_estimations.py +0 -0
  126. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/source/kitsu.py +0 -0
  127. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/source/otio.py +0 -0
  128. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/source/shotgun/__init__.py +0 -0
  129. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/source/shotgun/assets.py +0 -0
  130. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/source/shotgun/base.py +0 -0
  131. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/source/shotgun/episode.py +0 -0
  132. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/source/shotgun/exception.py +0 -0
  133. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/source/shotgun/import_errors.py +0 -0
  134. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/source/shotgun/notes.py +0 -0
  135. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/source/shotgun/person.py +0 -0
  136. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/source/shotgun/project.py +0 -0
  137. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/source/shotgun/scene.py +0 -0
  138. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/source/shotgun/sequence.py +0 -0
  139. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/source/shotgun/shot.py +0 -0
  140. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/source/shotgun/status.py +0 -0
  141. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/source/shotgun/steps.py +0 -0
  142. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/source/shotgun/tasks.py +0 -0
  143. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/source/shotgun/team.py +0 -0
  144. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/source/shotgun/versions.py +0 -0
  145. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/tasks/__init__.py +0 -0
  146. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/user/__init__.py +0 -0
  147. {zou-0.20.68 → zou-0.20.69}/zou/app/blueprints/user/resources.py +0 -0
  148. {zou-0.20.68 → zou-0.20.69}/zou/app/config.py +0 -0
  149. {zou-0.20.68 → zou-0.20.69}/zou/app/file_trees/default.json +0 -0
  150. {zou-0.20.68 → zou-0.20.69}/zou/app/file_trees/simple.json +0 -0
  151. {zou-0.20.68 → zou-0.20.69}/zou/app/indexer/__init__.py +0 -0
  152. {zou-0.20.68 → zou-0.20.69}/zou/app/indexer/indexing.py +0 -0
  153. {zou-0.20.68 → zou-0.20.69}/zou/app/mixin.py +0 -0
  154. {zou-0.20.68 → zou-0.20.69}/zou/app/models/__init__.py +0 -0
  155. {zou-0.20.68 → zou-0.20.69}/zou/app/models/asset_instance.py +0 -0
  156. {zou-0.20.68 → zou-0.20.69}/zou/app/models/base.py +0 -0
  157. {zou-0.20.68 → zou-0.20.69}/zou/app/models/budget.py +0 -0
  158. {zou-0.20.68 → zou-0.20.69}/zou/app/models/budget_entry.py +0 -0
  159. {zou-0.20.68 → zou-0.20.69}/zou/app/models/build_job.py +0 -0
  160. {zou-0.20.68 → zou-0.20.69}/zou/app/models/chat.py +0 -0
  161. {zou-0.20.68 → zou-0.20.69}/zou/app/models/chat_message.py +0 -0
  162. {zou-0.20.68 → zou-0.20.69}/zou/app/models/comment.py +0 -0
  163. {zou-0.20.68 → zou-0.20.69}/zou/app/models/custom_action.py +0 -0
  164. {zou-0.20.68 → zou-0.20.69}/zou/app/models/data_import_error.py +0 -0
  165. {zou-0.20.68 → zou-0.20.69}/zou/app/models/day_off.py +0 -0
  166. {zou-0.20.68 → zou-0.20.69}/zou/app/models/department.py +0 -0
  167. {zou-0.20.68 → zou-0.20.69}/zou/app/models/desktop_login_log.py +0 -0
  168. {zou-0.20.68 → zou-0.20.69}/zou/app/models/entity.py +0 -0
  169. {zou-0.20.68 → zou-0.20.69}/zou/app/models/entity_type.py +0 -0
  170. {zou-0.20.68 → zou-0.20.69}/zou/app/models/event.py +0 -0
  171. {zou-0.20.68 → zou-0.20.69}/zou/app/models/file_status.py +0 -0
  172. {zou-0.20.68 → zou-0.20.69}/zou/app/models/hardware_item.py +0 -0
  173. {zou-0.20.68 → zou-0.20.69}/zou/app/models/login_log.py +0 -0
  174. {zou-0.20.68 → zou-0.20.69}/zou/app/models/metadata_descriptor.py +0 -0
  175. {zou-0.20.68 → zou-0.20.69}/zou/app/models/milestone.py +0 -0
  176. {zou-0.20.68 → zou-0.20.69}/zou/app/models/news.py +0 -0
  177. {zou-0.20.68 → zou-0.20.69}/zou/app/models/notification.py +0 -0
  178. {zou-0.20.68 → zou-0.20.69}/zou/app/models/organisation.py +0 -0
  179. {zou-0.20.68 → zou-0.20.69}/zou/app/models/output_file.py +0 -0
  180. {zou-0.20.68 → zou-0.20.69}/zou/app/models/output_type.py +0 -0
  181. {zou-0.20.68 → zou-0.20.69}/zou/app/models/person.py +0 -0
  182. {zou-0.20.68 → zou-0.20.69}/zou/app/models/playlist.py +0 -0
  183. {zou-0.20.68 → zou-0.20.69}/zou/app/models/plugin.py +0 -0
  184. {zou-0.20.68 → zou-0.20.69}/zou/app/models/preview_background_file.py +0 -0
  185. {zou-0.20.68 → zou-0.20.69}/zou/app/models/preview_file.py +0 -0
  186. {zou-0.20.68 → zou-0.20.69}/zou/app/models/production_schedule_version.py +0 -0
  187. {zou-0.20.68 → zou-0.20.69}/zou/app/models/project.py +0 -0
  188. {zou-0.20.68 → zou-0.20.69}/zou/app/models/project_status.py +0 -0
  189. {zou-0.20.68 → zou-0.20.69}/zou/app/models/salary_scale.py +0 -0
  190. {zou-0.20.68 → zou-0.20.69}/zou/app/models/schedule_item.py +0 -0
  191. {zou-0.20.68 → zou-0.20.69}/zou/app/models/search_filter.py +0 -0
  192. {zou-0.20.68 → zou-0.20.69}/zou/app/models/search_filter_group.py +0 -0
  193. {zou-0.20.68 → zou-0.20.69}/zou/app/models/serializer.py +0 -0
  194. {zou-0.20.68 → zou-0.20.69}/zou/app/models/software.py +0 -0
  195. {zou-0.20.68 → zou-0.20.69}/zou/app/models/status_automation.py +0 -0
  196. {zou-0.20.68 → zou-0.20.69}/zou/app/models/studio.py +0 -0
  197. {zou-0.20.68 → zou-0.20.69}/zou/app/models/subscription.py +0 -0
  198. {zou-0.20.68 → zou-0.20.69}/zou/app/models/task.py +0 -0
  199. {zou-0.20.68 → zou-0.20.69}/zou/app/models/task_status.py +0 -0
  200. {zou-0.20.68 → zou-0.20.69}/zou/app/models/task_type.py +0 -0
  201. {zou-0.20.68 → zou-0.20.69}/zou/app/models/time_spent.py +0 -0
  202. {zou-0.20.68 → zou-0.20.69}/zou/app/models/working_file.py +0 -0
  203. {zou-0.20.68 → zou-0.20.69}/zou/app/services/__init__.py +0 -0
  204. {zou-0.20.68 → zou-0.20.69}/zou/app/services/assets_service.py +0 -0
  205. {zou-0.20.68 → zou-0.20.69}/zou/app/services/auth_service.py +0 -0
  206. {zou-0.20.68 → zou-0.20.69}/zou/app/services/backup_service.py +0 -0
  207. {zou-0.20.68 → zou-0.20.69}/zou/app/services/base_service.py +0 -0
  208. {zou-0.20.68 → zou-0.20.69}/zou/app/services/breakdown_service.py +0 -0
  209. {zou-0.20.68 → zou-0.20.69}/zou/app/services/budget_service.py +0 -0
  210. {zou-0.20.68 → zou-0.20.69}/zou/app/services/chats_service.py +0 -0
  211. {zou-0.20.68 → zou-0.20.69}/zou/app/services/concepts_service.py +0 -0
  212. {zou-0.20.68 → zou-0.20.69}/zou/app/services/custom_actions_service.py +0 -0
  213. {zou-0.20.68 → zou-0.20.69}/zou/app/services/deletion_service.py +0 -0
  214. {zou-0.20.68 → zou-0.20.69}/zou/app/services/departments_service.py +0 -0
  215. {zou-0.20.68 → zou-0.20.69}/zou/app/services/edits_service.py +0 -0
  216. {zou-0.20.68 → zou-0.20.69}/zou/app/services/emails_service.py +0 -0
  217. {zou-0.20.68 → zou-0.20.69}/zou/app/services/entities_service.py +0 -0
  218. {zou-0.20.68 → zou-0.20.69}/zou/app/services/events_service.py +0 -0
  219. {zou-0.20.68 → zou-0.20.69}/zou/app/services/exception.py +0 -0
  220. {zou-0.20.68 → zou-0.20.69}/zou/app/services/file_tree_service.py +0 -0
  221. {zou-0.20.68 → zou-0.20.69}/zou/app/services/files_service.py +0 -0
  222. {zou-0.20.68 → zou-0.20.69}/zou/app/services/index_service.py +0 -0
  223. {zou-0.20.68 → zou-0.20.69}/zou/app/services/names_service.py +0 -0
  224. {zou-0.20.68 → zou-0.20.69}/zou/app/services/news_service.py +0 -0
  225. {zou-0.20.68 → zou-0.20.69}/zou/app/services/notifications_service.py +0 -0
  226. {zou-0.20.68 → zou-0.20.69}/zou/app/services/persons_service.py +0 -0
  227. {zou-0.20.68 → zou-0.20.69}/zou/app/services/playlists_service.py +0 -0
  228. {zou-0.20.68 → zou-0.20.69}/zou/app/services/plugins_service.py +0 -0
  229. {zou-0.20.68 → zou-0.20.69}/zou/app/services/preview_files_service.py +0 -0
  230. {zou-0.20.68 → zou-0.20.69}/zou/app/services/projects_service.py +0 -0
  231. {zou-0.20.68 → zou-0.20.69}/zou/app/services/scenes_service.py +0 -0
  232. {zou-0.20.68 → zou-0.20.69}/zou/app/services/schedule_service.py +0 -0
  233. {zou-0.20.68 → zou-0.20.69}/zou/app/services/shots_service.py +0 -0
  234. {zou-0.20.68 → zou-0.20.69}/zou/app/services/stats_service.py +0 -0
  235. {zou-0.20.68 → zou-0.20.69}/zou/app/services/status_automations_service.py +0 -0
  236. {zou-0.20.68 → zou-0.20.69}/zou/app/services/sync_service.py +0 -0
  237. {zou-0.20.68 → zou-0.20.69}/zou/app/services/telemetry_services.py +0 -0
  238. {zou-0.20.68 → zou-0.20.69}/zou/app/services/time_spents_service.py +0 -0
  239. {zou-0.20.68 → zou-0.20.69}/zou/app/services/user_service.py +0 -0
  240. {zou-0.20.68 → zou-0.20.69}/zou/app/stores/__init__.py +0 -0
  241. {zou-0.20.68 → zou-0.20.69}/zou/app/stores/auth_tokens_store.py +0 -0
  242. {zou-0.20.68 → zou-0.20.69}/zou/app/stores/file_store.py +0 -0
  243. {zou-0.20.68 → zou-0.20.69}/zou/app/stores/publisher_store.py +0 -0
  244. {zou-0.20.68 → zou-0.20.69}/zou/app/stores/queue_store.py +0 -0
  245. {zou-0.20.68 → zou-0.20.69}/zou/app/swagger.py +0 -0
  246. {zou-0.20.68 → zou-0.20.69}/zou/app/utils/__init__.py +0 -0
  247. {zou-0.20.68 → zou-0.20.69}/zou/app/utils/api.py +0 -0
  248. {zou-0.20.68 → zou-0.20.69}/zou/app/utils/auth.py +0 -0
  249. {zou-0.20.68 → zou-0.20.69}/zou/app/utils/cache.py +0 -0
  250. {zou-0.20.68 → zou-0.20.69}/zou/app/utils/chats.py +0 -0
  251. {zou-0.20.68 → zou-0.20.69}/zou/app/utils/colors.py +0 -0
  252. {zou-0.20.68 → zou-0.20.69}/zou/app/utils/commands.py +0 -0
  253. {zou-0.20.68 → zou-0.20.69}/zou/app/utils/csv_utils.py +0 -0
  254. {zou-0.20.68 → zou-0.20.69}/zou/app/utils/date_helpers.py +0 -0
  255. {zou-0.20.68 → zou-0.20.69}/zou/app/utils/dbhelpers.py +0 -0
  256. {zou-0.20.68 → zou-0.20.69}/zou/app/utils/emails.py +0 -0
  257. {zou-0.20.68 → zou-0.20.69}/zou/app/utils/env.py +0 -0
  258. {zou-0.20.68 → zou-0.20.69}/zou/app/utils/events.py +0 -0
  259. {zou-0.20.68 → zou-0.20.69}/zou/app/utils/fido.py +0 -0
  260. {zou-0.20.68 → zou-0.20.69}/zou/app/utils/fields.py +0 -0
  261. {zou-0.20.68 → zou-0.20.69}/zou/app/utils/flask.py +0 -0
  262. {zou-0.20.68 → zou-0.20.69}/zou/app/utils/fs.py +0 -0
  263. {zou-0.20.68 → zou-0.20.69}/zou/app/utils/git.py +0 -0
  264. {zou-0.20.68 → zou-0.20.69}/zou/app/utils/logs.py +0 -0
  265. {zou-0.20.68 → zou-0.20.69}/zou/app/utils/monitoring.py +0 -0
  266. {zou-0.20.68 → zou-0.20.69}/zou/app/utils/permissions.py +0 -0
  267. {zou-0.20.68 → zou-0.20.69}/zou/app/utils/plugins.py +0 -0
  268. {zou-0.20.68 → zou-0.20.69}/zou/app/utils/query.py +0 -0
  269. {zou-0.20.68 → zou-0.20.69}/zou/app/utils/redis.py +0 -0
  270. {zou-0.20.68 → zou-0.20.69}/zou/app/utils/remote_job.py +0 -0
  271. {zou-0.20.68 → zou-0.20.69}/zou/app/utils/saml.py +0 -0
  272. {zou-0.20.68 → zou-0.20.69}/zou/app/utils/shell.py +0 -0
  273. {zou-0.20.68 → zou-0.20.69}/zou/app/utils/string.py +0 -0
  274. {zou-0.20.68 → zou-0.20.69}/zou/app/utils/thumbnail.py +0 -0
  275. {zou-0.20.68 → zou-0.20.69}/zou/cli.py +0 -0
  276. {zou-0.20.68 → zou-0.20.69}/zou/debug.py +0 -0
  277. {zou-0.20.68 → zou-0.20.69}/zou/event_stream.py +0 -0
  278. {zou-0.20.68 → zou-0.20.69}/zou/job_settings.py +0 -0
  279. {zou-0.20.68 → zou-0.20.69}/zou/migrations/README +0 -0
  280. {zou-0.20.68 → zou-0.20.69}/zou/migrations/__init__.py +0 -0
  281. {zou-0.20.68 → zou-0.20.69}/zou/migrations/alembic.ini +0 -0
  282. {zou-0.20.68 → zou-0.20.69}/zou/migrations/env.py +0 -0
  283. {zou-0.20.68 → zou-0.20.69}/zou/migrations/script.py.mako +0 -0
  284. {zou-0.20.68 → zou-0.20.69}/zou/migrations/utils/__init__.py +0 -0
  285. {zou-0.20.68 → zou-0.20.69}/zou/migrations/utils/base.py +0 -0
  286. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/003be8a91001_add_start_and_end_dates_to_projects.py +0 -0
  287. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/0596674df51d_add_department_mentions_to_comments.py +0 -0
  288. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/05ac7e8caa21_remove_unique_constraint_for_taskstatus_.py +0 -0
  289. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/05b7dc79a416_add_archived_fields_to_main_tables.py +0 -0
  290. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/06552e22f9e7_add_comment_updated_by.py +0 -0
  291. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/0bd1e89f2a6f_add_productionscheduleversiontasklink_uc.py +0 -0
  292. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/0cf5e0e035fa_drop_column_tasktype_for_shots.py +0 -0
  293. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/0ec3762a745d_add_attachment_table.py +0 -0
  294. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/0ef6416a507b_.py +0 -0
  295. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/10cf267d95c9_fix_schedule_item.py +0 -0
  296. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/16328eae4b5f_add_new_constraint_for_timespent.py +0 -0
  297. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/16df47d76c64_add_some_indexes.py +0 -0
  298. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/17ef8f7be758_disallow_null_choicetype.py +0 -0
  299. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/1bb55759146f_add_table_studio.py +0 -0
  300. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/1cb44194db49_add_file_size_field_to_preview_file.py +0 -0
  301. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/1e150c2cea4d_add_nb_entities_out.py +0 -0
  302. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/1e2d77a2f0c4_add_hd_by_default_column.py +0 -0
  303. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/1fab8c420678_add_attachments_to_message_chats.py +0 -0
  304. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/20a8ad264659_tasktypeassettypelink_.py +0 -0
  305. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/20dfeb36142b_add_projecttaskstatuslink_roles_for_.py +0 -0
  306. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/23122f290ca2_add_entity_chat_models.py +0 -0
  307. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/269d41bfb73f_add_entity_entity_links.py +0 -0
  308. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/26f96f65cfa3_add_productionversionschedule_uc.py +0 -0
  309. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/2762a797f1f9_add_people_salary_information.py +0 -0
  310. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/29df910f04a4_create_unique_constraint_project_id_.py +0 -0
  311. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/29fe01a6c9eb_add_status_automation_field.py +0 -0
  312. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/2adc020885fa_.py +0 -0
  313. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/2baede80b111_add_entity_status_field.py +0 -0
  314. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/306266361f4f_.py +0 -0
  315. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/307edd8c639d_change_comment_updated_by_in_comment_.py +0 -0
  316. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/328fd44c6347_add_entity_created_by.py +0 -0
  317. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/32f134ff1201_add_is_shared_flag_to_filters.py +0 -0
  318. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/346250b5304c_add_position_to_preview_files.py +0 -0
  319. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/3476e147e632_add_acks_to_comments.py +0 -0
  320. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/389cfb9de776_.py +0 -0
  321. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/38baa9a23b3d_.py +0 -0
  322. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/398150912a3f_validation_status_preview.py +0 -0
  323. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/3b0d1321079e_.py +0 -0
  324. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/3d5c93bafb9d_.py +0 -0
  325. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/3d8e68dffeee_fix_task_person_link.py +0 -0
  326. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/3e0538ddf80f_.py +0 -0
  327. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/3fee3bd10f9d_.py +0 -0
  328. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/4095103c7d01_add_is_clients_isolated_flag_to_projects.py +0 -0
  329. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/40dea9555940_.py +0 -0
  330. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/42ec83db6a01_change_person_preferred_two_factor_.py +0 -0
  331. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/4368137b44e1_productionscheduleversion_add_on_delete_.py +0 -0
  332. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/43d0cf0ed5e7_.py +0 -0
  333. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/443d1e78a932_.py +0 -0
  334. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/45c2de366e66_.py +0 -0
  335. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/45dafbb3f4e1_for_person_contract_type_disallow_null.py +0 -0
  336. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/45f739ef962a_add_people_salary_scale_table.py +0 -0
  337. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/4715c2586036_add_last_preview_file_fields.py +0 -0
  338. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/4aab1f84ad72_introduce_plugin_table.py +0 -0
  339. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/4bd9bfb73f11_add_fields_to_the_software_table.py +0 -0
  340. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/4d585b6956f2_add_taskstatus_is_wip.py +0 -0
  341. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/4e3738cdc34c_.py +0 -0
  342. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/4f2398ebcd49_.py +0 -0
  343. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/523ee9647bee_.py +0 -0
  344. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/539a3a00c417_for_departmentlink_index_person_id_.py +0 -0
  345. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/54ee0d1d60ba_add_build_job_model.py +0 -0
  346. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/556526e47daa_.py +0 -0
  347. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/57222395f2be_add_statusautomation_import_last_revision.py +0 -0
  348. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/5798d2c9020b_change_person_role_to_choicetype.py +0 -0
  349. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/590aa1ffe731_add_notifications_enabled_flag.py +0 -0
  350. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/59a7445a966c_add_entity_is_shared.py +0 -0
  351. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/5a291251823c_add_max_retake_parameter.py +0 -0
  352. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/5ab9d7a75887_.py +0 -0
  353. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/5b0fcbb94f24_.py +0 -0
  354. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/5b7fa3e51701_add_is_client_allowed_flag_to_task_.py +0 -0
  355. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/5b980f0dc365_add_comment_links.py +0 -0
  356. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/5b9fd9ddfe43_add_homepage_and_contract_fields.py +0 -0
  357. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/5c0498e264bc_add_slack_fields.py +0 -0
  358. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/5e2ce62632a6_add_workflow_to_project.py +0 -0
  359. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/5f715f2b6348_add_new_table_productionscheduleversion.py +0 -0
  360. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/680c64565f9d_for_searchfiltergroup_is_shared.py +0 -0
  361. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/693cc511d28d_add_taskstatus_priority.py +0 -0
  362. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/6aa446ee4072_add_is_for_all_flage_to_playlists.py +0 -0
  363. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/6bd3b102d61b_.py +0 -0
  364. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/6c597e842afa_add_task_type_field_to_playlists.py +0 -0
  365. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/6d1b2c60f58b_add_milestone_model.py +0 -0
  366. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/6d7fa5a8e9a5_add_timesheets_locked_field_to_org.py +0 -0
  367. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/6eeaff945706_add_data_field_on_entity_links.py +0 -0
  368. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/6f6049877105_.py +0 -0
  369. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/7417c8eb70d8_add_for_entity_field_to_playlists.py +0 -0
  370. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/772a5e43f05b_.py +0 -0
  371. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/7748d3d22925_add_columns_to_searchfilter_table_to_.py +0 -0
  372. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/77d6820f494f_add_reply_to_notif.py +0 -0
  373. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/7a16258f2fab_add_currency_field_to_budgets.py +0 -0
  374. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/7b1f765677d8_.py +0 -0
  375. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/7bc746997e8d_add_slack_token_field_to_organisation.py +0 -0
  376. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/7dc79d4ed7cd_.py +0 -0
  377. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/818f7bda2528_.py +0 -0
  378. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/82e7f7a95e84_add_project_id_to_events.py +0 -0
  379. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/82ee682204ab_add_is_generated_from_ldap_column_to_.py +0 -0
  380. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/83e2f33a9b14_add_project_bugdet_table.py +0 -0
  381. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/8588f254d6b8_add_archived_fields.py +0 -0
  382. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/8739ae9fa28b_add_for_client_field.py +0 -0
  383. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/87efceb6745b_add_ready_for_to_entity.py +0 -0
  384. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/892b264937ec_.py +0 -0
  385. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/8a1b4a1b7f4a_add_totp_columns_for_person.py +0 -0
  386. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/8ab98c178903_add_budget_entry_table.py +0 -0
  387. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/8e4f39e321f4_add_day_off_table.py +0 -0
  388. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/8e67c183bed7_add_preference_fields.py +0 -0
  389. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/8fbd40afbe5f_allow_to_set_float_values_for_.py +0 -0
  390. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/9010a64e5a2d_add_indices.py +0 -0
  391. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/9060dd4f6116_notification_uc.py +0 -0
  392. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/925771029620_.py +0 -0
  393. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/92b40d79ad3f_allow_message_attachments.py +0 -0
  394. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/92bdfe07e5f5_discord_integration.py +0 -0
  395. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/956659992419_add_columns_for_person_to_store_fido_.py +0 -0
  396. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/9683bd840dee_add_archived_field_to_software.py +0 -0
  397. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/96c79d31e648_add_mail_otp_columns_for_person.py +0 -0
  398. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/96f58a4a2a58_person_partial_index_for_email_only_.py +0 -0
  399. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/971dbf5a0faf_add_short_name_for_asset_type_entity_.py +0 -0
  400. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/98c90621cf58_add_for_client_flag_to_playlist.py +0 -0
  401. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/99825b9cc778_.py +0 -0
  402. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/9a09467f9b2c_.py +0 -0
  403. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/9af2df17a9d5_add_hardware_table.py +0 -0
  404. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/9b85c14fa8a7_add_day_off_new_columns.py +0 -0
  405. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/9bd17364fc18_.py +0 -0
  406. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/9d3bb33c6fc6_add_department_keys_to_filter_models.py +0 -0
  407. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/9e5b3a9b0cee_add_new_column_metadatadescriptor_data_type_.py +0 -0
  408. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/9f8445f9b42c_add_man_days_fields.py +0 -0
  409. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/a23682ccc1f1_.py +0 -0
  410. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/a252a094e977_add_descriptions_for_entities_tasks_and_.py +0 -0
  411. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/a519c710877c_.py +0 -0
  412. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/a65bdadbae2f_.py +0 -0
  413. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/a66508788c53_add_nb_assets_ready.py +0 -0
  414. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/a6c25eed3ea1_add_login_failed_attemps_and_last_login_.py +0 -0
  415. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/a7c43f3fbc76_add_duration_column_to_the_preview_file.py +0 -0
  416. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/aa0a60033106_feedback_request.py +0 -0
  417. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/addbad59c706_allow_to_manage_drawings_instead_of_.py +0 -0
  418. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/addbbefa7028_add_departments_link_to_metadata_.py +0 -0
  419. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/ae0127f2fc56_add_previewfile_width_and_previewfile_.py +0 -0
  420. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/af1790868e2c_.py +0 -0
  421. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/b45cb782bb9c_.py +0 -0
  422. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/b4dd0add5f79_.py +0 -0
  423. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/b8c0a0f9d054_drop_task_status_is_reviewable.py +0 -0
  424. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/b8ed0fb263f8_add_person_jti_and_jti_expiration_date.py +0 -0
  425. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/b97a71306fc8_add_is_casting_standby_column_to_entity.py +0 -0
  426. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/be56dc0fb760_for_is_shared_disallow_nullable.py +0 -0
  427. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/bf1347acdee2_.py +0 -0
  428. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/c49e41f1298b_add_previewbackground.py +0 -0
  429. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/c68c2a62cfac_add_mimetype_column_to_attachment.py +0 -0
  430. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/c726b98be194_.py +0 -0
  431. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/c81f3e83bdb5_.py +0 -0
  432. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/ca28796a2a62_add_is_done_field_to_the_task_model.py +0 -0
  433. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/ce7f46f445dc_add_column_estimation_for_.py +0 -0
  434. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/cf3d365de164_add_entity_version_model.py +0 -0
  435. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/cf6cec6d6bf5_add_status_field_to_preview_file.py +0 -0
  436. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/d25118cddcaa_modify_salary_scale_model.py +0 -0
  437. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/d5665dca188b_add_version_field_to_software.py +0 -0
  438. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/d80267806131_task_status_new_column_is_default.py +0 -0
  439. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/d80f02824047_add_plugin_revision.py +0 -0
  440. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/d8dcd5196d57_add_casting_label.py +0 -0
  441. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/d97f2730bf7b_add_.py +0 -0
  442. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/dde6be40f54f_add_departement_links_tables_for_.py +0 -0
  443. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/de8a3de227ef_.py +0 -0
  444. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/deeacd38d373_for_projecttaskstatuslink_set_default_.py +0 -0
  445. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/df1834485f57_.py +0 -0
  446. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/df9f8a147e80_change_file_size_to_big_integer.py +0 -0
  447. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/e1ef93f40d3d_.py +0 -0
  448. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/e29638428dfd_add_schedule_item_table.py +0 -0
  449. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/e3f6db74cc1e_.py +0 -0
  450. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/e4b48ca33539_add_project_production_schedule_version_.py +0 -0
  451. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/e7e633bd6fa2_add_exceptions_to_budget_entries.py +0 -0
  452. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/e839d6603c09_add_person_id_to_shot_history.py +0 -0
  453. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/e8bc24998b34_remove_on_delete_cascade_for_.py +0 -0
  454. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/ee2373fbe3a4_.py +0 -0
  455. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/f0567e8d0c62_.py +0 -0
  456. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/f0c6cbb61869_add_production_style_field.py +0 -0
  457. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/f344b867a911_for_description_of_entity_task_working_.py +0 -0
  458. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/f4ff5a73d283_add_person_ldap_uid.py +0 -0
  459. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/f5b113876a49_add_preferred_two_factor_authentication_.py +0 -0
  460. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/f5bdca075cdc_add_preview_download_flag_to_projects.py +0 -0
  461. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/f874ad5e898a_add_link_entity_type_task_type.py +0 -0
  462. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/f995b28fb749_.py +0 -0
  463. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/fb6b6f188497_.py +0 -0
  464. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/fb87feaaa094_add_missing_unique_constraints.py +0 -0
  465. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/fba149993140_add_missing_index.py +0 -0
  466. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/fc322f908695_.py +0 -0
  467. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/fee7c696166e_.py +0 -0
  468. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/feffd3c5b806_introduce_concepts.py +0 -0
  469. {zou-0.20.68 → zou-0.20.69}/zou/migrations/versions/ffeed4956ab1_add_more_details_to_projects.py +0 -0
  470. {zou-0.20.68 → zou-0.20.69}/zou/plugin_template/__init__.py +0 -0
  471. {zou-0.20.68 → zou-0.20.69}/zou/plugin_template/migrations/alembic.ini +0 -0
  472. {zou-0.20.68 → zou-0.20.69}/zou/plugin_template/migrations/env.py +0 -0
  473. {zou-0.20.68 → zou-0.20.69}/zou/plugin_template/migrations/script.py.mako +0 -0
  474. {zou-0.20.68 → zou-0.20.69}/zou/plugin_template/models.py +0 -0
  475. {zou-0.20.68 → zou-0.20.69}/zou/plugin_template/routes.py +0 -0
  476. {zou-0.20.68 → zou-0.20.69}/zou/remote/__init__.py +0 -0
  477. {zou-0.20.68 → zou-0.20.69}/zou/remote/config_payload.py +0 -0
  478. {zou-0.20.68 → zou-0.20.69}/zou/remote/normalize_movie.py +0 -0
  479. {zou-0.20.68 → zou-0.20.69}/zou/remote/playlist.py +0 -0
  480. {zou-0.20.68 → zou-0.20.69}/zou/utils/__init__.py +0 -0
  481. {zou-0.20.68 → zou-0.20.69}/zou/utils/movie.py +0 -0
  482. {zou-0.20.68 → zou-0.20.69}/zou.egg-info/dependency_links.txt +0 -0
  483. {zou-0.20.68 → zou-0.20.69}/zou.egg-info/entry_points.txt +0 -0
  484. {zou-0.20.68 → zou-0.20.69}/zou.egg-info/not-zip-safe +0 -0
  485. {zou-0.20.68 → zou-0.20.69}/zou.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: zou
3
- Version: 0.20.68
3
+ Version: 0.20.69
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
@@ -23,7 +23,7 @@ License-File: LICENSE
23
23
  Requires-Dist: babel==2.17.0
24
24
  Requires-Dist: click==8.2.1
25
25
  Requires-Dist: discord.py==2.6.2
26
- Requires-Dist: email-validator==2.2.0
26
+ Requires-Dist: email-validator==2.3.0
27
27
  Requires-Dist: ffmpeg-python==0.2.0
28
28
  Requires-Dist: fido2==2.0.0
29
29
  Requires-Dist: flasgger==0.9.7.1
@@ -41,7 +41,7 @@ Requires-Dist: flask-socketio==5.5.1
41
41
  Requires-Dist: flask==3.1.2
42
42
  Requires-Dist: gazu==0.10.36
43
43
  Requires-Dist: gevent-websocket==0.10.1
44
- Requires-Dist: gevent==25.5.1
44
+ Requires-Dist: gevent==25.8.1
45
45
  Requires-Dist: gunicorn==23.0.0
46
46
  Requires-Dist: isoweek==1.3.3
47
47
  Requires-Dist: itsdangerous==2.2.0
@@ -53,7 +53,7 @@ Requires-Dist: numpy==2.2.6
53
53
  Requires-Dist: opencv-python==4.12.0.88
54
54
  Requires-Dist: OpenTimelineIO==0.17.0
55
55
  Requires-Dist: OpenTimelineIO-Plugins==0.17.0
56
- Requires-Dist: orjson==3.11.2
56
+ Requires-Dist: orjson==3.11.3
57
57
  Requires-Dist: pillow==11.3.0
58
58
  Requires-Dist: psutil==7.0.0
59
59
  Requires-Dist: psycopg[binary]==3.2.9
@@ -29,7 +29,7 @@ install_requires =
29
29
  babel==2.17.0
30
30
  click==8.2.1
31
31
  discord.py==2.6.2
32
- email-validator==2.2.0
32
+ email-validator==2.3.0
33
33
  ffmpeg-python==0.2.0
34
34
  fido2==2.0.0
35
35
  flasgger==0.9.7.1
@@ -47,7 +47,7 @@ install_requires =
47
47
  flask==3.1.2
48
48
  gazu==0.10.36
49
49
  gevent-websocket==0.10.1
50
- gevent==25.5.1
50
+ gevent==25.8.1
51
51
  gunicorn==23.0.0
52
52
  isoweek==1.3.3
53
53
  itsdangerous==2.2.0
@@ -59,7 +59,7 @@ install_requires =
59
59
  opencv-python==4.12.0.88
60
60
  OpenTimelineIO==0.17.0
61
61
  OpenTimelineIO-Plugins==0.17.0
62
- orjson==3.11.2
62
+ orjson==3.11.3
63
63
  pillow==11.3.0
64
64
  psutil==7.0.0
65
65
  psycopg[binary]==3.2.9
@@ -0,0 +1 @@
1
+ __version__ = "0.20.69"
@@ -322,6 +322,13 @@ class AddAttachmentToCommentResource(Resource):
322
322
  type: string
323
323
  format: uuid
324
324
  example: a24a6ea4-ce75-4665-a070-57453082c25
325
+ - in: formData
326
+ name: reply_id
327
+ type: uuid
328
+ example: a24a6ea4-ce75-4665-a070-57453082c25
329
+ required: True
330
+ format: uuid
331
+ example: a24a6ea4-ce75-4665-a070-57453082c25
325
332
  - in: formData
326
333
  name: files
327
334
  type: file
@@ -337,7 +344,9 @@ class AddAttachmentToCommentResource(Resource):
337
344
  user_service.check_manager_project_access(task["project_id"])
338
345
 
339
346
  files = request.files
340
- comment = comments_service.add_attachments_to_comment(comment, files)
347
+ comment = comments_service.add_attachments_to_comment(
348
+ comment, files, reply_id=None
349
+ )
341
350
  return comment["attachment_files"], 201
342
351
 
343
352
 
@@ -487,12 +496,6 @@ class ReplyCommentResource(Resource, ArgsMixin):
487
496
  200:
488
497
  description: Reply to given comment
489
498
  """
490
- args = self.get_args(
491
- [
492
- ("text", "", False),
493
- ]
494
- )
495
-
496
499
  comment = tasks_service.get_comment(comment_id)
497
500
  current_user = persons_service.get_current_user()
498
501
  if comment["person_id"] != current_user["id"]:
@@ -500,7 +503,17 @@ class ReplyCommentResource(Resource, ArgsMixin):
500
503
  raise permissions.PermissionDenied()
501
504
  user_service.check_task_action_access(task_id)
502
505
 
503
- return comments_service.reply_comment(comment_id, args["text"])
506
+ args = self.get_args(
507
+ [
508
+ ("text", "", False),
509
+ ]
510
+ )
511
+ files = request.files
512
+ return comments_service.reply_comment(
513
+ comment_id,
514
+ args["text"],
515
+ files=files
516
+ )
504
517
 
505
518
 
506
519
  class DeleteReplyCommentResource(Resource):
@@ -64,10 +64,13 @@ class ShotResource(Resource, ArgsMixin):
64
64
  type: string
65
65
  format: uuid
66
66
  example: a24a6ea4-ce75-4665-a070-57453082c25
67
- - in: body
68
- name: data
69
- required: True
70
- type: object
67
+ requestBody:
68
+ required: true
69
+ content:
70
+ application/json:
71
+ schema:
72
+ type: object
73
+ description: Shot data to update
71
74
  responses:
72
75
  200:
73
76
  description: Update given shot
@@ -711,23 +714,32 @@ class ProjectShotsResource(Resource, ArgsMixin):
711
714
  type: string
712
715
  format: uuid
713
716
  example: a24a6ea4-ce75-4665-a070-57453082c25
714
- - in: formData
715
- name: name
716
- required: True
717
- type: string
718
- example: Name of shot
719
- - in: formData
720
- name: description
721
- type: string
722
- example: Description of shot
723
- - in: formData
724
- name: sequence_id
725
- type: string
726
- format: uuid
727
- example: a24a6ea4-ce75-4665-a070-57453082c25
728
- - in: formData
729
- name: nb_frames
730
- type: integer
717
+ requestBody:
718
+ required: true
719
+ content:
720
+ application/json:
721
+ schema:
722
+ type: object
723
+ required:
724
+ - name
725
+ properties:
726
+ name:
727
+ type: string
728
+ required: true
729
+ example: "Name of shot"
730
+ description:
731
+ type: string
732
+ required: false
733
+ example: "Description of shot"
734
+ sequence_id:
735
+ type: string
736
+ format: uuid
737
+ required: false
738
+ example: a24a6ea4-ce75-4665-a070-57453082c25
739
+ nb_frames:
740
+ type: integer
741
+ required: false
742
+ example: 24
731
743
  responses:
732
744
  201:
733
745
  description: Shot created for given project
@@ -812,16 +824,24 @@ class ProjectSequencesResource(Resource, ArgsMixin):
812
824
  type: string
813
825
  format: uuid
814
826
  example: a24a6ea4-ce75-4665-a070-57453082c25
815
- - in: formData
816
- name: name
817
- required: True
818
- type: string
819
- example: Name of sequence
820
- - in: formData
821
- name: episode_id
822
- type: string
823
- format: uuid
824
- example: a24a6ea4-ce75-4665-a070-57453082c25
827
+ requestBody:
828
+ required: true
829
+ content:
830
+ application/json:
831
+ schema:
832
+ type: object
833
+ required:
834
+ - name
835
+ properties:
836
+ name:
837
+ type: string
838
+ required: true
839
+ example: "Name of sequence"
840
+ episode_id:
841
+ type: string
842
+ format: uuid
843
+ required: false
844
+ example: a24a6ea4-ce75-4665-a070-57453082c25
825
845
  responses:
826
846
  201:
827
847
  description: Sequence created for given project
@@ -896,16 +916,24 @@ class ProjectEpisodesResource(Resource, ArgsMixin):
896
916
  type: string
897
917
  format: uuid
898
918
  example: a24a6ea4-ce75-4665-a070-57453082c25
899
- - in: formData
900
- name: name
901
- required: True
902
- type: string
903
- example: Name of the episode
904
- - in: formData
905
- name: description
906
- required: True
907
- type: string
908
- example: Description of the episode
919
+ requestBody:
920
+ required: true
921
+ content:
922
+ application/json:
923
+ schema:
924
+ type: object
925
+ required:
926
+ - name
927
+ - description
928
+ properties:
929
+ name:
930
+ type: string
931
+ required: true
932
+ example: "Name of the episode"
933
+ description:
934
+ type: string
935
+ required: true
936
+ example: "Description of the episode"
909
937
  responses:
910
938
  201:
911
939
  description: Episode created for given project
@@ -1309,17 +1337,25 @@ class ProjectScenesResource(Resource, ArgsMixin):
1309
1337
  type: string
1310
1338
  format: uuid
1311
1339
  example: a24a6ea4-ce75-4665-a070-57453082c25
1312
- - in: formData
1313
- name: name
1314
- required: True
1315
- type: string
1316
- example: Name of scene
1317
- - in: formData
1318
- name: sequence_id
1319
- required: True
1320
- type: string
1321
- format: uuid
1322
- example: a24a6ea4-ce75-4665-a070-57453082c25
1340
+ requestBody:
1341
+ required: true
1342
+ content:
1343
+ application/json:
1344
+ schema:
1345
+ type: object
1346
+ required:
1347
+ - name
1348
+ - sequence_id
1349
+ properties:
1350
+ name:
1351
+ type: string
1352
+ required: true
1353
+ example: "Name of scene"
1354
+ sequence_id:
1355
+ type: string
1356
+ format: uuid
1357
+ required: true
1358
+ example: a24a6ea4-ce75-4665-a070-57453082c25
1323
1359
  responses:
1324
1360
  201:
1325
1361
  description: Scene created for given project
@@ -1453,11 +1489,20 @@ class SceneShotsResource(Resource, ArgsMixin):
1453
1489
  type: string
1454
1490
  format: uuid
1455
1491
  example: a24a6ea4-ce75-4665-a070-57453082c25
1456
- - in: formData
1457
- name: shot_id
1458
- type: string
1459
- format: uuid
1460
- example: a24a6ea4-ce75-4665-a070-57453082c25
1492
+ requestBody:
1493
+ required: true
1494
+ content:
1495
+ application/json:
1496
+ schema:
1497
+ type: object
1498
+ required:
1499
+ - shot_id
1500
+ properties:
1501
+ shot_id:
1502
+ type: string
1503
+ format: uuid
1504
+ required: true
1505
+ example: a24a6ea4-ce75-4665-a070-57453082c25
1461
1506
  responses:
1462
1507
  200:
1463
1508
  description: Given scene marked as source of given shot
@@ -1696,21 +1741,28 @@ class SetShotsFramesResource(Resource, ArgsMixin):
1696
1741
  ---
1697
1742
  tags:
1698
1743
  - Shots
1699
- parameters:
1700
- - in: formData
1701
- name: shots
1702
- required: True
1703
- type: array
1704
- items:
1705
- type: object
1706
- properties:
1707
- shot_id:
1708
- type: string
1709
- format: uuid
1710
- example: a24a6ea4-ce75-4665-a070-57453082c25
1711
- nb_frames:
1712
- type: integer
1713
- example: 24
1744
+ requestBody:
1745
+ required: true
1746
+ content:
1747
+ application/json:
1748
+ schema:
1749
+ type: object
1750
+ required:
1751
+ - shots
1752
+ properties:
1753
+ shots:
1754
+ type: array
1755
+ required: true
1756
+ items:
1757
+ type: object
1758
+ properties:
1759
+ shot_id:
1760
+ type: string
1761
+ format: uuid
1762
+ example: a24a6ea4-ce75-4665-a070-57453082c25
1763
+ nb_frames:
1764
+ type: integer
1765
+ example: 24
1714
1766
  responses:
1715
1767
  200:
1716
1768
  description: Frames set for given shots
@@ -1625,7 +1625,7 @@ class PersonsTasksDatesResource(Resource, ArgsMixin):
1625
1625
  description: For each person, the first start date of all tasks of assigned to this person and the last end date.
1626
1626
  """
1627
1627
  permissions.check_admin_permissions()
1628
- args = self.get_args([("project_id", None, True, str)])
1628
+ args = self.get_args([("project_id", None, False, str)])
1629
1629
  return tasks_service.get_persons_tasks_dates(
1630
1630
  project_id=args["project_id"]
1631
1631
  )
@@ -21,6 +21,10 @@ class AttachmentFile(db.Model, BaseMixin, SerializerMixin):
21
21
  index=True,
22
22
  nullable=True,
23
23
  )
24
+ reply_id = db.Column(
25
+ UUIDType(binary=False),
26
+ nullable=True,
27
+ )
24
28
  chat_message_id = db.Column(
25
29
  UUIDType(binary=False),
26
30
  db.ForeignKey("chat_message.id"),
@@ -19,6 +19,7 @@ from zou.app.services import (
19
19
  assets_service,
20
20
  base_service,
21
21
  breakdown_service,
22
+ deletion_service,
22
23
  entities_service,
23
24
  news_service,
24
25
  notifications_service,
@@ -355,7 +356,7 @@ def reset_mentions(comment):
355
356
  return comment_dict
356
357
 
357
358
 
358
- def create_attachment(comment, uploaded_file, randomize=False):
359
+ def create_attachment(comment, uploaded_file, randomize=False, reply_id=None):
359
360
  tmp_folder = current_app.config["TMP_DIR"]
360
361
  filename = uploaded_file.filename
361
362
  mimetype = uploaded_file.mimetype
@@ -366,11 +367,19 @@ def create_attachment(comment, uploaded_file, randomize=False):
366
367
  filename = f"{filename[:len(filename) - len(extension) - 1]}"
367
368
  filename += f"-{random_str}.{extension}"
368
369
 
370
+ if reply_id is not None:
371
+ is_reply_present = any(
372
+ reply["id"] == reply_id for reply in comment.get("replies", [])
373
+ )
374
+ if not is_reply_present:
375
+ reply_id = None
376
+
369
377
  attachment_file = AttachmentFile.create(
370
378
  name=filename,
371
379
  size=0,
372
380
  extension=extension,
373
381
  mimetype=mimetype,
382
+ reply_id=reply_id,
374
383
  comment_id=comment["id"],
375
384
  )
376
385
  attachment_file_id = str(attachment_file.id)
@@ -455,7 +464,7 @@ def _send_ack_event(project_id, comment, user_id, name="acknowledge"):
455
464
  )
456
465
 
457
466
 
458
- def reply_comment(comment_id, text, person_id=None):
467
+ def reply_comment(comment_id, text, person_id=None, files={}):
459
468
  """
460
469
  Add a reply entry to the JSONB field of given comment model. Create
461
470
  notifications needed for this.
@@ -469,6 +478,7 @@ def reply_comment(comment_id, text, person_id=None):
469
478
  task = tasks_service.get_task(comment.object_id, relations=True)
470
479
  if comment.replies is None:
471
480
  comment.replies = []
481
+
472
482
  reply = {
473
483
  "id": str(fields.gen_uuid()),
474
484
  "date": date_helpers.get_now(),
@@ -483,18 +493,26 @@ def reply_comment(comment_id, text, person_id=None):
483
493
  replies = list(comment.replies)
484
494
  replies.append(reply)
485
495
  comment.update({"replies": replies})
496
+ if len(files.keys()) > 0:
497
+ comment = comment.serialize(relations=True)
498
+ new_attachment_files = add_attachments_to_comment(
499
+ comment, files, reply_id=reply["id"]
500
+ )
501
+ for new_attachment_file in new_attachment_files:
502
+ new_attachment_file["reply_id"] = reply["id"]
503
+ reply["attachment_files"] = new_attachment_files
486
504
  tasks_service.clear_comment_cache(comment_id)
487
505
  events.emit(
488
506
  "comment:reply",
489
507
  {
490
508
  "task_id": task["id"],
491
- "comment_id": str(comment.id),
509
+ "comment_id": comment_id,
492
510
  "reply_id": reply["id"],
493
511
  },
494
512
  project_id=task["project_id"],
495
513
  )
496
514
  notifications_service.create_notifications_for_task_and_reply(
497
- task, comment.serialize(), reply
515
+ task, comment, reply
498
516
  )
499
517
  return reply
500
518
 
@@ -508,6 +526,14 @@ def get_reply(comment_id, reply_id):
508
526
  def delete_reply(comment_id, reply_id):
509
527
  comment = tasks_service.get_comment_raw(comment_id)
510
528
  task = tasks_service.get_task(comment.object_id)
529
+
530
+ if comment.attachment_files is None:
531
+ comment.attachment_files = []
532
+ for attachment_file in comment.attachment_files:
533
+ if attachment_file.reply_id == reply_id:
534
+ deletion_service.remove_attachment_file_by_id(
535
+ attachment_file["id"]
536
+ )
511
537
  if comment.replies is None:
512
538
  comment.replies = []
513
539
  comment.replies = [
@@ -567,19 +593,25 @@ def get_comment_department_mention_ids(project_id, text):
567
593
  ]
568
594
 
569
595
 
570
- def add_attachments_to_comment(comment, files):
596
+ def add_attachments_to_comment(comment, files, reply_id=None):
571
597
  """
572
598
  Create an attachment entry and for each given uploaded files and tie it
573
599
  to given comment.
574
600
  """
575
- comment["attachment_files"] = []
601
+ if comment["attachment_files"] is None:
602
+ comment["attachment_files"] = []
603
+ new_attachment_files = []
576
604
  for uploaded_file in files.values():
577
605
  try:
578
- attachment_file = create_attachment(comment, uploaded_file)
606
+ attachment_file = create_attachment(
607
+ comment, uploaded_file, reply_id=reply_id
608
+ )
579
609
  comment["attachment_files"].append(attachment_file)
610
+ new_attachment_files.append(attachment_file)
580
611
  except IntegrityError:
581
612
  attachment_file = create_attachment(
582
- comment, uploaded_file, randomize=True
613
+ comment, uploaded_file, randomize=True, reply_id=reply_id
583
614
  )
584
615
  comment["attachment_files"].append(attachment_file)
585
- return comment
616
+ new_attachment_files.append(attachment_file)
617
+ return new_attachment_files
@@ -752,6 +752,7 @@ def _build_attachment_map_for_comments(comment_ids):
752
752
  "id": attachment_file_id,
753
753
  "name": attachment_file.name,
754
754
  "extension": attachment_file.extension,
755
+ "reply_id": attachment_file.reply_id,
755
756
  "size": attachment_file.size,
756
757
  }
757
758
  )
@@ -0,0 +1,44 @@
1
+ """add reply id to attachments
2
+
3
+ Revision ID: 1b0ab951adca
4
+ Revises: ce7f46f445dc
5
+ Create Date: 2025-08-27 14:14:16.237272
6
+
7
+ """
8
+ from alembic import op
9
+ import sqlalchemy as sa
10
+ import sqlalchemy_utils
11
+ import sqlalchemy_utils
12
+ import uuid
13
+
14
+ # revision identifiers, used by Alembic.
15
+ revision = '1b0ab951adca'
16
+ down_revision = 'ce7f46f445dc'
17
+ branch_labels = None
18
+ depends_on = None
19
+
20
+
21
+ def upgrade():
22
+ # ### commands auto generated by Alembic - please adjust! ###
23
+ with op.batch_alter_table('attachment_file', schema=None) as batch_op:
24
+ batch_op.add_column(sa.Column('reply_id', sqlalchemy_utils.types.uuid.UUIDType(binary=False), default=uuid.uuid4, nullable=True))
25
+
26
+ with op.batch_alter_table('software', schema=None) as batch_op:
27
+ batch_op.alter_column('version',
28
+ existing_type=sa.VARCHAR(length=20),
29
+ nullable=True)
30
+
31
+ # ### end Alembic commands ###
32
+
33
+
34
+ def downgrade():
35
+ # ### commands auto generated by Alembic - please adjust! ###
36
+ with op.batch_alter_table('software', schema=None) as batch_op:
37
+ batch_op.alter_column('version',
38
+ existing_type=sa.VARCHAR(length=20),
39
+ nullable=False)
40
+
41
+ with op.batch_alter_table('attachment_file', schema=None) as batch_op:
42
+ batch_op.drop_column('reply_id')
43
+
44
+ # ### end Alembic commands ###
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: zou
3
- Version: 0.20.68
3
+ Version: 0.20.69
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
@@ -23,7 +23,7 @@ License-File: LICENSE
23
23
  Requires-Dist: babel==2.17.0
24
24
  Requires-Dist: click==8.2.1
25
25
  Requires-Dist: discord.py==2.6.2
26
- Requires-Dist: email-validator==2.2.0
26
+ Requires-Dist: email-validator==2.3.0
27
27
  Requires-Dist: ffmpeg-python==0.2.0
28
28
  Requires-Dist: fido2==2.0.0
29
29
  Requires-Dist: flasgger==0.9.7.1
@@ -41,7 +41,7 @@ Requires-Dist: flask-socketio==5.5.1
41
41
  Requires-Dist: flask==3.1.2
42
42
  Requires-Dist: gazu==0.10.36
43
43
  Requires-Dist: gevent-websocket==0.10.1
44
- Requires-Dist: gevent==25.5.1
44
+ Requires-Dist: gevent==25.8.1
45
45
  Requires-Dist: gunicorn==23.0.0
46
46
  Requires-Dist: isoweek==1.3.3
47
47
  Requires-Dist: itsdangerous==2.2.0
@@ -53,7 +53,7 @@ Requires-Dist: numpy==2.2.6
53
53
  Requires-Dist: opencv-python==4.12.0.88
54
54
  Requires-Dist: OpenTimelineIO==0.17.0
55
55
  Requires-Dist: OpenTimelineIO-Plugins==0.17.0
56
- Requires-Dist: orjson==3.11.2
56
+ Requires-Dist: orjson==3.11.3
57
57
  Requires-Dist: pillow==11.3.0
58
58
  Requires-Dist: psutil==7.0.0
59
59
  Requires-Dist: psycopg[binary]==3.2.9
@@ -297,6 +297,7 @@ zou/migrations/versions/10cf267d95c9_fix_schedule_item.py
297
297
  zou/migrations/versions/16328eae4b5f_add_new_constraint_for_timespent.py
298
298
  zou/migrations/versions/16df47d76c64_add_some_indexes.py
299
299
  zou/migrations/versions/17ef8f7be758_disallow_null_choicetype.py
300
+ zou/migrations/versions/1b0ab951adca_add_reply_id_to_attachments.py
300
301
  zou/migrations/versions/1bb55759146f_add_table_studio.py
301
302
  zou/migrations/versions/1cb44194db49_add_file_size_field_to_preview_file.py
302
303
  zou/migrations/versions/1e150c2cea4d_add_nb_entities_out.py
@@ -1,7 +1,7 @@
1
1
  babel==2.17.0
2
2
  click==8.2.1
3
3
  discord.py==2.6.2
4
- email-validator==2.2.0
4
+ email-validator==2.3.0
5
5
  ffmpeg-python==0.2.0
6
6
  fido2==2.0.0
7
7
  flasgger==0.9.7.1
@@ -19,7 +19,7 @@ flask-socketio==5.5.1
19
19
  flask==3.1.2
20
20
  gazu==0.10.36
21
21
  gevent-websocket==0.10.1
22
- gevent==25.5.1
22
+ gevent==25.8.1
23
23
  gunicorn==23.0.0
24
24
  isoweek==1.3.3
25
25
  itsdangerous==2.2.0
@@ -31,7 +31,7 @@ numpy==2.2.6
31
31
  opencv-python==4.12.0.88
32
32
  OpenTimelineIO==0.17.0
33
33
  OpenTimelineIO-Plugins==0.17.0
34
- orjson==3.11.2
34
+ orjson==3.11.3
35
35
  pillow==11.3.0
36
36
  psutil==7.0.0
37
37
  psycopg[binary]==3.2.9
@@ -1 +0,0 @@
1
- __version__ = "0.20.68"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes