zou 0.20.16__py3-none-any.whl → 0.20.18__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.16"
1
+ __version__ = "0.20.18"
@@ -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
 
@@ -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", False)
145
146
 
146
147
  SENTRY_ENABLED = envtobool("SENTRY_ENABLED", False)
147
148
  SENTRY_DSN = os.getenv("SENTRY_DSN", "")
zou/app/models/comment.py CHANGED
@@ -6,21 +6,19 @@ from zou.app.models.serializer import SerializerMixin
6
6
  from zou.app.models.base import BaseMixin
7
7
 
8
8
 
9
- preview_link_table = db.Table(
10
- "comment_preview_link",
11
- db.Column(
12
- "comment",
9
+ class CommentPreviewLink(db.Model):
10
+ comment = db.Column(
13
11
  UUIDType(binary=False),
14
12
  db.ForeignKey("comment.id"),
15
13
  primary_key=True,
16
- ),
17
- db.Column(
18
- "preview_file",
14
+ index=True,
15
+ )
16
+ preview_file = db.Column(
19
17
  UUIDType(binary=False),
20
18
  db.ForeignKey("preview_file.id"),
21
19
  primary_key=True,
22
- ),
23
- )
20
+ index=True,
21
+ )
24
22
 
25
23
 
26
24
  mentions_table = db.Table(
@@ -107,7 +105,9 @@ class Comment(db.Model, BaseMixin, SerializerMixin):
107
105
  UUIDType(binary=False), db.ForeignKey("preview_file.id")
108
106
  )
109
107
  previews = db.relationship(
110
- "PreviewFile", secondary=preview_link_table, backref="comments"
108
+ "PreviewFile",
109
+ secondary=CommentPreviewLink.__table__,
110
+ backref="comments",
111
111
  )
112
112
  mentions = db.relationship("Person", secondary=mentions_table)
