zou 0.20.56__py3-none-any.whl → 0.20.58__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.56"
1
+ __version__ = "0.20.58"
@@ -73,6 +73,8 @@ ALLOWED_FILE_EXTENSION = [
73
73
  "psd",
74
74
  "psb",
75
75
  "rar",
76
+ "rev",
77
+ "riv",
76
78
  "sai",
77
79
  "sai2",
78
80
  "sbbkp",
@@ -25,6 +25,12 @@ class TaskStatus(db.Model, BaseMixin, SerializerMixin):
25
25
  is_retake = db.Column(db.Boolean(), default=False)
26
26
  is_feedback_request = db.Column(db.Boolean(), default=False, index=True)
27
27
  is_default = db.Column(db.Boolean(), default=False, index=True)
28
+ is_wip = db.Column(
29
+ db.Boolean(),
30
+ server_default=expression.false(),
31
+ default=False,
32
+ index=True,
33
+ )
28
34
  shotgun_id = db.Column(db.Integer)
29
35
 
30
36
  for_concept = db.Column(
@@ -159,10 +159,7 @@ def _manage_status_change(task_status, task, comment):
159
159
  if task_status["is_feedback_request"]:
160
160
  new_data["end_date"] = date_helpers.get_utc_now_datetime()
161
161
 
162
- if (
163
- task_status["short_name"] == "wip"
164
- and task["real_start_date"] is None
165
- ):
162
+ if task_status["is_wip"] and task["real_start_date"] is None:
166
163
  new_data["real_start_date"] = datetime.datetime.now(
167
164
  datetime.timezone.utc
168
165
  )
@@ -1305,6 +1305,7 @@ def get_or_create_status(
1305
1305
  is_retake=False,
1306
1306
  is_feedback_request=False,
1307
1307
  is_default=False,
1308
+ is_wip=False,
1308
1309
  for_concept=False,
1309
1310
  is_artist_allowed=True,
1310
1311
  is_client_allowed=True,
@@ -1336,6 +1337,7 @@ def get_or_create_status(
1336
1337
  for_concept=for_concept,
1337
1338
  is_artist_allowed=is_artist_allowed,
1338
1339
  is_client_allowed=is_client_allowed,
1340
+ is_wip=is_wip,
1339
1341
  )
1340
1342
  events.emit("task-status:new", {"task_status_id": task_status.id})
1341
1343
  return task_status.serialize()
@@ -1792,7 +1794,7 @@ def reset_task_data(task_id):
1792
1794
  TaskStatus.is_retake,
1793
1795
  TaskStatus.is_feedback_request,
1794
1796
  TaskStatus.is_done,
1795
- TaskStatus.short_name,
1797
+ TaskStatus.is_wip,
1796
1798
  )
1797
1799
  .all()
1798
1800
  )
@@ -1803,13 +1805,13 @@ def reset_task_data(task_id):
1803
1805
  task_status_is_retake,
1804
1806
  task_status_is_feedback_request,
1805
1807
  task_status_is_done,
1806
- task_status_short_name,
1808
+ task_status_is_wip,
1807
1809
  ) in comments:
1808
1810
  if task_status_is_retake and not previous_is_retake:
1809
1811
  retake_count += 1
1810
1812
  previous_is_retake = task_status_is_retake
1811
1813
 
1812
- if task_status_short_name.lower() == "wip" and real_start_date is None:
1814
+ if task_status_is_wip and real_start_date is None:
1813
1815
  real_start_date = comment.created_at
1814
1816
 
1815
1817
  if task_status_is_feedback_request:
zou/app/utils/commands.py CHANGED
@@ -168,7 +168,7 @@ def init_data():
168
168
 
169
169
  tasks_service.get_default_status()
170
170
  tasks_service.get_or_create_status(
171
- "Work In Progress", "wip", "#3273dc"
171
+ "Work In Progress", "wip", "#3273dc", is_wip=True
172
172
  )
