zou 0.20.16__tar.gz → 0.20.18__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 (433) hide show
  1. {zou-0.20.16/zou.egg-info → zou-0.20.18}/PKG-INFO +9 -10
  2. {zou-0.20.16 → zou-0.20.18}/setup.cfg +8 -9
  3. zou-0.20.18/zou/__init__.py +1 -0
  4. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/comments/resources.py +4 -3
  5. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/previews/resources.py +40 -32
  6. {zou-0.20.16 → zou-0.20.18}/zou/app/config.py +1 -0
  7. {zou-0.20.16 → zou-0.20.18}/zou/app/models/comment.py +10 -10
  8. {zou-0.20.16 → zou-0.20.18}/zou/app/models/project.py +26 -6
  9. {zou-0.20.16 → zou-0.20.18}/zou/app/services/assets_service.py +3 -0
  10. {zou-0.20.16 → zou-0.20.18}/zou/app/services/edits_service.py +3 -0
  11. {zou-0.20.16 → zou-0.20.18}/zou/app/services/entities_service.py +3 -0
  12. {zou-0.20.16 → zou-0.20.18}/zou/app/services/shots_service.py +3 -0
  13. {zou-0.20.16 → zou-0.20.18}/zou/app/services/tasks_service.py +4 -4
  14. {zou-0.20.16 → zou-0.20.18}/zou/app/services/user_service.py +1 -0
  15. {zou-0.20.16 → zou-0.20.18}/zou/app/utils/fs.py +3 -0
  16. {zou-0.20.16 → zou-0.20.18}/zou/app/utils/monitoring.py +2 -0
  17. zou-0.20.18/zou/migrations/versions/fba149993140_add_missing_index.py +132 -0
  18. {zou-0.20.16 → zou-0.20.18/zou.egg-info}/PKG-INFO +9 -10
  19. {zou-0.20.16 → zou-0.20.18}/zou.egg-info/SOURCES.txt +1 -0
  20. {zou-0.20.16 → zou-0.20.18}/zou.egg-info/requires.txt +8 -11
  21. zou-0.20.16/zou/__init__.py +0 -1
  22. {zou-0.20.16 → zou-0.20.18}/LICENSE +0 -0
  23. {zou-0.20.16 → zou-0.20.18}/README.rst +0 -0
  24. {zou-0.20.16 → zou-0.20.18}/pyproject.toml +0 -0
  25. {zou-0.20.16 → zou-0.20.18}/setup.py +0 -0
  26. {zou-0.20.16 → zou-0.20.18}/zou/app/__init__.py +0 -0
  27. {zou-0.20.16 → zou-0.20.18}/zou/app/api.py +0 -0
  28. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/__init__.py +0 -0
  29. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/assets/__init__.py +0 -0
  30. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/assets/resources.py +0 -0
  31. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/auth/__init__.py +0 -0
  32. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/auth/resources.py +0 -0
  33. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/breakdown/__init__.py +0 -0
  34. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/breakdown/resources.py +0 -0
  35. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/chats/__init__.py +0 -0
  36. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/chats/resources.py +0 -0
  37. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/comments/__init__.py +0 -0
  38. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/concepts/__init__.py +0 -0
  39. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/concepts/resources.py +0 -0
  40. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/crud/__init__.py +0 -0
  41. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/crud/asset_instance.py +0 -0
  42. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/crud/attachment_file.py +0 -0
  43. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/crud/base.py +0 -0
  44. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/crud/chat.py +0 -0
  45. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/crud/chat_message.py +0 -0
  46. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/crud/comments.py +0 -0
  47. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/crud/custom_action.py +0 -0
  48. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/crud/day_off.py +0 -0
  49. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/crud/department.py +0 -0
  50. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/crud/entity.py +0 -0
  51. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/crud/entity_link.py +0 -0
  52. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/crud/entity_type.py +0 -0
  53. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/crud/event.py +0 -0
  54. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/crud/file_status.py +0 -0
  55. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/crud/metadata_descriptor.py +0 -0
  56. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/crud/milestone.py +0 -0
  57. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/crud/news.py +0 -0
  58. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/crud/notification.py +0 -0
  59. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/crud/organisation.py +0 -0
  60. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/crud/output_file.py +0 -0
  61. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/crud/output_type.py +0 -0
  62. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/crud/person.py +0 -0
  63. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/crud/playlist.py +0 -0
  64. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/crud/preview_background_file.py +0 -0
  65. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/crud/preview_file.py +0 -0
  66. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/crud/project.py +0 -0
  67. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/crud/project_status.py +0 -0
  68. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/crud/schedule_item.py +0 -0
  69. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/crud/search_filter.py +0 -0
  70. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/crud/search_filter_group.py +0 -0
  71. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/crud/software.py +0 -0
  72. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/crud/status_automation.py +0 -0
  73. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/crud/studio.py +0 -0
  74. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/crud/subscription.py +0 -0
  75. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/crud/task.py +0 -0
  76. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/crud/task_status.py +0 -0
  77. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/crud/task_type.py +0 -0
  78. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/crud/time_spent.py +0 -0
  79. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/crud/working_file.py +0 -0
  80. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/edits/__init__.py +0 -0
  81. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/edits/resources.py +0 -0
  82. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/entities/__init__.py +0 -0
  83. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/entities/resources.py +0 -0
  84. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/events/__init__.py +0 -0
  85. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/events/resources.py +0 -0
  86. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/export/__init__.py +0 -0
  87. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/export/csv/__init__.py +0 -0
  88. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/export/csv/assets.py +0 -0
  89. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/export/csv/base.py +0 -0
  90. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/export/csv/casting.py +0 -0
  91. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/export/csv/edits.py +0 -0
  92. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/export/csv/persons.py +0 -0
  93. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/export/csv/playlists.py +0 -0
  94. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/export/csv/projects.py +0 -0
  95. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/export/csv/shots.py +0 -0
  96. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/export/csv/task_types.py +0 -0
  97. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/export/csv/tasks.py +0 -0
  98. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/export/csv/time_spents.py +0 -0
  99. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/files/__init__.py +0 -0
  100. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/files/resources.py +0 -0
  101. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/index/__init__.py +0 -0
  102. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/index/resources.py +0 -0
  103. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/news/__init__.py +0 -0
  104. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/news/resources.py +0 -0
  105. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/persons/__init__.py +0 -0
  106. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/persons/resources.py +0 -0
  107. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/playlists/__init__.py +0 -0
  108. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/playlists/resources.py +0 -0
  109. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/previews/__init__.py +0 -0
  110. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/projects/__init__.py +0 -0
  111. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/projects/resources.py +0 -0
  112. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/search/__init__.py +0 -0
  113. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/search/resources.py +0 -0
  114. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/shots/__init__.py +0 -0
  115. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/shots/resources.py +0 -0
  116. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/source/__init__.py +0 -0
  117. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/source/csv/__init__.py +0 -0
  118. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/source/csv/assets.py +0 -0
  119. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/source/csv/base.py +0 -0
  120. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/source/csv/casting.py +0 -0
  121. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/source/csv/edits.py +0 -0
  122. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/source/csv/persons.py +0 -0
  123. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/source/csv/shots.py +0 -0
  124. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/source/csv/task_type_estimations.py +0 -0
  125. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/source/kitsu.py +0 -0
  126. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/source/otio.py +0 -0
  127. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/source/shotgun/__init__.py +0 -0
  128. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/source/shotgun/assets.py +0 -0
  129. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/source/shotgun/base.py +0 -0
  130. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/source/shotgun/episode.py +0 -0
  131. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/source/shotgun/exception.py +0 -0
  132. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/source/shotgun/import_errors.py +0 -0
  133. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/source/shotgun/notes.py +0 -0
  134. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/source/shotgun/person.py +0 -0
  135. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/source/shotgun/project.py +0 -0
  136. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/source/shotgun/scene.py +0 -0
  137. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/source/shotgun/sequence.py +0 -0
  138. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/source/shotgun/shot.py +0 -0
  139. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/source/shotgun/status.py +0 -0
  140. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/source/shotgun/steps.py +0 -0
  141. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/source/shotgun/tasks.py +0 -0
  142. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/source/shotgun/team.py +0 -0
  143. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/source/shotgun/versions.py +0 -0
  144. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/tasks/__init__.py +0 -0
  145. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/tasks/resources.py +0 -0
  146. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/user/__init__.py +0 -0
  147. {zou-0.20.16 → zou-0.20.18}/zou/app/blueprints/user/resources.py +0 -0
  148. {zou-0.20.16 → zou-0.20.18}/zou/app/file_trees/default.json +0 -0
  149. {zou-0.20.16 → zou-0.20.18}/zou/app/file_trees/simple.json +0 -0
  150. {zou-0.20.16 → zou-0.20.18}/zou/app/indexer/__init__.py +0 -0
  151. {zou-0.20.16 → zou-0.20.18}/zou/app/indexer/indexing.py +0 -0
  152. {zou-0.20.16 → zou-0.20.18}/zou/app/mixin.py +0 -0
  153. {zou-0.20.16 → zou-0.20.18}/zou/app/models/__init__.py +0 -0
  154. {zou-0.20.16 → zou-0.20.18}/zou/app/models/asset_instance.py +0 -0
  155. {zou-0.20.16 → zou-0.20.18}/zou/app/models/attachment_file.py +0 -0
  156. {zou-0.20.16 → zou-0.20.18}/zou/app/models/base.py +0 -0
  157. {zou-0.20.16 → zou-0.20.18}/zou/app/models/build_job.py +0 -0
  158. {zou-0.20.16 → zou-0.20.18}/zou/app/models/chat.py +0 -0
  159. {zou-0.20.16 → zou-0.20.18}/zou/app/models/chat_message.py +0 -0
  160. {zou-0.20.16 → zou-0.20.18}/zou/app/models/custom_action.py +0 -0
  161. {zou-0.20.16 → zou-0.20.18}/zou/app/models/data_import_error.py +0 -0
  162. {zou-0.20.16 → zou-0.20.18}/zou/app/models/day_off.py +0 -0
  163. {zou-0.20.16 → zou-0.20.18}/zou/app/models/department.py +0 -0
  164. {zou-0.20.16 → zou-0.20.18}/zou/app/models/desktop_login_log.py +0 -0
  165. {zou-0.20.16 → zou-0.20.18}/zou/app/models/entity.py +0 -0
  166. {zou-0.20.16 → zou-0.20.18}/zou/app/models/entity_type.py +0 -0
  167. {zou-0.20.16 → zou-0.20.18}/zou/app/models/event.py +0 -0
  168. {zou-0.20.16 → zou-0.20.18}/zou/app/models/file_status.py +0 -0
  169. {zou-0.20.16 → zou-0.20.18}/zou/app/models/login_log.py +0 -0
  170. {zou-0.20.16 → zou-0.20.18}/zou/app/models/metadata_descriptor.py +0 -0
  171. {zou-0.20.16 → zou-0.20.18}/zou/app/models/milestone.py +0 -0
  172. {zou-0.20.16 → zou-0.20.18}/zou/app/models/news.py +0 -0
  173. {zou-0.20.16 → zou-0.20.18}/zou/app/models/notification.py +0 -0
  174. {zou-0.20.16 → zou-0.20.18}/zou/app/models/organisation.py +0 -0
  175. {zou-0.20.16 → zou-0.20.18}/zou/app/models/output_file.py +0 -0
  176. {zou-0.20.16 → zou-0.20.18}/zou/app/models/output_type.py +0 -0
  177. {zou-0.20.16 → zou-0.20.18}/zou/app/models/person.py +0 -0
  178. {zou-0.20.16 → zou-0.20.18}/zou/app/models/playlist.py +0 -0
  179. {zou-0.20.16 → zou-0.20.18}/zou/app/models/preview_background_file.py +0 -0
  180. {zou-0.20.16 → zou-0.20.18}/zou/app/models/preview_file.py +0 -0
  181. {zou-0.20.16 → zou-0.20.18}/zou/app/models/project_status.py +0 -0
  182. {zou-0.20.16 → zou-0.20.18}/zou/app/models/schedule_item.py +0 -0
  183. {zou-0.20.16 → zou-0.20.18}/zou/app/models/search_filter.py +0 -0
  184. {zou-0.20.16 → zou-0.20.18}/zou/app/models/search_filter_group.py +0 -0
  185. {zou-0.20.16 → zou-0.20.18}/zou/app/models/serializer.py +0 -0
  186. {zou-0.20.16 → zou-0.20.18}/zou/app/models/software.py +0 -0
  187. {zou-0.20.16 → zou-0.20.18}/zou/app/models/status_automation.py +0 -0
  188. {zou-0.20.16 → zou-0.20.18}/zou/app/models/studio.py +0 -0
  189. {zou-0.20.16 → zou-0.20.18}/zou/app/models/subscription.py +0 -0
  190. {zou-0.20.16 → zou-0.20.18}/zou/app/models/task.py +0 -0
  191. {zou-0.20.16 → zou-0.20.18}/zou/app/models/task_status.py +0 -0
  192. {zou-0.20.16 → zou-0.20.18}/zou/app/models/task_type.py +0 -0
  193. {zou-0.20.16 → zou-0.20.18}/zou/app/models/time_spent.py +0 -0
  194. {zou-0.20.16 → zou-0.20.18}/zou/app/models/working_file.py +0 -0
  195. {zou-0.20.16 → zou-0.20.18}/zou/app/services/__init__.py +0 -0
  196. {zou-0.20.16 → zou-0.20.18}/zou/app/services/auth_service.py +0 -0
  197. {zou-0.20.16 → zou-0.20.18}/zou/app/services/backup_service.py +0 -0
  198. {zou-0.20.16 → zou-0.20.18}/zou/app/services/base_service.py +0 -0
  199. {zou-0.20.16 → zou-0.20.18}/zou/app/services/breakdown_service.py +0 -0
  200. {zou-0.20.16 → zou-0.20.18}/zou/app/services/chats_service.py +0 -0
  201. {zou-0.20.16 → zou-0.20.18}/zou/app/services/comments_service.py +0 -0
  202. {zou-0.20.16 → zou-0.20.18}/zou/app/services/concepts_service.py +0 -0
  203. {zou-0.20.16 → zou-0.20.18}/zou/app/services/custom_actions_service.py +0 -0
  204. {zou-0.20.16 → zou-0.20.18}/zou/app/services/deletion_service.py +0 -0
  205. {zou-0.20.16 → zou-0.20.18}/zou/app/services/emails_service.py +0 -0
  206. {zou-0.20.16 → zou-0.20.18}/zou/app/services/events_service.py +0 -0
  207. {zou-0.20.16 → zou-0.20.18}/zou/app/services/exception.py +0 -0
  208. {zou-0.20.16 → zou-0.20.18}/zou/app/services/file_tree_service.py +0 -0
  209. {zou-0.20.16 → zou-0.20.18}/zou/app/services/files_service.py +0 -0
  210. {zou-0.20.16 → zou-0.20.18}/zou/app/services/index_service.py +0 -0
  211. {zou-0.20.16 → zou-0.20.18}/zou/app/services/names_service.py +0 -0
  212. {zou-0.20.16 → zou-0.20.18}/zou/app/services/news_service.py +0 -0
  213. {zou-0.20.16 → zou-0.20.18}/zou/app/services/notifications_service.py +0 -0
  214. {zou-0.20.16 → zou-0.20.18}/zou/app/services/persons_service.py +0 -0
  215. {zou-0.20.16 → zou-0.20.18}/zou/app/services/playlists_service.py +0 -0
  216. {zou-0.20.16 → zou-0.20.18}/zou/app/services/preview_files_service.py +0 -0
  217. {zou-0.20.16 → zou-0.20.18}/zou/app/services/projects_service.py +0 -0
  218. {zou-0.20.16 → zou-0.20.18}/zou/app/services/scenes_service.py +0 -0
  219. {zou-0.20.16 → zou-0.20.18}/zou/app/services/schedule_service.py +0 -0
  220. {zou-0.20.16 → zou-0.20.18}/zou/app/services/stats_service.py +0 -0
  221. {zou-0.20.16 → zou-0.20.18}/zou/app/services/status_automations_service.py +0 -0
  222. {zou-0.20.16 → zou-0.20.18}/zou/app/services/sync_service.py +0 -0
  223. {zou-0.20.16 → zou-0.20.18}/zou/app/services/telemetry_services.py +0 -0
  224. {zou-0.20.16 → zou-0.20.18}/zou/app/services/time_spents_service.py +0 -0
  225. {zou-0.20.16 → zou-0.20.18}/zou/app/stores/__init__.py +0 -0
  226. {zou-0.20.16 → zou-0.20.18}/zou/app/stores/auth_tokens_store.py +0 -0
  227. {zou-0.20.16 → zou-0.20.18}/zou/app/stores/file_store.py +0 -0
  228. {zou-0.20.16 → zou-0.20.18}/zou/app/stores/publisher_store.py +0 -0
  229. {zou-0.20.16 → zou-0.20.18}/zou/app/stores/queue_store.py +0 -0
  230. {zou-0.20.16 → zou-0.20.18}/zou/app/swagger.py +0 -0
  231. {zou-0.20.16 → zou-0.20.18}/zou/app/utils/__init__.py +0 -0
  232. {zou-0.20.16 → zou-0.20.18}/zou/app/utils/api.py +0 -0
  233. {zou-0.20.16 → zou-0.20.18}/zou/app/utils/auth.py +0 -0
  234. {zou-0.20.16 → zou-0.20.18}/zou/app/utils/cache.py +0 -0
  235. {zou-0.20.16 → zou-0.20.18}/zou/app/utils/chats.py +0 -0
  236. {zou-0.20.16 → zou-0.20.18}/zou/app/utils/colors.py +0 -0
  237. {zou-0.20.16 → zou-0.20.18}/zou/app/utils/commands.py +0 -0
  238. {zou-0.20.16 → zou-0.20.18}/zou/app/utils/csv_utils.py +0 -0
  239. {zou-0.20.16 → zou-0.20.18}/zou/app/utils/date_helpers.py +0 -0
  240. {zou-0.20.16 → zou-0.20.18}/zou/app/utils/dbhelpers.py +0 -0
  241. {zou-0.20.16 → zou-0.20.18}/zou/app/utils/emails.py +0 -0
  242. {zou-0.20.16 → zou-0.20.18}/zou/app/utils/env.py +0 -0
  243. {zou-0.20.16 → zou-0.20.18}/zou/app/utils/events.py +0 -0
  244. {zou-0.20.16 → zou-0.20.18}/zou/app/utils/fido.py +0 -0
  245. {zou-0.20.16 → zou-0.20.18}/zou/app/utils/fields.py +0 -0
  246. {zou-0.20.16 → zou-0.20.18}/zou/app/utils/flask.py +0 -0
  247. {zou-0.20.16 → zou-0.20.18}/zou/app/utils/git.py +0 -0
  248. {zou-0.20.16 → zou-0.20.18}/zou/app/utils/logs.py +0 -0
  249. {zou-0.20.16 → zou-0.20.18}/zou/app/utils/permissions.py +0 -0
  250. {zou-0.20.16 → zou-0.20.18}/zou/app/utils/query.py +0 -0
  251. {zou-0.20.16 → zou-0.20.18}/zou/app/utils/redis.py +0 -0
  252. {zou-0.20.16 → zou-0.20.18}/zou/app/utils/remote_job.py +0 -0
  253. {zou-0.20.16 → zou-0.20.18}/zou/app/utils/saml.py +0 -0
  254. {zou-0.20.16 → zou-0.20.18}/zou/app/utils/shell.py +0 -0
  255. {zou-0.20.16 → zou-0.20.18}/zou/app/utils/string.py +0 -0
  256. {zou-0.20.16 → zou-0.20.18}/zou/app/utils/thumbnail.py +0 -0
  257. {zou-0.20.16 → zou-0.20.18}/zou/cli.py +0 -0
  258. {zou-0.20.16 → zou-0.20.18}/zou/debug.py +0 -0
  259. {zou-0.20.16 → zou-0.20.18}/zou/event_stream.py +0 -0
  260. {zou-0.20.16 → zou-0.20.18}/zou/job_settings.py +0 -0
  261. {zou-0.20.16 → zou-0.20.18}/zou/migrations/README +0 -0
  262. {zou-0.20.16 → zou-0.20.18}/zou/migrations/__init__.py +0 -0
  263. {zou-0.20.16 → zou-0.20.18}/zou/migrations/alembic.ini +0 -0
  264. {zou-0.20.16 → zou-0.20.18}/zou/migrations/env.py +0 -0
  265. {zou-0.20.16 → zou-0.20.18}/zou/migrations/script.py.mako +0 -0
  266. {zou-0.20.16 → zou-0.20.18}/zou/migrations/utils/__init__.py +0 -0
  267. {zou-0.20.16 → zou-0.20.18}/zou/migrations/utils/base.py +0 -0
  268. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/003be8a91001_add_start_and_end_dates_to_projects.py +0 -0
  269. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/0596674df51d_add_department_mentions_to_comments.py +0 -0
  270. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/05ac7e8caa21_remove_unique_constraint_for_taskstatus_.py +0 -0
  271. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/05b7dc79a416_add_archived_fields_to_main_tables.py +0 -0
  272. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/0cf5e0e035fa_drop_column_tasktype_for_shots.py +0 -0
  273. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/0ec3762a745d_add_attachment_table.py +0 -0
  274. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/0ef6416a507b_.py +0 -0
  275. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/10cf267d95c9_fix_schedule_item.py +0 -0
  276. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/16328eae4b5f_add_new_constraint_for_timespent.py +0 -0
  277. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/16df47d76c64_add_some_indexes.py +0 -0
  278. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/17ef8f7be758_disallow_null_choicetype.py +0 -0
  279. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/1bb55759146f_add_table_studio.py +0 -0
  280. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/1cb44194db49_add_file_size_field_to_preview_file.py +0 -0
  281. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/1e150c2cea4d_add_nb_entities_out.py +0 -0
  282. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/1e2d77a2f0c4_add_hd_by_default_column.py +0 -0
  283. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/1fab8c420678_add_attachments_to_message_chats.py +0 -0
  284. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/20a8ad264659_tasktypeassettypelink_.py +0 -0
  285. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/20dfeb36142b_add_projecttaskstatuslink_roles_for_.py +0 -0
  286. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/23122f290ca2_add_entity_chat_models.py +0 -0
  287. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/269d41bfb73f_add_entity_entity_links.py +0 -0
  288. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/29df910f04a4_create_unique_constraint_project_id_.py +0 -0
  289. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/29fe01a6c9eb_add_status_automation_field.py +0 -0
  290. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/2adc020885fa_.py +0 -0
  291. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/2baede80b111_add_entity_status_field.py +0 -0
  292. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/306266361f4f_.py +0 -0
  293. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/328fd44c6347_add_entity_created_by.py +0 -0
  294. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/32f134ff1201_add_is_shared_flag_to_filters.py +0 -0
  295. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/346250b5304c_add_position_to_preview_files.py +0 -0
  296. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/3476e147e632_add_acks_to_comments.py +0 -0
  297. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/389cfb9de776_.py +0 -0
  298. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/38baa9a23b3d_.py +0 -0
  299. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/398150912a3f_validation_status_preview.py +0 -0
  300. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/3b0d1321079e_.py +0 -0
  301. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/3d5c93bafb9d_.py +0 -0
  302. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/3e0538ddf80f_.py +0 -0
  303. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/3fee3bd10f9d_.py +0 -0
  304. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/4095103c7d01_add_is_clients_isolated_flag_to_projects.py +0 -0
  305. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/40dea9555940_.py +0 -0
  306. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/42ec83db6a01_change_person_preferred_two_factor_.py +0 -0
  307. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/43d0cf0ed5e7_.py +0 -0
  308. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/443d1e78a932_.py +0 -0
  309. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/45c2de366e66_.py +0 -0
  310. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/45dafbb3f4e1_for_person_contract_type_disallow_null.py +0 -0
  311. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/4715c2586036_add_last_preview_file_fields.py +0 -0
  312. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/4e3738cdc34c_.py +0 -0
  313. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/4f2398ebcd49_.py +0 -0
  314. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/523ee9647bee_.py +0 -0
  315. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/539a3a00c417_for_departmentlink_index_person_id_.py +0 -0
  316. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/54ee0d1d60ba_add_build_job_model.py +0 -0
  317. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/556526e47daa_.py +0 -0
  318. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/57222395f2be_add_statusautomation_import_last_revision.py +0 -0
  319. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/5798d2c9020b_change_person_role_to_choicetype.py +0 -0
  320. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/590aa1ffe731_add_notifications_enabled_flag.py +0 -0
  321. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/59a7445a966c_add_entity_is_shared.py +0 -0
  322. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/5a291251823c_add_max_retake_parameter.py +0 -0
  323. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/5ab9d7a75887_.py +0 -0
  324. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/5b0fcbb94f24_.py +0 -0
  325. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/5b7fa3e51701_add_is_client_allowed_flag_to_task_.py +0 -0
  326. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/5b980f0dc365_add_comment_links.py +0 -0
  327. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/5b9fd9ddfe43_add_homepage_and_contract_fields.py +0 -0
  328. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/5c0498e264bc_add_slack_fields.py +0 -0
  329. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/5e2ce62632a6_add_workflow_to_project.py +0 -0
  330. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/680c64565f9d_for_searchfiltergroup_is_shared.py +0 -0
  331. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/693cc511d28d_add_taskstatus_priority.py +0 -0
  332. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/6aa446ee4072_add_is_for_all_flage_to_playlists.py +0 -0
  333. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/6bd3b102d61b_.py +0 -0
  334. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/6c597e842afa_add_task_type_field_to_playlists.py +0 -0
  335. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/6d1b2c60f58b_add_milestone_model.py +0 -0
  336. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/6d7fa5a8e9a5_add_timesheets_locked_field_to_org.py +0 -0
  337. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/6eeaff945706_add_data_field_on_entity_links.py +0 -0
  338. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/6f6049877105_.py +0 -0
  339. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/7417c8eb70d8_add_for_entity_field_to_playlists.py +0 -0
  340. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/772a5e43f05b_.py +0 -0
  341. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/7748d3d22925_add_columns_to_searchfilter_table_to_.py +0 -0
  342. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/77d6820f494f_add_reply_to_notif.py +0 -0
  343. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/7b1f765677d8_.py +0 -0
  344. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/7bc746997e8d_add_slack_token_field_to_organisation.py +0 -0
  345. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/7dc79d4ed7cd_.py +0 -0
  346. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/818f7bda2528_.py +0 -0
  347. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/82e7f7a95e84_add_project_id_to_events.py +0 -0
  348. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/82ee682204ab_add_is_generated_from_ldap_column_to_.py +0 -0
  349. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/8588f254d6b8_add_archived_fields.py +0 -0
  350. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/8739ae9fa28b_add_for_client_field.py +0 -0
  351. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/87efceb6745b_add_ready_for_to_entity.py +0 -0
  352. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/892b264937ec_.py +0 -0
  353. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/8a1b4a1b7f4a_add_totp_columns_for_person.py +0 -0
  354. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/8e4f39e321f4_add_day_off_table.py +0 -0
  355. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/8e67c183bed7_add_preference_fields.py +0 -0
  356. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/8fbd40afbe5f_allow_to_set_float_values_for_.py +0 -0
  357. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/9010a64e5a2d_add_indices.py +0 -0
  358. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/9060dd4f6116_notification_uc.py +0 -0
  359. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/925771029620_.py +0 -0
  360. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/92b40d79ad3f_allow_message_attachments.py +0 -0
  361. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/92bdfe07e5f5_discord_integration.py +0 -0
  362. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/956659992419_add_columns_for_person_to_store_fido_.py +0 -0
  363. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/96c79d31e648_add_mail_otp_columns_for_person.py +0 -0
  364. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/96f58a4a2a58_person_partial_index_for_email_only_.py +0 -0
  365. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/971dbf5a0faf_add_short_name_for_asset_type_entity_.py +0 -0
  366. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/98c90621cf58_add_for_client_flag_to_playlist.py +0 -0
  367. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/99825b9cc778_.py +0 -0
  368. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/9a09467f9b2c_.py +0 -0
  369. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/9b85c14fa8a7_add_day_off_new_columns.py +0 -0
  370. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/9bd17364fc18_.py +0 -0
  371. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/9d3bb33c6fc6_add_department_keys_to_filter_models.py +0 -0
  372. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/9e5b3a9b0cee_add_new_column_metadatadescriptor_data_type_.py +0 -0
  373. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/9f8445f9b42c_add_man_days_fields.py +0 -0
  374. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/a23682ccc1f1_.py +0 -0
  375. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/a252a094e977_add_descriptions_for_entities_tasks_and_.py +0 -0
  376. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/a519c710877c_.py +0 -0
  377. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/a65bdadbae2f_.py +0 -0
  378. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/a66508788c53_add_nb_assets_ready.py +0 -0
  379. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/a6c25eed3ea1_add_login_failed_attemps_and_last_login_.py +0 -0
  380. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/a7c43f3fbc76_add_duration_column_to_the_preview_file.py +0 -0
  381. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/aa0a60033106_feedback_request.py +0 -0
  382. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/addbbefa7028_add_departments_link_to_metadata_.py +0 -0
  383. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/ae0127f2fc56_add_previewfile_width_and_previewfile_.py +0 -0
  384. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/af1790868e2c_.py +0 -0
  385. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/b45cb782bb9c_.py +0 -0
  386. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/b4dd0add5f79_.py +0 -0
  387. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/b8c0a0f9d054_drop_task_status_is_reviewable.py +0 -0
  388. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/b8ed0fb263f8_add_person_jti_and_jti_expiration_date.py +0 -0
  389. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/b97a71306fc8_add_is_casting_standby_column_to_entity.py +0 -0
  390. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/be56dc0fb760_for_is_shared_disallow_nullable.py +0 -0
  391. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/bf1347acdee2_.py +0 -0
  392. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/c49e41f1298b_add_previewbackground.py +0 -0
  393. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/c68c2a62cfac_add_mimetype_column_to_attachment.py +0 -0
  394. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/c726b98be194_.py +0 -0
  395. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/c81f3e83bdb5_.py +0 -0
  396. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/ca28796a2a62_add_is_done_field_to_the_task_model.py +0 -0
  397. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/cf3d365de164_add_entity_version_model.py +0 -0
  398. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/cf6cec6d6bf5_add_status_field_to_preview_file.py +0 -0
  399. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/d80267806131_task_status_new_column_is_default.py +0 -0
  400. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/d8dcd5196d57_add_casting_label.py +0 -0
  401. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/de8a3de227ef_.py +0 -0
  402. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/deeacd38d373_for_projecttaskstatuslink_set_default_.py +0 -0
  403. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/df1834485f57_.py +0 -0
  404. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/df9f8a147e80_change_file_size_to_big_integer.py +0 -0
  405. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/e1ef93f40d3d_.py +0 -0
  406. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/e29638428dfd_add_schedule_item_table.py +0 -0
  407. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/e3f6db74cc1e_.py +0 -0
  408. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/e839d6603c09_add_person_id_to_shot_history.py +0 -0
  409. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/ee2373fbe3a4_.py +0 -0
  410. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/f0567e8d0c62_.py +0 -0
  411. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/f0c6cbb61869_add_production_style_field.py +0 -0
  412. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/f344b867a911_for_description_of_entity_task_working_.py +0 -0
  413. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/f4ff5a73d283_add_person_ldap_uid.py +0 -0
  414. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/f5b113876a49_add_preferred_two_factor_authentication_.py +0 -0
  415. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/f5bdca075cdc_add_preview_download_flag_to_projects.py +0 -0
  416. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/f874ad5e898a_add_link_entity_type_task_type.py +0 -0
  417. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/f995b28fb749_.py +0 -0
  418. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/fb6b6f188497_.py +0 -0
  419. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/fb87feaaa094_add_missing_unique_constraints.py +0 -0
  420. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/fc322f908695_.py +0 -0
  421. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/fee7c696166e_.py +0 -0
  422. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/feffd3c5b806_introduce_concepts.py +0 -0
  423. {zou-0.20.16 → zou-0.20.18}/zou/migrations/versions/ffeed4956ab1_add_more_details_to_projects.py +0 -0
  424. {zou-0.20.16 → zou-0.20.18}/zou/remote/__init__.py +0 -0
  425. {zou-0.20.16 → zou-0.20.18}/zou/remote/config_payload.py +0 -0
  426. {zou-0.20.16 → zou-0.20.18}/zou/remote/normalize_movie.py +0 -0
  427. {zou-0.20.16 → zou-0.20.18}/zou/remote/playlist.py +0 -0
  428. {zou-0.20.16 → zou-0.20.18}/zou/utils/__init__.py +0 -0
  429. {zou-0.20.16 → zou-0.20.18}/zou/utils/movie.py +0 -0
  430. {zou-0.20.16 → zou-0.20.18}/zou.egg-info/dependency_links.txt +0 -0
  431. {zou-0.20.16 → zou-0.20.18}/zou.egg-info/entry_points.txt +0 -0
  432. {zou-0.20.16 → zou-0.20.18}/zou.egg-info/not-zip-safe +0 -0
  433. {zou-0.20.16 → zou-0.20.18}/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.16
