zou 0.19.73__tar.gz → 0.20.1__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 (430) hide show
  1. {zou-0.19.73/zou.egg-info → zou-0.20.1}/PKG-INFO +9 -9
  2. {zou-0.19.73 → zou-0.20.1}/setup.cfg +8 -8
  3. zou-0.20.1/zou/__init__.py +1 -0
  4. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/index/resources.py +2 -10
  5. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/previews/__init__.py +5 -0
  6. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/previews/resources.py +228 -98
  7. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/tasks/__init__.py +1 -2
  8. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/tasks/resources.py +0 -3
  9. {zou-0.19.73 → zou-0.20.1}/zou/app/services/comments_service.py +3 -3
  10. {zou-0.19.73 → zou-0.20.1}/zou/app/services/tasks_service.py +2 -0
  11. {zou-0.19.73 → zou-0.20.1}/zou/app/stores/publisher_store.py +6 -14
  12. zou-0.20.1/zou/app/utils/redis.py +11 -0
  13. {zou-0.19.73 → zou-0.20.1}/zou/event_stream.py +3 -35
  14. {zou-0.19.73 → zou-0.20.1/zou.egg-info}/PKG-INFO +9 -9
  15. {zou-0.19.73 → zou-0.20.1}/zou.egg-info/SOURCES.txt +1 -1
  16. {zou-0.19.73 → zou-0.20.1}/zou.egg-info/requires.txt +8 -8
  17. zou-0.19.73/zou/__init__.py +0 -1
  18. zou-0.19.73/zou/job_settings.py +0 -6
  19. {zou-0.19.73 → zou-0.20.1}/LICENSE +0 -0
  20. {zou-0.19.73 → zou-0.20.1}/README.rst +0 -0
  21. {zou-0.19.73 → zou-0.20.1}/pyproject.toml +0 -0
  22. {zou-0.19.73 → zou-0.20.1}/setup.py +0 -0
  23. {zou-0.19.73 → zou-0.20.1}/zou/app/__init__.py +0 -0
  24. {zou-0.19.73 → zou-0.20.1}/zou/app/api.py +0 -0
  25. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/__init__.py +0 -0
  26. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/assets/__init__.py +0 -0
  27. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/assets/resources.py +0 -0
  28. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/auth/__init__.py +0 -0
  29. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/auth/resources.py +0 -0
  30. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/breakdown/__init__.py +0 -0
  31. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/breakdown/resources.py +0 -0
  32. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/chats/__init__.py +0 -0
  33. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/chats/resources.py +0 -0
  34. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/comments/__init__.py +0 -0
  35. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/comments/resources.py +0 -0
  36. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/concepts/__init__.py +0 -0
  37. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/concepts/resources.py +0 -0
  38. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/crud/__init__.py +0 -0
  39. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/crud/asset_instance.py +0 -0
  40. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/crud/attachment_file.py +0 -0
  41. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/crud/base.py +0 -0
  42. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/crud/chat.py +0 -0
  43. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/crud/chat_message.py +0 -0
  44. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/crud/comments.py +0 -0
  45. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/crud/custom_action.py +0 -0
  46. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/crud/day_off.py +0 -0
  47. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/crud/department.py +0 -0
  48. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/crud/entity.py +0 -0
  49. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/crud/entity_link.py +0 -0
  50. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/crud/entity_type.py +0 -0
  51. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/crud/event.py +0 -0
  52. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/crud/file_status.py +0 -0
  53. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/crud/metadata_descriptor.py +0 -0
  54. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/crud/milestone.py +0 -0
  55. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/crud/news.py +0 -0
  56. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/crud/notification.py +0 -0
  57. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/crud/organisation.py +0 -0
  58. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/crud/output_file.py +0 -0
  59. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/crud/output_type.py +0 -0
  60. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/crud/person.py +0 -0
  61. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/crud/playlist.py +0 -0
  62. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/crud/preview_background_file.py +0 -0
  63. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/crud/preview_file.py +0 -0
  64. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/crud/project.py +0 -0
  65. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/crud/project_status.py +0 -0
  66. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/crud/schedule_item.py +0 -0
  67. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/crud/search_filter.py +0 -0
  68. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/crud/search_filter_group.py +0 -0
  69. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/crud/software.py +0 -0
  70. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/crud/status_automation.py +0 -0
  71. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/crud/studio.py +0 -0
  72. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/crud/subscription.py +0 -0
  73. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/crud/task.py +0 -0
  74. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/crud/task_status.py +0 -0
  75. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/crud/task_type.py +0 -0
  76. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/crud/time_spent.py +0 -0
  77. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/crud/working_file.py +0 -0
  78. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/edits/__init__.py +0 -0
  79. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/edits/resources.py +0 -0
  80. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/entities/__init__.py +0 -0
  81. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/entities/resources.py +0 -0
  82. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/events/__init__.py +0 -0
  83. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/events/resources.py +0 -0
  84. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/export/__init__.py +0 -0
  85. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/export/csv/__init__.py +0 -0
  86. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/export/csv/assets.py +0 -0
  87. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/export/csv/base.py +0 -0
  88. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/export/csv/casting.py +0 -0
  89. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/export/csv/edits.py +0 -0
  90. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/export/csv/persons.py +0 -0
  91. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/export/csv/playlists.py +0 -0
  92. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/export/csv/projects.py +0 -0
  93. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/export/csv/shots.py +0 -0
  94. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/export/csv/task_types.py +0 -0
  95. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/export/csv/tasks.py +0 -0
  96. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/export/csv/time_spents.py +0 -0
  97. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/files/__init__.py +0 -0
  98. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/files/resources.py +0 -0
  99. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/index/__init__.py +0 -0
  100. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/news/__init__.py +0 -0
  101. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/news/resources.py +0 -0
  102. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/persons/__init__.py +0 -0
  103. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/persons/resources.py +0 -0
  104. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/playlists/__init__.py +0 -0
  105. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/playlists/resources.py +0 -0
  106. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/projects/__init__.py +0 -0
  107. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/projects/resources.py +0 -0
  108. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/search/__init__.py +0 -0
  109. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/search/resources.py +0 -0
  110. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/shots/__init__.py +0 -0
  111. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/shots/resources.py +0 -0
  112. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/source/__init__.py +0 -0
  113. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/source/csv/__init__.py +0 -0
  114. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/source/csv/assets.py +0 -0
  115. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/source/csv/base.py +0 -0
  116. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/source/csv/casting.py +0 -0
  117. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/source/csv/edits.py +0 -0
  118. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/source/csv/persons.py +0 -0
  119. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/source/csv/shots.py +0 -0
  120. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/source/csv/task_type_estimations.py +0 -0
  121. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/source/kitsu.py +0 -0
  122. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/source/otio.py +0 -0
  123. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/source/shotgun/__init__.py +0 -0
  124. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/source/shotgun/assets.py +0 -0
  125. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/source/shotgun/base.py +0 -0
  126. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/source/shotgun/episode.py +0 -0
  127. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/source/shotgun/exception.py +0 -0
  128. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/source/shotgun/import_errors.py +0 -0
  129. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/source/shotgun/notes.py +0 -0
  130. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/source/shotgun/person.py +0 -0
  131. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/source/shotgun/project.py +0 -0
  132. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/source/shotgun/scene.py +0 -0
  133. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/source/shotgun/sequence.py +0 -0
  134. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/source/shotgun/shot.py +0 -0
  135. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/source/shotgun/status.py +0 -0
  136. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/source/shotgun/steps.py +0 -0
  137. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/source/shotgun/tasks.py +0 -0
  138. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/source/shotgun/team.py +0 -0
  139. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/source/shotgun/versions.py +0 -0
  140. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/user/__init__.py +0 -0
  141. {zou-0.19.73 → zou-0.20.1}/zou/app/blueprints/user/resources.py +0 -0
  142. {zou-0.19.73 → zou-0.20.1}/zou/app/config.py +0 -0
  143. {zou-0.19.73 → zou-0.20.1}/zou/app/file_trees/default.json +0 -0
  144. {zou-0.19.73 → zou-0.20.1}/zou/app/file_trees/simple.json +0 -0
  145. {zou-0.19.73 → zou-0.20.1}/zou/app/indexer/__init__.py +0 -0
  146. {zou-0.19.73 → zou-0.20.1}/zou/app/indexer/indexing.py +0 -0
  147. {zou-0.19.73 → zou-0.20.1}/zou/app/mixin.py +0 -0
  148. {zou-0.19.73 → zou-0.20.1}/zou/app/models/__init__.py +0 -0
  149. {zou-0.19.73 → zou-0.20.1}/zou/app/models/asset_instance.py +0 -0
  150. {zou-0.19.73 → zou-0.20.1}/zou/app/models/attachment_file.py +0 -0
  151. {zou-0.19.73 → zou-0.20.1}/zou/app/models/base.py +0 -0
  152. {zou-0.19.73 → zou-0.20.1}/zou/app/models/build_job.py +0 -0
  153. {zou-0.19.73 → zou-0.20.1}/zou/app/models/chat.py +0 -0
  154. {zou-0.19.73 → zou-0.20.1}/zou/app/models/chat_message.py +0 -0
  155. {zou-0.19.73 → zou-0.20.1}/zou/app/models/comment.py +0 -0
  156. {zou-0.19.73 → zou-0.20.1}/zou/app/models/custom_action.py +0 -0
  157. {zou-0.19.73 → zou-0.20.1}/zou/app/models/data_import_error.py +0 -0
  158. {zou-0.19.73 → zou-0.20.1}/zou/app/models/day_off.py +0 -0
  159. {zou-0.19.73 → zou-0.20.1}/zou/app/models/department.py +0 -0
  160. {zou-0.19.73 → zou-0.20.1}/zou/app/models/desktop_login_log.py +0 -0
  161. {zou-0.19.73 → zou-0.20.1}/zou/app/models/entity.py +0 -0
  162. {zou-0.19.73 → zou-0.20.1}/zou/app/models/entity_type.py +0 -0
  163. {zou-0.19.73 → zou-0.20.1}/zou/app/models/event.py +0 -0
  164. {zou-0.19.73 → zou-0.20.1}/zou/app/models/file_status.py +0 -0
  165. {zou-0.19.73 → zou-0.20.1}/zou/app/models/login_log.py +0 -0
  166. {zou-0.19.73 → zou-0.20.1}/zou/app/models/metadata_descriptor.py +0 -0
  167. {zou-0.19.73 → zou-0.20.1}/zou/app/models/milestone.py +0 -0
  168. {zou-0.19.73 → zou-0.20.1}/zou/app/models/news.py +0 -0
  169. {zou-0.19.73 → zou-0.20.1}/zou/app/models/notification.py +0 -0
  170. {zou-0.19.73 → zou-0.20.1}/zou/app/models/organisation.py +0 -0
  171. {zou-0.19.73 → zou-0.20.1}/zou/app/models/output_file.py +0 -0
  172. {zou-0.19.73 → zou-0.20.1}/zou/app/models/output_type.py +0 -0
  173. {zou-0.19.73 → zou-0.20.1}/zou/app/models/person.py +0 -0
  174. {zou-0.19.73 → zou-0.20.1}/zou/app/models/playlist.py +0 -0
  175. {zou-0.19.73 → zou-0.20.1}/zou/app/models/preview_background_file.py +0 -0
  176. {zou-0.19.73 → zou-0.20.1}/zou/app/models/preview_file.py +0 -0
  177. {zou-0.19.73 → zou-0.20.1}/zou/app/models/project.py +0 -0
  178. {zou-0.19.73 → zou-0.20.1}/zou/app/models/project_status.py +0 -0
  179. {zou-0.19.73 → zou-0.20.1}/zou/app/models/schedule_item.py +0 -0
  180. {zou-0.19.73 → zou-0.20.1}/zou/app/models/search_filter.py +0 -0
  181. {zou-0.19.73 → zou-0.20.1}/zou/app/models/search_filter_group.py +0 -0
  182. {zou-0.19.73 → zou-0.20.1}/zou/app/models/serializer.py +0 -0
  183. {zou-0.19.73 → zou-0.20.1}/zou/app/models/software.py +0 -0
  184. {zou-0.19.73 → zou-0.20.1}/zou/app/models/status_automation.py +0 -0
  185. {zou-0.19.73 → zou-0.20.1}/zou/app/models/studio.py +0 -0
  186. {zou-0.19.73 → zou-0.20.1}/zou/app/models/subscription.py +0 -0
  187. {zou-0.19.73 → zou-0.20.1}/zou/app/models/task.py +0 -0
  188. {zou-0.19.73 → zou-0.20.1}/zou/app/models/task_status.py +0 -0
  189. {zou-0.19.73 → zou-0.20.1}/zou/app/models/task_type.py +0 -0
  190. {zou-0.19.73 → zou-0.20.1}/zou/app/models/time_spent.py +0 -0
  191. {zou-0.19.73 → zou-0.20.1}/zou/app/models/working_file.py +0 -0
  192. {zou-0.19.73 → zou-0.20.1}/zou/app/services/__init__.py +0 -0
  193. {zou-0.19.73 → zou-0.20.1}/zou/app/services/assets_service.py +0 -0
  194. {zou-0.19.73 → zou-0.20.1}/zou/app/services/auth_service.py +0 -0
  195. {zou-0.19.73 → zou-0.20.1}/zou/app/services/backup_service.py +0 -0
  196. {zou-0.19.73 → zou-0.20.1}/zou/app/services/base_service.py +0 -0
  197. {zou-0.19.73 → zou-0.20.1}/zou/app/services/breakdown_service.py +0 -0
  198. {zou-0.19.73 → zou-0.20.1}/zou/app/services/chats_service.py +0 -0
  199. {zou-0.19.73 → zou-0.20.1}/zou/app/services/concepts_service.py +0 -0
  200. {zou-0.19.73 → zou-0.20.1}/zou/app/services/custom_actions_service.py +0 -0
  201. {zou-0.19.73 → zou-0.20.1}/zou/app/services/deletion_service.py +0 -0
  202. {zou-0.19.73 → zou-0.20.1}/zou/app/services/edits_service.py +0 -0
  203. {zou-0.19.73 → zou-0.20.1}/zou/app/services/emails_service.py +0 -0
  204. {zou-0.19.73 → zou-0.20.1}/zou/app/services/entities_service.py +0 -0
  205. {zou-0.19.73 → zou-0.20.1}/zou/app/services/events_service.py +0 -0
  206. {zou-0.19.73 → zou-0.20.1}/zou/app/services/exception.py +0 -0
  207. {zou-0.19.73 → zou-0.20.1}/zou/app/services/file_tree_service.py +0 -0
  208. {zou-0.19.73 → zou-0.20.1}/zou/app/services/files_service.py +0 -0
  209. {zou-0.19.73 → zou-0.20.1}/zou/app/services/index_service.py +0 -0
  210. {zou-0.19.73 → zou-0.20.1}/zou/app/services/names_service.py +0 -0
  211. {zou-0.19.73 → zou-0.20.1}/zou/app/services/news_service.py +0 -0
  212. {zou-0.19.73 → zou-0.20.1}/zou/app/services/notifications_service.py +0 -0
  213. {zou-0.19.73 → zou-0.20.1}/zou/app/services/persons_service.py +0 -0
  214. {zou-0.19.73 → zou-0.20.1}/zou/app/services/playlists_service.py +0 -0
  215. {zou-0.19.73 → zou-0.20.1}/zou/app/services/preview_files_service.py +0 -0
  216. {zou-0.19.73 → zou-0.20.1}/zou/app/services/projects_service.py +0 -0
  217. {zou-0.19.73 → zou-0.20.1}/zou/app/services/scenes_service.py +0 -0
  218. {zou-0.19.73 → zou-0.20.1}/zou/app/services/schedule_service.py +0 -0
  219. {zou-0.19.73 → zou-0.20.1}/zou/app/services/shots_service.py +0 -0
  220. {zou-0.19.73 → zou-0.20.1}/zou/app/services/stats_service.py +0 -0
  221. {zou-0.19.73 → zou-0.20.1}/zou/app/services/status_automations_service.py +0 -0
  222. {zou-0.19.73 → zou-0.20.1}/zou/app/services/sync_service.py +0 -0
  223. {zou-0.19.73 → zou-0.20.1}/zou/app/services/telemetry_services.py +0 -0
  224. {zou-0.19.73 → zou-0.20.1}/zou/app/services/time_spents_service.py +0 -0
  225. {zou-0.19.73 → zou-0.20.1}/zou/app/services/user_service.py +0 -0
  226. {zou-0.19.73 → zou-0.20.1}/zou/app/stores/__init__.py +0 -0
  227. {zou-0.19.73 → zou-0.20.1}/zou/app/stores/auth_tokens_store.py +0 -0
  228. {zou-0.19.73 → zou-0.20.1}/zou/app/stores/file_store.py +0 -0
  229. {zou-0.19.73 → zou-0.20.1}/zou/app/stores/queue_store.py +0 -0
  230. {zou-0.19.73 → zou-0.20.1}/zou/app/swagger.py +0 -0
  231. {zou-0.19.73 → zou-0.20.1}/zou/app/utils/__init__.py +0 -0
  232. {zou-0.19.73 → zou-0.20.1}/zou/app/utils/api.py +0 -0
  233. {zou-0.19.73 → zou-0.20.1}/zou/app/utils/auth.py +0 -0
  234. {zou-0.19.73 → zou-0.20.1}/zou/app/utils/cache.py +0 -0
  235. {zou-0.19.73 → zou-0.20.1}/zou/app/utils/chats.py +0 -0
  236. {zou-0.19.73 → zou-0.20.1}/zou/app/utils/colors.py +0 -0
  237. {zou-0.19.73 → zou-0.20.1}/zou/app/utils/commands.py +0 -0
  238. {zou-0.19.73 → zou-0.20.1}/zou/app/utils/csv_utils.py +0 -0
  239. {zou-0.19.73 → zou-0.20.1}/zou/app/utils/date_helpers.py +0 -0
  240. {zou-0.19.73 → zou-0.20.1}/zou/app/utils/dbhelpers.py +0 -0
  241. {zou-0.19.73 → zou-0.20.1}/zou/app/utils/emails.py +0 -0
  242. {zou-0.19.73 → zou-0.20.1}/zou/app/utils/env.py +0 -0
  243. {zou-0.19.73 → zou-0.20.1}/zou/app/utils/events.py +0 -0
  244. {zou-0.19.73 → zou-0.20.1}/zou/app/utils/fido.py +0 -0
  245. {zou-0.19.73 → zou-0.20.1}/zou/app/utils/fields.py +0 -0
  246. {zou-0.19.73 → zou-0.20.1}/zou/app/utils/flask.py +0 -0
  247. {zou-0.19.73 → zou-0.20.1}/zou/app/utils/fs.py +0 -0
  248. {zou-0.19.73 → zou-0.20.1}/zou/app/utils/git.py +0 -0
  249. {zou-0.19.73 → zou-0.20.1}/zou/app/utils/logs.py +0 -0
  250. {zou-0.19.73 → zou-0.20.1}/zou/app/utils/monitoring.py +0 -0
  251. {zou-0.19.73 → zou-0.20.1}/zou/app/utils/permissions.py +0 -0
  252. {zou-0.19.73 → zou-0.20.1}/zou/app/utils/query.py +0 -0
  253. {zou-0.19.73 → zou-0.20.1}/zou/app/utils/remote_job.py +0 -0
  254. {zou-0.19.73 → zou-0.20.1}/zou/app/utils/saml.py +0 -0
  255. {zou-0.19.73 → zou-0.20.1}/zou/app/utils/shell.py +0 -0
  256. {zou-0.19.73 → zou-0.20.1}/zou/app/utils/string.py +0 -0
  257. {zou-0.19.73 → zou-0.20.1}/zou/app/utils/thumbnail.py +0 -0
  258. {zou-0.19.73 → zou-0.20.1}/zou/cli.py +0 -0
  259. {zou-0.19.73 → zou-0.20.1}/zou/debug.py +0 -0
  260. {zou-0.19.73 → zou-0.20.1}/zou/migrations/README +0 -0
  261. {zou-0.19.73 → zou-0.20.1}/zou/migrations/__init__.py +0 -0
  262. {zou-0.19.73 → zou-0.20.1}/zou/migrations/alembic.ini +0 -0
  263. {zou-0.19.73 → zou-0.20.1}/zou/migrations/env.py +0 -0
  264. {zou-0.19.73 → zou-0.20.1}/zou/migrations/script.py.mako +0 -0
  265. {zou-0.19.73 → zou-0.20.1}/zou/migrations/utils/__init__.py +0 -0
  266. {zou-0.19.73 → zou-0.20.1}/zou/migrations/utils/base.py +0 -0
  267. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/003be8a91001_add_start_and_end_dates_to_projects.py +0 -0
  268. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/0596674df51d_add_department_mentions_to_comments.py +0 -0
  269. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/05ac7e8caa21_remove_unique_constraint_for_taskstatus_.py +0 -0
  270. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/05b7dc79a416_add_archived_fields_to_main_tables.py +0 -0
  271. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/0cf5e0e035fa_drop_column_tasktype_for_shots.py +0 -0
  272. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/0ec3762a745d_add_attachment_table.py +0 -0
  273. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/0ef6416a507b_.py +0 -0
  274. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/10cf267d95c9_fix_schedule_item.py +0 -0
  275. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/16328eae4b5f_add_new_constraint_for_timespent.py +0 -0
  276. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/16df47d76c64_add_some_indexes.py +0 -0
  277. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/17ef8f7be758_disallow_null_choicetype.py +0 -0
  278. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/1bb55759146f_add_table_studio.py +0 -0
  279. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/1cb44194db49_add_file_size_field_to_preview_file.py +0 -0
  280. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/1e150c2cea4d_add_nb_entities_out.py +0 -0
  281. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/1e2d77a2f0c4_add_hd_by_default_column.py +0 -0
  282. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/1fab8c420678_add_attachments_to_message_chats.py +0 -0
  283. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/20dfeb36142b_add_projecttaskstatuslink_roles_for_.py +0 -0
  284. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/23122f290ca2_add_entity_chat_models.py +0 -0
  285. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/269d41bfb73f_add_entity_entity_links.py +0 -0
  286. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/29df910f04a4_create_unique_constraint_project_id_.py +0 -0
  287. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/29fe01a6c9eb_add_status_automation_field.py +0 -0
  288. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/2adc020885fa_.py +0 -0
  289. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/2baede80b111_add_entity_status_field.py +0 -0
  290. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/306266361f4f_.py +0 -0
  291. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/328fd44c6347_add_entity_created_by.py +0 -0
  292. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/32f134ff1201_add_is_shared_flag_to_filters.py +0 -0
  293. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/346250b5304c_add_position_to_preview_files.py +0 -0
  294. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/3476e147e632_add_acks_to_comments.py +0 -0
  295. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/389cfb9de776_.py +0 -0
  296. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/38baa9a23b3d_.py +0 -0
  297. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/398150912a3f_validation_status_preview.py +0 -0
  298. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/3b0d1321079e_.py +0 -0
  299. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/3d5c93bafb9d_.py +0 -0
  300. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/3e0538ddf80f_.py +0 -0
  301. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/3fee3bd10f9d_.py +0 -0
  302. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/4095103c7d01_add_is_clients_isolated_flag_to_projects.py +0 -0
  303. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/40dea9555940_.py +0 -0
  304. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/42ec83db6a01_change_person_preferred_two_factor_.py +0 -0
  305. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/43d0cf0ed5e7_.py +0 -0
  306. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/443d1e78a932_.py +0 -0
  307. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/45c2de366e66_.py +0 -0
  308. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/45dafbb3f4e1_for_person_contract_type_disallow_null.py +0 -0
  309. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/4715c2586036_add_last_preview_file_fields.py +0 -0
  310. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/4e3738cdc34c_.py +0 -0
  311. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/4f2398ebcd49_.py +0 -0
  312. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/523ee9647bee_.py +0 -0
  313. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/54ee0d1d60ba_add_build_job_model.py +0 -0
  314. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/556526e47daa_.py +0 -0
  315. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/57222395f2be_add_statusautomation_import_last_revision.py +0 -0
  316. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/5798d2c9020b_change_person_role_to_choicetype.py +0 -0
  317. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/590aa1ffe731_add_notifications_enabled_flag.py +0 -0
  318. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/59a7445a966c_add_entity_is_shared.py +0 -0
  319. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/5a291251823c_add_max_retake_parameter.py +0 -0
  320. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/5ab9d7a75887_.py +0 -0
  321. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/5b0fcbb94f24_.py +0 -0
  322. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/5b7fa3e51701_add_is_client_allowed_flag_to_task_.py +0 -0
  323. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/5b980f0dc365_add_comment_links.py +0 -0
  324. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/5b9fd9ddfe43_add_homepage_and_contract_fields.py +0 -0
  325. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/5c0498e264bc_add_slack_fields.py +0 -0
  326. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/5e2ce62632a6_add_workflow_to_project.py +0 -0
  327. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/680c64565f9d_for_searchfiltergroup_is_shared.py +0 -0
  328. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/693cc511d28d_add_taskstatus_priority.py +0 -0
  329. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/6aa446ee4072_add_is_for_all_flage_to_playlists.py +0 -0
  330. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/6bd3b102d61b_.py +0 -0
  331. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/6c597e842afa_add_task_type_field_to_playlists.py +0 -0
  332. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/6d1b2c60f58b_add_milestone_model.py +0 -0
  333. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/6d7fa5a8e9a5_add_timesheets_locked_field_to_org.py +0 -0
  334. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/6eeaff945706_add_data_field_on_entity_links.py +0 -0
  335. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/6f6049877105_.py +0 -0
  336. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/7417c8eb70d8_add_for_entity_field_to_playlists.py +0 -0
  337. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/772a5e43f05b_.py +0 -0
  338. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/7748d3d22925_add_columns_to_searchfilter_table_to_.py +0 -0
  339. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/77d6820f494f_add_reply_to_notif.py +0 -0
  340. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/7b1f765677d8_.py +0 -0
  341. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/7bc746997e8d_add_slack_token_field_to_organisation.py +0 -0
  342. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/7dc79d4ed7cd_.py +0 -0
  343. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/818f7bda2528_.py +0 -0
  344. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/82e7f7a95e84_add_project_id_to_events.py +0 -0
  345. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/82ee682204ab_add_is_generated_from_ldap_column_to_.py +0 -0
  346. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/8588f254d6b8_add_archived_fields.py +0 -0
  347. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/8739ae9fa28b_add_for_client_field.py +0 -0
  348. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/87efceb6745b_add_ready_for_to_entity.py +0 -0
  349. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/892b264937ec_.py +0 -0
  350. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/8a1b4a1b7f4a_add_totp_columns_for_person.py +0 -0
  351. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/8e4f39e321f4_add_day_off_table.py +0 -0
  352. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/8e67c183bed7_add_preference_fields.py +0 -0
  353. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/8fbd40afbe5f_allow_to_set_float_values_for_.py +0 -0
  354. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/9010a64e5a2d_add_indices.py +0 -0
  355. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/9060dd4f6116_notification_uc.py +0 -0
  356. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/925771029620_.py +0 -0
  357. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/92b40d79ad3f_allow_message_attachments.py +0 -0
  358. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/92bdfe07e5f5_discord_integration.py +0 -0
  359. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/956659992419_add_columns_for_person_to_store_fido_.py +0 -0
  360. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/96c79d31e648_add_mail_otp_columns_for_person.py +0 -0
  361. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/96f58a4a2a58_person_partial_index_for_email_only_.py +0 -0
  362. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/971dbf5a0faf_add_short_name_for_asset_type_entity_.py +0 -0
  363. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/98c90621cf58_add_for_client_flag_to_playlist.py +0 -0
  364. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/99825b9cc778_.py +0 -0
  365. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/9a09467f9b2c_.py +0 -0
  366. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/9b85c14fa8a7_add_day_off_new_columns.py +0 -0
  367. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/9bd17364fc18_.py +0 -0
  368. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/9d3bb33c6fc6_add_department_keys_to_filter_models.py +0 -0
  369. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/9e5b3a9b0cee_add_new_column_metadatadescriptor_data_type_.py +0 -0
  370. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/9f8445f9b42c_add_man_days_fields.py +0 -0
  371. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/a23682ccc1f1_.py +0 -0
  372. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/a252a094e977_add_descriptions_for_entities_tasks_and_.py +0 -0
  373. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/a519c710877c_.py +0 -0
  374. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/a65bdadbae2f_.py +0 -0
  375. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/a66508788c53_add_nb_assets_ready.py +0 -0
  376. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/a6c25eed3ea1_add_login_failed_attemps_and_last_login_.py +0 -0
  377. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/a7c43f3fbc76_add_duration_column_to_the_preview_file.py +0 -0
  378. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/aa0a60033106_feedback_request.py +0 -0
  379. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/addbbefa7028_add_departments_link_to_metadata_.py +0 -0
  380. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/ae0127f2fc56_add_previewfile_width_and_previewfile_.py +0 -0
  381. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/af1790868e2c_.py +0 -0
  382. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/b45cb782bb9c_.py +0 -0
  383. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/b4dd0add5f79_.py +0 -0
  384. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/b8c0a0f9d054_drop_task_status_is_reviewable.py +0 -0
  385. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/b8ed0fb263f8_add_person_jti_and_jti_expiration_date.py +0 -0
  386. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/b97a71306fc8_add_is_casting_standby_column_to_entity.py +0 -0
  387. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/be56dc0fb760_for_is_shared_disallow_nullable.py +0 -0
  388. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/bf1347acdee2_.py +0 -0
  389. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/c49e41f1298b_add_previewbackground.py +0 -0
  390. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/c68c2a62cfac_add_mimetype_column_to_attachment.py +0 -0
  391. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/c726b98be194_.py +0 -0
  392. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/c81f3e83bdb5_.py +0 -0
  393. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/ca28796a2a62_add_is_done_field_to_the_task_model.py +0 -0
  394. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/cf3d365de164_add_entity_version_model.py +0 -0
  395. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/cf6cec6d6bf5_add_status_field_to_preview_file.py +0 -0
  396. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/d80267806131_task_status_new_column_is_default.py +0 -0
  397. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/d8dcd5196d57_add_casting_label.py +0 -0
  398. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/de8a3de227ef_.py +0 -0
  399. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/deeacd38d373_for_projecttaskstatuslink_set_default_.py +0 -0
  400. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/df1834485f57_.py +0 -0
  401. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/df9f8a147e80_change_file_size_to_big_integer.py +0 -0
  402. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/e1ef93f40d3d_.py +0 -0
  403. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/e29638428dfd_add_schedule_item_table.py +0 -0
  404. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/e3f6db74cc1e_.py +0 -0
  405. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/e839d6603c09_add_person_id_to_shot_history.py +0 -0
  406. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/ee2373fbe3a4_.py +0 -0
  407. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/f0567e8d0c62_.py +0 -0
  408. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/f0c6cbb61869_add_production_style_field.py +0 -0
  409. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/f344b867a911_for_description_of_entity_task_working_.py +0 -0
  410. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/f4ff5a73d283_add_person_ldap_uid.py +0 -0
  411. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/f5b113876a49_add_preferred_two_factor_authentication_.py +0 -0
  412. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/f5bdca075cdc_add_preview_download_flag_to_projects.py +0 -0
  413. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/f874ad5e898a_add_link_entity_type_task_type.py +0 -0
  414. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/f995b28fb749_.py +0 -0
  415. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/fb6b6f188497_.py +0 -0
  416. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/fb87feaaa094_add_missing_unique_constraints.py +0 -0
  417. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/fc322f908695_.py +0 -0
  418. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/fee7c696166e_.py +0 -0
  419. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/feffd3c5b806_introduce_concepts.py +0 -0
  420. {zou-0.19.73 → zou-0.20.1}/zou/migrations/versions/ffeed4956ab1_add_more_details_to_projects.py +0 -0
  421. {zou-0.19.73 → zou-0.20.1}/zou/remote/__init__.py +0 -0
  422. {zou-0.19.73 → zou-0.20.1}/zou/remote/config_payload.py +0 -0
  423. {zou-0.19.73 → zou-0.20.1}/zou/remote/normalize_movie.py +0 -0
  424. {zou-0.19.73 → zou-0.20.1}/zou/remote/playlist.py +0 -0
  425. {zou-0.19.73 → zou-0.20.1}/zou/utils/__init__.py +0 -0
  426. {zou-0.19.73 → zou-0.20.1}/zou/utils/movie.py +0 -0
  427. {zou-0.19.73 → zou-0.20.1}/zou.egg-info/dependency_links.txt +0 -0
  428. {zou-0.19.73 → zou-0.20.1}/zou.egg-info/entry_points.txt +0 -0
  429. {zou-0.19.73 → zou-0.20.1}/zou.egg-info/not-zip-safe +0 -0
  430. {zou-0.19.73 → zou-0.20.1}/zou.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: zou
