zou 0.19.56__py3-none-any.whl → 0.19.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 +1 -1
- zou/app/blueprints/assets/resources.py +3 -3
- zou/app/blueprints/chats/resources.py +3 -1
- zou/app/blueprints/crud/day_off.py +6 -2
- zou/app/blueprints/crud/entity_type.py +3 -6
- zou/app/blueprints/crud/project.py +6 -2
- zou/app/blueprints/crud/schedule_item.py +3 -1
- zou/app/blueprints/export/csv/playlists.py +1 -1
- zou/app/blueprints/export/csv/time_spents.py +1 -1
- zou/app/blueprints/news/resources.py +9 -4
- zou/app/blueprints/previews/resources.py +3 -0
- zou/app/blueprints/source/otio.py +3 -3
- zou/app/blueprints/tasks/resources.py +6 -2
- zou/app/blueprints/user/__init__.py +5 -0
- zou/app/blueprints/user/resources.py +54 -10
- zou/app/models/organisation.py +5 -0
- zou/app/models/project.py +3 -0
- zou/app/models/subscription.py +2 -2
- zou/app/models/task.py +4 -0
- zou/app/services/assets_service.py +7 -4
- zou/app/services/chats_service.py +1 -1
- zou/app/services/emails_service.py +1 -1
- zou/app/services/entities_service.py +3 -0
- zou/app/services/names_service.py +2 -2
- zou/app/services/news_service.py +1 -1
- zou/app/services/preview_files_service.py +1 -1
- zou/app/services/shots_service.py +6 -3
- zou/app/services/user_service.py +55 -9
- zou/migrations/versions/8e67c183bed7_add_preference_fields.py +71 -0
- {zou-0.19.56.dist-info → zou-0.19.58.dist-info}/METADATA +11 -11
- {zou-0.19.56.dist-info → zou-0.19.58.dist-info}/RECORD +35 -34
- {zou-0.19.56.dist-info → zou-0.19.58.dist-info}/WHEEL +1 -1
- {zou-0.19.56.dist-info → zou-0.19.58.dist-info}/LICENSE +0 -0
- {zou-0.19.56.dist-info → zou-0.19.58.dist-info}/entry_points.txt +0 -0
- {zou-0.19.56.dist-info → zou-0.19.58.dist-info}/top_level.txt +0 -0
zou/__init__.py
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
__version__ = "0.19.
|
|
1
|
+
__version__ = "0.19.58"
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
from flask import request
|
|
2
|
-
from flask_restful import Resource
|
|
2
|
+
from flask_restful import Resource, inputs
|
|
3
3
|
from flask_jwt_extended import jwt_required
|
|
4
4
|
|
|
5
5
|
from zou.app.utils import permissions, query
|
|
@@ -486,7 +486,7 @@ class NewAssetResource(Resource, ArgsMixin):
|
|
|
486
486
|
"is_shared",
|
|
487
487
|
True,
|
|
488
488
|
False,
|
|
489
|
-
|
|
489
|
+
inputs.boolean,
|
|
490
490
|
),
|
|
491
491
|
"episode_id",
|
|
492
492
|
]
|
|
@@ -688,7 +688,7 @@ class BaseSetSharedAssetsResource(Resource, ArgsMixin):
|
|
|
688
688
|
"is_shared",
|
|
689
689
|
True,
|
|
690
690
|
False,
|
|
691
|
-
|
|
691
|
+
inputs.boolean,
|
|
692
692
|
),
|
|
693
693
|
]
|
|
694
694
|
)
|
|
@@ -116,7 +116,9 @@ class ChatMessagesResource(Resource):
|
|
|
116
116
|
|
|
117
117
|
chat = chats_service.get_chat(entity_id)
|
|
118
118
|
if person["id"] not in chat["participants"]:
|
|
119
|
-
raise WrongParameterException(
|
|
119
|
+
raise WrongParameterException(
|
|
120
|
+
"You are not a participant of this chat"
|
|
121
|
+
)
|
|
120
122
|
|
|
121
123
|
return (
|
|
122
124
|
chats_service.create_chat_message(
|
|
@@ -21,7 +21,9 @@ class DayOffsResource(BaseModelsResource):
|
|
|
21
21
|
if time_spents_service.get_day_offs_between(
|
|
22
22
|
data["date"], data["end_date"], data["person_id"]
|
|
23
23
|
):
|
|
24
|
-
raise WrongParameterException(
|
|
24
|
+
raise WrongParameterException(
|
|
25
|
+
"Day off already exists for this period"
|
|
26
|
+
)
|
|
25
27
|
return data
|
|
26
28
|
|
|
27
29
|
def post_creation(self, instance):
|
|
@@ -67,5 +69,7 @@ class DayOffResource(BaseModelResource):
|
|
|
67
69
|
data.get("person_id", instance_dict["person_id"]),
|
|
68
70
|
exclude_id=instance_dict["id"],
|
|
69
71
|
):
|
|
70
|
-
raise WrongParameterException(
|
|
72
|
+
raise WrongParameterException(
|
|
73
|
+
"Day off already exists for this period"
|
|
74
|
+
)
|
|
71
75
|
return data
|
|
@@ -7,7 +7,6 @@ from zou.app.services import entities_service, assets_service
|
|
|
7
7
|
from zou.app.services.exception import WrongParameterException
|
|
8
8
|
|
|
9
9
|
|
|
10
|
-
|
|
11
10
|
class EntityTypesResource(BaseModelsResource):
|
|
12
11
|
def __init__(self):
|
|
13
12
|
BaseModelsResource.__init__(self, EntityType)
|
|
@@ -32,11 +31,9 @@ class EntityTypesResource(BaseModelsResource):
|
|
|
32
31
|
return instance.serialize(relations=True)
|
|
33
32
|
|
|
34
33
|
def check_creation_integrity(self, data):
|
|
35
|
-
entity_type = (
|
|
36
|
-
EntityType.
|
|
37
|
-
|
|
38
|
-
.first()
|
|
39
|
-
)
|
|
34
|
+
entity_type = EntityType.query.filter(
|
|
35
|
+
EntityType.name.ilike(data.get("name", ""))
|
|
36
|
+
).first()
|
|
40
37
|
if entity_type is not None:
|
|
41
38
|
raise WrongParameterException(
|
|
42
39
|
"Entity type with this name already exists"
|
|
@@ -71,7 +71,9 @@ class ProjectsResource(BaseModelsResource):
|
|
|
71
71
|
or data["preview_background_file_id"]
|
|
72
72
|
not in data["preview_background_files_ids"]
|
|
73
73
|
):
|
|
74
|
-
raise WrongParameterException(
|
|
74
|
+
raise WrongParameterException(
|
|
75
|
+
"Invalid preview_background_file_id"
|
|
76
|
+
)
|
|
75
77
|
return data
|
|
76
78
|
|
|
77
79
|
def post_creation(self, project):
|
|
@@ -131,7 +133,9 @@ class ProjectResource(BaseModelResource, ArgsMixin):
|
|
|
131
133
|
data["preview_background_file_id"]
|
|
132
134
|
not in preview_background_files_ids
|
|
133
135
|
):
|
|
134
|
-
raise WrongParameterException(
|
|
136
|
+
raise WrongParameterException(
|
|
137
|
+
"Invalid preview_background_file_id"
|
|
138
|
+
)
|
|
135
139
|
|
|
136
140
|
return data
|
|
137
141
|
|
|
@@ -17,7 +17,9 @@ class ScheduleItemsResource(BaseModelsResource):
|
|
|
17
17
|
object_id=data.get("object_id", None),
|
|
18
18
|
)
|
|
19
19
|
if schedule_item is not None:
|
|
20
|
-
raise WrongParameterException(
|
|
20
|
+
raise WrongParameterException(
|
|
21
|
+
"A similar schedule item already exists"
|
|
22
|
+
)
|
|
21
23
|
return schedule_item
|
|
22
24
|
|
|
23
25
|
|
|
@@ -100,7 +100,7 @@ class PlaylistCsvExport(Resource):
|
|
|
100
100
|
|
|
101
101
|
def build_row(self, shot):
|
|
102
102
|
entity = entities_service.get_entity(shot["entity_id"])
|
|
103
|
-
name, _ = names_service.get_full_entity_name(shot["entity_id"])
|
|
103
|
+
name, _, _ = names_service.get_full_entity_name(shot["entity_id"])
|
|
104
104
|
preview_file = files_service.get_preview_file(shot["preview_file_id"])
|
|
105
105
|
task = tasks_service.get_task(preview_file["task_id"])
|
|
106
106
|
task_type = self.task_type_map[task["task_type_id"]]
|
|
@@ -72,7 +72,7 @@ class TimeSpentsCsvExport(BaseCsvExport):
|
|
|
72
72
|
person_last_name,
|
|
73
73
|
) = time_spent_row
|
|
74
74
|
if entity_type_name == "Shot":
|
|
75
|
-
entity_name, _ = names_service.get_full_entity_name(entity_id)
|
|
75
|
+
entity_name, _, _ = names_service.get_full_entity_name(entity_id)
|
|
76
76
|
|
|
77
77
|
date = ""
|
|
78
78
|
if time_spent.date is not None:
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
from flask_restful import Resource
|
|
1
|
+
from flask_restful import Resource, inputs
|
|
2
2
|
from flask_jwt_extended import jwt_required
|
|
3
3
|
|
|
4
4
|
from zou.app.mixin import ArgsMixin
|
|
@@ -7,7 +7,7 @@ from zou.app.services.exception import NewsNotFoundException
|
|
|
7
7
|
from zou.app.utils import permissions
|
|
8
8
|
|
|
9
9
|
|
|
10
|
-
class NewsMixin:
|
|
10
|
+
class NewsMixin(ArgsMixin):
|
|
11
11
|
def get_news(self, project_ids=[]):
|
|
12
12
|
(
|
|
13
13
|
only_preview,
|
|
@@ -21,7 +21,6 @@ class NewsMixin:
|
|
|
21
21
|
before,
|
|
22
22
|
) = self.get_arguments()
|
|
23
23
|
|
|
24
|
-
user_service
|
|
25
24
|
after = self.parse_date_parameter(after)
|
|
26
25
|
before = self.parse_date_parameter(before)
|
|
27
26
|
result = news_service.get_last_news_for_project(
|
|
@@ -38,6 +37,7 @@ class NewsMixin:
|
|
|
38
37
|
)
|
|
39
38
|
stats = news_service.get_news_stats_for_project(
|
|
40
39
|
project_ids=project_ids,
|
|
40
|
+
only_preview=only_preview,
|
|
41
41
|
task_type_id=task_type_id,
|
|
42
42
|
task_status_id=task_status_id,
|
|
43
43
|
episode_id=episode_id,
|
|
@@ -51,7 +51,12 @@ class NewsMixin:
|
|
|
51
51
|
def get_arguments(self):
|
|
52
52
|
args = self.get_args(
|
|
53
53
|
[
|
|
54
|
-
|
|
54
|
+
(
|
|
55
|
+
"only_preview",
|
|
56
|
+
False,
|
|
57
|
+
False,
|
|
58
|
+
inputs.boolean,
|
|
59
|
+
),
|
|
55
60
|
"task_type_id",
|
|
56
61
|
"task_status_id",
|
|
57
62
|
"person_id",
|
|
@@ -6,7 +6,7 @@ import re
|
|
|
6
6
|
from string import Template
|
|
7
7
|
|
|
8
8
|
from flask import request, current_app
|
|
9
|
-
from flask_restful import Resource
|
|
9
|
+
from flask_restful import Resource, inputs
|
|
10
10
|
from flask_jwt_extended import jwt_required
|
|
11
11
|
|
|
12
12
|
from zou.app import config
|
|
@@ -308,7 +308,7 @@ class OTIOImportResource(OTIOBaseResource):
|
|
|
308
308
|
False,
|
|
309
309
|
str,
|
|
310
310
|
),
|
|
311
|
-
("match_case", True, False,
|
|
311
|
+
("match_case", True, False, inputs.boolean),
|
|
312
312
|
]
|
|
313
313
|
)
|
|
314
314
|
|
|
@@ -359,6 +359,6 @@ class OTIOImportEpisodeResource(OTIOBaseResource):
|
|
|
359
359
|
False,
|
|
360
360
|
str,
|
|
361
361
|
),
|
|
362
|
-
("match_case", True, False,
|
|
362
|
+
("match_case", True, False, inputs.boolean),
|
|
363
363
|
]
|
|
364
364
|
)
|
|
@@ -2,7 +2,7 @@ import datetime
|
|
|
2
2
|
|
|
3
3
|
|
|
4
4
|
from flask import abort, request
|
|
5
|
-
from flask_restful import Resource
|
|
5
|
+
from flask_restful import Resource, inputs
|
|
6
6
|
from flask_jwt_extended import jwt_required
|
|
7
7
|
|
|
8
8
|
from zou.app.services.exception import (
|
|
@@ -793,7 +793,11 @@ class ToReviewResource(Resource, ArgsMixin):
|
|
|
793
793
|
("comment", ""),
|
|
794
794
|
("name", "main"),
|
|
795
795
|
{"name": "revision", "default": 1, "type": int},
|
|
796
|
-
{
|
|
796
|
+
{
|
|
797
|
+
"name": "change_status",
|
|
798
|
+
"default": True,
|
|
799
|
+
"type": inputs.boolean,
|
|
800
|
+
},
|
|
797
801
|
]
|
|
798
802
|
)
|
|
799
803
|
|
|
@@ -33,6 +33,7 @@ from zou.app.blueprints.user.resources import (
|
|
|
33
33
|
FilterGroupResource,
|
|
34
34
|
FilterGroupsResource,
|
|
35
35
|
DesktopLoginLogsResource,
|
|
36
|
+
MarkAllNotificationsAsReadResource,
|
|
36
37
|
NotificationsResource,
|
|
37
38
|
NotificationResource,
|
|
38
39
|
HasTaskSubscribedResource,
|
|
@@ -108,6 +109,10 @@ routes = [
|
|
|
108
109
|
"/actions/user/sequences/<sequence_id>/task-types/<task_type_id>/unsubscribe",
|
|
109
110
|
SequenceUnsubscribeResource,
|
|
110
111
|
),
|
|
112
|
+
(
|
|
113
|
+
"/actions/user/notifications/mark-all-as-read",
|
|
114
|
+
MarkAllNotificationsAsReadResource,
|
|
115
|
+
),
|
|
111
116
|
]
|
|
112
117
|
|
|
113
118
|
blueprint = Blueprint("user", "user")
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
from flask import abort
|
|
2
|
-
from flask_restful import Resource
|
|
1
|
+
from flask import abort, request
|
|
2
|
+
from flask_restful import Resource, inputs
|
|
3
3
|
|
|
4
4
|
from zou.app.mixin import ArgsMixin
|
|
5
5
|
from zou.app.services import (
|
|
@@ -556,7 +556,7 @@ class FiltersResource(Resource, ArgsMixin):
|
|
|
556
556
|
("list_type", "todo", True),
|
|
557
557
|
("project_id", None, False),
|
|
558
558
|
("entity_type", None, False),
|
|
559
|
-
("is_shared", False, False,
|
|
559
|
+
("is_shared", False, False, inputs.boolean),
|
|
560
560
|
("search_filter_group_id", None, False),
|
|
561
561
|
]
|
|
562
562
|
)
|
|
@@ -589,11 +589,10 @@ class FilterResource(Resource, ArgsMixin):
|
|
|
589
589
|
("name", None, False),
|
|
590
590
|
("search_query", None, False),
|
|
591
591
|
("search_filter_group_id", None, False),
|
|
592
|
-
("is_shared", None, False,
|
|
592
|
+
("is_shared", None, False, inputs.boolean),
|
|
593
593
|
("project_id", None, None),
|
|
594
594
|
]
|
|
595
595
|
)
|
|
596
|
-
|
|
597
596
|
data = self.clear_empty_fields(
|
|
598
597
|
data, ignored_fields=["search_filter_group_id"]
|
|
599
598
|
)
|
|
@@ -696,7 +695,7 @@ class FilterGroupsResource(Resource, ArgsMixin):
|
|
|
696
695
|
("color", "", True),
|
|
697
696
|
("list_type", "todo", True),
|
|
698
697
|
("project_id", None, False),
|
|
699
|
-
("is_shared", False, False,
|
|
698
|
+
("is_shared", False, False, inputs.boolean),
|
|
700
699
|
("entity_type", None, False),
|
|
701
700
|
]
|
|
702
701
|
)
|
|
@@ -742,7 +741,7 @@ class FilterGroupResource(Resource, ArgsMixin):
|
|
|
742
741
|
[
|
|
743
742
|
("name", None, False),
|
|
744
743
|
("color", None, False),
|
|
745
|
-
("is_shared", None, False,
|
|
744
|
+
("is_shared", None, False, inputs.boolean),
|
|
746
745
|
("project_id", None, None),
|
|
747
746
|
]
|
|
748
747
|
)
|
|
@@ -848,13 +847,22 @@ class NotificationsResource(Resource, ArgsMixin):
|
|
|
848
847
|
task_status_id,
|
|
849
848
|
notification_type,
|
|
850
849
|
) = self.get_arguments()
|
|
850
|
+
|
|
851
|
+
read = None
|
|
852
|
+
if request.args.get("read", None) is not None:
|
|
853
|
+
read = self.get_bool_parameter("read")
|
|
854
|
+
watching = None
|
|
855
|
+
if request.args.get("watching", None) is not None:
|
|
856
|
+
watching = self.get_bool_parameter("watching")
|
|
857
|
+
print("watching", watching)
|
|
851
858
|
notifications = user_service.get_last_notifications(
|
|
852
859
|
before=before,
|
|
853
860
|
task_type_id=task_type_id,
|
|
854
861
|
task_status_id=task_status_id,
|
|
855
862
|
notification_type=notification_type,
|
|
863
|
+
read=read,
|
|
864
|
+
watching=watching,
|
|
856
865
|
)
|
|
857
|
-
user_service.mark_notifications_as_read()
|
|
858
866
|
return notifications
|
|
859
867
|
|
|
860
868
|
def get_arguments(self):
|
|
@@ -867,7 +875,7 @@ class NotificationsResource(Resource, ArgsMixin):
|
|
|
867
875
|
)
|
|
868
876
|
|
|
869
877
|
|
|
870
|
-
class NotificationResource(Resource):
|
|
878
|
+
class NotificationResource(Resource, ArgsMixin):
|
|
871
879
|
"""
|
|
872
880
|
Return notification matching given id, only if it's a notification that
|
|
873
881
|
belongs to current user.
|
|
@@ -894,6 +902,42 @@ class NotificationResource(Resource):
|
|
|
894
902
|
"""
|
|
895
903
|
return user_service.get_notification(notification_id)
|
|
896
904
|
|
|
905
|
+
def put(self, notification_id):
|
|
906
|
+
"""
|
|
907
|
+
Change notification read status.
|
|
908
|
+
---
|
|
909
|
+
tags:
|
|
910
|
+
- User
|
|
911
|
+
parameters:
|
|
912
|
+
- in: path
|
|
913
|
+
name: notification_id
|
|
914
|
+
required: True
|
|
915
|
+
type: string
|
|
916
|
+
format: UUID
|
|
917
|
+
x-example: a24a6ea4-ce75-4665-a070-57453082c25
|
|
918
|
+
responses:
|
|
919
|
+
200:
|
|
920
|
+
description: Notification
|
|
921
|
+
"""
|
|
922
|
+
data = self.get_args([("read", None, False, inputs.boolean)])
|
|
923
|
+
return user_service.update_notification(notification_id, data["read"])
|
|
924
|
+
|
|
925
|
+
|
|
926
|
+
class MarkAllNotificationsAsReadResource(Resource):
|
|
927
|
+
|
|
928
|
+
def post(self):
|
|
929
|
+
"""
|
|
930
|
+
Mark all notifications as read for the current user.
|
|
931
|
+
---
|
|
932
|
+
tags:
|
|
933
|
+
- User
|
|
934
|
+
responses:
|
|
935
|
+
200:
|
|
936
|
+
description: All notifications marked as read
|
|
937
|
+
"""
|
|
938
|
+
user_service.mark_notifications_as_read()
|
|
939
|
+
return {"success": True}
|
|
940
|
+
|
|
897
941
|
|
|
898
942
|
class HasTaskSubscribedResource(Resource):
|
|
899
943
|
"""
|
|
@@ -905,7 +949,7 @@ class HasTaskSubscribedResource(Resource):
|
|
|
905
949
|
Return true if current user has subscribed to given task.
|
|
906
950
|
---
|
|
907
951
|
tags:
|
|
908
|
-
|
|
952
|
+
- User
|
|
909
953
|
parameters:
|
|
910
954
|
- in: path
|
|
911
955
|
name: task_id
|
zou/app/models/organisation.py
CHANGED
|
@@ -14,10 +14,13 @@ class Organisation(db.Model, BaseMixin, SerializerMixin):
|
|
|
14
14
|
has_avatar = db.Column(db.Boolean(), default=False)
|
|
15
15
|
use_original_file_name = db.Column(db.Boolean(), default=False)
|
|
16
16
|
timesheets_locked = db.Column(db.Boolean(), default=False)
|
|
17
|
+
format_duration_in_hours = db.Column(db.Boolean(), default=False)
|
|
17
18
|
hd_by_default = db.Column(db.Boolean(), default=False)
|
|
18
19
|
chat_token_slack = db.Column(db.String(80), default="")
|
|
19
20
|
chat_webhook_mattermost = db.Column(db.String(80), default="")
|
|
20
21
|
chat_token_discord = db.Column(db.String(80), default="")
|
|
22
|
+
dark_theme_by_default = db.Column(db.Boolean(), default=False)
|
|
23
|
+
format_duration_in_hours = db.Column(db.Boolean(), default=False)
|
|
21
24
|
|
|
22
25
|
def present(self):
|
|
23
26
|
return fields.serialize_dict(
|
|
@@ -32,6 +35,8 @@ class Organisation(db.Model, BaseMixin, SerializerMixin):
|
|
|
32
35
|
"hd_by_default": self.hd_by_default,
|
|
33
36
|
"use_original_file_name": self.use_original_file_name,
|
|
34
37
|
"timesheets_locked": self.timesheets_locked,
|
|
38
|
+
"dark_theme_by_default": self.dark_theme_by_default,
|
|
39
|
+
"format_duration_in_hours": self.format_duration_in_hours,
|
|
35
40
|
"updated_at": self.updated_at,
|
|
36
41
|
"created_at": self.created_at,
|
|
37
42
|
}
|
zou/app/models/project.py
CHANGED
|
@@ -142,6 +142,9 @@ class Project(db.Model, BaseMixin, SerializerMixin):
|
|
|
142
142
|
is_preview_download_allowed = db.Column(db.Boolean(), default=False)
|
|
143
143
|
is_set_preview_automated = db.Column(db.Boolean(), default=False)
|
|
144
144
|
homepage = db.Column(db.String(80), default="assets")
|
|
145
|
+
is_publish_default_for_artists = db.Column(db.Boolean(), default=False)
|
|
146
|
+
hd_bitrate_compression = db.Column(db.Integer, default=28)
|
|
147
|
+
ld_bitrate_compression = db.Column(db.Integer, default=6)
|
|
145
148
|
|
|
146
149
|
project_status_id = db.Column(
|
|
147
150
|
UUIDType(binary=False), db.ForeignKey("project_status.id"), index=True
|
zou/app/models/subscription.py
CHANGED
|
@@ -22,10 +22,10 @@ class Subscription(db.Model, BaseMixin, SerializerMixin):
|
|
|
22
22
|
|
|
23
23
|
entity_id = db.Column(
|
|
24
24
|
UUIDType(binary=False), db.ForeignKey("entity.id"), index=True
|
|
25
|
-
)
|
|
25
|
+
) # Deprecated
|
|
26
26
|
task_type_id = db.Column(
|
|
27
27
|
UUIDType(binary=False), db.ForeignKey("task_type.id"), index=True
|
|
28
|
-
)
|
|
28
|
+
) # Deprecated
|
|
29
29
|
|
|
30
30
|
__table_args__ = (
|
|
31
31
|
db.UniqueConstraint(
|
zou/app/models/task.py
CHANGED
|
@@ -33,6 +33,7 @@ class Task(db.Model, BaseMixin, SerializerMixin):
|
|
|
33
33
|
description = db.Column(db.Text())
|
|
34
34
|
|
|
35
35
|
priority = db.Column(db.Integer, default=0)
|
|
36
|
+
difficulty = db.Column(db.Integer, default=3, nullable=False)
|
|
36
37
|
duration = db.Column(db.Float, default=0)
|
|
37
38
|
estimation = db.Column(db.Float, default=0)
|
|
38
39
|
completion_rate = db.Column(db.Integer, default=0)
|
|
@@ -70,6 +71,9 @@ class Task(db.Model, BaseMixin, SerializerMixin):
|
|
|
70
71
|
db.UniqueConstraint(
|
|
71
72
|
"name", "project_id", "task_type_id", "entity_id", name="task_uc"
|
|
72
73
|
),
|
|
74
|
+
db.CheckConstraint(
|
|
75
|
+
"difficulty > 0 AND difficulty < 6", name="check_difficulty"
|
|
76
|
+
),
|
|
73
77
|
)
|
|
74
78
|
|
|
75
79
|
def assignees_as_string(self):
|
|
@@ -104,8 +104,8 @@ def get_assets(criterions={}, is_admin=False):
|
|
|
104
104
|
|
|
105
105
|
if "is_shared" in criterions:
|
|
106
106
|
if not is_admin:
|
|
107
|
-
query = (
|
|
108
|
-
|
|
107
|
+
query = query.join(Project).filter(
|
|
108
|
+
user_service.build_team_filter()
|
|
109
109
|
)
|
|
110
110
|
|
|
111
111
|
if episode_id is not None:
|
|
@@ -127,7 +127,7 @@ def get_assets(criterions={}, is_admin=False):
|
|
|
127
127
|
result += [a for a in query.all() if a.source_id != episode_id]
|
|
128
128
|
else:
|
|
129
129
|
result = query.all()
|
|
130
|
-
return
|
|
130
|
+
return Entity.serialize_list(result, obj_type="Asset")
|
|
131
131
|
|
|
132
132
|
|
|
133
133
|
def get_all_raw_assets():
|
|
@@ -202,6 +202,7 @@ def get_assets_and_tasks(criterions={}, page=1, with_episode_ids=False):
|
|
|
202
202
|
Task.due_date,
|
|
203
203
|
Task.done_date,
|
|
204
204
|
Task.last_comment_date,
|
|
205
|
+
Task.difficulty,
|
|
205
206
|
assignees_table.columns.person,
|
|
206
207
|
).order_by(EntityType.name, Entity.name)
|
|
207
208
|
|
|
@@ -281,6 +282,7 @@ def get_assets_and_tasks(criterions={}, page=1, with_episode_ids=False):
|
|
|
281
282
|
task_due_date,
|
|
282
283
|
task_done_date,
|
|
283
284
|
task_last_comment_date,
|
|
285
|
+
task_difficulty,
|
|
284
286
|
person_id,
|
|
285
287
|
) in query_result:
|
|
286
288
|
if asset.source_id is None:
|
|
@@ -338,6 +340,7 @@ def get_assets_and_tasks(criterions={}, page=1, with_episode_ids=False):
|
|
|
338
340
|
),
|
|
339
341
|
"retake_count": task_retake_count,
|
|
340
342
|
"start_date": fields.serialize_value(task_start_date),
|
|
343
|
+
"difficulty": task_difficulty,
|
|
341
344
|
"task_status_id": str(task_status_id),
|
|
342
345
|
"task_type_id": str(task_type_id),
|
|
343
346
|
"assignees": [],
|
|
@@ -722,7 +725,7 @@ def set_shared_assets(
|
|
|
722
725
|
project_id=None,
|
|
723
726
|
asset_type_id=None,
|
|
724
727
|
asset_ids=None,
|
|
725
|
-
with_events=False
|
|
728
|
+
with_events=False,
|
|
726
729
|
):
|
|
727
730
|
"""
|
|
728
731
|
Set all assets of a project to is_shared=True or False.
|
|
@@ -213,7 +213,7 @@ def get_chats_for_person(person_id):
|
|
|
213
213
|
result = []
|
|
214
214
|
for chat_model, project_id, preview_file_id in chats:
|
|
215
215
|
chat = chat_model.present()
|
|
216
|
-
chat["entity_name"], _ = names_service.get_full_entity_name(
|
|
216
|
+
chat["entity_name"], _, _ = names_service.get_full_entity_name(
|
|
217
217
|
chat["object_id"]
|
|
218
218
|
)
|
|
219
219
|
chat["project_id"] = project_id
|
|
@@ -296,7 +296,7 @@ def get_task_descriptors(person_id, task):
|
|
|
296
296
|
project = projects_service.get_project(task["project_id"])
|
|
297
297
|
task_type = tasks_service.get_task_type(task["task_type_id"])
|
|
298
298
|
entity = entities_service.get_entity(task["entity_id"])
|
|
299
|
-
|
|
299
|
+
entity_name, episode_id, _ = names_service.get_full_entity_name(
|
|
300
300
|
entity["id"]
|
|
301
301
|
)
|
|
302
302
|
|
|
@@ -242,6 +242,7 @@ def get_entities_and_tasks(criterions={}):
|
|
|
242
242
|
Task.due_date,
|
|
243
243
|
Task.done_date,
|
|
244
244
|
Task.last_comment_date,
|
|
245
|
+
Task.difficulty,
|
|
245
246
|
assignees_table.columns.person,
|
|
246
247
|
)
|
|
247
248
|
)
|
|
@@ -272,6 +273,7 @@ def get_entities_and_tasks(criterions={}):
|
|
|
272
273
|
task_due_date,
|
|
273
274
|
task_done_date,
|
|
274
275
|
task_last_comment_date,
|
|
276
|
+
task_difficulty,
|
|
275
277
|
person_id,
|
|
276
278
|
) in query.all():
|
|
277
279
|
entity_id = str(entity.id)
|
|
@@ -315,6 +317,7 @@ def get_entities_and_tasks(criterions={}):
|
|
|
315
317
|
"real_start_date": task_real_start_date,
|
|
316
318
|
"retake_count": task_retake_count,
|
|
317
319
|
"start_date": task_start_date,
|
|
320
|
+
"difficulty": task_difficulty,
|
|
318
321
|
"task_status_id": str(task_status_id),
|
|
319
322
|
"task_type_id": str(task_type_id),
|
|
320
323
|
"assignees": [],
|
|
@@ -52,7 +52,7 @@ def get_full_entity_name(entity_id):
|
|
|
52
52
|
asset_type = entities_service.get_entity_type(entity["entity_type_id"])
|
|
53
53
|
episode_id = entity["source_id"]
|
|
54
54
|
name = "%s / %s" % (asset_type["name"], entity["name"])
|
|
55
|
-
return (name, episode_id)
|
|
55
|
+
return (name, episode_id, entity["preview_file_id"])
|
|
56
56
|
|
|
57
57
|
|
|
58
58
|
def get_preview_file_name(preview_file_id):
|
|
@@ -66,7 +66,7 @@ def get_preview_file_name(preview_file_id):
|
|
|
66
66
|
task = tasks_service.get_task(preview_file["task_id"])
|
|
67
67
|
task_type = tasks_service.get_task_type(task["task_type_id"])
|
|
68
68
|
project = projects_service.get_project(task["project_id"])
|
|
69
|
-
(entity_name, _) = get_full_entity_name(task["entity_id"])
|
|
69
|
+
(entity_name, _, _) = get_full_entity_name(task["entity_id"])
|
|
70
70
|
|
|
71
71
|
if (
|
|
72
72
|
organisation["use_original_file_name"]
|
zou/app/services/news_service.py
CHANGED
|
@@ -185,7 +185,7 @@ def get_last_news_for_project(
|
|
|
185
185
|
preview_file_annotations,
|
|
186
186
|
entity_preview_file_id,
|
|
187
187
|
) in news_list:
|
|
188
|
-
|
|
188
|
+
full_entity_name, episode_id, _ = names_service.get_full_entity_name(
|
|
189
189
|
task_entity_id
|
|
190
190
|
)
|
|
191
191
|
|
|
@@ -561,7 +561,7 @@ def get_running_preview_files():
|
|
|
561
561
|
result = preview_file.serialize()
|
|
562
562
|
result["project_id"] = fields.serialize_value(project_id)
|
|
563
563
|
result["task_type_id"] = fields.serialize_value(task_type_id)
|
|
564
|
-
|
|
564
|
+
result["full_entity_name"], _, _ = names_service.get_full_entity_name(
|
|
565
565
|
entity_id
|
|
566
566
|
)
|
|
567
567
|
results.append(result)
|
|
@@ -254,6 +254,7 @@ def get_shots_and_tasks(criterions={}):
|
|
|
254
254
|
Task.done_date,
|
|
255
255
|
Task.last_comment_date,
|
|
256
256
|
Task.nb_assets_ready,
|
|
257
|
+
Task.difficulty,
|
|
257
258
|
assignees_table.columns.person,
|
|
258
259
|
Project.id,
|
|
259
260
|
Project.name,
|
|
@@ -304,6 +305,7 @@ def get_shots_and_tasks(criterions={}):
|
|
|
304
305
|
task_done_date,
|
|
305
306
|
task_last_comment_date,
|
|
306
307
|
task_nb_assets_ready,
|
|
308
|
+
task_difficulty,
|
|
307
309
|
person_id,
|
|
308
310
|
project_id,
|
|
309
311
|
project_name,
|
|
@@ -367,6 +369,7 @@ def get_shots_and_tasks(criterions={}):
|
|
|
367
369
|
"real_start_date": task_real_start_date,
|
|
368
370
|
"retake_count": task_retake_count,
|
|
369
371
|
"start_date": task_start_date,
|
|
372
|
+
"difficulty": task_difficulty,
|
|
370
373
|
"task_status_id": task_status_id,
|
|
371
374
|
"task_type_id": task_type_id,
|
|
372
375
|
"assignees": [],
|
|
@@ -1478,7 +1481,7 @@ def get_weighted_quota_shots_between(
|
|
|
1478
1481
|
for entity, task_duration, duration in query_shots:
|
|
1479
1482
|
shot = entity.serialize()
|
|
1480
1483
|
if shot["id"] not in already_listed:
|
|
1481
|
-
full_name, _ = names_service.get_full_entity_name(shot["id"])
|
|
1484
|
+
full_name, _, _ = names_service.get_full_entity_name(shot["id"])
|
|
1482
1485
|
shot["full_name"] = full_name
|
|
1483
1486
|
shot["weight"] = round(duration / task_duration, 2) or 0
|
|
1484
1487
|
shots.append(shot)
|
|
@@ -1525,7 +1528,7 @@ def get_weighted_quota_shots_between(
|
|
|
1525
1528
|
business_days = (
|
|
1526
1529
|
date_helpers.get_business_days(task_start, task_end) + 1
|
|
1527
1530
|
)
|
|
1528
|
-
full_name, _ = names_service.get_full_entity_name(shot["id"])
|
|
1531
|
+
full_name, _, _ = names_service.get_full_entity_name(shot["id"])
|
|
1529
1532
|
shot["full_name"] = full_name
|
|
1530
1533
|
multiplicator = 1
|
|
1531
1534
|
if task_start >= start and task_end <= end:
|
|
@@ -1583,7 +1586,7 @@ def get_raw_quota_shots_between(
|
|
|
1583
1586
|
|
|
1584
1587
|
for entity in query_shots:
|
|
1585
1588
|
shot = entity.serialize()
|
|
1586
|
-
full_name, _ = names_service.get_full_entity_name(shot["id"])
|
|
1589
|
+
full_name, _, _ = names_service.get_full_entity_name(shot["id"])
|
|
1587
1590
|
shot["full_name"] = full_name
|
|
1588
1591
|
shot["weight"] = 1
|
|
1589
1592
|
shots.append(shot)
|
zou/app/services/user_service.py
CHANGED
|
@@ -9,6 +9,7 @@ from zou.app.models.notification import Notification
|
|
|
9
9
|
from zou.app.models.person import Person
|
|
10
10
|
from zou.app.models.project import Project
|
|
11
11
|
from zou.app.models.project_status import ProjectStatus
|
|
12
|
+
from zou.app.models.subscription import Subscription
|
|
12
13
|
from zou.app.models.search_filter import SearchFilter
|
|
13
14
|
from zou.app.models.search_filter_group import SearchFilterGroup
|
|
14
15
|
from zou.app.models.task import Task
|
|
@@ -962,6 +963,9 @@ def update_filter(search_filter_id, data):
|
|
|
962
963
|
search_filter = SearchFilter.get_by(
|
|
963
964
|
id=search_filter_id, person_id=current_user["id"]
|
|
964
965
|
)
|
|
966
|
+
if current_user["role"] == "admin" and search_filter is None:
|
|
967
|
+
search_filter = SearchFilter.get_by(id=search_filter_id)
|
|
968
|
+
|
|
965
969
|
if search_filter is None:
|
|
966
970
|
raise SearchFilterNotFoundException
|
|
967
971
|
|
|
@@ -1182,6 +1186,18 @@ def get_notification(notification_id):
|
|
|
1182
1186
|
return notifications[0]
|
|
1183
1187
|
|
|
1184
1188
|
|
|
1189
|
+
def update_notification(notification_id, read):
|
|
1190
|
+
"""
|
|
1191
|
+
Update read status of given notification.
|
|
1192
|
+
"""
|
|
1193
|
+
current_user = persons_service.get_current_user()
|
|
1194
|
+
notification = Notification.get_by(
|
|
1195
|
+
id=notification_id, person_id=current_user["id"]
|
|
1196
|
+
)
|
|
1197
|
+
notification.update({"read": read})
|
|
1198
|
+
return notification.serialize()
|
|
1199
|
+
|
|
1200
|
+
|
|
1185
1201
|
def get_unread_notifications_count(notification_id=None):
|
|
1186
1202
|
"""
|
|
1187
1203
|
Return the number of unread notifications.
|
|
@@ -1192,6 +1208,9 @@ def get_unread_notifications_count(notification_id=None):
|
|
|
1192
1208
|
).count()
|
|
1193
1209
|
|
|
1194
1210
|
|
|
1211
|
+
from sqlalchemy import and_, func
|
|
1212
|
+
|
|
1213
|
+
|
|
1195
1214
|
def get_last_notifications(
|
|
1196
1215
|
notification_id=None,
|
|
1197
1216
|
after=None,
|
|
@@ -1199,6 +1218,8 @@ def get_last_notifications(
|
|
|
1199
1218
|
task_type_id=None,
|
|
1200
1219
|
task_status_id=None,
|
|
1201
1220
|
notification_type=None,
|
|
1221
|
+
read=None,
|
|
1222
|
+
watching=None,
|
|
1202
1223
|
):
|
|
1203
1224
|
"""
|
|
1204
1225
|
Return last 100 user notifications.
|
|
@@ -1213,6 +1234,13 @@ def get_last_notifications(
|
|
|
1213
1234
|
.join(Author, Author.id == Notification.author_id)
|
|
1214
1235
|
.join(Task, Task.id == Notification.task_id)
|
|
1215
1236
|
.join(Project, Project.id == Task.project_id)
|
|
1237
|
+
.outerjoin(
|
|
1238
|
+
Subscription,
|
|
1239
|
+
and_(
|
|
1240
|
+
Subscription.task_id == Task.id,
|
|
1241
|
+
Subscription.person_id == current_user["id"],
|
|
1242
|
+
),
|
|
1243
|
+
)
|
|
1216
1244
|
.outerjoin(Comment, Comment.id == Notification.comment_id)
|
|
1217
1245
|
.add_columns(
|
|
1218
1246
|
Project.id,
|
|
@@ -1223,6 +1251,7 @@ def get_last_notifications(
|
|
|
1223
1251
|
Comment.text,
|
|
1224
1252
|
Comment.replies,
|
|
1225
1253
|
Task.entity_id,
|
|
1254
|
+
Subscription.id,
|
|
1226
1255
|
Author.role,
|
|
1227
1256
|
)
|
|
1228
1257
|
)
|
|
@@ -1251,6 +1280,16 @@ def get_last_notifications(
|
|
|
1251
1280
|
if notification_type is not None:
|
|
1252
1281
|
query = query.filter(Notification.type == notification_type)
|
|
1253
1282
|
|
|
1283
|
+
if read is not None:
|
|
1284
|
+
query = query.filter(Notification.read == read)
|
|
1285
|
+
|
|
1286
|
+
if watching is not None:
|
|
1287
|
+
print(watching)
|
|
1288
|
+
if watching:
|
|
1289
|
+
query = query.filter(Subscription.id != None)
|
|
1290
|
+
else:
|
|
1291
|
+
query = query.filter(Subscription.id == None)
|
|
1292
|
+
|
|
1254
1293
|
notifications = query.limit(100).all()
|
|
1255
1294
|
|
|
1256
1295
|
for (
|
|
@@ -1263,10 +1302,11 @@ def get_last_notifications(
|
|
|
1263
1302
|
comment_text,
|
|
1264
1303
|
comment_replies,
|
|
1265
1304
|
task_entity_id,
|
|
1305
|
+
subscription_id,
|
|
1266
1306
|
role,
|
|
1267
1307
|
) in notifications:
|
|
1268
|
-
(full_entity_name, episode_id) =
|
|
1269
|
-
task_entity_id
|
|
1308
|
+
(full_entity_name, episode_id, entity_preview_file_id) = (
|
|
1309
|
+
names_service.get_full_entity_name(task_entity_id)
|
|
1270
1310
|
)
|
|
1271
1311
|
preview_file_id = None
|
|
1272
1312
|
mentions = []
|
|
@@ -1326,6 +1366,8 @@ def get_last_notifications(
|
|
|
1326
1366
|
"change": notification.change,
|
|
1327
1367
|
"full_entity_name": full_entity_name,
|
|
1328
1368
|
"episode_id": episode_id,
|
|
1369
|
+
"entity_preview_file_id": entity_preview_file_id,
|
|
1370
|
+
"subscription_id": subscription_id,
|
|
1329
1371
|
}
|
|
1330
1372
|
)
|
|
1331
1373
|
)
|
|
@@ -1338,17 +1380,21 @@ def mark_notifications_as_read():
|
|
|
1338
1380
|
Mark all recent notifications for current_user as read. It is useful
|
|
1339
1381
|
to mark a list of notifications as read after an user retrieved them.
|
|
1340
1382
|
"""
|
|
1383
|
+
from sqlalchemy import update
|
|
1384
|
+
from zou.app import db
|
|
1385
|
+
|
|
1341
1386
|
current_user = persons_service.get_current_user()
|
|
1342
|
-
|
|
1343
|
-
Notification
|
|
1344
|
-
.
|
|
1345
|
-
.
|
|
1387
|
+
update_stmt = (
|
|
1388
|
+
update(Notification)
|
|
1389
|
+
.where(Notification.person_id == current_user["id"])
|
|
1390
|
+
.where(Notification.read == False)
|
|
1391
|
+
.values(read=True)
|
|
1346
1392
|
)
|
|
1347
1393
|
|
|
1348
|
-
|
|
1349
|
-
|
|
1394
|
+
db.session.execute(update_stmt)
|
|
1395
|
+
db.session.commit()
|
|
1350
1396
|
|
|
1351
|
-
return
|
|
1397
|
+
return True
|
|
1352
1398
|
|
|
1353
1399
|
|
|
1354
1400
|
def has_task_subscription(task_id):
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"""add prefeence fields
|
|
2
|
+
|
|
3
|
+
Revision ID: 8e67c183bed7
|
|
4
|
+
Revises: 59a7445a966c
|
|
5
|
+
Create Date: 2024-09-26 10:48:45.678791
|
|
6
|
+
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from alembic import op
|
|
10
|
+
import sqlalchemy as sa
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
# revision identifiers, used by Alembic.
|
|
14
|
+
revision = "8e67c183bed7"
|
|
15
|
+
down_revision = "59a7445a966c"
|
|
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("organisation", schema=None) as batch_op:
|
|
23
|
+
batch_op.add_column(
|
|
24
|
+
sa.Column("dark_theme_by_default", sa.Boolean(), nullable=True)
|
|
25
|
+
)
|
|
26
|
+
batch_op.add_column(
|
|
27
|
+
sa.Column("format_duration_in_hours", sa.Boolean(), nullable=True)
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
with op.batch_alter_table("project", schema=None) as batch_op:
|
|
31
|
+
batch_op.add_column(
|
|
32
|
+
sa.Column(
|
|
33
|
+
"is_publish_default_for_artists", sa.Boolean(), nullable=True
|
|
34
|
+
)
|
|
35
|
+
)
|
|
36
|
+
batch_op.add_column(
|
|
37
|
+
sa.Column("hd_bitrate_compression", sa.Integer(), nullable=True)
|
|
38
|
+
)
|
|
39
|
+
batch_op.add_column(
|
|
40
|
+
sa.Column("ld_bitrate_compression", sa.Integer(), nullable=True)
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
with op.batch_alter_table("task", schema=None) as batch_op:
|
|
44
|
+
batch_op.add_column(
|
|
45
|
+
sa.Column(
|
|
46
|
+
"difficulty", sa.Integer(), nullable=False, server_default="3"
|
|
47
|
+
)
|
|
48
|
+
)
|
|
49
|
+
batch_op.create_check_constraint(
|
|
50
|
+
"check_difficulty", "difficulty > 0 AND difficulty < 6"
|
|
51
|
+
)
|
|
52
|
+
|
|
53
|
+
# ### end Alembic commands ###
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def downgrade():
|
|
57
|
+
# ### commands auto generated by Alembic - please adjust! ###
|
|
58
|
+
with op.batch_alter_table("task", schema=None) as batch_op:
|
|
59
|
+
batch_op.drop_constraint("check_difficulty", type_="check")
|
|
60
|
+
batch_op.drop_column("difficulty")
|
|
61
|
+
|
|
62
|
+
with op.batch_alter_table("project", schema=None) as batch_op:
|
|
63
|
+
batch_op.drop_column("ld_bitrate_compression")
|
|
64
|
+
batch_op.drop_column("hd_bitrate_compression")
|
|
65
|
+
batch_op.drop_column("is_publish_default_for_artists")
|
|
66
|
+
|
|
67
|
+
with op.batch_alter_table("organisation", schema=None) as batch_op:
|
|
68
|
+
batch_op.drop_column("format_duration_in_hours")
|
|
69
|
+
batch_op.drop_column("dark_theme_by_default")
|
|
70
|
+
|
|
71
|
+
# ### end Alembic commands ###
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: zou
|
|
3
|
-
Version: 0.19.
|
|
3
|
+
Version: 0.19.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
|
|
@@ -37,11 +37,11 @@ Requires-Dist: flask-sqlalchemy ==3.1.1
|
|
|
37
37
|
Requires-Dist: flask-fs2[s3,swift] ==0.7.27
|
|
38
38
|
Requires-Dist: flask-jwt-extended ==4.6.0
|
|
39
39
|
Requires-Dist: flask-migrate ==4.0.7
|
|
40
|
-
Requires-Dist: flask-socketio ==5.4.
|
|
40
|
+
Requires-Dist: flask-socketio ==5.4.1
|
|
41
41
|
Requires-Dist: flask ==3.0.3
|
|
42
|
-
Requires-Dist: gazu ==0.10.
|
|
42
|
+
Requires-Dist: gazu ==0.10.16
|
|
43
43
|
Requires-Dist: gevent-websocket ==0.10.1
|
|
44
|
-
Requires-Dist: gevent ==24.2
|
|
44
|
+
Requires-Dist: gevent ==24.10.2
|
|
45
45
|
Requires-Dist: gunicorn ==23.0.0
|
|
46
46
|
Requires-Dist: isoweek ==1.3.3
|
|
47
47
|
Requires-Dist: itsdangerous ==2.2.0
|
|
@@ -53,7 +53,7 @@ Requires-Dist: opencv-python ==4.10.0.84
|
|
|
53
53
|
Requires-Dist: OpenTimelineIO ==0.17.0
|
|
54
54
|
Requires-Dist: OpenTimelineIO-Plugins ==0.17.0
|
|
55
55
|
Requires-Dist: orjson ==3.10.7
|
|
56
|
-
Requires-Dist: pillow ==
|
|
56
|
+
Requires-Dist: pillow ==11.0.0
|
|
57
57
|
Requires-Dist: psutil ==6.0.0
|
|
58
58
|
Requires-Dist: psycopg[binary] ==3.2.3
|
|
59
59
|
Requires-Dist: pyotp ==2.9.0
|
|
@@ -62,26 +62,26 @@ Requires-Dist: python-nomad ==2.0.1
|
|
|
62
62
|
Requires-Dist: python-slugify ==8.0.4
|
|
63
63
|
Requires-Dist: python-socketio ==5.11.4
|
|
64
64
|
Requires-Dist: pytz ==2024.2
|
|
65
|
-
Requires-Dist: redis ==5.1.
|
|
65
|
+
Requires-Dist: redis ==5.1.1
|
|
66
66
|
Requires-Dist: requests ==2.32.3
|
|
67
67
|
Requires-Dist: rq ==1.16.2
|
|
68
68
|
Requires-Dist: slackclient ==2.9.4
|
|
69
69
|
Requires-Dist: sqlalchemy-utils ==0.41.2
|
|
70
|
-
Requires-Dist: sqlalchemy ==2.0.
|
|
70
|
+
Requires-Dist: sqlalchemy ==2.0.36
|
|
71
71
|
Requires-Dist: ua-parser ==0.18.0
|
|
72
72
|
Requires-Dist: werkzeug ==3.0.4
|
|
73
73
|
Requires-Dist: numpy ==2.0.1 ; python_version == "3.9"
|
|
74
|
-
Requires-Dist: numpy ==2.1.
|
|
74
|
+
Requires-Dist: numpy ==2.1.2 ; python_version >= "3.10"
|
|
75
75
|
Provides-Extra: dev
|
|
76
76
|
Requires-Dist: wheel ; extra == 'dev'
|
|
77
77
|
Provides-Extra: lint
|
|
78
78
|
Requires-Dist: autoflake ==2.3.1 ; extra == 'lint'
|
|
79
|
-
Requires-Dist: black ==24.
|
|
80
|
-
Requires-Dist: pre-commit ==
|
|
79
|
+
Requires-Dist: black ==24.10.0 ; extra == 'lint'
|
|
80
|
+
Requires-Dist: pre-commit ==4.0.1 ; extra == 'lint'
|
|
81
81
|
Provides-Extra: monitoring
|
|
82
82
|
Requires-Dist: prometheus-flask-exporter ==0.23.1 ; extra == 'monitoring'
|
|
83
83
|
Requires-Dist: pygelf ==0.4.2 ; extra == 'monitoring'
|
|
84
|
-
Requires-Dist: sentry-sdk ==2.
|
|
84
|
+
Requires-Dist: sentry-sdk ==2.16.0 ; extra == 'monitoring'
|
|
85
85
|
Provides-Extra: prod
|
|
86
86
|
Requires-Dist: gunicorn ; extra == 'prod'
|
|
87
87
|
Requires-Dist: gevent ; extra == 'prod'
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
zou/__init__.py,sha256=
|
|
1
|
+
zou/__init__.py,sha256=jW9ZGh5Op9utKMQzRf38ogtGfjS5IWX7r0EtOXzcwd0,24
|
|
2
2
|
zou/cli.py,sha256=DHHf4mz33Bi0gGFJ0GdRUpjrMrMSQYyVubJFppHPZlU,18914
|
|
3
3
|
zou/debug.py,sha256=1fawPbkD4wn0Y9Gk0BiBFSa-CQe5agFi8R9uJYl2Uyk,520
|
|
4
4
|
zou/event_stream.py,sha256=_tue9Ry3aqCniZpKGhWJaY1Eo_fd6zOAfnzPvh_mJzU,8489
|
|
@@ -10,13 +10,13 @@ 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=
|
|
13
|
+
zou/app/blueprints/assets/resources.py,sha256=ff7g8_FzZC6dLvMxcYYffsIOy0CqKqdkZibGm2-qgko,25599
|
|
14
14
|
zou/app/blueprints/auth/__init__.py,sha256=xP874bMWUnLIirOPSEbpe-Q2fBBQrxZGKd0tLZmNJXk,1128
|
|
15
15
|
zou/app/blueprints/auth/resources.py,sha256=CAqlC8Q2Mw3grjL2bU_aZJQ18huwa1Kf3ym2sueH8Bg,45136
|
|
16
16
|
zou/app/blueprints/breakdown/__init__.py,sha256=Dp6GWSGxxWIedpyzTTEKpCRUYEo8oVNVyQhwNvTMmQM,1888
|
|
17
17
|
zou/app/blueprints/breakdown/resources.py,sha256=JY3j17kv7xPKV9S-XoOxNYivpGHlfZkXI5WuGtx3_Yk,13591
|
|
18
18
|
zou/app/blueprints/chats/__init__.py,sha256=YGmwGvddg3MgSYVIh-hmkX8t2em9_LblxBeJzFqFJD4,558
|
|
19
|
-
zou/app/blueprints/chats/resources.py,sha256=
|
|
19
|
+
zou/app/blueprints/chats/resources.py,sha256=4yLFermdwOsnBLs9nx8yxuHWLar24uQWQy0XgsUNDD0,5950
|
|
20
20
|
zou/app/blueprints/comments/__init__.py,sha256=WqpJ7-_dK1cInGTFJAxQ7syZtPCotwq2oO20UEnk1h4,1532
|
|
21
21
|
zou/app/blueprints/comments/resources.py,sha256=_WoAnnv2uRLbc_fzg6XCeXF06_KNFS08r84YVN858Mc,19423
|
|
22
22
|
zou/app/blueprints/concepts/__init__.py,sha256=sP_P4mfYvfMcgeE6MHZYP3eD0Lz0Lwit5-CFuVnA-Jg,894
|
|
@@ -29,11 +29,11 @@ zou/app/blueprints/crud/chat.py,sha256=Sq1r0y9ANjS113PUpwgAhnjYsxxLKMCM-a7DJ_icF
|
|
|
29
29
|
zou/app/blueprints/crud/chat_message.py,sha256=bEEUoV0sNzu5sntNS6fpLh5NC6wWiycWCXtTE-t4yG4,387
|
|
30
30
|
zou/app/blueprints/crud/comments.py,sha256=YH4cllfGloPMcIq1tgpT5pSvKTwNJ1zpkUssrK_OjiU,8334
|
|
31
31
|
zou/app/blueprints/crud/custom_action.py,sha256=Nf6S6YBxePg4-nfaPTroIYZGWt9fJEHC719DOKJ8R98,978
|
|
32
|
-
zou/app/blueprints/crud/day_off.py,sha256=
|
|
32
|
+
zou/app/blueprints/crud/day_off.py,sha256=hr_cSBG-r7i_an2AkRmgTPtzbwojaI6el_JDUHgBBx4,2571
|
|
33
33
|
zou/app/blueprints/crud/department.py,sha256=AAN_qxZDQGS-mR1kRS_2qGx1D7PKT3h_Ke3IXtJ_F90,973
|
|
34
34
|
zou/app/blueprints/crud/entity.py,sha256=WdAmVoK1nwo_JmzVKls-DV-rK6miu3y9wZELGDo3Fqw,9731
|
|
35
35
|
zou/app/blueprints/crud/entity_link.py,sha256=PlHGy3RPDUVdwWtOpQegz-wZCcxe9FZw_80nUVBy1Ac,819
|
|
36
|
-
zou/app/blueprints/crud/entity_type.py,sha256=
|
|
36
|
+
zou/app/blueprints/crud/entity_type.py,sha256=Q32S4FCVHYGCcymjETEmjmNOCyWhtw1TpW1gznyY6m8,2332
|
|
37
37
|
zou/app/blueprints/crud/event.py,sha256=bay2ggg5Oa69lOxNYGkHVQdSKuMxGhk2wqWP7QApKUg,589
|
|
38
38
|
zou/app/blueprints/crud/file_status.py,sha256=g2YM_0pscO0GAd-VOzTnl7EF57BS_7zbAwCt1WlNujs,509
|
|
39
39
|
zou/app/blueprints/crud/metadata_descriptor.py,sha256=Dc9_HOPCroqI7XDPiO6nrbmLfzaRIR0pFgg41Lq2sj0,2063
|
|
@@ -47,9 +47,9 @@ zou/app/blueprints/crud/person.py,sha256=qKgko2ZlGCHj_7SC9NW9hFHrjblk18khS_7bGKh
|
|
|
47
47
|
zou/app/blueprints/crud/playlist.py,sha256=ZXaz-hHPej6XYKo_RUfJ2QnGOh2W8-y9hTkPZCUp7Zk,1876
|
|
48
48
|
zou/app/blueprints/crud/preview_background_file.py,sha256=WzOfag5qhz5B3-XDObYRC8TO4X-kIo1sHOnMCV62IEo,2437
|
|
49
49
|
zou/app/blueprints/crud/preview_file.py,sha256=252EDEdF-wQaL9ZhqQv5j9z_JKK5WeYwidJfFafArjo,3831
|
|
50
|
-
zou/app/blueprints/crud/project.py,sha256=
|
|
50
|
+
zou/app/blueprints/crud/project.py,sha256=YqBJsWCZsNVE93H2xN0wCXozz7iHBi9vs7cgwb8DTI8,8272
|
|
51
51
|
zou/app/blueprints/crud/project_status.py,sha256=7q78eGCJAg4ZofqBJWBeHsLVpmtxfP9Blpg8-ZYduC8,526
|
|
52
|
-
zou/app/blueprints/crud/schedule_item.py,sha256=
|
|
52
|
+
zou/app/blueprints/crud/schedule_item.py,sha256=1dbNKbftNG3if38Hzh1uslCAu3BE4jOqWhLV0590A90,1400
|
|
53
53
|
zou/app/blueprints/crud/search_filter.py,sha256=qR0crZFfaOd2YxFcPMKhAj1SXCc-YW9Wk4UA07dDgMQ,393
|
|
54
54
|
zou/app/blueprints/crud/search_filter_group.py,sha256=bdCLP1EmSatSNQXW8qYjqXQ1_dqluxUeEe7wEpcP_R0,424
|
|
55
55
|
zou/app/blueprints/crud/software.py,sha256=8UmSPMX-V210nlX0k_RafV930tYqPayt2mBOyDSsqNQ,1960
|
|
@@ -74,24 +74,24 @@ zou/app/blueprints/export/csv/base.py,sha256=AlNvzpozHAqs76tWGju0PGhX4CthDRDkwI8
|
|
|
74
74
|
zou/app/blueprints/export/csv/casting.py,sha256=0e4Z9TzpGfAuWx84qbMAJo74CacsRFofpWChZQ8UNC0,14153
|
|
75
75
|
zou/app/blueprints/export/csv/edits.py,sha256=mEtIoHQ8iD9mWWgvtspFau_JjPGI6PwAWq6n1Q9W9OM,5408
|
|
76
76
|
zou/app/blueprints/export/csv/persons.py,sha256=z8B6wlGqTYP5gKKpXSh36ez03wWNY129wNVzwvt6AGY,964
|
|
77
|
-
zou/app/blueprints/export/csv/playlists.py,sha256=
|
|
77
|
+
zou/app/blueprints/export/csv/playlists.py,sha256=AIrMrGMjbdFaPiRw02KZPznaYc6Zp56KUDaIj9RafwY,4830
|
|
78
78
|
zou/app/blueprints/export/csv/projects.py,sha256=n_266BxGfYHz-3RbgZ-OuFnJellbP4lXuElRAPFzlHc,740
|
|
79
79
|
zou/app/blueprints/export/csv/shots.py,sha256=JSJjqyCJPoIXpAmmPnappUQbYau0AA03c_wh8pmQCls,6005
|
|
80
80
|
zou/app/blueprints/export/csv/task_types.py,sha256=PCEEhOQcdOJv_38i-KNxbkGeNzmQ8Qe01k8YnhRybzo,765
|
|
81
81
|
zou/app/blueprints/export/csv/tasks.py,sha256=CHFcs9S3eLIz6psE6Q6mZ-OSur_GrpBeLn98Nh9NNcA,4121
|
|
82
|
-
zou/app/blueprints/export/csv/time_spents.py,sha256=
|
|
82
|
+
zou/app/blueprints/export/csv/time_spents.py,sha256=yYPtilOxfQD5mBwyh9h-PbTQBpab-vMrec35tYUw4fQ,2984
|
|
83
83
|
zou/app/blueprints/files/__init__.py,sha256=7Wty30JW2OXIn-tBFXOWWmPuHnsnxPpH3jNtHvvr9tY,3987
|
|
84
84
|
zou/app/blueprints/files/resources.py,sha256=8SIV8kaqv3dxyL8nyqG3QiZmk5ZYIvUxw6k1ic-jhBs,69786
|
|
85
85
|
zou/app/blueprints/index/__init__.py,sha256=Dh3oQiirpg8RCkfVOuk3irIjSvUvuRf0jPxE6oGubz0,828
|
|
86
86
|
zou/app/blueprints/index/resources.py,sha256=lGPUGZPla59mjXXsDW4DB04uE_rI4fhMqm8J48Nxf4s,8407
|
|
87
87
|
zou/app/blueprints/news/__init__.py,sha256=HxBXjC15dVbotNAZ0CLf02iwUjxJr20kgf8_kT_9nwM,505
|
|
88
|
-
zou/app/blueprints/news/resources.py,sha256=
|
|
88
|
+
zou/app/blueprints/news/resources.py,sha256=SL0RYo-fs23GjQU1IW4kuEBg2SHdaXaonrOoOnWafdw,7183
|
|
89
89
|
zou/app/blueprints/persons/__init__.py,sha256=0cnHHw3K_8OEMm0qOi3wKVomSAg9IJSnVjAXabMeHks,3893
|
|
90
90
|
zou/app/blueprints/persons/resources.py,sha256=RsN8ix67zRU7NNeMY7uFCXkU2ntJlmKF6DizmGVYdE0,42684
|
|
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=qGohO6LRNZKXBAegINcUXuZlrtxobJKQg84-rQ1L3AU,4202
|
|
94
|
-
zou/app/blueprints/previews/resources.py,sha256=
|
|
94
|
+
zou/app/blueprints/previews/resources.py,sha256=Mg2FVVJdb5_Fqr8OAWl2i46qgSASe9b4lzYnFjGeFRQ,48062
|
|
95
95
|
zou/app/blueprints/projects/__init__.py,sha256=Pn3fA5bpNFEPBzxTKJ2foV6osZFflXXSM2l2uZh3ktM,3927
|
|
96
96
|
zou/app/blueprints/projects/resources.py,sha256=E91Vj9EzId2pxiL50JRfrThiyif1PmzWS1oPeMThzQI,31544
|
|
97
97
|
zou/app/blueprints/search/__init__.py,sha256=QCjQIY_85l_orhdEiqav_GifjReuwsjZggN3V0GeUVY,356
|
|
@@ -100,7 +100,7 @@ zou/app/blueprints/shots/__init__.py,sha256=HfgLneZBYUMa2OGwIgEZTz8zrIEYFRiYmRbr
|
|
|
100
100
|
zou/app/blueprints/shots/resources.py,sha256=_Zkxk_XFwuT_b6vWOx9p3VyMuD2PAo-xKJRATsGjPdQ,49965
|
|
101
101
|
zou/app/blueprints/source/__init__.py,sha256=H7K-4TDs4pc5EJvcYTYMJBHesxyqsE5-xq7J8ckOS2g,6093
|
|
102
102
|
zou/app/blueprints/source/kitsu.py,sha256=4lWdqxaKDzwx-5POAIHIgZ6ODbDMOOVRxaSb_FOLcCk,5012
|
|
103
|
-
zou/app/blueprints/source/otio.py,sha256=
|
|
103
|
+
zou/app/blueprints/source/otio.py,sha256=nTXQEauFinPv2QBXziJW83rSrB_qzIbkFQ_qgxbJynA,13419
|
|
104
104
|
zou/app/blueprints/source/csv/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
105
105
|
zou/app/blueprints/source/csv/assets.py,sha256=yXoiRaEtW-GXYbmVQJn5Nghx0CR3WTQ-D4farDeG8JI,10471
|
|
106
106
|
zou/app/blueprints/source/csv/base.py,sha256=rzFBJhqBTUEmAH2eCzjFxJoAXaMW6VDafmWakoBdL-I,4387
|
|
@@ -127,9 +127,9 @@ 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=pNUqVEVX1KVu1IzRRJNsziPkhWKXqgyvQsNp7LbmIxo,4342
|
|
130
|
-
zou/app/blueprints/tasks/resources.py,sha256=
|
|
131
|
-
zou/app/blueprints/user/__init__.py,sha256=
|
|
132
|
-
zou/app/blueprints/user/resources.py,sha256=
|
|
130
|
+
zou/app/blueprints/tasks/resources.py,sha256=b5z4OolidyKdKTP5kuZLk7tDLhgDs5W3rkH4ZWlwB0Y,56020
|
|
131
|
+
zou/app/blueprints/user/__init__.py,sha256=H9zCHcVobC6jq6dTToXKAjnZmDA0a9gChHiIP3BcZsc,4586
|
|
132
|
+
zou/app/blueprints/user/resources.py,sha256=tfdNIIwClACEfmvu8SgQs1Q3oD9nVT0P2IpdcglmITo,38646
|
|
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
|
|
@@ -156,14 +156,14 @@ zou/app/models/metadata_descriptor.py,sha256=LRCJ7NKsy771kMSLeZDrCON7jRk76J-JTFW
|
|
|
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
|
-
zou/app/models/organisation.py,sha256=
|
|
159
|
+
zou/app/models/organisation.py,sha256=jVDsS3C3ani0NYeKKMnsnkGzeeQor9jMU1qkHxkSa9c,1938
|
|
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
162
|
zou/app/models/person.py,sha256=-JpYBpzqZ3LDD6HW1YgjrD7szhWSxQ0ti4GrrGvja2w,7466
|
|
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
|
|
166
|
-
zou/app/models/project.py,sha256=
|
|
166
|
+
zou/app/models/project.py,sha256=T2gTImmbd5O-U5GySWSwzkR0r_cY2RDr1niwSfOPqeA,8900
|
|
167
167
|
zou/app/models/project_status.py,sha256=pExaHH7x4Eu8xOqD3_mRRbMzjT2jJZ8rm-9jo7yUGXA,390
|
|
168
168
|
zou/app/models/schedule_item.py,sha256=coY5uDDuBoctaMICnfCzx4zT5om2E1uu4iq5MDWAPlY,1444
|
|
169
169
|
zou/app/models/search_filter.py,sha256=3xcFemJ9poIBAHNd50pv9U9eP_n74xJCxW2JBDcRuNo,1133
|
|
@@ -172,48 +172,48 @@ zou/app/models/serializer.py,sha256=VKN5hHJ6M_jsvrbKe5SonnTeg5dxXSYqb_4JDVWIQwA,
|
|
|
172
172
|
zou/app/models/software.py,sha256=3y9xEOS8BBxqgTaRrCaSYHaB6uOdJ88uU5i-cACoCSk,517
|
|
173
173
|
zou/app/models/status_automation.py,sha256=95c0lmOetujyGWViLd_qsR4GWPhrmlvi9ZfkC0x1NuM,1391
|
|
174
174
|
zou/app/models/studio.py,sha256=cXnYFh-8m5Kw05QawYcCr59eeLp25NDI0VIb77oqUOs,384
|
|
175
|
-
zou/app/models/subscription.py,sha256=
|
|
176
|
-
zou/app/models/task.py,sha256=
|
|
175
|
+
zou/app/models/subscription.py,sha256=kMfPPe8uFJMDWB4B9MpWaXZD86FFZlj7ty0FkVyqE_4,1054
|
|
176
|
+
zou/app/models/task.py,sha256=kC0ufy82n9Vj5f9r_pbx74szSJMM0LPIlrWIlAnTkD8,3615
|
|
177
177
|
zou/app/models/task_status.py,sha256=J7mNWIFd9KMWfUOLHjmuxIupjs59iSh8aQ_9LEFXqH4,1227
|
|
178
178
|
zou/app/models/task_type.py,sha256=IsixVAfz3pyMf0eQw8x-uFNM9OHNkZpsPLEz_VNQ0hA,1005
|
|
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=
|
|
182
|
+
zou/app/services/assets_service.py,sha256=J7o1ewK2bevJNjeXyaGp99PH0G5Yxbm2edxfX90R3W0,23716
|
|
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
|
|
186
186
|
zou/app/services/breakdown_service.py,sha256=n6xLoFGSEH2JXUKiXKq2NGVZZg_AIORtA05d5D4uaB4,27480
|
|
187
|
-
zou/app/services/chats_service.py,sha256=
|
|
187
|
+
zou/app/services/chats_service.py,sha256=9jw8Rh9PEovpYu_cxxYicTFQFQhc-ObGlteFQwQCC-M,8273
|
|
188
188
|
zou/app/services/comments_service.py,sha256=CUr0CZGkR95OrHDRJnhAZAikBLtWhM-5uLIoxI4gNtA,18589
|
|
189
189
|
zou/app/services/concepts_service.py,sha256=KGvk6lF5udj3SWn40X9KE8OAigrLCZUKEz9_CW7EMgQ,11440
|
|
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
192
|
zou/app/services/edits_service.py,sha256=KTk5KUJx1yB-mRka8rQXMgQLIcWq4mNYZfnVhVlKwyQ,12122
|
|
193
|
-
zou/app/services/emails_service.py,sha256=
|
|
194
|
-
zou/app/services/entities_service.py,sha256=
|
|
193
|
+
zou/app/services/emails_service.py,sha256=HaSdDzNLU-s_fxoH-YQi-3VFX1YwdYm64kMhJFGa3AM,11923
|
|
194
|
+
zou/app/services/entities_service.py,sha256=HDl_KqS5aZEUyAkrgsQ11qqYiaFFy0VcD2BrSaOrxJg,16436
|
|
195
195
|
zou/app/services/events_service.py,sha256=_gU19herxiAo47WRxVNhvl7v-RKhp-8wZ3gAiHKpOzI,2716
|
|
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
199
|
zou/app/services/index_service.py,sha256=1w8rGJ7ArYC13B43hD4JOPtVhaRsbseJVVY-GnU_3tA,9874
|
|
200
|
-
zou/app/services/names_service.py,sha256=
|
|
201
|
-
zou/app/services/news_service.py,sha256=
|
|
200
|
+
zou/app/services/names_service.py,sha256=TOSrintROmxcAlcFQE0i2E3PBLnw81GAztNselpTn18,2947
|
|
201
|
+
zou/app/services/news_service.py,sha256=g-QlITBbEvhvm-pLv7GtGACKX4uBPa-IKxfNOgMgaHo,8768
|
|
202
202
|
zou/app/services/notifications_service.py,sha256=7GDRio_mGaRYV5BHOAdpxBZjA_LLYUfVpbwZqy1n9pI,15685
|
|
203
203
|
zou/app/services/persons_service.py,sha256=06CyF--QnGVkjvZPkAYIBz8V-P_Nbb4Iv1lkHQWqh4k,16310
|
|
204
204
|
zou/app/services/playlists_service.py,sha256=pAlPHET4jNdST5jsmJrFUkf1SVhfSoML9zdNpZ_88l4,32439
|
|
205
|
-
zou/app/services/preview_files_service.py,sha256=
|
|
205
|
+
zou/app/services/preview_files_service.py,sha256=M1kXryARUKwCDXsr0hOfUUyGn75y-qXIVIwlMOKWWHs,35609
|
|
206
206
|
zou/app/services/projects_service.py,sha256=_J8hIHy3MX5MsdEMRIKNfbyewwhxtMEcc_ymeHBsF38,21434
|
|
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=
|
|
209
|
+
zou/app/services/shots_service.py,sha256=dJGG6_8P8_RwqT7r2kv776xXzgNPyJ-RqLyFQuwgAnY,52196
|
|
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=EunfXlma_IIb7011A_xLQLVQGAi-MteKgm2Y2NAxvMs,41586
|
|
213
213
|
zou/app/services/tasks_service.py,sha256=IoogHBoZhbJegnl5SYGgOaBp2YVqrL22Gccjfp8dPn8,69335
|
|
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=
|
|
216
|
+
zou/app/services/user_service.py,sha256=rI1eLdccb4PpD6tqjQnQtu_sY5h3T9FMbk5GZ6RReg4,47916
|
|
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
|
|
@@ -338,6 +338,7 @@ zou/migrations/versions/87efceb6745b_add_ready_for_to_entity.py,sha256=YDRS-cthq
|
|
|
338
338
|
zou/migrations/versions/892b264937ec_.py,sha256=6T6WZ68teGuuI3s-GA7om9XQhbTQ70opSnGtRqBuu3E,3287
|
|
339
339
|
zou/migrations/versions/8a1b4a1b7f4a_add_totp_columns_for_person.py,sha256=ZcLUDhvtE2yxqEdcmE0zwDY3hfJzzi-M377Mokzhcv4,1076
|
|
340
340
|
zou/migrations/versions/8e4f39e321f4_add_day_off_table.py,sha256=Mc7lEtTBhR0ZNGfxBjzFe5kxVOeG3cPLEjGDfbsjMp0,1584
|
|
341
|
+
zou/migrations/versions/8e67c183bed7_add_preference_fields.py,sha256=x04wpTsjRZLEKSwQ9fw-Y5-KmtONkXRaxy6pf9z0BY4,2244
|
|
341
342
|
zou/migrations/versions/8fbd40afbe5f_allow_to_set_float_values_for_.py,sha256=aJI7O6yOpuMUwZ5O2cid1hIbuBSbbiWI10aRofOLdH4,1933
|
|
342
343
|
zou/migrations/versions/9010a64e5a2d_add_indices.py,sha256=MPDeO2VXx38ehHBPomIDccifS9lDrNl5edH6OXBxopY,1669
|
|
343
344
|
zou/migrations/versions/9060dd4f6116_notification_uc.py,sha256=FQHjH1AqTcMl37OwrTMtS6efMlfoTI2X8yaCAfBPSMc,992
|
|
@@ -411,9 +412,9 @@ zou/remote/normalize_movie.py,sha256=zNfEY3N1UbAHZfddGONTg2Sff3ieLVWd4dfZa1dpnes
|
|
|
411
412
|
zou/remote/playlist.py,sha256=AsDo0bgYhDcd6DfNRV6r6Jj3URWwavE2ZN3VkKRPbLU,3293
|
|
412
413
|
zou/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
413
414
|
zou/utils/movie.py,sha256=u9LCEOvmkxwm-KiZ6jKNdB9LSC6XXUDwJpVx8LkDwJg,16416
|
|
414
|
-
zou-0.19.
|
|
415
|
-
zou-0.19.
|
|
416
|
-
zou-0.19.
|
|
417
|
-
zou-0.19.
|
|
418
|
-
zou-0.19.
|
|
419
|
-
zou-0.19.
|
|
415
|
+
zou-0.19.58.dist-info/LICENSE,sha256=dql8h4yceoMhuzlcK0TT_i-NgTFNIZsgE47Q4t3dUYI,34520
|
|
416
|
+
zou-0.19.58.dist-info/METADATA,sha256=llQSr1UHhwtI7Eq69K7WIu7Z9eYVDG02fdAbnB1vvnY,6676
|
|
417
|
+
zou-0.19.58.dist-info/WHEEL,sha256=OVMc5UfuAQiSplgO0_WdW7vXVGAt9Hdd6qtN4HotdyA,91
|
|
418
|
+
zou-0.19.58.dist-info/entry_points.txt,sha256=PelQoIx3qhQ_Tmne7wrLY-1m2izuzgpwokoURwSohy4,130
|
|
419
|
+
zou-0.19.58.dist-info/top_level.txt,sha256=4S7G_jk4MzpToeDItHGjPhHx_fRdX52zJZWTD4SL54g,4
|
|
420
|
+
zou-0.19.58.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|