zou 0.20.19__tar.gz → 0.20.21__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 (434) hide show
  1. {zou-0.20.19/zou.egg-info → zou-0.20.21}/PKG-INFO +1 -1
  2. zou-0.20.21/zou/__init__.py +1 -0
  3. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/assets/resources.py +4 -2
  4. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/comments/resources.py +2 -3
  5. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/crud/comments.py +5 -0
  6. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/crud/working_file.py +1 -1
  7. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/files/resources.py +2 -2
  8. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/previews/resources.py +4 -4
  9. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/tasks/resources.py +2 -2
  10. {zou-0.20.19 → zou-0.20.21}/zou/app/models/comment.py +6 -0
  11. {zou-0.20.19 → zou-0.20.21}/zou/app/services/sync_service.py +6 -0
  12. {zou-0.20.19 → zou-0.20.21}/zou/app/services/tasks_service.py +29 -10
  13. {zou-0.20.19 → zou-0.20.21}/zou/app/services/user_service.py +33 -8
  14. {zou-0.20.19 → zou-0.20.21}/zou/app/utils/commands.py +23 -14
  15. zou-0.20.21/zou/migrations/versions/06552e22f9e7_add_comment_updated_by.py +50 -0
  16. {zou-0.20.19 → zou-0.20.21/zou.egg-info}/PKG-INFO +1 -1
  17. {zou-0.20.19 → zou-0.20.21}/zou.egg-info/SOURCES.txt +1 -0
  18. zou-0.20.19/zou/__init__.py +0 -1
  19. {zou-0.20.19 → zou-0.20.21}/LICENSE +0 -0
  20. {zou-0.20.19 → zou-0.20.21}/README.rst +0 -0
  21. {zou-0.20.19 → zou-0.20.21}/pyproject.toml +0 -0
  22. {zou-0.20.19 → zou-0.20.21}/setup.cfg +0 -0
  23. {zou-0.20.19 → zou-0.20.21}/setup.py +0 -0
  24. {zou-0.20.19 → zou-0.20.21}/zou/app/__init__.py +0 -0
  25. {zou-0.20.19 → zou-0.20.21}/zou/app/api.py +0 -0
  26. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/__init__.py +0 -0
  27. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/assets/__init__.py +0 -0
  28. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/auth/__init__.py +0 -0
  29. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/auth/resources.py +0 -0
  30. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/breakdown/__init__.py +0 -0
  31. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/breakdown/resources.py +0 -0
  32. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/chats/__init__.py +0 -0
  33. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/chats/resources.py +0 -0
  34. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/comments/__init__.py +0 -0
  35. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/concepts/__init__.py +0 -0
  36. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/concepts/resources.py +0 -0
  37. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/crud/__init__.py +0 -0
  38. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/crud/asset_instance.py +0 -0
  39. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/crud/attachment_file.py +0 -0
  40. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/crud/base.py +0 -0
  41. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/crud/chat.py +0 -0
  42. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/crud/chat_message.py +0 -0
  43. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/crud/custom_action.py +0 -0
  44. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/crud/day_off.py +0 -0
  45. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/crud/department.py +0 -0
  46. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/crud/entity.py +0 -0
  47. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/crud/entity_link.py +0 -0
  48. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/crud/entity_type.py +0 -0
  49. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/crud/event.py +0 -0
  50. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/crud/file_status.py +0 -0
  51. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/crud/metadata_descriptor.py +0 -0
  52. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/crud/milestone.py +0 -0
  53. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/crud/news.py +0 -0
  54. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/crud/notification.py +0 -0
  55. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/crud/organisation.py +0 -0
  56. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/crud/output_file.py +0 -0
  57. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/crud/output_type.py +0 -0
  58. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/crud/person.py +0 -0
  59. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/crud/playlist.py +0 -0
  60. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/crud/preview_background_file.py +0 -0
  61. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/crud/preview_file.py +0 -0
  62. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/crud/project.py +0 -0
  63. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/crud/project_status.py +0 -0
  64. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/crud/schedule_item.py +0 -0
  65. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/crud/search_filter.py +0 -0
  66. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/crud/search_filter_group.py +0 -0
  67. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/crud/software.py +0 -0
  68. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/crud/status_automation.py +0 -0
  69. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/crud/studio.py +0 -0
  70. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/crud/subscription.py +0 -0
  71. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/crud/task.py +0 -0
  72. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/crud/task_status.py +0 -0
  73. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/crud/task_type.py +0 -0
  74. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/crud/time_spent.py +0 -0
  75. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/edits/__init__.py +0 -0
  76. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/edits/resources.py +0 -0
  77. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/entities/__init__.py +0 -0
  78. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/entities/resources.py +0 -0
  79. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/events/__init__.py +0 -0
  80. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/events/resources.py +0 -0
  81. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/export/__init__.py +0 -0
  82. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/export/csv/__init__.py +0 -0
  83. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/export/csv/assets.py +0 -0
  84. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/export/csv/base.py +0 -0
  85. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/export/csv/casting.py +0 -0
  86. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/export/csv/edits.py +0 -0
  87. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/export/csv/persons.py +0 -0
  88. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/export/csv/playlists.py +0 -0
  89. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/export/csv/projects.py +0 -0
  90. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/export/csv/shots.py +0 -0
  91. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/export/csv/task_types.py +0 -0
  92. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/export/csv/tasks.py +0 -0
  93. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/export/csv/time_spents.py +0 -0
  94. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/files/__init__.py +0 -0
  95. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/index/__init__.py +0 -0
  96. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/index/resources.py +0 -0
  97. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/news/__init__.py +0 -0
  98. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/news/resources.py +0 -0
  99. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/persons/__init__.py +0 -0
  100. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/persons/resources.py +0 -0
  101. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/playlists/__init__.py +0 -0
  102. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/playlists/resources.py +0 -0
  103. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/previews/__init__.py +0 -0
  104. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/projects/__init__.py +0 -0
  105. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/projects/resources.py +0 -0
  106. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/search/__init__.py +0 -0
  107. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/search/resources.py +0 -0
  108. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/shots/__init__.py +0 -0
  109. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/shots/resources.py +0 -0
  110. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/source/__init__.py +0 -0
  111. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/source/csv/__init__.py +0 -0
  112. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/source/csv/assets.py +0 -0
  113. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/source/csv/base.py +0 -0
  114. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/source/csv/casting.py +0 -0
  115. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/source/csv/edits.py +0 -0
  116. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/source/csv/persons.py +0 -0
  117. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/source/csv/shots.py +0 -0
  118. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/source/csv/task_type_estimations.py +0 -0
  119. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/source/kitsu.py +0 -0
  120. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/source/otio.py +0 -0
  121. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/source/shotgun/__init__.py +0 -0
  122. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/source/shotgun/assets.py +0 -0
  123. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/source/shotgun/base.py +0 -0
  124. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/source/shotgun/episode.py +0 -0
  125. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/source/shotgun/exception.py +0 -0
  126. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/source/shotgun/import_errors.py +0 -0
  127. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/source/shotgun/notes.py +0 -0
  128. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/source/shotgun/person.py +0 -0
  129. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/source/shotgun/project.py +0 -0
  130. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/source/shotgun/scene.py +0 -0
  131. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/source/shotgun/sequence.py +0 -0
  132. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/source/shotgun/shot.py +0 -0
  133. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/source/shotgun/status.py +0 -0
  134. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/source/shotgun/steps.py +0 -0
  135. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/source/shotgun/tasks.py +0 -0
  136. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/source/shotgun/team.py +0 -0
  137. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/source/shotgun/versions.py +0 -0
  138. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/tasks/__init__.py +0 -0
  139. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/user/__init__.py +0 -0
  140. {zou-0.20.19 → zou-0.20.21}/zou/app/blueprints/user/resources.py +0 -0
  141. {zou-0.20.19 → zou-0.20.21}/zou/app/config.py +0 -0
  142. {zou-0.20.19 → zou-0.20.21}/zou/app/file_trees/default.json +0 -0
  143. {zou-0.20.19 → zou-0.20.21}/zou/app/file_trees/simple.json +0 -0
  144. {zou-0.20.19 → zou-0.20.21}/zou/app/indexer/__init__.py +0 -0
  145. {zou-0.20.19 → zou-0.20.21}/zou/app/indexer/indexing.py +0 -0
  146. {zou-0.20.19 → zou-0.20.21}/zou/app/mixin.py +0 -0
  147. {zou-0.20.19 → zou-0.20.21}/zou/app/models/__init__.py +0 -0
  148. {zou-0.20.19 → zou-0.20.21}/zou/app/models/asset_instance.py +0 -0
  149. {zou-0.20.19 → zou-0.20.21}/zou/app/models/attachment_file.py +0 -0
  150. {zou-0.20.19 → zou-0.20.21}/zou/app/models/base.py +0 -0
  151. {zou-0.20.19 → zou-0.20.21}/zou/app/models/build_job.py +0 -0
  152. {zou-0.20.19 → zou-0.20.21}/zou/app/models/chat.py +0 -0
  153. {zou-0.20.19 → zou-0.20.21}/zou/app/models/chat_message.py +0 -0
  154. {zou-0.20.19 → zou-0.20.21}/zou/app/models/custom_action.py +0 -0
  155. {zou-0.20.19 → zou-0.20.21}/zou/app/models/data_import_error.py +0 -0
  156. {zou-0.20.19 → zou-0.20.21}/zou/app/models/day_off.py +0 -0
  157. {zou-0.20.19 → zou-0.20.21}/zou/app/models/department.py +0 -0
  158. {zou-0.20.19 → zou-0.20.21}/zou/app/models/desktop_login_log.py +0 -0
  159. {zou-0.20.19 → zou-0.20.21}/zou/app/models/entity.py +0 -0
  160. {zou-0.20.19 → zou-0.20.21}/zou/app/models/entity_type.py +0 -0
  161. {zou-0.20.19 → zou-0.20.21}/zou/app/models/event.py +0 -0
  162. {zou-0.20.19 → zou-0.20.21}/zou/app/models/file_status.py +0 -0
  163. {zou-0.20.19 → zou-0.20.21}/zou/app/models/login_log.py +0 -0
  164. {zou-0.20.19 → zou-0.20.21}/zou/app/models/metadata_descriptor.py +0 -0
  165. {zou-0.20.19 → zou-0.20.21}/zou/app/models/milestone.py +0 -0
  166. {zou-0.20.19 → zou-0.20.21}/zou/app/models/news.py +0 -0
  167. {zou-0.20.19 → zou-0.20.21}/zou/app/models/notification.py +0 -0
  168. {zou-0.20.19 → zou-0.20.21}/zou/app/models/organisation.py +0 -0
  169. {zou-0.20.19 → zou-0.20.21}/zou/app/models/output_file.py +0 -0
  170. {zou-0.20.19 → zou-0.20.21}/zou/app/models/output_type.py +0 -0
  171. {zou-0.20.19 → zou-0.20.21}/zou/app/models/person.py +0 -0
  172. {zou-0.20.19 → zou-0.20.21}/zou/app/models/playlist.py +0 -0
  173. {zou-0.20.19 → zou-0.20.21}/zou/app/models/preview_background_file.py +0 -0
  174. {zou-0.20.19 → zou-0.20.21}/zou/app/models/preview_file.py +0 -0
  175. {zou-0.20.19 → zou-0.20.21}/zou/app/models/project.py +0 -0
  176. {zou-0.20.19 → zou-0.20.21}/zou/app/models/project_status.py +0 -0
  177. {zou-0.20.19 → zou-0.20.21}/zou/app/models/schedule_item.py +0 -0
  178. {zou-0.20.19 → zou-0.20.21}/zou/app/models/search_filter.py +0 -0
  179. {zou-0.20.19 → zou-0.20.21}/zou/app/models/search_filter_group.py +0 -0
  180. {zou-0.20.19 → zou-0.20.21}/zou/app/models/serializer.py +0 -0
  181. {zou-0.20.19 → zou-0.20.21}/zou/app/models/software.py +0 -0
  182. {zou-0.20.19 → zou-0.20.21}/zou/app/models/status_automation.py +0 -0
  183. {zou-0.20.19 → zou-0.20.21}/zou/app/models/studio.py +0 -0
  184. {zou-0.20.19 → zou-0.20.21}/zou/app/models/subscription.py +0 -0
  185. {zou-0.20.19 → zou-0.20.21}/zou/app/models/task.py +0 -0
  186. {zou-0.20.19 → zou-0.20.21}/zou/app/models/task_status.py +0 -0
  187. {zou-0.20.19 → zou-0.20.21}/zou/app/models/task_type.py +0 -0
  188. {zou-0.20.19 → zou-0.20.21}/zou/app/models/time_spent.py +0 -0
  189. {zou-0.20.19 → zou-0.20.21}/zou/app/models/working_file.py +0 -0
  190. {zou-0.20.19 → zou-0.20.21}/zou/app/services/__init__.py +0 -0
  191. {zou-0.20.19 → zou-0.20.21}/zou/app/services/assets_service.py +0 -0
  192. {zou-0.20.19 → zou-0.20.21}/zou/app/services/auth_service.py +0 -0
  193. {zou-0.20.19 → zou-0.20.21}/zou/app/services/backup_service.py +0 -0
  194. {zou-0.20.19 → zou-0.20.21}/zou/app/services/base_service.py +0 -0
  195. {zou-0.20.19 → zou-0.20.21}/zou/app/services/breakdown_service.py +0 -0
  196. {zou-0.20.19 → zou-0.20.21}/zou/app/services/chats_service.py +0 -0
  197. {zou-0.20.19 → zou-0.20.21}/zou/app/services/comments_service.py +0 -0
  198. {zou-0.20.19 → zou-0.20.21}/zou/app/services/concepts_service.py +0 -0
  199. {zou-0.20.19 → zou-0.20.21}/zou/app/services/custom_actions_service.py +0 -0
  200. {zou-0.20.19 → zou-0.20.21}/zou/app/services/deletion_service.py +0 -0
  201. {zou-0.20.19 → zou-0.20.21}/zou/app/services/edits_service.py +0 -0
  202. {zou-0.20.19 → zou-0.20.21}/zou/app/services/emails_service.py +0 -0
  203. {zou-0.20.19 → zou-0.20.21}/zou/app/services/entities_service.py +0 -0
  204. {zou-0.20.19 → zou-0.20.21}/zou/app/services/events_service.py +0 -0
  205. {zou-0.20.19 → zou-0.20.21}/zou/app/services/exception.py +0 -0
  206. {zou-0.20.19 → zou-0.20.21}/zou/app/services/file_tree_service.py +0 -0
  207. {zou-0.20.19 → zou-0.20.21}/zou/app/services/files_service.py +0 -0
  208. {zou-0.20.19 → zou-0.20.21}/zou/app/services/index_service.py +0 -0
  209. {zou-0.20.19 → zou-0.20.21}/zou/app/services/names_service.py +0 -0
  210. {zou-0.20.19 → zou-0.20.21}/zou/app/services/news_service.py +0 -0
  211. {zou-0.20.19 → zou-0.20.21}/zou/app/services/notifications_service.py +0 -0
  212. {zou-0.20.19 → zou-0.20.21}/zou/app/services/persons_service.py +0 -0
  213. {zou-0.20.19 → zou-0.20.21}/zou/app/services/playlists_service.py +0 -0
  214. {zou-0.20.19 → zou-0.20.21}/zou/app/services/preview_files_service.py +0 -0
  215. {zou-0.20.19 → zou-0.20.21}/zou/app/services/projects_service.py +0 -0
  216. {zou-0.20.19 → zou-0.20.21}/zou/app/services/scenes_service.py +0 -0
  217. {zou-0.20.19 → zou-0.20.21}/zou/app/services/schedule_service.py +0 -0
  218. {zou-0.20.19 → zou-0.20.21}/zou/app/services/shots_service.py +0 -0
  219. {zou-0.20.19 → zou-0.20.21}/zou/app/services/stats_service.py +0 -0
  220. {zou-0.20.19 → zou-0.20.21}/zou/app/services/status_automations_service.py +0 -0
  221. {zou-0.20.19 → zou-0.20.21}/zou/app/services/telemetry_services.py +0 -0
  222. {zou-0.20.19 → zou-0.20.21}/zou/app/services/time_spents_service.py +0 -0
  223. {zou-0.20.19 → zou-0.20.21}/zou/app/stores/__init__.py +0 -0
  224. {zou-0.20.19 → zou-0.20.21}/zou/app/stores/auth_tokens_store.py +0 -0
  225. {zou-0.20.19 → zou-0.20.21}/zou/app/stores/file_store.py +0 -0
  226. {zou-0.20.19 → zou-0.20.21}/zou/app/stores/publisher_store.py +0 -0
  227. {zou-0.20.19 → zou-0.20.21}/zou/app/stores/queue_store.py +0 -0
  228. {zou-0.20.19 → zou-0.20.21}/zou/app/swagger.py +0 -0
  229. {zou-0.20.19 → zou-0.20.21}/zou/app/utils/__init__.py +0 -0
  230. {zou-0.20.19 → zou-0.20.21}/zou/app/utils/api.py +0 -0
  231. {zou-0.20.19 → zou-0.20.21}/zou/app/utils/auth.py +0 -0
  232. {zou-0.20.19 → zou-0.20.21}/zou/app/utils/cache.py +0 -0
  233. {zou-0.20.19 → zou-0.20.21}/zou/app/utils/chats.py +0 -0
  234. {zou-0.20.19 → zou-0.20.21}/zou/app/utils/colors.py +0 -0
  235. {zou-0.20.19 → zou-0.20.21}/zou/app/utils/csv_utils.py +0 -0
  236. {zou-0.20.19 → zou-0.20.21}/zou/app/utils/date_helpers.py +0 -0
  237. {zou-0.20.19 → zou-0.20.21}/zou/app/utils/dbhelpers.py +0 -0
  238. {zou-0.20.19 → zou-0.20.21}/zou/app/utils/emails.py +0 -0
  239. {zou-0.20.19 → zou-0.20.21}/zou/app/utils/env.py +0 -0
  240. {zou-0.20.19 → zou-0.20.21}/zou/app/utils/events.py +0 -0
  241. {zou-0.20.19 → zou-0.20.21}/zou/app/utils/fido.py +0 -0
  242. {zou-0.20.19 → zou-0.20.21}/zou/app/utils/fields.py +0 -0
  243. {zou-0.20.19 → zou-0.20.21}/zou/app/utils/flask.py +0 -0
  244. {zou-0.20.19 → zou-0.20.21}/zou/app/utils/fs.py +0 -0
  245. {zou-0.20.19 → zou-0.20.21}/zou/app/utils/git.py +0 -0
  246. {zou-0.20.19 → zou-0.20.21}/zou/app/utils/logs.py +0 -0
  247. {zou-0.20.19 → zou-0.20.21}/zou/app/utils/monitoring.py +0 -0
  248. {zou-0.20.19 → zou-0.20.21}/zou/app/utils/permissions.py +0 -0
  249. {zou-0.20.19 → zou-0.20.21}/zou/app/utils/query.py +0 -0
  250. {zou-0.20.19 → zou-0.20.21}/zou/app/utils/redis.py +0 -0
  251. {zou-0.20.19 → zou-0.20.21}/zou/app/utils/remote_job.py +0 -0
  252. {zou-0.20.19 → zou-0.20.21}/zou/app/utils/saml.py +0 -0
  253. {zou-0.20.19 → zou-0.20.21}/zou/app/utils/shell.py +0 -0
  254. {zou-0.20.19 → zou-0.20.21}/zou/app/utils/string.py +0 -0
  255. {zou-0.20.19 → zou-0.20.21}/zou/app/utils/thumbnail.py +0 -0
  256. {zou-0.20.19 → zou-0.20.21}/zou/cli.py +1 -1
  257. {zou-0.20.19 → zou-0.20.21}/zou/debug.py +0 -0
  258. {zou-0.20.19 → zou-0.20.21}/zou/event_stream.py +0 -0
  259. {zou-0.20.19 → zou-0.20.21}/zou/job_settings.py +0 -0
  260. {zou-0.20.19 → zou-0.20.21}/zou/migrations/README +0 -0
  261. {zou-0.20.19 → zou-0.20.21}/zou/migrations/__init__.py +0 -0
  262. {zou-0.20.19 → zou-0.20.21}/zou/migrations/alembic.ini +0 -0
  263. {zou-0.20.19 → zou-0.20.21}/zou/migrations/env.py +0 -0
  264. {zou-0.20.19 → zou-0.20.21}/zou/migrations/script.py.mako +0 -0
  265. {zou-0.20.19 → zou-0.20.21}/zou/migrations/utils/__init__.py +0 -0
  266. {zou-0.20.19 → zou-0.20.21}/zou/migrations/utils/base.py +0 -0
  267. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/003be8a91001_add_start_and_end_dates_to_projects.py +0 -0
  268. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/0596674df51d_add_department_mentions_to_comments.py +0 -0
  269. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/05ac7e8caa21_remove_unique_constraint_for_taskstatus_.py +0 -0
  270. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/05b7dc79a416_add_archived_fields_to_main_tables.py +0 -0
  271. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/0cf5e0e035fa_drop_column_tasktype_for_shots.py +0 -0
  272. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/0ec3762a745d_add_attachment_table.py +0 -0
  273. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/0ef6416a507b_.py +0 -0
  274. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/10cf267d95c9_fix_schedule_item.py +0 -0
  275. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/16328eae4b5f_add_new_constraint_for_timespent.py +0 -0
  276. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/16df47d76c64_add_some_indexes.py +0 -0
  277. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/17ef8f7be758_disallow_null_choicetype.py +0 -0
  278. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/1bb55759146f_add_table_studio.py +0 -0
  279. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/1cb44194db49_add_file_size_field_to_preview_file.py +0 -0
  280. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/1e150c2cea4d_add_nb_entities_out.py +0 -0
  281. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/1e2d77a2f0c4_add_hd_by_default_column.py +0 -0
  282. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/1fab8c420678_add_attachments_to_message_chats.py +0 -0
  283. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/20a8ad264659_tasktypeassettypelink_.py +0 -0
  284. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/20dfeb36142b_add_projecttaskstatuslink_roles_for_.py +0 -0
  285. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/23122f290ca2_add_entity_chat_models.py +0 -0
  286. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/269d41bfb73f_add_entity_entity_links.py +0 -0
  287. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/29df910f04a4_create_unique_constraint_project_id_.py +0 -0
  288. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/29fe01a6c9eb_add_status_automation_field.py +0 -0
  289. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/2adc020885fa_.py +0 -0
  290. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/2baede80b111_add_entity_status_field.py +0 -0
  291. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/306266361f4f_.py +0 -0
  292. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/328fd44c6347_add_entity_created_by.py +0 -0
  293. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/32f134ff1201_add_is_shared_flag_to_filters.py +0 -0
  294. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/346250b5304c_add_position_to_preview_files.py +0 -0
  295. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/3476e147e632_add_acks_to_comments.py +0 -0
  296. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/389cfb9de776_.py +0 -0
  297. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/38baa9a23b3d_.py +0 -0
  298. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/398150912a3f_validation_status_preview.py +0 -0
  299. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/3b0d1321079e_.py +0 -0
  300. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/3d5c93bafb9d_.py +0 -0
  301. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/3e0538ddf80f_.py +0 -0
  302. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/3fee3bd10f9d_.py +0 -0
  303. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/4095103c7d01_add_is_clients_isolated_flag_to_projects.py +0 -0
  304. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/40dea9555940_.py +0 -0
  305. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/42ec83db6a01_change_person_preferred_two_factor_.py +0 -0
  306. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/43d0cf0ed5e7_.py +0 -0
  307. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/443d1e78a932_.py +0 -0
  308. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/45c2de366e66_.py +0 -0
  309. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/45dafbb3f4e1_for_person_contract_type_disallow_null.py +0 -0
  310. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/4715c2586036_add_last_preview_file_fields.py +0 -0
  311. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/4e3738cdc34c_.py +0 -0
  312. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/4f2398ebcd49_.py +0 -0
  313. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/523ee9647bee_.py +0 -0
  314. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/539a3a00c417_for_departmentlink_index_person_id_.py +0 -0
  315. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/54ee0d1d60ba_add_build_job_model.py +0 -0
  316. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/556526e47daa_.py +0 -0
  317. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/57222395f2be_add_statusautomation_import_last_revision.py +0 -0
  318. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/5798d2c9020b_change_person_role_to_choicetype.py +0 -0
  319. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/590aa1ffe731_add_notifications_enabled_flag.py +0 -0
  320. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/59a7445a966c_add_entity_is_shared.py +0 -0
  321. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/5a291251823c_add_max_retake_parameter.py +0 -0
  322. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/5ab9d7a75887_.py +0 -0
  323. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/5b0fcbb94f24_.py +0 -0
  324. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/5b7fa3e51701_add_is_client_allowed_flag_to_task_.py +0 -0
  325. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/5b980f0dc365_add_comment_links.py +0 -0
  326. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/5b9fd9ddfe43_add_homepage_and_contract_fields.py +0 -0
  327. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/5c0498e264bc_add_slack_fields.py +0 -0
  328. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/5e2ce62632a6_add_workflow_to_project.py +0 -0
  329. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/680c64565f9d_for_searchfiltergroup_is_shared.py +0 -0
  330. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/693cc511d28d_add_taskstatus_priority.py +0 -0
  331. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/6aa446ee4072_add_is_for_all_flage_to_playlists.py +0 -0
  332. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/6bd3b102d61b_.py +0 -0
  333. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/6c597e842afa_add_task_type_field_to_playlists.py +0 -0
  334. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/6d1b2c60f58b_add_milestone_model.py +0 -0
  335. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/6d7fa5a8e9a5_add_timesheets_locked_field_to_org.py +0 -0
  336. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/6eeaff945706_add_data_field_on_entity_links.py +0 -0
  337. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/6f6049877105_.py +0 -0
  338. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/7417c8eb70d8_add_for_entity_field_to_playlists.py +0 -0
  339. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/772a5e43f05b_.py +0 -0
  340. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/7748d3d22925_add_columns_to_searchfilter_table_to_.py +0 -0
  341. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/77d6820f494f_add_reply_to_notif.py +0 -0
  342. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/7b1f765677d8_.py +0 -0
  343. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/7bc746997e8d_add_slack_token_field_to_organisation.py +0 -0
  344. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/7dc79d4ed7cd_.py +0 -0
  345. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/818f7bda2528_.py +0 -0
  346. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/82e7f7a95e84_add_project_id_to_events.py +0 -0
  347. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/82ee682204ab_add_is_generated_from_ldap_column_to_.py +0 -0
  348. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/8588f254d6b8_add_archived_fields.py +0 -0
  349. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/8739ae9fa28b_add_for_client_field.py +0 -0
  350. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/87efceb6745b_add_ready_for_to_entity.py +0 -0
  351. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/892b264937ec_.py +0 -0
  352. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/8a1b4a1b7f4a_add_totp_columns_for_person.py +0 -0
  353. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/8e4f39e321f4_add_day_off_table.py +0 -0
  354. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/8e67c183bed7_add_preference_fields.py +0 -0
  355. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/8fbd40afbe5f_allow_to_set_float_values_for_.py +0 -0
  356. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/9010a64e5a2d_add_indices.py +0 -0
  357. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/9060dd4f6116_notification_uc.py +0 -0
  358. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/925771029620_.py +0 -0
  359. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/92b40d79ad3f_allow_message_attachments.py +0 -0
  360. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/92bdfe07e5f5_discord_integration.py +0 -0
  361. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/956659992419_add_columns_for_person_to_store_fido_.py +0 -0
  362. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/96c79d31e648_add_mail_otp_columns_for_person.py +0 -0
  363. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/96f58a4a2a58_person_partial_index_for_email_only_.py +0 -0
  364. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/971dbf5a0faf_add_short_name_for_asset_type_entity_.py +0 -0
  365. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/98c90621cf58_add_for_client_flag_to_playlist.py +0 -0
  366. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/99825b9cc778_.py +0 -0
  367. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/9a09467f9b2c_.py +0 -0
  368. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/9b85c14fa8a7_add_day_off_new_columns.py +0 -0
  369. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/9bd17364fc18_.py +0 -0
  370. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/9d3bb33c6fc6_add_department_keys_to_filter_models.py +0 -0
  371. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/9e5b3a9b0cee_add_new_column_metadatadescriptor_data_type_.py +0 -0
  372. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/9f8445f9b42c_add_man_days_fields.py +0 -0
  373. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/a23682ccc1f1_.py +0 -0
  374. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/a252a094e977_add_descriptions_for_entities_tasks_and_.py +0 -0
  375. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/a519c710877c_.py +0 -0
  376. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/a65bdadbae2f_.py +0 -0
  377. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/a66508788c53_add_nb_assets_ready.py +0 -0
  378. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/a6c25eed3ea1_add_login_failed_attemps_and_last_login_.py +0 -0
  379. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/a7c43f3fbc76_add_duration_column_to_the_preview_file.py +0 -0
  380. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/aa0a60033106_feedback_request.py +0 -0
  381. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/addbbefa7028_add_departments_link_to_metadata_.py +0 -0
  382. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/ae0127f2fc56_add_previewfile_width_and_previewfile_.py +0 -0
  383. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/af1790868e2c_.py +0 -0
  384. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/b45cb782bb9c_.py +0 -0
  385. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/b4dd0add5f79_.py +0 -0
  386. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/b8c0a0f9d054_drop_task_status_is_reviewable.py +0 -0
  387. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/b8ed0fb263f8_add_person_jti_and_jti_expiration_date.py +0 -0
  388. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/b97a71306fc8_add_is_casting_standby_column_to_entity.py +0 -0
  389. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/be56dc0fb760_for_is_shared_disallow_nullable.py +0 -0
  390. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/bf1347acdee2_.py +0 -0
  391. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/c49e41f1298b_add_previewbackground.py +0 -0
  392. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/c68c2a62cfac_add_mimetype_column_to_attachment.py +0 -0
  393. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/c726b98be194_.py +0 -0
  394. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/c81f3e83bdb5_.py +0 -0
  395. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/ca28796a2a62_add_is_done_field_to_the_task_model.py +0 -0
  396. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/cf3d365de164_add_entity_version_model.py +0 -0
  397. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/cf6cec6d6bf5_add_status_field_to_preview_file.py +0 -0
  398. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/d80267806131_task_status_new_column_is_default.py +0 -0
  399. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/d8dcd5196d57_add_casting_label.py +0 -0
  400. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/de8a3de227ef_.py +0 -0
  401. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/deeacd38d373_for_projecttaskstatuslink_set_default_.py +0 -0
  402. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/df1834485f57_.py +0 -0
  403. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/df9f8a147e80_change_file_size_to_big_integer.py +0 -0
  404. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/e1ef93f40d3d_.py +0 -0
  405. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/e29638428dfd_add_schedule_item_table.py +0 -0
  406. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/e3f6db74cc1e_.py +0 -0
  407. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/e839d6603c09_add_person_id_to_shot_history.py +0 -0
  408. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/ee2373fbe3a4_.py +0 -0
  409. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/f0567e8d0c62_.py +0 -0
  410. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/f0c6cbb61869_add_production_style_field.py +0 -0
  411. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/f344b867a911_for_description_of_entity_task_working_.py +0 -0
  412. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/f4ff5a73d283_add_person_ldap_uid.py +0 -0
  413. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/f5b113876a49_add_preferred_two_factor_authentication_.py +0 -0
  414. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/f5bdca075cdc_add_preview_download_flag_to_projects.py +0 -0
  415. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/f874ad5e898a_add_link_entity_type_task_type.py +0 -0
  416. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/f995b28fb749_.py +0 -0
  417. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/fb6b6f188497_.py +0 -0
  418. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/fb87feaaa094_add_missing_unique_constraints.py +0 -0
  419. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/fba149993140_add_missing_index.py +0 -0
  420. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/fc322f908695_.py +0 -0
  421. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/fee7c696166e_.py +0 -0
  422. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/feffd3c5b806_introduce_concepts.py +0 -0
  423. {zou-0.20.19 → zou-0.20.21}/zou/migrations/versions/ffeed4956ab1_add_more_details_to_projects.py +0 -0
  424. {zou-0.20.19 → zou-0.20.21}/zou/remote/__init__.py +0 -0
  425. {zou-0.20.19 → zou-0.20.21}/zou/remote/config_payload.py +0 -0
  426. {zou-0.20.19 → zou-0.20.21}/zou/remote/normalize_movie.py +0 -0
  427. {zou-0.20.19 → zou-0.20.21}/zou/remote/playlist.py +0 -0
  428. {zou-0.20.19 → zou-0.20.21}/zou/utils/__init__.py +0 -0
  429. {zou-0.20.19 → zou-0.20.21}/zou/utils/movie.py +0 -0
  430. {zou-0.20.19 → zou-0.20.21}/zou.egg-info/dependency_links.txt +0 -0
  431. {zou-0.20.19 → zou-0.20.21}/zou.egg-info/entry_points.txt +0 -0
  432. {zou-0.20.19 → zou-0.20.21}/zou.egg-info/not-zip-safe +0 -0
  433. {zou-0.20.19 → zou-0.20.21}/zou.egg-info/requires.txt +0 -0
  434. {zou-0.20.19 → zou-0.20.21}/zou.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: zou
