zou 0.19.14__py3-none-any.whl → 0.20.11__py3-none-any.whl
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/__init__.py +1 -1
- zou/app/__init__.py +10 -2
- zou/app/api.py +2 -0
- zou/app/blueprints/assets/__init__.py +22 -0
- zou/app/blueprints/assets/resources.py +241 -4
- zou/app/blueprints/auth/__init__.py +4 -0
- zou/app/blueprints/auth/resources.py +154 -22
- zou/app/blueprints/breakdown/resources.py +4 -4
- zou/app/blueprints/chats/__init__.py +22 -0
- zou/app/blueprints/chats/resources.py +199 -0
- zou/app/blueprints/comments/resources.py +36 -19
- zou/app/blueprints/crud/__init__.py +12 -0
- zou/app/blueprints/crud/attachment_file.py +14 -5
- zou/app/blueprints/crud/base.py +29 -28
- zou/app/blueprints/crud/chat.py +13 -0
- zou/app/blueprints/crud/chat_message.py +13 -0
- zou/app/blueprints/crud/comments.py +85 -29
- zou/app/blueprints/crud/custom_action.py +1 -1
- zou/app/blueprints/crud/day_off.py +47 -9
- zou/app/blueprints/crud/department.py +1 -25
- zou/app/blueprints/crud/entity.py +46 -5
- zou/app/blueprints/crud/entity_type.py +13 -1
- zou/app/blueprints/crud/event.py +1 -1
- zou/app/blueprints/crud/file_status.py +1 -1
- zou/app/blueprints/crud/metadata_descriptor.py +24 -10
- zou/app/blueprints/crud/organisation.py +22 -5
- zou/app/blueprints/crud/output_file.py +1 -1
- zou/app/blueprints/crud/output_type.py +1 -1
- zou/app/blueprints/crud/person.py +32 -24
- zou/app/blueprints/crud/playlist.py +1 -1
- zou/app/blueprints/crud/preview_background_file.py +6 -7
- zou/app/blueprints/crud/preview_file.py +1 -1
- zou/app/blueprints/crud/project.py +14 -6
- zou/app/blueprints/crud/project_status.py +1 -1
- zou/app/blueprints/crud/schedule_item.py +4 -2
- zou/app/blueprints/crud/software.py +1 -1
- zou/app/blueprints/crud/status_automation.py +1 -1
- zou/app/blueprints/crud/studio.py +33 -0
- zou/app/blueprints/crud/task.py +47 -3
- zou/app/blueprints/crud/task_status.py +1 -1
- zou/app/blueprints/crud/task_type.py +4 -4
- zou/app/blueprints/crud/working_file.py +4 -8
- zou/app/blueprints/events/resources.py +13 -12
- zou/app/blueprints/export/csv/assets.py +15 -6
- zou/app/blueprints/export/csv/edits.py +15 -5
- zou/app/blueprints/export/csv/playlists.py +1 -1
- zou/app/blueprints/export/csv/shots.py +15 -5
- zou/app/blueprints/export/csv/time_spents.py +1 -1
- zou/app/blueprints/files/resources.py +22 -23
- zou/app/blueprints/index/resources.py +38 -29
- zou/app/blueprints/news/resources.py +25 -11
- zou/app/blueprints/persons/__init__.py +5 -2
- zou/app/blueprints/persons/resources.py +126 -120
- zou/app/blueprints/previews/__init__.py +18 -8
- zou/app/blueprints/previews/resources.py +569 -328
- zou/app/blueprints/projects/resources.py +1 -1
- zou/app/blueprints/search/resources.py +18 -6
- zou/app/blueprints/shots/__init__.py +5 -0
- zou/app/blueprints/shots/resources.py +134 -4
- zou/app/blueprints/source/__init__.py +6 -6
- zou/app/blueprints/source/csv/assets.py +10 -3
- zou/app/blueprints/source/csv/base.py +1 -1
- zou/app/blueprints/source/csv/edits.py +10 -3
- zou/app/blueprints/source/csv/shots.py +10 -3
- zou/app/blueprints/source/{edl.py → otio.py} +84 -41
- zou/app/blueprints/tasks/__init__.py +3 -2
- zou/app/blueprints/tasks/resources.py +83 -52
- zou/app/blueprints/user/__init__.py +9 -0
- zou/app/blueprints/user/resources.py +170 -12
- zou/app/config.py +10 -0
- zou/app/mixin.py +6 -5
- zou/app/models/attachment_file.py +10 -4
- zou/app/models/base.py +18 -13
- zou/app/models/build_job.py +7 -4
- zou/app/models/chat.py +44 -0
- zou/app/models/chat_message.py +37 -0
- zou/app/models/comment.py +1 -0
- zou/app/models/day_off.py +3 -0
- zou/app/models/entity.py +4 -6
- zou/app/models/entity_type.py +2 -0
- zou/app/models/organisation.py +14 -15
- zou/app/models/person.py +6 -1
- zou/app/models/project.py +3 -0
- zou/app/models/search_filter.py +11 -0
- zou/app/models/search_filter_group.py +10 -0
- zou/app/models/serializer.py +17 -17
- zou/app/models/status_automation.py +2 -0
- zou/app/models/studio.py +13 -0
- zou/app/models/subscription.py +2 -2
- zou/app/models/task.py +6 -1
- zou/app/models/task_status.py +1 -0
- zou/app/models/task_type.py +1 -0
- zou/app/models/working_file.py +1 -1
- zou/app/services/assets_service.py +101 -14
- zou/app/services/auth_service.py +17 -44
- zou/app/services/breakdown_service.py +37 -5
- zou/app/services/chats_service.py +279 -0
- zou/app/services/comments_service.py +110 -65
- zou/app/services/concepts_service.py +4 -12
- zou/app/services/deletion_service.py +43 -30
- zou/app/services/edits_service.py +5 -11
- zou/app/services/emails_service.py +4 -4
- zou/app/services/entities_service.py +17 -2
- zou/app/services/events_service.py +12 -4
- zou/app/services/exception.py +5 -5
- zou/app/services/names_service.py +7 -2
- zou/app/services/news_service.py +17 -9
- zou/app/services/persons_service.py +38 -21
- zou/app/services/playlists_service.py +8 -7
- zou/app/services/preview_files_service.py +137 -10
- zou/app/services/projects_service.py +5 -14
- zou/app/services/shots_service.py +221 -49
- zou/app/services/sync_service.py +46 -42
- zou/app/services/tasks_service.py +185 -46
- zou/app/services/time_spents_service.py +67 -20
- zou/app/services/user_service.py +350 -107
- zou/app/stores/auth_tokens_store.py +2 -1
- zou/app/stores/file_store.py +18 -0
- zou/app/stores/publisher_store.py +7 -7
- zou/app/stores/queue_store.py +1 -0
- zou/app/swagger.py +36 -20
- zou/app/utils/cache.py +2 -0
- zou/app/utils/commands.py +104 -7
- zou/app/utils/csv_utils.py +1 -4
- zou/app/utils/date_helpers.py +33 -17
- zou/app/utils/dbhelpers.py +14 -1
- zou/app/utils/emails.py +2 -2
- zou/app/utils/fido.py +22 -0
- zou/app/utils/flask.py +1 -0
- zou/app/utils/query.py +54 -6
- zou/app/utils/redis.py +11 -0
- zou/app/utils/saml.py +51 -0
- zou/app/utils/string.py +2 -0
- zou/app/utils/thumbnail.py +4 -2
- zou/cli.py +76 -18
- zou/debug.py +4 -2
- zou/event_stream.py +122 -165
- zou/job_settings.py +1 -0
- zou/migrations/env.py +0 -0
- zou/migrations/utils/base.py +6 -6
- zou/migrations/versions/1bb55759146f_add_table_studio.py +67 -0
- zou/migrations/versions/1fab8c420678_add_attachments_to_message_chats.py +56 -0
- zou/migrations/versions/23122f290ca2_add_entity_chat_models.py +149 -0
- zou/migrations/versions/32f134ff1201_add_is_shared_flag_to_filters.py +33 -0
- zou/migrations/versions/57222395f2be_add_statusautomation_import_last_revision.py +41 -0
- zou/migrations/versions/59a7445a966c_add_entity_is_shared.py +41 -0
- zou/migrations/versions/5b980f0dc365_add_comment_links.py +35 -0
- zou/migrations/versions/680c64565f9d_for_searchfiltergroup_is_shared.py +35 -0
- zou/migrations/versions/8e67c183bed7_add_preference_fields.py +71 -0
- zou/migrations/versions/92b40d79ad3f_allow_message_attachments.py +38 -0
- zou/migrations/versions/971dbf5a0faf_add_short_name_for_asset_type_entity_.py +33 -0
- zou/migrations/versions/9b85c14fa8a7_add_day_off_new_columns.py +68 -0
- zou/migrations/versions/9d3bb33c6fc6_add_department_keys_to_filter_models.py +73 -0
- zou/migrations/versions/a252a094e977_add_descriptions_for_entities_tasks_and_.py +40 -0
- zou/migrations/versions/be56dc0fb760_for_is_shared_disallow_nullable.py +102 -0
- zou/migrations/versions/ca28796a2a62_add_is_done_field_to_the_task_model.py +108 -0
- zou/migrations/versions/f344b867a911_for_description_of_entity_task_working_.py +75 -0
- zou/remote/config_payload.py +2 -1
- zou/utils/movie.py +14 -4
- {zou-0.19.14.dist-info → zou-0.20.11.dist-info}/METADATA +75 -69
- {zou-0.19.14.dist-info → zou-0.20.11.dist-info}/RECORD +164 -135
- {zou-0.19.14.dist-info → zou-0.20.11.dist-info}/WHEEL +1 -1
- {zou-0.19.14.dist-info → zou-0.20.11.dist-info}/LICENSE +0 -0
- {zou-0.19.14.dist-info → zou-0.20.11.dist-info}/entry_points.txt +0 -0
- {zou-0.19.14.dist-info → zou-0.20.11.dist-info}/top_level.txt +0 -0
|
@@ -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
|
|
@@ -13,15 +11,12 @@ from zou.app.services import (
|
|
|
13
11
|
persons_service,
|
|
14
12
|
tasks_service,
|
|
15
13
|
user_service,
|
|
14
|
+
projects_service,
|
|
16
15
|
)
|
|
17
16
|
from zou.app.utils import events, permissions
|
|
18
17
|
|
|
19
18
|
from zou.app.blueprints.crud.base import BaseModelResource, BaseModelsResource
|
|
20
19
|
|
|
21
|
-
from zou.app.services.exception import (
|
|
22
|
-
CommentNotFoundException,
|
|
23
|
-
)
|
|
24
|
-
|
|
25
20
|
|
|
26
21
|
class CommentsResource(BaseModelsResource):
|
|
27
22
|
def __init__(self):
|
|
@@ -33,25 +28,8 @@ class CommentResource(BaseModelResource):
|
|
|
33
28
|
BaseModelResource.__init__(self, Comment)
|
|
34
29
|
self.protected_fields += ["mentions", "department_mentions"]
|
|
35
30
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
"""
|
|
39
|
-
Retrieve a model corresponding at given ID and return it as a JSON
|
|
40
|
-
object.
|
|
41
|
-
"""
|
|
42
|
-
try:
|
|
43
|
-
instance = tasks_service.get_comment_with_relations(instance_id)
|
|
44
|
-
self.check_read_permissions(instance)
|
|
45
|
-
result = self.clean_get_result(instance)
|
|
46
|
-
|
|
47
|
-
except StatementError as exception:
|
|
48
|
-
current_app.logger.error(str(exception), exc_info=1)
|
|
49
|
-
return {"message": str(exception)}, 400
|
|
50
|
-
|
|
51
|
-
except ValueError:
|
|
52
|
-
raise CommentNotFoundException
|
|
53
|
-
|
|
54
|
-
return result, 200
|
|
31
|
+
def get_serialized_instance(self, instance_id, relations=True):
|
|
32
|
+
return tasks_service.get_comment(instance_id, relations=relations)
|
|
55
33
|
|
|
56
34
|
def clean_get_result(self, result):
|
|
57
35
|
if permissions.has_client_permissions():
|
|
@@ -105,11 +83,89 @@ class CommentResource(BaseModelResource):
|
|
|
105
83
|
if permissions.has_admin_permissions():
|
|
106
84
|
return True
|
|
107
85
|
else:
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
86
|
+
task = tasks_service.get_task(
|
|
87
|
+
instance["object_id"], relations=True
|
|
88
|
+
)
|
|
89
|
+
task_type = tasks_service.get_task_type(task["task_type_id"])
|
|
90
|
+
project = projects_service.get_project(
|
|
91
|
+
task["project_id"], relations=True
|
|
92
|
+
)
|
|
93
|
+
current_user = persons_service.get_current_user(relations=True)
|
|
94
|
+
if current_user["id"] not in project["team"]:
|
|
95
|
+
raise permissions.PermissionDenied
|
|
96
|
+
|
|
97
|
+
if permissions.has_manager_permissions():
|
|
98
|
+
return True
|
|
99
|
+
|
|
100
|
+
change_pinned = (
|
|
101
|
+
"pinned" in data.keys()
|
|
102
|
+
and data["pinned"] != instance["pinned"]
|
|
103
|
+
)
|
|
104
|
+
change_checklist = (
|
|
105
|
+
"checklist" in data.keys()
|
|
106
|
+
and data["checklist"] != instance["checklist"]
|
|
107
|
+
)
|
|
108
|
+
is_supervisor = permissions.has_supervisor_permissions()
|
|
109
|
+
is_supervisor_in_department = (
|
|
110
|
+
current_user["departments"] == []
|
|
111
|
+
or task_type["department_id"] in current_user["departments"]
|
|
112
|
+
)
|
|
113
|
+
is_assigned = current_user["id"] in task["assignees"]
|
|
114
|
+
comment_from_current_user = (
|
|
115
|
+
current_user["id"] == instance["person_id"]
|
|
116
|
+
)
|
|
117
|
+
|
|
118
|
+
if change_pinned and (
|
|
119
|
+
not is_supervisor or not is_supervisor_in_department
|
|
120
|
+
):
|
|
121
|
+
raise permissions.PermissionDenied
|
|
122
|
+
|
|
123
|
+
if change_checklist and (
|
|
124
|
+
not comment_from_current_user
|
|
125
|
+
and (
|
|
126
|
+
(
|
|
127
|
+
is_supervisor
|
|
128
|
+
and not (is_supervisor_in_department or is_assigned)
|
|
129
|
+
)
|
|
130
|
+
or (not is_supervisor and not is_assigned)
|
|
131
|
+
)
|
|
132
|
+
and (
|
|
133
|
+
len(data["checklist"]) == len(instance["checklist"])
|
|
134
|
+
and all(
|
|
135
|
+
all(
|
|
136
|
+
(
|
|
137
|
+
k == "checked"
|
|
138
|
+
or data["checklist"][i].get(k) == c[k]
|
|
139
|
+
)
|
|
140
|
+
for k in c.keys()
|
|
141
|
+
)
|
|
142
|
+
for i, c in enumerate(instance["checklist"])
|
|
143
|
+
)
|
|
144
|
+
)
|
|
145
|
+
):
|
|
146
|
+
raise permissions.PermissionDenied
|
|
147
|
+
|
|
148
|
+
if (
|
|
149
|
+
not comment_from_current_user
|
|
150
|
+
and len(set(data.keys()) - set(["pinned", "checklist"])) > 0
|
|
151
|
+
):
|
|
152
|
+
raise permissions.PermissionDenied
|
|
153
|
+
|
|
154
|
+
if (
|
|
155
|
+
"person_id" in data.keys()
|
|
156
|
+
and data["person_id"] != current_user["id"]
|
|
157
|
+
):
|
|
111
158
|
raise permissions.PermissionDenied
|
|
112
|
-
|
|
159
|
+
|
|
160
|
+
if (
|
|
161
|
+
"object_id" in data.keys()
|
|
162
|
+
and data["object_id"] != instance["object_id"]
|
|
163
|
+
):
|
|
164
|
+
raise permissions.PermissionDenied
|
|
165
|
+
|
|
166
|
+
if "task_status_id" in data.keys():
|
|
167
|
+
user_service.check_task_status_access(data["task_status_id"])
|
|
168
|
+
|
|
113
169
|
return True
|
|
114
170
|
|
|
115
171
|
def pre_delete(self, comment):
|
|
@@ -9,7 +9,7 @@ class CustomActionsResource(BaseModelsResource):
|
|
|
9
9
|
def __init__(self):
|
|
10
10
|
BaseModelsResource.__init__(self, CustomAction)
|
|
11
11
|
|
|
12
|
-
def check_read_permissions(self):
|
|
12
|
+
def check_read_permissions(self, options=None):
|
|
13
13
|
user_service.block_access_to_vendor()
|
|
14
14
|
return True
|
|
15
15
|
|
|
@@ -3,8 +3,11 @@ from zou.app.models.time_spent import TimeSpent
|
|
|
3
3
|
|
|
4
4
|
from zou.app.blueprints.crud.base import BaseModelsResource, BaseModelResource
|
|
5
5
|
|
|
6
|
-
from zou.app.services import user_service
|
|
7
|
-
|
|
6
|
+
from zou.app.services import user_service, time_spents_service
|
|
7
|
+
|
|
8
|
+
from zou.app.services.exception import WrongParameterException
|
|
9
|
+
|
|
10
|
+
from zou.app.utils import permissions
|
|
8
11
|
|
|
9
12
|
|
|
10
13
|
class DayOffsResource(BaseModelsResource):
|
|
@@ -14,14 +17,20 @@ class DayOffsResource(BaseModelsResource):
|
|
|
14
17
|
def check_create_permissions(self, data):
|
|
15
18
|
return user_service.check_day_off_access(data)
|
|
16
19
|
|
|
17
|
-
def
|
|
18
|
-
|
|
19
|
-
|
|
20
|
+
def check_creation_integrity(self, data):
|
|
21
|
+
if time_spents_service.get_day_offs_between(
|
|
22
|
+
data["date"], data["end_date"], data["person_id"]
|
|
23
|
+
):
|
|
24
|
+
raise WrongParameterException(
|
|
25
|
+
"Day off already exists for this period"
|
|
26
|
+
)
|
|
20
27
|
return data
|
|
21
28
|
|
|
22
29
|
def post_creation(self, instance):
|
|
23
|
-
|
|
24
|
-
|
|
30
|
+
TimeSpent.delete_all_by(
|
|
31
|
+
instance.date >= TimeSpent.date,
|
|
32
|
+
instance.end_date <= TimeSpent.date,
|
|
33
|
+
person_id=instance.person_id,
|
|
25
34
|
)
|
|
26
35
|
return instance.serialize()
|
|
27
36
|
|
|
@@ -33,5 +42,34 @@ class DayOffResource(BaseModelResource):
|
|
|
33
42
|
def check_delete_permissions(self, instance_dict):
|
|
34
43
|
return user_service.check_day_off_access(instance_dict)
|
|
35
44
|
|
|
36
|
-
def check_read_permissions(self,
|
|
37
|
-
return user_service.check_day_off_access(
|
|
45
|
+
def check_read_permissions(self, instance_dict):
|
|
46
|
+
return user_service.check_day_off_access(instance_dict)
|
|
47
|
+
|
|
48
|
+
def check_update_permissions(self, instance_dict, data):
|
|
49
|
+
if (
|
|
50
|
+
"person_id" in data.keys()
|
|
51
|
+
and instance_dict["person_id"] != data["person_id"]
|
|
52
|
+
and not permissions.has_admin_permissions()
|
|
53
|
+
):
|
|
54
|
+
raise permissions.PermissionDenied()
|
|
55
|
+
return user_service.check_day_off_access(instance_dict)
|
|
56
|
+
|
|
57
|
+
def post_update(self, instance_dict, data):
|
|
58
|
+
TimeSpent.delete_all_by(
|
|
59
|
+
self.instance.date >= TimeSpent.date,
|
|
60
|
+
self.instance.end_date <= TimeSpent.date,
|
|
61
|
+
person_id=self.instance.person_id,
|
|
62
|
+
)
|
|
63
|
+
return instance_dict
|
|
64
|
+
|
|
65
|
+
def pre_update(self, instance_dict, data):
|
|
66
|
+
if time_spents_service.get_day_offs_between(
|
|
67
|
+
data.get("date", instance_dict["date"]),
|
|
68
|
+
data.get("end_date", instance_dict["end_date"]),
|
|
69
|
+
data.get("person_id", instance_dict["person_id"]),
|
|
70
|
+
exclude_id=instance_dict["id"],
|
|
71
|
+
):
|
|
72
|
+
raise WrongParameterException(
|
|
73
|
+
"Day off already exists for this period"
|
|
74
|
+
)
|
|
75
|
+
return data
|
|
@@ -3,32 +3,19 @@ from zou.app.blueprints.crud.base import BaseModelResource, BaseModelsResource
|
|
|
3
3
|
from zou.app.models.department import Department
|
|
4
4
|
|
|
5
5
|
from zou.app.services import tasks_service
|
|
6
|
-
from zou.app.services.exception import (
|
|
7
|
-
ArgumentsException,
|
|
8
|
-
)
|
|
9
6
|
|
|
10
7
|
|
|
11
8
|
class DepartmentsResource(BaseModelsResource):
|
|
12
9
|
def __init__(self):
|
|
13
10
|
BaseModelsResource.__init__(self, Department)
|
|
14
11
|
|
|
15
|
-
def check_read_permissions(self):
|
|
12
|
+
def check_read_permissions(self, options=None):
|
|
16
13
|
return True
|
|
17
14
|
|
|
18
15
|
def post_creation(self, instance):
|
|
19
16
|
tasks_service.clear_department_cache(str(instance.id))
|
|
20
17
|
return instance.serialize()
|
|
21
18
|
|
|
22
|
-
def update_data(self, data):
|
|
23
|
-
data = super().update_data(data)
|
|
24
|
-
name = data.get("name", None)
|
|
25
|
-
department = Department.get_by(name=name)
|
|
26
|
-
if department is not None:
|
|
27
|
-
raise ArgumentsException(
|
|
28
|
-
"A department type with similar name already exists"
|
|
29
|
-
)
|
|
30
|
-
return data
|
|
31
|
-
|
|
32
19
|
|
|
33
20
|
class DepartmentResource(BaseModelResource):
|
|
34
21
|
def __init__(self):
|
|
@@ -37,17 +24,6 @@ class DepartmentResource(BaseModelResource):
|
|
|
37
24
|
def check_read_permissions(self, instance):
|
|
38
25
|
return True
|
|
39
26
|
|
|
40
|
-
def update_data(self, data, instance_id):
|
|
41
|
-
data = super().update_data(data, instance_id)
|
|
42
|
-
name = data.get("name", None)
|
|
43
|
-
if name is not None:
|
|
44
|
-
department = Department.get_by(name=name)
|
|
45
|
-
if department is not None and instance_id != str(department.id):
|
|
46
|
-
raise ArgumentsException(
|
|
47
|
-
"A department with similar name already exists"
|
|
48
|
-
)
|
|
49
|
-
return data
|
|
50
|
-
|
|
51
27
|
def post_update(self, instance_dict, data):
|
|
52
28
|
tasks_service.clear_department_cache(instance_dict["id"])
|
|
53
29
|
return instance_dict
|
|
@@ -10,8 +10,11 @@ from zou.app.models.entity import (
|
|
|
10
10
|
EntityVersion,
|
|
11
11
|
EntityLink,
|
|
12
12
|
EntityConceptLink,
|
|
13
|
+
ENTITY_STATUSES,
|
|
13
14
|
)
|
|
15
|
+
from zou.app.models.project import Project
|
|
14
16
|
from zou.app.models.subscription import Subscription
|
|
17
|
+
from zou.app.models.task import Task
|
|
15
18
|
from zou.app.services import (
|
|
16
19
|
assets_service,
|
|
17
20
|
breakdown_service,
|
|
@@ -23,7 +26,9 @@ from zou.app.services import (
|
|
|
23
26
|
user_service,
|
|
24
27
|
concepts_service,
|
|
25
28
|
)
|
|
26
|
-
from zou.app.utils import
|
|
29
|
+
from zou.app.utils import date_helpers, events, permissions
|
|
30
|
+
|
|
31
|
+
from zou.app.services.exception import WrongParameterException
|
|
27
32
|
|
|
28
33
|
from werkzeug.exceptions import NotFound
|
|
29
34
|
|
|
@@ -56,11 +61,36 @@ class EntitiesResource(BaseModelsResource, EntityEventMixin):
|
|
|
56
61
|
def emit_create_event(self, entity_dict):
|
|
57
62
|
self.emit_event("new", entity_dict)
|
|
58
63
|
|
|
64
|
+
def check_read_permissions(self, options=None):
|
|
65
|
+
return True
|
|
66
|
+
|
|
67
|
+
def add_project_permission_filter(self, query):
|
|
68
|
+
if not permissions.has_admin_permissions():
|
|
69
|
+
query = query.join(Project).filter(
|
|
70
|
+
user_service.build_related_projects_filter()
|
|
71
|
+
)
|
|
72
|
+
if permissions.has_vendor_permissions():
|
|
73
|
+
query = query.join(Task).filter(
|
|
74
|
+
user_service.build_assignee_filter()
|
|
75
|
+
)
|
|
76
|
+
|
|
77
|
+
return query
|
|
78
|
+
|
|
59
79
|
def update_data(self, data):
|
|
60
80
|
data = super().update_data(data)
|
|
61
81
|
data["created_by"] = persons_service.get_current_user()["id"]
|
|
62
82
|
return data
|
|
63
83
|
|
|
84
|
+
def check_creation_integrity(self, data):
|
|
85
|
+
"""
|
|
86
|
+
Check if entity has a valid status.
|
|
87
|
+
"""
|
|
88
|
+
if "status" in data:
|
|
89
|
+
types = [entity_status for entity_status, _ in ENTITY_STATUSES]
|
|
90
|
+
if data["status"] not in types:
|
|
91
|
+
raise WrongParameterException("Invalid status")
|
|
92
|
+
return True
|
|
93
|
+
|
|
64
94
|
def all_entries(self, query=None, relations=False):
|
|
65
95
|
entities = BaseModelsResource.all_entries(
|
|
66
96
|
self, query=query, relations=relations
|
|
@@ -187,11 +217,11 @@ class EntityResource(BaseModelResource, EntityEventMixin):
|
|
|
187
217
|
version = None
|
|
188
218
|
if frame_in != pframe_in or frame_out != pframe_out or name != pname:
|
|
189
219
|
current_user_id = persons_service.get_current_user()["id"]
|
|
190
|
-
previous_updated_at =
|
|
191
|
-
previous_shot["updated_at"]
|
|
220
|
+
previous_updated_at = date_helpers.get_datetime_from_string(
|
|
221
|
+
previous_shot["updated_at"]
|
|
192
222
|
)
|
|
193
|
-
updated_at =
|
|
194
|
-
shot["updated_at"]
|
|
223
|
+
updated_at = date_helpers.get_datetime_from_string(
|
|
224
|
+
shot["updated_at"]
|
|
195
225
|
)
|
|
196
226
|
if (
|
|
197
227
|
date_helpers.get_date_diff(previous_updated_at, updated_at)
|
|
@@ -216,3 +246,14 @@ class EntityResource(BaseModelResource, EntityEventMixin):
|
|
|
216
246
|
index_service.remove_asset_index(entity_dict["id"])
|
|
217
247
|
elif shots_service.is_shot(entity_dict):
|
|
218
248
|
index_service.remove_shot_index(entity_dict["id"])
|
|
249
|
+
|
|
250
|
+
def update_data(self, data, instance_id):
|
|
251
|
+
"""
|
|
252
|
+
Check if the entity has a valid status.
|
|
253
|
+
"""
|
|
254
|
+
data = super().update_data(data, instance_id)
|
|
255
|
+
if "status" in data:
|
|
256
|
+
types = [entity_status for entity_status, _ in ENTITY_STATUSES]
|
|
257
|
+
if data["status"] not in types:
|
|
258
|
+
raise WrongParameterException("Invalid status")
|
|
259
|
+
return data
|
|
@@ -4,6 +4,8 @@ from zou.app.models.entity_type import EntityType
|
|
|
4
4
|
from zou.app.utils import events
|
|
5
5
|
from zou.app.services import entities_service, assets_service
|
|
6
6
|
|
|
7
|
+
from zou.app.services.exception import WrongParameterException
|
|
8
|
+
|
|
7
9
|
|
|
8
10
|
class EntityTypesResource(BaseModelsResource):
|
|
9
11
|
def __init__(self):
|
|
@@ -18,7 +20,7 @@ class EntityTypesResource(BaseModelsResource):
|
|
|
18
20
|
for asset_type in query.all()
|
|
19
21
|
]
|
|
20
22
|
|
|
21
|
-
def check_read_permissions(self):
|
|
23
|
+
def check_read_permissions(self, options=None):
|
|
22
24
|
return True
|
|
23
25
|
|
|
24
26
|
def emit_create_event(self, instance_dict):
|
|
@@ -28,6 +30,16 @@ class EntityTypesResource(BaseModelsResource):
|
|
|
28
30
|
assets_service.clear_asset_type_cache()
|
|
29
31
|
return instance.serialize(relations=True)
|
|
30
32
|
|
|
33
|
+
def check_creation_integrity(self, data):
|
|
34
|
+
entity_type = EntityType.query.filter(
|
|
35
|
+
EntityType.name.ilike(data.get("name", ""))
|
|
36
|
+
).first()
|
|
37
|
+
if entity_type is not None:
|
|
38
|
+
raise WrongParameterException(
|
|
39
|
+
"Entity type with this name already exists"
|
|
40
|
+
)
|
|
41
|
+
return data
|
|
42
|
+
|
|
31
43
|
|
|
32
44
|
class EntityTypeResource(BaseModelResource):
|
|
33
45
|
def __init__(self):
|
zou/app/blueprints/crud/event.py
CHANGED
|
@@ -4,9 +4,12 @@ from zou.app.models.metadata_descriptor import (
|
|
|
4
4
|
)
|
|
5
5
|
|
|
6
6
|
from zou.app.blueprints.crud.base import BaseModelResource, BaseModelsResource
|
|
7
|
+
from zou.app.utils import permissions
|
|
8
|
+
from zou.app.models.project import Project
|
|
9
|
+
from zou.app.services import user_service
|
|
7
10
|
|
|
8
11
|
from zou.app.services.exception import (
|
|
9
|
-
|
|
12
|
+
WrongParameterException,
|
|
10
13
|
)
|
|
11
14
|
|
|
12
15
|
|
|
@@ -14,14 +17,15 @@ class MetadataDescriptorsResource(BaseModelsResource):
|
|
|
14
17
|
def __init__(self):
|
|
15
18
|
BaseModelsResource.__init__(self, MetadataDescriptor)
|
|
16
19
|
|
|
17
|
-
def
|
|
18
|
-
|
|
19
|
-
query = self.model.query
|
|
20
|
+
def check_read_permissions(self, options=None):
|
|
21
|
+
return not permissions.has_vendor_permissions()
|
|
20
22
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
23
|
+
def add_project_permission_filter(self, query):
|
|
24
|
+
if not permissions.has_admin_permissions():
|
|
25
|
+
query = query.join(Project).filter(
|
|
26
|
+
user_service.build_related_projects_filter()
|
|
27
|
+
)
|
|
28
|
+
return query
|
|
25
29
|
|
|
26
30
|
def check_creation_integrity(self, data):
|
|
27
31
|
"""
|
|
@@ -30,11 +34,21 @@ class MetadataDescriptorsResource(BaseModelsResource):
|
|
|
30
34
|
if "data_type" in data:
|
|
31
35
|
types = [type_name for type_name, _ in METADATA_DESCRIPTOR_TYPES]
|
|
32
36
|
if data["data_type"] not in types:
|
|
33
|
-
raise
|
|
37
|
+
raise WrongParameterException("Invalid data_type")
|
|
34
38
|
return True
|
|
35
39
|
|
|
40
|
+
def all_entries(self, query=None, relations=True):
|
|
41
|
+
if query is None:
|
|
42
|
+
query = self.model.query
|
|
43
|
+
|
|
44
|
+
return [
|
|
45
|
+
metadata_descriptor.serialize(relations=relations)
|
|
46
|
+
for metadata_descriptor in query.all()
|
|
47
|
+
]
|
|
48
|
+
|
|
36
49
|
|
|
37
50
|
class MetadataDescriptorResource(BaseModelResource):
|
|
51
|
+
|
|
38
52
|
def __init__(self):
|
|
39
53
|
BaseModelResource.__init__(self, MetadataDescriptor)
|
|
40
54
|
|
|
@@ -47,5 +61,5 @@ class MetadataDescriptorResource(BaseModelResource):
|
|
|
47
61
|
if "data_type" in data:
|
|
48
62
|
types = [type_name for type_name, _ in METADATA_DESCRIPTOR_TYPES]
|
|
49
63
|
if data["data_type"] not in types:
|
|
50
|
-
raise
|
|
64
|
+
raise WrongParameterException("Invalid data_type")
|
|
51
65
|
return data
|
|
@@ -1,16 +1,15 @@
|
|
|
1
1
|
from zou.app.models.organisation import Organisation
|
|
2
|
-
from zou.app.utils import fields
|
|
3
2
|
from zou.app.blueprints.crud.base import BaseModelResource, BaseModelsResource
|
|
4
3
|
|
|
4
|
+
from zou.app.services import persons_service
|
|
5
|
+
from zou.app.utils.permissions import has_admin_permissions
|
|
6
|
+
|
|
5
7
|
|
|
6
8
|
class OrganisationsResource(BaseModelsResource):
|
|
7
9
|
def __init__(self):
|
|
8
10
|
BaseModelsResource.__init__(self, Organisation)
|
|
9
11
|
|
|
10
|
-
def
|
|
11
|
-
return fields.serialize_list(Organisation.query.all())
|
|
12
|
-
|
|
13
|
-
def check_read_permissions(self):
|
|
12
|
+
def check_read_permissions(self, options=None):
|
|
14
13
|
return True
|
|
15
14
|
|
|
16
15
|
|
|
@@ -25,3 +24,21 @@ class OrganisationResource(BaseModelResource):
|
|
|
25
24
|
if "hours_by_day" in data:
|
|
26
25
|
data["hours_by_day"] = float(data["hours_by_day"])
|
|
27
26
|
return data
|
|
27
|
+
|
|
28
|
+
def serialize_instance(self, data, relations=True):
|
|
29
|
+
return data.serialize(
|
|
30
|
+
relations=relations,
|
|
31
|
+
ignored_attrs=(
|
|
32
|
+
[]
|
|
33
|
+
if has_admin_permissions()
|
|
34
|
+
else [
|
|
35
|
+
"chat_token_slack",
|
|
36
|
+
"chat_webhook_mattermost",
|
|
37
|
+
"chat_token_discord",
|
|
38
|
+
]
|
|
39
|
+
),
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
def post_update(self, instance_dict, data):
|
|
43
|
+
persons_service.clear_organisation_cache()
|
|
44
|
+
return instance_dict
|
|
@@ -17,7 +17,7 @@ class OutputFilesResource(BaseModelsResource):
|
|
|
17
17
|
def __init__(self):
|
|
18
18
|
BaseModelsResource.__init__(self, OutputFile)
|
|
19
19
|
|
|
20
|
-
def check_read_permissions(self):
|
|
20
|
+
def check_read_permissions(self, options=None):
|
|
21
21
|
user_service.block_access_to_vendor()
|
|
22
22
|
return True
|
|
23
23
|
|