zou 0.19.49__tar.gz → 0.19.51__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 (427) hide show
  1. {zou-0.19.49/zou.egg-info → zou-0.19.51}/PKG-INFO +16 -16
  2. {zou-0.19.49 → zou-0.19.51}/setup.cfg +14 -14
  3. {zou-0.19.49 → zou-0.19.51}/setup.py +1 -1
  4. zou-0.19.51/zou/__init__.py +1 -0
  5. {zou-0.19.49 → zou-0.19.51}/zou/app/__init__.py +8 -0
  6. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/auth/__init__.py +4 -0
  7. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/auth/resources.py +107 -1
  8. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/crud/entity.py +42 -1
  9. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/crud/task.py +41 -1
  10. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/index/resources.py +14 -14
  11. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/previews/resources.py +1 -0
  12. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/shots/resources.py +50 -1
  13. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/tasks/resources.py +22 -2
  14. {zou-0.19.49 → zou-0.19.51}/zou/app/config.py +4 -0
  15. {zou-0.19.49 → zou-0.19.51}/zou/app/services/auth_service.py +7 -20
  16. {zou-0.19.49 → zou-0.19.51}/zou/app/services/persons_service.py +5 -2
  17. {zou-0.19.49 → zou-0.19.51}/zou/app/services/tasks_service.py +21 -1
  18. {zou-0.19.49 → zou-0.19.51}/zou/app/utils/dbhelpers.py +14 -1
  19. zou-0.19.51/zou/app/utils/fido.py +22 -0
  20. zou-0.19.51/zou/app/utils/saml.py +52 -0
  21. {zou-0.19.49 → zou-0.19.51}/zou/cli.py +27 -2
  22. zou-0.19.51/zou/migrations/versions/ca28796a2a62_add_is_done_field_to_the_task_model.py +108 -0
  23. {zou-0.19.49 → zou-0.19.51/zou.egg-info}/PKG-INFO +16 -16
  24. {zou-0.19.49 → zou-0.19.51}/zou.egg-info/SOURCES.txt +2 -0
  25. {zou-0.19.49 → zou-0.19.51}/zou.egg-info/requires.txt +16 -15
  26. zou-0.19.49/zou/__init__.py +0 -1
  27. zou-0.19.49/zou/migrations/versions/ca28796a2a62_add_is_done_field_to_the_task_model.py +0 -45
  28. {zou-0.19.49 → zou-0.19.51}/LICENSE +0 -0
  29. {zou-0.19.49 → zou-0.19.51}/README.rst +0 -0
  30. {zou-0.19.49 → zou-0.19.51}/pyproject.toml +0 -0
  31. {zou-0.19.49 → zou-0.19.51}/zou/app/api.py +0 -0
  32. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/__init__.py +0 -0
  33. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/assets/__init__.py +0 -0
  34. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/assets/resources.py +0 -0
  35. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/breakdown/__init__.py +0 -0
  36. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/breakdown/resources.py +0 -0
  37. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/chats/__init__.py +0 -0
  38. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/chats/resources.py +0 -0
  39. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/comments/__init__.py +0 -0
  40. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/comments/resources.py +0 -0
  41. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/concepts/__init__.py +0 -0
  42. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/concepts/resources.py +0 -0
  43. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/crud/__init__.py +0 -0
  44. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/crud/asset_instance.py +0 -0
  45. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/crud/attachment_file.py +0 -0
  46. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/crud/base.py +0 -0
  47. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/crud/chat.py +0 -0
  48. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/crud/chat_message.py +0 -0
  49. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/crud/comments.py +0 -0
  50. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/crud/custom_action.py +0 -0
  51. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/crud/day_off.py +0 -0
  52. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/crud/department.py +0 -0
  53. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/crud/entity_link.py +0 -0
  54. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/crud/entity_type.py +0 -0
  55. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/crud/event.py +0 -0
  56. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/crud/file_status.py +0 -0
  57. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/crud/metadata_descriptor.py +0 -0
  58. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/crud/milestone.py +0 -0
  59. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/crud/news.py +0 -0
  60. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/crud/notification.py +0 -0
  61. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/crud/organisation.py +0 -0
  62. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/crud/output_file.py +0 -0
  63. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/crud/output_type.py +0 -0
  64. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/crud/person.py +0 -0
  65. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/crud/playlist.py +0 -0
  66. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/crud/preview_background_file.py +0 -0
  67. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/crud/preview_file.py +0 -0
  68. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/crud/project.py +0 -0
  69. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/crud/project_status.py +0 -0
  70. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/crud/schedule_item.py +0 -0
  71. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/crud/search_filter.py +0 -0
  72. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/crud/search_filter_group.py +0 -0
  73. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/crud/software.py +0 -0
  74. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/crud/status_automation.py +0 -0
  75. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/crud/studio.py +0 -0
  76. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/crud/subscription.py +0 -0
  77. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/crud/task_status.py +0 -0
  78. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/crud/task_type.py +0 -0
  79. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/crud/time_spent.py +0 -0
  80. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/crud/working_file.py +0 -0
  81. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/edits/__init__.py +0 -0
  82. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/edits/resources.py +0 -0
  83. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/entities/__init__.py +0 -0
  84. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/entities/resources.py +0 -0
  85. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/events/__init__.py +0 -0
  86. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/events/resources.py +0 -0
  87. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/export/__init__.py +0 -0
  88. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/export/csv/__init__.py +0 -0
  89. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/export/csv/assets.py +0 -0
  90. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/export/csv/base.py +0 -0
  91. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/export/csv/casting.py +0 -0
  92. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/export/csv/edits.py +0 -0
  93. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/export/csv/persons.py +0 -0
  94. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/export/csv/playlists.py +0 -0
  95. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/export/csv/projects.py +0 -0
  96. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/export/csv/shots.py +0 -0
  97. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/export/csv/task_types.py +0 -0
  98. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/export/csv/tasks.py +0 -0
  99. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/export/csv/time_spents.py +0 -0
  100. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/files/__init__.py +0 -0
  101. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/files/resources.py +0 -0
  102. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/index/__init__.py +0 -0
  103. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/news/__init__.py +0 -0
  104. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/news/resources.py +0 -0
  105. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/persons/__init__.py +0 -0
  106. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/persons/resources.py +0 -0
  107. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/playlists/__init__.py +0 -0
  108. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/playlists/resources.py +0 -0
  109. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/previews/__init__.py +0 -0
  110. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/projects/__init__.py +0 -0
  111. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/projects/resources.py +0 -0
  112. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/search/__init__.py +0 -0
  113. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/search/resources.py +0 -0
  114. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/shots/__init__.py +0 -0
  115. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/source/__init__.py +0 -0
  116. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/source/csv/__init__.py +0 -0
  117. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/source/csv/assets.py +0 -0
  118. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/source/csv/base.py +0 -0
  119. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/source/csv/casting.py +0 -0
  120. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/source/csv/edits.py +0 -0
  121. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/source/csv/persons.py +0 -0
  122. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/source/csv/shots.py +0 -0
  123. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/source/csv/task_type_estimations.py +0 -0
  124. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/source/kitsu.py +0 -0
  125. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/source/otio.py +0 -0
  126. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/source/shotgun/__init__.py +0 -0
  127. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/source/shotgun/assets.py +0 -0
  128. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/source/shotgun/base.py +0 -0
  129. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/source/shotgun/episode.py +0 -0
  130. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/source/shotgun/exception.py +0 -0
  131. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/source/shotgun/import_errors.py +0 -0
  132. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/source/shotgun/notes.py +0 -0
  133. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/source/shotgun/person.py +0 -0
  134. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/source/shotgun/project.py +0 -0
  135. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/source/shotgun/scene.py +0 -0
  136. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/source/shotgun/sequence.py +0 -0
  137. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/source/shotgun/shot.py +0 -0
  138. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/source/shotgun/status.py +0 -0
  139. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/source/shotgun/steps.py +0 -0
  140. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/source/shotgun/tasks.py +0 -0
  141. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/source/shotgun/team.py +0 -0
  142. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/source/shotgun/versions.py +0 -0
  143. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/tasks/__init__.py +0 -0
  144. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/user/__init__.py +0 -0
  145. {zou-0.19.49 → zou-0.19.51}/zou/app/blueprints/user/resources.py +0 -0
  146. {zou-0.19.49 → zou-0.19.51}/zou/app/file_trees/default.json +0 -0
  147. {zou-0.19.49 → zou-0.19.51}/zou/app/file_trees/simple.json +0 -0
  148. {zou-0.19.49 → zou-0.19.51}/zou/app/indexer/__init__.py +0 -0
  149. {zou-0.19.49 → zou-0.19.51}/zou/app/indexer/indexing.py +0 -0
  150. {zou-0.19.49 → zou-0.19.51}/zou/app/mixin.py +0 -0
  151. {zou-0.19.49 → zou-0.19.51}/zou/app/models/__init__.py +0 -0
  152. {zou-0.19.49 → zou-0.19.51}/zou/app/models/asset_instance.py +0 -0
  153. {zou-0.19.49 → zou-0.19.51}/zou/app/models/attachment_file.py +0 -0
  154. {zou-0.19.49 → zou-0.19.51}/zou/app/models/base.py +0 -0
  155. {zou-0.19.49 → zou-0.19.51}/zou/app/models/build_job.py +0 -0
  156. {zou-0.19.49 → zou-0.19.51}/zou/app/models/chat.py +0 -0
  157. {zou-0.19.49 → zou-0.19.51}/zou/app/models/chat_message.py +0 -0
  158. {zou-0.19.49 → zou-0.19.51}/zou/app/models/comment.py +0 -0
  159. {zou-0.19.49 → zou-0.19.51}/zou/app/models/custom_action.py +0 -0
  160. {zou-0.19.49 → zou-0.19.51}/zou/app/models/data_import_error.py +0 -0
  161. {zou-0.19.49 → zou-0.19.51}/zou/app/models/day_off.py +0 -0
  162. {zou-0.19.49 → zou-0.19.51}/zou/app/models/department.py +0 -0
  163. {zou-0.19.49 → zou-0.19.51}/zou/app/models/desktop_login_log.py +0 -0
  164. {zou-0.19.49 → zou-0.19.51}/zou/app/models/entity.py +0 -0
  165. {zou-0.19.49 → zou-0.19.51}/zou/app/models/entity_type.py +0 -0
  166. {zou-0.19.49 → zou-0.19.51}/zou/app/models/event.py +0 -0
  167. {zou-0.19.49 → zou-0.19.51}/zou/app/models/file_status.py +0 -0
  168. {zou-0.19.49 → zou-0.19.51}/zou/app/models/login_log.py +0 -0
  169. {zou-0.19.49 → zou-0.19.51}/zou/app/models/metadata_descriptor.py +0 -0
  170. {zou-0.19.49 → zou-0.19.51}/zou/app/models/milestone.py +0 -0
  171. {zou-0.19.49 → zou-0.19.51}/zou/app/models/news.py +0 -0
  172. {zou-0.19.49 → zou-0.19.51}/zou/app/models/notification.py +0 -0
  173. {zou-0.19.49 → zou-0.19.51}/zou/app/models/organisation.py +0 -0
  174. {zou-0.19.49 → zou-0.19.51}/zou/app/models/output_file.py +0 -0
  175. {zou-0.19.49 → zou-0.19.51}/zou/app/models/output_type.py +0 -0
  176. {zou-0.19.49 → zou-0.19.51}/zou/app/models/person.py +0 -0
  177. {zou-0.19.49 → zou-0.19.51}/zou/app/models/playlist.py +0 -0
  178. {zou-0.19.49 → zou-0.19.51}/zou/app/models/preview_background_file.py +0 -0
  179. {zou-0.19.49 → zou-0.19.51}/zou/app/models/preview_file.py +0 -0
  180. {zou-0.19.49 → zou-0.19.51}/zou/app/models/project.py +0 -0
  181. {zou-0.19.49 → zou-0.19.51}/zou/app/models/project_status.py +0 -0
  182. {zou-0.19.49 → zou-0.19.51}/zou/app/models/schedule_item.py +0 -0
  183. {zou-0.19.49 → zou-0.19.51}/zou/app/models/search_filter.py +0 -0
  184. {zou-0.19.49 → zou-0.19.51}/zou/app/models/search_filter_group.py +0 -0
  185. {zou-0.19.49 → zou-0.19.51}/zou/app/models/serializer.py +0 -0
  186. {zou-0.19.49 → zou-0.19.51}/zou/app/models/software.py +0 -0
  187. {zou-0.19.49 → zou-0.19.51}/zou/app/models/status_automation.py +0 -0
  188. {zou-0.19.49 → zou-0.19.51}/zou/app/models/studio.py +0 -0
  189. {zou-0.19.49 → zou-0.19.51}/zou/app/models/subscription.py +0 -0
  190. {zou-0.19.49 → zou-0.19.51}/zou/app/models/task.py +0 -0
  191. {zou-0.19.49 → zou-0.19.51}/zou/app/models/task_status.py +0 -0
  192. {zou-0.19.49 → zou-0.19.51}/zou/app/models/task_type.py +0 -0
  193. {zou-0.19.49 → zou-0.19.51}/zou/app/models/time_spent.py +0 -0
  194. {zou-0.19.49 → zou-0.19.51}/zou/app/models/working_file.py +0 -0
  195. {zou-0.19.49 → zou-0.19.51}/zou/app/services/__init__.py +0 -0
  196. {zou-0.19.49 → zou-0.19.51}/zou/app/services/assets_service.py +0 -0
  197. {zou-0.19.49 → zou-0.19.51}/zou/app/services/backup_service.py +0 -0
  198. {zou-0.19.49 → zou-0.19.51}/zou/app/services/base_service.py +0 -0
  199. {zou-0.19.49 → zou-0.19.51}/zou/app/services/breakdown_service.py +0 -0
  200. {zou-0.19.49 → zou-0.19.51}/zou/app/services/chats_service.py +0 -0
  201. {zou-0.19.49 → zou-0.19.51}/zou/app/services/comments_service.py +0 -0
  202. {zou-0.19.49 → zou-0.19.51}/zou/app/services/concepts_service.py +0 -0
  203. {zou-0.19.49 → zou-0.19.51}/zou/app/services/custom_actions_service.py +0 -0
  204. {zou-0.19.49 → zou-0.19.51}/zou/app/services/deletion_service.py +0 -0
  205. {zou-0.19.49 → zou-0.19.51}/zou/app/services/edits_service.py +0 -0
  206. {zou-0.19.49 → zou-0.19.51}/zou/app/services/emails_service.py +0 -0
  207. {zou-0.19.49 → zou-0.19.51}/zou/app/services/entities_service.py +0 -0
  208. {zou-0.19.49 → zou-0.19.51}/zou/app/services/events_service.py +0 -0
  209. {zou-0.19.49 → zou-0.19.51}/zou/app/services/exception.py +0 -0
  210. {zou-0.19.49 → zou-0.19.51}/zou/app/services/file_tree_service.py +0 -0
  211. {zou-0.19.49 → zou-0.19.51}/zou/app/services/files_service.py +0 -0
  212. {zou-0.19.49 → zou-0.19.51}/zou/app/services/index_service.py +0 -0
  213. {zou-0.19.49 → zou-0.19.51}/zou/app/services/names_service.py +0 -0
  214. {zou-0.19.49 → zou-0.19.51}/zou/app/services/news_service.py +0 -0
  215. {zou-0.19.49 → zou-0.19.51}/zou/app/services/notifications_service.py +0 -0
  216. {zou-0.19.49 → zou-0.19.51}/zou/app/services/playlists_service.py +0 -0
  217. {zou-0.19.49 → zou-0.19.51}/zou/app/services/preview_files_service.py +0 -0
  218. {zou-0.19.49 → zou-0.19.51}/zou/app/services/projects_service.py +0 -0
  219. {zou-0.19.49 → zou-0.19.51}/zou/app/services/scenes_service.py +0 -0
  220. {zou-0.19.49 → zou-0.19.51}/zou/app/services/schedule_service.py +0 -0
  221. {zou-0.19.49 → zou-0.19.51}/zou/app/services/shots_service.py +0 -0
  222. {zou-0.19.49 → zou-0.19.51}/zou/app/services/stats_service.py +0 -0
  223. {zou-0.19.49 → zou-0.19.51}/zou/app/services/status_automations_service.py +0 -0
  224. {zou-0.19.49 → zou-0.19.51}/zou/app/services/sync_service.py +0 -0
  225. {zou-0.19.49 → zou-0.19.51}/zou/app/services/telemetry_services.py +0 -0
  226. {zou-0.19.49 → zou-0.19.51}/zou/app/services/time_spents_service.py +0 -0
  227. {zou-0.19.49 → zou-0.19.51}/zou/app/services/user_service.py +0 -0
  228. {zou-0.19.49 → zou-0.19.51}/zou/app/stores/__init__.py +0 -0
  229. {zou-0.19.49 → zou-0.19.51}/zou/app/stores/auth_tokens_store.py +0 -0
  230. {zou-0.19.49 → zou-0.19.51}/zou/app/stores/file_store.py +0 -0
  231. {zou-0.19.49 → zou-0.19.51}/zou/app/stores/publisher_store.py +0 -0
  232. {zou-0.19.49 → zou-0.19.51}/zou/app/stores/queue_store.py +0 -0
  233. {zou-0.19.49 → zou-0.19.51}/zou/app/swagger.py +0 -0
  234. {zou-0.19.49 → zou-0.19.51}/zou/app/utils/__init__.py +0 -0
  235. {zou-0.19.49 → zou-0.19.51}/zou/app/utils/api.py +0 -0
  236. {zou-0.19.49 → zou-0.19.51}/zou/app/utils/auth.py +0 -0
  237. {zou-0.19.49 → zou-0.19.51}/zou/app/utils/cache.py +0 -0
  238. {zou-0.19.49 → zou-0.19.51}/zou/app/utils/chats.py +0 -0
  239. {zou-0.19.49 → zou-0.19.51}/zou/app/utils/colors.py +0 -0
  240. {zou-0.19.49 → zou-0.19.51}/zou/app/utils/commands.py +0 -0
  241. {zou-0.19.49 → zou-0.19.51}/zou/app/utils/csv_utils.py +0 -0
  242. {zou-0.19.49 → zou-0.19.51}/zou/app/utils/date_helpers.py +0 -0
  243. {zou-0.19.49 → zou-0.19.51}/zou/app/utils/emails.py +0 -0
  244. {zou-0.19.49 → zou-0.19.51}/zou/app/utils/env.py +0 -0
  245. {zou-0.19.49 → zou-0.19.51}/zou/app/utils/events.py +0 -0
  246. {zou-0.19.49 → zou-0.19.51}/zou/app/utils/fields.py +0 -0
  247. {zou-0.19.49 → zou-0.19.51}/zou/app/utils/flask.py +0 -0
  248. {zou-0.19.49 → zou-0.19.51}/zou/app/utils/fs.py +0 -0
  249. {zou-0.19.49 → zou-0.19.51}/zou/app/utils/git.py +0 -0
  250. {zou-0.19.49 → zou-0.19.51}/zou/app/utils/logs.py +0 -0
  251. {zou-0.19.49 → zou-0.19.51}/zou/app/utils/monitoring.py +0 -0
  252. {zou-0.19.49 → zou-0.19.51}/zou/app/utils/permissions.py +0 -0
  253. {zou-0.19.49 → zou-0.19.51}/zou/app/utils/query.py +0 -0
  254. {zou-0.19.49 → zou-0.19.51}/zou/app/utils/remote_job.py +0 -0
  255. {zou-0.19.49 → zou-0.19.51}/zou/app/utils/shell.py +0 -0
  256. {zou-0.19.49 → zou-0.19.51}/zou/app/utils/string.py +0 -0
  257. {zou-0.19.49 → zou-0.19.51}/zou/app/utils/thumbnail.py +0 -0
  258. {zou-0.19.49 → zou-0.19.51}/zou/debug.py +0 -0
  259. {zou-0.19.49 → zou-0.19.51}/zou/event_stream.py +0 -0
  260. {zou-0.19.49 → zou-0.19.51}/zou/job_settings.py +0 -0
  261. {zou-0.19.49 → zou-0.19.51}/zou/migrations/README +0 -0
  262. {zou-0.19.49 → zou-0.19.51}/zou/migrations/__init__.py +0 -0
  263. {zou-0.19.49 → zou-0.19.51}/zou/migrations/alembic.ini +0 -0
  264. {zou-0.19.49 → zou-0.19.51}/zou/migrations/env.py +0 -0
  265. {zou-0.19.49 → zou-0.19.51}/zou/migrations/script.py.mako +0 -0
  266. {zou-0.19.49 → zou-0.19.51}/zou/migrations/utils/__init__.py +0 -0
  267. {zou-0.19.49 → zou-0.19.51}/zou/migrations/utils/base.py +0 -0
  268. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/003be8a91001_add_start_and_end_dates_to_projects.py +0 -0
  269. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/0596674df51d_add_department_mentions_to_comments.py +0 -0
  270. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/05ac7e8caa21_remove_unique_constraint_for_taskstatus_.py +0 -0
  271. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/05b7dc79a416_add_archived_fields_to_main_tables.py +0 -0
  272. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/0cf5e0e035fa_drop_column_tasktype_for_shots.py +0 -0
  273. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/0ec3762a745d_add_attachment_table.py +0 -0
  274. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/0ef6416a507b_.py +0 -0
  275. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/10cf267d95c9_fix_schedule_item.py +0 -0
  276. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/16328eae4b5f_add_new_constraint_for_timespent.py +0 -0
  277. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/16df47d76c64_add_some_indexes.py +0 -0
  278. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/17ef8f7be758_disallow_null_choicetype.py +0 -0
  279. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/1bb55759146f_add_table_studio.py +0 -0
  280. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/1cb44194db49_add_file_size_field_to_preview_file.py +0 -0
  281. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/1e150c2cea4d_add_nb_entities_out.py +0 -0
  282. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/1e2d77a2f0c4_add_hd_by_default_column.py +0 -0
  283. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/1fab8c420678_add_attachments_to_message_chats.py +0 -0
  284. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/20dfeb36142b_add_projecttaskstatuslink_roles_for_.py +0 -0
  285. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/23122f290ca2_add_entity_chat_models.py +0 -0
  286. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/269d41bfb73f_add_entity_entity_links.py +0 -0
  287. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/29df910f04a4_create_unique_constraint_project_id_.py +0 -0
  288. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/29fe01a6c9eb_add_status_automation_field.py +0 -0
  289. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/2adc020885fa_.py +0 -0
  290. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/2baede80b111_add_entity_status_field.py +0 -0
  291. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/306266361f4f_.py +0 -0
  292. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/328fd44c6347_add_entity_created_by.py +0 -0
  293. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/32f134ff1201_add_is_shared_flag_to_filters.py +0 -0
  294. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/346250b5304c_add_position_to_preview_files.py +0 -0
  295. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/3476e147e632_add_acks_to_comments.py +0 -0
  296. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/389cfb9de776_.py +0 -0
  297. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/38baa9a23b3d_.py +0 -0
  298. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/398150912a3f_validation_status_preview.py +0 -0
  299. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/3b0d1321079e_.py +0 -0
  300. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/3d5c93bafb9d_.py +0 -0
  301. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/3e0538ddf80f_.py +0 -0
  302. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/3fee3bd10f9d_.py +0 -0
  303. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/4095103c7d01_add_is_clients_isolated_flag_to_projects.py +0 -0
  304. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/40dea9555940_.py +0 -0
  305. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/42ec83db6a01_change_person_preferred_two_factor_.py +0 -0
  306. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/43d0cf0ed5e7_.py +0 -0
  307. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/443d1e78a932_.py +0 -0
  308. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/45c2de366e66_.py +0 -0
  309. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/45dafbb3f4e1_for_person_contract_type_disallow_null.py +0 -0
  310. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/4715c2586036_add_last_preview_file_fields.py +0 -0
  311. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/4e3738cdc34c_.py +0 -0
  312. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/4f2398ebcd49_.py +0 -0
  313. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/523ee9647bee_.py +0 -0
  314. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/54ee0d1d60ba_add_build_job_model.py +0 -0
  315. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/556526e47daa_.py +0 -0
  316. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/57222395f2be_add_statusautomation_import_last_revision.py +0 -0
  317. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/5798d2c9020b_change_person_role_to_choicetype.py +0 -0
  318. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/590aa1ffe731_add_notifications_enabled_flag.py +0 -0
  319. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/5a291251823c_add_max_retake_parameter.py +0 -0
  320. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/5ab9d7a75887_.py +0 -0
  321. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/5b0fcbb94f24_.py +0 -0
  322. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/5b7fa3e51701_add_is_client_allowed_flag_to_task_.py +0 -0
  323. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/5b980f0dc365_add_comment_links.py +0 -0
  324. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/5b9fd9ddfe43_add_homepage_and_contract_fields.py +0 -0
  325. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/5c0498e264bc_add_slack_fields.py +0 -0
  326. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/5e2ce62632a6_add_workflow_to_project.py +0 -0
  327. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/680c64565f9d_for_searchfiltergroup_is_shared.py +0 -0
  328. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/693cc511d28d_add_taskstatus_priority.py +0 -0
  329. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/6aa446ee4072_add_is_for_all_flage_to_playlists.py +0 -0
  330. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/6bd3b102d61b_.py +0 -0
  331. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/6c597e842afa_add_task_type_field_to_playlists.py +0 -0
  332. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/6d1b2c60f58b_add_milestone_model.py +0 -0
  333. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/6d7fa5a8e9a5_add_timesheets_locked_field_to_org.py +0 -0
  334. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/6eeaff945706_add_data_field_on_entity_links.py +0 -0
  335. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/6f6049877105_.py +0 -0
  336. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/7417c8eb70d8_add_for_entity_field_to_playlists.py +0 -0
  337. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/772a5e43f05b_.py +0 -0
  338. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/7748d3d22925_add_columns_to_searchfilter_table_to_.py +0 -0
  339. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/77d6820f494f_add_reply_to_notif.py +0 -0
  340. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/7b1f765677d8_.py +0 -0
  341. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/7bc746997e8d_add_slack_token_field_to_organisation.py +0 -0
  342. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/7dc79d4ed7cd_.py +0 -0
  343. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/818f7bda2528_.py +0 -0
  344. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/82e7f7a95e84_add_project_id_to_events.py +0 -0
  345. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/82ee682204ab_add_is_generated_from_ldap_column_to_.py +0 -0
  346. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/8588f254d6b8_add_archived_fields.py +0 -0
  347. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/8739ae9fa28b_add_for_client_field.py +0 -0
  348. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/87efceb6745b_add_ready_for_to_entity.py +0 -0
  349. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/892b264937ec_.py +0 -0
  350. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/8a1b4a1b7f4a_add_totp_columns_for_person.py +0 -0
  351. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/8e4f39e321f4_add_day_off_table.py +0 -0
  352. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/8fbd40afbe5f_allow_to_set_float_values_for_.py +0 -0
  353. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/9010a64e5a2d_add_indices.py +0 -0
  354. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/9060dd4f6116_notification_uc.py +0 -0
  355. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/925771029620_.py +0 -0
  356. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/92b40d79ad3f_allow_message_attachments.py +0 -0
  357. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/92bdfe07e5f5_discord_integration.py +0 -0
  358. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/956659992419_add_columns_for_person_to_store_fido_.py +0 -0
  359. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/96c79d31e648_add_mail_otp_columns_for_person.py +0 -0
  360. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/96f58a4a2a58_person_partial_index_for_email_only_.py +0 -0
  361. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/971dbf5a0faf_add_short_name_for_asset_type_entity_.py +0 -0
  362. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/98c90621cf58_add_for_client_flag_to_playlist.py +0 -0
  363. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/99825b9cc778_.py +0 -0
  364. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/9a09467f9b2c_.py +0 -0
  365. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/9b85c14fa8a7_add_day_off_new_columns.py +0 -0
  366. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/9bd17364fc18_.py +0 -0
  367. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/9e5b3a9b0cee_add_new_column_metadatadescriptor_data_type_.py +0 -0
  368. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/9f8445f9b42c_add_man_days_fields.py +0 -0
  369. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/a23682ccc1f1_.py +0 -0
  370. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/a252a094e977_add_descriptions_for_entities_tasks_and_.py +0 -0
  371. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/a519c710877c_.py +0 -0
  372. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/a65bdadbae2f_.py +0 -0
  373. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/a66508788c53_add_nb_assets_ready.py +0 -0
  374. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/a6c25eed3ea1_add_login_failed_attemps_and_last_login_.py +0 -0
  375. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/a7c43f3fbc76_add_duration_column_to_the_preview_file.py +0 -0
  376. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/aa0a60033106_feedback_request.py +0 -0
  377. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/addbbefa7028_add_departments_link_to_metadata_.py +0 -0
  378. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/ae0127f2fc56_add_previewfile_width_and_previewfile_.py +0 -0
  379. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/af1790868e2c_.py +0 -0
  380. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/b45cb782bb9c_.py +0 -0
  381. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/b4dd0add5f79_.py +0 -0
  382. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/b8c0a0f9d054_drop_task_status_is_reviewable.py +0 -0
  383. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/b8ed0fb263f8_add_person_jti_and_jti_expiration_date.py +0 -0
  384. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/b97a71306fc8_add_is_casting_standby_column_to_entity.py +0 -0
  385. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/be56dc0fb760_for_is_shared_disallow_nullable.py +0 -0
  386. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/bf1347acdee2_.py +0 -0
  387. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/c49e41f1298b_add_previewbackground.py +0 -0
  388. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/c68c2a62cfac_add_mimetype_column_to_attachment.py +0 -0
  389. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/c726b98be194_.py +0 -0
  390. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/c81f3e83bdb5_.py +0 -0
  391. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/cf3d365de164_add_entity_version_model.py +0 -0
  392. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/cf6cec6d6bf5_add_status_field_to_preview_file.py +0 -0
  393. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/d80267806131_task_status_new_column_is_default.py +0 -0
  394. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/d8dcd5196d57_add_casting_label.py +0 -0
  395. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/de8a3de227ef_.py +0 -0
  396. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/deeacd38d373_for_projecttaskstatuslink_set_default_.py +0 -0
  397. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/df1834485f57_.py +0 -0
  398. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/df9f8a147e80_change_file_size_to_big_integer.py +0 -0
  399. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/e1ef93f40d3d_.py +0 -0
  400. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/e29638428dfd_add_schedule_item_table.py +0 -0
  401. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/e3f6db74cc1e_.py +0 -0
  402. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/e839d6603c09_add_person_id_to_shot_history.py +0 -0
  403. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/ee2373fbe3a4_.py +0 -0
  404. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/f0567e8d0c62_.py +0 -0
  405. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/f0c6cbb61869_add_production_style_field.py +0 -0
  406. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/f344b867a911_for_description_of_entity_task_working_.py +0 -0
  407. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/f4ff5a73d283_add_person_ldap_uid.py +0 -0
  408. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/f5b113876a49_add_preferred_two_factor_authentication_.py +0 -0
  409. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/f5bdca075cdc_add_preview_download_flag_to_projects.py +0 -0
  410. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/f874ad5e898a_add_link_entity_type_task_type.py +0 -0
  411. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/f995b28fb749_.py +0 -0
  412. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/fb6b6f188497_.py +0 -0
  413. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/fb87feaaa094_add_missing_unique_constraints.py +0 -0
  414. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/fc322f908695_.py +0 -0
  415. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/fee7c696166e_.py +0 -0
  416. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/feffd3c5b806_introduce_concepts.py +0 -0
  417. {zou-0.19.49 → zou-0.19.51}/zou/migrations/versions/ffeed4956ab1_add_more_details_to_projects.py +0 -0
  418. {zou-0.19.49 → zou-0.19.51}/zou/remote/__init__.py +0 -0
  419. {zou-0.19.49 → zou-0.19.51}/zou/remote/config_payload.py +0 -0
  420. {zou-0.19.49 → zou-0.19.51}/zou/remote/normalize_movie.py +0 -0
  421. {zou-0.19.49 → zou-0.19.51}/zou/remote/playlist.py +0 -0
  422. {zou-0.19.49 → zou-0.19.51}/zou/utils/__init__.py +0 -0
  423. {zou-0.19.49 → zou-0.19.51}/zou/utils/movie.py +0 -0
  424. {zou-0.19.49 → zou-0.19.51}/zou.egg-info/dependency_links.txt +0 -0
  425. {zou-0.19.49 → zou-0.19.51}/zou.egg-info/entry_points.txt +0 -0
  426. {zou-0.19.49 → zou-0.19.51}/zou.egg-info/not-zip-safe +0 -0
  427. {zou-0.19.49 → zou-0.19.51}/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.49
