zou 0.19.56__tar.gz → 0.19.58__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 (428) hide show
  1. {zou-0.19.56/zou.egg-info → zou-0.19.58}/PKG-INFO +11 -11
  2. {zou-0.19.56 → zou-0.19.58}/setup.cfg +10 -10
  3. zou-0.19.58/zou/__init__.py +1 -0
  4. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/assets/resources.py +3 -3
  5. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/chats/resources.py +3 -1
  6. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/crud/day_off.py +6 -2
  7. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/crud/entity_type.py +3 -6
  8. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/crud/project.py +6 -2
  9. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/crud/schedule_item.py +3 -1
  10. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/export/csv/playlists.py +1 -1
  11. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/export/csv/time_spents.py +1 -1
  12. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/news/resources.py +9 -4
  13. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/previews/resources.py +3 -0
  14. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/source/otio.py +3 -3
  15. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/tasks/resources.py +6 -2
  16. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/user/__init__.py +5 -0
  17. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/user/resources.py +54 -10
  18. {zou-0.19.56 → zou-0.19.58}/zou/app/models/organisation.py +5 -0
  19. {zou-0.19.56 → zou-0.19.58}/zou/app/models/project.py +3 -0
  20. {zou-0.19.56 → zou-0.19.58}/zou/app/models/subscription.py +2 -2
  21. {zou-0.19.56 → zou-0.19.58}/zou/app/models/task.py +4 -0
  22. {zou-0.19.56 → zou-0.19.58}/zou/app/services/assets_service.py +7 -4
  23. {zou-0.19.56 → zou-0.19.58}/zou/app/services/chats_service.py +1 -1
  24. {zou-0.19.56 → zou-0.19.58}/zou/app/services/emails_service.py +1 -1
  25. {zou-0.19.56 → zou-0.19.58}/zou/app/services/entities_service.py +3 -0
  26. {zou-0.19.56 → zou-0.19.58}/zou/app/services/names_service.py +2 -2
  27. {zou-0.19.56 → zou-0.19.58}/zou/app/services/news_service.py +1 -1
  28. {zou-0.19.56 → zou-0.19.58}/zou/app/services/preview_files_service.py +1 -1
  29. {zou-0.19.56 → zou-0.19.58}/zou/app/services/shots_service.py +6 -3
  30. {zou-0.19.56 → zou-0.19.58}/zou/app/services/user_service.py +55 -9
  31. zou-0.19.58/zou/migrations/versions/8e67c183bed7_add_preference_fields.py +71 -0
  32. {zou-0.19.56 → zou-0.19.58/zou.egg-info}/PKG-INFO +11 -11
  33. {zou-0.19.56 → zou-0.19.58}/zou.egg-info/SOURCES.txt +1 -0
  34. {zou-0.19.56 → zou-0.19.58}/zou.egg-info/requires.txt +10 -12
  35. zou-0.19.56/zou/__init__.py +0 -1
  36. {zou-0.19.56 → zou-0.19.58}/LICENSE +0 -0
  37. {zou-0.19.56 → zou-0.19.58}/README.rst +0 -0
  38. {zou-0.19.56 → zou-0.19.58}/pyproject.toml +0 -0
  39. {zou-0.19.56 → zou-0.19.58}/setup.py +0 -0
  40. {zou-0.19.56 → zou-0.19.58}/zou/app/__init__.py +0 -0
  41. {zou-0.19.56 → zou-0.19.58}/zou/app/api.py +0 -0
  42. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/__init__.py +0 -0
  43. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/assets/__init__.py +0 -0
  44. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/auth/__init__.py +0 -0
  45. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/auth/resources.py +0 -0
  46. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/breakdown/__init__.py +0 -0
  47. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/breakdown/resources.py +0 -0
  48. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/chats/__init__.py +0 -0
  49. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/comments/__init__.py +0 -0
  50. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/comments/resources.py +0 -0
  51. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/concepts/__init__.py +0 -0
  52. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/concepts/resources.py +0 -0
  53. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/crud/__init__.py +0 -0
  54. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/crud/asset_instance.py +0 -0
  55. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/crud/attachment_file.py +0 -0
  56. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/crud/base.py +0 -0
  57. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/crud/chat.py +0 -0
  58. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/crud/chat_message.py +0 -0
  59. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/crud/comments.py +0 -0
  60. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/crud/custom_action.py +0 -0
  61. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/crud/department.py +0 -0
  62. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/crud/entity.py +0 -0
  63. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/crud/entity_link.py +0 -0
  64. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/crud/event.py +0 -0
  65. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/crud/file_status.py +0 -0
  66. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/crud/metadata_descriptor.py +0 -0
  67. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/crud/milestone.py +0 -0
  68. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/crud/news.py +0 -0
  69. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/crud/notification.py +0 -0
  70. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/crud/organisation.py +0 -0
  71. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/crud/output_file.py +0 -0
  72. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/crud/output_type.py +0 -0
  73. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/crud/person.py +0 -0
  74. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/crud/playlist.py +0 -0
  75. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/crud/preview_background_file.py +0 -0
  76. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/crud/preview_file.py +0 -0
  77. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/crud/project_status.py +0 -0
  78. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/crud/search_filter.py +0 -0
  79. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/crud/search_filter_group.py +0 -0
  80. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/crud/software.py +0 -0
  81. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/crud/status_automation.py +0 -0
  82. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/crud/studio.py +0 -0
  83. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/crud/subscription.py +0 -0
  84. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/crud/task.py +0 -0
  85. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/crud/task_status.py +0 -0
  86. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/crud/task_type.py +0 -0
  87. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/crud/time_spent.py +0 -0
  88. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/crud/working_file.py +0 -0
  89. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/edits/__init__.py +0 -0
  90. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/edits/resources.py +0 -0
  91. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/entities/__init__.py +0 -0
  92. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/entities/resources.py +0 -0
  93. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/events/__init__.py +0 -0
  94. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/events/resources.py +0 -0
  95. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/export/__init__.py +0 -0
  96. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/export/csv/__init__.py +0 -0
  97. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/export/csv/assets.py +0 -0
  98. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/export/csv/base.py +0 -0
  99. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/export/csv/casting.py +0 -0
  100. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/export/csv/edits.py +0 -0
  101. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/export/csv/persons.py +0 -0
  102. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/export/csv/projects.py +0 -0
  103. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/export/csv/shots.py +0 -0
  104. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/export/csv/task_types.py +0 -0
  105. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/export/csv/tasks.py +0 -0
  106. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/files/__init__.py +0 -0
  107. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/files/resources.py +0 -0
  108. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/index/__init__.py +0 -0
  109. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/index/resources.py +0 -0
  110. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/news/__init__.py +0 -0
  111. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/persons/__init__.py +0 -0
  112. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/persons/resources.py +0 -0
  113. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/playlists/__init__.py +0 -0
  114. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/playlists/resources.py +0 -0
  115. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/previews/__init__.py +0 -0
  116. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/projects/__init__.py +0 -0
  117. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/projects/resources.py +0 -0
  118. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/search/__init__.py +0 -0
  119. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/search/resources.py +0 -0
  120. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/shots/__init__.py +0 -0
  121. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/shots/resources.py +0 -0
  122. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/source/__init__.py +0 -0
  123. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/source/csv/__init__.py +0 -0
  124. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/source/csv/assets.py +0 -0
  125. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/source/csv/base.py +0 -0
  126. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/source/csv/casting.py +0 -0
  127. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/source/csv/edits.py +0 -0
  128. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/source/csv/persons.py +0 -0
  129. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/source/csv/shots.py +0 -0
  130. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/source/csv/task_type_estimations.py +0 -0
  131. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/source/kitsu.py +0 -0
  132. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/source/shotgun/__init__.py +0 -0
  133. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/source/shotgun/assets.py +0 -0
  134. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/source/shotgun/base.py +0 -0
  135. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/source/shotgun/episode.py +0 -0
  136. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/source/shotgun/exception.py +0 -0
  137. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/source/shotgun/import_errors.py +0 -0
  138. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/source/shotgun/notes.py +0 -0
  139. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/source/shotgun/person.py +0 -0
  140. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/source/shotgun/project.py +0 -0
  141. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/source/shotgun/scene.py +0 -0
  142. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/source/shotgun/sequence.py +0 -0
  143. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/source/shotgun/shot.py +0 -0
  144. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/source/shotgun/status.py +0 -0
  145. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/source/shotgun/steps.py +0 -0
  146. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/source/shotgun/tasks.py +0 -0
  147. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/source/shotgun/team.py +0 -0
  148. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/source/shotgun/versions.py +0 -0
  149. {zou-0.19.56 → zou-0.19.58}/zou/app/blueprints/tasks/__init__.py +0 -0
  150. {zou-0.19.56 → zou-0.19.58}/zou/app/config.py +0 -0
  151. {zou-0.19.56 → zou-0.19.58}/zou/app/file_trees/default.json +0 -0
  152. {zou-0.19.56 → zou-0.19.58}/zou/app/file_trees/simple.json +0 -0
  153. {zou-0.19.56 → zou-0.19.58}/zou/app/indexer/__init__.py +0 -0
  154. {zou-0.19.56 → zou-0.19.58}/zou/app/indexer/indexing.py +0 -0
  155. {zou-0.19.56 → zou-0.19.58}/zou/app/mixin.py +0 -0
  156. {zou-0.19.56 → zou-0.19.58}/zou/app/models/__init__.py +0 -0
  157. {zou-0.19.56 → zou-0.19.58}/zou/app/models/asset_instance.py +0 -0
  158. {zou-0.19.56 → zou-0.19.58}/zou/app/models/attachment_file.py +0 -0
  159. {zou-0.19.56 → zou-0.19.58}/zou/app/models/base.py +0 -0
  160. {zou-0.19.56 → zou-0.19.58}/zou/app/models/build_job.py +0 -0
  161. {zou-0.19.56 → zou-0.19.58}/zou/app/models/chat.py +0 -0
  162. {zou-0.19.56 → zou-0.19.58}/zou/app/models/chat_message.py +0 -0
  163. {zou-0.19.56 → zou-0.19.58}/zou/app/models/comment.py +0 -0
  164. {zou-0.19.56 → zou-0.19.58}/zou/app/models/custom_action.py +0 -0
  165. {zou-0.19.56 → zou-0.19.58}/zou/app/models/data_import_error.py +0 -0
  166. {zou-0.19.56 → zou-0.19.58}/zou/app/models/day_off.py +0 -0
  167. {zou-0.19.56 → zou-0.19.58}/zou/app/models/department.py +0 -0
  168. {zou-0.19.56 → zou-0.19.58}/zou/app/models/desktop_login_log.py +0 -0
  169. {zou-0.19.56 → zou-0.19.58}/zou/app/models/entity.py +0 -0
  170. {zou-0.19.56 → zou-0.19.58}/zou/app/models/entity_type.py +0 -0
  171. {zou-0.19.56 → zou-0.19.58}/zou/app/models/event.py +0 -0
  172. {zou-0.19.56 → zou-0.19.58}/zou/app/models/file_status.py +0 -0
  173. {zou-0.19.56 → zou-0.19.58}/zou/app/models/login_log.py +0 -0
  174. {zou-0.19.56 → zou-0.19.58}/zou/app/models/metadata_descriptor.py +0 -0
  175. {zou-0.19.56 → zou-0.19.58}/zou/app/models/milestone.py +0 -0
  176. {zou-0.19.56 → zou-0.19.58}/zou/app/models/news.py +0 -0
  177. {zou-0.19.56 → zou-0.19.58}/zou/app/models/notification.py +0 -0
  178. {zou-0.19.56 → zou-0.19.58}/zou/app/models/output_file.py +0 -0
  179. {zou-0.19.56 → zou-0.19.58}/zou/app/models/output_type.py +0 -0
  180. {zou-0.19.56 → zou-0.19.58}/zou/app/models/person.py +0 -0
  181. {zou-0.19.56 → zou-0.19.58}/zou/app/models/playlist.py +0 -0
  182. {zou-0.19.56 → zou-0.19.58}/zou/app/models/preview_background_file.py +0 -0
  183. {zou-0.19.56 → zou-0.19.58}/zou/app/models/preview_file.py +0 -0
  184. {zou-0.19.56 → zou-0.19.58}/zou/app/models/project_status.py +0 -0
  185. {zou-0.19.56 → zou-0.19.58}/zou/app/models/schedule_item.py +0 -0
  186. {zou-0.19.56 → zou-0.19.58}/zou/app/models/search_filter.py +0 -0
  187. {zou-0.19.56 → zou-0.19.58}/zou/app/models/search_filter_group.py +0 -0
  188. {zou-0.19.56 → zou-0.19.58}/zou/app/models/serializer.py +0 -0
  189. {zou-0.19.56 → zou-0.19.58}/zou/app/models/software.py +0 -0
  190. {zou-0.19.56 → zou-0.19.58}/zou/app/models/status_automation.py +0 -0
  191. {zou-0.19.56 → zou-0.19.58}/zou/app/models/studio.py +0 -0
  192. {zou-0.19.56 → zou-0.19.58}/zou/app/models/task_status.py +0 -0
  193. {zou-0.19.56 → zou-0.19.58}/zou/app/models/task_type.py +0 -0
  194. {zou-0.19.56 → zou-0.19.58}/zou/app/models/time_spent.py +0 -0
  195. {zou-0.19.56 → zou-0.19.58}/zou/app/models/working_file.py +0 -0
  196. {zou-0.19.56 → zou-0.19.58}/zou/app/services/__init__.py +0 -0
  197. {zou-0.19.56 → zou-0.19.58}/zou/app/services/auth_service.py +0 -0
  198. {zou-0.19.56 → zou-0.19.58}/zou/app/services/backup_service.py +0 -0
  199. {zou-0.19.56 → zou-0.19.58}/zou/app/services/base_service.py +0 -0
  200. {zou-0.19.56 → zou-0.19.58}/zou/app/services/breakdown_service.py +0 -0
  201. {zou-0.19.56 → zou-0.19.58}/zou/app/services/comments_service.py +0 -0
  202. {zou-0.19.56 → zou-0.19.58}/zou/app/services/concepts_service.py +0 -0
  203. {zou-0.19.56 → zou-0.19.58}/zou/app/services/custom_actions_service.py +0 -0
  204. {zou-0.19.56 → zou-0.19.58}/zou/app/services/deletion_service.py +0 -0
  205. {zou-0.19.56 → zou-0.19.58}/zou/app/services/edits_service.py +0 -0
  206. {zou-0.19.56 → zou-0.19.58}/zou/app/services/events_service.py +0 -0
  207. {zou-0.19.56 → zou-0.19.58}/zou/app/services/exception.py +0 -0
  208. {zou-0.19.56 → zou-0.19.58}/zou/app/services/file_tree_service.py +0 -0
  209. {zou-0.19.56 → zou-0.19.58}/zou/app/services/files_service.py +0 -0
  210. {zou-0.19.56 → zou-0.19.58}/zou/app/services/index_service.py +0 -0
  211. {zou-0.19.56 → zou-0.19.58}/zou/app/services/notifications_service.py +0 -0
  212. {zou-0.19.56 → zou-0.19.58}/zou/app/services/persons_service.py +0 -0
  213. {zou-0.19.56 → zou-0.19.58}/zou/app/services/playlists_service.py +0 -0
  214. {zou-0.19.56 → zou-0.19.58}/zou/app/services/projects_service.py +0 -0
  215. {zou-0.19.56 → zou-0.19.58}/zou/app/services/scenes_service.py +0 -0
  216. {zou-0.19.56 → zou-0.19.58}/zou/app/services/schedule_service.py +0 -0
  217. {zou-0.19.56 → zou-0.19.58}/zou/app/services/stats_service.py +0 -0
  218. {zou-0.19.56 → zou-0.19.58}/zou/app/services/status_automations_service.py +0 -0
  219. {zou-0.19.56 → zou-0.19.58}/zou/app/services/sync_service.py +0 -0
  220. {zou-0.19.56 → zou-0.19.58}/zou/app/services/tasks_service.py +0 -0
  221. {zou-0.19.56 → zou-0.19.58}/zou/app/services/telemetry_services.py +0 -0
  222. {zou-0.19.56 → zou-0.19.58}/zou/app/services/time_spents_service.py +0 -0
  223. {zou-0.19.56 → zou-0.19.58}/zou/app/stores/__init__.py +0 -0
  224. {zou-0.19.56 → zou-0.19.58}/zou/app/stores/auth_tokens_store.py +0 -0
  225. {zou-0.19.56 → zou-0.19.58}/zou/app/stores/file_store.py +0 -0
  226. {zou-0.19.56 → zou-0.19.58}/zou/app/stores/publisher_store.py +0 -0
  227. {zou-0.19.56 → zou-0.19.58}/zou/app/stores/queue_store.py +0 -0
  228. {zou-0.19.56 → zou-0.19.58}/zou/app/swagger.py +0 -0
  229. {zou-0.19.56 → zou-0.19.58}/zou/app/utils/__init__.py +0 -0
  230. {zou-0.19.56 → zou-0.19.58}/zou/app/utils/api.py +0 -0
  231. {zou-0.19.56 → zou-0.19.58}/zou/app/utils/auth.py +0 -0
  232. {zou-0.19.56 → zou-0.19.58}/zou/app/utils/cache.py +0 -0
  233. {zou-0.19.56 → zou-0.19.58}/zou/app/utils/chats.py +0 -0
  234. {zou-0.19.56 → zou-0.19.58}/zou/app/utils/colors.py +0 -0
  235. {zou-0.19.56 → zou-0.19.58}/zou/app/utils/commands.py +0 -0
  236. {zou-0.19.56 → zou-0.19.58}/zou/app/utils/csv_utils.py +0 -0
  237. {zou-0.19.56 → zou-0.19.58}/zou/app/utils/date_helpers.py +0 -0
  238. {zou-0.19.56 → zou-0.19.58}/zou/app/utils/dbhelpers.py +0 -0
  239. {zou-0.19.56 → zou-0.19.58}/zou/app/utils/emails.py +0 -0
  240. {zou-0.19.56 → zou-0.19.58}/zou/app/utils/env.py +0 -0
  241. {zou-0.19.56 → zou-0.19.58}/zou/app/utils/events.py +0 -0
  242. {zou-0.19.56 → zou-0.19.58}/zou/app/utils/fido.py +0 -0
  243. {zou-0.19.56 → zou-0.19.58}/zou/app/utils/fields.py +0 -0
  244. {zou-0.19.56 → zou-0.19.58}/zou/app/utils/flask.py +0 -0
  245. {zou-0.19.56 → zou-0.19.58}/zou/app/utils/fs.py +0 -0
  246. {zou-0.19.56 → zou-0.19.58}/zou/app/utils/git.py +0 -0
  247. {zou-0.19.56 → zou-0.19.58}/zou/app/utils/logs.py +0 -0
  248. {zou-0.19.56 → zou-0.19.58}/zou/app/utils/monitoring.py +0 -0
  249. {zou-0.19.56 → zou-0.19.58}/zou/app/utils/permissions.py +0 -0
  250. {zou-0.19.56 → zou-0.19.58}/zou/app/utils/query.py +0 -0
  251. {zou-0.19.56 → zou-0.19.58}/zou/app/utils/remote_job.py +0 -0
  252. {zou-0.19.56 → zou-0.19.58}/zou/app/utils/saml.py +0 -0
  253. {zou-0.19.56 → zou-0.19.58}/zou/app/utils/shell.py +0 -0
  254. {zou-0.19.56 → zou-0.19.58}/zou/app/utils/string.py +0 -0
  255. {zou-0.19.56 → zou-0.19.58}/zou/app/utils/thumbnail.py +0 -0
  256. {zou-0.19.56 → zou-0.19.58}/zou/cli.py +0 -0
  257. {zou-0.19.56 → zou-0.19.58}/zou/debug.py +0 -0
  258. {zou-0.19.56 → zou-0.19.58}/zou/event_stream.py +0 -0
  259. {zou-0.19.56 → zou-0.19.58}/zou/job_settings.py +0 -0
  260. {zou-0.19.56 → zou-0.19.58}/zou/migrations/README +0 -0
  261. {zou-0.19.56 → zou-0.19.58}/zou/migrations/__init__.py +0 -0
  262. {zou-0.19.56 → zou-0.19.58}/zou/migrations/alembic.ini +0 -0
  263. {zou-0.19.56 → zou-0.19.58}/zou/migrations/env.py +0 -0
  264. {zou-0.19.56 → zou-0.19.58}/zou/migrations/script.py.mako +0 -0
  265. {zou-0.19.56 → zou-0.19.58}/zou/migrations/utils/__init__.py +0 -0
  266. {zou-0.19.56 → zou-0.19.58}/zou/migrations/utils/base.py +0 -0
  267. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/003be8a91001_add_start_and_end_dates_to_projects.py +0 -0
  268. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/0596674df51d_add_department_mentions_to_comments.py +0 -0
  269. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/05ac7e8caa21_remove_unique_constraint_for_taskstatus_.py +0 -0
  270. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/05b7dc79a416_add_archived_fields_to_main_tables.py +0 -0
  271. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/0cf5e0e035fa_drop_column_tasktype_for_shots.py +0 -0
  272. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/0ec3762a745d_add_attachment_table.py +0 -0
  273. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/0ef6416a507b_.py +0 -0
  274. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/10cf267d95c9_fix_schedule_item.py +0 -0
  275. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/16328eae4b5f_add_new_constraint_for_timespent.py +0 -0
  276. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/16df47d76c64_add_some_indexes.py +0 -0
  277. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/17ef8f7be758_disallow_null_choicetype.py +0 -0
  278. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/1bb55759146f_add_table_studio.py +0 -0
  279. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/1cb44194db49_add_file_size_field_to_preview_file.py +0 -0
  280. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/1e150c2cea4d_add_nb_entities_out.py +0 -0
  281. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/1e2d77a2f0c4_add_hd_by_default_column.py +0 -0
  282. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/1fab8c420678_add_attachments_to_message_chats.py +0 -0
  283. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/20dfeb36142b_add_projecttaskstatuslink_roles_for_.py +0 -0
  284. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/23122f290ca2_add_entity_chat_models.py +0 -0
  285. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/269d41bfb73f_add_entity_entity_links.py +0 -0
  286. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/29df910f04a4_create_unique_constraint_project_id_.py +0 -0
  287. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/29fe01a6c9eb_add_status_automation_field.py +0 -0
  288. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/2adc020885fa_.py +0 -0
  289. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/2baede80b111_add_entity_status_field.py +0 -0
  290. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/306266361f4f_.py +0 -0
  291. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/328fd44c6347_add_entity_created_by.py +0 -0
  292. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/32f134ff1201_add_is_shared_flag_to_filters.py +0 -0
  293. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/346250b5304c_add_position_to_preview_files.py +0 -0
  294. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/3476e147e632_add_acks_to_comments.py +0 -0
  295. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/389cfb9de776_.py +0 -0
  296. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/38baa9a23b3d_.py +0 -0
  297. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/398150912a3f_validation_status_preview.py +0 -0
  298. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/3b0d1321079e_.py +0 -0
  299. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/3d5c93bafb9d_.py +0 -0
  300. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/3e0538ddf80f_.py +0 -0
  301. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/3fee3bd10f9d_.py +0 -0
  302. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/4095103c7d01_add_is_clients_isolated_flag_to_projects.py +0 -0
  303. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/40dea9555940_.py +0 -0
  304. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/42ec83db6a01_change_person_preferred_two_factor_.py +0 -0
  305. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/43d0cf0ed5e7_.py +0 -0
  306. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/443d1e78a932_.py +0 -0
  307. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/45c2de366e66_.py +0 -0
  308. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/45dafbb3f4e1_for_person_contract_type_disallow_null.py +0 -0
  309. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/4715c2586036_add_last_preview_file_fields.py +0 -0
  310. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/4e3738cdc34c_.py +0 -0
  311. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/4f2398ebcd49_.py +0 -0
  312. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/523ee9647bee_.py +0 -0
  313. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/54ee0d1d60ba_add_build_job_model.py +0 -0
  314. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/556526e47daa_.py +0 -0
  315. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/57222395f2be_add_statusautomation_import_last_revision.py +0 -0
  316. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/5798d2c9020b_change_person_role_to_choicetype.py +0 -0
  317. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/590aa1ffe731_add_notifications_enabled_flag.py +0 -0
  318. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/59a7445a966c_add_entity_is_shared.py +0 -0
  319. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/5a291251823c_add_max_retake_parameter.py +0 -0
  320. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/5ab9d7a75887_.py +0 -0
  321. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/5b0fcbb94f24_.py +0 -0
  322. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/5b7fa3e51701_add_is_client_allowed_flag_to_task_.py +0 -0
  323. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/5b980f0dc365_add_comment_links.py +0 -0
  324. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/5b9fd9ddfe43_add_homepage_and_contract_fields.py +0 -0
  325. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/5c0498e264bc_add_slack_fields.py +0 -0
  326. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/5e2ce62632a6_add_workflow_to_project.py +0 -0
  327. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/680c64565f9d_for_searchfiltergroup_is_shared.py +0 -0
  328. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/693cc511d28d_add_taskstatus_priority.py +0 -0
  329. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/6aa446ee4072_add_is_for_all_flage_to_playlists.py +0 -0
  330. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/6bd3b102d61b_.py +0 -0
  331. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/6c597e842afa_add_task_type_field_to_playlists.py +0 -0
  332. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/6d1b2c60f58b_add_milestone_model.py +0 -0
  333. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/6d7fa5a8e9a5_add_timesheets_locked_field_to_org.py +0 -0
  334. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/6eeaff945706_add_data_field_on_entity_links.py +0 -0
  335. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/6f6049877105_.py +0 -0
  336. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/7417c8eb70d8_add_for_entity_field_to_playlists.py +0 -0
  337. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/772a5e43f05b_.py +0 -0
  338. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/7748d3d22925_add_columns_to_searchfilter_table_to_.py +0 -0
  339. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/77d6820f494f_add_reply_to_notif.py +0 -0
  340. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/7b1f765677d8_.py +0 -0
  341. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/7bc746997e8d_add_slack_token_field_to_organisation.py +0 -0
  342. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/7dc79d4ed7cd_.py +0 -0
  343. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/818f7bda2528_.py +0 -0
  344. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/82e7f7a95e84_add_project_id_to_events.py +0 -0
  345. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/82ee682204ab_add_is_generated_from_ldap_column_to_.py +0 -0
  346. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/8588f254d6b8_add_archived_fields.py +0 -0
  347. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/8739ae9fa28b_add_for_client_field.py +0 -0
  348. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/87efceb6745b_add_ready_for_to_entity.py +0 -0
  349. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/892b264937ec_.py +0 -0
  350. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/8a1b4a1b7f4a_add_totp_columns_for_person.py +0 -0
  351. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/8e4f39e321f4_add_day_off_table.py +0 -0
  352. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/8fbd40afbe5f_allow_to_set_float_values_for_.py +0 -0
  353. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/9010a64e5a2d_add_indices.py +0 -0
  354. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/9060dd4f6116_notification_uc.py +0 -0
  355. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/925771029620_.py +0 -0
  356. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/92b40d79ad3f_allow_message_attachments.py +0 -0
  357. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/92bdfe07e5f5_discord_integration.py +0 -0
  358. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/956659992419_add_columns_for_person_to_store_fido_.py +0 -0
  359. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/96c79d31e648_add_mail_otp_columns_for_person.py +0 -0
  360. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/96f58a4a2a58_person_partial_index_for_email_only_.py +0 -0
  361. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/971dbf5a0faf_add_short_name_for_asset_type_entity_.py +0 -0
  362. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/98c90621cf58_add_for_client_flag_to_playlist.py +0 -0
  363. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/99825b9cc778_.py +0 -0
  364. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/9a09467f9b2c_.py +0 -0
  365. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/9b85c14fa8a7_add_day_off_new_columns.py +0 -0
  366. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/9bd17364fc18_.py +0 -0
  367. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/9e5b3a9b0cee_add_new_column_metadatadescriptor_data_type_.py +0 -0
  368. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/9f8445f9b42c_add_man_days_fields.py +0 -0
  369. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/a23682ccc1f1_.py +0 -0
  370. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/a252a094e977_add_descriptions_for_entities_tasks_and_.py +0 -0
  371. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/a519c710877c_.py +0 -0
  372. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/a65bdadbae2f_.py +0 -0
  373. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/a66508788c53_add_nb_assets_ready.py +0 -0
  374. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/a6c25eed3ea1_add_login_failed_attemps_and_last_login_.py +0 -0
  375. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/a7c43f3fbc76_add_duration_column_to_the_preview_file.py +0 -0
  376. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/aa0a60033106_feedback_request.py +0 -0
  377. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/addbbefa7028_add_departments_link_to_metadata_.py +0 -0
  378. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/ae0127f2fc56_add_previewfile_width_and_previewfile_.py +0 -0
  379. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/af1790868e2c_.py +0 -0
  380. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/b45cb782bb9c_.py +0 -0
  381. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/b4dd0add5f79_.py +0 -0
  382. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/b8c0a0f9d054_drop_task_status_is_reviewable.py +0 -0
  383. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/b8ed0fb263f8_add_person_jti_and_jti_expiration_date.py +0 -0
  384. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/b97a71306fc8_add_is_casting_standby_column_to_entity.py +0 -0
  385. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/be56dc0fb760_for_is_shared_disallow_nullable.py +0 -0
  386. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/bf1347acdee2_.py +0 -0
  387. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/c49e41f1298b_add_previewbackground.py +0 -0
  388. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/c68c2a62cfac_add_mimetype_column_to_attachment.py +0 -0
  389. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/c726b98be194_.py +0 -0
  390. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/c81f3e83bdb5_.py +0 -0
  391. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/ca28796a2a62_add_is_done_field_to_the_task_model.py +0 -0
  392. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/cf3d365de164_add_entity_version_model.py +0 -0
  393. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/cf6cec6d6bf5_add_status_field_to_preview_file.py +0 -0
  394. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/d80267806131_task_status_new_column_is_default.py +0 -0
  395. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/d8dcd5196d57_add_casting_label.py +0 -0
  396. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/de8a3de227ef_.py +0 -0
  397. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/deeacd38d373_for_projecttaskstatuslink_set_default_.py +0 -0
  398. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/df1834485f57_.py +0 -0
  399. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/df9f8a147e80_change_file_size_to_big_integer.py +0 -0
  400. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/e1ef93f40d3d_.py +0 -0
  401. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/e29638428dfd_add_schedule_item_table.py +0 -0
  402. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/e3f6db74cc1e_.py +0 -0
  403. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/e839d6603c09_add_person_id_to_shot_history.py +0 -0
  404. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/ee2373fbe3a4_.py +0 -0
  405. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/f0567e8d0c62_.py +0 -0
  406. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/f0c6cbb61869_add_production_style_field.py +0 -0
  407. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/f344b867a911_for_description_of_entity_task_working_.py +0 -0
  408. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/f4ff5a73d283_add_person_ldap_uid.py +0 -0
  409. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/f5b113876a49_add_preferred_two_factor_authentication_.py +0 -0
  410. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/f5bdca075cdc_add_preview_download_flag_to_projects.py +0 -0
  411. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/f874ad5e898a_add_link_entity_type_task_type.py +0 -0
  412. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/f995b28fb749_.py +0 -0
  413. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/fb6b6f188497_.py +0 -0
  414. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/fb87feaaa094_add_missing_unique_constraints.py +0 -0
  415. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/fc322f908695_.py +0 -0
  416. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/fee7c696166e_.py +0 -0
  417. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/feffd3c5b806_introduce_concepts.py +0 -0
  418. {zou-0.19.56 → zou-0.19.58}/zou/migrations/versions/ffeed4956ab1_add_more_details_to_projects.py +0 -0
  419. {zou-0.19.56 → zou-0.19.58}/zou/remote/__init__.py +0 -0
  420. {zou-0.19.56 → zou-0.19.58}/zou/remote/config_payload.py +0 -0
  421. {zou-0.19.56 → zou-0.19.58}/zou/remote/normalize_movie.py +0 -0
  422. {zou-0.19.56 → zou-0.19.58}/zou/remote/playlist.py +0 -0
  423. {zou-0.19.56 → zou-0.19.58}/zou/utils/__init__.py +0 -0
  424. {zou-0.19.56 → zou-0.19.58}/zou/utils/movie.py +0 -0
  425. {zou-0.19.56 → zou-0.19.58}/zou.egg-info/dependency_links.txt +0 -0
  426. {zou-0.19.56 → zou-0.19.58}/zou.egg-info/entry_points.txt +0 -0
  427. {zou-0.19.56 → zou-0.19.58}/zou.egg-info/not-zip-safe +0 -0
  428. {zou-0.19.56 → zou-0.19.58}/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.56