3
+ Version: 0.20.18
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
@@ -21,10 +21,9 @@ Classifier: Programming Language :: Python :: Implementation :: PyPy
21
21
  Classifier: Topic :: Multimedia :: Graphics
22
22
  Requires-Python: >=3.9, <3.14
23
23
  License-File: LICENSE
24
- Requires-Dist: audioop-lts==0.2.1; python_version >= "3.13"
25
24
  Requires-Dist: babel==2.17.0
26
25
  Requires-Dist: click==8.1.8
27
- Requires-Dist: discord.py==2.4.0
26
+ Requires-Dist: discord.py==2.5.0
28
27
  Requires-Dist: email-validator==2.2.0
29
28
  Requires-Dist: ffmpeg-python==0.2.0
30
29
  Requires-Dist: fido2==1.2.0
@@ -41,7 +40,7 @@ Requires-Dist: flask-jwt-extended==4.7.1
41
40
  Requires-Dist: flask-migrate==4.1.0
42
41
  Requires-Dist: flask-socketio==5.5.1
43
42
  Requires-Dist: flask==3.1.0
44
- Requires-Dist: gazu==0.10.26
43
+ Requires-Dist: gazu==0.10.28
45
44
  Requires-Dist: gevent-websocket==0.10.1
46
45
  Requires-Dist: gevent==24.11.1