113
113
  department_mentions = db.relationship(
zou/app/models/project.py CHANGED
@@ -29,10 +29,16 @@ PROJECT_STYLES = [
29
29
  class ProjectPersonLink(db.Model):
30
30
  __tablename__ = "project_person_link"
31
31
  project_id = db.Column(
32
- UUIDType(binary=False), db.ForeignKey("project.id"), primary_key=True
32
+ UUIDType(binary=False),
33
+ db.ForeignKey("project.id"),
34
+ primary_key=True,
35
+ index=True,
33
36
  )
34
37
  person_id = db.Column(
35
- UUIDType(binary=False), db.ForeignKey("person.id"), primary_key=True
38
+ UUIDType(binary=False),
39
+ db.ForeignKey("person.id"),
40
+ primary_key=True,
41
+ index=True,
36
42
  )
37
43
  shotgun_id = db.Column(db.Integer)
38
44
 
@@ -40,10 +46,16 @@ class ProjectPersonLink(db.Model):
40
46
  class ProjectTaskTypeLink(db.Model, BaseMixin, SerializerMixin):
41
47
  __tablename__ = "project_task_type_link"
42
48
  project_id = db.Column(
43
- UUIDType(binary=False), db.ForeignKey("project.id"), primary_key=True
49
+ UUIDType(binary=False),
50
+ db.ForeignKey("project.id"),
51
+ primary_key=True,
52
+ index=True,
44
53
  )
45
54
  task_type_id = db.Column(
46
- UUIDType(binary=False), db.ForeignKey("task_type.id"), primary_key=True
55
+ UUIDType(binary=False),
56
+ db.ForeignKey("task_type.id"),
57
+ primary_key=True,
58
+ index=True,
47
59
  )
48
60
  priority = db.Column(db.Integer, default=None)
49
61
 
@@ -57,12 +69,16 @@ class ProjectTaskTypeLink(db.Model, BaseMixin, SerializerMixin):
57
69
  class ProjectTaskStatusLink(db.Model, BaseMixin, SerializerMixin):
58
70
  __tablename__ = "project_task_status_link"
59
71
  project_id = db.Column(
60
- UUIDType(binary=False), db.ForeignKey("project.id"), primary_key=True
72
+ UUIDType(binary=False),
73
+ db.ForeignKey("project.id"),
74
+ primary_key=True,
75
+ index=True,
61
76
  )
62
77
  task_status_id = db.Column(
63
78
  UUIDType(binary=False),
64
79
  db.ForeignKey("task_status.id"),
65
80
  primary_key=True,
81
+ index=True,
66
82
  )
67
83
  priority = db.Column(db.Integer, default=None)
68
84
  roles_for_board = db.Column(
@@ -92,12 +108,16 @@ class ProjectAssetTypeLink(db.Model):
92
108
  class ProjectStatusAutomationLink(db.Model):
93
109
  __tablename__ = "project_status_automation_link"
94
110
  project_id = db.Column(
95
- UUIDType(binary=False), db.ForeignKey("project.id"), primary_key=True
111
+ UUIDType(binary=False),
112
+ db.ForeignKey("project.id"),
113
+ primary_key=True,
114
+ index=True,
96
115
  )
97
116
  status_automation_id = db.Column(
98
117
  UUIDType(binary=False),
99
118
  db.ForeignKey("status_automation.id"),
100
119
  primary_key=True,
120
+ index=True,
101
121
  )
102
122
 
103
123
 
@@ -202,6 +202,7 @@ def get_assets_and_tasks(criterions={}, with_episode_ids=False):
202
202
  Task.due_date,
203
203
  Task.done_date,
204
204
  Task.last_comment_date,
205
+ Task.last_preview_file_id,
205
206
  Task.difficulty,
206
207
  assignees_table.columns.person,
207
208
  ).order_by(EntityType.name, Entity.name)
@@ -294,6 +295,7 @@ def get_assets_and_tasks(criterions={}, with_episode_ids=False):
294
295
  task_due_date,
295
296
  task_done_date,
296
297
  task_last_comment_date,
298
+ task_last_preview_file_id,
297
299
  task_difficulty,
298
300
  person_id,
299
301
  ) in query_result:
@@ -346,6 +348,7 @@ def get_assets_and_tasks(criterions={}, with_episode_ids=False):
346
348
  "last_comment_date": fields.serialize_value(
347
349
  task_last_comment_date
348
350
  ),
351
+ "last_preview_file_id": str(task_last_preview_file_id or ""),
349
352
  "priority": task_priority or 0,
350
353
  "real_start_date": fields.serialize_value(
351
354
  task_real_start_date
@@ -106,6 +106,7 @@ def get_edits_and_tasks(criterions={}):
106
106
  Task.start_date,
107
107
  Task.due_date,
108
108
  Task.last_comment_date,
109
+ Task.last_preview_file_id,
109
110
  Task.nb_assets_ready,
110
111
  assignees_table.columns.person,
111
112
  Project.id,
@@ -153,6 +154,7 @@ def get_edits_and_tasks(criterions={}):
153
154
  task_start_date,
154
155
  task_due_date,
155
156
  task_last_comment_date,
157
+ task_last_preview_file_id,
156
158
  task_nb_assets_ready,
157
159
  person_id,
158
160
  project_id,
@@ -203,6 +205,7 @@ def get_edits_and_tasks(criterions={}):
203
205
  "end_date": task_end_date,
204
206
  "estimation": task_estimation,
205
207
  "last_comment_date": task_last_comment_date,
208
+ "last_preview_file_id": task_last_preview_file_id,
206
209
  "is_subscribed": subscription_map.get(task_id, False),
207
210
  "nb_assets_ready": task_nb_assets_ready,
208
211
  "priority": task_priority or 0,
@@ -251,6 +251,7 @@ def get_entities_and_tasks(criterions={}):
251
251
  Task.due_date,
252
252
  Task.done_date,
253
253
  Task.last_comment_date,
254
+ Task.last_preview_file_id,
254
255
  Task.difficulty,
255
256
  assignees_table.columns.person,
256
257
  )
@@ -282,6 +283,7 @@ def get_entities_and_tasks(criterions={}):
282
283
  task_due_date,
283
284
  task_done_date,
284
285
  task_last_comment_date,
286
+ task_last_preview_file_id,
285
287
  task_difficulty,
286
288
  person_id,
287
289
  ) in query.all():
@@ -322,6 +324,7 @@ def get_entities_and_tasks(criterions={}):
322
324
  "duration": task_duration,
323
325
  "is_subscribed": subscription_map.get(task_id, False),
324
326
  "last_comment_date": task_last_comment_date,
327
+ "last_preview_file_id": task_last_preview_file_id,
325
328
  "priority": task_priority or 0,
326
329
  "real_start_date": task_real_start_date,
327
330
  "retake_count": task_retake_count,
@@ -253,6 +253,7 @@ def get_shots_and_tasks(criterions={}):
253
253
  Task.due_date,