3
- Version: 0.19.73
3
+ Version: 0.20.1
4
4
  Summary: API to store and manage the data of your animation production
5
5
  Home-page: https://zou.cg-wire.com
6
6
  Author: CG Wire
@@ -23,7 +23,7 @@ Requires-Python: >=3.9, <3.14
23
23
  License-File: LICENSE
24
24
  Requires-Dist: audioop-lts==0.2.1; python_version >= "3.13"
25
25
  Requires-Dist: babel==2.16.0
26
- Requires-Dist: click==8.1.7
26
+ Requires-Dist: click==8.1.8
27
27
  Requires-Dist: discord.py==2.4.0
28
28
  Requires-Dist: email-validator==2.2.0
29
29
  Requires-Dist: ffmpeg-python==0.2.0
@@ -47,28 +47,28 @@ Requires-Dist: gevent==24.11.1
47
47
  Requires-Dist: gunicorn==23.0.0
48
48
  Requires-Dist: isoweek==1.3.3
49
49
  Requires-Dist: itsdangerous==2.2.0
50
- Requires-Dist: Jinja2==3.1.4
50
+ Requires-Dist: Jinja2==3.1.5
51
51
  Requires-Dist: ldap3==2.9.1
52
52
  Requires-Dist: matterhook==0.2