47
46
  Requires-Dist: gunicorn==23.0.0
@@ -50,18 +49,18 @@ Requires-Dist: itsdangerous==2.2.0
50
49
  Requires-Dist: Jinja2==3.1.5
51
50
  Requires-Dist: ldap3==2.9.1
52
51
  Requires-Dist: matterhook==0.2
53
- Requires-Dist: meilisearch==0.33.1
52
+ Requires-Dist: meilisearch==0.34.0
54
53
  Requires-Dist: numpy==2.0.1; python_version == "3.9"
55
- Requires-Dist: numpy==2.2.2; python_version >= "3.10"
54
+ Requires-Dist: numpy==2.2.3; python_version >= "3.10"
56
55
  Requires-Dist: opencv-python==4.11.0.86
57
56
  Requires-Dist: OpenTimelineIO==0.17.0
58
57
  Requires-Dist: OpenTimelineIO-Plugins==0.17.0
59
58
  Requires-Dist: orjson==3.10.15
60
59
  Requires-Dist: pillow==11.1.0
61
- Requires-Dist: psutil==6.1.1
60
+ Requires-Dist: psutil==7.0.0
62
61
  Requires-Dist: psycopg[binary]==3.2.4
63
62
  Requires-Dist: pyotp==2.9.0
64
- Requires-Dist: pysaml2==7.5.0
63
+ Requires-Dist: pysaml2==7.5.2
65
64
  Requires-Dist: python-nomad==2.1.0