254
254
  Task.done_date,
255
255
  Task.last_comment_date,
256
+ Task.last_preview_file_id,
256
257
  Task.nb_assets_ready,
257
258
  Task.difficulty,
258
259
  assignees_table.columns.person,
@@ -304,6 +305,7 @@ def get_shots_and_tasks(criterions={}):
304
305
  task_due_date,
305
306
  task_done_date,
306
307
  task_last_comment_date,
308
+ task_last_preview_file_id,
307
309
  task_nb_assets_ready,
308
310
  task_difficulty,
309
311
  person_id,
@@ -364,6 +366,7 @@ def get_shots_and_tasks(criterions={}):
364
366
  "estimation": task_estimation,
365
367
  "is_subscribed": subscription_map.get(task_id, False),
366
368
  "last_comment_date": task_last_comment_date,
369
+ "last_preview_file_id": task_last_preview_file_id,
367
370
  "nb_assets_ready": task_nb_assets_ready,
368
371
  "priority": task_priority or 0,
369
372
  "real_start_date": task_real_start_date,
@@ -15,7 +15,7 @@ from zou.app.models.comment import (
15
15
  acknowledgements_table,
16
16
  mentions_table,
17
17
  department_mentions_table,
18
- preview_link_table,
18
+ CommentPreviewLink,
19
19
  )
20
20
  from zou.app.models.department import Department
21
21
  from zou.app.models.entity import Entity, EntityLink
@@ -686,9 +686,9 @@ def _build_department_mention_map_for_comments(comment_ids):
686
686
  def _build_preview_map_for_comments(comment_ids, is_client=False):
687
687
  preview_map = {}
688
688
  query = (
689
- PreviewFile.query.join(preview_link_table)
690
- .filter(preview_link_table.c.comment.in_(comment_ids))
691
- .add_columns(preview_link_table.c.comment)
689
+ PreviewFile.query.join(CommentPreviewLink)
690
+ .filter(CommentPreviewLink.comment.in_(comment_ids))
691
+ .add_columns(CommentPreviewLink.comment)
692
692
  )
693
693
  for preview, comment_id in query.all():
694
694
  comment_id = str(comment_id)
@@ -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
 
