zou 0.20.15__py3-none-any.whl → 0.20.17__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 CHANGED
@@ -1 +1 @@
1
- __version__ = "0.20.15"
1
+ __version__ = "0.20.17"
@@ -140,7 +140,6 @@ class AssetsAndTasksResource(Resource, ArgsMixin):
140
140
  description: All assets with tasks
141
141
  """
142
142
  criterions = query.get_query_criterions_from_request(request)
143
- page = self.get_page()
144
143
  check_criterion_access(criterions)
145
144
  if permissions.has_vendor_permissions():
146
145
  criterions["assigned_to"] = persons_service.get_current_user()[
@@ -150,7 +149,7 @@ class AssetsAndTasksResource(Resource, ArgsMixin):
150
149
  str(department.id)
151
150
  for department in persons_service.get_current_user_raw().departments
152
151
  ]
153
- return assets_service.get_assets_and_tasks(criterions, page)
152
+ return assets_service.get_assets_and_tasks(criterions)
154
153
 
155
154
 
156
155
  class AssetTypeResource(Resource):
@@ -83,9 +83,10 @@ class DownloadAttachmentResource(Resource):
83
83
  ),
84
84
  )
85
85
  except Exception:
86
- current_app.logger.error(
87
- f"Attachment file was not found for: {attachment_file_id}"
88
- )
86
+ if config.LOG_FILE_NOT_FOUND:
87
+ current_app.logger.error(
88
+ f"Attachment file was not found for: {attachment_file_id}"
89
+ )
89
90
  abort(404)
90
91
 
91
92
 
@@ -47,8 +47,6 @@ class TasksResource(BaseModelsResource, ArgsMixin):
47
47
  name_filter,
48
48
  criterions,
49
49
  ) = super().build_filters(options)
50
- if "project_id" in criterions:
51
- del criterions["project_id"]
52
50
  if "episode_id" in criterions:
53
51
  del criterions["episode_id"]
54
52
  return (
@@ -61,7 +59,6 @@ class TasksResource(BaseModelsResource, ArgsMixin):
61
59
  def apply_filters(self, query, options):
62
60
  query = super().apply_filters(query, options)
63
61
 
64
- project_id = options.get("project_id", None)
65
62
  episode_id = options.get("episode_id", None)
66
63
  if episode_id is not None:
67
64
  Sequence = aliased(Entity)
@@ -70,10 +67,6 @@ class TasksResource(BaseModelsResource, ArgsMixin):
70
67
  .join(Sequence, Entity.parent_id == Sequence.id)
71
68
  .filter(Sequence.parent_id == episode_id)
72
69
  )
73
- elif project_id is not None:
74
- query = query.join(Entity, Task.entity_id == Entity.id).filter(
75
- Entity.project_id == project_id
76
- )
77
70
 
78
71
  return query
79
72
 
@@ -653,9 +653,10 @@ class PreviewFileMovieResource(BasePreviewFileResource):
653
653
  instance_id, last_modified=self.last_modified
654
654
  )
655
655
  except FileNotFound:
656
- current_app.logger.error(
657
- "Movie file was not found for: %s" % instance_id
658
- )
656
+ if config.LOG_FILE_NOT_FOUND:
657
+ current_app.logger.error(
658
+ "Movie file was not found for: %s" % instance_id
659
+ )
659
660
  abort(404)
660
661
 
661
662
 
@@ -698,9 +699,10 @@ class PreviewFileLowMovieResource(BasePreviewFileResource):
698
699
  instance_id, last_modified=self.last_modified
699
700
  )
700
701
  except FileNotFound:
701
- current_app.logger.error(
702
- "Movie file was not found for: %s" % instance_id
703
- )
702
+ if config.LOG_FILE_NOT_FOUND:
703
+ current_app.logger.error(
704
+ "Movie file was not found for: %s" % instance_id
705
+ )
704
706
  abort(404)
705
707
 
706
708
 
@@ -740,9 +742,10 @@ class PreviewFileMovieDownloadResource(BasePreviewFileResource):
740
742
  last_modified=self.last_modified,
741
743
  )
742
744
  except FileNotFound:
743
- current_app.logger.error(
744
- "Movie file was not found for: %s" % instance_id
745
- )
745
+ if config.LOG_FILE_NOT_FOUND:
746
+ current_app.logger.error(
747
+ "Movie file was not found for: %s" % instance_id
748
+ )
746
749
  abort(404)
747
750
 
748
751
 
@@ -800,9 +803,10 @@ class PreviewFileResource(BasePreviewFileResource):
800
803
  )
801
804
 
802
805
  except FileNotFound:
803
- current_app.logger.error(
804
- "Non-movie file was not found for: %s" % instance_id
805
- )
806
+ if config.LOG_FILE_NOT_FOUND:
807
+ current_app.logger.error(
808
+ "Non-movie file was not found for: %s" % instance_id
809
+ )
806
810
  abort(404)
807
811
 
808
812
 
@@ -869,9 +873,10 @@ class PreviewFileDownloadResource(BasePreviewFileResource):
869
873
  last_modified=self.last_modified,
870
874
  )
871
875
  except FileNotFound:
872
- current_app.logger.error(
873
- "Standard file was not found for: %s" % instance_id
874
- )
876
+ if config.LOG_FILE_NOT_FOUND:
877
+ current_app.logger.error(
878
+ "Standard file was not found for: %s" % instance_id
879
+ )
875
880
  abort(404)
876
881
 
877
882
 
@@ -935,10 +940,11 @@ class AttachmentThumbnailResource(Resource):
935
940
  ),
936
941
  )
937
942
  except FileNotFound:
938
- current_app.logger.error(
939
- "Picture file was not found for attachment: %s"
940
- % (attachment_file_id)
941
- )
943
+ if config.LOG_FILE_NOT_FOUND:
944
+ current_app.logger.error(
945
+ "Picture file was not found for attachment: %s"
946
+ % (attachment_file_id)
947
+ )
942
948
  abort(404)
943
949
 
944
950
 
@@ -982,9 +988,10 @@ class BasePreviewPictureResource(BasePreviewFileResource):
982
988
  last_modified=self.last_modified,
983
989
  )
984
990
  except FileNotFound:
985
- current_app.logger.error(
986
- "Picture file was not found for: %s" % instance_id
987
- )
991
+ if config.LOG_FILE_NOT_FOUND:
992
+ current_app.logger.error(
993
+ "Picture file was not found for: %s" % instance_id
994
+ )
988
995
  abort(404)
989
996
 
990
997
 
@@ -1166,14 +1173,13 @@ class BaseThumbnailResource(Resource):
1166
1173
  ),
1167
1174
  )
1168
1175
  except FileNotFound:
1169
- current_app.logger.error(
1170
- "Thumbnail file was not found for: %s" % instance_id
1171
- )
1176
+ if config.LOG_FILE_NOT_FOUND:
1177
+ current_app.logger.error(
1178
+ "Thumbnail file was not found for: %s" % instance_id
1179
+ )
1172
1180
  abort(404)
1173
- except IOError:
1174
- current_app.logger.error(
1175
- "Thumbnail file was not found for: %s" % instance_id
1176
- )
1181
+ except IOError as e:
1182
+ current_app.logger.error(e)
1177
1183
  abort(404)
1178
1184
 
1179
1185
 
@@ -1680,9 +1686,11 @@ class PreviewBackgroundFileResource(Resource):
1680
1686
  ),
1681
1687
  )
1682
1688
  except FileNotFound:
1683
- current_app.logger.error(
1684
- "Preview background file was not found for: %s" % instance_id
1685
- )
1689
+ if config.LOG_FILE_NOT_FOUND:
1690
+ current_app.logger.error(
1691
+ "Preview background file was not found for: %s"
1692
+ % instance_id
1693
+ )
1686
1694
  raise PreviewBackgroundFileNotFoundException
1687
1695
 
1688
1696
 
zou/app/config.py CHANGED
@@ -142,6 +142,7 @@ LOGS_MODE = os.getenv("LOGS_MODE", "default")
142
142
  LOGS_HOST = os.getenv("LOGS_HOST", "localhost")
143
143
  LOGS_PORT = os.getenv("LOGS_PORT", 2202)
144
144
  LOGS_TOKEN = os.getenv("LOGS_TOKEN")
145
+ LOG_FILE_NOT_FOUND = envtobool("LOG_FILE_NOT_FOUND", True)
145
146
 
146
147
  SENTRY_ENABLED = envtobool("SENTRY_ENABLED", False)
147
148
  SENTRY_DSN = os.getenv("SENTRY_DSN", "")
@@ -3,6 +3,7 @@ from sqlalchemy_utils import UUIDType
3
3
  from zou.app import db
4
4
  from zou.app.models.serializer import SerializerMixin
5
5
  from zou.app.models.base import BaseMixin
6
+ from zou.app.utils import fields
6
7
 
7
8
 
8
9
  class AttachmentFile(db.Model, BaseMixin, SerializerMixin):
@@ -31,12 +32,14 @@ class AttachmentFile(db.Model, BaseMixin, SerializerMixin):
31
32
  return "<AttachmentFile %s>" % self.id
32
33
 
33
34
  def present(self):
34
- return {
35
- "id": str(self.id),
36
- "name": self.name,
37
- "extension": self.extension,
38
- "size": self.size,
39
- }
35
+ return fields.serialize_dict(
36
+ {
37
+ "id": self.id,
38
+ "name": self.name,
39
+ "extension": self.extension,
40
+ "size": self.size,
41
+ }
42
+ )
40
43
 
41
44
  @classmethod
42
45
  def create_from_import(cls, data):
zou/app/models/chat.py CHANGED
@@ -3,6 +3,7 @@ from sqlalchemy_utils import UUIDType
3
3
  from zou.app import db
4
4
  from zou.app.models.serializer import SerializerMixin
5
5
  from zou.app.models.base import BaseMixin
6
+ from zou.app.utils import fields
6
7
 
7
8
 
8
9
  class ChatParticipant(db.Model):
@@ -37,8 +38,10 @@ class Chat(db.Model, BaseMixin, SerializerMixin):
37
38
  return "<Message of %s>" % self.object_id
38
39
 
39
40
  def present(self):
40
- return {
41
- "id": str(self.id),
42
- "object_id": str(self.object_id),
43
- "last_message": self.last_message,
44
- }
41
+ return fields.serialize_dict(
42
+ {
43
+ "id": self.id,
44
+ "object_id": self.object_id,
45
+ "last_message": self.last_message,
46
+ }
47
+ )
@@ -3,6 +3,7 @@ from sqlalchemy_utils import UUIDType, ChoiceType
3
3
  from zou.app import db
4
4
  from zou.app.models.serializer import SerializerMixin
5
5
  from zou.app.models.base import BaseMixin
6
+ from zou.app.utils import fields
6
7
 
7
8
  from sqlalchemy.dialects.postgresql import JSONB
8
9
 
@@ -82,16 +83,19 @@ class PreviewFile(db.Model, BaseMixin, SerializerMixin):
82
83
  return (previous_data, True)
83
84
 
84
85
  def present(self):
85
- return {
86
- "id": str(self.id),
87
- "name": self.name,
88
- "original_name": self.original_name,
89
- "extension": self.extension,
90
- "revision": self.revision,
91
- "position": self.position,
92
- "file_size": self.file_size,
93
- "status": str(self.status),
94
- "validation_status": str(self.validation_status),
95
- "task_id": str(self.task_id),
96
- "person_id": str(self.person_id),
97
- }
86
+ return fields.serialize_dict(
87
+ {
88
+ "id": self.id,
89
+ "name": self.name,
90
+ "original_name": self.original_name,
91
+ "extension": self.extension,
92
+ "revision": self.revision,
93
+ "position": self.position,
94
+ "file_size": self.file_size,
95
+ "status": self.status,
96
+ "validation_status": self.validation_status,
97
+ "task_id": self.task_id,
98
+ "person_id": self.person_id,
99
+ "created_at": self.created_at,
100
+ }
101
+ )
@@ -169,7 +169,7 @@ def get_full_assets(criterions={}):
169
169
  return assets
170
170
 
171
171
 
172
- def get_assets_and_tasks(criterions={}, page=1, with_episode_ids=False):
172
+ def get_assets_and_tasks(criterions={}, with_episode_ids=False):
173
173
  """