66
65
  Requires-Dist: python-slugify==8.0.4
67
66
  Requires-Dist: python-socketio==5.12.1
@@ -80,14 +79,14 @@ Requires-Dist: gevent; extra == "prod"
80
79
  Provides-Extra: dev
81
80
  Requires-Dist: wheel; extra == "dev"
82
81
  Provides-Extra: test
83
- Requires-Dist: fakeredis==2.26.2; extra == "test"
82
+ Requires-Dist: fakeredis==2.27.0; extra == "test"
84
83
  Requires-Dist: mixer==7.2.2; extra == "test"
85
84
  Requires-Dist: pytest-cov==6.0.0; extra == "test"
86
85
  Requires-Dist: pytest==8.3.4; extra == "test"
87
86
  Provides-Extra: monitoring
88
87
  Requires-Dist: prometheus-flask-exporter==0.23.1; extra == "monitoring"
89
88
  Requires-Dist: pygelf==0.4.2; extra == "monitoring"
90
- Requires-Dist: sentry-sdk==2.20.0; extra == "monitoring"
89
+ Requires-Dist: sentry-sdk==2.22.0; extra == "monitoring"
91
90
  Provides-Extra: lint
92
91
  Requires-Dist: autoflake==2.3.1; extra == "lint"
93
92
  Requires-Dist: black==25.1.0; extra == "lint"