3
- Version: 0.20.19
3
+ Version: 0.20.21
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
@@ -0,0 +1 @@
1
+ __version__ = "0.20.21"
@@ -355,7 +355,7 @@ class AssetAssetsResource(Resource):
355
355
  return breakdown_service.get_entity_casting(asset_id)
356
356
 
357
357
 
358
- class AssetTasksResource(Resource):
358
+ class AssetTasksResource(Resource, ArgsMixin):
359
359
  @jwt_required()
360
360
  def get(self, asset_id):
361
361
  """
@@ -376,7 +376,9 @@ class AssetTasksResource(Resource):
376
376
  """
377
377
  asset = assets_service.get_asset(asset_id)
378
378
  user_service.check_project_access(asset["project_id"])
379
- return tasks_service.get_tasks_for_asset(asset_id)
379
+ return tasks_service.get_tasks_for_asset(
380
+ asset_id, relations=self.get_relations()
381
+ )
380
382
 
381
383
 
382
384
  class AssetTaskTypesResource(Resource):
@@ -190,7 +190,7 @@ class CommentTaskResource(Resource):
190
190
  links,
191
191
  ) = self.get_arguments()
192
192
 
193
- user_service.check_task_access(task_id)
193
+ user_service.check_task_action_access(task_id)
194
194
  user_service.check_task_status_access(task_status_id)