@@ -0,0 +1,132 @@
1
+ """Add missing index
2
+
3
+ Revision ID: fba149993140
4
+ Revises: 20a8ad264659
5
+ Create Date: 2025-02-19 02:19:27.407568
6
+
7
+ """
8
+
9
+ from alembic import op
10
+
11
+
12
+ # revision identifiers, used by Alembic.
13
+ revision = "fba149993140"
14
+ down_revision = "20a8ad264659"
15
+ branch_labels = None
16
+ depends_on = None
17
+
18
+
19
+ def upgrade():
20
+ # ### commands auto generated by Alembic - please adjust! ###
21
+ with op.batch_alter_table("comment_preview_link", schema=None) as batch_op:
22
+ batch_op.create_index(
23
+ batch_op.f("ix_comment_preview_link_comment"),
24
+ ["comment"],
25
+ unique=False,
26
+ )
27
+ batch_op.create_index(
28
+ batch_op.f("ix_comment_preview_link_preview_file"),
29
+ ["preview_file"],
30
+ unique=False,
31
+ )
32
+
33
+ with op.batch_alter_table("project_person_link", schema=None) as batch_op:
34
+ batch_op.create_index(
35
+ batch_op.f("ix_project_person_link_person_id"),
36
+ ["person_id"],
37
+ unique=False,
38
+ )
39
+ batch_op.create_index(
40
+ batch_op.f("ix_project_person_link_project_id"),
41
+ ["project_id"],
42
+ unique=False,
43
+ )
44
+
45
+ with op.batch_alter_table(
46
+ "project_status_automation_link", schema=None
47
+ ) as batch_op:
48
+ batch_op.create_index(
49
+ batch_op.f("ix_project_status_automation_link_project_id"),
50
+ ["project_id"],
51
+ unique=False,
52
+ )
53
+ batch_op.create_index(
54
+ batch_op.f(
55
+ "ix_project_status_automation_link_status_automation_id"
56
+ ),
57
+ ["status_automation_id"],
58
+ unique=False,
59
+ )
60
+
61
+ with op.batch_alter_table(
62
+ "project_task_status_link", schema=None
63
+ ) as batch_op:
64
+ batch_op.create_index(
65
+ batch_op.f("ix_project_task_status_link_project_id"),
66
+ ["project_id"],
67
+ unique=False,
68
+ )
69
+ batch_op.create_index(
70
+ batch_op.f("ix_project_task_status_link_task_status_id"),
71
+ ["task_status_id"],
72
+ unique=False,
73
+ )
74
+
75
+ with op.batch_alter_table(
76
+ "project_task_type_link", schema=None
77
+ ) as batch_op:
78
+ batch_op.create_index(
79
+ batch_op.f("ix_project_task_type_link_project_id"),
80
+ ["project_id"],
81
+ unique=False,
82
+ )
83
+ batch_op.create_index(
84
+ batch_op.f("ix_project_task_type_link_task_type_id"),
85
+ ["task_type_id"],
86
+ unique=False,
87
+ )
88
+
89
+ # ### end Alembic commands ###
90
+
91
+
92
+ def downgrade():
93
+ # ### commands auto generated by Alembic - please adjust! ###
94
+ with op.batch_alter_table(
95
+ "project_task_type_link", schema=None
96
+ ) as batch_op:
97
+ batch_op.drop_index(
98
+ batch_op.f("ix_project_task_type_link_task_type_id")
99
+ )
100
+ batch_op.drop_index(batch_op.f("ix_project_task_type_link_project_id"))
101
+
102
+ with op.batch_alter_table(
103
+ "project_task_status_link", schema=None
104
+ ) as batch_op:
105
+ batch_op.drop_index(
106
+ batch_op.f("ix_project_task_status_link_task_status_id")
107
+ )
108
+ batch_op.drop_index(
109
+ batch_op.f("ix_project_task_status_link_project_id")
110
+ )
111
+
112
+ with op.batch_alter_table(
113
+ "project_status_automation_link", schema=None
114
+ ) as batch_op:
115
+ batch_op.drop_index(
116
+ batch_op.f(
117
+ "ix_project_status_automation_link_status_automation_id"
118
+ )
119
+ )
120
+ batch_op.drop_index(
121
+ batch_op.f("ix_project_status_automation_link_project_id")
122
+ )
123
+
124
+ with op.batch_alter_table("project_person_link", schema=None) as batch_op:
125
+ batch_op.drop_index(batch_op.f("ix_project_person_link_project_id"))
126
+ batch_op.drop_index(batch_op.f("ix_project_person_link_person_id"))
127
+
128
+ with op.batch_alter_table("comment_preview_link", schema=None) as batch_op:
129
+ batch_op.drop_index(batch_op.f("ix_comment_preview_link_preview_file"))
130
+ batch_op.drop_index(batch_op.f("ix_comment_preview_link_comment"))
131
+
132
+ # ### end Alembic commands ###
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: zou
3
- Version: 0.20.16
3
+ Version: 0.20.18
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
@@ -21,10 +21,9 @@ Classifier: Programming Language :: Python :: Implementation :: PyPy
21
21
  Classifier: Topic :: Multimedia :: Graphics
22
22
  Requires-Python: >=3.9, <3.14
23
23
  License-File: LICENSE
24
- Requires-Dist: audioop-lts==0.2.1; python_version >= "3.13"
25
24
  Requires-Dist: babel==2.17.0
26
25
  Requires-Dist: click==8.1.8
27
- Requires-Dist: discord.py==2.4.0
26
+ Requires-Dist: discord.py==2.5.0
28
27
  Requires-Dist: email-validator==2.2.0
29
28
  Requires-Dist: ffmpeg-python==0.2.0
30
29
  Requires-Dist: fido2==1.2.0
@@ -41,7 +40,7 @@ Requires-Dist: flask-jwt-extended==4.7.1
41
40
  Requires-Dist: flask-migrate==4.1.0
42
41
  Requires-Dist: flask-socketio==5.5.1
43
42
  Requires-Dist: flask==3.1.0
44
- Requires-Dist: gazu==0.10.26
43
+ Requires-Dist: gazu==0.10.28
45
44
  Requires-Dist: gevent-websocket==0.10.1
46
45
  Requires-Dist: gevent==24.11.1
47
46
  Requires-Dist: gunicorn==23.0.0
@@ -50,18 +49,18 @@ Requires-Dist: itsdangerous==2.2.0
50
49
  Requires-Dist: Jinja2==3.1.5
51
50
  Requires-Dist: ldap3==2.9.1