3
+ Version: 0.19.58
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
@@ -37,11 +37,11 @@ Requires-Dist: flask_sqlalchemy==3.1.1
37
37
  Requires-Dist: flask-fs2[s3,swift]==0.7.27
38
38
  Requires-Dist: flask-jwt-extended==4.6.0
39
39
  Requires-Dist: flask-migrate==4.0.7
40
- Requires-Dist: flask-socketio==5.4.0
40
+ Requires-Dist: flask-socketio==5.4.1
41
41
  Requires-Dist: flask==3.0.3
42
- Requires-Dist: gazu==0.10.15
42
+ Requires-Dist: gazu==0.10.16
43
43
  Requires-Dist: gevent-websocket==0.10.1
44
- Requires-Dist: gevent==24.2.1
44
+ Requires-Dist: gevent==24.10.2
45
45
  Requires-Dist: gunicorn==23.0.0
46
46
  Requires-Dist: isoweek==1.3.3
47
47
  Requires-Dist: itsdangerous==2.2.0
@@ -50,12 +50,12 @@ Requires-Dist: ldap3==2.9.1
50
50
  Requires-Dist: matterhook==0.2
51
51
  Requires-Dist: meilisearch==0.31.5
52
52
  Requires-Dist: numpy==2.0.1; python_version == "3.9"