195
195
  files = request.files
196
196
 
@@ -491,7 +491,7 @@ class ReplyCommentResource(Resource, ArgsMixin):
491
491
  ]
492
492
  )
493
493
 
494
- user_service.check_task_access(task_id)
494
+ user_service.check_task_action_access(task_id)
495
495
  return comments_service.reply_comment(comment_id, args["text"])
496
496
 
497
497
 
@@ -530,7 +530,6 @@ class DeleteReplyCommentResource(Resource):
530
530
  200:
531
531
  description: Given comment reply deleted
532
532
  """
533
- user_service.check_task_access(task_id)
534
533
  reply = comments_service.get_reply(comment_id, reply_id)
535
534
  current_user = persons_service.get_current_user()
536
535
  if reply["person_id"] != current_user["id"]:
@@ -189,6 +189,11 @@ class CommentResource(BaseModelResource):
189
189
  )
190
190
  return comment
191
191
 
192
+ def update_data(self, data, instance_id):
193
+ data = super().update_data(data, instance_id)
194
+ data["updated_by"] = persons_service.get_current_user_raw().id
195
+ return data
196
+
192
197
  @jwt_required()
193
198
  def delete(self, instance_id):
194
199
  """
@@ -51,7 +51,7 @@ class WorkingFileResource(BaseModelResource):
51
51
 
