zou 0.20.23__py3-none-any.whl → 0.20.25__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.23"
1
+ __version__ = "0.20.25"
@@ -20,7 +20,7 @@ from flask_jwt_extended import (
20
20
 
21
21
  from sqlalchemy.exc import OperationalError, TimeoutError
22
22
  from babel.dates import format_datetime
23
- from saml2 import entity
23
+ from saml2 import entity, client_base
24
24
 
25
25
  from zou.app import app, config
26
26
  from zou.app.mixin import ArgsMixin
@@ -32,6 +32,7 @@ from zou.app.services import (
32
32
  )
33
33
 
34
34
  from zou.app.utils.flask import is_from_browser
35
+ from zou.app.utils.saml import saml_client_for
35
36
 
36
37
  from zou.app.stores import auth_tokens_store
37
38
  from zou.app.services.exception import (
@@ -1449,9 +1450,19 @@ class SAMLLoginResource(Resource, ArgsMixin):
1449
1450
  """
1450
1451
  if not config.SAML_ENABLED:
1451
1452
  return {"error": "SAML is not enabled."}, 400
1452
- _, info = current_app.extensions[
1453
- "saml_client"
1454
- ].prepare_for_authenticate()
1453
+
1454
+ try:
1455
+ _, info = current_app.extensions[
1456
+ "saml_client"
1457
+ ].prepare_for_authenticate()
1458
+ except client_base.SAMLError:
1459
+ # retry with new client
1460
+ current_app.extensions["saml_client"] = saml_client_for(
1461
+ config.SAML_METADATA_URL
1462
+ )
1463
+ _, info = current_app.extensions[
1464
+ "saml_client"
1465
+ ].prepare_for_authenticate()
1455
1466
 
1456
1467
  redirect_url = None
1457
1468
 
@@ -191,7 +191,7 @@ class CommentResource(BaseModelResource):
191
191
 
192
192
  def update_data(self, data, instance_id):
193
193
  data = super().update_data(data, instance_id)
194
- data["updated_by"] = persons_service.get_current_user_raw().id
194
+ data["editor_id"] = persons_service.get_current_user_raw().id
195
195
  return data
196
196
 
197
197
  @jwt_required()
zou/app/models/comment.py CHANGED
@@ -101,7 +101,7 @@ class Comment(db.Model, BaseMixin, SerializerMixin):
101
101
  nullable=False,
102
102
  index=True,
103
103
  )
104
- updated_by = db.Column(
104
+ editor_id = db.Column(
105
105
  UUIDType(binary=False),
106
106
  db.ForeignKey("person.id"),
107
107
  default=None,
@@ -587,13 +587,13 @@ def get_comments(task_id, is_client=False, is_manager=False):
587
587
 
588
588
 
589
589
  def _prepare_query(task_id, is_client, is_manager):
590
- UpdatedBy = aliased(Person, name="updated_by")
590
+ Editor = aliased(Person, name="editor_id")
591
591
  query = (
592
592
  Comment.query.order_by(Comment.created_at.desc())
593
593
  .filter_by(object_id=task_id)
594
594
  .join(Person, Comment.person_id == Person.id)
595
595
  .join(TaskStatus, Comment.task_status_id == TaskStatus.id)
596
- .join(UpdatedBy, Comment.updated_by == UpdatedBy.id, isouter=True)
596
+ .join(Editor, Comment.editor_id == Editor.id, isouter=True)
597
597
  .add_columns(
598
598
  TaskStatus.name,
599
599
  TaskStatus.short_name,
@@ -601,9 +601,9 @@ def _prepare_query(task_id, is_client, is_manager):
601
601
  Person.first_name,
602
602
  Person.last_name,
603
603
  Person.has_avatar,
604
- UpdatedBy.first_name,
605
- UpdatedBy.last_name,
606
- UpdatedBy.has_avatar,
604
+ Editor.first_name,
605
+ Editor.last_name,
606
+ Editor.has_avatar,
607
607
  )
608
608
  )
609
609
  if not is_manager and not is_client:
@@ -623,9 +623,9 @@ def _run_task_comments_query(query):
623
623
  person_first_name,
624
624
  person_last_name,
625
625
  person_has_avatar,
626
- updated_by_first_name,
627
- updated_by_last_name,
628
- updated_by_has_avatar,
626
+ editor_first_name,
627
+ editor_last_name,
628
+ editor_has_avatar,
629
629
  ) = result
630
630
 
631
631
  comment_dict = comment.serialize()
@@ -635,12 +635,12 @@ def _run_task_comments_query(query):
635
635
  "has_avatar": person_has_avatar,
636
636
  "id": str(comment.person_id),
637
637
  }
638
- if comment.updated_by is not None:
639
- comment_dict["updated_by"] = {
640
- "first_name": updated_by_first_name,
641
- "last_name": updated_by_last_name,
642
- "has_avatar": updated_by_has_avatar,
643
- "id": str(comment.updated_by),
638
+ if comment.editor_id is not None:
639
+ comment_dict["editor"] = {
640
+ "first_name": editor_first_name,
641
+ "last_name": editor_last_name,
642
+ "has_avatar": editor_has_avatar,
643
+ "id": str(comment.editor_id),
644
644
  }
645
645
  comment_dict["task_status"] = {
646
646
  "name": task_status_name,
@@ -0,0 +1,62 @@
1
+ """Change Comment.updated_by in Comment.editor_id
2
+
3
+ Revision ID: 307edd8c639d
4
+ Revises: addbad59c706
5
+ Create Date: 2025-03-10 12:53:19.482537
6
+
7
+ """
8
+
9
+ from alembic import op
10
+ import sqlalchemy as sa
11
+ import sqlalchemy_utils
12
+ import sqlalchemy_utils
13
+ import uuid
14
+
15
+ # revision identifiers, used by Alembic.
16
+ revision = "307edd8c639d"
17
+ down_revision = "addbad59c706"
18
+ branch_labels = None
19
+ depends_on = None
20
+
21
+
22
+ def upgrade():
23
+ # ### commands auto generated by Alembic - please adjust! ###
24
+ with op.batch_alter_table("comment", schema=None) as batch_op:
25
+ batch_op.add_column(
26
+ sa.Column(
27
+ "editor_id",
28
+ sqlalchemy_utils.types.uuid.UUIDType(binary=False),
29
+ default=uuid.uuid4,
30
+ nullable=True,
31
+ )
32
+ )
33
+ batch_op.drop_index("ix_comment_updated_by")
34
+ batch_op.create_index(
35
+ batch_op.f("ix_comment_editor_id"), ["editor_id"], unique=False
36
+ )
37
+ batch_op.drop_constraint("comment_updated_by_fkey", type_="foreignkey")
38
+ batch_op.create_foreign_key(None, "person", ["editor_id"], ["id"])
39
+ batch_op.drop_column("updated_by")
40
+
41
+ # ### end Alembic commands ###
42
+
43
+
44
+ def downgrade():
45
+ # ### commands auto generated by Alembic - please adjust! ###
46
+ with op.batch_alter_table("comment", schema=None) as batch_op:
47
+ batch_op.add_column(
48
+ sa.Column(
49
+ "updated_by", sa.UUID(), autoincrement=False, nullable=True
50
+ )
51
+ )
52
+ batch_op.drop_constraint("comment_editor_id_fkey", type_="foreignkey")
53
+ batch_op.create_foreign_key(
54
+ "comment_updated_by_fkey", "person", ["updated_by"], ["id"]
55
+ )
56
+ batch_op.drop_index(batch_op.f("ix_comment_editor_id"))
57
+ batch_op.create_index(
58
+ "ix_comment_updated_by", ["updated_by"], unique=False
59
+ )
60
+ batch_op.drop_column("editor_id")
61
+
62
+ # ### end Alembic commands ###
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: zou
3
- Version: 0.20.23
3
+ Version: 0.20.25
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
@@ -35,12 +35,12 @@ Requires-Dist: flask_mail==0.10.0
35
35
  Requires-Dist: flask_principal==0.4.0
36
36
  Requires-Dist: flask_restful==0.3.10
37
37
  Requires-Dist: flask_sqlalchemy==3.1.1
38
- Requires-Dist: flask-fs2[s3,swift]==0.7.28
38
+ Requires-Dist: flask-fs2[s3,swift]==0.7.29
39
39
  Requires-Dist: flask-jwt-extended==4.7.1
40
40
  Requires-Dist: flask-migrate==4.1.0
41
41
  Requires-Dist: flask-socketio==5.5.1
42
42
  Requires-Dist: flask==3.1.0
43
- Requires-Dist: gazu==0.10.30
43
+ Requires-Dist: gazu==0.10.31
44
44
  Requires-Dist: gevent-websocket==0.10.1
45
45
  Requires-Dist: gevent==24.11.1
46
46
  Requires-Dist: gunicorn==23.0.0
@@ -1,4 +1,4 @@
1
- zou/__init__.py,sha256=x4_zHRUIBHYylJp20ojxmrTuyJId9rcESyxmdsUn08Y,24
1
+ zou/__init__.py,sha256=RYOJIDE9K5kVkcGQZowJLblB5szdIfREiFdS5sbxZPQ,24
2
2
  zou/cli.py,sha256=HuYi2Ma7SP2SD7C9d9dwpZ49BHpytKIoyJP_su9JwZY,18755
3
3
  zou/debug.py,sha256=1fawPbkD4wn0Y9Gk0BiBFSa-CQe5agFi8R9uJYl2Uyk,520
4
4
  zou/event_stream.py,sha256=EpohqFJwWL0zs-Ic_W5dX5_XSDeCrqHQPL5Re39OnQ0,6382
@@ -12,7 +12,7 @@ zou/app/blueprints/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuF
12
12
  zou/app/blueprints/assets/__init__.py,sha256=T2zhDagHjXF6jRwOQ8vqokZTkBHyY7XtTI0Rlooamjs,2931
13
13
  zou/app/blueprints/assets/resources.py,sha256=YIR1n21vsvM-dYPcnXVePU9rlCf1es-Y5HYURDVYKmI,25628
14
14
  zou/app/blueprints/auth/__init__.py,sha256=xP874bMWUnLIirOPSEbpe-Q2fBBQrxZGKd0tLZmNJXk,1128
15
- zou/app/blueprints/auth/resources.py,sha256=YIhdEVK9WQ7fCYtknwh3dR3TdSdURRm7rBpDxpNSGK0,45608
15
+ zou/app/blueprints/auth/resources.py,sha256=MeOMT6E_CxvyDROFWwu9vE1NNhh5UPBdaBuNZ-Ru2GA,46009
16
16
  zou/app/blueprints/breakdown/__init__.py,sha256=Dp6GWSGxxWIedpyzTTEKpCRUYEo8oVNVyQhwNvTMmQM,1888
17
17
  zou/app/blueprints/breakdown/resources.py,sha256=pmGlHLiXFsPRbxf403SiVgGiaBbtK8G_tfYbXSkJtAU,13593
18
18
  zou/app/blueprints/chats/__init__.py,sha256=YGmwGvddg3MgSYVIh-hmkX8t2em9_LblxBeJzFqFJD4,558
@@ -27,7 +27,7 @@ zou/app/blueprints/crud/attachment_file.py,sha256=-yur0V16BOTvpdqtNymDTHEugwRPgG
27
27
  zou/app/blueprints/crud/base.py,sha256=HJcZKeNe3RVe_qEC9bSlpz4FRKhqavzrsfFLSZ8OmoY,15907
28
28
  zou/app/blueprints/crud/chat.py,sha256=Sq1r0y9ANjS113PUpwgAhnjYsxxLKMCM-a7DJ_icF00,344
29
29
  zou/app/blueprints/crud/chat_message.py,sha256=bEEUoV0sNzu5sntNS6fpLh5NC6wWiycWCXtTE-t4yG4,387
30
- zou/app/blueprints/crud/comments.py,sha256=9YXuRG0T-_LSmZ8CfyI70RYymJW2YTZhyljk_HOcdmA,7903
30
+ zou/app/blueprints/crud/comments.py,sha256=tdEvRCr40gui-O4HRSleIDqa8z-eYvS-82zizCnjUaI,7902
31
31
  zou/app/blueprints/crud/custom_action.py,sha256=zz8E1IgtaV44BGC7m9t7YSQ9t_fYTtoxl_qRn20XijI,992
32
32
  zou/app/blueprints/crud/day_off.py,sha256=hr_cSBG-r7i_an2AkRmgTPtzbwojaI6el_JDUHgBBx4,2571
33
33
  zou/app/blueprints/crud/department.py,sha256=6UVd4OhloboQAHd6vtDjwdTNgx3tf9XyBAcb4IXnmt0,987
@@ -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=0HM5aOqZdvGUrqe2m8CETuS0eXl0V4sSUBaS3MFduAM,6041
144
+ zou/app/models/comment.py,sha256=aDi64Yny5RvlSDace5ydUqxI7_hhugBVnO6EvR19tAE,6040
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
@@ -210,7 +210,7 @@ zou/app/services/shots_service.py,sha256=UW7QcW2Gi_OsbBuR_96FCjNKnsm3SH2R1AcBRnL
210
210
  zou/app/services/stats_service.py,sha256=e9h090eZWADtzXycy1WOup_jlxGwQojrr1y_PDcVatc,13156
211
211
  zou/app/services/status_automations_service.py,sha256=tVio7Sj7inhvKS4UOyRhcdpwr_KNP96hT1o0X7XcGF4,715
212
212
  zou/app/services/sync_service.py,sha256=iWxx1kOGEXympHmSBBQWtDZWNtumdxp8kppee0OefMo,41811
213
- zou/app/services/tasks_service.py,sha256=yysijKuLm2WtkCI6WvfLLYiwoM91TB_N0ZazoxEfco4,69825
213
+ zou/app/services/tasks_service.py,sha256=6ZFq4DhJ9HDgWT3CcikUWWImMNuHko1Bz_ARKPfeoEw,69775
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
216
  zou/app/services/user_service.py,sha256=SKW6n3eMRDUJljUE893cYUrg00xyUwUkxLHzQHjIZT0,51362
@@ -280,6 +280,7 @@ zou/migrations/versions/29fe01a6c9eb_add_status_automation_field.py,sha256=bwmzP
280
280
  zou/migrations/versions/2adc020885fa_.py,sha256=CZoG30mi3HadEz7aBIM9rY2kAEcgxNHUj_fgWJQ_XfA,1352
281
281
  zou/migrations/versions/2baede80b111_add_entity_status_field.py,sha256=-oRMTToOyx5U9wvHgjtFY27y0ile_5K_JngGHrkMTYE,973
282
282
  zou/migrations/versions/306266361f4f_.py,sha256=OdQtt_Jw7iMALvErFuToqPRXSVYogSd0wIW-EY0MNxE,1880
283
+ zou/migrations/versions/307edd8c639d_change_comment_updated_by_in_comment_.py,sha256=klyZzuFsNB30ORPPLt6P2wSfaeVuBzA-ihz4_yaYLQk,1935
283
284
  zou/migrations/versions/328fd44c6347_add_entity_created_by.py,sha256=-1J-ndc30OSKhjLY_t8kbsa-UREdj7OmZGyQ2bguBjU,1176
284
285
  zou/migrations/versions/32f134ff1201_add_is_shared_flag_to_filters.py,sha256=Hm436fq7VYMJ1gTzvG4razVEFzdmq7vbF2pmAIgxqdw,809
285
286
  zou/migrations/versions/346250b5304c_add_position_to_preview_files.py,sha256=8s54X-Yj7lUsiBhcXWiKKRbZrqT_3rIX9D1WJnjpMeU,699
@@ -419,9 +420,9 @@ zou/remote/normalize_movie.py,sha256=zNfEY3N1UbAHZfddGONTg2Sff3ieLVWd4dfZa1dpnes
419
420
  zou/remote/playlist.py,sha256=AsDo0bgYhDcd6DfNRV6r6Jj3URWwavE2ZN3VkKRPbLU,3293
420
421
  zou/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
421
422
  zou/utils/movie.py,sha256=d67fIL9dVBKt-E_qCGXRbNNdbJaJR5sHvZeX3hf8ldE,16559
422
- zou-0.20.23.dist-info/LICENSE,sha256=dql8h4yceoMhuzlcK0TT_i-NgTFNIZsgE47Q4t3dUYI,34520
423
- zou-0.20.23.dist-info/METADATA,sha256=ogjGsLoBuHL-ZAf11x2IJZGr1SYLisEwb3RuVs12vFI,6673
424
- zou-0.20.23.dist-info/WHEEL,sha256=52BFRY2Up02UkjOa29eZOS2VxUrpPORXg1pkohGGUS8,91
425
- zou-0.20.23.dist-info/entry_points.txt,sha256=PelQoIx3qhQ_Tmne7wrLY-1m2izuzgpwokoURwSohy4,130
426
- zou-0.20.23.dist-info/top_level.txt,sha256=4S7G_jk4MzpToeDItHGjPhHx_fRdX52zJZWTD4SL54g,4
427
- zou-0.20.23.dist-info/RECORD,,
423
+ zou-0.20.25.dist-info/LICENSE,sha256=dql8h4yceoMhuzlcK0TT_i-NgTFNIZsgE47Q4t3dUYI,34520
424
+ zou-0.20.25.dist-info/METADATA,sha256=dQjGXYP1B9mly95Fi_6-J-eTmo-za1RWF-hYbH6dbf8,6673
425
+ zou-0.20.25.dist-info/WHEEL,sha256=52BFRY2Up02UkjOa29eZOS2VxUrpPORXg1pkohGGUS8,91
426
+ zou-0.20.25.dist-info/entry_points.txt,sha256=PelQoIx3qhQ_Tmne7wrLY-1m2izuzgpwokoURwSohy4,130
427
+ zou-0.20.25.dist-info/top_level.txt,sha256=4S7G_jk4MzpToeDItHGjPhHx_fRdX52zJZWTD4SL54g,4
428
+ zou-0.20.25.dist-info/RECORD,,
File without changes
File without changes