3
+ Version: 0.19.51
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
@@ -11,7 +11,6 @@ Classifier: Development Status :: 5 - Production/Stable
11
11
  Classifier: Environment :: Web Environment
12
12
  Classifier: Framework :: Flask
13
13
  Classifier: Intended Audience :: Developers
14
- Classifier: Programming Language :: Python :: 3.8
15
14
  Classifier: Programming Language :: Python :: 3.9
16
15
  Classifier: Programming Language :: Python :: 3.10
17
16
  Classifier: Programming Language :: Python :: 3.11
@@ -19,9 +18,9 @@ Classifier: Programming Language :: Python :: 3.12
19
18
  Classifier: Programming Language :: Python :: Implementation :: CPython
20
19
  Classifier: Programming Language :: Python :: Implementation :: PyPy
21
20
  Classifier: Topic :: Multimedia :: Graphics
22
- Requires-Python: >=3.8.1, <3.13
21
+ Requires-Python: >=3.9, <3.13
23
22
  License-File: LICENSE
24
- Requires-Dist: babel==2.15.0
23
+ Requires-Dist: babel==2.16.0
25
24
  Requires-Dist: click==8.1.7
26
25
  Requires-Dist: discord.py==2.4.0
27
26
  Requires-Dist: email-validator==2.2.0