52
52
  def check_update_permissions(self, instance, data):
53
53
  working_file = files_service.get_working_file(instance["id"])
54
- user_service.check_task_access(working_file["task_id"])
54
+ user_service.check_task_action_access(working_file["task_id"])
55
55
  return True
56
56
 
57
57
  @jwt_required()
@@ -768,7 +768,7 @@ class ModifiedFileResource(Resource):
768
768
  description: Working file modification date updated
769
769
  """
770
770
  working_file = files_service.get_working_file(working_file_id)
771
- user_service.check_task_access(working_file["task_id"])
771
+ user_service.check_task_action_access(working_file["task_id"])
772
772
  working_file = files_service.update_working_file(
773
773
  working_file_id,
774
774
  {"updated_at": date_helpers.get_utc_now_datetime()},
@@ -819,7 +819,7 @@ class CommentWorkingFileResource(Resource, ArgsMixin):
819
819
  )
820
820
 
821
821
  working_file = files_service.get_working_file(working_file_id)
822
- user_service.check_task_access(working_file["task_id"])
822
+ user_service.check_task_action_access(working_file["task_id"])
823
823
  working_file = self.update_comment(working_file_id, args["comment"])
824
824
  return working_file
825
825
 
@@ -419,7 +419,7 @@ class CreatePreviewFilePictureResource(
419
419
  raise PreviewFileReuploadNotAllowedException
420
420
 
421
421
  try:
422
- user_service.check_task_access(preview_file["task_id"])
422
+ user_service.check_task_action_access(preview_file["task_id"])
423
423
  return True
424
424
  except permissions.PermissionDenied:
425
425
  return False
@@ -474,14 +474,14 @@ class BaseBatchComment(BaseNewPreviewFilePicture, ArgsMixin):
474
474
  args = self.get_comments_args()
475
475
 
476
476
  if task_id is not None:
477
- user_service.check_task_access(task_id)
477
+ user_service.check_task_action_access(task_id)
478
478
 
479
479
  new_comments = []
480
480
  for i, comment in enumerate(args["comments"]):
481
481
  user_service.check_task_status_access(comment["task_status_id"])
482
482
 
483
483
  if task_id is None:
484
- user_service.check_task_access(comment["task_id"])
484
+ user_service.check_task_action_access(comment["task_id"])
485
485
 
486
486
  if not permissions.has_manager_permissions():
487
487
  comment["person_id"] = None
@@ -1322,7 +1322,7 @@ class UpdatePreviewPositionResource(Resource, ArgsMixin):
1322
1322
  """