52
51
  Requires-Dist: matterhook==0.2
53
- Requires-Dist: meilisearch==0.33.1
52
+ Requires-Dist: meilisearch==0.34.0
54
53
  Requires-Dist: numpy==2.0.1; python_version == "3.9"
55
- Requires-Dist: numpy==2.2.2; python_version >= "3.10"
54
+ Requires-Dist: numpy==2.2.3; python_version >= "3.10"
56
55
  Requires-Dist: opencv-python==4.11.0.86
57
56
  Requires-Dist: OpenTimelineIO==0.17.0
58
57
  Requires-Dist: OpenTimelineIO-Plugins==0.17.0
59
58
  Requires-Dist: orjson==3.10.15
60
59
  Requires-Dist: pillow==11.1.0
61
- Requires-Dist: psutil==6.1.1
60
+ Requires-Dist: psutil==7.0.0
62
61
  Requires-Dist: psycopg[binary]==3.2.4
63
62
  Requires-Dist: pyotp==2.9.0
64
- Requires-Dist: pysaml2==7.5.0
63
+ Requires-Dist: pysaml2==7.5.2
65
64
  Requires-Dist: python-nomad==2.1.0
66
65
  Requires-Dist: python-slugify==8.0.4
67
66
  Requires-Dist: python-socketio==5.12.1
@@ -80,14 +79,14 @@ Requires-Dist: gevent; extra == "prod"
80
79
  Provides-Extra: dev
81
80
  Requires-Dist: wheel; extra == "dev"
82
81
  Provides-Extra: test
83
- Requires-Dist: fakeredis==2.26.2; extra == "test"
82
+ Requires-Dist: fakeredis==2.27.0; extra == "test"
84
83
  Requires-Dist: mixer==7.2.2; extra == "test"
85
84
  Requires-Dist: pytest-cov==6.0.0; extra == "test"
86
85
  Requires-Dist: pytest==8.3.4; extra == "test"
87
86
  Provides-Extra: monitoring
88
87
  Requires-Dist: prometheus-flask-exporter==0.23.1; extra == "monitoring"
89
88
  Requires-Dist: pygelf==0.4.2; extra == "monitoring"
90
- Requires-Dist: sentry-sdk==2.20.0; extra == "monitoring"
89
+ Requires-Dist: sentry-sdk==2.22.0; extra == "monitoring"
91
90
  Provides-Extra: lint
92
91
  Requires-Dist: autoflake==2.3.1; extra == "lint"
93
92
  Requires-Dist: black==25.1.0; extra == "lint"
@@ -1,11 +1,11 @@
1
- zou/__init__.py,sha256=H2uay8S6RdWs70UCbs9-a4OHr3MS43oLxQlRC2LPME4,24
1
+ zou/__init__.py,sha256=oNL5wFOwj6vUybBQ_nAogGdRw6PlvL58pKDBW1mt5L0,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=eXVrmZf550Tk0fiN0Asfrhel0StesTDLTAYU6LdM3n4,6747
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
@@ -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
@@ -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
@@ -141,7 +141,7 @@ zou/app/models/base.py,sha256=vZoPzdixyRbk0SoDJGEbQ9LFouBaDCA7gVSZ1o_SIhI,8808
141
141
  zou/app/models/build_job.py,sha256=aW6KZXkyMP9d3g8fvcOYk9EAoNMw-6IleZdWbaqLLVw,1286
142
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
- zou/app/models/comment.py,sha256=sJxLnMNhdgvqm_nlcaRauxsMgFUQyMLxcCK8JkeJQJE,5875
144
+ zou/app/models/comment.py,sha256=2DkzSFwlhqibRmiti3z_GbtxObHMnxRNWel9xsE4uoo,5897
145
145
  zou/app/models/custom_action.py,sha256=wx5ASKJ2oG-ivASZbVf1nLiL7zELgQBJ8U1jDdvGkuU,578
146
146
  zou/app/models/data_import_error.py,sha256=dCyzaX0KATa0F8h5V3sTPlXz-XNl1VNkflRfJuaCmsg,425
147
147
  zou/app/models/day_off.py,sha256=WMZs7oMhUBpMnNyvhgpl1j6egZ5J0drnrF1dH3N5cII,691
@@ -163,7 +163,7 @@ 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
165
  zou/app/models/preview_file.py,sha256=eDPXw0QIdJze_E4kAS8SsyabrefWhIIdwuGmjss7iXo,3282
