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.
Files changed (165) hide show
  1. zou/__init__.py +1 -1
  2. zou/app/__init__.py +10 -2
  3. zou/app/api.py +2 -0
  4. zou/app/blueprints/assets/__init__.py +22 -0
  5. zou/app/blueprints/assets/resources.py +241 -4
  6. zou/app/blueprints/auth/__init__.py +4 -0
  7. zou/app/blueprints/auth/resources.py +154 -22
  8. zou/app/blueprints/breakdown/resources.py +4 -4
  9. zou/app/blueprints/chats/__init__.py +22 -0
  10. zou/app/blueprints/chats/resources.py +199 -0
  11. zou/app/blueprints/comments/resources.py +36 -19
  12. zou/app/blueprints/crud/__init__.py +12 -0
  13. zou/app/blueprints/crud/attachment_file.py +14 -5
  14. zou/app/blueprints/crud/base.py +29 -28
  15. zou/app/blueprints/crud/chat.py +13 -0
  16. zou/app/blueprints/crud/chat_message.py +13 -0
  17. zou/app/blueprints/crud/comments.py +85 -29
  18. zou/app/blueprints/crud/custom_action.py +1 -1
  19. zou/app/blueprints/crud/day_off.py +47 -9
  20. zou/app/blueprints/crud/department.py +1 -25
  21. zou/app/blueprints/crud/entity.py +46 -5
  22. zou/app/blueprints/crud/entity_type.py +13 -1
  23. zou/app/blueprints/crud/event.py +1 -1
  24. zou/app/blueprints/crud/file_status.py +1 -1
  25. zou/app/blueprints/crud/metadata_descriptor.py +24 -10
  26. zou/app/blueprints/crud/organisation.py +22 -5
  27. zou/app/blueprints/crud/output_file.py +1 -1
  28. zou/app/blueprints/crud/output_type.py +1 -1
  29. zou/app/blueprints/crud/person.py +32 -24
  30. zou/app/blueprints/crud/playlist.py +1 -1
  31. zou/app/blueprints/crud/preview_background_file.py +6 -7
  32. zou/app/blueprints/crud/preview_file.py +1 -1
  33. zou/app/blueprints/crud/project.py +14 -6
  34. zou/app/blueprints/crud/project_status.py +1 -1
  35. zou/app/blueprints/crud/schedule_item.py +4 -2
  36. zou/app/blueprints/crud/software.py +1 -1
  37. zou/app/blueprints/crud/status_automation.py +1 -1
  38. zou/app/blueprints/crud/studio.py +33 -0
  39. zou/app/blueprints/crud/task.py +47 -3
  40. zou/app/blueprints/crud/task_status.py +1 -1
  41. zou/app/blueprints/crud/task_type.py +4 -4
  42. zou/app/blueprints/crud/working_file.py +4 -8
  43. zou/app/blueprints/events/resources.py +13 -12
  44. zou/app/blueprints/export/csv/assets.py +15 -6
  45. zou/app/blueprints/export/csv/edits.py +15 -5
  46. zou/app/blueprints/export/csv/playlists.py +1 -1
  47. zou/app/blueprints/export/csv/shots.py +15 -5
  48. zou/app/blueprints/export/csv/time_spents.py +1 -1
  49. zou/app/blueprints/files/resources.py +22 -23
  50. zou/app/blueprints/index/resources.py +38 -29
  51. zou/app/blueprints/news/resources.py +25 -11
  52. zou/app/blueprints/persons/__init__.py +5 -2
  53. zou/app/blueprints/persons/resources.py +126 -120
  54. zou/app/blueprints/previews/__init__.py +18 -8
  55. zou/app/blueprints/previews/resources.py +569 -328
  56. zou/app/blueprints/projects/resources.py +1 -1
  57. zou/app/blueprints/search/resources.py +18 -6
  58. zou/app/blueprints/shots/__init__.py +5 -0
  59. zou/app/blueprints/shots/resources.py +134 -4
  60. zou/app/blueprints/source/__init__.py +6 -6
  61. zou/app/blueprints/source/csv/assets.py +10 -3
  62. zou/app/blueprints/source/csv/base.py +1 -1
  63. zou/app/blueprints/source/csv/edits.py +10 -3
  64. zou/app/blueprints/source/csv/shots.py +10 -3
  65. zou/app/blueprints/source/{edl.py → otio.py} +84 -41
  66. zou/app/blueprints/tasks/__init__.py +3 -2
  67. zou/app/blueprints/tasks/resources.py +83 -52
  68. zou/app/blueprints/user/__init__.py +9 -0
  69. zou/app/blueprints/user/resources.py +170 -12
  70. zou/app/config.py +10 -0
  71. zou/app/mixin.py +6 -5
  72. zou/app/models/attachment_file.py +10 -4
  73. zou/app/models/base.py +18 -13
  74. zou/app/models/build_job.py +7 -4
  75. zou/app/models/chat.py +44 -0
  76. zou/app/models/chat_message.py +37 -0
  77. zou/app/models/comment.py +1 -0
  78. zou/app/models/day_off.py +3 -0
  79. zou/app/models/entity.py +4 -6
  80. zou/app/models/entity_type.py +2 -0
  81. zou/app/models/organisation.py +14 -15
  82. zou/app/models/person.py +6 -1
  83. zou/app/models/project.py +3 -0
  84. zou/app/models/search_filter.py +11 -0
  85. zou/app/models/search_filter_group.py +10 -0
  86. zou/app/models/serializer.py +17 -17
  87. zou/app/models/status_automation.py +2 -0
  88. zou/app/models/studio.py +13 -0
  89. zou/app/models/subscription.py +2 -2
  90. zou/app/models/task.py +6 -1
  91. zou/app/models/task_status.py +1 -0
  92. zou/app/models/task_type.py +1 -0
  93. zou/app/models/working_file.py +1 -1
  94. zou/app/services/assets_service.py +101 -14
  95. zou/app/services/auth_service.py +17 -44
  96. zou/app/services/breakdown_service.py +37 -5
  97. zou/app/services/chats_service.py +279 -0
  98. zou/app/services/comments_service.py +110 -65
  99. zou/app/services/concepts_service.py +4 -12
  100. zou/app/services/deletion_service.py +43 -30
  101. zou/app/services/edits_service.py +5 -11
  102. zou/app/services/emails_service.py +4 -4
  103. zou/app/services/entities_service.py +17 -2
  104. zou/app/services/events_service.py +12 -4
  105. zou/app/services/exception.py +5 -5
  106. zou/app/services/names_service.py +7 -2
  107. zou/app/services/news_service.py +17 -9
  108. zou/app/services/persons_service.py +38 -21
  109. zou/app/services/playlists_service.py +8 -7
  110. zou/app/services/preview_files_service.py +137 -10
  111. zou/app/services/projects_service.py +5 -14
  112. zou/app/services/shots_service.py +221 -49
  113. zou/app/services/sync_service.py +46 -42
  114. zou/app/services/tasks_service.py +185 -46
  115. zou/app/services/time_spents_service.py +67 -20
  116. zou/app/services/user_service.py +350 -107
  117. zou/app/stores/auth_tokens_store.py +2 -1
  118. zou/app/stores/file_store.py +18 -0
  119. zou/app/stores/publisher_store.py +7 -7
  120. zou/app/stores/queue_store.py +1 -0
  121. zou/app/swagger.py +36 -20
  122. zou/app/utils/cache.py +2 -0
  123. zou/app/utils/commands.py +104 -7
  124. zou/app/utils/csv_utils.py +1 -4
  125. zou/app/utils/date_helpers.py +33 -17
  126. zou/app/utils/dbhelpers.py +14 -1
  127. zou/app/utils/emails.py +2 -2
  128. zou/app/utils/fido.py +22 -0
  129. zou/app/utils/flask.py +1 -0
  130. zou/app/utils/query.py +54 -6
  131. zou/app/utils/redis.py +11 -0
  132. zou/app/utils/saml.py +51 -0
  133. zou/app/utils/string.py +2 -0
  134. zou/app/utils/thumbnail.py +4 -2
  135. zou/cli.py +76 -18
  136. zou/debug.py +4 -2
  137. zou/event_stream.py +122 -165
  138. zou/job_settings.py +1 -0
  139. zou/migrations/env.py +0 -0
  140. zou/migrations/utils/base.py +6 -6
  141. zou/migrations/versions/1bb55759146f_add_table_studio.py +67 -0
  142. zou/migrations/versions/1fab8c420678_add_attachments_to_message_chats.py +56 -0
  143. zou/migrations/versions/23122f290ca2_add_entity_chat_models.py +149 -0
  144. zou/migrations/versions/32f134ff1201_add_is_shared_flag_to_filters.py +33 -0
  145. zou/migrations/versions/57222395f2be_add_statusautomation_import_last_revision.py +41 -0
  146. zou/migrations/versions/59a7445a966c_add_entity_is_shared.py +41 -0
  147. zou/migrations/versions/5b980f0dc365_add_comment_links.py +35 -0
  148. zou/migrations/versions/680c64565f9d_for_searchfiltergroup_is_shared.py +35 -0
  149. zou/migrations/versions/8e67c183bed7_add_preference_fields.py +71 -0
  150. zou/migrations/versions/92b40d79ad3f_allow_message_attachments.py +38 -0
  151. zou/migrations/versions/971dbf5a0faf_add_short_name_for_asset_type_entity_.py +33 -0
  152. zou/migrations/versions/9b85c14fa8a7_add_day_off_new_columns.py +68 -0
  153. zou/migrations/versions/9d3bb33c6fc6_add_department_keys_to_filter_models.py +73 -0
  154. zou/migrations/versions/a252a094e977_add_descriptions_for_entities_tasks_and_.py +40 -0
  155. zou/migrations/versions/be56dc0fb760_for_is_shared_disallow_nullable.py +102 -0
  156. zou/migrations/versions/ca28796a2a62_add_is_done_field_to_the_task_model.py +108 -0
  157. zou/migrations/versions/f344b867a911_for_description_of_entity_task_working_.py +75 -0
  158. zou/remote/config_payload.py +2 -1
  159. zou/utils/movie.py +14 -4
  160. {zou-0.19.14.dist-info → zou-0.20.11.dist-info}/METADATA +75 -69
  161. {zou-0.19.14.dist-info → zou-0.20.11.dist-info}/RECORD +164 -135
  162. {zou-0.19.14.dist-info → zou-0.20.11.dist-info}/WHEEL +1 -1
  163. {zou-0.19.14.dist-info → zou-0.20.11.dist-info}/LICENSE +0 -0
  164. {zou-0.19.14.dist-info → zou-0.20.11.dist-info}/entry_points.txt +0 -0
  165. {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
- @jwt_required()
37
- def get(self, instance_id):
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
- comment = self.get_model_or_404(instance["id"])
109
- current_user = persons_service.get_current_user()
110
- if current_user["id"] != str(comment.person_id):
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
- user_service.check_task_status_access(data["task_status_id"])
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
- from zou.app.utils import date_helpers
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 update_data(self, data):
18
- data = super().update_data(data)
19
- data["date"] = date_helpers.get_date_from_string(data["date"])
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
- time_spents = TimeSpent.delete_all_by(
24
- person_id=instance.person_id, date=instance.date
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, instance):
37
- return user_service.check_day_off_access(instance)
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 events, fields, date_helpers
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 = fields.get_date_object(
191
- previous_shot["updated_at"], date_format="%Y-%m-%dT%H:%M:%S"
220
+ previous_updated_at = date_helpers.get_datetime_from_string(
221
+ previous_shot["updated_at"]
192
222
  )
193
- updated_at = fields.get_date_object(
194
- shot["updated_at"], date_format="%Y-%m-%dT%H:%M:%S"
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):
@@ -11,7 +11,7 @@ class EventsResource(BaseModelsResource):
11
11
  if query is None:
12
12
  query = self.model.query
13
13
 
14
- return self.model.serialize_list(
14
+ return self.serialize_list(
15
15
  query.limit(1000).all(), relations=relations
16
16
  )
17
17
 
@@ -6,7 +6,7 @@ class FileStatusesResource(BaseModelsResource):
6
6
  def __init__(self):
7
7
  BaseModelsResource.__init__(self, FileStatus)
8
8
 
9
- def check_read_permissions(self):
9
+ def check_read_permissions(self, options=None):
10
10
  return True
11
11
 
12
12
 
@@ -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
- ArgumentsException,
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 all_entries(self, query=None, relations=True):
18
- if query is None:
19
- query = self.model.query
20
+ def check_read_permissions(self, options=None):
21
+ return not permissions.has_vendor_permissions()
20
22
 
21
- return [
22
- metadata_descriptor.serialize(relations=relations)
23
- for metadata_descriptor in query.all()
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 ArgumentsException("Invalid data_type")
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 ArgumentsException("Invalid data_type")
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 get(self):
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
 
@@ -12,7 +12,7 @@ class OutputTypesResource(BaseModelsResource):
12
12
  def __init__(self):
13
13
  BaseModelsResource.__init__(self, OutputType)
14
14
 
15
- def check_read_permissions(self):
15
+ def check_read_permissions(self, options=None):
16
16
  return True
17
17
 
18
18