53
53
  Requires-Dist: meilisearch==0.33.0
54
54
  Requires-Dist: numpy==2.0.1; python_version == "3.9"
55
- Requires-Dist: numpy==2.2.0; python_version >= "3.10"
55
+ Requires-Dist: numpy==2.2.1; python_version >= "3.10"
56
56
  Requires-Dist: opencv-python==4.10.0.84
57
57
  Requires-Dist: OpenTimelineIO==0.17.0
58
58
  Requires-Dist: OpenTimelineIO-Plugins==0.17.0
59
- Requires-Dist: orjson==3.10.12
60
- Requires-Dist: pillow==11.0.0
61
- Requires-Dist: psutil==6.1.0
59
+ Requires-Dist: orjson==3.10.13
60
+ Requires-Dist: pillow==11.1.0
61
+ Requires-Dist: psutil==6.1.1
62
62
  Requires-Dist: psycopg[binary]==3.2.3
63
63
  Requires-Dist: pyotp==2.9.0
64
64
  Requires-Dist: pysaml2==7.5.0
65
65
  Requires-Dist: python-nomad==2.0.1
66
66
  Requires-Dist: python-slugify==8.0.4
67
- Requires-Dist: python-socketio==5.12.0
67
+ Requires-Dist: python-socketio==5.12.1
68
68
  Requires-Dist: pytz==2024.2
