Skip to content

_aux_functions_tasks

Auxiliary functions to get task and task-group object from the database or perform simple checks

_get_task_full_access(*, task_id, user_id, db) async

Get an existing task or raise a 404.

Parameters:

Name Type Description Default
task_id int

ID of the required task.

required
user_id int

ID of the current user.

required
db AsyncSession

An asynchronous db session.

required
Source code in fractal_server/app/routes/api/v2/_aux_functions_tasks.py
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
async def _get_task_full_access(
    *,
    task_id: int,
    user_id: int,
    db: AsyncSession,
) -> TaskV2:
    """
    Get an existing task or raise a 404.

    Arguments:
        task_id: ID of the required task.
        user_id: ID of the current user.
        db: An asynchronous db session.
    """
    task = await _get_task_or_404(task_id=task_id, db=db)
    await _get_task_group_full_access(
        task_group_id=task.taskgroupv2_id, user_id=user_id, db=db
    )
    return task

_get_task_group_full_access(*, task_group_id, user_id, db) async

Get a task group or raise a 403 if user has no full access.

Parameters:

Name Type Description Default
task_group_id int

ID of the required task group.

required
user_id int

ID of the current user.

required
db AsyncSession

An asynchronous db session

required
Source code in fractal_server/app/routes/api/v2/_aux_functions_tasks.py
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
async def _get_task_group_full_access(
    *,
    task_group_id: int,
    user_id: int,
    db: AsyncSession,
) -> TaskGroupV2:
    """
    Get a task group or raise a 403 if user has no full access.

    Arguments:
        task_group_id: ID of the required task group.
        user_id: ID of the current user.
        db: An asynchronous db session
    """
    task_group = await _get_task_group_or_404(
        task_group_id=task_group_id, db=db
    )

    if task_group.user_id == user_id:
        return task_group
    else:
        raise HTTPException(
            status_code=status.HTTP_403_FORBIDDEN,
            detail=(
                "Current user has no full access to "
                f"TaskGroupV2 {task_group_id}.",
            ),
        )

_get_task_group_or_404(*, task_group_id, db) async

Get an existing task group or raise a 404.

Parameters:

Name Type Description Default
task_group_id int

The TaskGroupV2 id

required
db AsyncSession

An asynchronous db session

required
Source code in fractal_server/app/routes/api/v2/_aux_functions_tasks.py
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
async def _get_task_group_or_404(
    *, task_group_id: int, db: AsyncSession
) -> TaskGroupV2:
    """
    Get an existing task group or raise a 404.

    Arguments:
        task_group_id: The TaskGroupV2 id
        db: An asynchronous db session
    """
    task_group = await db.get(TaskGroupV2, task_group_id)
    if task_group is None:
        raise HTTPException(
            status_code=status.HTTP_404_NOT_FOUND,
            detail=f"TaskGroupV2 {task_group_id} not found",
        )
    return task_group

_get_task_group_read_access(*, task_group_id, user_id, db) async

Get a task group or raise a 403 if user has no read access.

Parameters:

Name Type Description Default
task_group_id int

ID of the required task group.

required
user_id int

ID of the current user.

required
db AsyncSession

An asynchronous db session.

required
Source code in fractal_server/app/routes/api/v2/_aux_functions_tasks.py
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
async def _get_task_group_read_access(
    *,
    task_group_id: int,
    user_id: int,
    db: AsyncSession,
) -> TaskGroupV2:
    """
    Get a task group or raise a 403 if user has no read access.

    Arguments:
        task_group_id: ID of the required task group.
        user_id: ID of the current user.
        db: An asynchronous db session.
    """
    task_group = await _get_task_group_or_404(
        task_group_id=task_group_id, db=db
    )

    # Prepare exception to be used below
    forbidden_exception = HTTPException(
        status_code=status.HTTP_403_FORBIDDEN,
        detail=(
            "Current user has no read access to TaskGroupV2 "
            f"{task_group_id}.",
        ),
    )

    if task_group.user_id == user_id:
        return task_group
    elif task_group.user_group_id is None:
        raise forbidden_exception
    else:
        stm = (
            select(LinkUserGroup)
            .where(LinkUserGroup.group_id == task_group.user_group_id)
            .where(LinkUserGroup.user_id == user_id)
        )
        res = await db.execute(stm)
        link = res.scalar_one_or_none()
        if link is None:
            raise forbidden_exception
        else:
            return task_group

_get_task_or_404(*, task_id, db) async

Get an existing task or raise a 404.

Parameters:

Name Type Description Default
task_id int

ID of the required task.

required
db AsyncSession

An asynchronous db session

required
Source code in fractal_server/app/routes/api/v2/_aux_functions_tasks.py
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
async def _get_task_or_404(*, task_id: int, db: AsyncSession) -> TaskV2:
    """
    Get an existing task or raise a 404.

    Arguments:
        task_id: ID of the required task.
        db: An asynchronous db session
    """
    task = await db.get(TaskV2, task_id)
    if task is None:
        raise HTTPException(
            status_code=status.HTTP_404_NOT_FOUND,
            detail=f"TaskV2 {task_id} not found",
        )
    return task

_get_task_read_access(*, task_id, user_id, db, require_active=False) async

Get an existing task or raise a 404.

Parameters:

Name Type Description Default
task_id int

ID of the required task.

required
user_id int

ID of the current user.

required
db AsyncSession

An asynchronous db session.

required
require_active bool

If set, fail when the task group is not active

False
Source code in fractal_server/app/routes/api/v2/_aux_functions_tasks.py
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
async def _get_task_read_access(
    *,
    task_id: int,
    user_id: int,
    db: AsyncSession,
    require_active: bool = False,
) -> TaskV2:
    """
    Get an existing task or raise a 404.

    Arguments:
        task_id: ID of the required task.
        user_id: ID of the current user.
        db: An asynchronous db session.
        require_active: If set, fail when the task group is not `active`
    """
    task = await _get_task_or_404(task_id=task_id, db=db)
    task_group = await _get_task_group_read_access(
        task_group_id=task.taskgroupv2_id, user_id=user_id, db=db
    )
    if require_active:
        if not task_group.active:
            raise HTTPException(
                status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
                detail=f"Error: task {task_id} ({task.name}) is not active.",
            )
    return task

_get_valid_user_group_id(*, user_group_id=None, private, user_id, db) async

Validate query parameters for endpoints that create some task(s).

Parameters:

Name Type Description Default
user_group_id Optional[int]
None
private bool
required
user_id int

ID of the current user

required
db AsyncSession

An asynchronous db session.

required
Source code in fractal_server/app/routes/api/v2/_aux_functions_tasks.py
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
async def _get_valid_user_group_id(
    *,
    user_group_id: Optional[int] = None,
    private: bool,
    user_id: int,
    db: AsyncSession,
) -> Optional[int]:
    """
    Validate query parameters for endpoints that create some task(s).

    Arguments:
        user_group_id:
        private:
        user_id: ID of the current user
        db: An asynchronous db session.
    """
    if (user_group_id is not None) and (private is True):
        raise HTTPException(
            status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
            detail=f"Cannot set both {user_group_id=} and {private=}",
        )
    elif private is True:
        user_group_id = None
    elif user_group_id is None:
        user_group_id = await _get_default_usergroup_id(db=db)
    else:
        await _verify_user_belongs_to_group(
            user_id=user_id, user_group_id=user_group_id, db=db
        )
    return user_group_id