From defacddf5d6d4a1757657e3f191b6461ae386395 Mon Sep 17 00:00:00 2001 From: fatpeppapig Date: Mon, 1 Jun 2026 12:50:05 +0200 Subject: [PATCH 1/2] IMP: Added assignees to case tasks response in REST V2 API. --- source/app/models/models.py | 1 + source/app/schema/marshables.py | 13 +++++++++++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/source/app/models/models.py b/source/app/models/models.py index 66cd380ef..926d18a1e 100644 --- a/source/app/models/models.py +++ b/source/app/models/models.py @@ -416,6 +416,7 @@ class CaseTasks(db.Model): user_close = relationship('User', foreign_keys=[task_userid_close]) user_update = relationship('User', foreign_keys=[task_userid_update]) status = relationship('TaskStatus', foreign_keys=[task_status_id]) + task_assignees = relationship('TaskAssignee', foreign_keys='TaskAssignee.task_id', overlaps='task', viewonly=True) class Tags(db.Model): diff --git a/source/app/schema/marshables.py b/source/app/schema/marshables.py index 4c039e086..e7608118e 100644 --- a/source/app/schema/marshables.py +++ b/source/app/schema/marshables.py @@ -1894,6 +1894,12 @@ class Meta: unknown = EXCLUDE +class TaskAssigneeForTaskSchema(ma.Schema): + id = fields.Integer(attribute='user.id') + user = fields.String(attribute='user.user') + name = fields.String(attribute='user.name') + + class CaseTaskSchema(ma.SQLAlchemyAutoSchema): """Schema for serializing and deserializing CaseTask objects. @@ -1903,11 +1909,14 @@ class CaseTaskSchema(ma.SQLAlchemyAutoSchema): """ task_title: str = auto_field('task_title', required=True, validate=Length(min=2), allow_none=False) task_status_id: int = auto_field('task_status_id', required=True) - task_assignees_id: Optional[List[int]] = fields.List(fields.Integer, required=False, allow_none=True) - task_assignees: Optional[List[Dict[str, Any]]] = fields.List(fields.Dict, required=False, allow_none=True) + task_assignees_id = fields.Method('get_task_assignees_id', dump_only=True) + task_assignees = ma.Nested(TaskAssigneeForTaskSchema, many=True, dump_only=True) status = ma.Nested(TaskStatusSchema) case = ma.Nested(CaseSchema, only=['case_name', 'case_id']) + def get_task_assignees_id(self, obj): + return [ta.user_id for ta in (obj.task_assignees or [])] + class Meta: model = CaseTasks load_instance = True From ebd32b964f4ab54639f0e141e60cf0151d178149 Mon Sep 17 00:00:00 2001 From: fatpeppapig Date: Mon, 1 Jun 2026 14:26:15 +0200 Subject: [PATCH 2/2] Added case users endpoint. --- source/app/blueprints/rest/v2/cases.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/source/app/blueprints/rest/v2/cases.py b/source/app/blueprints/rest/v2/cases.py index 6e3f57846..41b2d7868 100644 --- a/source/app/blueprints/rest/v2/cases.py +++ b/source/app/blueprints/rest/v2/cases.py @@ -51,6 +51,7 @@ from app.business.cases import cases_filter from app.schema.marshables import CaseSchemaForAPIV2 from app.schema.marshables import CaseDetailsSchema +from app.datamgmt.manage.manage_users_db import get_users_list_restricted_from_case from app.blueprints.access_controls import ac_api_requires from app.blueprints.access_controls import ac_current_user_has_customer_access from app.blueprints.access_controls import ac_fast_check_current_user_has_case_access @@ -365,3 +366,14 @@ def rest_v2_cases_update(identifier): @ac_api_requires(Permissions.standard_user) def case_routes_delete(identifier): return cases_operations.delete(identifier) + + +@cases_blueprint.get('//users') +@ac_api_requires() +def case_get_users(case_identifier): + if not ac_fast_check_current_user_has_case_access(case_identifier, + [CaseAccessLevel.read_only, CaseAccessLevel.full_access]): + return ac_api_return_access_denied(caseid=case_identifier) + + users = get_users_list_restricted_from_case(case_identifier) + return response_api_success(users)