@@ -40,55 +39,56 @@ Requires-Dist: flask-jwt-extended==4.6.0
40
39
  Requires-Dist: flask-migrate==4.0.7
41
40
  Requires-Dist: flask-socketio==5.3.6
42
41
  Requires-Dist: flask==3.0.3
43
- Requires-Dist: gazu==0.10.11
42
+ Requires-Dist: gazu==0.10.14
44
43
  Requires-Dist: gevent-websocket==0.10.1
45
44
  Requires-Dist: gevent==24.2.1
46
- Requires-Dist: gunicorn==22.0.0
45
+ Requires-Dist: gunicorn==23.0.0
47
46
  Requires-Dist: isoweek==1.3.3
48
47
  Requires-Dist: itsdangerous==2.2.0
49
48
  Requires-Dist: Jinja2==3.1.4
50
49
  Requires-Dist: ldap3==2.9.1
51
50
  Requires-Dist: matterhook==0.2
52
- Requires-Dist: meilisearch==0.31.4
53
- Requires-Dist: numpy==1.24.4; python_version == "3.8"
54
- Requires-Dist: numpy==2.0.1; python_version >= "3.9"
51
+ Requires-Dist: meilisearch==0.31.5
52
+ Requires-Dist: numpy==2.0.1; python_version == "3.9"
53
+ Requires-Dist: numpy==2.1.0; python_version >= "3.10"
55
54
  Requires-Dist: opencv-python==4.10.0.84