166
- zou/app/models/project.py,sha256=T2gTImmbd5O-U5GySWSwzkR0r_cY2RDr1niwSfOPqeA,8900
166
+ zou/app/models/project.py,sha256=m9Rhlfa8K21-xuNJUIadaYGuj5hMnC0yzJcxXcqoCsE,9162
167
167
  zou/app/models/project_status.py,sha256=pExaHH7x4Eu8xOqD3_mRRbMzjT2jJZ8rm-9jo7yUGXA,390
168
168
  zou/app/models/schedule_item.py,sha256=coY5uDDuBoctaMICnfCzx4zT5om2E1uu4iq5MDWAPlY,1444
169
169
  zou/app/models/search_filter.py,sha256=Q699mJa3GGwFEva93Y_nHiIcx3BDht9VsAe2zeQL0FA,1242
@@ -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=VSGZp2EtFZzaqaT_ysOSDAmnYcp1UYdhY1-WlISxvl8,23987
182
+ zou/app/services/assets_service.py,sha256=Hj1dznCFM86HxAIRIRXEcGwI9lCtYpzurhusVqOVrMc,24139
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
@@ -189,9 +189,9 @@ zou/app/services/comments_service.py,sha256=dEZ4Y4NQRGtCDnChlZp3VtF02noSPqXPT4yJ
189
189
  zou/app/services/concepts_service.py,sha256=sXzMPQ5Rav-c_36CBxdDBjKNq0-gaLWFY9QZGy3jjv4,11252
190
190
  zou/app/services/custom_actions_service.py,sha256=fWISEOOdthadrxeHuacEel5Xj6msn0yWXJQDG1gzvsY,297
191
191
  zou/app/services/deletion_service.py,sha256=GdPWmw60_EmWxJohvqQ9KRcION7_PIdQgbl7nr2g2mY,17429
192
- zou/app/services/edits_service.py,sha256=lQck7U9JYRWRqukwTT6ZBWCP0BpoF3XlPPwmEgtUvSM,11965
192
+ zou/app/services/edits_service.py,sha256=P3-eBoHSikYjtuHeulTv_WuILEe502sU4qFObfokcQY,12114
193
193
  zou/app/services/emails_service.py,sha256=i9EP3zw02ZteVt9OZTvkfaoU19_T4kLhRmrhIvYw2SQ,11965
194
- zou/app/services/entities_service.py,sha256=5Mj3YIHrh6WqRxFrAHsNbYms5ienJ2304escX7-F8LY,16754
194
+ zou/app/services/entities_service.py,sha256=c-AnoHkro_Bw-6156m85qg96VpdI6Ox-sv0xL1d_TTU,16903
195
195
  zou/app/services/events_service.py,sha256=Ew-bY5hqrWLmpbVj1_xd3E2S3JtyAGzdgw2XjudTZjc,2700
196
196
  zou/app/services/exception.py,sha256=mcDVjWGICMIlOi4nsN2EQ7nc3V70rAC-iCmXt6kOXbA,4240
197
197
  zou/app/services/file_tree_service.py,sha256=8JNBDgnXtV-AmSJ3gnUGB4oSwLjPgi1WYyL0Kc98JRE,33875
@@ -206,14 +206,14 @@ zou/app/services/preview_files_service.py,sha256=Yk-vwzHuKTzNkEZfl9DhQRdDuRU006u
206
206
  zou/app/services/projects_service.py,sha256=aIbYaFomy7OX2Pxvkf9w5qauDvkjuc9ummSGNYIpQMY,21249
207
207
  zou/app/services/scenes_service.py,sha256=iXN19HU4njPF5VtZXuUrVJ-W23ZQuQNPC3ADXltbWtU,992
208
208
  zou/app/services/schedule_service.py,sha256=E99HKYsXgnK2sw58fw-NNHXWBgVJiA60upztjkNSCaM,6989
209
- zou/app/services/shots_service.py,sha256=4H81Tf6twY4s9Ac9_MCX_4bdW75m30TaKrR0tLiQf9s,52042
209
+ zou/app/services/shots_service.py,sha256=JEBywQGSKz1R7uXM8wtQQebMhWQZbGrWmTS5nOyn_Js,52191
210
210
  zou/app/services/stats_service.py,sha256=cAlc92i9d6eYtsuwe3hYHYwdytg8KEMi1-TADfysJwM,11733
