zou 0.20.61__py3-none-any.whl → 0.20.63__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.
Files changed (58) hide show
  1. zou/__init__.py +1 -1
  2. zou/app/api.py +2 -0
  3. zou/app/blueprints/crud/__init__.py +25 -1
  4. zou/app/blueprints/crud/hardware_item.py +12 -0
  5. zou/app/blueprints/crud/notification.py +0 -4
  6. zou/app/blueprints/crud/production_schedule_version.py +114 -0
  7. zou/app/blueprints/departments/__init__.py +35 -0
  8. zou/app/blueprints/departments/resources.py +262 -0
  9. zou/app/blueprints/index/resources.py +2 -9
  10. zou/app/blueprints/persons/resources.py +1 -3
  11. zou/app/blueprints/projects/__init__.py +20 -0
  12. zou/app/blueprints/projects/resources.py +200 -0
  13. zou/app/blueprints/tasks/resources.py +5 -2
  14. zou/app/blueprints/user/resources.py +1 -3
  15. zou/app/models/base.py +15 -4
  16. zou/app/models/department.py +62 -0
  17. zou/app/models/entity.py +3 -3
  18. zou/app/models/hardware_item.py +15 -0
  19. zou/app/models/person.py +1 -1
  20. zou/app/models/production_schedule_version.py +81 -0
  21. zou/app/models/project.py +17 -6
  22. zou/app/models/software.py +5 -1
  23. zou/app/models/task.py +7 -10
  24. zou/app/services/assets_service.py +5 -6
  25. zou/app/services/concepts_service.py +3 -4
  26. zou/app/services/deletion_service.py +10 -18
  27. zou/app/services/departments_service.py +153 -0
  28. zou/app/services/edits_service.py +3 -4
  29. zou/app/services/entities_service.py +5 -6
  30. zou/app/services/exception.py +8 -0
  31. zou/app/services/file_tree_service.py +2 -2
  32. zou/app/services/preview_files_service.py +6 -2
  33. zou/app/services/schedule_service.py +243 -1
  34. zou/app/services/shots_service.py +3 -4
  35. zou/app/services/tasks_service.py +5 -1
  36. zou/app/services/user_service.py +57 -23
  37. zou/migrations/alembic.ini +1 -1
  38. zou/migrations/versions/0bd1e89f2a6f_add_productionscheduleversiontasklink_uc.py +58 -0
  39. zou/migrations/versions/26f96f65cfa3_add_productionversionschedule_uc.py +40 -0
  40. zou/migrations/versions/3d8e68dffeee_fix_task_person_link.py +56 -0
  41. zou/migrations/versions/4368137b44e1_productionscheduleversion_add_on_delete_.py +188 -0
  42. zou/migrations/versions/4bd9bfb73f11_add_fields_to_the_software_table.py +49 -0
  43. zou/migrations/versions/5f715f2b6348_add_new_table_productionscheduleversion.py +128 -0
  44. zou/migrations/versions/7a16258f2fab_add_currency_field_to_budgets.py +2 -4
  45. zou/migrations/versions/9683bd840dee_add_archived_field_to_software.py +33 -0
  46. zou/migrations/versions/9af2df17a9d5_add_hardware_table.py +48 -0
  47. zou/migrations/versions/ce7f46f445dc_add_column_estimation_for_.py +37 -0
  48. zou/migrations/versions/d5665dca188b_add_version_field_to_software.py +35 -0
  49. zou/migrations/versions/d97f2730bf7b_add_.py +101 -0
  50. zou/migrations/versions/dde6be40f54f_add_departement_links_tables_for_.py +151 -0
  51. zou/migrations/versions/e4b48ca33539_add_project_production_schedule_version_.py +56 -0
  52. zou/migrations/versions/e8bc24998b34_remove_on_delete_cascade_for_.py +59 -0
  53. {zou-0.20.61.dist-info → zou-0.20.63.dist-info}/METADATA +3 -3
  54. {zou-0.20.61.dist-info → zou-0.20.63.dist-info}/RECORD +58 -37
  55. {zou-0.20.61.dist-info → zou-0.20.63.dist-info}/WHEEL +0 -0
  56. {zou-0.20.61.dist-info → zou-0.20.63.dist-info}/entry_points.txt +0 -0
  57. {zou-0.20.61.dist-info → zou-0.20.63.dist-info}/licenses/LICENSE +0 -0
  58. {zou-0.20.61.dist-info → zou-0.20.63.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,33 @@
1
+ """add archived field to software
2
+
3
+ Revision ID: 9683bd840dee
4
+ Revises: 4bd9bfb73f11
5
+ Create Date: 2025-07-14 12:42:05.362508
6
+
7
+ """
8
+
9
+ from alembic import op
10
+ import sqlalchemy as sa
11
+
12
+
13
+ # revision identifiers, used by Alembic.
14
+ revision = "9683bd840dee"
15
+ down_revision = "4bd9bfb73f11"
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("software", schema=None) as batch_op:
23
+ batch_op.add_column(sa.Column("archived", sa.Boolean(), nullable=True))
24
+
25
+ # ### end Alembic commands ###
26
+
27
+
28
+ def downgrade():
29
+ # ### commands auto generated by Alembic - please adjust! ###
30
+ with op.batch_alter_table("software", schema=None) as batch_op:
31
+ batch_op.drop_column("archived")
32
+
33
+ # ### end Alembic commands ###
@@ -0,0 +1,48 @@
1
+ """add hardware table
2
+
3
+ Revision ID: 9af2df17a9d5
4
+ Revises: d5665dca188b
5
+ Create Date: 2025-07-14 16:30:41.472002
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 = "9af2df17a9d5"
17
+ down_revision = "d5665dca188b"
18
+ branch_labels = None
19
+ depends_on = None
20
+
21
+
22
+ def upgrade():
23
+ # ### commands auto generated by Alembic - please adjust! ###
24
+ op.create_table(
25
+ "hardware_item",
26
+ sa.Column("name", sa.String(length=40), nullable=False),
27
+ sa.Column("short_name", sa.String(length=20), nullable=False),
28
+ sa.Column("archived", sa.Boolean(), nullable=True),
29
+ sa.Column("monthly_cost", sa.Integer(), nullable=True),
30
+ sa.Column("inventory_amount", sa.Integer(), nullable=True),
31
+ sa.Column(
32
+ "id",
33
+ sqlalchemy_utils.types.uuid.UUIDType(binary=False),
34
+ default=uuid.uuid4,
35
+ nullable=False,
36
+ ),
37
+ sa.Column("created_at", sa.DateTime(), nullable=True),
38
+ sa.Column("updated_at", sa.DateTime(), nullable=True),
39
+ sa.PrimaryKeyConstraint("id"),
40
+ sa.UniqueConstraint("name"),
41
+ )
42
+ # ### end Alembic commands ###
43
+
44
+
45
+ def downgrade():
46
+ # ### commands auto generated by Alembic - please adjust! ###
47
+ op.drop_table("hardware_item")
48
+ # ### end Alembic commands ###
@@ -0,0 +1,37 @@
1
+ """Add column estimation for ProductionScheduleVersionTaskLink
2
+
3
+ Revision ID: ce7f46f445dc
4
+ Revises: e8bc24998b34
5
+ Create Date: 2025-07-24 19:27:55.423759
6
+
7
+ """
8
+
9
+ from alembic import op
10
+ import sqlalchemy as sa
11
+
12
+
13
+ # revision identifiers, used by Alembic.
14
+ revision = "ce7f46f445dc"
15
+ down_revision = "e8bc24998b34"
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
+ "production_schedule_version_task_link", schema=None
24
+ ) as batch_op:
25
+ batch_op.add_column(sa.Column("estimation", sa.Float(), nullable=True))
26
+
27
+ # ### end Alembic commands ###
28
+
29
+
30
+ def downgrade():
31
+ # ### commands auto generated by Alembic - please adjust! ###
32
+ with op.batch_alter_table(
33
+ "production_schedule_version_task_link", schema=None
34
+ ) as batch_op:
35
+ batch_op.drop_column("estimation")
36
+
37
+ # ### end Alembic commands ###
@@ -0,0 +1,35 @@
1
+ """add version field to software
2
+
3
+ Revision ID: d5665dca188b
4
+ Revises: 9683bd840dee
5
+ Create Date: 2025-07-14 12:44:29.378444
6
+
7
+ """
8
+
9
+ from alembic import op
10
+ import sqlalchemy as sa
11
+
12
+
13
+ # revision identifiers, used by Alembic.
14
+ revision = "d5665dca188b"
15
+ down_revision = "9683bd840dee"
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("software", schema=None) as batch_op:
23
+ batch_op.add_column(
24
+ sa.Column("version", sa.String(length=20), nullable=True)
25
+ )
26
+
27
+ # ### end Alembic commands ###
28
+
29
+
30
+ def downgrade():
31
+ # ### commands auto generated by Alembic - please adjust! ###
32
+ with op.batch_alter_table("software", schema=None) as batch_op:
33
+ batch_op.drop_column("version")
34
+
35
+ # ### end Alembic commands ###
@@ -0,0 +1,101 @@
1
+ """Add ProductionScheduleVersionTaskLinkPersonLink
2
+
3
+ Revision ID: d97f2730bf7b
4
+ Revises: 5f715f2b6348
5
+ Create Date: 2025-07-16 02:07:13.855652
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 = "d97f2730bf7b"
17
+ down_revision = "5f715f2b6348"
18
+ branch_labels = None
19
+ depends_on = None
20
+
21
+
22
+ def upgrade():
23
+ # ### commands auto generated by Alembic - please adjust! ###
24
+ op.rename_table("assignations", "task_person_link")
25
+ with op.batch_alter_table(
26
+ "production_schedule_version_task_link", schema=None
27
+ ) as batch_op:
28
+ batch_op.alter_column(
29
+ "production_schedule_version_id",
30
+ existing_type=sa.UUID(),
31
+ nullable=True,
32
+ )
33
+ batch_op.alter_column(
34
+ "task_id", existing_type=sa.UUID(), nullable=True
35
+ )
36
+ batch_op.create_index(
37
+ batch_op.f(
38
+ "ix_production_schedule_version_task_link_production_schedule_version_id"
39
+ ),
40
+ ["production_schedule_version_id"],
41
+ unique=False,
42
+ )
43
+ batch_op.create_index(
44
+ batch_op.f("ix_production_schedule_version_task_link_task_id"),
45
+ ["task_id"],
46
+ unique=False,
47
+ )
48
+ op.create_table(
49
+ "production_schedule_version_task_link_person_link",
50
+ sa.Column(
51
+ "production_schedule_version_task_link_id",
52
+ sqlalchemy_utils.types.uuid.UUIDType(binary=False),
53
+ default=uuid.uuid4,
54
+ nullable=False,
55
+ ),
56
+ sa.Column(
57
+ "person_id",
58
+ sqlalchemy_utils.types.uuid.UUIDType(binary=False),
59
+ default=uuid.uuid4,
60
+ nullable=False,
61
+ ),
62
+ sa.ForeignKeyConstraint(
63
+ ["person_id"],
64
+ ["person.id"],
65
+ ),
66
+ sa.ForeignKeyConstraint(
67
+ ["production_schedule_version_task_link_id"],
68
+ ["production_schedule_version_task_link.id"],
69
+ ),
70
+ sa.PrimaryKeyConstraint(
71
+ "production_schedule_version_task_link_id", "person_id"
72
+ ),
73
+ )
74
+
75
+ # ### end Alembic commands ###
76
+
77
+
78
+ def downgrade():
79
+ # ### commands auto generated by Alembic - please adjust! ###
80
+ op.drop_table("production_schedule_version_task_link_person_link")
81
+ with op.batch_alter_table(
82
+ "production_schedule_version_task_link", schema=None
83
+ ) as batch_op:
84
+ batch_op.drop_index(
85
+ batch_op.f("ix_production_schedule_version_task_link_task_id")
86
+ )
87
+ batch_op.drop_index(
88
+ batch_op.f(
89
+ "ix_production_schedule_version_task_link_production_schedule_version_id"
90
+ )
91
+ )
92
+ batch_op.alter_column(
93
+ "task_id", existing_type=sa.UUID(), nullable=False
94
+ )
95
+ batch_op.alter_column(
96
+ "production_schedule_version_id",
97
+ existing_type=sa.UUID(),
98
+ nullable=False,
99
+ )
100
+ op.rename_table("task_person_link", "assignations")
101
+ # ### end Alembic commands ###
@@ -0,0 +1,151 @@
1
+ """add departement links tables for hardware and software
2
+
3
+ Revision ID: dde6be40f54f
4
+ Revises: 9af2df17a9d5
5
+ Create Date: 2025-07-16 21:58:45.737760
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 = "dde6be40f54f"
17
+ down_revision = "9af2df17a9d5"
18
+ branch_labels = None
19
+ depends_on = None
20
+
21
+
22
+ def upgrade():
23
+ # ### commands auto generated by Alembic - please adjust! ###
24
+ op.create_table(
25
+ "hardware_item_department_link",
26
+ sa.Column(
27
+ "department_id",
28
+ sqlalchemy_utils.types.uuid.UUIDType(binary=False),
29
+ default=uuid.uuid4,
30
+ nullable=False,
31
+ ),
32
+ sa.Column(
33
+ "hardware_item_id",
34
+ sqlalchemy_utils.types.uuid.UUIDType(binary=False),
35
+ default=uuid.uuid4,
36
+ nullable=False,
37
+ ),
38
+ sa.Column(
39
+ "id",
40
+ sqlalchemy_utils.types.uuid.UUIDType(binary=False),
41
+ default=uuid.uuid4,
42
+ nullable=False,
43
+ ),
44
+ sa.Column("created_at", sa.DateTime(), nullable=True),
45
+ sa.Column("updated_at", sa.DateTime(), nullable=True),
46
+ sa.ForeignKeyConstraint(
47
+ ["department_id"],
48
+ ["department.id"],
49
+ ),
50
+ sa.ForeignKeyConstraint(
51
+ ["hardware_item_id"],
52
+ ["hardware_item.id"],
53
+ ),
54
+ sa.PrimaryKeyConstraint("department_id", "hardware_item_id", "id"),
55
+ sa.UniqueConstraint(
56
+ "hardware_item_id",
57
+ "department_id",
58
+ name="hardware_item_department_link_uc",
59
+ ),
60
+ )
61
+ with op.batch_alter_table(
62
+ "hardware_item_department_link", schema=None
63
+ ) as batch_op:
64
+ batch_op.create_index(
65
+ batch_op.f("ix_hardware_item_department_link_department_id"),
66
+ ["department_id"],
67
+ unique=False,
68
+ )
69
+ batch_op.create_index(
70
+ batch_op.f("ix_hardware_item_department_link_hardware_item_id"),
71
+ ["hardware_item_id"],
72
+ unique=False,
73
+ )
74
+
75
+ op.create_table(
76
+ "software_department_link",
77
+ sa.Column(
78
+ "department_id",
79
+ sqlalchemy_utils.types.uuid.UUIDType(binary=False),
80
+ default=uuid.uuid4,
81
+ nullable=False,
82
+ ),
83
+ sa.Column(
84
+ "software_id",
85
+ sqlalchemy_utils.types.uuid.UUIDType(binary=False),
86
+ default=uuid.uuid4,
87
+ nullable=False,
88
+ ),
89
+ sa.Column(
90
+ "id",
91
+ sqlalchemy_utils.types.uuid.UUIDType(binary=False),
92
+ default=uuid.uuid4,
93
+ nullable=False,
94
+ ),
95
+ sa.Column("created_at", sa.DateTime(), nullable=True),
96
+ sa.Column("updated_at", sa.DateTime(), nullable=True),
97
+ sa.ForeignKeyConstraint(
98
+ ["department_id"],
99
+ ["department.id"],
100
+ ),
101
+ sa.ForeignKeyConstraint(
102
+ ["software_id"],
103
+ ["software.id"],
104
+ ),
105
+ sa.PrimaryKeyConstraint("department_id", "software_id", "id"),
106
+ sa.UniqueConstraint(
107
+ "department_id", "software_id", name="software_department_link_uc"
108
+ ),
109
+ )
110
+ with op.batch_alter_table(
111
+ "software_department_link", schema=None
112
+ ) as batch_op:
113
+ batch_op.create_index(
114
+ batch_op.f("ix_software_department_link_department_id"),
115
+ ["department_id"],
116
+ unique=False,
117
+ )
118
+ batch_op.create_index(
119
+ batch_op.f("ix_software_department_link_software_id"),
120
+ ["software_id"],
121
+ unique=False,
122
+ )
123
+
124
+ # ### end Alembic commands ###
125
+
126
+
127
+ def downgrade():
128
+ # ### commands auto generated by Alembic - please adjust! ###
129
+ with op.batch_alter_table(
130
+ "software_department_link", schema=None
131
+ ) as batch_op:
132
+ batch_op.drop_index(
133
+ batch_op.f("ix_software_department_link_software_id")
134
+ )
135
+ batch_op.drop_index(
136
+ batch_op.f("ix_software_department_link_department_id")
137
+ )
138
+
139
+ op.drop_table("software_department_link")
140
+ with op.batch_alter_table(
141
+ "hardware_item_department_link", schema=None
142
+ ) as batch_op:
143
+ batch_op.drop_index(
144
+ batch_op.f("ix_hardware_item_department_link_hardware_item_id")
145
+ )
146
+ batch_op.drop_index(
147
+ batch_op.f("ix_hardware_item_department_link_department_id")
148
+ )
149
+
150
+ op.drop_table("hardware_item_department_link")
151
+ # ### end Alembic commands ###
@@ -0,0 +1,56 @@
1
+ """Add Project.production_schedule_version_id
2
+
3
+ Revision ID: e4b48ca33539
4
+ Revises: 26f96f65cfa3
5
+ Create Date: 2025-07-22 02:57:31.987773
6
+
7
+ """
8
+
9
+ from alembic import op
10
+ import sqlalchemy as sa
11
+ import sqlalchemy_utils
12
+ import uuid
13
+
14
+ # revision identifiers, used by Alembic.
15
+ revision = "e4b48ca33539"
16
+ down_revision = "26f96f65cfa3"
17
+ branch_labels = None
18
+ depends_on = None
19
+
20
+
21
+ def upgrade():
22
+ # ### commands auto generated by Alembic - please adjust! ###
23
+ with op.batch_alter_table("project", schema=None) as batch_op:
24
+ batch_op.add_column(
25
+ sa.Column(
26
+ "from_schedule_version_id",
27
+ sqlalchemy_utils.types.uuid.UUIDType(binary=False),
28
+ default=uuid.uuid4,
29
+ nullable=True,
30
+ )
31
+ )
32
+ batch_op.create_index(
33
+ batch_op.f("ix_project_from_schedule_version_id"),
34
+ ["from_schedule_version_id"],
35
+ unique=False,
36
+ )
37
+ batch_op.create_foreign_key(
38
+ None,
39
+ "production_schedule_version",
40
+ ["from_schedule_version_id"],
41
+ ["id"],
42
+ )
43
+
44
+ # ### end Alembic commands ###
45
+
46
+
47
+ def downgrade():
48
+ # ### commands auto generated by Alembic - please adjust! ###
49
+ with op.batch_alter_table("project", schema=None) as batch_op:
50
+ batch_op.drop_constraint(
51
+ "project_from_schedule_version_id_fkey", type_="foreignkey"
52
+ )
53
+ batch_op.drop_index(batch_op.f("ix_project_from_schedule_version_id"))
54
+ batch_op.drop_column("from_schedule_version_id")
55
+
56
+ # ### end Alembic commands ###
@@ -0,0 +1,59 @@
1
+ """Remove on delete cascade for ProductionScheduleVersion.production_schedule_from
2
+
3
+ Revision ID: e8bc24998b34
4
+ Revises: 4368137b44e1
5
+ Create Date: 2025-07-24 14:37:53.406897
6
+
7
+ """
8
+
9
+ from alembic import op
10
+
11
+
12
+ # revision identifiers, used by Alembic.
13
+ revision = "e8bc24998b34"
14
+ down_revision = "4368137b44e1"
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(
22
+ "production_schedule_version", schema=None
23
+ ) as batch_op:
24
+ batch_op.drop_constraint(
25
+ batch_op.f(
26
+ "production_schedule_version_production_schedule_from_fkey"
27
+ ),
28
+ type_="foreignkey",
29
+ )
30
+ batch_op.create_foreign_key(
31
+ None,
32
+ "production_schedule_version",
33
+ ["production_schedule_from"],
34
+ ["id"],
35
+ )
36
+
37
+ # ### end Alembic commands ###
38
+
39
+
40
+ def downgrade():
41
+ # ### commands auto generated by Alembic - please adjust! ###
42
+ with op.batch_alter_table(
43
+ "production_schedule_version", schema=None
44
+ ) as batch_op:
45
+ batch_op.drop_constraint(
46
+ "production_schedule_version_production_schedule_from_fkey",
47
+ type_="foreignkey",
48
+ )
49
+ batch_op.create_foreign_key(
50
+ batch_op.f(
51
+ "production_schedule_version_production_schedule_from_fkey"
52
+ ),
53
+ "production_schedule_version",
54
+ ["production_schedule_from"],
55
+ ["id"],
56
+ ondelete="CASCADE",
57
+ )
58
+
59
+ # ### end Alembic commands ###
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: zou
3
- Version: 0.20.61
3
+ Version: 0.20.63
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
@@ -53,7 +53,7 @@ Requires-Dist: numpy==2.2.6
53
53
  Requires-Dist: opencv-python==4.12.0.88
54
54
  Requires-Dist: OpenTimelineIO==0.17.0
55
55
  Requires-Dist: OpenTimelineIO-Plugins==0.17.0
56
- Requires-Dist: orjson==3.11.0
56
+ Requires-Dist: orjson==3.11.1
57
57
  Requires-Dist: pillow==11.3.0
58
58
  Requires-Dist: psutil==7.0.0
59
59
  Requires-Dist: psycopg[binary]==3.2.9
@@ -81,7 +81,7 @@ Requires-Dist: gevent; extra == "prod"
81
81
  Provides-Extra: dev
82
82
  Requires-Dist: wheel; extra == "dev"
83
83
  Provides-Extra: test
84
- Requires-Dist: fakeredis==2.30.1; extra == "test"
84
+ Requires-Dist: fakeredis==2.30.2; extra == "test"
85
85
  Requires-Dist: mixer==7.2.2; extra == "test"
86
86
  Requires-Dist: pytest-cov==6.2.1; extra == "test"
87
87
  Requires-Dist: pytest==8.4.1; extra == "test"