173
173
  tasks_service.get_or_create_status(
174
174
  "Waiting For Approval", "wfa", "#ab26ff", is_feedback_request=True
zou/event_stream.py CHANGED
@@ -54,7 +54,7 @@ def _get_empty_room(current_frame=0):
54
54
 
55
55
 
56
56
  def _get_room_from_data(data):
57
- room_id = data["playlist_id"]
57
+ room_id = data.get("playlist_id", "0")
58
58
  return rooms_data.get(room_id, _get_empty_room()), room_id
59
59
 
60
60
 
@@ -80,7 +80,7 @@ def _emit_people_updated(room_id, people):
80
80
 
81
81
 
82
82
  def _update_room_playing_status(data, room):
83
- room["playlist_id"] = data.get("playlist_id", False)
83
+ room["playlist_id"] = data.get("playlist_id", "")
84
84
  room["user_id"] = data.get("user_id", False)
85
85
  room["local_id"] = data.get("local_id", False)
86
86
  room["is_playing"] = data.get("is_playing", False)
@@ -228,38 +228,46 @@ def on_room_updated(data, only_newcomer=False):
228
228
  @socketio.on("preview-room:add-annotation", namespace="/events")
229
229
  @jwt_required()
230
230
  def on_add_annotation(data):
231
- room_id = data["playlist_id"]
231
+ room_id = data.get("playlist_id", "")
232
232
  emit("preview-room:add-annotation", data, room=room_id)
233
233
 
234
234
 
235
235
  @socketio.on("preview-room:remove-annotation", namespace="/events")
236
236
  @jwt_required()
237
237
  def on_remove_annotation(data):
238
- room_id = data["playlist_id"]
238
+ room_id = data.get("playlist_id", "")
239
239
  emit("preview-room:remove-annotation", data, room=room_id)
240
240
 
241
241
 
242
242
  @socketio.on("preview-room:update-annotation", namespace="/events")
243
243
  @jwt_required()
244
244
  def on_update_annotation(data):
245
- room_id = data["playlist_id"]
245
+ room_id = data.get("playlist_id", "")
246
246
  emit("preview-room:update-annotation", data, room=room_id)
247
247
 
248
248
 
249
249
  @socketio.on("preview-room:change-version", namespace="/events")
250
250
  @jwt_required()
251
251
  def on_change_version(data):
252
- room_id = data["playlist_id"]
252
+ room_id = data.get("playlist_id", "")
253
253
  emit("preview-room:change-version", data, room=room_id)
254
254
 
255
255
 
256
256
  @socketio.on("preview-room:panzoom-changed", namespace="/events")
257
257
  @jwt_required()
258
258
  def on_change_version(data):
259
- room_id = data["playlist_id"]
259
+ room_id = data.get("playlist_id", "")
260
260
  emit("preview-room:panzoom-changed", data, room=room_id)
261
261
 
262
262
 
263
+ @socketio.on("preview-room:comparison-panzoom-changed", namespace="/events")
264
+ @jwt_required()
265
+ def on_change_version(data):
266
+ room_id = data.get("playlist_id", "")
267
+ emit("preview-room:comparison-panzoom-changed", data, room=room_id)
268
+
269
+
270
+
263
271
  if __name__ == "__main__":
264
272
  socketio.run(
265
273
  app,
@@ -0,0 +1,87 @@
1
+ """Add TaskStatus.is_wip
2
+
3
+ Revision ID: 4d585b6956f2
4
+ Revises: d80f02824047
5
+ Create Date: 2025-06-30 01:11:29.146591
6
+
7
+ """
8
+
9
+ from alembic import op
10
+ import sqlalchemy as sa
11
+ from alembic import op
12
+ import sqlalchemy as sa
13
+ from sqlalchemy.orm.session import Session
14
+ from sqlalchemy.ext.declarative import declarative_base
15
+ from zou.migrations.utils.base import BaseMixin
16
+ from sqlalchemy.sql import expression
17
+
18
+
19
+ # revision identifiers, used by Alembic.
20
+ revision = "4d585b6956f2"
21
+ down_revision = "d80f02824047"
22
+ branch_labels = None
23
+ depends_on = None
24
+
25
+ base = declarative_base()
26
+
27
+
28
+ class TaskStatus(base, BaseMixin):
29
+ """
30
+ Describe the state of a task. A status marked as reviewable expects a
31
+ preview file linked to relate comment.
32
+ """
33
+
34
+ __tablename__ = "task_status"
35
+ name = sa.Column(sa.String(40), nullable=False)
36
+ archived = sa.Column(sa.Boolean(), default=False)
37
+ short_name = sa.Column(
38
+ sa.String(10), unique=True, nullable=False, index=True
39
+ )
40
+ description = sa.Column(sa.Text())
41
+ color = sa.Column(sa.String(7), nullable=False)
42
+ priority = sa.Column(sa.Integer, default=1)
43
+
44
+ is_done = sa.Column(sa.Boolean(), default=False, index=True)
45
+ is_artist_allowed = sa.Column(sa.Boolean(), default=True)
46
+ is_client_allowed = sa.Column(sa.Boolean(), default=True)
47
+ is_retake = sa.Column(sa.Boolean(), default=False)
48
+ is_feedback_request = sa.Column(sa.Boolean(), default=False, index=True)
49
+ is_default = sa.Column(sa.Boolean(), default=False, index=True)
50
+ is_wip = sa.Column(
51
+ sa.Boolean(),
52
+ server_default=expression.false(),
53
+ default=False,
54
+ index=True,
55
+ )
56
+ shotgun_id = sa.Column(sa.Integer)
57
+
58
+ for_concept = sa.Column(
59
+ sa.Boolean(), server_default=expression.false(), default=False
60
+ )
61
+
62
+
63
+ def upgrade():
64
+ # ### commands auto generated by Alembic - please adjust! ###
65
+ with op.batch_alter_table("task_status", schema=None) as batch_op:
66
+ batch_op.add_column(sa.Column("is_wip", sa.Boolean(), nullable=True))
67
+ batch_op.create_index(
68
+ batch_op.f("ix_task_status_is_wip"), ["is_wip"], unique=False
69
+ )
70
+ session = Session(bind=op.get_bind())
71
+ session.query(TaskStatus).update(
72
+ {
73
+ TaskStatus.is_wip: TaskStatus.short_name == "wip",
74
+ }
75
+ )
76
+ session.commit()
77
+
78
+ # ### end Alembic commands ###
79
+
80
+
81
+ def downgrade():
82
+ # ### commands auto generated by Alembic - please adjust! ###
83
+ with op.batch_alter_table("task_status", schema=None) as batch_op:
84
+ batch_op.drop_index(batch_op.f("ix_task_status_is_wip"))
85
+ batch_op.drop_column("is_wip")
86
+
87
+ # ### end Alembic commands ###
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: zou
3
- Version: 0.20.56
3
+ Version: 0.20.58
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
@@ -89,7 +89,7 @@ Requires-Dist: pytest==8.4.1; extra == "test"
89
89
  Provides-Extra: monitoring
90
90
  Requires-Dist: prometheus-flask-exporter==0.23.2; extra == "monitoring"
91
91
  Requires-Dist: pygelf==0.4.3; extra == "monitoring"
92
- Requires-Dist: sentry-sdk==2.30.0; extra == "monitoring"
92
+ Requires-Dist: sentry-sdk==2.32.0; extra == "monitoring"
93
93
  Provides-Extra: lint
94
94
  Requires-Dist: autoflake==2.3.1; extra == "lint"
95
95
  Requires-Dist: black==25.1.0; extra == "lint"
@@ -1,7 +1,7 @@
1
- zou/__init__.py,sha256=sd3x79mnoEvBJyRkZtq5DFYA0sqPNMT700WDTrRE6ME,24
1
+ zou/__init__.py,sha256=5N6GyHyKynWvCcfY7xFn4CwfJiEcy8iljLFjtzWXQ-0,24
2
2
  zou/cli.py,sha256=W7nhMII-gyl8AlL6zgDmverSdFphDV_WnuN3BHrHc8w,22448
3
3
  zou/debug.py,sha256=1fawPbkD4wn0Y9Gk0BiBFSa-CQe5agFi8R9uJYl2Uyk,520
4
- zou/event_stream.py,sha256=yTU1Z3r55SiYm8Y5twtJIo5kTnhbBK-XKc8apdgvzNw,8291
4
+ zou/event_stream.py,sha256=YOWVGAgseVQKC6usoYDW4T9iRVrG7R8TvP-Nr2AKi6k,8576
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=Esgni_0-tAaE3msWxNMEdUS_wwIdElM0P2GrjhaHbCk,3727
@@ -95,7 +95,7 @@ zou/app/blueprints/persons/resources.py,sha256=YS5ogqi3xbA0fKZp4c-FH4YWsf3HdBKWy
95
95
  zou/app/blueprints/playlists/__init__.py,sha256=vuEk1F3hFHsmuKWhdepMoLyOzmNKDn1YrjjfcaIz0lQ,1596
96
96
  zou/app/blueprints/playlists/resources.py,sha256=mF3gmlWpe9YKyyKVRUXYtvTCk7OguWIMVaCN_J_JPS4,17636
97
97
  zou/app/blueprints/previews/__init__.py,sha256=ihC6OQ9AUjnZ2JeMnjRh_tKGO0UmAjOwhZnOivc3BnQ,4460
98
- zou/app/blueprints/previews/resources.py,sha256=uyjfW3vyE2a1PPXO8MsHP8-3jhuVKHt3oi2pYsq-ZIw,53376
98
+ zou/app/blueprints/previews/resources.py,sha256=z6xRlibS2H4SS_Z_7PfgiQ8v23eiZTMigNl6fxeOqj8,53398
99
99
  zou/app/blueprints/projects/__init__.py,sha256=KhzIn5HvemfvsP5yJBMImdsEuTA_P806kRpoNbAdfIs,4643
100
100
  zou/app/blueprints/projects/resources.py,sha256=Z0UfzCzP9n8YBIH4_2cFaP9tIHCn-jQI7NqtQouCTiY,44938
101
101
  zou/app/blueprints/search/__init__.py,sha256=QCjQIY_85l_orhdEiqav_GifjReuwsjZggN3V0GeUVY,356
@@ -182,7 +182,7 @@ zou/app/models/status_automation.py,sha256=95c0lmOetujyGWViLd_qsR4GWPhrmlvi9ZfkC
182
182
  zou/app/models/studio.py,sha256=cXnYFh-8m5Kw05QawYcCr59eeLp25NDI0VIb77oqUOs,384
183
183
  zou/app/models/subscription.py,sha256=kMfPPe8uFJMDWB4B9MpWaXZD86FFZlj7ty0FkVyqE_4,1054
184
184
  zou/app/models/task.py,sha256=luZNdb30rnRPampD-_oxuhi_rZ8ECXC0v2RwChNKAjo,3667
185
- zou/app/models/task_status.py,sha256=J7mNWIFd9KMWfUOLHjmuxIupjs59iSh8aQ_9LEFXqH4,1227
185
+ zou/app/models/task_status.py,sha256=_XAFax5u31xiXReSEc0KISLaf3XvVrFDeoYZKcy_T2U,1365
186
186
  zou/app/models/task_type.py,sha256=IsixVAfz3pyMf0eQw8x-uFNM9OHNkZpsPLEz_VNQ0hA,1005
187
187
  zou/app/models/time_spent.py,sha256=n7i3FO9g1eE_zATkItoCgrGVqq3iMSfdlKSveEZPloc,795
188
188
  zou/app/models/working_file.py,sha256=q0LM3s1ziw_9AmmPDCkwyf1-TJkWTBMgo2LdHyVRwxg,1509
@@ -194,7 +194,7 @@ zou/app/services/base_service.py,sha256=OZd0STFh-DyBBdwsmA7DMMnrwv4C8wJUbShvZ1is
194
194
  zou/app/services/breakdown_service.py,sha256=-bH1KUq9-No_OKnQtWK4XEU1w7uDPJnzWFMrKNkS1K0,27593
195
195
  zou/app/services/budget_service.py,sha256=uMU1vJr7kyxtkvMz_Nm7DyhW6qvSGYGqRHEQTxsHYCc,5468
196
196
  zou/app/services/chats_service.py,sha256=pqnT-RCltdf9Dp4t-2NtOSawGk0jyNhVPTgERZ_nYvk,8297
197
- zou/app/services/comments_service.py,sha256=C2XL11EAnd2ZC1A8RJ-NRgQ0QeinUkqCjggm97ZXuEE,18789
197
+ zou/app/services/comments_service.py,sha256=z1vj60yU196_Tgnq4XZdY29VT4TWVYGq8y8zGl485rs,18728
198
198
  zou/app/services/concepts_service.py,sha256=sXzMPQ5Rav-c_36CBxdDBjKNq0-gaLWFY9QZGy3jjv4,11252
199
199
  zou/app/services/custom_actions_service.py,sha256=fWISEOOdthadrxeHuacEel5Xj6msn0yWXJQDG1gzvsY,297
200
200
  zou/app/services/deletion_service.py,sha256=jZzNzyfmKJK1Sro9PUV0v9cVh6QQ2qh-0bQ4Ajuk77I,17434
@@ -220,7 +220,7 @@ zou/app/services/shots_service.py,sha256=MfBvw0hhVwi_KSQVnM-V4O3LnNkJB2imJWF6n9J
220
220
  zou/app/services/stats_service.py,sha256=e9h090eZWADtzXycy1WOup_jlxGwQojrr1y_PDcVatc,13156
221
221
  zou/app/services/status_automations_service.py,sha256=tVio7Sj7inhvKS4UOyRhcdpwr_KNP96hT1o0X7XcGF4,715
222
222
  zou/app/services/sync_service.py,sha256=iWxx1kOGEXympHmSBBQWtDZWNtumdxp8kppee0OefMo,41811
223
- zou/app/services/tasks_service.py,sha256=D-u-8W3rIg00Nqp7MuG1WSOcPANE4XXliKpVwm5NbVU,69815
223
+ zou/app/services/tasks_service.py,sha256=gRD-xODi7tCAyHdi5yJohKavWdODK6TwvDGR9pa82BM,69831
224
224
  zou/app/services/telemetry_services.py,sha256=xQm1h1t_JxSFW59zQGf4NuNdUi1UfMa_6pQ-ytRbmGA,1029
225
225
  zou/app/services/time_spents_service.py,sha256=8sYnepgeo4yohNFRNiEedqFfL2vuJ78GZSHOpRmp52Q,16502
226
226
  zou/app/services/user_service.py,sha256=wdi2b2kvct5b_Qi9XdrNEhz9JL4WoI9EpT-8_UOSXnE,52070
@@ -235,7 +235,7 @@ zou/app/utils/auth.py,sha256=o9lOGgj3nkfsupfhLBre5fUuT1HBZgXVJU06lrdZGag,996
235
235
  zou/app/utils/cache.py,sha256=MRluTvGG67ybOkyzgD70B6PGKMdRyFdTc0AYy3dEQe8,1210
236
236
  zou/app/utils/chats.py,sha256=ORngxQ3IQQF0QcVFJLxJ-RaU4ksQ9-0M8cmPa0pc0Ho,4302
237
237
  zou/app/utils/colors.py,sha256=LaGV17NL_8xY0XSp8snGWz5UMwGnm0KPWXyE5BTMG6w,200
238
- zou/app/utils/commands.py,sha256=19ibYVCXbT9H8DdxT5bKRueGJV4Hab-WliSow9sL6dc,29982
238
+ zou/app/utils/commands.py,sha256=_OUSRs8_qARsoTp23qAupsqhed_ryL3j3LwMpRgKECk,29995
239
239
  zou/app/utils/csv_utils.py,sha256=GiI8SeUqmIh9o1JwhZGkQXU_0K0EcPrRHYIZ8bMoYzk,1228
240
240
  zou/app/utils/date_helpers.py,sha256=jFxDPCbAasg0I1gsC72AKEbGcx5c4pLqXZkSfZ4wLdQ,4724
241
241
  zou/app/utils/dbhelpers.py,sha256=RSJuoxLexGJyME16GQCs-euFLBR0u-XAFdJ1KMSv5M8,1143
@@ -314,6 +314,7 @@ zou/migrations/versions/45dafbb3f4e1_for_person_contract_type_disallow_null.py,s
314
314
  zou/migrations/versions/45f739ef962a_add_people_salary_scale_table.py,sha256=BwWUooGOWngD5ok0WH85HWh6QwlrJRzfsBFoYaAjHbo,2349
315
315
  zou/migrations/versions/4715c2586036_add_last_preview_file_fields.py,sha256=ez0HfwcFNpo5Gq8Jc-BxaTQ42pJM7T6VFpL1rawPGdk,1353
316
316
  zou/migrations/versions/4aab1f84ad72_introduce_plugin_table.py,sha256=6fbUq13vheZjuN-o6rxrR82h67JXcPwjcQ3AgiL5vCI,2156
317
+ zou/migrations/versions/4d585b6956f2_add_taskstatus_is_wip.py,sha256=QTOcX4Qt03JCVvIag7idJsOHddBT-aS_sx6S95XsyMU,2655
317
318
  zou/migrations/versions/4e3738cdc34c_.py,sha256=0THgcNbLygTZb462fHZ9SK2EBq_j6_htcPXz4CZbVkg,2636
318
319
  zou/migrations/versions/4f2398ebcd49_.py,sha256=7ZYIHv3bjppg3dqvBHe_sBatzz7etQBpuRKY-DSvR_Q,683
319
320
  zou/migrations/versions/523ee9647bee_.py,sha256=2PbD0cNflQtHd7TLxyfSQDJ8gHybUYCKcPQw_XUivfU,1262
@@ -446,9 +447,9 @@ zou/remote/normalize_movie.py,sha256=zNfEY3N1UbAHZfddGONTg2Sff3ieLVWd4dfZa1dpnes
446
447
  zou/remote/playlist.py,sha256=AsDo0bgYhDcd6DfNRV6r6Jj3URWwavE2ZN3VkKRPbLU,3293
447
448
  zou/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
448
449
  zou/utils/movie.py,sha256=d67fIL9dVBKt-E_qCGXRbNNdbJaJR5sHvZeX3hf8ldE,16559
449
- zou-0.20.56.dist-info/licenses/LICENSE,sha256=dql8h4yceoMhuzlcK0TT_i-NgTFNIZsgE47Q4t3dUYI,34520
450
- zou-0.20.56.dist-info/METADATA,sha256=525wpZ1_Sylr0xJNUOuzxjHd6yJbObrih5lRicIljko,6778
451
- zou-0.20.56.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
452
- zou-0.20.56.dist-info/entry_points.txt,sha256=PelQoIx3qhQ_Tmne7wrLY-1m2izuzgpwokoURwSohy4,130
453
- zou-0.20.56.dist-info/top_level.txt,sha256=4S7G_jk4MzpToeDItHGjPhHx_fRdX52zJZWTD4SL54g,4
454
- zou-0.20.56.dist-info/RECORD,,
450
+ zou-0.20.58.dist-info/licenses/LICENSE,sha256=dql8h4yceoMhuzlcK0TT_i-NgTFNIZsgE47Q4t3dUYI,34520
451
+ zou-0.20.58.dist-info/METADATA,sha256=4RwRbOeyIMqXRm-G7TvNpWKYSYLrM2gM0IHrcsaGtPA,6778
452
+ zou-0.20.58.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
453
+ zou-0.20.58.dist-info/entry_points.txt,sha256=PelQoIx3qhQ_Tmne7wrLY-1m2izuzgpwokoURwSohy4,130
454
+ zou-0.20.58.dist-info/top_level.txt,sha256=4S7G_jk4MzpToeDItHGjPhHx_fRdX52zJZWTD4SL54g,4
455
+ zou-0.20.58.dist-info/RECORD,,
File without changes