@@ -27,10 +27,9 @@ classifiers =
27
27
  zip_safe = False
28
28
  packages = find:
29
29
  install_requires =
30
- audioop-lts==0.2.1; python_version>='3.13'
31
30
  babel==2.17.0
32
31
  click==8.1.8
33
- discord.py==2.4.0
32
+ discord.py==2.5.0
34
33
  email-validator==2.2.0
35
34
  ffmpeg-python==0.2.0
36
35
  fido2==1.2.0
@@ -47,7 +46,7 @@ install_requires =
47
46
  flask-migrate==4.1.0
48
47
  flask-socketio==5.5.1
49
48
  flask==3.1.0
50
- gazu==0.10.26
49
+ gazu==0.10.28
51
50
  gevent-websocket==0.10.1
52
51
  gevent==24.11.1
53
52
  gunicorn==23.0.0
@@ -56,18 +55,18 @@ install_requires =
56
55
  Jinja2==3.1.5
57
56
  ldap3==2.9.1
58
57
  matterhook==0.2
59
- meilisearch==0.33.1
58
+ meilisearch==0.34.0
60
59
  numpy==2.0.1; python_version == '3.9'
61
- numpy==2.2.2; python_version >= '3.10'
60
+ numpy==2.2.3; python_version >= '3.10'
62
61
  opencv-python==4.11.0.86
