zou 0.20.11__py3-none-any.whl → 0.20.13__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.11"
1
+ __version__ = "0.20.13"
zou/app/__init__.py CHANGED
@@ -25,6 +25,7 @@ from meilisearch.errors import (
25
25
 
26
26
  from zou.app import config, swagger
27
27
  from zou.app.stores import auth_tokens_store, file_store
28
+ from zou.app.indexer import indexing
28
29
  from zou.app.services.exception import (
29
30
  ModelWithRelationsDeletionException,
30
31
  PersonNotFoundException,
@@ -72,6 +73,9 @@ if config.SAML_ENABLED:
72
73
 
73
74
  app.extensions["fido_server"] = get_fido_server()
74
75
 
76
+ if config.INDEXER.get("key") is not None:
77
+ app.extensions["indexer_client"] = indexing.init_client()
78
+
75
79
 
76
80
  @app.teardown_appcontext
77
81
  def shutdown_session(exception=None):
@@ -484,7 +484,7 @@ class NewAssetResource(Resource, ArgsMixin):
484
484
  ("data", {}, False, dict),
485
485
  (
486
486
  "is_shared",
487
- True,
487
+ False,
488
488
  False,
489
489
  inputs.boolean,
490
490
  ),
@@ -98,7 +98,9 @@ class PreviewFileResource(BaseModelResource):
98
98
  instance_dict = instance.serialize()
99
99
  self.check_delete_permissions(instance_dict)
100
100
  self.pre_delete(instance_dict)
101
- deletion_service.remove_preview_file(instance)
101
+ deletion_service.remove_preview_file(
102
+ instance, force=self.get_force()
103
+ )
102
104
  self.emit_delete_event(instance_dict)
103
105
  self.post_delete(instance_dict)
104
106
 
@@ -171,7 +171,7 @@ class StatusResourcesResource(BaseStatusResource):
171
171
  }
172
172
 
173
173
  return {
174
- "date": datetime.now().isoformat(),
174
+ "date": datetime.datetime.now().isoformat(),
175
175
  "cpu": cpu_stats,
176
176
  "memory": memory_stats,
177
177
  "jobs": job_stats,
@@ -11,6 +11,7 @@ from zou.app.services import (
11
11
  )
12
12
  from zou.app.utils import permissions
13
13
  from zou.app.services.exception import WrongParameterException
14
+ from zou.app.models.metadata_descriptor import METADATA_DESCRIPTOR_TYPES
14
15
 
15
16
 
16
17
  class OpenProjectsResource(Resource, ArgsMixin):
@@ -715,6 +716,10 @@ class ProductionMetadataDescriptorsResource(Resource, ArgsMixin):
715
716
  if len(args["name"]) == 0:
716
717
  raise WrongParameterException("Name cannot be empty.")
717
718
 
719
+ types = [type_name for type_name, _ in METADATA_DESCRIPTOR_TYPES]
720
+ if args["data_type"] not in types:
721
+ raise WrongParameterException("Invalid data_type")
722
+
718
723
  return (
719
724
  projects_service.add_metadata_descriptor(
720
725
  project_id,
@@ -828,6 +833,10 @@ class ProductionMetadataDescriptorResource(Resource, ArgsMixin):
828
833
  if len(args["name"]) == 0:
829
834
  raise WrongParameterException("Name cannot be empty.")
830
835
 
836
+ types = [type_name for type_name, _ in METADATA_DESCRIPTOR_TYPES]
837
+ if args["data_type"] not in types:
838
+ raise WrongParameterException("Invalid data_type")
839
+
831
840
  args["for_client"] = args["for_client"] == "True"
832
841
 
833
842
  return projects_service.update_metadata_descriptor(descriptor_id, args)
@@ -123,6 +123,9 @@ class TaskTypeEstimationsCsvImportResource(BaseCsvProjectImportResource):
123
123
  new_data["start_date"], float(row["Estimation"]) - 1
124
124
  )
125
125
 
126
+ if row.get("Difficulty") not in [None, ""]:
127
+ new_data["difficulty"] = int(row["Difficulty"])
128
+
126
129
  tasks_service.update_task(self.tasks_map[entity_id], new_data)
127
130
 
128
131
 
@@ -78,7 +78,7 @@ class AddPreviewResource(Resource, ArgsMixin):
78
78
  return preview_file, 201
79
79
 
80
80
 
81
- class AddExtraPreviewResource(Resource):
81
+ class AddExtraPreviewResource(Resource, ArgsMixin):
82
82
  """
83
83
  Add a preview to given comment.
84
84
  """
@@ -160,7 +160,9 @@ class AddExtraPreviewResource(Resource):
160
160
  """
161
161
  task = tasks_service.get_task(task_id)
162
162
  user_service.check_project_access(task["project_id"])
163
- deletion_service.remove_preview_file_by_id(preview_file_id)
163
+ deletion_service.remove_preview_file_by_id(
164
+ preview_file_id, force=self.get_force()
165
+ )
164
166
  return "", 204
165
167
 
166
168
 
zou/app/config.py CHANGED
@@ -58,7 +58,7 @@ INDEXER = {
58
58
  "host": os.getenv("INDEXER_HOST", "localhost"),
59
59
  "port": os.getenv("INDEXER_PORT", "7700"),
60
60
  "protocol": os.getenv("INDEXER_PROTOCOL", "http"),
61
- "key": os.getenv("INDEXER_KEY", "masterkey"),
61
+ "key": os.getenv("INDEXER_KEY"),
62
62
  "timeout": int(os.getenv("INDEXER_TIMEOUT", 5000)),
63
63
  }
64
64
 
@@ -3,24 +3,35 @@ from meilisearch.errors import MeilisearchApiError
3
3
 
4
4
  from zou.app import config
5
5
  from zou.app.utils import cache
6
+ from flask import current_app
6
7
 
7
- client = None
8
8
 
9
-
10
- def init():
9
+ def init_client():
11
10
  """
12
11
  Configure Meilisearch client.
13
12
  """
14
- global client
15
- if client is None:
16
- protocol = config.INDEXER["protocol"]
17
- host = config.INDEXER["host"]
18
- port = config.INDEXER["port"]
19
- client = meilisearch.Client(
20
- f"{protocol}://{host}:{port}",
21
- config.INDEXER["key"],
22
- timeout=config.INDEXER["timeout"],
23
- )
13
+ protocol = config.INDEXER["protocol"]
14
+ host = config.INDEXER["host"]
15
+ port = config.INDEXER["port"]
16
+ return meilisearch.Client(
17
+ f"{protocol}://{host}:{port}",
18
+ config.INDEXER["key"],
19
+ timeout=config.INDEXER["timeout"],
20
+ )
21
+
22
+
23
+ class IndexerNotInitializedError(Exception):
24
+ pass
25
+
26
+
27
+ def get_client():
28
+ """
29
+ Get Meilisearch client.
30
+ """
31
+ try:
32
+ return current_app.extensions["indexer_client"]
33
+ except KeyError:
34
+ raise IndexerNotInitializedError()
24
35
 
25
36
 
26
37
  def create_index(index_name, searchable_fields=[], filterable_fields=[]):
@@ -34,6 +45,7 @@ def create_index(index_name, searchable_fields=[], filterable_fields=[]):
34
45
  except MeilisearchApiError:
35
46
  pass
36
47
  if index is None:
48
+ client = get_client()
37
49
  task = client.create_index(index_name, {"primaryKey": "id"})
38
50
  client.wait_for_task(
39
51
  task.task_uid, timeout_in_ms=config.INDEXER["timeout"]
@@ -57,8 +69,7 @@ def get_index(index_name):
57
69
  """
58
70
  Get index matching given name.
59
71
  """
60
- init()
61
- index = client.get_index(index_name)
72
+ index = get_client().get_index(index_name)
62
73
  return index
63
74
 
64
75
 
@@ -69,7 +80,7 @@ def clear_index(index_name):
69
80
  cache.cache.delete_memoized(get_index)
70
81
  index = get_index(index_name)
71
82
  task = index.delete_all_documents()
72
- client.wait_for_task(
83
+ get_client().wait_for_task(
73
84
  task.task_uid, timeout_in_ms=config.INDEXER["timeout"]
74
85
  )
75
86
  return index
@@ -80,7 +91,7 @@ def index_document(index, document):
80
91
  Add given document to given index.
81
92
  """
82
93
  task = index.add_documents([document])
83
- client.wait_for_task(
94
+ get_client().wait_for_task(
84
95
  task.task_uid, timeout_in_ms=config.INDEXER["timeout"]
85
96
  )
86
97
  return index
@@ -91,7 +102,7 @@ def index_documents(index, documents):
91
102
  Add given documents to given index.
92
103
  """
93
104
  task = index.add_documents(documents)
94
- client.wait_for_task(
105
+ get_client().wait_for_task(
95
106
  task.task_uid, timeout_in_ms=config.INDEXER["timeout"]
96
107
  )
97
108
  return documents
@@ -5,19 +5,28 @@ from zou.app.models.serializer import SerializerMixin
5
5
  from zou.app.models.base import BaseMixin
6
6
  from zou.app.models.task_type import TaskType
7
7
 
8
- task_type_link = db.Table(
9
- "task_type_asset_type_link",
10
- db.Column(
11
- "asset_type_id",
8
+
9
+ class TaskTypeAssetTypeLink(db.Model):
10
+ asset_type_id = db.Column(
12
11
  UUIDType(binary=False),
13
12
  db.ForeignKey("entity_type.id"),
14
- ),
15
- db.Column(
16
- "task_type_id",
13
+ index=True,
14
+ primary_key=True,
15
+ )
16
+ task_type_id = db.Column(
17
17
  UUIDType(binary=False),
18
18
  db.ForeignKey("task_type.id"),
19
- ),
20
- )
19
+ index=True,
20
+ primary_key=True,
21
+ )
22
+
23
+ __table_args__ = (
24
+ db.UniqueConstraint(
25
+ "asset_type_id",
26
+ "task_type_id",
27
+ name="task_type_asset_type_link_uc",
28
+ ),
29
+ )
21
30
 
22
31
 
23
32
  class EntityType(db.Model, BaseMixin, SerializerMixin):
@@ -30,7 +39,9 @@ class EntityType(db.Model, BaseMixin, SerializerMixin):
30
39
  short_name = db.Column(db.String(20))
31
40
  description = db.Column(db.Text())
32
41
  task_types = db.relationship(
33
- "TaskType", secondary=task_type_link, lazy="joined"
42
+ TaskType,
43
+ secondary=TaskTypeAssetTypeLink.__table__,
44
+ lazy="joined",
34
45
  )
35
46
  archived = db.Column(db.Boolean(), default=False)
36
47
 
@@ -4,18 +4,31 @@ from sqlalchemy.dialects.postgresql import JSONB
4
4
  from zou.app import db
5
5
  from zou.app.models.serializer import SerializerMixin
6
6
  from zou.app.models.base import BaseMixin
7
+ from zou.app.models.department import Department
7
8
 
8
- department_metadata_descriptor_link = db.Table(
9
- "department_metadata_descriptor_link",
10
- db.Column(
11
- "metadata_descriptor_id",
9
+
10
+ class DepartmentMetadataDescriptorLink(db.Model):
11
+ metadata_descriptor_id = db.Column(
12
12
  UUIDType(binary=False),
13
13
  db.ForeignKey("metadata_descriptor.id"),
14
- ),
15
- db.Column(
16
- "department_id", UUIDType(binary=False), db.ForeignKey("department.id")
17
- ),
18
- )
14
+ index=True,
15
+ primary_key=True,
16
+ )
17
+ department_id = db.Column(
18
+ UUIDType(binary=False),
19
+ db.ForeignKey("department.id"),
20
+ index=True,
21
+ primary_key=True,
22
+ )
23
+
24
+ __table_args__ = (
25
+ db.UniqueConstraint(
26
+ "metadata_descriptor_id",
27
+ "department_id",
28
+ name="department_metadata_descriptor_link_uc",
29
+ ),
30
+ )
31
+
19
32
 
20
33
  METADATA_DESCRIPTOR_TYPES = [
21
34
  ("string", "String"),
@@ -46,7 +59,8 @@ class MetadataDescriptor(db.Model, BaseMixin, SerializerMixin):
46
59
  choices = db.Column(JSONB)
47
60
  for_client = db.Column(db.Boolean(), default=False, index=True)
48
61
  departments = db.relationship(
49
- "Department", secondary=department_metadata_descriptor_link
62
+ Department,
63
+ secondary=DepartmentMetadataDescriptorLink.__table__,
50
64
  )
51
65
 
52
66
  __table_args__ = (
zou/app/models/person.py CHANGED
@@ -49,11 +49,21 @@ class DepartmentLink(db.Model):
49
49
  UUIDType(binary=False),
50
50
  db.ForeignKey("person.id"),
51
51
  primary_key=True,
52
+ index=True,
52
53
  )
53
54
  department_id = db.Column(
54
55
  UUIDType(binary=False),
55
56
  db.ForeignKey("department.id"),
56
57
  primary_key=True,
58
+ index=True,
59
+ )
60
+
61
+ __table_args__ = (
62
+ db.UniqueConstraint(
63
+ "person_id",
64
+ "department_id",
65
+ name="department_link_uc",
66
+ ),
57
67
  )
58
68
 
59
69
 
@@ -252,24 +252,25 @@ def _run_status_automation(automation, task, person_id):
252
252
  task["id"]
253
253
  )
254
254
  )
255
- preview_files = (
256
- preview_files_service.get_preview_files_for_revision(
257
- preview_file["task_id"], preview_file["revision"]
255
+ if preview_file is not None:
256
+ preview_files = (
257
+ preview_files_service.get_preview_files_for_revision(
258
+ preview_file["task_id"], preview_file["revision"]
259
+ )
258
260
  )
259
- )
260
261
 
261
- for preview_file in preview_files:
262
- new_preview_file = (
263
- tasks_service.add_preview_file_to_comment(
264
- new_comment["id"],
265
- new_comment["person_id"],
266
- task_to_update["id"],
262
+ for preview_file in preview_files:
263
+ new_preview_file = (
264
+ tasks_service.add_preview_file_to_comment(
265
+ new_comment["id"],
266
+ new_comment["person_id"],
267
+ task_to_update["id"],
268
+ )
267
269
  )
268
- )
269
270
 
270
- preview_files_service.copy_preview_file_in_another_one(
271
- preview_file["id"], new_preview_file["id"]
272
- )
271
+ preview_files_service.copy_preview_file_in_another_one(
272
+ preview_file["id"], new_preview_file["id"]
273
+ )
273
274
 
274
275
  elif automation["out_field_type"] == "ready_for":
275
276
  try:
@@ -12,9 +12,8 @@ from zou.app.services import (
12
12
 
13
13
  def get_index(index_name):
14
14
  """
15
- Retrieve whoosh index from disk. It is required to perform any operations.
15
+ Retrieve meilisearch index from disk. It is required to perform any operations.
16
16
  """
17
- indexing.init()
18
17
  return indexing.get_index(index_name)
19
18
 
20
19
 
@@ -193,9 +192,11 @@ def index_asset(asset):
193
192
  document = prepare_asset(asset)
194
193
  indexing.index_document(index, document)
195
194
  return document
195
+ except indexing.IndexerNotInitializedError:
196
+ pass
196
197
  except:
197
198
  app.logger.error("Indexer is not reachable, indexation failed.")
198
- return {}
199
+ return {}
199
200
 
200
201
 
201
202
  def index_person(person):
@@ -207,9 +208,11 @@ def index_person(person):
207
208
  document = prepare_person(person)
208
209
  indexing.index_document(index, document)
209
210
  return document
211
+ except indexing.IndexerNotInitializedError:
212
+ pass
210
213
  except:
211
214
  app.logger.error("Indexer is not reachable, indexation failed.")
212
- return {}
215
+ return {}
213
216
 
214
217
 
215
218
  def index_shot(shot):
@@ -221,9 +224,11 @@ def index_shot(shot):
221
224
  document = prepare_shot(shot)
222
225
  indexing.index_document(index, document)
223
226
  return document
227
+ except indexing.IndexerNotInitializedError:
228
+ pass
224
229
  except:
225
230
  app.logger.error("Indexer is not reachable, indexation failed.")
226
- return {}
231
+ return {}
227
232
 
228
233
 
229
234
  def prepare_asset(asset):
@@ -320,9 +325,11 @@ def remove_asset_index(asset_id):
320
325
  """
321
326
  try:
322
327
  return indexing.remove_document(get_asset_index(), asset_id)
328
+ except indexing.IndexerNotInitializedError:
329
+ pass
323
330
  except:
324
331
  app.logger.error("Indexer is not reachable, indexation failed.")
325
- return {}
332
+ return {}
326
333
 
327
334
 
328
335
  def remove_person_index(person_id):
@@ -331,9 +338,11 @@ def remove_person_index(person_id):
331
338
  """
332
339
  try:
333
340
  return indexing.remove_document(get_person_index(), person_id)
341
+ except indexing.IndexerNotInitializedError:
342
+ pass
334
343
  except:
335
344
  app.logger.error("Indexer is not reachable, indexation failed.")
336
- return {}
345
+ return {}
337
346
 
338
347
 
339
348
  def remove_shot_index(shot_id):
@@ -342,6 +351,8 @@ def remove_shot_index(shot_id):
342
351
  """
343
352
  try:
344
353
  return indexing.remove_document(get_shot_index(), shot_id)
354
+ except indexing.IndexerNotInitializedError:
355
+ pass
345
356
  except:
346
357
  app.logger.error("Indexer is not reachable, indexation failed.")
347
- return {}
358
+ return {}
@@ -376,25 +376,17 @@ def _get_entity_task_query():
376
376
 
377
377
 
378
378
  def _convert_rows_to_detailed_tasks(rows, relations=False):
379
- results = []
380
- for entry in rows:
381
- (
382
- task_object,
383
- project_name,
384
- task_type_name,
385
- task_status_name,
386
- entity_type_name,
387
- entity_name,
388
- ) = entry
389
-
390
- task = get_task(str(task_object.id), relations=relations)
391
- task["project_name"] = project_name
392
- task["task_type_name"] = task_type_name
393
- task["task_status_name"] = task_status_name
394
- task["entity_type_name"] = entity_type_name
395
- task["entity_name"] = entity_name
396
- results.append(task)
397
- return results
379
+ return [
380
+ {
381
+ **task_object.serialize(relations=relations),
382
+ "project_name": project_name,
383
+ "task_type_name": task_type_name,
384
+ "task_status_name": task_status_name,
385
+ "entity_type_name": entity_type_name,
386
+ "entity_name": entity_name,
387
+ }
388
+ for task_object, project_name, task_type_name, task_status_name, entity_type_name, entity_name in rows
389
+ ]
398
390
 
399
391
 
400
392
  def get_task_types_for_shot(shot_id):
@@ -1424,7 +1424,7 @@ def get_last_notifications(
1424
1424
  )
1425
1425
  reply_mentions = reply.get("mentions", []) or []
1426
1426
  reply_department_mentions = (
1427
- reply.get("departement_mentions", []) or []
1427
+ reply.get("department_mentions", []) or []
1428
1428
  )
1429
1429
  if reply is not None:
1430
1430
  reply_text = reply["text"]
zou/cli.py CHANGED
@@ -507,14 +507,6 @@ def reset_search_index():
507
507
  commands.reset_search_index()
508
508
 
509
509
 
510
- @cli.command()
511
- def init_search_index():
512
- """
513
- Init search index.
514
- """
515
- commands.init_search_index()
516
-
517
-
518
510
  @cli.command()
519
511
  @click.option("--query", default="")
520
512
  def search_asset(query):
@@ -0,0 +1,132 @@
1
+ """TaskTypeAssetTypeLink/DepartmentMetadataDescriptorLink add index, pkey and constraint
2
+
3
+ Revision ID: 20a8ad264659
4
+ Revises: 539a3a00c417
5
+ Create Date: 2025-01-26 23:15:27.665887
6
+
7
+ """
8
+
9
+ from alembic import op
10
+ import sqlalchemy as sa
11
+
12
+
13
+ # revision identifiers, used by Alembic.
14
+ revision = "20a8ad264659"
15
+ down_revision = "539a3a00c417"
16
+ branch_labels = None
17
+ depends_on = None
18
+
19
+
20
+ def upgrade():
21
+ # ### commands auto generated by Alembic - please adjust! ###
22
+ with op.batch_alter_table(
23
+ "department_metadata_descriptor_link", schema=None
24
+ ) as batch_op:
25
+ batch_op.alter_column(
26
+ "metadata_descriptor_id", existing_type=sa.UUID(), nullable=False
27
+ )
28
+ batch_op.alter_column(
29
+ "department_id", existing_type=sa.UUID(), nullable=False
30
+ )
31
+ batch_op.create_unique_constraint(
32
+ "department_metadata_descriptor_link_uc",
33
+ ["metadata_descriptor_id", "department_id"],
34
+ )
35
+ batch_op.create_index(
36
+ batch_op.f("ix_department_metadata_descriptor_link_department_id"),
37
+ ["department_id"],
38
+ unique=False,
39
+ )
40
+ batch_op.create_index(
41
+ batch_op.f(
42
+ "ix_department_metadata_descriptor_link_metadata_descriptor_id"
43
+ ),
44
+ ["metadata_descriptor_id"],
45
+ unique=False,
46
+ )
47
+
48
+ batch_op.create_primary_key(
49
+ "department_metadata_descriptor_link_pkey",
50
+ ["metadata_descriptor_id", "department_id"],
51
+ )
52
+
53
+ with op.batch_alter_table(
54
+ "task_type_asset_type_link", schema=None
55
+ ) as batch_op:
56
+ batch_op.alter_column(
57
+ "asset_type_id", existing_type=sa.UUID(), nullable=False
58
+ )
59
+ batch_op.alter_column(
60
+ "task_type_id", existing_type=sa.UUID(), nullable=False
61
+ )
62
+ batch_op.create_index(
63
+ batch_op.f("ix_task_type_asset_type_link_asset_type_id"),
64
+ ["asset_type_id"],
65
+ unique=False,
66
+ )
67
+ batch_op.create_index(
68
+ batch_op.f("ix_task_type_asset_type_link_task_type_id"),
69
+ ["task_type_id"],
70
+ unique=False,
71
+ )
72
+ batch_op.create_unique_constraint(
73
+ "task_type_asset_type_link_uc", ["asset_type_id", "task_type_id"]
74
+ )
75
+
76
+ batch_op.create_primary_key(
77
+ "task_type_asset_type_link_pkey", ["asset_type_id", "task_type_id"]
78
+ )
79
+
80
+ # ### end Alembic commands ###
81
+
82
+
83
+ def downgrade():
84
+ # ### commands auto generated by Alembic - please adjust! ###
85
+ with op.batch_alter_table(
86
+ "task_type_asset_type_link", schema=None
87
+ ) as batch_op:
88
+ batch_op.drop_constraint(
89
+ "task_type_asset_type_link_pkey", type_="primary"
90
+ )
91
+ batch_op.drop_constraint(
92
+ "task_type_asset_type_link_uc", type_="unique"
93
+ )
94
+ batch_op.drop_index(
95
+ batch_op.f("ix_task_type_asset_type_link_task_type_id")
96
+ )
97
+ batch_op.drop_index(
98
+ batch_op.f("ix_task_type_asset_type_link_asset_type_id")
99
+ )
100
+
101
+ batch_op.alter_column(
102
+ "task_type_id", existing_type=sa.UUID(), nullable=True
103
+ )
104
+ batch_op.alter_column(
105
+ "asset_type_id", existing_type=sa.UUID(), nullable=True
106
+ )
107
+
108
+ with op.batch_alter_table(
109
+ "department_metadata_descriptor_link", schema=None
110
+ ) as batch_op:
111
+ batch_op.drop_index(
112
+ batch_op.f(
113
+ "ix_department_metadata_descriptor_link_metadata_descriptor_id"
114
+ )
115
+ )
116
+ batch_op.drop_index(
117
+ batch_op.f("ix_department_metadata_descriptor_link_department_id")
118
+ )
119
+ batch_op.drop_constraint(
120
+ "department_metadata_descriptor_link_pkey", type_="primary"
121
+ )
122
+ batch_op.drop_constraint(
123
+ "department_metadata_descriptor_link_uc", type_="unique"
124
+ )
125
+ batch_op.alter_column(
126
+ "department_id", existing_type=sa.UUID(), nullable=True
127
+ )
128
+ batch_op.alter_column(
129
+ "metadata_descriptor_id", existing_type=sa.UUID(), nullable=True
130
+ )
131
+
132
+ # ### end Alembic commands ###
@@ -0,0 +1,50 @@
1
+ """For DepartmentLink index person_id / department_id
2
+
3
+ Revision ID: 539a3a00c417
4
+ Revises: 9d3bb33c6fc6
5
+ Create Date: 2025-01-14 12:19:52.699322
6
+
7
+ """
8
+
9
+ from alembic import op
10
+
11
+
12
+ # revision identifiers, used by Alembic.
13
+ revision = "539a3a00c417"
14
+ down_revision = "9d3bb33c6fc6"
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("department_link", schema=None) as batch_op:
22
+ batch_op.create_unique_constraint(
23
+ "department_link_uc", ["person_id", "department_id"]
24
+ )
25
+ batch_op.create_index(
26
+ batch_op.f("ix_department_link_department_id"),
27
+ ["department_id"],
28
+ unique=False,
29
+ )
30
+ batch_op.create_index(
31
+ batch_op.f("ix_department_link_person_id"),
32
+ ["person_id"],
33
+ unique=False,
34
+ )
35
+ batch_op.create_primary_key(
36
+ "department_link_pkey", ["person_id", "department_id"]
37
+ )
38
+
39
+ # ### end Alembic commands ###
40
+
41
+
42
+ def downgrade():
43
+ # ### commands auto generated by Alembic - please adjust! ###
44
+ with op.batch_alter_table("department_link", schema=None) as batch_op:
45
+ batch_op.drop_index(batch_op.f("ix_department_link_person_id"))
46
+ batch_op.drop_index(batch_op.f("ix_department_link_department_id"))
47
+ batch_op.drop_constraint("department_link_uc", type_="unique")
48
+ batch_op.drop_constraint("department_link_pkey", type_="primary")
49
+
50
+ # ### end Alembic commands ###
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: zou
3
- Version: 0.20.11
3
+ Version: 0.20.13
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.22
44
+ Requires-Dist: gazu==0.10.25
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,14 +52,14 @@ 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.1; python_version >= "3.10"
56
- Requires-Dist: opencv-python==4.10.0.84
55
+ Requires-Dist: numpy==2.2.2; python_version >= "3.10"
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
- Requires-Dist: orjson==3.10.14
59
+ Requires-Dist: orjson==3.10.15
60
60
  Requires-Dist: pillow==11.1.0
61
61
  Requires-Dist: psutil==6.1.1
62
- Requires-Dist: psycopg[binary]==3.2.3
62
+ Requires-Dist: psycopg[binary]==3.2.4
63
63
  Requires-Dist: pyotp==2.9.0
64
64
  Requires-Dist: pysaml2==7.5.0
65
65
  Requires-Dist: python-nomad==2.0.1
@@ -87,11 +87,11 @@ 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.19.2; extra == "monitoring"
90
+ Requires-Dist: sentry-sdk==2.20.0; extra == "monitoring"
91
91
  Provides-Extra: lint
92
92
  Requires-Dist: autoflake==2.3.1; extra == "lint"
93
93
  Requires-Dist: black==24.10.0; extra == "lint"
94
- Requires-Dist: pre-commit==4.0.1; extra == "lint"
94
+ Requires-Dist: pre-commit==4.1.0; extra == "lint"
95
95
  Dynamic: requires-python
96
96
 
97
97
  .. figure:: https://zou.cg-wire.com/kitsu.png
@@ -1,16 +1,16 @@
1
- zou/__init__.py,sha256=somEGXFvHhuE-Am1IwxLrXctMcGtTMhLq2X5WnKGyQ4,24
2
- zou/cli.py,sha256=H18Wg-wqQOsv4F5_bZRDlxskjO-TRwaV1NmQMTH9mdg,18869
1
+ zou/__init__.py,sha256=qPiGRnihRo8MqZpRjUGoC5SaRVJFUBb_TMPOZYph7as,24
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
- zou/app/__init__.py,sha256=7pRqdA79X-UI_kYt8Sz6lIdleNStBxHnXISr-tePVe8,6962
6
+ zou/app/__init__.py,sha256=c5R9IQL5JGl0K0RfPBoq64GsPm-KvmqENHwNodvK_Ec,7104
7
7
  zou/app/api.py,sha256=JTB_IMVO8EOoyqx9KdRkiIix0chOLi0yGDY-verUJXA,5127
8
- zou/app/config.py,sha256=kYbcTVFgcl2sGtf-cpOOVu3_fVh2P1fLcceLjCvsIfc,6700
8
+ zou/app/config.py,sha256=U3DuUOwZ66FZWVwwV-11SyhmpktGh7J7CgoE11jidSs,6687
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=ff7g8_FzZC6dLvMxcYYffsIOy0CqKqdkZibGm2-qgko,25599
13
+ zou/app/blueprints/assets/resources.py,sha256=y1fMLrgO8vFXoJT4srh-FP4IFlGvh_E0NxhQ5AK-9O0,25600
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
@@ -46,7 +46,7 @@ zou/app/blueprints/crud/output_type.py,sha256=Uu7Q5iv-4SZDnxHkLk0vUE1N4k0bBUivXQ
46
46
  zou/app/blueprints/crud/person.py,sha256=k1EcYxD5C5p7tquAvJUpD2873-ITeF2ogMNIYRxWuDo,9427
47
47
  zou/app/blueprints/crud/playlist.py,sha256=he8iXoWnjBVXzkB_y8aGnZ6vQ_7hGSf-ALofLFoqx1U,1890
48
48
  zou/app/blueprints/crud/preview_background_file.py,sha256=TRJlVQ3nGOYVkA6kxIlNrip9bjkUaknVNCIUYw8uJYk,2451
49
- zou/app/blueprints/crud/preview_file.py,sha256=j5tw7fW4m6QUMTg99cwQlq3yZ5WKHfRuUwRlssBkMDU,3845
49
+ zou/app/blueprints/crud/preview_file.py,sha256=0-1Zv62xDY5JM54P1iac1mPm-tC4NsbAEgbQZaPYLBw,3899
50
50
  zou/app/blueprints/crud/project.py,sha256=g8kWGzgWyVk7s6Y-41DRAGjIegxS36W4SbP1FMJTQDM,8428
51
51
  zou/app/blueprints/crud/project_status.py,sha256=XIiIsAfaD5sLZA6wT3UL4FZQpnoOcqPzYfFIWrp9Svs,540
52
52
  zou/app/blueprints/crud/schedule_item.py,sha256=1dbNKbftNG3if38Hzh1uslCAu3BE4jOqWhLV0590A90,1400
@@ -83,7 +83,7 @@ zou/app/blueprints/export/csv/time_spents.py,sha256=yYPtilOxfQD5mBwyh9h-PbTQBpab
83
83
  zou/app/blueprints/files/__init__.py,sha256=7Wty30JW2OXIn-tBFXOWWmPuHnsnxPpH3jNtHvvr9tY,3987
84
84
  zou/app/blueprints/files/resources.py,sha256=kWqhPfi1SmVXE05G3sfR2aF4r6J8O7Tr5c0oKO9MQN0,69175
85
85
  zou/app/blueprints/index/__init__.py,sha256=Dh3oQiirpg8RCkfVOuk3irIjSvUvuRf0jPxE6oGubz0,828
86
- zou/app/blueprints/index/resources.py,sha256=NuqSq0rPlOpldRCwFhDqNW4UwSc8QdRRKcGn9S0FCrk,8635
86
+ zou/app/blueprints/index/resources.py,sha256=L31_Gb-9f4C0UHXQWLBgVbR7hrRLRkDg5E3h6Wkyq-Y,8644
87
87
  zou/app/blueprints/news/__init__.py,sha256=HxBXjC15dVbotNAZ0CLf02iwUjxJr20kgf8_kT_9nwM,505
88
88
  zou/app/blueprints/news/resources.py,sha256=HdLq2NgfKyN2d3hIATBhH3dlk4c50I4dhhvEhhB_NY4,7334
89
89
  zou/app/blueprints/persons/__init__.py,sha256=0cnHHw3K_8OEMm0qOi3wKVomSAg9IJSnVjAXabMeHks,3893
@@ -93,7 +93,7 @@ zou/app/blueprints/playlists/resources.py,sha256=alRlMHypUFErXLsEYxpFK84cdjFJ3YW
93
93
  zou/app/blueprints/previews/__init__.py,sha256=ihC6OQ9AUjnZ2JeMnjRh_tKGO0UmAjOwhZnOivc3BnQ,4460
94
94
  zou/app/blueprints/previews/resources.py,sha256=22-ISgZba0SpQ2sS0l5WjVtLTaiLKoal4aLcqxLQX9s,53176
95
95
  zou/app/blueprints/projects/__init__.py,sha256=Pn3fA5bpNFEPBzxTKJ2foV6osZFflXXSM2l2uZh3ktM,3927
96
- zou/app/blueprints/projects/resources.py,sha256=E91Vj9EzId2pxiL50JRfrThiyif1PmzWS1oPeMThzQI,31544
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
98
98
  zou/app/blueprints/search/resources.py,sha256=_QgRlUuxCPgY-ip5r2lGFtXNcGSE579JsCSrVf8ajVU,3093
99
99
  zou/app/blueprints/shots/__init__.py,sha256=HfgLneZBYUMa2OGwIgEZTz8zrIEYFRiYmRbreBPYeYw,4076
@@ -108,7 +108,7 @@ zou/app/blueprints/source/csv/casting.py,sha256=zUlwEnSheoCMTIgvRlKJgNv3hYPDjfSr
108
108
  zou/app/blueprints/source/csv/edits.py,sha256=yL1RcClBxPNakLt326M2aJk6pVv0H7CrNXALuKHkDZ8,8386
109
109
  zou/app/blueprints/source/csv/persons.py,sha256=QciJ47B3rAPyUQTAeToCUAhEai16J4s37oOErjdC_Vw,2582
110
110
  zou/app/blueprints/source/csv/shots.py,sha256=5OI0IBY8C72aBbDFrIkvN-ZkWWCHsvOGUQ0Z9rWsnDs,9748
111
- zou/app/blueprints/source/csv/task_type_estimations.py,sha256=YppVqTGfEBwXJH9UG09TrC47exErXUykKSriwpVNQxk,5617
111
+ zou/app/blueprints/source/csv/task_type_estimations.py,sha256=OdUo9plR1g6ZTKL1-06ye_8xpFJ0V9x5gLzcWw1jFcI,5730
112
112
  zou/app/blueprints/source/shotgun/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
113
113
  zou/app/blueprints/source/shotgun/assets.py,sha256=vuRvy0oUszImYRawrbWC2h7CHYSBvGXDJPoa6ZqpG_U,4980
114
114
  zou/app/blueprints/source/shotgun/base.py,sha256=Y0sX8X3oN0AQWiBqjLX-cijnBZH8UzZp4iC8BQpf_tk,6193
@@ -127,13 +127,13 @@ zou/app/blueprints/source/shotgun/tasks.py,sha256=XXBRe9QhhS-kuZeV3HitOnpf7mmWVx
127
127
  zou/app/blueprints/source/shotgun/team.py,sha256=GF7y2BwDeFJCiidtG68icfCi-uV1-b96YKiH8KR54iE,1819
128
128
  zou/app/blueprints/source/shotgun/versions.py,sha256=8Mb35e5p3FLbbiu6AZb9tJErDKz2pPRBdIYu80Ayj7w,2292
129
129
  zou/app/blueprints/tasks/__init__.py,sha256=udtTZJVViawRAPu8dO_OoyVzQTheLYWTHeTnrC-2RDA,4331
130
- zou/app/blueprints/tasks/resources.py,sha256=eAcjUpkBvKwODOxJ04kFmp-jB6jSqqsRgGzsNm6_gVw,55117
130
+ zou/app/blueprints/tasks/resources.py,sha256=DzwEBv2isg9oxCAE6qo0Q47pfZh_A_3z30QmGDsa9-w,55174
131
131
  zou/app/blueprints/user/__init__.py,sha256=H9zCHcVobC6jq6dTToXKAjnZmDA0a9gChHiIP3BcZsc,4586
132
132
  zou/app/blueprints/user/resources.py,sha256=loCigQvPCoRw6nVu_9TIY7pjUByJgk6vutFPSo0MwzI,39891
133
133
  zou/app/file_trees/default.json,sha256=ryUrEmQYE8B_WkzCoQLgmem3N9yNwMIWx9G8p3HfG9o,2310
134
134
  zou/app/file_trees/simple.json,sha256=VBI43Z3rjQxtTpVCq3ktUgS0UB8x-aTowKL9LXuXCFI,3149
135
135
  zou/app/indexer/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
136
- zou/app/indexer/indexing.py,sha256=rzZxtAInXVZ2cZES-6QJw3NJlRpSPpKLxL0eP8l0onI,3479
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
139
  zou/app/models/attachment_file.py,sha256=d3gldEyKhRyLqGQHBbWVwtmPgtq7oxipxHanZUKWVGI,1377
@@ -148,18 +148,18 @@ zou/app/models/day_off.py,sha256=WMZs7oMhUBpMnNyvhgpl1j6egZ5J0drnrF1dH3N5cII,691
148
148
  zou/app/models/department.py,sha256=ZUzZXemrHJOxoEgALCiMqGww1wnEvxTL12k6KmkWoW4,418
149
149
  zou/app/models/desktop_login_log.py,sha256=fdgqEXAQkHw6CtRU_Y-CuboaZA9QWJc9OzklvbdPBJY,546
150
150
  zou/app/models/entity.py,sha256=KfRurXnssOGkRRGLz1UA1U27tZDJMeaRPTkADbGo094,8550
151
- zou/app/models/entity_type.py,sha256=747igCypAv5n-Lf-xl_nVEO3MzyUPQu5qgH_jksnsrY,1871
151
+ zou/app/models/entity_type.py,sha256=IWwsew4cHAlNJQNGg8vtcKAlaaKLtkw4RK4OMFp85ho,2129
152
152
  zou/app/models/event.py,sha256=WNZ9mSh5kIIg-W5CDKfohtAE_ObXbmgRB5JMyWRZktA,677
153
153
  zou/app/models/file_status.py,sha256=pdYnI4empolJ2o2yHSEqp5ZTra4zyXiZPx3bE599GLo,351
154
154
  zou/app/models/login_log.py,sha256=Cpyjo01EKHyaKvNaU_4EWOsvOVxzpBOjeEB17z6h25k,654
155
- zou/app/models/metadata_descriptor.py,sha256=LRCJ7NKsy771kMSLeZDrCON7jRk76J-JTFWT2nbseJw,1933
155
+ zou/app/models/metadata_descriptor.py,sha256=XyuPqx_vhP8TH7avnconktB-3WFCWk3NkdywQltJVqs,2240
156
156
  zou/app/models/milestone.py,sha256=ZwJ7_PbXT_LeUZKv3l5DLPM7ByFQEccpEeWFq4-IM-Q,927
157
157
  zou/app/models/news.py,sha256=UPX0ojWF-leAGZNKqlo7KL0s0lp2tbKMJl4N5lGbouo,1583
158
158
  zou/app/models/notification.py,sha256=1ODOymGPeB4oxgX_3WhOgIL_Lsz-JR7miDkBS6W8t_s,2563
159
159
  zou/app/models/organisation.py,sha256=R69AR1JDZSs6YeXDalmz3ewmrSMDv9Mr8AZAHn09Iu0,1365
160
160
  zou/app/models/output_file.py,sha256=hyLGrpsgrk0aisDXppRQrB7ItCwyuyw-X0ZwVAHabsA,2569
161
161
  zou/app/models/output_type.py,sha256=us_lCUCEvuP4vi_XmmOcEl1J2MtZhMX5ZheBqEFCgWA,381
162
- zou/app/models/person.py,sha256=E6aTbN6HigVTh9_myMfYK6iqrdUfMRB6XBtowdA-qYQ,7511
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
165
  zou/app/models/preview_file.py,sha256=Ur45Wau2X3qyKULh04EUcMbnBmaQc8y4IMs5NgELiAQ,3134
@@ -185,7 +185,7 @@ zou/app/services/backup_service.py,sha256=_ZtZp6wkcVYnHxBosziwLGdrTvsUttXGphiydq
185
185
  zou/app/services/base_service.py,sha256=OZd0STFh-DyBBdwsmA7DMMnrwv4C8wJUbShvZ1isndU,1383
186
186
  zou/app/services/breakdown_service.py,sha256=-bH1KUq9-No_OKnQtWK4XEU1w7uDPJnzWFMrKNkS1K0,27593
187
187
  zou/app/services/chats_service.py,sha256=pqnT-RCltdf9Dp4t-2NtOSawGk0jyNhVPTgERZ_nYvk,8297
188
- zou/app/services/comments_service.py,sha256=RglVtc7tLUju0cpdIZAv2Xvxr-7iGDp3IPg1T0BHhI4,18599
188
+ zou/app/services/comments_service.py,sha256=dEZ4Y4NQRGtCDnChlZp3VtF02noSPqXPT4yJ9UorwtA,18708
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
@@ -196,7 +196,7 @@ zou/app/services/events_service.py,sha256=Ew-bY5hqrWLmpbVj1_xd3E2S3JtyAGzdgw2Xju
196
196
  zou/app/services/exception.py,sha256=mcDVjWGICMIlOi4nsN2EQ7nc3V70rAC-iCmXt6kOXbA,4240
197
197
  zou/app/services/file_tree_service.py,sha256=8JNBDgnXtV-AmSJ3gnUGB4oSwLjPgi1WYyL0Kc98JRE,33875
198
198
  zou/app/services/files_service.py,sha256=df1_9v-vwE5HVi9XjtilTPWHuiWunvrwPyQh_IXupNM,28517
199
- zou/app/services/index_service.py,sha256=1w8rGJ7ArYC13B43hD4JOPtVhaRsbseJVVY-GnU_3tA,9874
199
+ zou/app/services/index_service.py,sha256=IaffQz_oj6GPEbuDp4a2qnSc6n-hhIcmA_LrTm3Wots,10201
200
200
  zou/app/services/names_service.py,sha256=TOSrintROmxcAlcFQE0i2E3PBLnw81GAztNselpTn18,2947
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
@@ -210,10 +210,10 @@ zou/app/services/shots_service.py,sha256=4H81Tf6twY4s9Ac9_MCX_4bdW75m30TaKrR0tLi
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=Cv1iEdXwZommRkKh8wv7_hf6yaEDIL9SYWRNuoAmdhg,68683
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=8L6XcSECPtVTAawMi7dox57Su6VF6KY1kFDSVItt_p0,50292
216
+ zou/app/services/user_service.py,sha256=QlyckTfiCx-bzRewqVwHMJQXerg6BWXYWfURhvp65G4,50291
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
@@ -270,6 +270,7 @@ zou/migrations/versions/1cb44194db49_add_file_size_field_to_preview_file.py,sha2
270
270
  zou/migrations/versions/1e150c2cea4d_add_nb_entities_out.py,sha256=3fBXfaR4Uz2amzZholso3DX4Z20EZkvKn12OrDluilk,713
271
271
  zou/migrations/versions/1e2d77a2f0c4_add_hd_by_default_column.py,sha256=NeqHKwihEPiM9PUnY_XuZ4K2qRYO-AgOujHpqBW-urs,729
272
272
  zou/migrations/versions/1fab8c420678_add_attachments_to_message_chats.py,sha256=gSVhdM5EG8HBzJ9BejjKLgbqA7ps0O0iQ9uHZNbzAi0,1639
273
+ zou/migrations/versions/20a8ad264659_tasktypeassettypelink_.py,sha256=evXbBdw-HIT7wYQiDesIlif3JN9jieFVJsLEn63Hzgw,4171
273
274
  zou/migrations/versions/20dfeb36142b_add_projecttaskstatuslink_roles_for_.py,sha256=L_BaHxyrWutZ9vJ_x3OQ6cGxicoRNlwps8wakIxrNe4,1256
274
275
  zou/migrations/versions/23122f290ca2_add_entity_chat_models.py,sha256=FPnFj84qk36m9DfiBggOIHybtUCMMquRB9j0bw3cL3A,4532
275
276
  zou/migrations/versions/269d41bfb73f_add_entity_entity_links.py,sha256=mPChSTYtDAmID9C7p-8iQB6_BXoejPoPSCFf5nDgAxk,1626
@@ -300,6 +301,7 @@ zou/migrations/versions/4715c2586036_add_last_preview_file_fields.py,sha256=ez0H
300
301
  zou/migrations/versions/4e3738cdc34c_.py,sha256=0THgcNbLygTZb462fHZ9SK2EBq_j6_htcPXz4CZbVkg,2636
301
302
  zou/migrations/versions/4f2398ebcd49_.py,sha256=7ZYIHv3bjppg3dqvBHe_sBatzz7etQBpuRKY-DSvR_Q,683
302
303
  zou/migrations/versions/523ee9647bee_.py,sha256=2PbD0cNflQtHd7TLxyfSQDJ8gHybUYCKcPQw_XUivfU,1262
304
+ zou/migrations/versions/539a3a00c417_for_departmentlink_index_person_id_.py,sha256=6_nJuUQsSXvUbhUrzfyr7ACDZehxkfkm0tz_cxV773Y,1534
303
305
  zou/migrations/versions/54ee0d1d60ba_add_build_job_model.py,sha256=xePUVxovJ_EOVCdNPz9qoXR_mf89YOhl2IIwYaTQhzI,1889
304
306
  zou/migrations/versions/556526e47daa_.py,sha256=XvDBc0o4l76Rf1FBXb5sopNHiGEe-R8tbZ5C5LmLAOA,2052
305
307
  zou/migrations/versions/57222395f2be_add_statusautomation_import_last_revision.py,sha256=rPRvyxfrtEtFywGuBkfB8VLEs3EUytgUyA8xB8vtH4A,1039
@@ -414,9 +416,9 @@ zou/remote/normalize_movie.py,sha256=zNfEY3N1UbAHZfddGONTg2Sff3ieLVWd4dfZa1dpnes
414
416
  zou/remote/playlist.py,sha256=AsDo0bgYhDcd6DfNRV6r6Jj3URWwavE2ZN3VkKRPbLU,3293
415
417
  zou/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
416
418
  zou/utils/movie.py,sha256=d67fIL9dVBKt-E_qCGXRbNNdbJaJR5sHvZeX3hf8ldE,16559
417
- zou-0.20.11.dist-info/LICENSE,sha256=dql8h4yceoMhuzlcK0TT_i-NgTFNIZsgE47Q4t3dUYI,34520
418
- zou-0.20.11.dist-info/METADATA,sha256=qKU00E_qUjcw3SvgfyRtfBL3BJdvK2OKmQFRTMi2x9k,6734
419
- zou-0.20.11.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
420
- zou-0.20.11.dist-info/entry_points.txt,sha256=PelQoIx3qhQ_Tmne7wrLY-1m2izuzgpwokoURwSohy4,130
421
- zou-0.20.11.dist-info/top_level.txt,sha256=4S7G_jk4MzpToeDItHGjPhHx_fRdX52zJZWTD4SL54g,4
422
- zou-0.20.11.dist-info/RECORD,,
419
+ zou-0.20.13.dist-info/LICENSE,sha256=dql8h4yceoMhuzlcK0TT_i-NgTFNIZsgE47Q4t3dUYI,34520
420
+ zou-0.20.13.dist-info/METADATA,sha256=ChFlRH3tCEuWxZAdDlQSmy8egoEaXXUdUvzNKplyZoU,6734
421
+ zou-0.20.13.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
422
+ zou-0.20.13.dist-info/entry_points.txt,sha256=PelQoIx3qhQ_Tmne7wrLY-1m2izuzgpwokoURwSohy4,130
423
+ zou-0.20.13.dist-info/top_level.txt,sha256=4S7G_jk4MzpToeDItHGjPhHx_fRdX52zJZWTD4SL54g,4
424
+ zou-0.20.13.dist-info/RECORD,,
File without changes
File without changes