1323
1323
  args = self.get_args([{"name": "position", "default": 0, "type": int}])
1324
1324
  preview_file = files_service.get_preview_file(preview_file_id)
1325
- user_service.check_task_access(preview_file["task_id"])
1325
+ user_service.check_task_action_access(preview_file["task_id"])
1326
1326
  return preview_files_service.update_preview_file_position(
1327
1327
  preview_file_id, args["position"]
1328
1328
  )
@@ -69,7 +69,7 @@ class AddPreviewResource(Resource, ArgsMixin):
69
69
  """
70
70
  args = self.get_args([("revision", 0, False, int)])
71
71
 
72
- user_service.check_task_access(task_id)
72
+ user_service.check_task_action_access(task_id)
73
73
 
74
74
  person = persons_service.get_current_user()
75
75
  preview_file = tasks_service.add_preview_file_to_comment(
@@ -117,7 +117,7 @@ class AddExtraPreviewResource(Resource, ArgsMixin):
117
117
  201:
118
118
  description: Preview added to given comment
119
119
  """
120
- user_service.check_task_access(task_id)
120
+ user_service.check_task_action_access(task_id)
121
121
  tasks_service.get_comment(comment_id)
122
122
 
123
123
  person = persons_service.get_current_user()
@@ -101,6 +101,12 @@ class Comment(db.Model, BaseMixin, SerializerMixin):
101
101
  nullable=False,