63
62
  OpenTimelineIO==0.17.0
64
63
  OpenTimelineIO-Plugins==0.17.0
65
64
  orjson==3.10.15
66
65
  pillow==11.1.0
67
- psutil==6.1.1
66
+ psutil==7.0.0
68
67
  psycopg[binary]==3.2.4
69
68
  pyotp==2.9.0
70
- pysaml2==7.5.0
69
+ pysaml2==7.5.2
71
70
  python-nomad==2.1.0
72
71
  python-slugify==8.0.4
73
72
  python-socketio==5.12.1
@@ -94,14 +93,14 @@ prod =
94
93
  dev =
95
94
  wheel
96
95
  test =
97
- fakeredis==2.26.2
96
+ fakeredis==2.27.0
98
97
  mixer==7.2.2
99
98
  pytest-cov==6.0.0
100
99
  pytest==8.3.4
101
100
  monitoring =
102
101
  prometheus-flask-exporter==0.23.1
103
102
  pygelf==0.4.2
104
- sentry-sdk==2.20.0
103
+ sentry-sdk==2.22.0
105
104
  lint =
106
105
  autoflake==2.3.1
107
106
  black==25.1.0
@@ -0,0 +1 @@
1
+ __version__ = "0.20.18"
@@ -83,9 +83,10 @@ class DownloadAttachmentResource(Resource):
83
83
  ),
84
84
  )
85
85
  except Exception:
86
- current_app.logger.error(
87
- f"Attachment file was not found for: {attachment_file_id}"
88
- )
86
+ if config.LOG_FILE_NOT_FOUND:
87
+ current_app.logger.error(
88
+ f"Attachment file was not found for: {attachment_file_id}"
89
+ )
89
90
  abort(404)
90
91
 
91
92
 
@@ -653,9 +653,10 @@ class PreviewFileMovieResource(BasePreviewFileResource):
653
653
  instance_id, last_modified=self.last_modified
654
654
  )
655
655
  except FileNotFound:
656
- current_app.logger.error(
657
- "Movie file was not found for: %s" % instance_id
658
- )
656
+ if config.LOG_FILE_NOT_FOUND:
657
+ current_app.logger.error(
658
+ "Movie file was not found for: %s" % instance_id
659
+ )
659
660
  abort(404)
660
661
 
661
662
 
@@ -698,9 +699,10 @@ class PreviewFileLowMovieResource(BasePreviewFileResource):
698
699
  instance_id, last_modified=self.last_modified
699
700
  )
700
701
  except FileNotFound:
701
- current_app.logger.error(
702
- "Movie file was not found for: %s" % instance_id
703
- )
702
+ if config.LOG_FILE_NOT_FOUND:
703
+ current_app.logger.error(
704
+ "Movie file was not found for: %s" % instance_id
705
+ )
704
706
  abort(404)
705
707
 
706
708
 
@@ -740,9 +742,10 @@ class PreviewFileMovieDownloadResource(BasePreviewFileResource):
740
742
  last_modified=self.last_modified,
741
743
  )
742
744
  except FileNotFound:
743
- current_app.logger.error(
744
- "Movie file was not found for: %s" % instance_id
745
- )
745
+ if config.LOG_FILE_NOT_FOUND:
746
+ current_app.logger.error(
747
+ "Movie file was not found for: %s" % instance_id
748
+ )
746
749
  abort(404)
747
750
 
748
751
 
@@ -800,9 +803,10 @@ class PreviewFileResource(BasePreviewFileResource):
800
803
  )
801
804
 
802
805
  except FileNotFound:
803
- current_app.logger.error(
804
- "Non-movie file was not found for: %s" % instance_id
805
- )
806
+ if config.LOG_FILE_NOT_FOUND:
807
+ current_app.logger.error(
808
+ "Non-movie file was not found for: %s" % instance_id
809
+ )
806
810
  abort(404)
807
811
 
808
812
 
@@ -869,9 +873,10 @@ class PreviewFileDownloadResource(BasePreviewFileResource):
869
873
  last_modified=self.last_modified,
870
874
  )
871
875
  except FileNotFound:
872
- current_app.logger.error(
873
- "Standard file was not found for: %s" % instance_id
874
- )
876
+ if config.LOG_FILE_NOT_FOUND:
877
+ current_app.logger.error(
878
+ "Standard file was not found for: %s" % instance_id
879
+ )
875
880
  abort(404)
876
881
 
877
882
 
@@ -935,10 +940,11 @@ class AttachmentThumbnailResource(Resource):
935
940
  ),
936
941
  )
937
942
  except FileNotFound:
938
- current_app.logger.error(
939
- "Picture file was not found for attachment: %s"
940
- % (attachment_file_id)
941
- )
943
+ if config.LOG_FILE_NOT_FOUND:
944
+ current_app.logger.error(
945
+ "Picture file was not found for attachment: %s"
946
+ % (attachment_file_id)
947
+ )
942
948
  abort(404)