53
- Requires-Dist: numpy==2.1.1; python_version >= "3.10"
53
+ Requires-Dist: numpy==2.1.2; python_version >= "3.10"
54
54
  Requires-Dist: opencv-python==4.10.0.84
55
55
  Requires-Dist: OpenTimelineIO==0.17.0
56
56
  Requires-Dist: OpenTimelineIO-Plugins==0.17.0
57
57
  Requires-Dist: orjson==3.10.7
58
- Requires-Dist: pillow==10.4.0
58
+ Requires-Dist: pillow==11.0.0
59
59
  Requires-Dist: psutil==6.0.0
60
60
  Requires-Dist: psycopg[binary]==3.2.3
61
61
  Requires-Dist: pyotp==2.9.0
@@ -64,12 +64,12 @@ Requires-Dist: python-nomad==2.0.1
64
64
  Requires-Dist: python-slugify==8.0.4
65
65
  Requires-Dist: python-socketio==5.11.4
66
66
  Requires-Dist: pytz==2024.2
67
- Requires-Dist: redis==5.1.0
67
+ Requires-Dist: redis==5.1.1
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.35
72
+ Requires-Dist: sqlalchemy==2.0.36
73
73
  Requires-Dist: ua-parser==0.18.0
74
74
  Requires-Dist: werkzeug==3.0.4