56
55
  Requires-Dist: OpenTimelineIO==0.17.0
57
56
  Requires-Dist: OpenTimelineIO-Plugins==0.17.0
58
- Requires-Dist: orjson==3.10.6
57
+ Requires-Dist: orjson==3.10.7
59
58
  Requires-Dist: pillow==10.4.0
60
59
  Requires-Dist: psutil==6.0.0
61
60
  Requires-Dist: psycopg[binary]==3.2.1
62
61
  Requires-Dist: pyotp==2.9.0
62
+ Requires-Dist: pysaml2==7.5.0
63
63
  Requires-Dist: python-nomad==2.0.1
64
64
  Requires-Dist: python-slugify==8.0.4
65
65
  Requires-Dist: python-socketio==5.11.3
66
66
  Requires-Dist: pytz==2024.1
67
- Requires-Dist: redis==5.0.7
67
+ Requires-Dist: redis==5.0.8
68
68
  Requires-Dist: requests==2.32.3
69
69
  Requires-Dist: rq==1.16.2
70
70
  Requires-Dist: slackclient==2.9.4
71
71
  Requires-Dist: sqlalchemy_utils==0.41.2
72
- Requires-Dist: sqlalchemy==2.0.31
72
+ Requires-Dist: sqlalchemy==2.0.32
73
73
  Requires-Dist: ua-parser==0.18.0