943
949
 
944
950
 
@@ -982,9 +988,10 @@ class BasePreviewPictureResource(BasePreviewFileResource):
982
988
  last_modified=self.last_modified,
983
989
  )
984
990
  except FileNotFound:
985
- current_app.logger.error(
986
- "Picture file was not found for: %s" % instance_id
987
- )
991
+ if config.LOG_FILE_NOT_FOUND:
992
+ current_app.logger.error(
993
+ "Picture file was not found for: %s" % instance_id
994
+ )
988
995
  abort(404)
989
996
 
990
997
 
@@ -1166,14 +1173,13 @@ class BaseThumbnailResource(Resource):
1166
1173
  ),
1167
1174
  )
1168
1175
  except FileNotFound:
1169
- current_app.logger.error(
1170
- "Thumbnail file was not found for: %s" % instance_id
1171
- )
1176
+ if config.LOG_FILE_NOT_FOUND:
1177
+ current_app.logger.error(
1178
+ "Thumbnail file was not found for: %s" % instance_id
1179
+ )
1172
1180
  abort(404)
1173
- except IOError:
1174
- current_app.logger.error(
1175
- "Thumbnail file was not found for: %s" % instance_id
1176
- )
1181
+ except IOError as e:
1182
+ current_app.logger.error(e)
1177
1183
  abort(404)
1178
1184
 
1179
1185
 
@@ -1680,9 +1686,11 @@ class PreviewBackgroundFileResource(Resource):
1680
1686
  ),
1681
1687
  )
1682
1688
  except FileNotFound:
1683
- current_app.logger.error(
1684
- "Preview background file was not found for: %s" % instance_id
1685
- )
1689
+ if config.LOG_FILE_NOT_FOUND:
1690
+ current_app.logger.error(
1691
+ "Preview background file was not found for: %s"
1692
+ % instance_id
1693
+ )
1686
1694
  raise PreviewBackgroundFileNotFoundException
1687
1695
 
1688
1696
 
@@ -142,6 +142,7 @@ LOGS_MODE = os.getenv("LOGS_MODE", "default")
142
142
  LOGS_HOST = os.getenv("LOGS_HOST", "localhost")
143
143
  LOGS_PORT = os.getenv("LOGS_PORT", 2202)
144
144
  LOGS_TOKEN = os.getenv("LOGS_TOKEN")
145
+ LOG_FILE_NOT_FOUND = envtobool("LOG_FILE_NOT_FOUND", False)
145
146
 
146
147
  SENTRY_ENABLED = envtobool("SENTRY_ENABLED", False)
147
148
  SENTRY_DSN = os.getenv("SENTRY_DSN", "")
@@ -6,21 +6,19 @@ from zou.app.models.serializer import SerializerMixin
6
6
  from zou.app.models.base import BaseMixin
7
7
 
8
8
 
9
- preview_link_table = db.Table(
10
- "comment_preview_link",
11
- db.Column(
12
- "comment",
9
+ class CommentPreviewLink(db.Model):
10
+ comment = db.Column(
13
11
  UUIDType(binary=False),
14
12
  db.ForeignKey("comment.id"),
15
13
  primary_key=True,
16
- ),
17
- db.Column(
18
- "preview_file",
14
+ index=True,
15
+ )
16
+ preview_file = db.Column(
19
17
  UUIDType(binary=False),
20
18
  db.ForeignKey("preview_file.id"),
21
19
  primary_key=True,
22
- ),
23
- )
20
+ index=True,
21
+ )
24
22
 
25
23
 
26
24
  mentions_table = db.Table(
@@ -107,7 +105,9 @@ class Comment(db.Model, BaseMixin, SerializerMixin):
107
105
  UUIDType(binary=False), db.ForeignKey("preview_file.id")
108
106
  )
109
107
  previews = db.relationship(
110
- "PreviewFile", secondary=preview_link_table, backref="comments"
108
+ "PreviewFile",
109
+ secondary=CommentPreviewLink.__table__,
110
+ backref="comments",
111
111
  )
112
112
  mentions = db.relationship("Person", secondary=mentions_table)
113
113
  department_mentions = db.relationship(
@@ -29,10 +29,16 @@ PROJECT_STYLES = [
29
29
  class ProjectPersonLink(db.Model):
30
30
  __tablename__ = "project_person_link"
31
31
  project_id = db.Column(
32
- UUIDType(binary=False), db.ForeignKey("project.id"), primary_key=True
32
+ UUIDType(binary=False),
33
+ db.ForeignKey("project.id"),
34
+ primary_key=True,
35
+ index=True,
33
36
  )
34
37
  person_id = db.Column(
35
- UUIDType(binary=False), db.ForeignKey("person.id"), primary_key=True
38
+ UUIDType(binary=False),
39
+ db.ForeignKey("person.id"),
40
+ primary_key=True,
41
+ index=True,
36
42
  )
37
43
  shotgun_id = db.Column(db.Integer)
38
44
 
@@ -40,10 +46,16 @@ class ProjectPersonLink(db.Model):
40
46
  class ProjectTaskTypeLink(db.Model, BaseMixin, SerializerMixin):
41
47
  __tablename__ = "project_task_type_link"
42
48
  project_id = db.Column(
43
- UUIDType(binary=False), db.ForeignKey("project.id"), primary_key=True
49
+ UUIDType(binary=False),
50
+ db.ForeignKey("project.id"),
51
+ primary_key=True,
52
+ index=True,
44
53
  )
45
54
  task_type_id = db.Column(
46
- UUIDType(binary=False), db.ForeignKey("task_type.id"), primary_key=True
55
+ UUIDType(binary=False),
56
+ db.ForeignKey("task_type.id"),
57
+ primary_key=True,
58
+ index=True,
47
59
  )
48
60
  priority = db.Column(db.Integer, default=None)
49
61
 
@@ -57,12 +69,16 @@ class ProjectTaskTypeLink(db.Model, BaseMixin, SerializerMixin):
57
69
  class ProjectTaskStatusLink(db.Model, BaseMixin, SerializerMixin):
58
70
  __tablename__ = "project_task_status_link"
59
71
  project_id = db.Column(
60
- UUIDType(binary=False), db.ForeignKey("project.id"), primary_key=True
72
+ UUIDType(binary=False),
73
+ db.ForeignKey("project.id"),
74
+ primary_key=True,
75
+ index=True,
61
76
  )
62
77
  task_status_id = db.Column(
63
78
  UUIDType(binary=False),
64
79
  db.ForeignKey("task_status.id"),
65
80
  primary_key=True,
81
+ index=True,
66
82
  )
67
83
  priority = db.Column(db.Integer, default=None)
68
84
  roles_for_board = db.Column(
@@ -92,12 +108,16 @@ class ProjectAssetTypeLink(db.Model):
92
108
  class ProjectStatusAutomationLink(db.Model):
93
109
  __tablename__ = "project_status_automation_link"
94
110
  project_id = db.Column(
95
- UUIDType(binary=False), db.ForeignKey("project.id"), primary_key=True
111
+ UUIDType(binary=False),
112
+ db.ForeignKey("project.id"),
113
+ primary_key=True,
114
+ index=True,
96
115
  )
97
116
  status_automation_id = db.Column(
98
117
  UUIDType(binary=False),
99
118
  db.ForeignKey("status_automation.id"),
100
119
  primary_key=True,
120
+ index=True,
101
121
  )
102
122
 
103
123
 
@@ -202,6 +202,7 @@ def get_assets_and_tasks(criterions={}, with_episode_ids=False):
202
202
  Task.due_date,
203
203
  Task.done_date,
204
204
  Task.last_comment_date,
205
+ Task.last_preview_file_id,
205
206
  Task.difficulty,
206
207
  assignees_table.columns.person,
207
208
  ).order_by(EntityType.name, Entity.name)
@@ -294,6 +295,7 @@ def get_assets_and_tasks(criterions={}, with_episode_ids=False):
294
295
  task_due_date,
295
296
  task_done_date,
296
297
  task_last_comment_date,
298
+ task_last_preview_file_id,
297
299
  task_difficulty,
298
300
  person_id,
299
301
  ) in query_result:
@@ -346,6 +348,7 @@ def get_assets_and_tasks(criterions={}, with_episode_ids=False):
346
348
  "last_comment_date": fields.serialize_value(
347
349
  task_last_comment_date
348
350
  ),
351
+ "last_preview_file_id": str(task_last_preview_file_id or ""),
349
352
  "priority": task_priority or 0,
350
353
  "real_start_date": fields.serialize_value(
351
354
  task_real_start_date
@@ -106,6 +106,7 @@ def get_edits_and_tasks(criterions={}):
106
106
  Task.start_date,
107
107
  Task.due_date,
108
108
  Task.last_comment_date,
109
+ Task.last_preview_file_id,
109
110
  Task.nb_assets_ready,
110
111
  assignees_table.columns.person,
111
112
  Project.id,
@@ -153,6 +154,7 @@ def get_edits_and_tasks(criterions={}):
153
154
  task_start_date,
154
155
  task_due_date,
155
156
  task_last_comment_date,
157
+ task_last_preview_file_id,
156
158
  task_nb_assets_ready,
157
159
  person_id,
158
160
  project_id,
@@ -203,6 +205,7 @@ def get_edits_and_tasks(criterions={}):
203
205
  "end_date": task_end_date,
204
206
  "estimation": task_estimation,
205
207
  "last_comment_date": task_last_comment_date,
208
+ "last_preview_file_id": task_last_preview_file_id,
206
209
  "is_subscribed": subscription_map.get(task_id, False),
207
210
  "nb_assets_ready": task_nb_assets_ready,
208
211
  "priority": task_priority or 0,
@@ -251,6 +251,7 @@ def get_entities_and_tasks(criterions={}):
251
251
  Task.due_date,
252
252
  Task.done_date,
253
253
  Task.last_comment_date,
254
+ Task.last_preview_file_id,
254
255
  Task.difficulty,
255
256
  assignees_table.columns.person,
256
257
  )
@@ -282,6 +283,7 @@ def get_entities_and_tasks(criterions={}):
282
283
  task_due_date,
283
284
  task_done_date,
284
285
  task_last_comment_date,
286
+ task_last_preview_file_id,
285
287
  task_difficulty,
286
288
  person_id,
287
289
  ) in query.all():