75
75
  Provides-Extra: prod
@@ -85,11 +85,11 @@ Requires-Dist: pytest==8.3.3; 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.14.0; extra == "monitoring"
88
+ Requires-Dist: sentry-sdk==2.16.0; extra == "monitoring"
89
89
  Provides-Extra: lint
90
90
  Requires-Dist: autoflake==2.3.1; extra == "lint"
91
- Requires-Dist: black==24.8.0; extra == "lint"
92
- Requires-Dist: pre-commit==3.8.0; python_version >= "3.9" and extra == "lint"
91
+ Requires-Dist: black==24.10.0; extra == "lint"
92
+ Requires-Dist: pre-commit==4.0.1; extra == "lint"
93
93
 
94
94
  .. figure:: https://zou.cg-wire.com/kitsu.png
95
95
  :alt: Kitsu Logo
@@ -43,11 +43,11 @@ install_requires =
43
43
  flask-fs2[swift, s3]==0.7.27
44
44
  flask-jwt-extended==4.6.0
45
45
  flask-migrate==4.0.7
46
- flask-socketio==5.4.0
46
+ flask-socketio==5.4.1
47
47
  flask==3.0.3
48
- gazu==0.10.15
48
+ gazu==0.10.16
49
49
  gevent-websocket==0.10.1
50
- gevent==24.2.1
50
+ gevent==24.10.2
51
51
  gunicorn==23.0.0
52
52
  isoweek==1.3.3
53
53
  itsdangerous==2.2.0
@@ -56,12 +56,12 @@ install_requires =
56
56
  matterhook==0.2
57
57
  meilisearch==0.31.5
58
58
  numpy==2.0.1; python_version == '3.9'
59
- numpy==2.1.1; python_version >= '3.10'
59
+ numpy==2.1.2; python_version >= '3.10'
60
60
  opencv-python==4.10.0.84
61
61
  OpenTimelineIO==0.17.0
62
62
  OpenTimelineIO-Plugins==0.17.0
63
63
  orjson==3.10.7
64
- pillow==10.4.0
64
+ pillow==11.0.0
65
65
  psutil==6.0.0
66
66
  psycopg[binary]==3.2.3
67
67
  pyotp==2.9.0
@@ -70,12 +70,12 @@ install_requires =
70
70
  python-slugify==8.0.4
71
71
  python-socketio==5.11.4
72
72
  pytz==2024.2
73
- redis==5.1.0
73
+ redis==5.1.1
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.35
78
+ sqlalchemy==2.0.36
79
79
  ua-parser==0.18.0
80
80
  werkzeug==3.0.4
81
81
 
@@ -99,11 +99,11 @@ test =
99
99
  monitoring =
100
100
  prometheus-flask-exporter==0.23.1
101
101
  pygelf==0.4.2
102
- sentry-sdk==2.14.0
102
+ sentry-sdk==2.16.0
103
103
  lint =
104
104
  autoflake==2.3.1
105
- black==24.8.0
106
- pre-commit==3.8.0; python_version >= '3.9'
105
+ black==24.10.0
106
+ pre-commit==4.0.1
107
107
 
108
108
  [options.entry_points]
109
109
  console_scripts =
@@ -0,0 +1 @@
1
+ __version__ = "0.19.58"
@@ -1,5 +1,5 @@
1
1
  from flask import request
2
- from flask_restful import Resource
2
+ from flask_restful import Resource, inputs
3
3
  from flask_jwt_extended import jwt_required
4
4
 
5
5
  from zou.app.utils import permissions, query
@@ -486,7 +486,7 @@ class NewAssetResource(Resource, ArgsMixin):
486
486
  "is_shared",
487
487
  True,
488
488
  False,
489
- bool,
489
+ inputs.boolean,
490
490
  ),
491
491
  "episode_id",
492
492
  ]
@@ -688,7 +688,7 @@ class BaseSetSharedAssetsResource(Resource, ArgsMixin):
688
688
  "is_shared",
689
689
  True,
690
690
  False,
691
- bool,
691
+ inputs.boolean,
692
692
  ),
693
693
  ]
694
694
  )
@@ -116,7 +116,9 @@ class ChatMessagesResource(Resource):
116
116
 
117
117
  chat = chats_service.get_chat(entity_id)
118
118
  if person["id"] not in chat["participants"]:
119
- raise WrongParameterException("You are not a participant of this chat")
119
+ raise WrongParameterException(
120
+ "You are not a participant of this chat"
121
+ )
120
122
 
121
123
  return (
122
124
  chats_service.create_chat_message(
@@ -21,7 +21,9 @@ class DayOffsResource(BaseModelsResource):
21
21
  if time_spents_service.get_day_offs_between(
22
22
  data["date"], data["end_date"], data["person_id"]
23
23
  ):
24
- raise WrongParameterException("Day off already exists for this period")
24
+ raise WrongParameterException(
25
+ "Day off already exists for this period"
26
+ )
25
27
  return data
26
28
 
27
29
  def post_creation(self, instance):
@@ -67,5 +69,7 @@ class DayOffResource(BaseModelResource):
67
69
  data.get("person_id", instance_dict["person_id"]),
68
70
  exclude_id=instance_dict["id"],
69
71
  ):
70
- raise WrongParameterException("Day off already exists for this period")
72
+ raise WrongParameterException(
73
+ "Day off already exists for this period"
74
+ )
71
75
  return data
@@ -7,7 +7,6 @@ from zou.app.services import entities_service, assets_service
7
7
  from zou.app.services.exception import WrongParameterException
8
8
 
9
9
 
10
-
11
10
  class EntityTypesResource(BaseModelsResource):
12
11
  def __init__(self):
13
12
  BaseModelsResource.__init__(self, EntityType)
@@ -32,11 +31,9 @@ class EntityTypesResource(BaseModelsResource):
32
31
  return instance.serialize(relations=True)
33
32
 
34
33
  def check_creation_integrity(self, data):
35
- entity_type = (
36
- EntityType.query
37
- .filter(EntityType.name.ilike(data.get("name", "")))
38
- .first()
39
- )
34
+ entity_type = EntityType.query.filter(
35
+ EntityType.name.ilike(data.get("name", ""))
36
+ ).first()
40
37
  if entity_type is not None:
41
38
  raise WrongParameterException(
42
39
  "Entity type with this name already exists"
@@ -71,7 +71,9 @@ class ProjectsResource(BaseModelsResource):
71
71
  or data["preview_background_file_id"]
72
72
  not in data["preview_background_files_ids"]
73
73
  ):
74
- raise WrongParameterException("Invalid preview_background_file_id")
74
+ raise WrongParameterException(
75
+ "Invalid preview_background_file_id"
76
+ )
75
77
  return data
76
78
 
77
79
  def post_creation(self, project):
@@ -131,7 +133,9 @@ class ProjectResource(BaseModelResource, ArgsMixin):
131
133
  data["preview_background_file_id"]
132
134
  not in preview_background_files_ids
133
135
  ):
134
- raise WrongParameterException("Invalid preview_background_file_id")
136
+ raise WrongParameterException(
137
+ "Invalid preview_background_file_id"
138
+ )
135
139
 
136
140
  return data
137
141
 
@@ -17,7 +17,9 @@ class ScheduleItemsResource(BaseModelsResource):
17
17
  object_id=data.get("object_id", None),
18
18
  )
19
19
  if schedule_item is not None:
20
- raise WrongParameterException("A similar schedule item already exists")
20
+ raise WrongParameterException(
21
+ "A similar schedule item already exists"
22
+ )
21
23
  return schedule_item
22
24
 
23
25
 
@@ -100,7 +100,7 @@ class PlaylistCsvExport(Resource):
100
100
 
101
101
  def build_row(self, shot):
102
102
  entity = entities_service.get_entity(shot["entity_id"])
103
- name, _ = names_service.get_full_entity_name(shot["entity_id"])
103
+ name, _, _ = names_service.get_full_entity_name(shot["entity_id"])
104
104
  preview_file = files_service.get_preview_file(shot["preview_file_id"])
105
105
  task = tasks_service.get_task(preview_file["task_id"])
106
106
  task_type = self.task_type_map[task["task_type_id"]]
@@ -72,7 +72,7 @@ class TimeSpentsCsvExport(BaseCsvExport):
72
72
  person_last_name,
73
73
  ) = time_spent_row
74
74
  if entity_type_name == "Shot":
75
- entity_name, _ = names_service.get_full_entity_name(entity_id)
75
+ entity_name, _, _ = names_service.get_full_entity_name(entity_id)
76
76
 
77
77
  date = ""
78
78
  if time_spent.date is not None:
@@ -1,4 +1,4 @@
1
- from flask_restful import Resource
1
+ from flask_restful import Resource, inputs
2
2
  from flask_jwt_extended import jwt_required
3
3
 
4
4
  from zou.app.mixin import ArgsMixin
@@ -7,7 +7,7 @@ from zou.app.services.exception import NewsNotFoundException
7
7
  from zou.app.utils import permissions
8
8
 
9
9
 
10
- class NewsMixin:
10
+ class NewsMixin(ArgsMixin):
11
11
  def get_news(self, project_ids=[]):
12
12
  (
13
13
  only_preview,
@@ -21,7 +21,6 @@ class NewsMixin:
21
21
  before,
22
22
  ) = self.get_arguments()
23
23
 
24
- user_service
25
24
  after = self.parse_date_parameter(after)
26
25
  before = self.parse_date_parameter(before)
27
26
  result = news_service.get_last_news_for_project(
@@ -38,6 +37,7 @@ class NewsMixin:
38
37
  )
39
38
  stats = news_service.get_news_stats_for_project(
40
39
  project_ids=project_ids,
40
+ only_preview=only_preview,
41
41
  task_type_id=task_type_id,
42
42
  task_status_id=task_status_id,
43
43
  episode_id=episode_id,
@@ -51,7 +51,12 @@ class NewsMixin:
51
51
  def get_arguments(self):
52
52
  args = self.get_args(
53
53
  [
54
- {"name": "only_preview", "default": False, "type": bool},
54
+ (
55
+ "only_preview",
56
+ False,
57
+ False,
58
+ inputs.boolean,
59
+ ),
55
60
  "task_type_id",
56
61
  "task_status_id",
57
62
  "person_id",
@@ -65,6 +65,7 @@ ALLOWED_FILE_EXTENSION = [
65
65
  "glb",
66
66
  "gltf",
67
67
  "hip",
68
+ "kra",
68
69
  "ma",
69
70
  "mb",
70
71
  "mp3",
@@ -73,6 +74,8 @@ ALLOWED_FILE_EXTENSION = [
73
74
  "psd",
74
75
  "psb",
75
76
  "rar",
77
+ "sai",
78
+ "sai2",
76
79
  "sbbkp",
77
80
  "svg",
78
81
  "swf",
@@ -6,7 +6,7 @@ import re
6
6
  from string import Template
7
7
 
8
8
  from flask import request, current_app
9
- from flask_restful import Resource
9
+ from flask_restful import Resource, inputs
10
10
  from flask_jwt_extended import jwt_required
11
11
 
12
12
  from zou.app import config
@@ -308,7 +308,7 @@ class OTIOImportResource(OTIOBaseResource):
308
308
  False,
309
309
  str,
310
310
  ),
311
- ("match_case", True, False, bool),
311
+ ("match_case", True, False, inputs.boolean),
312
312
  ]
313
313
  )
314
314
 
@@ -359,6 +359,6 @@ class OTIOImportEpisodeResource(OTIOBaseResource):
359
359
  False,
360
360
  str,
361
361
  ),
362
- ("match_case", True, False, bool),
362
+ ("match_case", True, False, inputs.boolean),
363
363
  ]
364
364
  )
@@ -2,7 +2,7 @@ import datetime
2
2
 
3
3
 
4
4
  from flask import abort, request
5
- from flask_restful import Resource
5
+ from flask_restful import Resource, inputs
6
6
  from flask_jwt_extended import jwt_required
7
7
 
8
8
  from zou.app.services.exception import (
@@ -793,7 +793,11 @@ class ToReviewResource(Resource, ArgsMixin):
793
793
  ("comment", ""),
794
794
  ("name", "main"),
795
795
  {"name": "revision", "default": 1, "type": int},
796
- {"name": "change_status", "default": True, "type": bool},
796
+ {
797
+ "name": "change_status",
798
+ "default": True,
799
+ "type": inputs.boolean,
800
+ },
797
801
  ]
798
802
  )
799
803
 
@@ -33,6 +33,7 @@ from zou.app.blueprints.user.resources import (
33
33
  FilterGroupResource,
34
34
  FilterGroupsResource,
35
35
  DesktopLoginLogsResource,
36
+ MarkAllNotificationsAsReadResource,
36
37
  NotificationsResource,
37
38
  NotificationResource,
38
39
  HasTaskSubscribedResource,
@@ -108,6 +109,10 @@ routes = [
108
109
  "/actions/user/sequences/<sequence_id>/task-types/<task_type_id>/unsubscribe",
109
110
  SequenceUnsubscribeResource,
110
111
  ),
112
+ (
113
+ "/actions/user/notifications/mark-all-as-read",
114
+ MarkAllNotificationsAsReadResource,
115
+ ),
111
116
  ]
112
117
 
113
118
  blueprint = Blueprint("user", "user")
@@ -1,5 +1,5 @@
1
- from flask import abort
2
- from flask_restful import Resource
1
+ from flask import abort, request
2
+ from flask_restful import Resource, inputs
3
3
 
4
4
  from zou.app.mixin import ArgsMixin
5
5
  from zou.app.services import (
@@ -556,7 +556,7 @@ class FiltersResource(Resource, ArgsMixin):
556
556
  ("list_type", "todo", True),
557
557
  ("project_id", None, False),
558
558
  ("entity_type", None, False),
559
- ("is_shared", False, False, bool),
559
+ ("is_shared", False, False, inputs.boolean),
560
560
  ("search_filter_group_id", None, False),
561
561
  ]
562
562
  )
@@ -589,11 +589,10 @@ class FilterResource(Resource, ArgsMixin):
589
589
  ("name", None, False),
590
590
  ("search_query", None, False),
591
591
  ("search_filter_group_id", None, False),
592
- ("is_shared", None, False, bool),
592
+ ("is_shared", None, False, inputs.boolean),
593
593
  ("project_id", None, None),
594
594
  ]
595
595
  )
596
-
597
596
  data = self.clear_empty_fields(
598
597
  data, ignored_fields=["search_filter_group_id"]
599
598
  )
@@ -696,7 +695,7 @@ class FilterGroupsResource(Resource, ArgsMixin):
696
695
  ("color", "", True),
697
696
  ("list_type", "todo", True),
698
697
  ("project_id", None, False),
699
- ("is_shared", False, False, bool),
698
+ ("is_shared", False, False, inputs.boolean),
700
699
  ("entity_type", None, False),
701
700
  ]
702
701
  )
@@ -742,7 +741,7 @@ class FilterGroupResource(Resource, ArgsMixin):
742
741
  [
743
742
  ("name", None, False),
744
743
  ("color", None, False),
745
- ("is_shared", None, False, bool),
744
+ ("is_shared", None, False, inputs.boolean),
746
745
  ("project_id", None, None),
747
746
  ]
748
747
  )
@@ -848,13 +847,22 @@ class NotificationsResource(Resource, ArgsMixin):
848
847
  task_status_id,
849
848
  notification_type,
850
849
  ) = self.get_arguments()
850
+
851
+ read = None
852
+ if request.args.get("read", None) is not None:
853
+ read = self.get_bool_parameter("read")
854
+ watching = None
855
+ if request.args.get("watching", None) is not None:
856
+ watching = self.get_bool_parameter("watching")
857
+ print("watching", watching)
851
858
  notifications = user_service.get_last_notifications(
852
859
  before=before,
853
860
  task_type_id=task_type_id,
854
861
  task_status_id=task_status_id,
855
862
  notification_type=notification_type,
863
+ read=read,
864
+ watching=watching,
856
865
  )
857
- user_service.mark_notifications_as_read()
858
866
  return notifications
859
867
 
860
868
  def get_arguments(self):
@@ -867,7 +875,7 @@ class NotificationsResource(Resource, ArgsMixin):
867
875
  )
868
876
 
869
877
 
870
- class NotificationResource(Resource):
878
+ class NotificationResource(Resource, ArgsMixin):
871
879
  """
872
880
  Return notification matching given id, only if it's a notification that
873
881
  belongs to current user.
@@ -894,6 +902,42 @@ class NotificationResource(Resource):
894
902
  """
895
903
  return user_service.get_notification(notification_id)
896
904
 
905
+ def put(self, notification_id):
906
+ """
907
+ Change notification read status.
908
+ ---
909
+ tags:
910
+ - User
911
+ parameters:
912
+ - in: path
913
+ name: notification_id
914
+ required: True
915
+ type: string
916
+ format: UUID
917
+ x-example: a24a6ea4-ce75-4665-a070-57453082c25
918
+ responses:
919
+ 200:
920
+ description: Notification
921
+ """
922
+ data = self.get_args([("read", None, False, inputs.boolean)])
923
+ return user_service.update_notification(notification_id, data["read"])
924
+
925
+
926
+ class MarkAllNotificationsAsReadResource(Resource):
927
+
928
+ def post(self):
929
+ """
930
+ Mark all notifications as read for the current user.
931
+ ---
932
+ tags:
933
+ - User
934
+ responses:
935
+ 200:
936
+ description: All notifications marked as read
937
+ """
938
+ user_service.mark_notifications_as_read()
939
+ return {"success": True}
940
+
897
941
 