211
211
  zou/app/services/status_automations_service.py,sha256=tVio7Sj7inhvKS4UOyRhcdpwr_KNP96hT1o0X7XcGF4,715
212
212
  zou/app/services/sync_service.py,sha256=kJ1LGMNfPh9_BDwGTfoYWHrLZ8OlT0hWk-R8wNt0t3w,41562
213
- zou/app/services/tasks_service.py,sha256=6lJHxVAQ0dxHdO8_2PaVqLwy87s44kvLRj6S9dw-Bvs,68534
213
+ zou/app/services/tasks_service.py,sha256=7tOZLSKB26Jj9N6hl02vmJAzeq9uV121B4Mf3IVBEm4,68530
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
@@ -406,6 +406,7 @@ zou/migrations/versions/f874ad5e898a_add_link_entity_type_task_type.py,sha256=QI
406
406
  zou/migrations/versions/f995b28fb749_.py,sha256=YFshxpF-CRpMkSpYm-n2xCeE_q-Dow0nbqTLPGkkJBc,959
407
407
  zou/migrations/versions/fb6b6f188497_.py,sha256=-LSlab37yRW7EHloDuCTOgtCXnII6IcubZtgom_iJUA,1003
408
408
  zou/migrations/versions/fb87feaaa094_add_missing_unique_constraints.py,sha256=37v2puXZ6F60I-qYMOHvLWyPjNmE30MBNuqMAoTp6TI,934
409
+ zou/migrations/versions/fba149993140_add_missing_index.py,sha256=Tj_5aweXlp61xNzp7bxSTlxCqqV-io7NeV6_CodKMls,4062
409
410
  zou/migrations/versions/fc322f908695_.py,sha256=KT3BfEVbbvlMDvC_tP2Y96fh9v3TjxOSldjCCLHTw9w,704
410
411
  zou/migrations/versions/fee7c696166e_.py,sha256=jVvkr0uY5JPtC_I9h18DELo_eRu99RdOYMtEcaUnNXc,1839
411
412
  zou/migrations/versions/feffd3c5b806_introduce_concepts.py,sha256=wFNAtTTDHa01AdoXhRDayCVdB33stUFn6whc3opg2vQ,4774
@@ -416,9 +417,9 @@ zou/remote/normalize_movie.py,sha256=zNfEY3N1UbAHZfddGONTg2Sff3ieLVWd4dfZa1dpnes
416
417
  zou/remote/playlist.py,sha256=AsDo0bgYhDcd6DfNRV6r6Jj3URWwavE2ZN3VkKRPbLU,3293
417
418
  zou/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
418
419
  zou/utils/movie.py,sha256=d67fIL9dVBKt-E_qCGXRbNNdbJaJR5sHvZeX3hf8ldE,16559
419
- zou-0.20.16.dist-info/LICENSE,sha256=dql8h4yceoMhuzlcK0TT_i-NgTFNIZsgE47Q4t3dUYI,34520
420
- zou-0.20.16.dist-info/METADATA,sha256=Y3kFPwIc_wcpvLRJuqwDa1N7PhokrXxeYtZjvnj1jgo,6733
421
- zou-0.20.16.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
422
- zou-0.20.16.dist-info/entry_points.txt,sha256=PelQoIx3qhQ_Tmne7wrLY-1m2izuzgpwokoURwSohy4,130
423
- zou-0.20.16.dist-info/top_level.txt,sha256=4S7G_jk4MzpToeDItHGjPhHx_fRdX52zJZWTD4SL54g,4
424
- zou-0.20.16.dist-info/RECORD,,
420
+ zou-0.20.18.dist-info/LICENSE,sha256=dql8h4yceoMhuzlcK0TT_i-NgTFNIZsgE47Q4t3dUYI,34520
421
+ zou-0.20.18.dist-info/METADATA,sha256=Isa3DGGFp6qYjXcCd_ZqcGv4rPE4xeJ3kIjajg9d6LI,6673
422
+ zou-0.20.18.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
423
+ zou-0.20.18.dist-info/entry_points.txt,sha256=PelQoIx3qhQ_Tmne7wrLY-1m2izuzgpwokoURwSohy4,130
424
+ zou-0.20.18.dist-info/top_level.txt,sha256=4S7G_jk4MzpToeDItHGjPhHx_fRdX52zJZWTD4SL54g,4
425
+ zou-0.20.18.dist-info/RECORD,,
File without changes
File without changes