@@ -322,6 +324,7 @@ def get_entities_and_tasks(criterions={}):
322
324
  "duration": task_duration,
323
325
  "is_subscribed": subscription_map.get(task_id, False),
324
326
  "last_comment_date": task_last_comment_date,
327
+ "last_preview_file_id": task_last_preview_file_id,
325
328
  "priority": task_priority or 0,
326
329
  "real_start_date": task_real_start_date,
327
330
  "retake_count": task_retake_count,
@@ -253,6 +253,7 @@ def get_shots_and_tasks(criterions={}):
253
253
  Task.due_date,
254
254
  Task.done_date,
255
255
  Task.last_comment_date,
256
+ Task.last_preview_file_id,
256
257
  Task.nb_assets_ready,
257
258
  Task.difficulty,
258
259
  assignees_table.columns.person,
@@ -304,6 +305,7 @@ def get_shots_and_tasks(criterions={}):
304
305
  task_due_date,
305
306
  task_done_date,
306
307
  task_last_comment_date,
308
+ task_last_preview_file_id,
307
309
  task_nb_assets_ready,
308
310
  task_difficulty,
309
311
  person_id,
@@ -364,6 +366,7 @@ def get_shots_and_tasks(criterions={}):
364
366
  "estimation": task_estimation,
365
367
  "is_subscribed": subscription_map.get(task_id, False),
366
368
  "last_comment_date": task_last_comment_date,
369
+ "last_preview_file_id": task_last_preview_file_id,
367
370
  "nb_assets_ready": task_nb_assets_ready,
368
371
  "priority": task_priority or 0,
369
372
  "real_start_date": task_real_start_date,
@@ -15,7 +15,7 @@ from zou.app.models.comment import (
15
15
  acknowledgements_table,
16
16
  mentions_table,
17
17
  department_mentions_table,
18
- preview_link_table,
18
+ CommentPreviewLink,
19
19
  )
20
20
  from zou.app.models.department import Department
21
21
  from zou.app.models.entity import Entity, EntityLink
@@ -686,9 +686,9 @@ def _build_department_mention_map_for_comments(comment_ids):
686
686
  def _build_preview_map_for_comments(comment_ids, is_client=False):
687
687
  preview_map = {}
688
688
  query = (
689
- PreviewFile.query.join(preview_link_table)
690
- .filter(preview_link_table.c.comment.in_(comment_ids))
691
- .add_columns(preview_link_table.c.comment)
689
+ PreviewFile.query.join(CommentPreviewLink)
690
+ .filter(CommentPreviewLink.comment.in_(comment_ids))
691
+ .add_columns(CommentPreviewLink.comment)
692
692
  )
693
693
  for preview, comment_id in query.all():
694
694
  comment_id = str(comment_id)
@@ -1105,6 +1105,7 @@ def get_user_filter_groups(current_user_id):
1105
1105
  )
1106
1106
  )
1107
1107
  .filter(or_(build_open_project_filter(), Project.id == None))
1108
+ .order_by(SearchFilterGroup.created_at.desc())
1108
1109
  .all()
1109
1110
  )
1110
1111
 
@@ -1,6 +1,7 @@
1
1
  import os
2
2
  import shutil
3
3
  import time
4
+ from flask_fs.errors import FileNotFound
4
5
 
5
6
  import errno
6
7
 
@@ -44,6 +45,8 @@ def get_file_path_and_file(
44
45
  ):
45
46
  if config.FS_BACKEND == "local":
46
47
  file_path = get_local_path(prefix, instance_id)
48
+ if is_unvalid_file(file_path, file_size):
49
+ raise FileNotFound
47
50
  else:
48
51
  file_path = os.path.join(
49
52
  config.TMP_DIR, "cache-%s-%s.%s" % (prefix, instance_id, extension)
@@ -1,6 +1,7 @@
1
1
  from flask_jwt_extended.exceptions import NoAuthorizationError
2
2
  from jwt import ExpiredSignatureError
3
3
  from werkzeug.exceptions import Forbidden, NotFound
4
+ from flask_fs.errors import FileNotFound
4
5
 
5
6
  from zou.app import config
6
7
  from zou.app.utils import permissions
@@ -37,6 +38,7 @@ def init_monitoring(app):
37
38
  NotFound,
38
39
  Forbidden,
39
40
  ExpiredSignatureError,
41
+ FileNotFound,
40
42
  ],
41
43
  )
42
44