zou 0.19.67__tar.gz → 0.19.69__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.67/zou.egg-info → zou-0.19.69}/PKG-INFO +7 -7
- {zou-0.19.67 → zou-0.19.69}/setup.cfg +6 -6
- zou-0.19.69/zou/__init__.py +1 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/auth/resources.py +15 -1
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/comments/resources.py +2 -2
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/crud/base.py +7 -19
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/crud/comments.py +4 -27
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/crud/person.py +4 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/crud/task.py +4 -1
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/persons/resources.py +0 -1
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/shots/resources.py +0 -1
- {zou-0.19.67 → zou-0.19.69}/zou/app/config.py +1 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/models/person.py +1 -1
- {zou-0.19.67 → zou-0.19.69}/zou/app/services/assets_service.py +6 -12
- {zou-0.19.67 → zou-0.19.69}/zou/app/services/breakdown_service.py +1 -1
- {zou-0.19.67 → zou-0.19.69}/zou/app/services/comments_service.py +1 -1
- {zou-0.19.67 → zou-0.19.69}/zou/app/services/concepts_service.py +4 -12
- {zou-0.19.67 → zou-0.19.69}/zou/app/services/edits_service.py +5 -11
- {zou-0.19.67 → zou-0.19.69}/zou/app/services/persons_service.py +4 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/services/preview_files_service.py +12 -4
- {zou-0.19.67 → zou-0.19.69}/zou/app/services/projects_service.py +4 -13
- {zou-0.19.67 → zou-0.19.69}/zou/app/services/shots_service.py +6 -12
- {zou-0.19.67 → zou-0.19.69}/zou/app/services/tasks_service.py +8 -27
- {zou-0.19.67 → zou-0.19.69}/zou/app/services/user_service.py +1 -1
- {zou-0.19.67 → zou-0.19.69/zou.egg-info}/PKG-INFO +7 -7
- {zou-0.19.67 → zou-0.19.69}/zou.egg-info/requires.txt +6 -6
- zou-0.19.67/zou/__init__.py +0 -1
- {zou-0.19.67 → zou-0.19.69}/LICENSE +0 -0
- {zou-0.19.67 → zou-0.19.69}/README.rst +0 -0
- {zou-0.19.67 → zou-0.19.69}/pyproject.toml +0 -0
- {zou-0.19.67 → zou-0.19.69}/setup.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/__init__.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/api.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/__init__.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/assets/__init__.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/assets/resources.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/auth/__init__.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/breakdown/__init__.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/breakdown/resources.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/chats/__init__.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/chats/resources.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/comments/__init__.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/concepts/__init__.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/concepts/resources.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/crud/__init__.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/crud/asset_instance.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/crud/attachment_file.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/crud/chat.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/crud/chat_message.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/crud/custom_action.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/crud/day_off.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/crud/department.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/crud/entity.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/crud/entity_link.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/crud/entity_type.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/crud/event.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/crud/file_status.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/crud/metadata_descriptor.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/crud/milestone.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/crud/news.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/crud/notification.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/crud/organisation.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/crud/output_file.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/crud/output_type.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/crud/playlist.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/crud/preview_background_file.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/crud/preview_file.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/crud/project.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/crud/project_status.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/crud/schedule_item.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/crud/search_filter.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/crud/search_filter_group.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/crud/software.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/crud/status_automation.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/crud/studio.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/crud/subscription.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/crud/task_status.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/crud/task_type.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/crud/time_spent.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/crud/working_file.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/edits/__init__.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/edits/resources.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/entities/__init__.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/entities/resources.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/events/__init__.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/events/resources.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/export/__init__.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/export/csv/__init__.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/export/csv/assets.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/export/csv/base.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/export/csv/casting.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/export/csv/edits.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/export/csv/persons.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/export/csv/playlists.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/export/csv/projects.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/export/csv/shots.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/export/csv/task_types.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/export/csv/tasks.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/export/csv/time_spents.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/files/__init__.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/files/resources.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/index/__init__.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/index/resources.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/news/__init__.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/news/resources.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/persons/__init__.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/playlists/__init__.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/playlists/resources.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/previews/__init__.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/previews/resources.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/projects/__init__.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/projects/resources.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/search/__init__.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/search/resources.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/shots/__init__.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/source/__init__.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/source/csv/__init__.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/source/csv/assets.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/source/csv/base.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/source/csv/casting.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/source/csv/edits.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/source/csv/persons.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/source/csv/shots.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/source/csv/task_type_estimations.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/source/kitsu.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/source/otio.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/source/shotgun/__init__.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/source/shotgun/assets.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/source/shotgun/base.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/source/shotgun/episode.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/source/shotgun/exception.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/source/shotgun/import_errors.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/source/shotgun/notes.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/source/shotgun/person.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/source/shotgun/project.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/source/shotgun/scene.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/source/shotgun/sequence.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/source/shotgun/shot.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/source/shotgun/status.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/source/shotgun/steps.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/source/shotgun/tasks.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/source/shotgun/team.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/source/shotgun/versions.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/tasks/__init__.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/tasks/resources.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/user/__init__.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/blueprints/user/resources.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/file_trees/default.json +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/file_trees/simple.json +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/indexer/__init__.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/indexer/indexing.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/mixin.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/models/__init__.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/models/asset_instance.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/models/attachment_file.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/models/base.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/models/build_job.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/models/chat.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/models/chat_message.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/models/comment.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/models/custom_action.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/models/data_import_error.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/models/day_off.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/models/department.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/models/desktop_login_log.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/models/entity.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/models/entity_type.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/models/event.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/models/file_status.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/models/login_log.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/models/metadata_descriptor.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/models/milestone.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/models/news.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/models/notification.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/models/organisation.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/models/output_file.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/models/output_type.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/models/playlist.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/models/preview_background_file.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/models/preview_file.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/models/project.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/models/project_status.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/models/schedule_item.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/models/search_filter.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/models/search_filter_group.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/models/serializer.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/models/software.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/models/status_automation.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/models/studio.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/models/subscription.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/models/task.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/models/task_status.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/models/task_type.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/models/time_spent.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/models/working_file.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/services/__init__.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/services/auth_service.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/services/backup_service.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/services/base_service.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/services/chats_service.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/services/custom_actions_service.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/services/deletion_service.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/services/emails_service.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/services/entities_service.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/services/events_service.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/services/exception.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/services/file_tree_service.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/services/files_service.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/services/index_service.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/services/names_service.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/services/news_service.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/services/notifications_service.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/services/playlists_service.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/services/scenes_service.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/services/schedule_service.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/services/stats_service.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/services/status_automations_service.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/services/sync_service.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/services/telemetry_services.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/services/time_spents_service.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/stores/__init__.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/stores/auth_tokens_store.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/stores/file_store.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/stores/publisher_store.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/stores/queue_store.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/swagger.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/utils/__init__.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/utils/api.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/utils/auth.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/utils/cache.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/utils/chats.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/utils/colors.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/utils/commands.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/utils/csv_utils.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/utils/date_helpers.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/utils/dbhelpers.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/utils/emails.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/utils/env.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/utils/events.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/utils/fido.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/utils/fields.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/utils/flask.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/utils/fs.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/utils/git.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/utils/logs.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/utils/monitoring.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/utils/permissions.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/utils/query.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/utils/remote_job.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/utils/saml.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/utils/shell.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/utils/string.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/app/utils/thumbnail.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/cli.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/debug.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/event_stream.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/job_settings.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/README +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/__init__.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/alembic.ini +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/env.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/script.py.mako +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/utils/__init__.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/utils/base.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/003be8a91001_add_start_and_end_dates_to_projects.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/0596674df51d_add_department_mentions_to_comments.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/05ac7e8caa21_remove_unique_constraint_for_taskstatus_.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/05b7dc79a416_add_archived_fields_to_main_tables.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/0cf5e0e035fa_drop_column_tasktype_for_shots.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/0ec3762a745d_add_attachment_table.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/0ef6416a507b_.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/10cf267d95c9_fix_schedule_item.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/16328eae4b5f_add_new_constraint_for_timespent.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/16df47d76c64_add_some_indexes.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/17ef8f7be758_disallow_null_choicetype.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/1bb55759146f_add_table_studio.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/1cb44194db49_add_file_size_field_to_preview_file.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/1e150c2cea4d_add_nb_entities_out.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/1e2d77a2f0c4_add_hd_by_default_column.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/1fab8c420678_add_attachments_to_message_chats.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/20dfeb36142b_add_projecttaskstatuslink_roles_for_.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/23122f290ca2_add_entity_chat_models.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/269d41bfb73f_add_entity_entity_links.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/29df910f04a4_create_unique_constraint_project_id_.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/29fe01a6c9eb_add_status_automation_field.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/2adc020885fa_.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/2baede80b111_add_entity_status_field.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/306266361f4f_.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/328fd44c6347_add_entity_created_by.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/32f134ff1201_add_is_shared_flag_to_filters.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/346250b5304c_add_position_to_preview_files.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/3476e147e632_add_acks_to_comments.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/389cfb9de776_.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/38baa9a23b3d_.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/398150912a3f_validation_status_preview.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/3b0d1321079e_.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/3d5c93bafb9d_.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/3e0538ddf80f_.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/3fee3bd10f9d_.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/4095103c7d01_add_is_clients_isolated_flag_to_projects.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/40dea9555940_.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/42ec83db6a01_change_person_preferred_two_factor_.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/43d0cf0ed5e7_.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/443d1e78a932_.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/45c2de366e66_.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/45dafbb3f4e1_for_person_contract_type_disallow_null.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/4715c2586036_add_last_preview_file_fields.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/4e3738cdc34c_.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/4f2398ebcd49_.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/523ee9647bee_.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/54ee0d1d60ba_add_build_job_model.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/556526e47daa_.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/57222395f2be_add_statusautomation_import_last_revision.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/5798d2c9020b_change_person_role_to_choicetype.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/590aa1ffe731_add_notifications_enabled_flag.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/59a7445a966c_add_entity_is_shared.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/5a291251823c_add_max_retake_parameter.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/5ab9d7a75887_.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/5b0fcbb94f24_.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/5b7fa3e51701_add_is_client_allowed_flag_to_task_.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/5b980f0dc365_add_comment_links.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/5b9fd9ddfe43_add_homepage_and_contract_fields.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/5c0498e264bc_add_slack_fields.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/5e2ce62632a6_add_workflow_to_project.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/680c64565f9d_for_searchfiltergroup_is_shared.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/693cc511d28d_add_taskstatus_priority.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/6aa446ee4072_add_is_for_all_flage_to_playlists.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/6bd3b102d61b_.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/6c597e842afa_add_task_type_field_to_playlists.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/6d1b2c60f58b_add_milestone_model.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/6d7fa5a8e9a5_add_timesheets_locked_field_to_org.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/6eeaff945706_add_data_field_on_entity_links.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/6f6049877105_.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/7417c8eb70d8_add_for_entity_field_to_playlists.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/772a5e43f05b_.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/7748d3d22925_add_columns_to_searchfilter_table_to_.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/77d6820f494f_add_reply_to_notif.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/7b1f765677d8_.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/7bc746997e8d_add_slack_token_field_to_organisation.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/7dc79d4ed7cd_.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/818f7bda2528_.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/82e7f7a95e84_add_project_id_to_events.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/82ee682204ab_add_is_generated_from_ldap_column_to_.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/8588f254d6b8_add_archived_fields.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/8739ae9fa28b_add_for_client_field.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/87efceb6745b_add_ready_for_to_entity.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/892b264937ec_.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/8a1b4a1b7f4a_add_totp_columns_for_person.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/8e4f39e321f4_add_day_off_table.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/8e67c183bed7_add_preference_fields.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/8fbd40afbe5f_allow_to_set_float_values_for_.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/9010a64e5a2d_add_indices.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/9060dd4f6116_notification_uc.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/925771029620_.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/92b40d79ad3f_allow_message_attachments.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/92bdfe07e5f5_discord_integration.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/956659992419_add_columns_for_person_to_store_fido_.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/96c79d31e648_add_mail_otp_columns_for_person.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/96f58a4a2a58_person_partial_index_for_email_only_.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/971dbf5a0faf_add_short_name_for_asset_type_entity_.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/98c90621cf58_add_for_client_flag_to_playlist.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/99825b9cc778_.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/9a09467f9b2c_.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/9b85c14fa8a7_add_day_off_new_columns.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/9bd17364fc18_.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/9d3bb33c6fc6_add_department_keys_to_filter_models.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/9e5b3a9b0cee_add_new_column_metadatadescriptor_data_type_.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/9f8445f9b42c_add_man_days_fields.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/a23682ccc1f1_.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/a252a094e977_add_descriptions_for_entities_tasks_and_.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/a519c710877c_.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/a65bdadbae2f_.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/a66508788c53_add_nb_assets_ready.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/a6c25eed3ea1_add_login_failed_attemps_and_last_login_.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/a7c43f3fbc76_add_duration_column_to_the_preview_file.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/aa0a60033106_feedback_request.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/addbbefa7028_add_departments_link_to_metadata_.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/ae0127f2fc56_add_previewfile_width_and_previewfile_.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/af1790868e2c_.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/b45cb782bb9c_.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/b4dd0add5f79_.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/b8c0a0f9d054_drop_task_status_is_reviewable.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/b8ed0fb263f8_add_person_jti_and_jti_expiration_date.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/b97a71306fc8_add_is_casting_standby_column_to_entity.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/be56dc0fb760_for_is_shared_disallow_nullable.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/bf1347acdee2_.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/c49e41f1298b_add_previewbackground.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/c68c2a62cfac_add_mimetype_column_to_attachment.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/c726b98be194_.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/c81f3e83bdb5_.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/ca28796a2a62_add_is_done_field_to_the_task_model.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/cf3d365de164_add_entity_version_model.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/cf6cec6d6bf5_add_status_field_to_preview_file.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/d80267806131_task_status_new_column_is_default.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/d8dcd5196d57_add_casting_label.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/de8a3de227ef_.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/deeacd38d373_for_projecttaskstatuslink_set_default_.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/df1834485f57_.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/df9f8a147e80_change_file_size_to_big_integer.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/e1ef93f40d3d_.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/e29638428dfd_add_schedule_item_table.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/e3f6db74cc1e_.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/e839d6603c09_add_person_id_to_shot_history.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/ee2373fbe3a4_.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/f0567e8d0c62_.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/f0c6cbb61869_add_production_style_field.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/f344b867a911_for_description_of_entity_task_working_.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/f4ff5a73d283_add_person_ldap_uid.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/f5b113876a49_add_preferred_two_factor_authentication_.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/f5bdca075cdc_add_preview_download_flag_to_projects.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/f874ad5e898a_add_link_entity_type_task_type.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/f995b28fb749_.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/fb6b6f188497_.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/fb87feaaa094_add_missing_unique_constraints.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/fc322f908695_.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/fee7c696166e_.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/feffd3c5b806_introduce_concepts.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/migrations/versions/ffeed4956ab1_add_more_details_to_projects.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/remote/__init__.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/remote/config_payload.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/remote/normalize_movie.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/remote/playlist.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/utils/__init__.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou/utils/movie.py +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou.egg-info/SOURCES.txt +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou.egg-info/dependency_links.txt +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou.egg-info/entry_points.txt +0 -0
- {zou-0.19.67 → zou-0.19.69}/zou.egg-info/not-zip-safe +0 -0
- {zou-0.19.67 → zou-0.19.69}/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.69
|
|
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
|
|
@@ -27,7 +27,7 @@ Requires-Dist: click==8.1.7
|
|
|
27
27
|
Requires-Dist: discord.py==2.4.0
|
|
28
28
|
Requires-Dist: email-validator==2.2.0
|
|
29
29
|
Requires-Dist: ffmpeg-python==0.2.0
|
|
30
|
-
Requires-Dist: fido2==1.
|
|
30
|
+
Requires-Dist: fido2==1.2.0
|
|
31
31
|
Requires-Dist: flasgger==0.9.7.1
|
|
32
32
|
Requires-Dist: flask_bcrypt==1.0.1
|
|
33
33
|
Requires-Dist: flask_caching==2.3.0
|
|
@@ -41,7 +41,7 @@ Requires-Dist: flask-jwt-extended==4.7.1
|
|
|
41
41
|
Requires-Dist: flask-migrate==4.0.7
|
|
42
42
|
Requires-Dist: flask-socketio==5.4.1
|
|
43
43
|
Requires-Dist: flask==3.1.0
|
|
44
|
-
Requires-Dist: gazu==0.10.
|
|
44
|
+
Requires-Dist: gazu==0.10.20
|
|
45
45
|
Requires-Dist: gevent-websocket==0.10.1
|
|
46
46
|
Requires-Dist: gevent==24.11.1
|
|
47
47
|
Requires-Dist: gunicorn==23.0.0
|
|
@@ -50,13 +50,13 @@ Requires-Dist: itsdangerous==2.2.0
|
|
|
50
50
|
Requires-Dist: Jinja2==3.1.4
|
|
51
51
|
Requires-Dist: ldap3==2.9.1
|
|
52
52
|
Requires-Dist: matterhook==0.2
|
|
53
|
-
Requires-Dist: meilisearch==0.
|
|
53
|
+
Requires-Dist: meilisearch==0.32.0
|
|
54
54
|
Requires-Dist: numpy==2.0.1; python_version == "3.9"
|
|
55
55
|
Requires-Dist: numpy==2.1.3; 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.
|
|
59
|
+
Requires-Dist: orjson==3.10.12
|
|
60
60
|
Requires-Dist: pillow==11.0.0
|
|
61
61
|
Requires-Dist: psutil==6.1.0
|
|
62
62
|
Requires-Dist: psycopg[binary]==3.2.3
|
|
@@ -72,7 +72,7 @@ Requires-Dist: rq==2.0.0
|
|
|
72
72
|
Requires-Dist: slackclient==2.9.4
|
|
73
73
|
Requires-Dist: sqlalchemy_utils==0.41.2
|
|
74
74
|
Requires-Dist: sqlalchemy==2.0.36
|
|
75
|
-
Requires-Dist: ua-parser==0.
|
|
75
|
+
Requires-Dist: ua-parser==1.0.0
|
|
76
76
|
Requires-Dist: werkzeug==3.1.3
|
|
77
77
|
Provides-Extra: prod
|
|
78
78
|
Requires-Dist: gunicorn; extra == "prod"
|
|
@@ -87,7 +87,7 @@ Requires-Dist: pytest==8.3.3; extra == "test"
|
|
|
87
87
|
Provides-Extra: monitoring
|
|
88
88
|
Requires-Dist: prometheus-flask-exporter==0.23.1; extra == "monitoring"
|
|
89
89
|
Requires-Dist: pygelf==0.4.2; extra == "monitoring"
|
|
90
|
-
Requires-Dist: sentry-sdk==2.
|
|
90
|
+
Requires-Dist: sentry-sdk==2.19.0; extra == "monitoring"
|
|
91
91
|
Provides-Extra: lint
|
|
92
92
|
Requires-Dist: autoflake==2.3.1; extra == "lint"
|
|
93
93
|
Requires-Dist: black==24.10.0; extra == "lint"
|
|
@@ -33,7 +33,7 @@ install_requires =
|
|
|
33
33
|
discord.py==2.4.0
|
|
34
34
|
email-validator==2.2.0
|
|
35
35
|
ffmpeg-python==0.2.0
|
|
36
|
-
fido2==1.
|
|
36
|
+
fido2==1.2.0
|
|
37
37
|
flasgger==0.9.7.1
|
|
38
38
|
flask_bcrypt==1.0.1
|
|
39
39
|
flask_caching==2.3.0
|
|
@@ -47,7 +47,7 @@ install_requires =
|
|
|
47
47
|
flask-migrate==4.0.7
|
|
48
48
|
flask-socketio==5.4.1
|
|
49
49
|
flask==3.1.0
|
|
50
|
-
gazu==0.10.
|
|
50
|
+
gazu==0.10.20
|
|
51
51
|
gevent-websocket==0.10.1
|
|
52
52
|
gevent==24.11.1
|
|
53
53
|
gunicorn==23.0.0
|
|
@@ -56,13 +56,13 @@ install_requires =
|
|
|
56
56
|
Jinja2==3.1.4
|
|
57
57
|
ldap3==2.9.1
|
|
58
58
|
matterhook==0.2
|
|
59
|
-
meilisearch==0.
|
|
59
|
+
meilisearch==0.32.0
|
|
60
60
|
numpy==2.0.1; python_version == '3.9'
|
|
61
61
|
numpy==2.1.3; python_version >= '3.10'
|
|
62
62
|
opencv-python==4.10.0.84
|
|
63
63
|
OpenTimelineIO==0.17.0
|
|
64
64
|
OpenTimelineIO-Plugins==0.17.0
|
|
65
|
-
orjson==3.10.
|
|
65
|
+
orjson==3.10.12
|
|
66
66
|
pillow==11.0.0
|
|
67
67
|
psutil==6.1.0
|
|
68
68
|
psycopg[binary]==3.2.3
|
|
@@ -78,7 +78,7 @@ install_requires =
|
|
|
78
78
|
slackclient==2.9.4
|
|
79
79
|
sqlalchemy_utils==0.41.2
|
|
80
80
|
sqlalchemy==2.0.36
|
|
81
|
-
ua-parser==0.
|
|
81
|
+
ua-parser==1.0.0
|
|
82
82
|
werkzeug==3.1.3
|
|
83
83
|
|
|
84
84
|
[options.package_data]
|
|
@@ -101,7 +101,7 @@ test =
|
|
|
101
101
|
monitoring =
|
|
102
102
|
prometheus-flask-exporter==0.23.1
|
|
103
103
|
pygelf==0.4.2
|
|
104
|
-
sentry-sdk==2.
|
|
104
|
+
sentry-sdk==2.19.0
|
|
105
105
|
lint =
|
|
106
106
|
autoflake==2.3.1
|
|
107
107
|
black==24.10.0
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "0.19.69"
|
|
@@ -1362,8 +1362,22 @@ class SAMLSSOResource(Resource, ArgsMixin):
|
|
|
1362
1362
|
authn_response.get_identity()
|
|
1363
1363
|
email = authn_response.get_subject().text
|
|
1364
1364
|
person_info = {
|
|
1365
|
-
k:
|
|
1365
|
+
k: (
|
|
1366
|
+
" ".join(v)
|
|
1367
|
+
if isinstance(v, list) and k in ["first_name", "last_name"]
|
|
1368
|
+
else v
|
|
1369
|
+
)
|
|
1366
1370
|
for k, v in authn_response.ava.items()
|
|
1371
|
+
if k
|
|
1372
|
+
in [
|
|
1373
|
+
"first_name",
|
|
1374
|
+
"last_name",
|
|
1375
|
+
"phone",
|
|
1376
|
+
"role",
|
|
1377
|
+
"departments",
|
|
1378
|
+
"studio_id",
|
|
1379
|
+
"active",
|
|
1380
|
+
]
|
|
1367
1381
|
}
|
|
1368
1382
|
try:
|
|
1369
1383
|
user = persons_service.get_person_by_email(email)
|
|
@@ -435,8 +435,8 @@ class CommentManyTasksResource(Resource):
|
|
|
435
435
|
allowed_comments = []
|
|
436
436
|
for comment in comments:
|
|
437
437
|
try:
|
|
438
|
-
task = tasks_service.
|
|
439
|
-
comment["object_id"],
|
|
438
|
+
task = tasks_service.get_task(
|
|
439
|
+
comment["object_id"], relations=True
|
|
440
440
|
)
|
|
441
441
|
if (
|
|
442
442
|
person["role"] == "supervisor"
|
|
@@ -13,7 +13,6 @@ from zou.app.mixin import ArgsMixin
|
|
|
13
13
|
from zou.app.utils import events, fields, permissions, query
|
|
14
14
|
from zou.app.services.exception import (
|
|
15
15
|
WrongParameterException,
|
|
16
|
-
WrongParameterException,
|
|
17
16
|
)
|
|
18
17
|
|
|
19
18
|
|
|
@@ -259,14 +258,6 @@ class BaseModelsResource(Resource, ArgsMixin):
|
|
|
259
258
|
current_app.logger.error(str(exception), exc_info=1)
|
|
260
259
|
return {"message": str(exception)}, 400
|
|
261
260
|
|
|
262
|
-
except WrongParameterException as exception:
|
|
263
|
-
current_app.logger.error(str(exception), exc_info=1)
|
|
264
|
-
return (
|
|
265
|
-
exception.dict
|
|
266
|
-
if exception.dict is not None
|
|
267
|
-
else {"message": str(exception)}
|
|
268
|
-
), 400
|
|
269
|
-
|
|
270
261
|
def emit_create_event(self, instance_dict):
|
|
271
262
|
return events.emit(
|
|
272
263
|
"%s:new" % self.model.__tablename__.replace("_", "-"),
|
|
@@ -290,6 +281,10 @@ class BaseModelResource(Resource, ArgsMixin):
|
|
|
290
281
|
abort(404)
|
|
291
282
|
return instance
|
|
292
283
|
|
|
284
|
+
def get_serialized_instance(self, instance_id, relations=True):
|
|
285
|
+
instance = self.get_model_or_404(instance_id)
|
|
286
|
+
return self.serialize_instance(instance, relations=relations)
|
|
287
|
+
|
|
293
288
|
def check_read_permissions(self, instance_dict):
|
|
294
289
|
return permissions.check_admin_permissions()
|
|
295
290
|
|
|
@@ -338,8 +333,9 @@ class BaseModelResource(Resource, ArgsMixin):
|
|
|
338
333
|
"""
|
|
339
334
|
relations = self.get_bool_parameter("relations", "true")
|
|
340
335
|
try:
|
|
341
|
-
|
|
342
|
-
|
|
336
|
+
result = self.get_serialized_instance(
|
|
337
|
+
instance_id, relations=relations
|
|
338
|
+
)
|
|
343
339
|
self.check_read_permissions(result)
|
|
344
340
|
result = self.clean_get_result(result)
|
|
345
341
|
|
|
@@ -430,14 +426,6 @@ class BaseModelResource(Resource, ArgsMixin):
|
|
|
430
426
|
current_app.logger.error(str(exception), exc_info=1)
|
|
431
427
|
return {"message": str(exception)}, 400
|
|
432
428
|
|
|
433
|
-
except WrongParameterException as exception:
|
|
434
|
-
current_app.logger.error(str(exception), exc_info=1)
|
|
435
|
-
return (
|
|
436
|
-
exception.dict
|
|
437
|
-
if exception.dict is not None
|
|
438
|
-
else {"message": str(exception)}
|
|
439
|
-
), 400
|
|
440
|
-
|
|
441
429
|
@jwt_required()
|
|
442
430
|
def delete(self, instance_id):
|
|
443
431
|
"""
|
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
from flask_jwt_extended import jwt_required
|
|
2
|
-
from flask import current_app
|
|
3
2
|
|
|
4
|
-
from sqlalchemy.exc import StatementError
|
|
5
3
|
|
|
6
4
|
from zou.app.models.comment import Comment
|
|
7
5
|
from zou.app.models.attachment_file import AttachmentFile
|
|
@@ -19,10 +17,6 @@ from zou.app.utils import events, permissions
|
|
|
19
17
|
|
|
20
18
|
from zou.app.blueprints.crud.base import BaseModelResource, BaseModelsResource
|
|
21
19
|
|
|
22
|
-
from zou.app.services.exception import (
|
|
23
|
-
CommentNotFoundException,
|
|
24
|
-
)
|
|
25
|
-
|
|
26
20
|
|
|
27
21
|
class CommentsResource(BaseModelsResource):
|
|
28
22
|
def __init__(self):
|
|
@@ -47,25 +41,8 @@ class CommentResource(BaseModelResource):
|
|
|
47
41
|
BaseModelResource.__init__(self, Comment)
|
|
48
42
|
self.protected_fields += ["mentions", "department_mentions"]
|
|
49
43
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
"""
|
|
53
|
-
Retrieve a model corresponding at given ID and return it as a JSON
|
|
54
|
-
object.
|
|
55
|
-
"""
|
|
56
|
-
try:
|
|
57
|
-
instance = tasks_service.get_comment_with_relations(instance_id)
|
|
58
|
-
self.check_read_permissions(instance)
|
|
59
|
-
result = self.clean_get_result(instance)
|
|
60
|
-
|
|
61
|
-
except StatementError as exception:
|
|
62
|
-
current_app.logger.error(str(exception), exc_info=1)
|
|
63
|
-
return {"message": str(exception)}, 400
|
|
64
|
-
|
|
65
|
-
except ValueError:
|
|
66
|
-
raise CommentNotFoundException
|
|
67
|
-
|
|
68
|
-
return result, 200
|
|
44
|
+
def get_serialized_instance(self, instance_id, relations=True):
|
|
45
|
+
return tasks_service.get_comment(instance_id, relations=relations)
|
|
69
46
|
|
|
70
47
|
def clean_get_result(self, result):
|
|
71
48
|
if permissions.has_client_permissions():
|
|
@@ -123,8 +100,8 @@ class CommentResource(BaseModelResource):
|
|
|
123
100
|
instance["object_id"], relations=True
|
|
124
101
|
)
|
|
125
102
|
task_type = tasks_service.get_task_type(task["task_type_id"])
|
|
126
|
-
project = projects_service.
|
|
127
|
-
task["project_id"]
|
|
103
|
+
project = projects_service.get_project(
|
|
104
|
+
task["project_id"], relations=True
|
|
128
105
|
)
|
|
129
106
|
current_user = persons_service.get_current_user(relations=True)
|
|
130
107
|
if current_user["id"] not in project["team"]:
|
|
@@ -97,6 +97,8 @@ class PersonsResource(BaseModelsResource):
|
|
|
97
97
|
raise WrongParameterException(
|
|
98
98
|
"Expiration date can't be in the past."
|
|
99
99
|
)
|
|
100
|
+
except WrongParameterException:
|
|
101
|
+
raise
|
|
100
102
|
except:
|
|
101
103
|
raise WrongParameterException("Expiration date is not valid.")
|
|
102
104
|
return data
|
|
@@ -178,6 +180,8 @@ class PersonResource(BaseModelResource, ArgsMixin):
|
|
|
178
180
|
raise WrongParameterException(
|
|
179
181
|
"Expiration date can't be in the past."
|
|
180
182
|
)
|
|
183
|
+
except WrongParameterException:
|
|
184
|
+
raise
|
|
181
185
|
except:
|
|
182
186
|
raise WrongParameterException("Expiration date is not valid.")
|
|
183
187
|
return data
|
|
@@ -116,7 +116,10 @@ class TasksResource(BaseModelsResource, ArgsMixin):
|
|
|
116
116
|
instance.save()
|
|
117
117
|
self.emit_create_event(instance.serialize())
|
|
118
118
|
|
|
119
|
-
return
|
|
119
|
+
return (
|
|
120
|
+
tasks_service.get_task(str(instance.id), relations=True),
|
|
121
|
+
201,
|
|
122
|
+
)
|
|
120
123
|
|
|
121
124
|
except TypeError as exception:
|
|
122
125
|
current_app.logger.error(str(exception), exc_info=1)
|
|
@@ -30,7 +30,6 @@ from zou.app.services.exception import (
|
|
|
30
30
|
UnactiveUserException,
|
|
31
31
|
TwoFactorAuthenticationNotEnabledException,
|
|
32
32
|
PersonInProtectedAccounts,
|
|
33
|
-
WrongParameterException,
|
|
34
33
|
)
|
|
35
34
|
from zou.app.services.auth_service import (
|
|
36
35
|
disable_two_factor_authentication_for_person,
|
|
@@ -158,6 +158,7 @@ CRISP_TOKEN = os.getenv("CRISP_TOKEN", "")
|
|
|
158
158
|
IS_SELF_HOSTED = envtobool("IS_SELF_HOSTED", True)
|
|
159
159
|
|
|
160
160
|
DEFAULT_TIMEZONE = os.getenv("DEFAULT_TIMEZONE", "Europe/Paris")
|
|
161
|
+
DEFAULT_LOCALE = os.getenv("DEFAULT_LOCALE", "en_US")
|
|
161
162
|
|
|
162
163
|
USER_LIMIT = int(os.getenv("USER_LIMIT", "100"))
|
|
163
164
|
MIN_PASSWORD_LENGTH = int(os.getenv("MIN_PASSWORD_LENGTH", 8))
|
|
@@ -94,7 +94,7 @@ class Person(db.Model, BaseMixin, SerializerMixin):
|
|
|
94
94
|
TimezoneType(backend="pytz"),
|
|
95
95
|
default=pytz_timezone(config.DEFAULT_TIMEZONE),
|
|
96
96
|
)
|
|
97
|
-
locale = db.Column(LocaleType, default=Locale(
|
|
97
|
+
locale = db.Column(LocaleType, default=Locale(config.DEFAULT_LOCALE))
|
|
98
98
|
data = db.Column(JSONB)
|
|
99
99
|
role = db.Column(ChoiceType(ROLE_TYPES), default="user", nullable=False)
|
|
100
100
|
has_avatar = db.Column(db.Boolean(), default=False)
|
|
@@ -40,7 +40,7 @@ from zou.app.services.exception import (
|
|
|
40
40
|
|
|
41
41
|
def clear_asset_cache(asset_id):
|
|
42
42
|
cache.cache.delete_memoized(get_asset, asset_id)
|
|
43
|
-
cache.cache.delete_memoized(
|
|
43
|
+
cache.cache.delete_memoized(get_asset, asset_id, True)
|
|
44
44
|
cache.cache.delete_memoized(get_full_asset, asset_id)
|
|
45
45
|
|
|
46
46
|
|
|
@@ -416,19 +416,13 @@ def get_asset_raw(entity_id):
|
|
|
416
416
|
|
|
417
417
|
|
|
418
418
|
@cache.memoize_function(120)
|
|
419
|
-
def get_asset(entity_id):
|
|
419
|
+
def get_asset(entity_id, relations=False):
|
|
420
420
|
"""
|
|
421
421
|
Return a given asset as a dict.
|
|
422
422
|
"""
|
|
423
|
-
return get_asset_raw(entity_id).serialize(
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
@cache.memoize_function(120)
|
|
427
|
-
def get_asset_with_relations(entity_id):
|
|
428
|
-
"""
|
|
429
|
-
Return a given asset as a dict.
|
|
430
|
-
"""
|
|
431
|
-
return get_asset_raw(entity_id).serialize(obj_type="Asset", relations=True)
|
|
423
|
+
return get_asset_raw(entity_id).serialize(
|
|
424
|
+
obj_type="Asset", relations=relations
|
|
425
|
+
)
|
|
432
426
|
|
|
433
427
|
|
|
434
428
|
def get_asset_by_shotgun_id(shotgun_id):
|
|
@@ -458,7 +452,7 @@ def get_full_asset(asset_id):
|
|
|
458
452
|
"""
|
|
459
453
|
assets = get_assets_and_tasks({"id": asset_id}, with_episode_ids=True)
|
|
460
454
|
if len(assets) > 0:
|
|
461
|
-
asset =
|
|
455
|
+
asset = get_asset(asset_id, relations=True)
|
|
462
456
|
asset_type_id = asset["entity_type_id"]
|
|
463
457
|
asset_type = get_asset_type(asset_type_id)
|
|
464
458
|
project = Project.get(asset["project_id"])
|
|
@@ -414,7 +414,7 @@ def _create_episode_casting_link(entity, asset_id, nb_occurences=1, label=""):
|
|
|
414
414
|
link = EntityLink.create(
|
|
415
415
|
entity_in_id=sequence["parent_id"],
|
|
416
416
|
entity_out_id=asset_id,
|
|
417
|
-
nb_occurences=
|
|
417
|
+
nb_occurences=nb_occurences,
|
|
418
418
|
label=label,
|
|
419
419
|
)
|
|
420
420
|
events.emit(
|
|
@@ -82,7 +82,7 @@ def create_comment(
|
|
|
82
82
|
"""
|
|
83
83
|
Create a new comment and related: news, notifications and events.
|
|
84
84
|
"""
|
|
85
|
-
task = tasks_service.
|
|
85
|
+
task = tasks_service.get_task(task_id, relations=True)
|
|
86
86
|
task_status = tasks_service.get_task_status(task_status_id)
|
|
87
87
|
author = _get_comment_author(person_id)
|
|
88
88
|
_check_retake_capping(task_status, task)
|
|
@@ -33,7 +33,7 @@ from zou.app.services.exception import (
|
|
|
33
33
|
|
|
34
34
|
def clear_concept_cache(concept_id):
|
|
35
35
|
cache.cache.delete_memoized(get_concept, concept_id)
|
|
36
|
-
cache.cache.delete_memoized(
|
|
36
|
+
cache.cache.delete_memoized(get_concept, concept_id, True)
|
|
37
37
|
cache.cache.delete_memoized(get_full_concept, concept_id)
|
|
38
38
|
|
|
39
39
|
|
|
@@ -61,23 +61,15 @@ def get_concept_raw(concept_id):
|
|
|
61
61
|
|
|
62
62
|
|
|
63
63
|
@cache.memoize_function(120)
|
|
64
|
-
def
|
|
64
|
+
def get_concept(concept_id, relations=False):
|
|
65
65
|
"""
|
|
66
66
|
Return given concept as a dictionary.
|
|
67
67
|
"""
|
|
68
68
|
return get_concept_raw(concept_id).serialize(
|
|
69
|
-
obj_type="Concept", relations=
|
|
69
|
+
obj_type="Concept", relations=relations
|
|
70
70
|
)
|
|
71
71
|
|
|
72
72
|
|
|
73
|
-
@cache.memoize_function(120)
|
|
74
|
-
def get_concept(concept_id):
|
|
75
|
-
"""
|
|
76
|
-
Return given concept as a dictionary.
|
|
77
|
-
"""
|
|
78
|
-
return get_concept_raw(concept_id).serialize(obj_type="Concept")
|
|
79
|
-
|
|
80
|
-
|
|
81
73
|
@cache.memoize_function(120)
|
|
82
74
|
def get_full_concept(concept_id):
|
|
83
75
|
"""
|
|
@@ -86,7 +78,7 @@ def get_full_concept(concept_id):
|
|
|
86
78
|
concepts = get_concepts_and_tasks({"id": concept_id})
|
|
87
79
|
if len(concepts) > 0:
|
|
88
80
|
concept = concepts[0]
|
|
89
|
-
concept.update(
|
|
81
|
+
concept.update(get_concept(concept_id, relations=True))
|
|
90
82
|
return concept
|
|
91
83
|
else:
|
|
92
84
|
raise ConceptNotFoundException
|
|
@@ -33,7 +33,7 @@ from zou.app.services.exception import (
|
|
|
33
33
|
|
|
34
34
|
def clear_edit_cache(edit_id):
|
|
35
35
|
cache.cache.delete_memoized(get_edit, edit_id)
|
|
36
|
-
cache.cache.delete_memoized(
|
|
36
|
+
cache.cache.delete_memoized(get_edit, edit_id, True)
|
|
37
37
|
cache.cache.delete_memoized(get_full_edit, edit_id)
|
|
38
38
|
|
|
39
39
|
|
|
@@ -241,19 +241,13 @@ def get_edit_raw(edit_id):
|
|
|
241
241
|
|
|
242
242
|
|
|
243
243
|
@cache.memoize_function(120)
|
|
244
|
-
def get_edit(edit_id):
|
|
244
|
+
def get_edit(edit_id, relations=False):
|
|
245
245
|
"""
|
|
246
246
|
Return given edit as a dictionary.
|
|
247
247
|
"""
|
|
248
|
-
return get_edit_raw(edit_id).serialize(
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
@cache.memoize_function(120)
|
|
252
|
-
def get_edit_with_relations(edit_id):
|
|
253
|
-
"""
|
|
254
|
-
Return given edit as a dictionary.
|
|
255
|
-
"""
|
|
256
|
-
return get_edit_raw(edit_id).serialize(obj_type="Edit", relations=True)
|
|
248
|
+
return get_edit_raw(edit_id).serialize(
|
|
249
|
+
obj_type="Edit", relations=relations
|
|
250
|
+
)
|
|
257
251
|
|
|
258
252
|
|
|
259
253
|
@cache.memoize_function(120)
|
|
@@ -230,6 +230,8 @@ def create_person(
|
|
|
230
230
|
raise WrongParameterException(
|
|
231
231
|
"Expiration date can't be in the past."
|
|
232
232
|
)
|
|
233
|
+
except WrongParameterException:
|
|
234
|
+
raise
|
|
233
235
|
except:
|
|
234
236
|
raise WrongParameterException("Expiration date is not valid.")
|
|
235
237
|
|
|
@@ -310,6 +312,8 @@ def update_person(person_id, data, bypass_protected_accounts=False):
|
|
|
310
312
|
raise WrongParameterException(
|
|
311
313
|
"Expiration date can't be in the past."
|
|
312
314
|
)
|
|
315
|
+
except WrongParameterException:
|
|
316
|
+
raise
|
|
313
317
|
except:
|
|
314
318
|
raise WrongParameterException("Expiration date is not valid.")
|
|
315
319
|
|
|
@@ -89,7 +89,7 @@ def _is_valid_partial_resolution(resolution):
|
|
|
89
89
|
return resolution is not None and bool(re.match(r"x\d{3,4}", resolution))
|
|
90
90
|
|
|
91
91
|
|
|
92
|
-
def get_preview_file_fps(project):
|
|
92
|
+
def get_preview_file_fps(project, entity=None):
|
|
93
93
|
"""
|
|
94
94
|
Return fps set at project level or default fps if the dimensions are not
|
|
95
95
|
set.
|
|
@@ -97,6 +97,12 @@ def get_preview_file_fps(project):
|
|
|
97
97
|
fps = "25.00"
|
|
98
98
|
if project.get("fps", None) is not None:
|
|
99
99
|
fps = project["fps"].replace(",", ".")
|
|
100
|
+
|
|
101
|
+
if entity is not None:
|
|
102
|
+
entity_data = entity.get("data", {}) or {}
|
|
103
|
+
if entity_data.get("fps", None) is not None:
|
|
104
|
+
fps = entity_data["fps"].replace(",", ".")
|
|
105
|
+
|
|
100
106
|
return "%.3f" % float(fps)
|
|
101
107
|
|
|
102
108
|
|
|
@@ -193,7 +199,7 @@ def prepare_and_store_movie(
|
|
|
193
199
|
preview_file = set_preview_file_as_broken(preview_file_id)
|
|
194
200
|
return preview_file
|
|
195
201
|
|
|
196
|
-
fps = get_preview_file_fps(project)
|
|
202
|
+
fps = get_preview_file_fps(project, entity)
|
|
197
203
|
(width, height) = get_preview_file_dimensions(project, entity)
|
|
198
204
|
|
|
199
205
|
if normalize:
|
|
@@ -619,7 +625,9 @@ def extract_frame_from_preview_file(preview_file, frame_number):
|
|
|
619
625
|
else:
|
|
620
626
|
raise PreviewFileNotFoundException
|
|
621
627
|
|
|
622
|
-
fps = get_preview_file_fps(
|
|
628
|
+
fps = get_preview_file_fps(
|
|
629
|
+
project, get_entity_from_preview_file(preview_file["id"])
|
|
630
|
+
)
|
|
623
631
|
extracted_frame_path = movie.extract_frame_from_movie(
|
|
624
632
|
preview_file_path, frame_number, fps
|
|
625
633
|
)
|
|
@@ -650,7 +658,7 @@ def extract_tile_from_preview_file(preview_file):
|
|
|
650
658
|
extracted_tile_path = movie.generate_tile(preview_file_path)
|
|
651
659
|
return extracted_tile_path
|
|
652
660
|
else:
|
|
653
|
-
|
|
661
|
+
raise WrongParameterException("Preview file is not a movie")
|
|
654
662
|
|
|
655
663
|
|
|
656
664
|
def reset_movie_files_metadata():
|
|
@@ -38,7 +38,7 @@ from sqlalchemy import or_
|
|
|
38
38
|
|
|
39
39
|
def clear_project_cache(project_id):
|
|
40
40
|
cache.cache.delete_memoized(get_project, project_id)
|
|
41
|
-
cache.cache.delete_memoized(
|
|
41
|
+
cache.cache.delete_memoized(get_project, project_id, True)
|
|
42
42
|
cache.cache.delete_memoized(get_project_by_name)
|
|
43
43
|
cache.cache.delete_memoized(open_projects)
|
|
44
44
|
|
|
@@ -259,21 +259,12 @@ def get_project_raw(project_id):
|
|
|
259
259
|
|
|
260
260
|
|
|
261
261
|
@cache.memoize_function(240)
|
|
262
|
-
def get_project(project_id):
|
|
262
|
+
def get_project(project_id, relations=False):
|
|
263
263
|
"""
|
|
264
264
|
Get project matching given id, as a dict. Raises an exception if project is
|
|
265
265
|
not found.
|
|
266
266
|
"""
|
|
267
|
-
return get_project_raw(project_id).serialize()
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
@cache.memoize_function(240)
|
|
271
|
-
def get_project_with_relations(project_id):
|
|
272
|
-
"""
|
|
273
|
-
Get project matching given id, as a dict. Raises an exception if project is
|
|
274
|
-
not found.
|
|
275
|
-
"""
|
|
276
|
-
return get_project_raw(project_id).serialize(relations=True)
|
|
267
|
+
return get_project_raw(project_id).serialize(relations=relations)
|
|
277
268
|
|
|
278
269
|
|
|
279
270
|
@cache.memoize_function(120)
|
|
@@ -487,7 +478,7 @@ def add_metadata_descriptor(
|
|
|
487
478
|
field_name=slugify.slugify(name, separator="_"),
|
|
488
479
|
)
|
|
489
480
|
except Exception:
|
|
490
|
-
raise WrongParameterException
|
|
481
|
+
raise WrongParameterException("Metadata descriptor already exists.")
|
|
491
482
|
events.emit(
|
|
492
483
|
"metadata-descriptor:new",
|
|
493
484
|
{"metadata_descriptor_id": str(descriptor.id)},
|
|
@@ -50,7 +50,7 @@ from zou.app.services.exception import (
|
|
|
50
50
|
|
|
51
51
|
def clear_shot_cache(shot_id):
|
|
52
52
|
cache.cache.delete_memoized(get_shot, shot_id)
|
|
53
|
-
cache.cache.delete_memoized(
|
|
53
|
+
cache.cache.delete_memoized(get_shot, shot_id, True)
|
|
54
54
|
cache.cache.delete_memoized(get_full_shot, shot_id)
|
|
55
55
|
|
|
56
56
|
|
|
@@ -402,19 +402,13 @@ def get_shot_raw(shot_id):
|
|
|
402
402
|
|
|
403
403
|
|
|
404
404
|
@cache.memoize_function(120)
|
|
405
|
-
def get_shot(shot_id):
|
|
405
|
+
def get_shot(shot_id, relations=False):
|
|
406
406
|
"""
|
|
407
407
|
Return given shot as a dictionary.
|
|
408
408
|
"""
|
|
409
|
-
return get_shot_raw(shot_id).serialize(
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
@cache.memoize_function(120)
|
|
413
|
-
def get_shot_with_relations(shot_id):
|
|
414
|
-
"""
|
|
415
|
-
Return given shot as a dictionary.
|
|
416
|
-
"""
|
|
417
|
-
return get_shot_raw(shot_id).serialize(obj_type="Shot", relations=True)
|
|
409
|
+
return get_shot_raw(shot_id).serialize(
|
|
410
|
+
obj_type="Shot", relations=relations
|
|
411
|
+
)
|
|
418
412
|
|
|
419
413
|
|
|
420
414
|
@cache.memoize_function(120)
|
|
@@ -426,7 +420,7 @@ def get_full_shot(shot_id):
|
|
|
426
420
|
shots = get_shots_and_tasks({"id": shot_id})
|
|
427
421
|
if len(shots) > 0:
|
|
428
422
|
shot = shots[0]
|
|
429
|
-
shot.update(
|
|
423
|
+
shot.update(get_shot(shot_id, relations=True))
|
|
430
424
|
return shot
|
|
431
425
|
else:
|
|
432
426
|
raise ShotNotFoundException
|