zou 0.19.50__tar.gz → 0.19.52__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.
- {zou-0.19.50/zou.egg-info → zou-0.19.52}/PKG-INFO +16 -16
- {zou-0.19.50 → zou-0.19.52}/setup.cfg +14 -14
- {zou-0.19.50 → zou-0.19.52}/setup.py +1 -1
- zou-0.19.52/zou/__init__.py +1 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/__init__.py +8 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/auth/__init__.py +4 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/auth/resources.py +111 -1
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/crud/entity.py +42 -1
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/crud/task.py +41 -1
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/index/resources.py +14 -14
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/previews/resources.py +3 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/shots/resources.py +50 -1
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/tasks/resources.py +22 -2
- {zou-0.19.50 → zou-0.19.52}/zou/app/config.py +4 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/services/auth_service.py +7 -20
- {zou-0.19.50 → zou-0.19.52}/zou/app/services/persons_service.py +5 -2
- {zou-0.19.50 → zou-0.19.52}/zou/app/services/tasks_service.py +21 -1
- {zou-0.19.50 → zou-0.19.52}/zou/app/utils/dbhelpers.py +14 -1
- zou-0.19.52/zou/app/utils/fido.py +22 -0
- zou-0.19.52/zou/app/utils/saml.py +52 -0
- {zou-0.19.50 → zou-0.19.52}/zou/cli.py +27 -2
- {zou-0.19.50 → zou-0.19.52/zou.egg-info}/PKG-INFO +16 -16
- {zou-0.19.50 → zou-0.19.52}/zou.egg-info/SOURCES.txt +2 -0
- {zou-0.19.50 → zou-0.19.52}/zou.egg-info/requires.txt +16 -15
- zou-0.19.50/zou/__init__.py +0 -1
- {zou-0.19.50 → zou-0.19.52}/LICENSE +0 -0
- {zou-0.19.50 → zou-0.19.52}/README.rst +0 -0
- {zou-0.19.50 → zou-0.19.52}/pyproject.toml +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/api.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/__init__.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/assets/__init__.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/assets/resources.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/breakdown/__init__.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/breakdown/resources.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/chats/__init__.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/chats/resources.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/comments/__init__.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/comments/resources.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/concepts/__init__.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/concepts/resources.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/crud/__init__.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/crud/asset_instance.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/crud/attachment_file.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/crud/base.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/crud/chat.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/crud/chat_message.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/crud/comments.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/crud/custom_action.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/crud/day_off.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/crud/department.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/crud/entity_link.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/crud/entity_type.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/crud/event.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/crud/file_status.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/crud/metadata_descriptor.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/crud/milestone.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/crud/news.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/crud/notification.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/crud/organisation.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/crud/output_file.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/crud/output_type.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/crud/person.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/crud/playlist.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/crud/preview_background_file.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/crud/preview_file.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/crud/project.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/crud/project_status.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/crud/schedule_item.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/crud/search_filter.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/crud/search_filter_group.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/crud/software.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/crud/status_automation.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/crud/studio.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/crud/subscription.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/crud/task_status.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/crud/task_type.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/crud/time_spent.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/crud/working_file.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/edits/__init__.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/edits/resources.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/entities/__init__.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/entities/resources.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/events/__init__.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/events/resources.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/export/__init__.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/export/csv/__init__.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/export/csv/assets.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/export/csv/base.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/export/csv/casting.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/export/csv/edits.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/export/csv/persons.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/export/csv/playlists.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/export/csv/projects.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/export/csv/shots.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/export/csv/task_types.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/export/csv/tasks.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/export/csv/time_spents.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/files/__init__.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/files/resources.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/index/__init__.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/news/__init__.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/news/resources.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/persons/__init__.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/persons/resources.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/playlists/__init__.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/playlists/resources.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/previews/__init__.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/projects/__init__.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/projects/resources.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/search/__init__.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/search/resources.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/shots/__init__.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/source/__init__.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/source/csv/__init__.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/source/csv/assets.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/source/csv/base.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/source/csv/casting.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/source/csv/edits.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/source/csv/persons.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/source/csv/shots.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/source/csv/task_type_estimations.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/source/kitsu.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/source/otio.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/source/shotgun/__init__.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/source/shotgun/assets.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/source/shotgun/base.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/source/shotgun/episode.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/source/shotgun/exception.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/source/shotgun/import_errors.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/source/shotgun/notes.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/source/shotgun/person.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/source/shotgun/project.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/source/shotgun/scene.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/source/shotgun/sequence.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/source/shotgun/shot.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/source/shotgun/status.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/source/shotgun/steps.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/source/shotgun/tasks.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/source/shotgun/team.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/source/shotgun/versions.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/tasks/__init__.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/user/__init__.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/blueprints/user/resources.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/file_trees/default.json +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/file_trees/simple.json +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/indexer/__init__.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/indexer/indexing.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/mixin.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/models/__init__.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/models/asset_instance.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/models/attachment_file.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/models/base.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/models/build_job.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/models/chat.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/models/chat_message.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/models/comment.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/models/custom_action.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/models/data_import_error.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/models/day_off.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/models/department.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/models/desktop_login_log.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/models/entity.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/models/entity_type.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/models/event.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/models/file_status.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/models/login_log.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/models/metadata_descriptor.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/models/milestone.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/models/news.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/models/notification.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/models/organisation.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/models/output_file.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/models/output_type.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/models/person.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/models/playlist.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/models/preview_background_file.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/models/preview_file.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/models/project.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/models/project_status.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/models/schedule_item.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/models/search_filter.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/models/search_filter_group.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/models/serializer.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/models/software.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/models/status_automation.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/models/studio.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/models/subscription.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/models/task.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/models/task_status.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/models/task_type.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/models/time_spent.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/models/working_file.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/services/__init__.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/services/assets_service.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/services/backup_service.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/services/base_service.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/services/breakdown_service.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/services/chats_service.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/services/comments_service.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/services/concepts_service.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/services/custom_actions_service.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/services/deletion_service.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/services/edits_service.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/services/emails_service.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/services/entities_service.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/services/events_service.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/services/exception.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/services/file_tree_service.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/services/files_service.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/services/index_service.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/services/names_service.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/services/news_service.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/services/notifications_service.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/services/playlists_service.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/services/preview_files_service.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/services/projects_service.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/services/scenes_service.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/services/schedule_service.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/services/shots_service.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/services/stats_service.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/services/status_automations_service.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/services/sync_service.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/services/telemetry_services.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/services/time_spents_service.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/services/user_service.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/stores/__init__.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/stores/auth_tokens_store.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/stores/file_store.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/stores/publisher_store.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/stores/queue_store.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/swagger.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/utils/__init__.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/utils/api.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/utils/auth.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/utils/cache.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/utils/chats.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/utils/colors.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/utils/commands.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/utils/csv_utils.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/utils/date_helpers.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/utils/emails.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/utils/env.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/utils/events.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/utils/fields.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/utils/flask.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/utils/fs.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/utils/git.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/utils/logs.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/utils/monitoring.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/utils/permissions.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/utils/query.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/utils/remote_job.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/utils/shell.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/utils/string.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/app/utils/thumbnail.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/debug.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/event_stream.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/job_settings.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/README +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/__init__.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/alembic.ini +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/env.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/script.py.mako +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/utils/__init__.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/utils/base.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/003be8a91001_add_start_and_end_dates_to_projects.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/0596674df51d_add_department_mentions_to_comments.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/05ac7e8caa21_remove_unique_constraint_for_taskstatus_.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/05b7dc79a416_add_archived_fields_to_main_tables.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/0cf5e0e035fa_drop_column_tasktype_for_shots.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/0ec3762a745d_add_attachment_table.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/0ef6416a507b_.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/10cf267d95c9_fix_schedule_item.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/16328eae4b5f_add_new_constraint_for_timespent.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/16df47d76c64_add_some_indexes.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/17ef8f7be758_disallow_null_choicetype.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/1bb55759146f_add_table_studio.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/1cb44194db49_add_file_size_field_to_preview_file.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/1e150c2cea4d_add_nb_entities_out.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/1e2d77a2f0c4_add_hd_by_default_column.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/1fab8c420678_add_attachments_to_message_chats.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/20dfeb36142b_add_projecttaskstatuslink_roles_for_.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/23122f290ca2_add_entity_chat_models.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/269d41bfb73f_add_entity_entity_links.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/29df910f04a4_create_unique_constraint_project_id_.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/29fe01a6c9eb_add_status_automation_field.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/2adc020885fa_.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/2baede80b111_add_entity_status_field.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/306266361f4f_.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/328fd44c6347_add_entity_created_by.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/32f134ff1201_add_is_shared_flag_to_filters.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/346250b5304c_add_position_to_preview_files.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/3476e147e632_add_acks_to_comments.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/389cfb9de776_.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/38baa9a23b3d_.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/398150912a3f_validation_status_preview.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/3b0d1321079e_.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/3d5c93bafb9d_.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/3e0538ddf80f_.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/3fee3bd10f9d_.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/4095103c7d01_add_is_clients_isolated_flag_to_projects.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/40dea9555940_.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/42ec83db6a01_change_person_preferred_two_factor_.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/43d0cf0ed5e7_.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/443d1e78a932_.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/45c2de366e66_.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/45dafbb3f4e1_for_person_contract_type_disallow_null.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/4715c2586036_add_last_preview_file_fields.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/4e3738cdc34c_.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/4f2398ebcd49_.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/523ee9647bee_.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/54ee0d1d60ba_add_build_job_model.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/556526e47daa_.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/57222395f2be_add_statusautomation_import_last_revision.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/5798d2c9020b_change_person_role_to_choicetype.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/590aa1ffe731_add_notifications_enabled_flag.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/5a291251823c_add_max_retake_parameter.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/5ab9d7a75887_.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/5b0fcbb94f24_.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/5b7fa3e51701_add_is_client_allowed_flag_to_task_.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/5b980f0dc365_add_comment_links.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/5b9fd9ddfe43_add_homepage_and_contract_fields.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/5c0498e264bc_add_slack_fields.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/5e2ce62632a6_add_workflow_to_project.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/680c64565f9d_for_searchfiltergroup_is_shared.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/693cc511d28d_add_taskstatus_priority.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/6aa446ee4072_add_is_for_all_flage_to_playlists.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/6bd3b102d61b_.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/6c597e842afa_add_task_type_field_to_playlists.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/6d1b2c60f58b_add_milestone_model.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/6d7fa5a8e9a5_add_timesheets_locked_field_to_org.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/6eeaff945706_add_data_field_on_entity_links.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/6f6049877105_.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/7417c8eb70d8_add_for_entity_field_to_playlists.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/772a5e43f05b_.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/7748d3d22925_add_columns_to_searchfilter_table_to_.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/77d6820f494f_add_reply_to_notif.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/7b1f765677d8_.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/7bc746997e8d_add_slack_token_field_to_organisation.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/7dc79d4ed7cd_.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/818f7bda2528_.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/82e7f7a95e84_add_project_id_to_events.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/82ee682204ab_add_is_generated_from_ldap_column_to_.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/8588f254d6b8_add_archived_fields.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/8739ae9fa28b_add_for_client_field.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/87efceb6745b_add_ready_for_to_entity.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/892b264937ec_.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/8a1b4a1b7f4a_add_totp_columns_for_person.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/8e4f39e321f4_add_day_off_table.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/8fbd40afbe5f_allow_to_set_float_values_for_.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/9010a64e5a2d_add_indices.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/9060dd4f6116_notification_uc.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/925771029620_.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/92b40d79ad3f_allow_message_attachments.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/92bdfe07e5f5_discord_integration.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/956659992419_add_columns_for_person_to_store_fido_.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/96c79d31e648_add_mail_otp_columns_for_person.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/96f58a4a2a58_person_partial_index_for_email_only_.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/971dbf5a0faf_add_short_name_for_asset_type_entity_.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/98c90621cf58_add_for_client_flag_to_playlist.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/99825b9cc778_.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/9a09467f9b2c_.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/9b85c14fa8a7_add_day_off_new_columns.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/9bd17364fc18_.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/9e5b3a9b0cee_add_new_column_metadatadescriptor_data_type_.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/9f8445f9b42c_add_man_days_fields.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/a23682ccc1f1_.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/a252a094e977_add_descriptions_for_entities_tasks_and_.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/a519c710877c_.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/a65bdadbae2f_.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/a66508788c53_add_nb_assets_ready.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/a6c25eed3ea1_add_login_failed_attemps_and_last_login_.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/a7c43f3fbc76_add_duration_column_to_the_preview_file.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/aa0a60033106_feedback_request.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/addbbefa7028_add_departments_link_to_metadata_.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/ae0127f2fc56_add_previewfile_width_and_previewfile_.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/af1790868e2c_.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/b45cb782bb9c_.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/b4dd0add5f79_.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/b8c0a0f9d054_drop_task_status_is_reviewable.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/b8ed0fb263f8_add_person_jti_and_jti_expiration_date.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/b97a71306fc8_add_is_casting_standby_column_to_entity.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/be56dc0fb760_for_is_shared_disallow_nullable.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/bf1347acdee2_.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/c49e41f1298b_add_previewbackground.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/c68c2a62cfac_add_mimetype_column_to_attachment.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/c726b98be194_.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/c81f3e83bdb5_.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/ca28796a2a62_add_is_done_field_to_the_task_model.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/cf3d365de164_add_entity_version_model.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/cf6cec6d6bf5_add_status_field_to_preview_file.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/d80267806131_task_status_new_column_is_default.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/d8dcd5196d57_add_casting_label.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/de8a3de227ef_.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/deeacd38d373_for_projecttaskstatuslink_set_default_.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/df1834485f57_.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/df9f8a147e80_change_file_size_to_big_integer.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/e1ef93f40d3d_.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/e29638428dfd_add_schedule_item_table.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/e3f6db74cc1e_.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/e839d6603c09_add_person_id_to_shot_history.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/ee2373fbe3a4_.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/f0567e8d0c62_.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/f0c6cbb61869_add_production_style_field.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/f344b867a911_for_description_of_entity_task_working_.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/f4ff5a73d283_add_person_ldap_uid.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/f5b113876a49_add_preferred_two_factor_authentication_.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/f5bdca075cdc_add_preview_download_flag_to_projects.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/f874ad5e898a_add_link_entity_type_task_type.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/f995b28fb749_.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/fb6b6f188497_.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/fb87feaaa094_add_missing_unique_constraints.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/fc322f908695_.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/fee7c696166e_.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/feffd3c5b806_introduce_concepts.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/migrations/versions/ffeed4956ab1_add_more_details_to_projects.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/remote/__init__.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/remote/config_payload.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/remote/normalize_movie.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/remote/playlist.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/utils/__init__.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou/utils/movie.py +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou.egg-info/dependency_links.txt +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou.egg-info/entry_points.txt +0 -0
- {zou-0.19.50 → zou-0.19.52}/zou.egg-info/not-zip-safe +0 -0
- {zou-0.19.50 → zou-0.19.52}/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.
|
|
3
|
+
Version: 0.19.52
|
|
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.
|
|
21
|
+
Requires-Python: >=3.9, <3.13
|
|
23
22
|
License-File: LICENSE
|
|
24
|
-
Requires-Dist: babel==2.
|
|
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.
|
|
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==
|
|
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.
|
|
53
|
-
Requires-Dist: numpy==
|
|
54
|
-
Requires-Dist: numpy==2.0
|
|
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.
|
|
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.
|
|
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.
|
|
72
|
+
Requires-Dist: sqlalchemy==2.0.32
|
|
73
73
|
Requires-Dist: ua-parser==0.18.0
|
|
74
|
-
Requires-Dist: werkzeug==3.0.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
48
|
+
gazu==0.10.14
|
|
50
49
|
gevent-websocket==0.10.1
|
|
51
50
|
gevent==24.2.1
|
|
52
|
-
gunicorn==
|
|
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.
|
|
59
|
-
numpy==
|
|
60
|
-
numpy==2.0
|
|
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.
|
|
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.
|
|
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.
|
|
78
|
+
sqlalchemy==2.0.32
|
|
79
79
|
ua-parser==0.18.0
|
|
80
|
-
werkzeug==3.0.
|
|
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.
|
|
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.
|
|
102
|
+
sentry-sdk==2.13.0
|
|
103
103
|
lint =
|
|
104
104
|
autoflake==2.3.1
|
|
105
|
-
black==24.
|
|
105
|
+
black==24.8.0
|
|
106
106
|
pre-commit==3.8.0; python_version >= '3.9'
|
|
107
107
|
|
|
108
108
|
[options.entry_points]
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "0.19.52"
|
|
@@ -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,112 @@ 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
|
+
response = make_response(
|
|
1380
|
+
redirect(f"{config.DOMAIN_PROTOCOL}://{config.DOMAIN_NAME}")
|
|
1381
|
+
)
|
|
1382
|
+
|
|
1383
|
+
if user["active"]:
|
|
1384
|
+
access_token = create_access_token(
|
|
1385
|
+
identity=user["id"],
|
|
1386
|
+
additional_claims={
|
|
1387
|
+
"identity_type": "person",
|
|
1388
|
+
},
|
|
1389
|
+
)
|
|
1390
|
+
refresh_token = create_refresh_token(
|
|
1391
|
+
identity=user["id"],
|
|
1392
|
+
additional_claims={
|
|
1393
|
+
"identity_type": "person",
|
|
1394
|
+
},
|
|
1395
|
+
)
|
|
1396
|
+
identity_changed.send(
|
|
1397
|
+
current_app._get_current_object(),
|
|
1398
|
+
identity=Identity(user["id"], "person"),
|
|
1399
|
+
)
|
|
1400
|
+
|
|
1401
|
+
ip_address = request.environ.get(
|
|
1402
|
+
"HTTP_X_REAL_IP", request.remote_addr
|
|
1403
|
+
)
|
|
1404
|
+
|
|
1405
|
+
set_access_cookies(response, access_token)
|
|
1406
|
+
set_refresh_cookies(response, refresh_token)
|
|
1407
|
+
events_service.create_login_log(user["id"], ip_address, "web")
|
|
1408
|
+
|
|
1409
|
+
return response
|
|
1410
|
+
|
|
1411
|
+
|
|
1412
|
+
class SAMLLoginResource(Resource, ArgsMixin):
|
|
1413
|
+
"""
|
|
1414
|
+
Resource to allow a user to login with SAML SSO.
|
|
1415
|
+
"""
|
|
1416
|
+
|
|
1417
|
+
def get(self):
|
|
1418
|
+
"""
|
|
1419
|
+
Resource to allow a user to login with SAML SSO.
|
|
1420
|
+
---
|
|
1421
|
+
description: ""
|
|
1422
|
+
tags:
|
|
1423
|
+
- Authentication
|
|
1424
|
+
responses:
|
|
1425
|
+
302:
|
|
1426
|
+
description: Redirect to the SAML IDP.
|
|
1427
|
+
400:
|
|
1428
|
+
description: Wrong parameter.
|
|
1429
|
+
"""
|
|
1430
|
+
if not config.SAML_ENABLED:
|
|
1431
|
+
return {"error": "SAML is not enabled."}, 400
|
|
1432
|
+
_, info = current_app.extensions[
|
|
1433
|
+
"saml_client"
|
|
1434
|
+
].prepare_for_authenticate()
|
|
1435
|
+
|
|
1436
|
+
redirect_url = None
|
|
1437
|
+
|
|
1438
|
+
# Select the IdP URL to send the AuthN request to
|
|
1439
|
+
for key, value in info["headers"]:
|
|
1440
|
+
if key == "Location":
|
|
1441
|
+
redirect_url = value
|
|
1442
|
+
|
|
1443
|
+
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,
|
|
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":
|
|
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
|
-
|
|
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
|
-
|
|
285
|
-
"is_self_hosted":
|
|
286
|
-
"crisp_token":
|
|
282
|
+
conf = {
|
|
283
|
+
"is_self_hosted": config.IS_SELF_HOSTED,
|
|
284
|
+
"crisp_token": config.CRISP_TOKEN,
|
|
287
285
|
"indexer_configured": (
|
|
288
|
-
len(
|
|
289
|
-
and
|
|
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
|
|
293
|
-
|
|
294
|
-
"dsn":
|
|
295
|
-
"sampleRate":
|
|
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
|
|
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
|
]
|
|
@@ -980,6 +981,7 @@ class BaseThumbnailResource(Resource):
|
|
|
980
981
|
|
|
981
982
|
|
|
982
983
|
class PersonThumbnailResource(BaseThumbnailResource):
|
|
984
|
+
|
|
983
985
|
def __init__(self):
|
|
984
986
|
BaseThumbnailResource.__init__(
|
|
985
987
|
self,
|
|
@@ -1027,6 +1029,7 @@ class ProjectThumbnailResource(BaseThumbnailResource):
|
|
|
1027
1029
|
"projects",
|
|
1028
1030
|
projects_service.get_project,
|
|
1029
1031
|
projects_service.update_project,
|
|
1032
|
+
thumbnail_utils.BIG_SQUARE_SIZE,
|
|
1030
1033
|
)
|
|
1031
1034
|
|
|
1032
1035
|
def check_allowed_to_get(self, instance_id):
|
|
@@ -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
|
|
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
|
-
|
|
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):
|