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