zou 0.20.45__tar.gz → 0.20.47__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.45/zou.egg-info → zou-0.20.47}/PKG-INFO +1 -1
- zou-0.20.47/zou/__init__.py +1 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/crud/person.py +14 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/projects/__init__.py +5 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/projects/resources.py +32 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/config.py +1 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/services/time_spents_service.py +36 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/utils/auth.py +6 -2
- {zou-0.20.45 → zou-0.20.47}/zou/cli.py +2 -2
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/d80f02824047_add_plugin_revision.py +44 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/e7e633bd6fa2_add_exceptions_to_budget_entries.py +2 -4
- {zou-0.20.45 → zou-0.20.47/zou.egg-info}/PKG-INFO +1 -1
- zou-0.20.45/zou/__init__.py +0 -1
- {zou-0.20.45 → zou-0.20.47}/LICENSE +0 -0
- {zou-0.20.45 → zou-0.20.47}/README.rst +0 -0
- {zou-0.20.45 → zou-0.20.47}/pyproject.toml +0 -0
- {zou-0.20.45 → zou-0.20.47}/setup.cfg +0 -0
- {zou-0.20.45 → zou-0.20.47}/setup.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/__init__.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/api.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/__init__.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/assets/__init__.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/assets/resources.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/auth/__init__.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/auth/resources.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/breakdown/__init__.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/breakdown/resources.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/chats/__init__.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/chats/resources.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/comments/__init__.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/comments/resources.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/concepts/__init__.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/concepts/resources.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/crud/__init__.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/crud/asset_instance.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/crud/attachment_file.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/crud/base.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/crud/budget.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/crud/budget_entry.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/crud/chat.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/crud/chat_message.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/crud/comments.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/crud/custom_action.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/crud/day_off.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/crud/department.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/crud/entity.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/crud/entity_link.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/crud/entity_type.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/crud/event.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/crud/file_status.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/crud/metadata_descriptor.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/crud/milestone.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/crud/news.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/crud/notification.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/crud/organisation.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/crud/output_file.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/crud/output_type.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/crud/playlist.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/crud/plugin.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/crud/preview_background_file.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/crud/preview_file.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/crud/project.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/crud/project_status.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/crud/salary_scale.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/crud/schedule_item.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/crud/search_filter.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/crud/search_filter_group.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/crud/software.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/crud/status_automation.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/crud/studio.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/crud/subscription.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/crud/task.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/crud/task_status.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/crud/task_type.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/crud/time_spent.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/crud/working_file.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/edits/__init__.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/edits/resources.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/entities/__init__.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/entities/resources.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/events/__init__.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/events/resources.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/export/__init__.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/export/csv/__init__.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/export/csv/assets.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/export/csv/base.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/export/csv/casting.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/export/csv/edits.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/export/csv/persons.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/export/csv/playlists.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/export/csv/projects.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/export/csv/shots.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/export/csv/task_types.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/export/csv/tasks.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/export/csv/time_spents.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/files/__init__.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/files/resources.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/index/__init__.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/index/resources.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/news/__init__.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/news/resources.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/persons/__init__.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/persons/resources.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/playlists/__init__.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/playlists/resources.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/previews/__init__.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/previews/resources.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/search/__init__.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/search/resources.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/shots/__init__.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/shots/resources.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/source/__init__.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/source/csv/__init__.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/source/csv/assets.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/source/csv/base.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/source/csv/casting.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/source/csv/edits.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/source/csv/persons.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/source/csv/shots.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/source/csv/task_type_estimations.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/source/kitsu.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/source/otio.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/source/shotgun/__init__.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/source/shotgun/assets.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/source/shotgun/base.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/source/shotgun/episode.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/source/shotgun/exception.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/source/shotgun/import_errors.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/source/shotgun/notes.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/source/shotgun/person.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/source/shotgun/project.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/source/shotgun/scene.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/source/shotgun/sequence.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/source/shotgun/shot.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/source/shotgun/status.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/source/shotgun/steps.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/source/shotgun/tasks.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/source/shotgun/team.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/source/shotgun/versions.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/tasks/__init__.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/tasks/resources.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/user/__init__.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/blueprints/user/resources.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/file_trees/default.json +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/file_trees/simple.json +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/indexer/__init__.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/indexer/indexing.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/mixin.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/models/__init__.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/models/asset_instance.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/models/attachment_file.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/models/base.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/models/budget.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/models/budget_entry.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/models/build_job.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/models/chat.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/models/chat_message.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/models/comment.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/models/custom_action.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/models/data_import_error.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/models/day_off.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/models/department.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/models/desktop_login_log.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/models/entity.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/models/entity_type.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/models/event.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/models/file_status.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/models/login_log.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/models/metadata_descriptor.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/models/milestone.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/models/news.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/models/notification.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/models/organisation.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/models/output_file.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/models/output_type.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/models/person.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/models/playlist.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/models/plugin.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/models/preview_background_file.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/models/preview_file.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/models/project.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/models/project_status.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/models/salary_scale.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/models/schedule_item.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/models/search_filter.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/models/search_filter_group.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/models/serializer.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/models/software.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/models/status_automation.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/models/studio.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/models/subscription.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/models/task.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/models/task_status.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/models/task_type.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/models/time_spent.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/models/working_file.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/services/__init__.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/services/assets_service.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/services/auth_service.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/services/backup_service.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/services/base_service.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/services/breakdown_service.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/services/budget_service.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/services/chats_service.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/services/comments_service.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/services/concepts_service.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/services/custom_actions_service.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/services/deletion_service.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/services/edits_service.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/services/emails_service.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/services/entities_service.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/services/events_service.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/services/exception.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/services/file_tree_service.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/services/files_service.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/services/index_service.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/services/names_service.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/services/news_service.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/services/notifications_service.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/services/persons_service.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/services/playlists_service.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/services/plugins_service.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/services/preview_files_service.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/services/projects_service.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/services/scenes_service.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/services/schedule_service.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/services/shots_service.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/services/stats_service.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/services/status_automations_service.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/services/sync_service.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/services/tasks_service.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/services/telemetry_services.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/services/user_service.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/stores/__init__.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/stores/auth_tokens_store.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/stores/file_store.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/stores/publisher_store.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/stores/queue_store.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/swagger.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/utils/__init__.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/utils/api.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/utils/cache.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/utils/chats.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/utils/colors.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/utils/commands.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/utils/csv_utils.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/utils/date_helpers.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/utils/dbhelpers.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/utils/emails.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/utils/env.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/utils/events.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/utils/fido.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/utils/fields.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/utils/flask.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/utils/fs.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/utils/git.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/utils/logs.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/utils/monitoring.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/utils/permissions.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/utils/plugins.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/utils/query.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/utils/redis.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/utils/remote_job.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/utils/saml.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/utils/shell.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/utils/string.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/app/utils/thumbnail.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/debug.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/event_stream.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/job_settings.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/README +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/__init__.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/alembic.ini +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/env.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/script.py.mako +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/utils/__init__.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/utils/base.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/003be8a91001_add_start_and_end_dates_to_projects.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/0596674df51d_add_department_mentions_to_comments.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/05ac7e8caa21_remove_unique_constraint_for_taskstatus_.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/05b7dc79a416_add_archived_fields_to_main_tables.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/06552e22f9e7_add_comment_updated_by.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/0cf5e0e035fa_drop_column_tasktype_for_shots.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/0ec3762a745d_add_attachment_table.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/0ef6416a507b_.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/10cf267d95c9_fix_schedule_item.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/16328eae4b5f_add_new_constraint_for_timespent.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/16df47d76c64_add_some_indexes.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/17ef8f7be758_disallow_null_choicetype.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/1bb55759146f_add_table_studio.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/1cb44194db49_add_file_size_field_to_preview_file.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/1e150c2cea4d_add_nb_entities_out.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/1e2d77a2f0c4_add_hd_by_default_column.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/1fab8c420678_add_attachments_to_message_chats.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/20a8ad264659_tasktypeassettypelink_.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/20dfeb36142b_add_projecttaskstatuslink_roles_for_.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/23122f290ca2_add_entity_chat_models.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/269d41bfb73f_add_entity_entity_links.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/2762a797f1f9_add_people_salary_information.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/29df910f04a4_create_unique_constraint_project_id_.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/29fe01a6c9eb_add_status_automation_field.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/2adc020885fa_.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/2baede80b111_add_entity_status_field.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/306266361f4f_.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/307edd8c639d_change_comment_updated_by_in_comment_.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/328fd44c6347_add_entity_created_by.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/32f134ff1201_add_is_shared_flag_to_filters.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/346250b5304c_add_position_to_preview_files.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/3476e147e632_add_acks_to_comments.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/389cfb9de776_.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/38baa9a23b3d_.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/398150912a3f_validation_status_preview.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/3b0d1321079e_.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/3d5c93bafb9d_.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/3e0538ddf80f_.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/3fee3bd10f9d_.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/4095103c7d01_add_is_clients_isolated_flag_to_projects.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/40dea9555940_.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/42ec83db6a01_change_person_preferred_two_factor_.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/43d0cf0ed5e7_.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/443d1e78a932_.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/45c2de366e66_.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/45dafbb3f4e1_for_person_contract_type_disallow_null.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/45f739ef962a_add_people_salary_scale_table.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/4715c2586036_add_last_preview_file_fields.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/4aab1f84ad72_introduce_plugin_table.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/4e3738cdc34c_.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/4f2398ebcd49_.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/523ee9647bee_.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/539a3a00c417_for_departmentlink_index_person_id_.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/54ee0d1d60ba_add_build_job_model.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/556526e47daa_.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/57222395f2be_add_statusautomation_import_last_revision.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/5798d2c9020b_change_person_role_to_choicetype.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/590aa1ffe731_add_notifications_enabled_flag.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/59a7445a966c_add_entity_is_shared.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/5a291251823c_add_max_retake_parameter.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/5ab9d7a75887_.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/5b0fcbb94f24_.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/5b7fa3e51701_add_is_client_allowed_flag_to_task_.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/5b980f0dc365_add_comment_links.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/5b9fd9ddfe43_add_homepage_and_contract_fields.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/5c0498e264bc_add_slack_fields.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/5e2ce62632a6_add_workflow_to_project.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/680c64565f9d_for_searchfiltergroup_is_shared.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/693cc511d28d_add_taskstatus_priority.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/6aa446ee4072_add_is_for_all_flage_to_playlists.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/6bd3b102d61b_.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/6c597e842afa_add_task_type_field_to_playlists.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/6d1b2c60f58b_add_milestone_model.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/6d7fa5a8e9a5_add_timesheets_locked_field_to_org.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/6eeaff945706_add_data_field_on_entity_links.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/6f6049877105_.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/7417c8eb70d8_add_for_entity_field_to_playlists.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/772a5e43f05b_.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/7748d3d22925_add_columns_to_searchfilter_table_to_.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/77d6820f494f_add_reply_to_notif.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/7a16258f2fab_add_currency_field_to_budgets.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/7b1f765677d8_.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/7bc746997e8d_add_slack_token_field_to_organisation.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/7dc79d4ed7cd_.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/818f7bda2528_.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/82e7f7a95e84_add_project_id_to_events.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/82ee682204ab_add_is_generated_from_ldap_column_to_.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/83e2f33a9b14_add_project_bugdet_table.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/8588f254d6b8_add_archived_fields.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/8739ae9fa28b_add_for_client_field.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/87efceb6745b_add_ready_for_to_entity.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/892b264937ec_.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/8a1b4a1b7f4a_add_totp_columns_for_person.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/8ab98c178903_add_budget_entry_table.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/8e4f39e321f4_add_day_off_table.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/8e67c183bed7_add_preference_fields.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/8fbd40afbe5f_allow_to_set_float_values_for_.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/9010a64e5a2d_add_indices.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/9060dd4f6116_notification_uc.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/925771029620_.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/92b40d79ad3f_allow_message_attachments.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/92bdfe07e5f5_discord_integration.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/956659992419_add_columns_for_person_to_store_fido_.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/96c79d31e648_add_mail_otp_columns_for_person.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/96f58a4a2a58_person_partial_index_for_email_only_.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/971dbf5a0faf_add_short_name_for_asset_type_entity_.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/98c90621cf58_add_for_client_flag_to_playlist.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/99825b9cc778_.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/9a09467f9b2c_.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/9b85c14fa8a7_add_day_off_new_columns.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/9bd17364fc18_.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/9d3bb33c6fc6_add_department_keys_to_filter_models.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/9e5b3a9b0cee_add_new_column_metadatadescriptor_data_type_.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/9f8445f9b42c_add_man_days_fields.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/a23682ccc1f1_.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/a252a094e977_add_descriptions_for_entities_tasks_and_.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/a519c710877c_.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/a65bdadbae2f_.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/a66508788c53_add_nb_assets_ready.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/a6c25eed3ea1_add_login_failed_attemps_and_last_login_.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/a7c43f3fbc76_add_duration_column_to_the_preview_file.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/aa0a60033106_feedback_request.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/addbad59c706_allow_to_manage_drawings_instead_of_.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/addbbefa7028_add_departments_link_to_metadata_.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/ae0127f2fc56_add_previewfile_width_and_previewfile_.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/af1790868e2c_.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/b45cb782bb9c_.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/b4dd0add5f79_.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/b8c0a0f9d054_drop_task_status_is_reviewable.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/b8ed0fb263f8_add_person_jti_and_jti_expiration_date.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/b97a71306fc8_add_is_casting_standby_column_to_entity.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/be56dc0fb760_for_is_shared_disallow_nullable.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/bf1347acdee2_.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/c49e41f1298b_add_previewbackground.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/c68c2a62cfac_add_mimetype_column_to_attachment.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/c726b98be194_.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/c81f3e83bdb5_.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/ca28796a2a62_add_is_done_field_to_the_task_model.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/cf3d365de164_add_entity_version_model.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/cf6cec6d6bf5_add_status_field_to_preview_file.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/d25118cddcaa_modify_salary_scale_model.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/d80267806131_task_status_new_column_is_default.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/d8dcd5196d57_add_casting_label.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/de8a3de227ef_.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/deeacd38d373_for_projecttaskstatuslink_set_default_.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/df1834485f57_.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/df9f8a147e80_change_file_size_to_big_integer.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/e1ef93f40d3d_.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/e29638428dfd_add_schedule_item_table.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/e3f6db74cc1e_.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/e839d6603c09_add_person_id_to_shot_history.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/ee2373fbe3a4_.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/f0567e8d0c62_.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/f0c6cbb61869_add_production_style_field.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/f344b867a911_for_description_of_entity_task_working_.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/f4ff5a73d283_add_person_ldap_uid.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/f5b113876a49_add_preferred_two_factor_authentication_.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/f5bdca075cdc_add_preview_download_flag_to_projects.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/f874ad5e898a_add_link_entity_type_task_type.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/f995b28fb749_.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/fb6b6f188497_.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/fb87feaaa094_add_missing_unique_constraints.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/fba149993140_add_missing_index.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/fc322f908695_.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/fee7c696166e_.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/feffd3c5b806_introduce_concepts.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/ffeed4956ab1_add_more_details_to_projects.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/plugin_template/__init__.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/plugin_template/migrations/alembic.ini +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/plugin_template/migrations/env.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/plugin_template/migrations/script.py.mako +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/plugin_template/models.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/plugin_template/routes.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/remote/__init__.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/remote/config_payload.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/remote/normalize_movie.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/remote/playlist.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/utils/__init__.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou/utils/movie.py +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou.egg-info/SOURCES.txt +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou.egg-info/dependency_links.txt +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou.egg-info/entry_points.txt +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou.egg-info/not-zip-safe +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou.egg-info/requires.txt +0 -0
- {zou-0.20.45 → zou-0.20.47}/zou.egg-info/top_level.txt +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "0.20.47"
|
|
@@ -101,6 +101,13 @@ class PersonsResource(BaseModelsResource):
|
|
|
101
101
|
raise
|
|
102
102
|
except:
|
|
103
103
|
raise WrongParameterException("Expiration date is not valid.")
|
|
104
|
+
|
|
105
|
+
if "email" in data:
|
|
106
|
+
try:
|
|
107
|
+
data["email"] = auth.validate_email(data["email"])
|
|
108
|
+
except auth.EmailNotValidException as e:
|
|
109
|
+
raise WrongParameterException(str(e))
|
|
110
|
+
|
|
104
111
|
return data
|
|
105
112
|
|
|
106
113
|
def update_data(self, data):
|
|
@@ -184,6 +191,13 @@ class PersonResource(BaseModelResource, ArgsMixin):
|
|
|
184
191
|
raise
|
|
185
192
|
except:
|
|
186
193
|
raise WrongParameterException("Expiration date is not valid.")
|
|
194
|
+
|
|
195
|
+
if "email" in data:
|
|
196
|
+
try:
|
|
197
|
+
data["email"] = auth.validate_email(data["email"])
|
|
198
|
+
except auth.EmailNotValidException as e:
|
|
199
|
+
raise WrongParameterException(str(e))
|
|
200
|
+
|
|
187
201
|
return data
|
|
188
202
|
|
|
189
203
|
def check_delete_permissions(self, instance_dict):
|
|
@@ -30,6 +30,7 @@ from zou.app.blueprints.projects.resources import (
|
|
|
30
30
|
ProductionBudgetResource,
|
|
31
31
|
ProductionBudgetEntriesResource,
|
|
32
32
|
ProductionBudgetEntryResource,
|
|
33
|
+
ProductionMonthTimeSpentsResource,
|
|
33
34
|
)
|
|
34
35
|
|
|
35
36
|
routes = [
|
|
@@ -127,6 +128,10 @@ routes = [
|
|
|
127
128
|
"/data/projects/<project_id>/budgets/<budget_id>/entries/<entry_id>",
|
|
128
129
|
ProductionBudgetEntryResource,
|
|
129
130
|
),
|
|
131
|
+
(
|
|
132
|
+
"/data/projects/<project_id>/budgets/time-spents",
|
|
133
|
+
ProductionMonthTimeSpentsResource,
|
|
134
|
+
),
|
|
130
135
|
]
|
|
131
136
|
|
|
132
137
|
blueprint = Blueprint("projects", "projects")
|
|
@@ -5,9 +5,11 @@ from flask_jwt_extended import jwt_required
|
|
|
5
5
|
from zou.app.services import budget_service
|
|
6
6
|
from zou.app.mixin import ArgsMixin
|
|
7
7
|
from zou.app.services import (
|
|
8
|
+
persons_service,
|
|
8
9
|
projects_service,
|
|
9
10
|
schedule_service,
|
|
10
11
|
tasks_service,
|
|
12
|
+
time_spents_service,
|
|
11
13
|
user_service,
|
|
12
14
|
)
|
|
13
15
|
from zou.app.utils import permissions
|
|
@@ -1494,3 +1496,33 @@ class ProductionBudgetEntryResource(Resource, ArgsMixin):
|
|
|
1494
1496
|
user_service.check_manager_project_access(project_id)
|
|
1495
1497
|
budget_service.delete_budget_entry(entry_id)
|
|
1496
1498
|
return "", 204
|
|
1499
|
+
|
|
1500
|
+
|
|
1501
|
+
class ProductionMonthTimeSpentsResource(Resource, ArgsMixin):
|
|
1502
|
+
|
|
1503
|
+
@jwt_required()
|
|
1504
|
+
def get(self, project_id):
|
|
1505
|
+
"""
|
|
1506
|
+
Get aggregated time spents by month for given project.
|
|
1507
|
+
---
|
|
1508
|
+
tags:
|
|
1509
|
+
- Projects
|
|
1510
|
+
parameters:
|
|
1511
|
+
- in: path
|
|
1512
|
+
name: project_id
|
|
1513
|
+
required: True
|
|
1514
|
+
type: string
|
|
1515
|
+
format: UUID
|
|
1516
|
+
x-example: a24a6ea4-ce75-4665-a070-57453082c25
|
|
1517
|
+
responses:
|
|
1518
|
+
200:
|
|
1519
|
+
description: Aggregated time spents for given person and month
|
|
1520
|
+
400:
|
|
1521
|
+
description: Wrong ID format
|
|
1522
|
+
"""
|
|
1523
|
+
permissions.check_admin_permissions()
|
|
1524
|
+
self.check_id_parameter(project_id)
|
|
1525
|
+
user = persons_service.get_current_user()
|
|
1526
|
+
return time_spents_service.get_project_month_time_spents(
|
|
1527
|
+
project_id, user["timezone"]
|
|
1528
|
+
)
|
|
@@ -88,6 +88,7 @@ MAIL_USE_SSL = envtobool("MAIL_USE_SSL", False)
|
|
|
88
88
|
MAIL_DEFAULT_SENDER = os.getenv(
|
|
89
89
|
"MAIL_DEFAULT_SENDER", "no-reply@your-studio.com"
|
|
90
90
|
)
|
|
91
|
+
MAIL_CHECK_DELIVERABILITY = envtobool("MAIL_CHECK_DELIVERABILITY", True)
|
|
91
92
|
DOMAIN_NAME = os.getenv("DOMAIN_NAME", "localhost:8080")
|
|
92
93
|
DOMAIN_PROTOCOL = os.getenv("DOMAIN_PROTOCOL", "https")
|
|
93
94
|
|
|
@@ -7,6 +7,7 @@ from sqlalchemy.exc import DataError
|
|
|
7
7
|
from sqlalchemy.orm import aliased
|
|
8
8
|
|
|
9
9
|
from zou.app.models.day_off import DayOff
|
|
10
|
+
from zou.app.models.department import Department
|
|
10
11
|
from zou.app.models.project import Project
|
|
11
12
|
from zou.app.models.task import Task
|
|
12
13
|
from zou.app.models.task_type import TaskType
|
|
@@ -535,3 +536,38 @@ def get_timezoned_interval(start, end):
|
|
|
535
536
|
"""
|
|
536
537
|
timezone = user_service.get_timezone()
|
|
537
538
|
return date_helpers.get_timezoned_interval(start, end, timezone)
|
|
539
|
+
|
|
540
|
+
|
|
541
|
+
def get_project_month_time_spents(project_id, timezone=None):
|
|
542
|
+
"""
|
|
543
|
+
Get aggregated time spents by department by person by month for given
|
|
544
|
+
project.
|
|
545
|
+
"""
|
|
546
|
+
data = {}
|
|
547
|
+
query = (
|
|
548
|
+
TimeSpent.query
|
|
549
|
+
.join(Task)
|
|
550
|
+
.join(TaskType, TaskType.id == Task.task_type_id)
|
|
551
|
+
.join(Department, Department.id == TaskType.department_id)
|
|
552
|
+
.filter(Task.project_id == project_id)
|
|
553
|
+
.add_columns(Department.id)
|
|
554
|
+
.order_by(TimeSpent.date)
|
|
555
|
+
)
|
|
556
|
+
|
|
557
|
+
for time_spent, department_id in query.all():
|
|
558
|
+
date_key = date_helpers.get_simple_string_with_timezone_from_date(
|
|
559
|
+
time_spent.date, timezone
|
|
560
|
+
)[0:7]
|
|
561
|
+
if department_id not in data:
|
|
562
|
+
data[department_id] = { "total": 0 }
|
|
563
|
+
if time_spent.person_id not in data[department_id]:
|
|
564
|
+
data[department_id][time_spent.person_id] = { "total": 0 }
|
|
565
|
+
if date_key not in data[department_id][time_spent.person_id]:
|
|
566
|
+
data[department_id][time_spent.person_id][date_key] = 0
|
|
567
|
+
|
|
568
|
+
data[department_id][time_spent.person_id][date_key] += \
|
|
569
|
+
time_spent.duration
|
|
570
|
+
data[department_id]["total"] += time_spent.duration
|
|
571
|
+
data[department_id][time_spent.person_id]["total"] += \
|
|
572
|
+
time_spent.duration
|
|
573
|
+
return data
|
|
@@ -23,9 +23,13 @@ def encrypt_password(password):
|
|
|
23
23
|
return flask_bcrypt.generate_password_hash(password)
|
|
24
24
|
|
|
25
25
|
|
|
26
|
-
def validate_email(
|
|
26
|
+
def validate_email(
|
|
27
|
+
email, check_deliverability=config.MAIL_CHECK_DELIVERABILITY
|
|
28
|
+
):
|
|
27
29
|
try:
|
|
28
|
-
return email_validator.validate_email(
|
|
30
|
+
return email_validator.validate_email(
|
|
31
|
+
email, check_deliverability=check_deliverability
|
|
32
|
+
).normalized
|
|
29
33
|
except email_validator.EmailNotValidError as e:
|
|
30
34
|
raise EmailNotValidException(str(e))
|
|
31
35
|
|
|
@@ -195,8 +195,8 @@ def create_admin(email, password):
|
|
|
195
195
|
except auth.PasswordTooShortException:
|
|
196
196
|
print("Password is too short.")
|
|
197
197
|
sys.exit(1)
|
|
198
|
-
except auth.EmailNotValidException:
|
|
199
|
-
print("Email is not valid
|
|
198
|
+
except auth.EmailNotValidException as e:
|
|
199
|
+
print(f"Email is not valid: {e}")
|
|
200
200
|
sys.exit(1)
|
|
201
201
|
except IsUserLimitReachedException:
|
|
202
202
|
print(f"User limit reached (limit {config.USER_LIMIT}).")
|
|
@@ -8,6 +8,12 @@ Create Date: 2025-05-02 16:08:57.078114
|
|
|
8
8
|
|
|
9
9
|
from alembic import op
|
|
10
10
|
import sqlalchemy as sa
|
|
11
|
+
from alembic import op
|
|
12
|
+
import sqlalchemy as sa
|
|
13
|
+
from zou.migrations.utils.base import BaseMixin
|
|
14
|
+
from sqlalchemy.ext.declarative import declarative_base
|
|
15
|
+
from sqlalchemy.dialects.postgresql import JSONB
|
|
16
|
+
from sqlalchemy.orm.session import Session
|
|
11
17
|
|
|
12
18
|
|
|
13
19
|
# revision identifiers, used by Alembic.
|
|
@@ -16,6 +22,37 @@ down_revision = "e7e633bd6fa2"
|
|
|
16
22
|
branch_labels = None
|
|
17
23
|
depends_on = None
|
|
18
24
|
|
|
25
|
+
base = declarative_base()
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class Task(base, BaseMixin):
|
|
29
|
+
"""
|
|
30
|
+
Describes a task done by a CG artist on an entity of the CG production.
|
|
31
|
+
The task has a state and assigned to people. It handles notion of time like
|
|
32
|
+
duration, start date and end date.
|
|
33
|
+
"""
|
|
34
|
+
|
|
35
|
+
__tablename__ = "task"
|
|
36
|
+
name = sa.Column(sa.String(80), nullable=False)
|
|
37
|
+
description = sa.Column(sa.Text())
|
|
38
|
+
|
|
39
|
+
priority = sa.Column(sa.Integer, default=0)
|
|
40
|
+
difficulty = sa.Column(sa.Integer, default=3, nullable=False)
|
|
41
|
+
duration = sa.Column(sa.Float, default=0)
|
|
42
|
+
estimation = sa.Column(sa.Float, default=0)
|
|
43
|
+
completion_rate = sa.Column(sa.Integer, default=0)
|
|
44
|
+
retake_count = sa.Column(sa.Integer, default=0)
|
|
45
|
+
sort_order = sa.Column(sa.Integer, default=0)
|
|
46
|
+
start_date = sa.Column(sa.DateTime)
|
|
47
|
+
due_date = sa.Column(sa.DateTime)
|
|
48
|
+
real_start_date = sa.Column(sa.DateTime)
|
|
49
|
+
end_date = sa.Column(sa.DateTime)
|
|
50
|
+
done_date = sa.Column(sa.DateTime)
|
|
51
|
+
last_comment_date = sa.Column(sa.DateTime)
|
|
52
|
+
nb_assets_ready = sa.Column(sa.Integer, default=0)
|
|
53
|
+
data = sa.Column(JSONB)
|
|
54
|
+
nb_drawings = sa.Column(sa.Integer, default=0)
|
|
55
|
+
|
|
19
56
|
|
|
20
57
|
def upgrade():
|
|
21
58
|
# ### commands auto generated by Alembic - please adjust! ###
|
|
@@ -33,6 +70,13 @@ def upgrade():
|
|
|
33
70
|
)
|
|
34
71
|
|
|
35
72
|
with op.batch_alter_table("task", schema=None) as batch_op:
|
|
73
|
+
session = Session(bind=op.get_bind())
|
|
74
|
+
session.query(Task).where(Task.difficulty == None).update(
|
|
75
|
+
{
|
|
76
|
+
Task.difficulty: 3,
|
|
77
|
+
}
|
|
78
|
+
)
|
|
79
|
+
session.commit()
|
|
36
80
|
batch_op.alter_column(
|
|
37
81
|
"difficulty",
|
|
38
82
|
existing_type=sa.INTEGER(),
|
{zou-0.20.45 → zou-0.20.47}/zou/migrations/versions/e7e633bd6fa2_add_exceptions_to_budget_entries.py
RENAMED
|
@@ -32,8 +32,6 @@ def upgrade():
|
|
|
32
32
|
|
|
33
33
|
def downgrade():
|
|
34
34
|
# ### commands auto generated by Alembic - please adjust! ###
|
|
35
|
-
with op.batch_alter_table("
|
|
36
|
-
batch_op.
|
|
37
|
-
"difficulty", existing_type=sa.INTEGER(), nullable=True
|
|
38
|
-
)
|
|
35
|
+
with op.batch_alter_table("budget_entry", schema=None) as batch_op:
|
|
36
|
+
batch_op.drop_column("exceptions")
|
|
39
37
|
# ### end Alembic commands ###
|
zou-0.20.45/zou/__init__.py
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
__version__ = "0.20.45"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|