74
- Requires-Dist: werkzeug==3.0.3
74
+ Requires-Dist: werkzeug==3.0.4
75
75
  Provides-Extra: prod
76
76
  Requires-Dist: gunicorn; extra == "prod"
77
77
  Requires-Dist: gevent; extra == "prod"
78
78
  Provides-Extra: dev
79
79
  Requires-Dist: wheel; extra == "dev"
80
80
  Provides-Extra: test
81
- Requires-Dist: fakeredis==2.23.3; extra == "test"
81
+ Requires-Dist: fakeredis==2.24.1; extra == "test"
82
82
  Requires-Dist: mixer==7.2.2; extra == "test"
83
83
  Requires-Dist: pytest-cov==5.0.0; extra == "test"
84
84
  Requires-Dist: pytest==8.3.2; extra == "test"
85
85
  Provides-Extra: monitoring
86
86
  Requires-Dist: prometheus-flask-exporter==0.23.1; extra == "monitoring"
87
87
  Requires-Dist: pygelf==0.4.2; extra == "monitoring"
88
- Requires-Dist: sentry-sdk==2.11.0; extra == "monitoring"
88
+ Requires-Dist: sentry-sdk==2.13.0; extra == "monitoring"
89
89
  Provides-Extra: lint
90
90
  Requires-Dist: autoflake==2.3.1; extra == "lint"