898
942
  class HasTaskSubscribedResource(Resource):
899
943
  """
@@ -905,7 +949,7 @@ class HasTaskSubscribedResource(Resource):
905
949
  Return true if current user has subscribed to given task.
906
950
  ---
907
951
  tags:
908
- - User
952
+ - User
909
953
  parameters:
910
954
  - in: path
911
955
  name: task_id
@@ -14,10 +14,13 @@ class Organisation(db.Model, BaseMixin, SerializerMixin):
14
14
  has_avatar = db.Column(db.Boolean(), default=False)
15
15
  use_original_file_name = db.Column(db.Boolean(), default=False)
16
16
  timesheets_locked = db.Column(db.Boolean(), default=False)
17
+ format_duration_in_hours = db.Column(db.Boolean(), default=False)
17
18
  hd_by_default = db.Column(db.Boolean(), default=False)
18
19
  chat_token_slack = db.Column(db.String(80), default="")
19
20
  chat_webhook_mattermost = db.Column(db.String(80), default="")
20
21
  chat_token_discord = db.Column(db.String(80), default="")
22
+ dark_theme_by_default = db.Column(db.Boolean(), default=False)
23
+ format_duration_in_hours = db.Column(db.Boolean(), default=False)
21
24
 
22
25
  def present(self):
23
26
  return fields.serialize_dict(
@@ -32,6 +35,8 @@ class Organisation(db.Model, BaseMixin, SerializerMixin):
32
35
  "hd_by_default": self.hd_by_default,
33
36
  "use_original_file_name": self.use_original_file_name,
34
37
  "timesheets_locked": self.timesheets_locked,
38
+ "dark_theme_by_default": self.dark_theme_by_default,
39
+ "format_duration_in_hours": self.format_duration_in_hours,
35
40
  "updated_at": self.updated_at,
36
41
  "created_at": self.created_at,
37
42
  }
@@ -142,6 +142,9 @@ class Project(db.Model, BaseMixin, SerializerMixin):
142
142
  is_preview_download_allowed = db.Column(db.Boolean(), default=False)
143
143
  is_set_preview_automated = db.Column(db.Boolean(), default=False)
144
144
  homepage = db.Column(db.String(80), default="assets")
145
+ is_publish_default_for_artists = db.Column(db.Boolean(), default=False)
146
+ hd_bitrate_compression = db.Column(db.Integer, default=28)
147
+ ld_bitrate_compression = db.Column(db.Integer, default=6)
145
148
 
146
149
  project_status_id = db.Column(
147
150
  UUIDType(binary=False), db.ForeignKey("project_status.id"), index=True
@@ -22,10 +22,10 @@ class Subscription(db.Model, BaseMixin, SerializerMixin):
22
22
 
23
23
  entity_id = db.Column(
24
24
  UUIDType(binary=False), db.ForeignKey("entity.id"), index=True
25
- )
25
+ ) # Deprecated
26
26
  task_type_id = db.Column(
27
27
  UUIDType(binary=False), db.ForeignKey("task_type.id"), index=True
28
- )
28
+ ) # Deprecated
29
29
 
30
30
  __table_args__ = (
31
31
  db.UniqueConstraint(
@@ -33,6 +33,7 @@ class Task(db.Model, BaseMixin, SerializerMixin):
33
33
  description = db.Column(db.Text())
34
34
 
35
35
  priority = db.Column(db.Integer, default=0)
36
+ difficulty = db.Column(db.Integer, default=3, nullable=False)
36
37
  duration = db.Column(db.Float, default=0)
37
38
  estimation = db.Column(db.Float, default=0)
38
39
  completion_rate = db.Column(db.Integer, default=0)
@@ -70,6 +71,9 @@ class Task(db.Model, BaseMixin, SerializerMixin):
70
71
  db.UniqueConstraint(
71
72
  "name", "project_id", "task_type_id", "entity_id", name="task_uc"
72
73
  ),
74
+ db.CheckConstraint(
75
+ "difficulty > 0 AND difficulty < 6", name="check_difficulty"
76
+ ),
73
77
  )
74
78
 
75
79
  def assignees_as_string(self):
@@ -104,8 +104,8 @@ def get_assets(criterions={}, is_admin=False):
104
104
 
105
105
  if "is_shared" in criterions:
106
106
  if not is_admin:
107
- query = (
108
- query.join(Project).filter(user_service.build_team_filter())
107
+ query = query.join(Project).filter(
108
+ user_service.build_team_filter()
109
109
  )
110
110
 
111
111
  if episode_id is not None:
@@ -127,7 +127,7 @@ def get_assets(criterions={}, is_admin=False):
127
127
  result += [a for a in query.all() if a.source_id != episode_id]
128
128
  else:
129
129
  result = query.all()
130
- return EntityType.serialize_list(result, obj_type="Asset")
130
+ return Entity.serialize_list(result, obj_type="Asset")
131
131
 
132
132
 
133
133
  def get_all_raw_assets():
@@ -202,6 +202,7 @@ def get_assets_and_tasks(criterions={}, page=1, with_episode_ids=False):
202
202
  Task.due_date,
203
203
  Task.done_date,
204
204
  Task.last_comment_date,
205
+ Task.difficulty,
205
206
  assignees_table.columns.person,
206
207
  ).order_by(EntityType.name, Entity.name)
207
208
 
@@ -281,6 +282,7 @@ def get_assets_and_tasks(criterions={}, page=1, with_episode_ids=False):
281
282
  task_due_date,
282
283
  task_done_date,
283
284
  task_last_comment_date,
285
+ task_difficulty,
284
286
  person_id,
285
287
  ) in query_result:
286
288
  if asset.source_id is None:
@@ -338,6 +340,7 @@ def get_assets_and_tasks(criterions={}, page=1, with_episode_ids=False):
338
340
  ),
339
341
  "retake_count": task_retake_count,
340
342
  "start_date": fields.serialize_value(task_start_date),
343
+ "difficulty": task_difficulty,
341
344
  "task_status_id": str(task_status_id),
342
345
  "task_type_id": str(task_type_id),
343
346
  "assignees": [],
@@ -722,7 +725,7 @@ def set_shared_assets(
722
725
  project_id=None,
723
726
  asset_type_id=None,
724
727
  asset_ids=None,
725
- with_events=False
728
+ with_events=False,
726
729
  ):
727
730
  """
728
731
  Set all assets of a project to is_shared=True or False.
@@ -213,7 +213,7 @@ def get_chats_for_person(person_id):
213
213
  result = []
214
214
  for chat_model, project_id, preview_file_id in chats:
215
215
  chat = chat_model.present()
216
- chat["entity_name"], _ = names_service.get_full_entity_name(
216
+ chat["entity_name"], _, _ = names_service.get_full_entity_name(
217
217
  chat["object_id"]
218
218
  )
219
219
  chat["project_id"] = project_id
@@ -296,7 +296,7 @@ def get_task_descriptors(person_id, task):
296
296
  project = projects_service.get_project(task["project_id"])
297
297
  task_type = tasks_service.get_task_type(task["task_type_id"])
298
298
  entity = entities_service.get_entity(task["entity_id"])
299
- (entity_name, episode_id) = names_service.get_full_entity_name(
299
+ entity_name, episode_id, _ = names_service.get_full_entity_name(
300
300
  entity["id"]
301
301
  )
302
302