69
69
  Requires-Dist: redis==5.2.1
70
70
  Requires-Dist: requests==2.32.3
71
- Requires-Dist: rq==2.0.0
71
+ Requires-Dist: rq==2.1.0
72
72
  Requires-Dist: slackclient==2.9.4
73
73
  Requires-Dist: sqlalchemy_utils==0.41.2
74
74
  Requires-Dist: sqlalchemy==2.0.36
@@ -29,7 +29,7 @@ packages = find:
29
29
  install_requires =
30
30
  audioop-lts==0.2.1; python_version>='3.13'
31
31
  babel==2.16.0
32
- click==8.1.7
32
+ click==8.1.8
33
33
  discord.py==2.4.0
34
34
  email-validator==2.2.0
35
35
  ffmpeg-python==0.2.0
@@ -53,28 +53,28 @@ install_requires =
53
53
  gunicorn==23.0.0
54
54
  isoweek==1.3.3
55
55
  itsdangerous==2.2.0
56
- Jinja2==3.1.4
56
+ Jinja2==3.1.5
57
57
  ldap3==2.9.1
58
58
  matterhook==0.2
59
59
  meilisearch==0.33.0
60
60
  numpy==2.0.1; python_version == '3.9'
61
- numpy==2.2.0; python_version >= '3.10'
61
+ numpy==2.2.1; python_version >= '3.10'
62
62
  opencv-python==4.10.0.84
63
63
  OpenTimelineIO==0.17.0
64
64
  OpenTimelineIO-Plugins==0.17.0
65
- orjson==3.10.12
66
- pillow==11.0.0
67
- psutil==6.1.0
65
+ orjson==3.10.13
66
+ pillow==11.1.0
67
+ psutil==6.1.1
68
68
  psycopg[binary]==3.2.3
69
69
  pyotp==2.9.0
70
70
  pysaml2==7.5.0
71
71
  python-nomad==2.0.1
72
72
  python-slugify==8.0.4
73
- python-socketio==5.12.0
73
+ python-socketio==5.12.1
74
74
  pytz==2024.2
75
75
  redis==5.2.1
76
76
  requests==2.32.3
77
- rq==2.0.0
77
+ rq==2.1.0
78
78
  slackclient==2.9.4
79
79
  sqlalchemy_utils==0.41.2
80
80
  sqlalchemy==2.0.36
@@ -0,0 +1 @@
1
+ __version__ = "0.20.1"
@@ -8,7 +8,7 @@ from flask_restful import Resource
8
8
  from zou import __version__
9
9
 
10
10
  from zou.app import app, config
11
- from zou.app.utils import permissions, shell, date_helpers
11
+ from zou.app.utils import permissions, shell, date_helpers, redis
12
12
  from zou.app.services import projects_service, stats_service, persons_service
13
13
 
14
14
  from flask_jwt_extended import jwt_required
@@ -62,15 +62,7 @@ class BaseStatusResource(Resource):
62
62
 
63
63
  is_jq_up = True
64
64
  try:
65
- host = config.KEY_VALUE_STORE["host"]
66
- port = config.KEY_VALUE_STORE["port"]
67
- db = config.KV_JOB_DB_INDEX
68
- password = config.KEY_VALUE_STORE["password"]
69
- if password:
70
- url = "redis://:%s@%s:%s/%s" % (password, host, port, db)
71
- else:
72
- url = "redis://%s:%s/%s" % (host, port, db)
73
- args = ["rq", "info", "--url", url]
65
+ args = ["rq", "info", "--url", redis.get_redis_url()]
74
66
  out = shell.run_command(args)
75
67
  is_jq_up = b"0 workers" not in out
76
68
  except Exception:
@@ -2,6 +2,7 @@ from flask import Blueprint
2
2
  from zou.app.utils.api import configure_api_from_blueprint
3
3
 
4
4
  from zou.app.blueprints.previews.resources import (
5
+ AddCommentsPreviewsResource,
5
6
  AttachmentThumbnailResource,
6
7
  CreatePreviewFilePictureResource,
7
8
  PreviewFileLowMovieResource,
@@ -37,6 +38,10 @@ routes = [
37
38
  "/pictures/preview-files/<instance_id>",
38
39
  CreatePreviewFilePictureResource,
39
40
  ),
41
+ (
42
+ "/actions/tasks/<task_id>/add-comments-previews",
43
+ AddCommentsPreviewsResource,
44
+ ),
40
45
  (
41
46
  "/movies/originals/preview-files/<instance_id>.mp4",
42
47
  PreviewFileMovieResource,
@@ -1,4 +1,5 @@
1
1
  import os
2
+ import orjson as json
2
3
 
3
4
  from flask import abort, request, current_app
4
5
  from flask import send_file as flask_send_file
@@ -207,107 +208,11 @@ def send_storage_file(
207
208
  raise FileNotFound
208
209
 
209
210
 
210
- class CreatePreviewFilePictureResource(Resource, ArgsMixin):
211
+ class BaseNewPreviewFilePicture:
211
212
  """
212
- Main resource to add a preview. It stores the preview file and generates
213
- three picture files matching preview when it's possible: a square thumbnail,
214
- a rectangle thumbnail and a midsize file.
213
+ Base class to add previews.
215
214
  """
216
215
 
217
- @jwt_required()
218
- def post(self, instance_id):
219
- """
220
- Main resource to add a preview.
221
- ---
222
- tags:
223
- - Previews
224
- description: "It stores the preview file and generates three picture files matching preview when it's possible: a square thumbnail, a rectangle thumbnail and a midsize file."
225
- consumes:
226
- - multipart/form-data
227
- - image/png
228
- - application/pdf
229
- parameters:
230
- - in: path
231
- name: instance_id
232
- required: True
233
- type: string
234
- format: UUID
235
- x-example: a24a6ea4-ce75-4665-a070-57453082c25
236
- - in: formData
237
- name: file
238
- required: True
239
- type: file
240
- responses:
241
- 200:
242
- description: Preview added
243
- """
244
- if not self.is_exist(instance_id):
245
- abort(404)
246
-
247
- if not self.is_allowed(instance_id):
248
- abort(403)
249
-
250
- uploaded_file = request.files["file"]
251
-
252
- file_name_parts = uploaded_file.filename.split(".")
253
- extension = file_name_parts.pop().lower()
254
- original_file_name = ".".join(file_name_parts)
255
-
256
- if extension in ALLOWED_PICTURE_EXTENSION:
257
- metadada = self.save_picture_preview(instance_id, uploaded_file)
258
- preview_file = preview_files_service.update_preview_file(
259
- instance_id,
260
- {
261
- "extension": "png",
262
- "original_name": original_file_name,
263
- "width": metadada["width"],
264
- "height": metadada["height"],
265
- "file_size": metadada["file_size"],
266
- "status": "ready",
267
- },
268
- )
269
- tasks_service.update_preview_file_info(preview_file)
270
- self.emit_app_preview_event(instance_id)
271
- return preview_file, 201
272
-
273
- elif extension in ALLOWED_MOVIE_EXTENSION:
274
- try:
275
- normalize = self.get_bool_parameter("normalize", "true")
276
- self.save_movie_preview(instance_id, uploaded_file, normalize)
277
- except Exception as e:
278
- current_app.logger.error(e, exc_info=1)
279
- current_app.logger.error("Normalization failed.")
280
- deletion_service.remove_preview_file_by_id(
281
- instance_id, force=True
282
- )
283
- abort(400, "Normalization failed.")
284
- preview_file = preview_files_service.update_preview_file(
285
- instance_id,
286
- {"extension": "mp4", "original_name": original_file_name},
287
- )
288
- self.emit_app_preview_event(instance_id)
289
- return preview_file, 201
290
-
291
- elif extension in ALLOWED_FILE_EXTENSION:
292
- self.save_file_preview(instance_id, uploaded_file, extension)
293
- preview_file = preview_files_service.update_preview_file(
294
- instance_id,
295
- {
296
- "extension": extension,
297
- "original_name": original_file_name,
298
- "status": "ready",
299
- },
300
- )
301
- self.emit_app_preview_event(instance_id)
302
- return preview_file, 201
303
-
304
- else:
305
- current_app.logger.info(
306
- "Wrong file format, extension: %s", extension
307
- )
308
- deletion_service.remove_preview_file_by_id(instance_id)
309
- abort(400, "Wrong file format, extension: %s" % extension)
310
-
311
216
  def save_picture_preview(self, instance_id, uploaded_file):
312
217
  """
313
218
  Get uploaded picture, build thumbnails then save everything in the file
@@ -396,6 +301,115 @@ class CreatePreviewFilePictureResource(Resource, ArgsMixin):
396
301
  project_id=task["project_id"],
397
302
  )
398
303
 
304
+ def process_uploaded_file(
305
+ self, instance_id, uploaded_file, abort_on_failed=False
306
+ ):
307
+ file_name_parts = uploaded_file.filename.split(".")
308
+ extension = file_name_parts.pop().lower()
309
+ original_file_name = ".".join(file_name_parts)
310
+ preview_file = None
311
+ if extension in ALLOWED_PICTURE_EXTENSION:
312
+ metadada = self.save_picture_preview(instance_id, uploaded_file)
313
+ preview_file = preview_files_service.update_preview_file(
314
+ instance_id,
315
+ {
316
+ "extension": "png",
317
+ "original_name": original_file_name,
318
+ "width": metadada["width"],
319
+ "height": metadada["height"],
320
+ "file_size": metadada["file_size"],
321
+ "status": "ready",
322
+ },
323
+ )
324
+ tasks_service.update_preview_file_info(preview_file)
325
+ elif extension in ALLOWED_MOVIE_EXTENSION:
326
+ try:
327
+ normalize = self.get_bool_parameter("normalize", "true")
328
+ self.save_movie_preview(instance_id, uploaded_file, normalize)
329
+ except Exception as e:
330
+ current_app.logger.error(e, exc_info=1)
331
+ current_app.logger.error("Normalization failed.")
332
+ deletion_service.remove_preview_file_by_id(
333
+ instance_id, force=True
334
+ )
335
+ if abort_on_failed:
336
+ abort(400, "Normalization failed.")
337
+ preview_file = preview_files_service.update_preview_file(
338
+ instance_id,
339
+ {"extension": "mp4", "original_name": original_file_name},
340
+ )
341
+ elif extension in ALLOWED_FILE_EXTENSION:
342
+ self.save_file_preview(instance_id, uploaded_file, extension)
343
+ preview_file = preview_files_service.update_preview_file(
344
+ instance_id,
345
+ {
346
+ "extension": extension,
347
+ "original_name": original_file_name,
348
+ "status": "ready",
349
+ },
350
+ )
351
+
352
+ if preview_file is None:
353
+ current_app.logger.info(
354
+ "Wrong file format, extension: %s", extension
355
+ )
356
+ deletion_service.remove_preview_file_by_id(instance_id)
357
+ if abort_on_failed:
358
+ abort(400, "Wrong file format, extension: %s" % extension)
359
+ else:
360
+ self.emit_app_preview_event(instance_id)
361
+ return preview_file
362
+
363
+
364
+ class CreatePreviewFilePictureResource(
365
+ BaseNewPreviewFilePicture, Resource, ArgsMixin
366
+ ):
367
+ """
368
+ Main resource to add a preview. It stores the preview file and generates
369
+ three picture files matching preview when it's possible: a square thumbnail,
370
+ a rectangle thumbnail and a midsize file.
371
+ """
372
+
373
+ @jwt_required()
374
+ def post(self, instance_id):
375
+ """
376
+ Main resource to add a preview.
377
+ ---
378
+ tags:
379
+ - Previews
380
+ description: "It stores the preview file and generates three picture files matching preview when it's possible: a square thumbnail, a rectangle thumbnail and a midsize file."
381
+ consumes:
382
+ - multipart/form-data
383
+ - image/png
384
+ - application/pdf
385
+ parameters:
386
+ - in: path
387
+ name: instance_id
388
+ required: True
389
+ type: string
390
+ format: UUID
391
+ x-example: a24a6ea4-ce75-4665-a070-57453082c25
392
+ - in: formData
393
+ name: file
394
+ required: True
395
+ type: file
396
+ responses:
397
+ 200:
398
+ description: Preview added
399
+ """
400
+ if not self.is_exist(instance_id):
401
+ abort(404)
402
+
403
+ if not self.is_allowed(instance_id):
404
+ abort(403)
405
+
406
+ return (
407
+ self.process_uploaded_file(
408
+ instance_id, request.files["file"], abort_on_failed=True
409
+ ),
410
+ 201,
411
+ )
412
+
399
413
  def is_allowed(self, preview_file_id):
400
414
  """
401
415
  Return true if user is allowed to add a preview.
@@ -422,6 +436,122 @@ class CreatePreviewFilePictureResource(Resource, ArgsMixin):
422
436
  return files_service.get_preview_file(preview_file_id) is not None
423
437
 
424
438
 
439
+ class AddCommentsPreviewsResource(
440
+ BaseNewPreviewFilePicture, Resource, ArgsMixin
441
+ ):
442
+ """
443
+ Creates new comments for given task. Each comments requires a text, a
444
+ task_status and a person as arguments.
445
+ """
446
+
447
+ @jwt_required()
448
+ def post(self, task_id):
449
+ """
450
+ Creates new comments for given task. Each comments requires a text, a
451
+ task_status and a person as arguments.
452
+ ---
453
+ tags:
454
+ - Comments
455
+ description: Creates new comments for given task. Each comments requires
456
+ a text, a task_status and a person as arguments.
457
+ parameters:
458
+ - in: path
459
+ name: task_id
460
+ required: True
461
+ type: string
462
+ format: UUID
463
+ x-example: a24a6ea4-ce75-4665-a070-57453082c25
464
+ - in: body
465
+ name: Comment
466
+ description: person ID, name, comment, revision and change status of task
467
+ schema:
468
+ type: object
469
+ required:
470
+ - comments
471
+ properties:
472
+ comments:
473
+ type: string
474
+ responses:
475
+ 201:
476
+ description: New comments created
477
+ """
478
+ if request.is_json:
479
+ args = self.get_args(
480
+ [
481
+ {
482
+ "name": "comments",
483
+ "required": True,
484
+ "default": [],
485
+ "type": dict,
486
+ "action": "append",
487
+ "help": "List of comments to add",
488
+ }
489
+ ],
490
+ )
491
+ else:
492
+ args = self.get_args(
493
+ [
494
+ {
495
+ "name": "comments",
496
+ "required": True,
497
+ "default": "[]",
498
+ "help": "List of comments to add",
499
+ }
500
+ ],
501
+ )
502
+ args["comments"] = json.loads(args["comments"])
503
+
504
+ task = tasks_service.get_task(task_id)
505
+ user_service.check_project_access(task["project_id"])
506
+ user_service.check_entity_access(task["entity_id"])
507
+
508
+ new_comments = []
509
+ for i, comment in enumerate(args["comments"]):
510
+ user_service.check_task_status_access(comment["task_status_id"])
511
+
512
+ if not permissions.has_manager_permissions():
513
+ comment["person_id"] = None
514
+ comment["created_at"] = None
515
+
516
+ new_comment = comments_service.create_comment(
517
+ comment.get("person_id", None),
518
+ task_id,
519
+ comment["task_status_id"],
520
+ comment["text"],
521
+ comment.get("checklist", []),
522
+ {
523
+ k: v
524
+ for (k, v) in request.files.items()
525
+ if f"attachment_file-{i}" in k
526
+ },
527
+ comment.get("created_at", None),
528
+ comment.get("links", []),
529
+ )
530
+
531
+ new_comment["preview_files"] = []
532
+ for uploaded_preview_file in {
533
+ k: v
534
+ for (k, v) in request.files.items()
535
+ if f"preview_file-{i}" in k
536
+ }.values():
537
+ new_preview_file = tasks_service.add_preview_file_to_comment(
538
+ new_comment["id"],
539
+ new_comment["person_id"],
540
+ task_id,
541
+ )
542
+ new_preview_file = self.process_uploaded_file(
543
+ new_preview_file["id"],
544
+ uploaded_preview_file,
545
+ abort_on_failed=False,
546
+ )
547
+ if new_preview_file:
548
+ new_comment["preview_files"].append(new_preview_file)
549
+
550
+ new_comments.append(new_comment)
551
+
552
+ return new_comments, 201
553
+
554
+
425
555
  class BasePreviewFileResource(Resource):
426
556
  """
427
557
  Base class to download a preview file.
@@ -94,8 +94,7 @@ routes = [
94
94
  AddPreviewResource,
95
95
  ),
96
96
  (
97
- "/actions/tasks/<task_id>/comments/<comment_id>/preview-files/"
98
- "<preview_file_id>",
97
+ "/actions/tasks/<task_id>/comments/<comment_id>/preview-files/<preview_file_id>",
99
98
  AddExtraPreviewResource,
100
99
  ),
101
100
  ("/actions/tasks/<task_id>/to-review", ToReviewResource),
@@ -73,9 +73,6 @@ class AddPreviewResource(Resource, ArgsMixin):
73
73
  user_service.check_project_access(task["project_id"])
74
74
  user_service.check_entity_access(task["entity_id"])
75
75
 
76
- tasks_service.clear_comment_cache(comment_id)
77
- comment = tasks_service.get_comment(comment_id)
78
- tasks_service.get_task_status(comment["task_status_id"])
79
76
  person = persons_service.get_current_user()
80
77
  preview_file = tasks_service.add_preview_file_to_comment(
81
78
  comment_id, person["id"], task_id, args["revision"]
@@ -74,9 +74,9 @@ def create_comment(
74
74
  task_id,
75
75
  task_status_id,
76
76
  text,
77
- checklist,
78
- files,
79
- created_at,
77
+ checklist=[],
78
+ files={},
79
+ created_at="",
80
80
  links=[],
81
81
  ):
82
82
  """
@@ -1970,10 +1970,12 @@ def get_open_tasks(
1970
1970
  query_stats = query_stats.filter(Task.assignees.any(id=person_id))
1971
1971
 
1972
1972
  if start_date is not None:
1973
+ start_date = func.cast(start_date, Task.start_date.type)
1973
1974
  query = query.filter(Task.start_date >= start_date)
1974
1975
  query_stats = query_stats.filter(Task.start_date >= start_date)
1975
1976
 
1976
1977
  if due_date is not None:
1978
+ due_date = func.cast(due_date, Task.due_date.type)
1977
1979
  query = query.filter(Task.due_date <= due_date)
1978
1980
  query_stats = query_stats.filter(Task.due_date <= due_date)
1979
1981
 
@@ -3,15 +3,7 @@ import redis
3
3
  from flask_socketio import SocketIO
4
4
 
5
5
  from zou.app import config
6
-
7
- host = config.KEY_VALUE_STORE["host"]
8
- port = config.KEY_VALUE_STORE["port"]
9
- redis_db = config.KV_EVENTS_DB_INDEX
10
- password = config.KEY_VALUE_STORE["password"]
11
- if password:
12
- redis_url = "redis://:%s@%s:%s/%s" % (password, host, port, redis_db)
13
- else:
14
- redis_url = "redis://%s:%s/%s" % (host, port, redis_db)
6
+ from zou.app.utils.redis import get_redis_url
15
7
 
16
8
  socketio = None
17
9
 
@@ -31,15 +23,15 @@ def init():
31
23
 
32
24
  try:
33
25
  publisher_store = redis.StrictRedis(
34
- host=host,
35
- port=port,
36
- db=redis_db,
37
- password=password,
26
+ host=config.KEY_VALUE_STORE["host"],
27
+ port=config.KEY_VALUE_STORE["port"],
28
+ db=config.KV_EVENTS_DB_INDEX,
29
+ password=config.KEY_VALUE_STORE["password"],
38
30
  decode_responses=True,
39
31
  )
40
32
  publisher_store.get("test")
41
33
  socketio = SocketIO(
42
- message_queue=redis_url,
34
+ message_queue=get_redis_url(),
43
35
  cors_allowed_origins=[],
44
36
  cors_credentials=False,
45
37
  )
@@ -0,0 +1,11 @@
1
+ from zou.app import config
2
+
3
+
4
+ def get_redis_url():
5
+ redis_host = config.KEY_VALUE_STORE["host"]
6
+ redis_port = config.KEY_VALUE_STORE["port"]
7
+ db_index = config.KV_EVENTS_DB_INDEX
8
+ redis_password = config.KEY_VALUE_STORE["password"] or ""
9
+ if redis_password:
10
+ redis_password += "@"
11
+ return f"redis://{redis_password}{redis_host}:{redis_port}/{db_index}"
@@ -2,7 +2,7 @@ from gevent import monkey
2
2
 
3
3
  monkey.patch_all()
4
4
 
5
- from flask import Flask, jsonify
5
+ from flask import jsonify
6
6
  from flask_jwt_extended import (
7
7
  get_jwt_identity,
8
8
  jwt_required,
@@ -10,19 +10,15 @@ from flask_jwt_extended import (
10
10
  JWTManager,
11
11
  )
12
12
  from flask_socketio import SocketIO, disconnect, join_room, emit
13
- from flask_sqlalchemy import SQLAlchemy
14
13
 
15
- from zou.app import config
14
+ from zou.app import config, app
16
15
  from zou.app.stores import auth_tokens_store
17
- from zou.app.utils.monitoring import init_monitoring
18
- from zou.app.utils.flask import ORJSONProvider
19
16
  from zou.app.services import persons_service
17
+ from zou.app.utils.redis import get_redis_url
20
18
 
21
19
  server_stats = {"nb_connections": 0}
22
20
  rooms_data = {}
23
21
 
24
- # Review room helpers
25
-
26
22
 
27
23
  def _get_empty_room(current_frame=0):
28
24
  return {
@@ -79,28 +75,6 @@ def _update_room_playing_status(data, room):
79
75
  return room
80
76
 
81
77
 
82
- # Database helpers
83
-
84
-
85
- def get_redis_url():
86
- redis_host = config.KEY_VALUE_STORE["host"]
87
- redis_port = config.KEY_VALUE_STORE["port"]
88
- db_index = config.KV_EVENTS_DB_INDEX
89
- redis_password = config.KEY_VALUE_STORE["password"]
90
- if redis_password:
91
- return "redis://:%s@%s:%s/%s" % (
92
- redis_password,
93
- redis_host,
94
- redis_port,
95
- db_index,
96
- )
97
- else:
98
- return "redis://%s:%s/%s" % (redis_host, redis_port, db_index)
99
-
100
-
101
- # Routes
102
-
103
-
104
78
  def set_info_routes(socketio, app):
105
79
  @app.route("/", methods=["GET"])
106
80
  def index():
@@ -227,12 +201,6 @@ def create_app():
227
201
  socketio = SocketIO(
228
202
  logger=True, cors_allowed_origins=[], cors_credentials=False
229
203
  )
230
- app = Flask(__name__)
231
- app.json = ORJSONProvider(app)
232
- app.config.from_object(config)
233
- init_monitoring(app)
234
- db = SQLAlchemy(app)
235
- app.extensions["sqlalchemy"].db = db
236
204
  set_info_routes(socketio, app)
237
205
  set_application_routes(socketio, app)
238
206
  set_playlist_room_routes(socketio, app)