102
102
  index=True,
103
103
  )
104
+ updated_by = db.Column(
105
+ UUIDType(binary=False),
106
+ db.ForeignKey("person.id"),
107
+ default=None,
108
+ index=True,
109
+ )
104
110
  preview_file_id = db.Column(
105
111
  UUIDType(binary=False), db.ForeignKey("preview_file.id")
106
112
  )
@@ -43,6 +43,7 @@ from zou.app.models.task_status import TaskStatus
43
43
  from zou.app.models.task_type import TaskType
44
44
  from zou.app.models.time_spent import TimeSpent
45
45
  from zou.app.models.studio import Studio
46
+ from zou.app.models.status_automation import StatusAutomation
46
47
 
47
48
  from zou.app.services import deletion_service, tasks_service, projects_service
48
49
  from zou.app.stores import file_store
@@ -103,6 +104,7 @@ event_name_model_map = {
103
104
  "subscription": Subscription,
104
105
  "search-filter": SearchFilter,
105
106
  "search-filter-group": SearchFilterGroup,
107
+ "status-automation": StatusAutomation,
106
108
  "studio": Studio,
107
109
  "task": Task,
108
110
  "task-status": TaskStatus,
@@ -142,6 +144,7 @@ event_name_model_path_map = {
142
144
  "search-filter": "search-filters",
143
145
  "search-filter-group": "search-filter-groups",
144
146
  "subscription": "subscriptions",
147
+ "status-automation": "status-automations",
145
148
  "studio": "studios",
146
149
  "task": "tasks",
147
150
  "task-status": "task-status",
@@ -176,6 +179,7 @@ main_events = [
176
179
  "department",
177
180
  "task-type",
178
181
  "task-status",
182
+ "status-automation",
179
183
  "custom-action",
180
184
  "organisation",
181
185
  "project-status",
@@ -286,6 +290,8 @@ def run_main_data_sync(project=None):
286
290
  Retrieve and import all cross-projects data from source instance.
287
291
  """
288
292
  for event in main_events:
293
+ if project is None and event == "project":
294
+ continue
289
295
  path = event_name_model_path_map[event]
290
296
  model = event_name_model_map[event]
291
297
  sync_entries(path, model, project=project)
@@ -587,11 +587,13 @@ def get_comments(task_id, is_client=False, is_manager=False):
587
587
 
588
588
 
589
589
  def _prepare_query(task_id, is_client, is_manager):
590
+ UpdatedBy = aliased(Person, name="updated_by")
590
591
  query = (
591
592
  Comment.query.order_by(Comment.created_at.desc())
592
593
  .filter_by(object_id=task_id)
593
594
  .join(Person, Comment.person_id == Person.id)
594
595
  .join(TaskStatus, Comment.task_status_id == TaskStatus.id)
596
+ .join(UpdatedBy, Comment.updated_by == UpdatedBy.id, isouter=True)
595
597
  .add_columns(
596
598
  TaskStatus.name,
597
599
  TaskStatus.short_name,
@@ -599,6 +601,9 @@ def _prepare_query(task_id, is_client, is_manager):
599
601
  Person.first_name,
600
602
  Person.last_name,
601
603
  Person.has_avatar,
604
+ UpdatedBy.first_name,
605
+ UpdatedBy.last_name,
606
+ UpdatedBy.has_avatar,
602
607
  )
603
608
  )
604
609
  if not is_manager and not is_client:
@@ -618,6 +623,9 @@ def _run_task_comments_query(query):
618
623
  person_first_name,
619
624
  person_last_name,
620
625
  person_has_avatar,
626
+ updated_by_first_name,
627
+ updated_by_last_name,
628
+ updated_by_has_avatar,
621
629
  ) = result
622
630
 
623
631
  comment_dict = comment.serialize()
@@ -627,6 +635,13 @@ def _run_task_comments_query(query):
627
635
  "has_avatar": person_has_avatar,
628
636
  "id": str(comment.person_id),
629
637
  }
638
+ if comment.updated_by is not None:
639
+ comment_dict["updated_by"] = {
640
+ "first_name": updated_by_first_name,
641
+ "last_name": updated_by_last_name,
642
+ "has_avatar": updated_by_has_avatar,
643
+ "id": str(comment.updated_by),
644
+ }
630
645
  comment_dict["task_status"] = {
631
646
  "name": task_status_name,
632
647
  "short_name": task_status_short_name,
@@ -1140,7 +1155,7 @@ def get_last_comment_map(task_ids):
1140
1155
  task_comment_map = {}
1141
1156
  comments = (
1142
1157
  Comment.query.filter(Comment.object_id.in_(task_ids))
1143
- .join(Person)
1158
+ .join(Person, Comment.person_id == Person.id)
1144
1159
  .filter(Person.role != "client")
1145
1160
  .order_by(Comment.object_id, Comment.created_at)
1146
1161
  .all()
@@ -1960,22 +1975,26 @@ def get_open_tasks(
1960
1975
  query = query.filter(Task.assignees == None)
1961
1976
  query_stats = query_stats.filter(Task.assignees == None)
1962
1977
  else:
1963
- query = query.filter(Task.assignees.any(
1964
- Person.id.in_(person_id.split(","))
1965
- ))
1966
- query_stats = query_stats.filter(Task.assignees.any(
1967
- Person.id.in_(person_id.split(","))
1968
- ))
1978
+ query = query.filter(
1979
+ Task.assignees.any(Person.id.in_(person_id.split(",")))
1980
+ )
1981
+ query_stats = query_stats.filter(
1982
+ Task.assignees.any(Person.id.in_(person_id.split(",")))
1983
+ )
1969
1984
 
1970
1985
  if studio_id is not None:
1971
1986
  query = query.filter(Task.assignees.any(studio_id=studio_id))
1972
- query_stats = query_stats.filter(Task.assignees.any(studio_id=studio_id))
1987
+ query_stats = query_stats.filter(
1988
+ Task.assignees.any(studio_id=studio_id)
1989
+ )
1973
1990
 
1974
1991
  if department_id is not None:
1975
1992
  query = query.filter(
1976
- Task.assignees.any(Person.departments.any(id=department_id)))
1993
+ Task.assignees.any(Person.departments.any(id=department_id))
1994
+ )
1977
1995
  query_stats = query_stats.filter(
1978
- Task.assignees.any(Person.departments.any(id=department_id)))
1996
+ Task.assignees.any(Person.departments.any(id=department_id))
1997
+ )
1979
1998
 
1980
1999
  if start_date is not None:
1981
2000
  start_date = func.cast(start_date, Task.start_date.type)
@@ -1,5 +1,5 @@
1
1
  from sqlalchemy.orm import aliased
2
- from sqlalchemy import func, or_
2
+ from sqlalchemy import func, or_, and_
3
3
 
4
4
  from zou.app import config
5
5
  from zou.app.models.comment import Comment
@@ -488,6 +488,37 @@ def check_task_access(task_id):
488
488
  return True
489
489
 
490
490
 
491
+ def check_task_action_access(task_id):
492
+ """
493
+ Return true if current user can have access to a task action.
494
+ """
495
+ task = tasks_service.get_task(task_id, relations=True)
496
+ is_allowed = False
497
+ if permissions.has_admin_permissions():
498
+ is_allowed = True
499
+ elif check_belong_to_project(task["project_id"]):
500
+ if permissions.has_manager_permissions():
501
+ is_allowed = True
502
+ else:
503
+ user = persons_service.get_current_user(relations=True)
504
+ if permissions.has_supervisor_permissions():
505
+ is_allowed = (
506
+ user["departments"] == []
507
+ or tasks_service.get_task_type(task["task_type_id"])[
508
+ "department_id"
509
+ ]
510
+ in user["departments"]
511
+ )
512
+ else:
513
+ is_allowed = user["id"] in task["assignees"]
514
+ else:
515
+ is_allowed = False
516
+
517
+ if not is_allowed:
518
+ raise permissions.PermissionDenied
519
+ return is_allowed
520
+
521
+
491
522
  def check_comment_access(comment_id):
492
523
  """
493
524
  Return true if current user can have access to a comment.
@@ -797,10 +828,7 @@ def check_task_department_access_for_unassign(task_id, person_id=None):
797
828
  or task_type["department_id"] in user["departments"]
798
829
  )
799
830
  )
800
- or (
801
- user["id"] in task.get("assignees", [])
802
- and person_id == user["id"]
803
- )
831
+ or (user["id"] in task["assignees"] and person_id == user["id"])
804
832
  )