174
174
  Get all assets for given criterions with related tasks for each asset.
175
175
  """
@@ -188,7 +188,9 @@ def get_playlist_with_preview_file_revisions(playlist_id):
188
188
  shot["preview_file_status"] = preview_file["status"]
189
189
  shot["preview_file_annotations"] = preview_file["annotations"]
190
190
  shot["preview_file_task_id"] = preview_file["task_id"]
191
- shot["preview_file_previews"] = preview_file["previews"]
191
+ shot["preview_file_previews"] = preview_file.get(
192
+ "previews", []
193
+ )
192
194
  else:
193
195
  del shot["preview_file_id"]
194
196
  except Exception as e:
@@ -234,7 +236,6 @@ def set_preview_files_for_entities(playlist_dict):
234
236
  .all()
235
237
  )
236
238
 
237
- is_pictures = False
238
239
  for preview_file, task_type_id, entity_id in preview_files:
239
240
  entity_id = str(entity_id)
240
241
  task_type_id = str(task_type_id)
@@ -244,9 +245,6 @@ def set_preview_files_for_entities(playlist_dict):
244
245
  if task_type_id not in previews[entity_id]:
245
246
  previews[entity_id][task_type_id] = []
246
247
 
247
- if preview_file.extension == "png":
248
- is_pictures = True
249
-
250
248
  task_id = str(preview_file.task_id)
251
249
  preview_file_id = str(preview_file.id)
252
250
 
@@ -265,12 +263,11 @@ def set_preview_files_for_entities(playlist_dict):
265
263
  previews[entity_id][task_type_id].append(light_preview_file)
266
264
  preview_file_map[preview_file_id] = light_preview_file
267
265
 
268
- if is_pictures:
269
- for entity_id in previews.keys():
270
- for task_type_id in previews[entity_id].keys():
271
- previews[entity_id][task_type_id] = mix_preview_file_revisions(
272
- previews[entity_id][task_type_id]
273
- )
266
+ for entity_id in previews.keys():
267
+ for task_type_id in previews[entity_id].keys():
268
+ previews[entity_id][task_type_id] = mix_preview_file_revisions(
269
+ previews[entity_id][task_type_id]
270
+ )
274
271
 
275
272
  for entity in playlist_dict["shots"]:
276
273
  if str(entity["id"]) in previews:
@@ -1105,6 +1105,7 @@ def get_user_filter_groups(current_user_id):
1105
1105
  )
1106
1106
  )
1107
1107
  .filter(or_(build_open_project_filter(), Project.id == None))
1108
+ .order_by(SearchFilterGroup.created_at.desc())
1108
1109
  .all()
1109
1110
  )
1110
1111
 
zou/app/utils/fs.py CHANGED
@@ -1,6 +1,7 @@
1
1
  import os
2
2
  import shutil
3
3
  import time
4
+ from flask_fs.errors import FileNotFound
4
5
 
5
6
  import errno
6
7
 
@@ -44,6 +45,8 @@ def get_file_path_and_file(
44
45
  ):
45
46
  if config.FS_BACKEND == "local":
46
47
  file_path = get_local_path(prefix, instance_id)
48
+ if is_unvalid_file(file_path, file_size):
49
+ raise FileNotFound
47
50
  else:
48
51
  file_path = os.path.join(
49
52
  config.TMP_DIR, "cache-%s-%s.%s" % (prefix, instance_id, extension)
@@ -1,6 +1,7 @@
1
1
  from flask_jwt_extended.exceptions import NoAuthorizationError
2
2
  from jwt import ExpiredSignatureError
3
3
  from werkzeug.exceptions import Forbidden, NotFound
4
+ from flask_fs.errors import FileNotFound
4
5
 
5
6
  from zou.app import config
6
7
  from zou.app.utils import permissions
@@ -37,6 +38,7 @@ def init_monitoring(app):
37
38
  NotFound,
38
39
  Forbidden,
39
40
  ExpiredSignatureError,
41
+ FileNotFound,
40
42
  ],
41
43
  )
42
44
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: zou
3
- Version: 0.20.15
3
+ Version: 0.20.17
4
4
  Summary: API to store and manage the data of your animation production
5
5
  Home-page: https://zou.cg-wire.com
6
6
  Author: CG Wire
@@ -41,7 +41,7 @@ Requires-Dist: flask-jwt-extended==4.7.1
41
41
  Requires-Dist: flask-migrate==4.1.0
42
42
  Requires-Dist: flask-socketio==5.5.1
43
43
  Requires-Dist: flask==3.1.0
44
- Requires-Dist: gazu==0.10.26
44
+ Requires-Dist: gazu==0.10.27
45
45
  Requires-Dist: gevent-websocket==0.10.1
46
46
  Requires-Dist: gevent==24.11.1
47
47
  Requires-Dist: gunicorn==23.0.0
@@ -52,17 +52,17 @@ Requires-Dist: ldap3==2.9.1
52
52
  Requires-Dist: matterhook==0.2
53
53
  Requires-Dist: meilisearch==0.33.1
54
54
  Requires-Dist: numpy==2.0.1; python_version == "3.9"
55
- Requires-Dist: numpy==2.2.2; python_version >= "3.10"
55
+ Requires-Dist: numpy==2.2.3; python_version >= "3.10"
56
56
  Requires-Dist: opencv-python==4.11.0.86
57
57
  Requires-Dist: OpenTimelineIO==0.17.0
58
58
  Requires-Dist: OpenTimelineIO-Plugins==0.17.0
59
59
  Requires-Dist: orjson==3.10.15
60
60
  Requires-Dist: pillow==11.1.0
61
- Requires-Dist: psutil==6.1.1
61
+ Requires-Dist: psutil==7.0.0
62
62
  Requires-Dist: psycopg[binary]==3.2.4
63
63
  Requires-Dist: pyotp==2.9.0
64
- Requires-Dist: pysaml2==7.5.0
65
- Requires-Dist: python-nomad==2.0.1
64
+ Requires-Dist: pysaml2==7.5.2
65
+ Requires-Dist: python-nomad==2.1.0
66
66
  Requires-Dist: python-slugify==8.0.4
67
67
  Requires-Dist: python-socketio==5.12.1
68
68
  Requires-Dist: pytz==2025.1
@@ -71,7 +71,7 @@ Requires-Dist: requests==2.32.3
71
71
  Requires-Dist: rq==2.1.0
72
72
  Requires-Dist: slackclient==2.9.4
73
73
  Requires-Dist: sqlalchemy_utils==0.41.2
74
- Requires-Dist: sqlalchemy==2.0.37
74
+ Requires-Dist: sqlalchemy==2.0.38
75
75
  Requires-Dist: ua-parser==1.0.1
76
76
  Requires-Dist: werkzeug==3.1.3
77
77
  Provides-Extra: prod
@@ -80,14 +80,14 @@ Requires-Dist: gevent; extra == "prod"
80
80
  Provides-Extra: dev
81
81
  Requires-Dist: wheel; extra == "dev"
82
82
  Provides-Extra: test
83
- Requires-Dist: fakeredis==2.26.2; extra == "test"
83
+ Requires-Dist: fakeredis==2.27.0; extra == "test"
84
84
  Requires-Dist: mixer==7.2.2; extra == "test"
85
85
  Requires-Dist: pytest-cov==6.0.0; extra == "test"
86
86
  Requires-Dist: pytest==8.3.4; extra == "test"
87
87
  Provides-Extra: monitoring
88
88
  Requires-Dist: prometheus-flask-exporter==0.23.1; extra == "monitoring"
89
89
  Requires-Dist: pygelf==0.4.2; extra == "monitoring"
90
- Requires-Dist: sentry-sdk==2.20.0; extra == "monitoring"
90
+ Requires-Dist: sentry-sdk==2.21.0; extra == "monitoring"
91
91
  Provides-Extra: lint
92
92
  Requires-Dist: autoflake==2.3.1; extra == "lint"
93
93
  Requires-Dist: black==25.1.0; extra == "lint"
@@ -1,16 +1,16 @@
1
- zou/__init__.py,sha256=qx2qBaxijq_GGtI51BGXX5lmkBS7HlcGbPCmaum1Gf8,24
1
+ zou/__init__.py,sha256=eM75ih3rRMeRs2KAFT1C-wtFC_fhUYsPhS2X2Aa8ILk,24
2
2
  zou/cli.py,sha256=8JyGrWm7-Ykshv5IBjwlBMn8JkFpHPCADChA9n8loTI,18755
3
3
  zou/debug.py,sha256=1fawPbkD4wn0Y9Gk0BiBFSa-CQe5agFi8R9uJYl2Uyk,520
4
4
  zou/event_stream.py,sha256=EpohqFJwWL0zs-Ic_W5dX5_XSDeCrqHQPL5Re39OnQ0,6382
5
5
  zou/job_settings.py,sha256=_aqBhujt2Q8sXRWIbgbDf-LUdXRdBimdtTc-fZbiXoY,202
6
6
  zou/app/__init__.py,sha256=zGmaBGBHSS_Px34I3_WZmcse62G_AZJArjm4F6TwmRk,7100
7
7
  zou/app/api.py,sha256=JTB_IMVO8EOoyqx9KdRkiIix0chOLi0yGDY-verUJXA,5127
8
- zou/app/config.py,sha256=U3DuUOwZ66FZWVwwV-11SyhmpktGh7J7CgoE11jidSs,6687
8
+ zou/app/config.py,sha256=qHf5txUICLVbzQH1dTKrrUU1pVzgpevNu27DbJPP0vg,6746
9
9
  zou/app/mixin.py,sha256=eYwfS_CUFvNmldaQXrjsN5mK_gX0wYrBFykfx60uUM8,4897
10
10
  zou/app/swagger.py,sha256=Jr7zsMqJi0V4FledODOdu-aqqVE02jMFzhqVxHK0_2c,54158
11
11
  zou/app/blueprints/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
12
12
  zou/app/blueprints/assets/__init__.py,sha256=T2zhDagHjXF6jRwOQ8vqokZTkBHyY7XtTI0Rlooamjs,2931
13
- zou/app/blueprints/assets/resources.py,sha256=y1fMLrgO8vFXoJT4srh-FP4IFlGvh_E0NxhQ5AK-9O0,25600
13
+ zou/app/blueprints/assets/resources.py,sha256=Cqdot0vR6ccHNC5b0FVDq2x_Ujankk61N3EKV0A4q3M,25563
14
14
  zou/app/blueprints/auth/__init__.py,sha256=xP874bMWUnLIirOPSEbpe-Q2fBBQrxZGKd0tLZmNJXk,1128
15
15
  zou/app/blueprints/auth/resources.py,sha256=YIhdEVK9WQ7fCYtknwh3dR3TdSdURRm7rBpDxpNSGK0,45608
16
16
  zou/app/blueprints/breakdown/__init__.py,sha256=Dp6GWSGxxWIedpyzTTEKpCRUYEo8oVNVyQhwNvTMmQM,1888
@@ -18,7 +18,7 @@ zou/app/blueprints/breakdown/resources.py,sha256=pmGlHLiXFsPRbxf403SiVgGiaBbtK8G
18
18
  zou/app/blueprints/chats/__init__.py,sha256=YGmwGvddg3MgSYVIh-hmkX8t2em9_LblxBeJzFqFJD4,558
19
19
  zou/app/blueprints/chats/resources.py,sha256=4yLFermdwOsnBLs9nx8yxuHWLar24uQWQy0XgsUNDD0,5950
20
20
  zou/app/blueprints/comments/__init__.py,sha256=WqpJ7-_dK1cInGTFJAxQ7syZtPCotwq2oO20UEnk1h4,1532
21
- zou/app/blueprints/comments/resources.py,sha256=X1I0lu6iv1xS-5Tci9P9qnJzCy3jOpE9tDfcti3XwUA,18810
21
+ zou/app/blueprints/comments/resources.py,sha256=Jy20lMmdP-Zeg90P8-k-HQYfE83xW5DMK8B5WX5uFvs,18864
22
22
  zou/app/blueprints/concepts/__init__.py,sha256=sP_P4mfYvfMcgeE6MHZYP3eD0Lz0Lwit5-CFuVnA-Jg,894
23
23
  zou/app/blueprints/concepts/resources.py,sha256=maJNrBAWX0bKbDKtOZc3YFp4nTVtIdkkAA4H9WA9n1Y,10140
24
24
  zou/app/blueprints/crud/__init__.py,sha256=qn7xkEh2EG0mPS_RBmm0GgYr0O1jnmI8ymXZnFWZCz8,8361
@@ -56,7 +56,7 @@ zou/app/blueprints/crud/software.py,sha256=oKFINQh3DcVTd0Ap_cvgsgvhrIbGPjVBKucwk
56
56
  zou/app/blueprints/crud/status_automation.py,sha256=BY846JKmFMpTZBZ0DlWXpQ-LHwCpOwAWU8qekK89yk0,2361
57
57
  zou/app/blueprints/crud/studio.py,sha256=N0JjQ92ilFuPcFsq2WYBeaeeXHyPDXf_-UtSQpSFN4A,951
58
58
  zou/app/blueprints/crud/subscription.py,sha256=xFV_nvRg2ow6E0JWo4VHgeK_SkKX3K8i80thY3qRCl0,392
59
- zou/app/blueprints/crud/task.py,sha256=7ZMetDs4Z-ZxO0IjyM4y1kmzQUGyLvf0ga6pxZOrNsA,5793
59
+ zou/app/blueprints/crud/task.py,sha256=ZYHngIDkxAOGRPUf7O1i7K8lKq1eeqtMwzDZqZYR0kc,5485
60
60
  zou/app/blueprints/crud/task_status.py,sha256=roRbBJtyoaNrXv5nkVIPLH6K5vdJjGQtiWFvqlfbo9s,1482
61
61
  zou/app/blueprints/crud/task_type.py,sha256=9DUtBaNZqC0yHmunKX_CaUyo-bHjNTX3B-g4zyU5uKc,1815
62
62
  zou/app/blueprints/crud/time_spent.py,sha256=9tfoKJ77OEDTnpKHshO3UMDz_KCoyLq1CWquInm5DY0,3057
@@ -91,7 +91,7 @@ zou/app/blueprints/persons/resources.py,sha256=PfK6epzRn_kbqN6g9qYiH9XWStFlccTVC
91
91
  zou/app/blueprints/playlists/__init__.py,sha256=vuEk1F3hFHsmuKWhdepMoLyOzmNKDn1YrjjfcaIz0lQ,1596
92
92
  zou/app/blueprints/playlists/resources.py,sha256=alRlMHypUFErXLsEYxpFK84cdjFJ3YWwamZtW0KcwLY,17211
93
93
  zou/app/blueprints/previews/__init__.py,sha256=ihC6OQ9AUjnZ2JeMnjRh_tKGO0UmAjOwhZnOivc3BnQ,4460
94
- zou/app/blueprints/previews/resources.py,sha256=22-ISgZba0SpQ2sS0l5WjVtLTaiLKoal4aLcqxLQX9s,53176
94
+ zou/app/blueprints/previews/resources.py,sha256=gEOPfX47HEfcEHRS-gmF5Ui1ASaxoVt64WNvtLwcPXU,53614
95
95
  zou/app/blueprints/projects/__init__.py,sha256=Pn3fA5bpNFEPBzxTKJ2foV6osZFflXXSM2l2uZh3ktM,3927
96
96
  zou/app/blueprints/projects/resources.py,sha256=1WBS2FyaY1RSA_T-BdPnc8X9myjTJ127bMDigyoAklk,31979
97
97
  zou/app/blueprints/search/__init__.py,sha256=QCjQIY_85l_orhdEiqav_GifjReuwsjZggN3V0GeUVY,356
@@ -136,10 +136,10 @@ zou/app/indexer/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
136
136
  zou/app/indexer/indexing.py,sha256=s8Jx62itbeptPlxnl1tFozF3e5HKxEMq-pOnwomVumE,3718
137
137
  zou/app/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
138
138
  zou/app/models/asset_instance.py,sha256=ajfyA3qe6IjoNvd3mM8yr7wk9p4R9WO0qTfqT9ijntg,1714
139
- zou/app/models/attachment_file.py,sha256=d3gldEyKhRyLqGQHBbWVwtmPgtq7oxipxHanZUKWVGI,1377
139
+ zou/app/models/attachment_file.py,sha256=26SAjgGncoUbpgyygXg8tigEBWMgaz9wfn8Kx6dLueM,1470
140
140
  zou/app/models/base.py,sha256=vZoPzdixyRbk0SoDJGEbQ9LFouBaDCA7gVSZ1o_SIhI,8808
141
141
  zou/app/models/build_job.py,sha256=aW6KZXkyMP9d3g8fvcOYk9EAoNMw-6IleZdWbaqLLVw,1286
142
- zou/app/models/chat.py,sha256=yeKqe6o7RRAExx8xD-7dRXzUPhq_dwZffrbIG4HQp1w,1189
142
+ zou/app/models/chat.py,sha256=u-IZB67IYlMMoPooFSKJX2kpXFdshlmRKf7UuwAcA6c,1273
143
143
  zou/app/models/chat_message.py,sha256=8w7xtoqCW_CRoGKrF4ba5w-oyAHIRh-2ms3p5sQQor4,874
144
144
  zou/app/models/comment.py,sha256=sJxLnMNhdgvqm_nlcaRauxsMgFUQyMLxcCK8JkeJQJE,5875
145
145
  zou/app/models/custom_action.py,sha256=wx5ASKJ2oG-ivASZbVf1nLiL7zELgQBJ8U1jDdvGkuU,578
@@ -162,7 +162,7 @@ zou/app/models/output_type.py,sha256=us_lCUCEvuP4vi_XmmOcEl1J2MtZhMX5ZheBqEFCgWA
162
162
  zou/app/models/person.py,sha256=txHmSzokaS-tET_MIjGHxhNNS8CPt-GzUPIhp5baDmU,7714
163
163
  zou/app/models/playlist.py,sha256=YGgAk84u0_fdIEY02Dal4kfk8APVZvWFwWYV74qvrio,1503
164
164
  zou/app/models/preview_background_file.py,sha256=j8LgRmY7INnlB07hFwwB-8ssQrRC8vsb8VcpsTbt6tA,559
165
- zou/app/models/preview_file.py,sha256=Ur45Wau2X3qyKULh04EUcMbnBmaQc8y4IMs5NgELiAQ,3134
165
+ zou/app/models/preview_file.py,sha256=eDPXw0QIdJze_E4kAS8SsyabrefWhIIdwuGmjss7iXo,3282
166
166
  zou/app/models/project.py,sha256=T2gTImmbd5O-U5GySWSwzkR0r_cY2RDr1niwSfOPqeA,8900
167
167
  zou/app/models/project_status.py,sha256=pExaHH7x4Eu8xOqD3_mRRbMzjT2jJZ8rm-9jo7yUGXA,390
168
168
  zou/app/models/schedule_item.py,sha256=coY5uDDuBoctaMICnfCzx4zT5om2E1uu4iq5MDWAPlY,1444
@@ -179,7 +179,7 @@ zou/app/models/task_type.py,sha256=IsixVAfz3pyMf0eQw8x-uFNM9OHNkZpsPLEz_VNQ0hA,1
179
179
  zou/app/models/time_spent.py,sha256=n7i3FO9g1eE_zATkItoCgrGVqq3iMSfdlKSveEZPloc,795
180
180
  zou/app/models/working_file.py,sha256=q0LM3s1ziw_9AmmPDCkwyf1-TJkWTBMgo2LdHyVRwxg,1509
181
181
  zou/app/services/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
182
- zou/app/services/assets_service.py,sha256=WOV0XTp5JKNclI9MnYH_4wcWk_u3UYObberaX78Q8u4,23995
182
+ zou/app/services/assets_service.py,sha256=VSGZp2EtFZzaqaT_ysOSDAmnYcp1UYdhY1-WlISxvl8,23987
183
183
  zou/app/services/auth_service.py,sha256=hQpNb21xlr5EiTrXnzpFb4W4GDtglubqA2z_-YIBfnk,22897
184
184
  zou/app/services/backup_service.py,sha256=_ZtZp6wkcVYnHxBosziwLGdrTvsUttXGphiydq53iy8,4840
185
185
  zou/app/services/base_service.py,sha256=OZd0STFh-DyBBdwsmA7DMMnrwv4C8wJUbShvZ1isndU,1383
@@ -201,7 +201,7 @@ zou/app/services/names_service.py,sha256=TOSrintROmxcAlcFQE0i2E3PBLnw81GAztNselp
201
201
  zou/app/services/news_service.py,sha256=eOXkvLhOcgncI2NrgiJEccV28oxZX5CsZVqaE-l4kWQ,9084
202
202
  zou/app/services/notifications_service.py,sha256=7GDRio_mGaRYV5BHOAdpxBZjA_LLYUfVpbwZqy1n9pI,15685
203
203
  zou/app/services/persons_service.py,sha256=ccPP1_anu2J4zH54LKeP7dt1VyVpiYvzfgOS1xXhLrQ,16564
204
- zou/app/services/playlists_service.py,sha256=pAlPHET4jNdST5jsmJrFUkf1SVhfSoML9zdNpZ_88l4,32439
204
+ zou/app/services/playlists_service.py,sha256=Gs5K6jDJmnbdWqNvM3J0cOn0Lfxh_JtoPdEmqYXFSWk,32345
205
205
  zou/app/services/preview_files_service.py,sha256=Yk-vwzHuKTzNkEZfl9DhQRdDuRU006uwZxJ-RKajEkI,35842
206
206
  zou/app/services/projects_service.py,sha256=aIbYaFomy7OX2Pxvkf9w5qauDvkjuc9ummSGNYIpQMY,21249
207
207
  zou/app/services/scenes_service.py,sha256=iXN19HU4njPF5VtZXuUrVJ-W23ZQuQNPC3ADXltbWtU,992
@@ -213,7 +213,7 @@ zou/app/services/sync_service.py,sha256=kJ1LGMNfPh9_BDwGTfoYWHrLZ8OlT0hWk-R8wNt0
213
213
  zou/app/services/tasks_service.py,sha256=6lJHxVAQ0dxHdO8_2PaVqLwy87s44kvLRj6S9dw-Bvs,68534
214
214
  zou/app/services/telemetry_services.py,sha256=xQm1h1t_JxSFW59zQGf4NuNdUi1UfMa_6pQ-ytRbmGA,1029
215
215
  zou/app/services/time_spents_service.py,sha256=H9X-60s6oqtY9rtU-K2jKwUSljfkdGlf_9wMr3iVfIA,15158
216
- zou/app/services/user_service.py,sha256=QlyckTfiCx-bzRewqVwHMJQXerg6BWXYWfURhvp65G4,50291
216
+ zou/app/services/user_service.py,sha256=74gi_ao4gQenmN95Yf2aRmVyTFTJ8TIZO3joov2SNJ4,50346
217
217
  zou/app/stores/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
218
218
  zou/app/stores/auth_tokens_store.py,sha256=-qOJPybLHvnMOq3PWk073OW9HJwOHGhFLZeOIlX1UVw,1290
219
219
  zou/app/stores/file_store.py,sha256=yLQDM6mNbj9oe0vsWdBqun7D8Dw-eSjD1yHCCftX0OI,4045
@@ -235,10 +235,10 @@ zou/app/utils/events.py,sha256=a_W70v0Oi4QJwJzCLVUQ8RTwjlWo-VzAT_hQZCz2HQU,3024
235
235
  zou/app/utils/fido.py,sha256=qhUWZdDCvgWqydYS4DN1SVkNwdAQkRSV9zs0Xw9O15E,536
236
236
  zou/app/utils/fields.py,sha256=uZbKRqeG5_SmbOu3K0W-i-KmlTI1Y7X4rlKcVnu4DzI,3475
237
237
  zou/app/utils/flask.py,sha256=t0sC6yEDyzn-vCsijWzI9lpNWoxAYWfui25QtjQi_64,1822
238
- zou/app/utils/fs.py,sha256=TcPpuTq5u2B9Yyl-vieceuYOksF1oQnAnl2bCS4uya4,3234
238
+ zou/app/utils/fs.py,sha256=EIRfKJXtHubVVi8FlDd9s9TcUok91LvRgU0l_B3Fq3w,3356
239
239
  zou/app/utils/git.py,sha256=MhmAYvEY-bXsnLvcHUW_NY5V636lJL3H-cdNrTHgLGk,114
240
240
  zou/app/utils/logs.py,sha256=lB6kyFmeANxCILUULLqGN8fuq9IY5FcbrVWmLdqWs2U,1404
241
- zou/app/utils/monitoring.py,sha256=xOwyfM-7ZKWNtOxmX2WB1fOav5NpY6k8Tmuhli0nMBs,2082
241
+ zou/app/utils/monitoring.py,sha256=XCpl0QshKD_tSok1vrIu9lB97JsvKLhvxJo3UyeqEoQ,2153
242
242
  zou/app/utils/permissions.py,sha256=Oq91C_lN6aGVCtCVUqQhijMQEjXOiMezbngpjybzzQk,3426
243
243
  zou/app/utils/query.py,sha256=q8ETGPAqnz0Pt9xWoQt5o7FFAVYUKVCJiWpwefIr-iU,4592
244
244
  zou/app/utils/redis.py,sha256=xXEh9pl-3qPbr89dKHvcXSUTC6hd77vv_N8PVcRRZTE,377
@@ -416,9 +416,9 @@ zou/remote/normalize_movie.py,sha256=zNfEY3N1UbAHZfddGONTg2Sff3ieLVWd4dfZa1dpnes
416
416
  zou/remote/playlist.py,sha256=AsDo0bgYhDcd6DfNRV6r6Jj3URWwavE2ZN3VkKRPbLU,3293
417
417
  zou/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
418
418
  zou/utils/movie.py,sha256=d67fIL9dVBKt-E_qCGXRbNNdbJaJR5sHvZeX3hf8ldE,16559
419
- zou-0.20.15.dist-info/LICENSE,sha256=dql8h4yceoMhuzlcK0TT_i-NgTFNIZsgE47Q4t3dUYI,34520
420
- zou-0.20.15.dist-info/METADATA,sha256=o4r3Y9W25b_qntiXtCV0Eqr052SS0LXNSkzNw98Mge0,6733
421
- zou-0.20.15.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
422
- zou-0.20.15.dist-info/entry_points.txt,sha256=PelQoIx3qhQ_Tmne7wrLY-1m2izuzgpwokoURwSohy4,130
423
- zou-0.20.15.dist-info/top_level.txt,sha256=4S7G_jk4MzpToeDItHGjPhHx_fRdX52zJZWTD4SL54g,4
424
- zou-0.20.15.dist-info/RECORD,,
419
+ zou-0.20.17.dist-info/LICENSE,sha256=dql8h4yceoMhuzlcK0TT_i-NgTFNIZsgE47Q4t3dUYI,34520
420
+ zou-0.20.17.dist-info/METADATA,sha256=lkJtGd3fG9hUuzaxsrEAsG7_CvPPOcSwwTgA95p83bI,6733
421
+ zou-0.20.17.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
422
+ zou-0.20.17.dist-info/entry_points.txt,sha256=PelQoIx3qhQ_Tmne7wrLY-1m2izuzgpwokoURwSohy4,130
423
+ zou-0.20.17.dist-info/top_level.txt,sha256=4S7G_jk4MzpToeDItHGjPhHx_fRdX52zJZWTD4SL54g,4
424
+ zou-0.20.17.dist-info/RECORD,,
File without changes
File without changes