91
- Requires-Dist: black==24.4.2; extra == "lint"
91
+ Requires-Dist: black==24.8.0; extra == "lint"
92
92
  Requires-Dist: pre-commit==3.8.0; python_version >= "3.9" and extra == "lint"
93
93
 
94
94
  .. figure:: https://zou.cg-wire.com/kitsu.png
@@ -14,7 +14,6 @@ classifiers =
14
14
  Environment :: Web Environment
15
15
  Framework :: Flask
16
16
  Intended Audience :: Developers
17
- Programming Language :: Python :: 3.8
18
17
  Programming Language :: Python :: 3.9
19
18
  Programming Language :: Python :: 3.10
20
19
  Programming Language :: Python :: 3.11
@@ -27,7 +26,7 @@ classifiers =
27
26
  zip_safe = False
28
27
  packages = find:
29
28
  install_requires =
30
- babel==2.15.0
29
+ babel==2.16.0
31
30
  click==8.1.7
32
31
  discord.py==2.4.0
33
32
  email-validator==2.2.0
@@ -46,38 +45,39 @@ install_requires =
46
45
  flask-migrate==4.0.7
47
46
  flask-socketio==5.3.6
48
47
  flask==3.0.3
49
- gazu==0.10.11
48
+ gazu==0.10.14
50
49
  gevent-websocket==0.10.1
51
50
  gevent==24.2.1
52
- gunicorn==22.0.0
51
+ gunicorn==23.0.0
53
52
  isoweek==1.3.3
54
53
  itsdangerous==2.2.0
55
54
  Jinja2==3.1.4
56
55
  ldap3==2.9.1
57
56
  matterhook==0.2
58
- meilisearch==0.31.4
59
- numpy==1.24.4; python_version == '3.8'
60
- numpy==2.0.1; python_version >= '3.9'
57
+ meilisearch==0.31.5
58
+ numpy==2.0.1; python_version == '3.9'
59
+ numpy==2.1.0; python_version >= '3.10'
61
60
  opencv-python==4.10.0.84
62
61
  OpenTimelineIO==0.17.0
63
62
  OpenTimelineIO-Plugins==0.17.0
64
- orjson==3.10.6
63
+ orjson==3.10.7
65
64
  pillow==10.4.0
66
65
  psutil==6.0.0
67
66
  psycopg[binary]==3.2.1
68
67
  pyotp==2.9.0
68
+ pysaml2==7.5.0
69
69
  python-nomad==2.0.1
70
70
  python-slugify==8.0.4
71
71
  python-socketio==5.11.3
72
72
  pytz==2024.1
73
- redis==5.0.7
73
+ redis==5.0.8
74
74
  requests==2.32.3
75
75
  rq==1.16.2
76
76
  slackclient==2.9.4
77
77
  sqlalchemy_utils==0.41.2
78
- sqlalchemy==2.0.31
78
+ sqlalchemy==2.0.32
79
79
  ua-parser==0.18.0
80
- werkzeug==3.0.3
80
+ werkzeug==3.0.4
81
81
 
82
82
  [options.package_data]
83
83
  * = app/file_trees/*.json,migrations/*,migrations/versions/*.py
@@ -92,17 +92,17 @@ prod =
92
92
  dev =
93
93
  wheel
94
94
  test =
95
- fakeredis==2.23.3
95
+ fakeredis==2.24.1
96
96
  mixer==7.2.2
97
97
  pytest-cov==5.0.0
98
98
  pytest==8.3.2
99
99
  monitoring =
100
100
  prometheus-flask-exporter==0.23.1
101
101
  pygelf==0.4.2
102
- sentry-sdk==2.11.0
102
+ sentry-sdk==2.13.0
103
103
  lint =
104
104
  autoflake==2.3.1
105
- black==24.4.2
105
+ black==24.8.0
106
106
  pre-commit==3.8.0; python_version >= '3.9'
107
107
 
108
108
  [options.entry_points]
@@ -1,4 +1,4 @@
1
1
  #!/usr/bin/env python
2
2
  from setuptools import setup
3
3
 
4
- setup(python_requires=">=3.8.1, <3.13")
4
+ setup(python_requires=">=3.9, <3.13")
@@ -0,0 +1 @@
1
+ __version__ = "0.19.51"
@@ -41,6 +41,9 @@ from zou.app.utils.flask import (
41
41
  wrong_auth_handler,
42
42
  )
43
43
 
44
+ from zou.app.utils.saml import saml_client_for
45
+ from zou.app.utils.fido import get_fido_server
46
+
44
47
  app = Flask(__name__)
45
48
  app.json = ORJSONProvider(app)
46
49
  app.request_class.user_agent_class = ParsedUserAgent
@@ -64,6 +67,11 @@ swagger = Swagger(
64
67
  app, template=swagger.swagger_template, config=swagger.swagger_config
65
68
  )
66
69
 
70
+ if config.SAML_ENABLED:
71
+ app.extensions["saml_client"] = saml_client_for(config.SAML_METADATA_URL)
72
+
73
+ app.extensions["fido_server"] = get_fido_server()
74
+
67
75
 
68
76
  @app.teardown_appcontext
69
77
  def shutdown_session(exception=None):
@@ -13,6 +13,8 @@ from zou.app.blueprints.auth.resources import (
13
13
  RegistrationResource,
14
14
  ResetPasswordResource,
15
15
  TOTPResource,
16
+ SAMLSSOResource,
17
+ SAMLLoginResource,
16
18
  )
17
19
 
18
20
  routes = [
@@ -27,6 +29,8 @@ routes = [
27
29
  ("/auth/email-otp", EmailOTPResource),
28
30
  ("/auth/recovery-codes", RecoveryCodesResource),
29
31
  ("/auth/fido", FIDOResource),
32
+ ("/auth/saml/sso", SAMLSSOResource),
33
+ ("/auth/saml/login", SAMLLoginResource),
30
34
  ]
31
35
 
32
36
  blueprint = Blueprint("auth", "auth")
@@ -1,6 +1,6 @@
1
1
  import urllib.parse
2
2
 
3
- from flask import request, jsonify, current_app
3
+ from flask import request, jsonify, current_app, redirect, make_response
4
4
  from flask_restful import Resource
5
5
  from flask_principal import (
6
6
  Identity,
@@ -19,6 +19,7 @@ from flask_jwt_extended import (
19
19
 
20
20
  from sqlalchemy.exc import OperationalError, TimeoutError
21
21
  from babel.dates import format_datetime
22
+ from saml2 import entity
22
23
 
23
24
  from zou.app import app, config
24
25
  from zou.app.mixin import ArgsMixin
@@ -1331,3 +1332,108 @@ class RecoveryCodesResource(Resource, ArgsMixin):
1331
1332
  },
1332
1333
  400,
1333
1334
  )
1335
+
1336
+
1337
+ class SAMLSSOResource(Resource, ArgsMixin):
1338
+ """
1339
+ Resource to allow a user to login with SAML SSO.
1340
+ """
1341
+
1342
+ def post(self):
1343
+ """
1344
+ Resource to allow a user to login with SAML SSO.
1345
+ ---
1346
+ description: ""
1347
+ tags:
1348
+ - Authentication
1349
+ responses:
1350
+ 302:
1351
+ description: Login successful, redirect to the home page.
1352
+ 400:
1353
+ description: Wrong parameter
1354
+ """
1355
+ if not config.SAML_ENABLED:
1356
+ return {"error": "SAML is not enabled."}, 400
1357
+ authn_response = current_app.extensions[
1358
+ "saml_client"
1359
+ ].parse_authn_request_response(
1360
+ request.form["SAMLResponse"], entity.BINDING_HTTP_POST
1361
+ )
1362
+ authn_response.get_identity()
1363
+ email = authn_response.get_subject().text
1364
+ person_info = {
1365
+ k: v if not isinstance(v, list) else " ".join(v)
1366
+ for k, v in authn_response.ava.items()
1367
+ }
1368
+ try:
1369
+ user = persons_service.get_person_by_email(email)
1370
+ for k, v in person_info.items():
1371
+ if user.get(k) != v:
1372
+ persons_service.update_person(user["id"], person_info)
1373
+ break
1374
+ except PersonNotFoundException:
1375
+ user = persons_service.create_person(
1376
+ email, "default".encode("utf-8"), **person_info
1377
+ )
1378
+
1379
+ access_token = create_access_token(
1380
+ identity=user["id"],
1381
+ additional_claims={
1382
+ "identity_type": "person",
1383
+ },
1384
+ )
1385
+ refresh_token = create_refresh_token(
1386
+ identity=user["id"],
1387
+ additional_claims={
1388
+ "identity_type": "person",
1389
+ },
1390
+ )
1391
+ identity_changed.send(
1392
+ current_app._get_current_object(),
1393
+ identity=Identity(user["id"], "person"),
1394
+ )
1395
+
1396
+ ip_address = request.environ.get("HTTP_X_REAL_IP", request.remote_addr)
1397
+
1398
+ response = make_response(
1399
+ redirect(f"{config.DOMAIN_PROTOCOL}://{config.DOMAIN_NAME}")
1400
+ )
1401
+ set_access_cookies(response, access_token)
1402
+ set_refresh_cookies(response, refresh_token)
1403
+ events_service.create_login_log(user["id"], ip_address, "web")
1404
+
1405
+ return response
1406
+
1407
+
1408
+ class SAMLLoginResource(Resource, ArgsMixin):
1409
+ """
1410
+ Resource to allow a user to login with SAML SSO.
1411
+ """
1412
+
1413
+ def get(self):
1414
+ """
1415
+ Resource to allow a user to login with SAML SSO.
1416
+ ---
1417
+ description: ""
1418
+ tags:
1419
+ - Authentication
1420
+ responses:
1421
+ 302:
1422
+ description: Redirect to the SAML IDP.
1423
+ 400:
1424
+ description: Wrong parameter.
1425
+ """
1426
+ if not config.SAML_ENABLED:
1427
+ return {"error": "SAML is not enabled."}, 400
1428
+ _, info = current_app.extensions[
1429
+ "saml_client"
1430
+ ].prepare_for_authenticate()
1431
+
1432
+ redirect_url = None
1433
+
1434
+ # Select the IdP URL to send the AuthN request to
1435
+ for key, value in info["headers"]:
1436
+ if key == "Location":
1437
+ redirect_url = value
1438
+
1439
+ return redirect(redirect_url, code=302)
@@ -10,8 +10,11 @@ from zou.app.models.entity import (
10
10
  EntityVersion,
11
11
  EntityLink,
12
12
  EntityConceptLink,
13
+ ENTITY_STATUSES,
13
14
  )
15
+ from zou.app.models.project import Project
14
16
  from zou.app.models.subscription import Subscription
17
+ from zou.app.models.task import Task
15
18
  from zou.app.services import (
16
19
  assets_service,
17
20
  breakdown_service,
@@ -23,7 +26,9 @@ from zou.app.services import (
23
26
  user_service,
24
27
  concepts_service,
25
28
  )
26
- from zou.app.utils import events, date_helpers
29
+ from zou.app.utils import date_helpers, events, permissions
30
+
31
+ from zou.app.services.exception import ArgumentsException
27
32
 
28
33
  from werkzeug.exceptions import NotFound
29
34
 
@@ -56,11 +61,36 @@ class EntitiesResource(BaseModelsResource, EntityEventMixin):
56
61
  def emit_create_event(self, entity_dict):
57
62
  self.emit_event("new", entity_dict)
58
63
 
64
+ def check_read_permissions(self):
65
+ return True
66
+
67
+ def add_project_permission_filter(self, query):
68
+ if not permissions.has_admin_permissions():
69
+ query = query.join(Project).filter(
70
+ user_service.build_related_projects_filter()
71
+ )
72
+ if permissions.has_vendor_permissions():
73
+ query = query.join(Task).filter(
74
+ user_service.build_assignee_filter()
75
+ )
76
+
77
+ return query
78
+
59
79
  def update_data(self, data):
60
80
  data = super().update_data(data)
61
81
  data["created_by"] = persons_service.get_current_user()["id"]
62
82
  return data
63
83
 
84
+ def check_creation_integrity(self, data):
85
+ """
86
+ Check if entity has a valid status.
87
+ """
88
+ if "status" in data:
89
+ types = [entity_status for entity_status, _ in ENTITY_STATUSES]
90
+ if data["status"] not in types:
91
+ raise ArgumentsException("Invalid status")
92
+ return True
93
+
64
94
  def all_entries(self, query=None, relations=False):
65
95
  entities = BaseModelsResource.all_entries(
66
96
  self, query=query, relations=relations
@@ -216,3 +246,14 @@ class EntityResource(BaseModelResource, EntityEventMixin):
216
246
  index_service.remove_asset_index(entity_dict["id"])
217
247
  elif shots_service.is_shot(entity_dict):
218
248
  index_service.remove_shot_index(entity_dict["id"])
249
+
250
+ def update_data(self, data, instance_id):
251
+ """
252
+ Check if the entity has a valid status.
253
+ """
254
+ data = super().update_data(data, instance_id)
255
+ if "status" in data:
256
+ types = [entity_status for entity_status, _ in ENTITY_STATUSES]
257
+ if data["status"] not in types:
258
+ raise ArgumentsException("Invalid status")
259
+ return data
@@ -1,8 +1,11 @@
1
1
  from flask import request, current_app
2
2
  from flask_jwt_extended import jwt_required
3
3
 
4
+ from sqlalchemy.orm import aliased
4
5
  from sqlalchemy.exc import IntegrityError
6
+
5
7
  from zou.app.mixin import ArgsMixin
8
+ from zou.app.models.entity import Entity
6
9
  from zou.app.models.person import Person
7
10
  from zou.app.models.project import Project
8
11
  from zou.app.models.task import Task
@@ -21,7 +24,7 @@ from zou.app.services.exception import WrongTaskTypeForEntityException
21
24
  from zou.app.blueprints.crud.base import BaseModelsResource, BaseModelResource
22
25
 
23
26
 
24
- class TasksResource(BaseModelsResource):
27
+ class TasksResource(BaseModelsResource, ArgsMixin):
25
28
  def __init__(self):
26
29
  BaseModelsResource.__init__(self, Task)
27
30
 
@@ -37,6 +40,43 @@ class TasksResource(BaseModelsResource):
37
40
  )
38
41
  return query
39
42
 
43
+ def build_filters(self, options):
44
+ (
45
+ many_join_filter,
46
+ in_filter,
47
+ name_filter,
48
+ criterions,
49
+ ) = super().build_filters(options)
50
+ if "project_id" in criterions:
51
+ del criterions["project_id"]
52
+ if "episode_id" in criterions:
53
+ del criterions["episode_id"]
54
+ return (
55
+ many_join_filter,
56
+ in_filter,
57
+ name_filter,
58
+ criterions,
59
+ )
60
+
61
+ def apply_filters(self, query, options):
62
+ query = super().apply_filters(query, options)
63
+
64
+ project_id = options.get("project_id", None)
65
+ episode_id = options.get("episode_id", None)
66
+ if episode_id is not None:
67
+ Sequence = aliased(Entity)
68
+ query = (
69
+ query.join(Entity, Task.entity_id == Entity.id)
70
+ .join(Sequence, Entity.parent_id == Sequence.id)
71
+ .filter(Sequence.parent_id == episode_id)
72
+ )
73
+ elif project_id is not None:
74
+ query = query.join(Entity, Task.entity_id == Entity.id).filter(
75
+ Entity.project_id == project_id
76
+ )
77
+
78
+ return query
79
+
40
80
  def post(self):
41
81
  """
42
82
  Create a task with data given in the request body. JSON format is
@@ -25,7 +25,7 @@ class IndexResource(Resource):
25
25
  200:
26
26
  description: API name and version
27
27
  """
28
- return {"api": app.config["APP_NAME"], "version": __version__}
28
+ return {"api": config.APP_NAME, "version": __version__}
29
29
 
30
30
 
31
31
  class BaseStatusResource(Resource):
@@ -86,10 +86,8 @@ class BaseStatusResource(Resource):
86
86
 
87
87
  version = __version__
88
88
 
89
- api_name = app.config["APP_NAME"]
90
-
91
89
  return (
92
- api_name,
90
+ config.APP_NAME,
93
91
  version,
94
92
  is_db_up,
95
93
  is_kv_up,
@@ -281,20 +279,22 @@ class ConfigResource(Resource):
281
279
  200:
282
280
  description: Crisp token
283
281
  """
284
- config = {
285
- "is_self_hosted": app.config["IS_SELF_HOSTED"],
286
- "crisp_token": app.config["CRISP_TOKEN"],
282
+ conf = {
283
+ "is_self_hosted": config.IS_SELF_HOSTED,
284
+ "crisp_token": config.CRISP_TOKEN,
287
285
  "indexer_configured": (
288
- len(app.config["INDEXER"]["key"]) > 0
289
- and app.config["INDEXER"]["key"] != "masterkey"
286
+ len(config.INDEXER["key"]) > 0
287
+ and config.INDEXER["key"] != "masterkey"
290
288
  ),
289
+ "saml_enabled": config.SAML_ENABLED,
290
+ "saml_idp_name": config.SAML_IDP_NAME,
291
291
  }
292
- if app.config["SENTRY_KITSU_ENABLED"]:
293
- config["sentry"] = {
294
- "dsn": app.config["SENTRY_KITSU_DSN"],
295
- "sampleRate": app.config["SENTRY_KITSU_SR"],
292
+ if config.SENTRY_KITSU_ENABLED:
293
+ conf["sentry"] = {
294
+ "dsn": config.SENTRY_KITSU_DSN,
295
+ "sampleRate": config.SENTRY_KITSU_SR,
296
296
  }
297
- return config
297
+ return conf
298
298
 
299
299
 
300
300
  class TestEventsResource(Resource):
@@ -76,6 +76,7 @@ ALLOWED_FILE_EXTENSION = [
76
76
  "sbbkp",
77
77
  "svg",
78
78
  "swf",
79
+ "tvpp",
79
80
  "wav",
80
81
  "zip",
81
82
  ]
@@ -18,7 +18,10 @@ from zou.app.services import (
18
18
 
19
19
  from zou.app.mixin import ArgsMixin
20
20
  from zou.app.utils import fields, query, permissions
21
- from zou.app.services.exception import WrongParameterException
21
+ from zou.app.services.exception import (
22
+ WrongParameterException,
23
+ ArgumentsException,
24
+ )
22
25
 
23
26
 
24
27
  class ShotResource(Resource, ArgsMixin):
@@ -48,6 +51,52 @@ class ShotResource(Resource, ArgsMixin):
48
51
  user_service.check_entity_access(shot["id"])
49
52
  return shot
50
53
 
54
+ @jwt_required()
55
+ def put(self, shot_id):
56
+ """
57
+ Update given shot.
58
+ ---
59
+ tags:
60
+ - Shots
61
+ parameters:
62
+ - in: path
63
+ name: shot_id
64
+ required: True
65
+ type: string
66
+ format: UUID
67
+ x-example: a24a6ea4-ce75-4665-a070-57453082c25
68
+ - in: body
69
+ name: data
70
+ required: True
71
+ type: object
72
+ responses:
73
+ 200:
74
+ description: Update given shot
75
+ """
76
+ shot = shots_service.get_shot(shot_id)
77
+ user_service.check_manager_project_access(shot["project_id"])
78
+ data = request.json
79
+ if data is None:
80
+ raise ArgumentsException(
81
+ "Data are empty. Please verify that you sent JSON data and"
82
+ " that you set the right headers."
83
+ )
84
+ for field in [
85
+ "id",
86
+ "created_at",
87
+ "updated_at",
88
+ "instance_casting",
89
+ "project_id",
90
+ "entities_in",
91
+ "entities_out",
92
+ "type",
93
+ "shotgun_id",
94
+ "created_by",
95
+ ]:
96
+ data.pop(field, None)
97
+
98
+ return shots_service.update_shot(shot_id, data)
99
+
51
100
  @jwt_required()
52
101
  def delete(self, shot_id):
53
102
  """
@@ -1463,7 +1463,6 @@ class ProjectTasksResource(Resource, ArgsMixin):
1463
1463
  """
1464
1464
 
1465
1465
  @jwt_required()
1466
- @permissions.require_admin
1467
1466
  def get(self, project_id):
1468
1467
  """
1469
1468
  Retrieve all tasks related to given project.
@@ -1478,13 +1477,34 @@ class ProjectTasksResource(Resource, ArgsMixin):
1478
1477
  type: string
1479
1478
  format: UUID
1480
1479
  x-example: a24a6ea4-ce75-4665-a070-57453082c25
1480
+ - in: query
1481
+ name: page
1482
+ required: False
1483
+ type: integer
1484
+ x-example: 1
1485
+ - in: query
1486
+ name: task_type_id
1487
+ required: False
1488
+ type: string
1489
+ format: UUID
1490
+ x-example: a24a6ea4-ce75-4665-a070-57453082c25
1491
+ - in: query
1492
+ name: episode_id
1493
+ required: False
1494
+ type: string
1495
+ format: UUID
1496
+ x-example: a24a6ea4-ce75-4665-a070-57453082c25
1481
1497
  responses:
1482
1498
  200:
1483
1499
  description: All tasks related to given project
1484
1500
  """
1485
1501
  projects_service.get_project(project_id)
1486
1502
  page = self.get_page()
1487
- return tasks_service.get_tasks_for_project(project_id, page)
1503
+ task_type_id = self.get_task_type_id()
1504
+ episode_id = self.get_episode_id()
1505
+ return tasks_service.get_tasks_for_project(
1506
+ project_id, page, task_type_id=task_type_id, episode_id=episode_id
1507
+ )
1488
1508
 
1489
1509
 
1490
1510
  class ProjectCommentsResource(Resource, ArgsMixin):
@@ -132,6 +132,10 @@ LDAP_IS_AD = envtobool("LDAP_IS_AD", False)
132
132
  LDAP_IS_AD_SIMPLE = envtobool("LDAP_IS_AD_SIMPLE", False)
133
133
  LDAP_SSL = envtobool("LDAP_SSL", False)
134
134
 
135
+ SAML_ENABLED = envtobool("SAML_ENABLED", False)
136
+ SAML_IDP_NAME = os.getenv("SAML_IDP_NAME", "")
137
+ SAML_METADATA_URL = os.getenv("SAML_METADATA_URL", "")
138
+
135
139
  LOGS_MODE = os.getenv("LOGS_MODE", "default")
136
140
  LOGS_HOST = os.getenv("LOGS_HOST", "localhost")
137
141
  LOGS_PORT = os.getenv("LOGS_PORT", 2202)