805
833
  )
806
834
  if not is_allowed:
@@ -1302,9 +1330,6 @@ def get_unread_notifications_count(notification_id=None):
1302
1330
  ).count()
1303
1331
 
1304
1332
 
1305
- from sqlalchemy import and_, func
1306
-
1307
-
1308
1333
  def get_last_notifications(
1309
1334
  notification_id=None,
1310
1335
  after=None,
@@ -409,20 +409,29 @@ def sync_with_ldap_server():
409
409
  and persons_service.is_user_limit_reached()
410
410
  ):
411
411
  raise IsUserLimitReachedException
412
- persons_service.update_person(
413
- person["id"],
414
- {
415
- "email": user["email"],
416
- "first_name": user["first_name"],
417
- "last_name": user["last_name"],
418
- "active": user["active"],
419
- "is_generated_from_ldap": True,
420
- "desktop_login": user["desktop_login"],
421
- "ldap_uid": user["ldap_uid"],
422
- },
423
- bypass_protected_accounts=True,
424
- )
425
- print(f"User {user['desktop_login']} updated.")
412
+
413
+ if any(
414
+ user[key] != person[key]
415
+ for key in [
416
+ key
417
+ for key in user.keys()
418
+ if key not in ["thumbnail", "emails"]
419
+ ]
420
+ ):
421
+ persons_service.update_person(
422
+ person["id"],
423
+ {
424
+ "email": user["email"],
425
+ "first_name": user["first_name"],
426
+ "last_name": user["last_name"],
427
+ "active": user["active"],
428
+ "is_generated_from_ldap": True,
429
+ "desktop_login": user["desktop_login"],
430
+ "ldap_uid": user["ldap_uid"],
431
+ },
432
+ bypass_protected_accounts=True,
433
+ )
434
+ print(f"User {user['desktop_login']} updated.")
426
435
  except IsUserLimitReachedException:
427
436
  print(
428
437
  f"User {user['desktop_login']} update failed (limit reached, limit {config.USER_LIMIT})."
@@ -0,0 +1,50 @@
1
+ """Add Comment.updated_by
2
+
3
+ Revision ID: 06552e22f9e7
4
+ Revises: fba149993140
5
+ Create Date: 2025-02-27 13:44:58.067787
6
+
7
+ """
8
+
9
+ from alembic import op
10
+ import sqlalchemy as sa
11
+ import sqlalchemy_utils
12
+ import sqlalchemy_utils
13
+ import uuid
14
+
15
+ # revision identifiers, used by Alembic.
16
+ revision = "06552e22f9e7"
17
+ down_revision = "fba149993140"
18
+ branch_labels = None
19
+ depends_on = None
20
+
21
+
22
+ def upgrade():
23
+ # ### commands auto generated by Alembic - please adjust! ###
24
+ with op.batch_alter_table("comment", schema=None) as batch_op:
25
+ batch_op.add_column(
26
+ sa.Column(
27
+ "updated_by",
28
+ sqlalchemy_utils.types.uuid.UUIDType(binary=False),
29
+ default=uuid.uuid4,
30
+ nullable=True,
31
+ )
32
+ )
33
+ batch_op.create_index(
34
+ batch_op.f("ix_comment_updated_by"), ["updated_by"], unique=False
35
+ )
36
+ batch_op.create_foreign_key(
37
+ "comment_updated_by_fkey", "person", ["updated_by"], ["id"]
38
+ )
39
+
40
+ # ### end Alembic commands ###
41
+
42
+
43
+ def downgrade():
44
+ # ### commands auto generated by Alembic - please adjust! ###
45
+ with op.batch_alter_table("comment", schema=None) as batch_op:
46
+ batch_op.drop_constraint("comment_updated_by_fkey", type_="foreignkey")
47
+ batch_op.drop_index(batch_op.f("ix_comment_updated_by"))
48
+ batch_op.drop_column("updated_by")
49
+
50
+ # ### end Alembic commands ###
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: zou
3
- Version: 0.20.19
3
+ Version: 0.20.21
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
@@ -270,6 +270,7 @@ zou/migrations/versions/003be8a91001_add_start_and_end_dates_to_projects.py
270
270
  zou/migrations/versions/0596674df51d_add_department_mentions_to_comments.py
271
271
  zou/migrations/versions/05ac7e8caa21_remove_unique_constraint_for_taskstatus_.py
272
272
  zou/migrations/versions/05b7dc79a416_add_archived_fields_to_main_tables.py
273
+ zou/migrations/versions/06552e22f9e7_add_comment_updated_by.py
273
274
  zou/migrations/versions/0cf5e0e035fa_drop_column_tasktype_for_shots.py
274
275
  zou/migrations/versions/0ec3762a745d_add_attachment_table.py
275
276
  zou/migrations/versions/0ef6416a507b_.py
@@ -1 +0,0 @@
1
- __version__ = "0.20.19"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes