Skip to content

Commit

Permalink
feat(lab-3295): add new method to update project workflow
Browse files Browse the repository at this point in the history
  • Loading branch information
florianlega committed Dec 20, 2024
1 parent be8ac9a commit 243f735
Show file tree
Hide file tree
Showing 9 changed files with 142 additions and 0 deletions.
4 changes: 4 additions & 0 deletions src/kili/adapters/kili_api_gateway/kili_api_gateway.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,9 @@
OrganizationOperationMixin,
)
from kili.adapters.kili_api_gateway.project.operations_mixin import ProjectOperationMixin
from kili.adapters.kili_api_gateway.project_workflow.operations_mixin import (
ProjectWorkflowOperationMixin,
)
from kili.adapters.kili_api_gateway.tag import TagOperationMixin
from kili.adapters.kili_api_gateway.user.operation_mixin import UserOperationMixin
from kili.core.graphql.graphql_client import GraphQLClient
Expand All @@ -32,6 +35,7 @@ class KiliAPIGateway(
NotificationOperationMixin,
OrganizationOperationMixin,
ProjectOperationMixin,
ProjectWorkflowOperationMixin,
TagOperationMixin,
UserOperationMixin,
EventOperationMixin,
Expand Down
Empty file.
12 changes: 12 additions & 0 deletions src/kili/adapters/kili_api_gateway/project_workflow/mappers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
"""GraphQL payload data mappers for project operations."""

from typing import Dict

from .types import ProjectWorkflowDataKiliAPIGatewayInput


def project_input_mapper(data: ProjectWorkflowDataKiliAPIGatewayInput) -> Dict:
"""Build the GraphQL ProjectWorfklowData variable to be sent in an operation."""
return {
"enforceStepSeparation": data.enforce_step_separation,
}
12 changes: 12 additions & 0 deletions src/kili/adapters/kili_api_gateway/project_workflow/operations.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
"""GraphQL Project Workflow operations."""


def get_update_properties_in_project_workflow_mutation(fragment: str) -> str:
"""Return the GraphQL editProjectWorkflowSettings mutation."""
return f"""
mutation editProjectWorkflowSettings($input: EditProjectWorkflowSettingsInput!) {{
data: editProjectWorkflowSettings(input: $input) {{
{fragment}
}}
}}
"""
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
"""Mixin extending Kili API Gateway class with Projects related operations."""

from typing import Dict

from kili.adapters.kili_api_gateway.base import BaseOperationMixin
from kili.adapters.kili_api_gateway.helpers.queries import (
fragment_builder,
)
from kili.domain.project import ProjectId

from .mappers import project_input_mapper
from .operations import (
get_update_properties_in_project_workflow_mutation,
)
from .types import ProjectWorkflowDataKiliAPIGatewayInput


class ProjectWorkflowOperationMixin(BaseOperationMixin):
"""Mixin extending Kili API Gateway class with Projects workflow related operations."""

def update_properties_in_project_workflow(
self,
project_id: ProjectId,
project_data: ProjectWorkflowDataKiliAPIGatewayInput,
) -> Dict:
"""Update properties in a project workflow."""
project_workflow_data = project_input_mapper(data=project_data)

fields = tuple(name for name, val in project_workflow_data.items() if val is not None)
fragment = fragment_builder(fields)
mutation = get_update_properties_in_project_workflow_mutation(fragment)

project_workflow_data["projectId"] = project_id

variables = {"input": project_workflow_data}
result = self.graphql_client.execute(mutation, variables)
return result["data"]
12 changes: 12 additions & 0 deletions src/kili/adapters/kili_api_gateway/project_workflow/types.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
"""Types for the ProjectWorkflow-related Kili API gateway functions."""

from dataclasses import dataclass
from typing import Optional


@dataclass
# pylint: disable=too-many-instance-attributes
class ProjectWorkflowDataKiliAPIGatewayInput:
"""ProjectWorkflow input data for Kili API Gateway."""

enforce_step_separation: Optional[bool]
2 changes: 2 additions & 0 deletions src/kili/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
from kili.presentation.client.notification import NotificationClientMethods
from kili.presentation.client.organization import OrganizationClientMethods
from kili.presentation.client.project import ProjectClientMethods
from kili.presentation.client.project_workflow import ProjectWorkflowClientMethods
from kili.presentation.client.tag import TagClientMethods
from kili.presentation.client.user import UserClientMethods
from kili.use_cases.api_key import ApiKeyUseCases
Expand Down Expand Up @@ -68,6 +69,7 @@ class Kili( # pylint: disable=too-many-ancestors,too-many-instance-attributes
NotificationClientMethods,
OrganizationClientMethods,
ProjectClientMethods,
ProjectWorkflowClientMethods,
TagClientMethods,
UserClientMethods,
):
Expand Down
36 changes: 36 additions & 0 deletions src/kili/presentation/client/project_workflow.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
"""Client presentation methods for questions."""

from typing import Any, Dict, Optional

from typeguard import typechecked

from kili.domain.project import ProjectId
from kili.use_cases.project_workflow import ProjectWorkflowUseCases

from .base import BaseClientMethods


class ProjectWorkflowClientMethods(BaseClientMethods):
"""Client presentation methods for project workflow."""

@typechecked
def update_project_workflow(
self,
project_id: str,
enforce_step_separation: Optional[bool] = None,
) -> Dict[str, Any]:
"""Update properties of a project workflow.
Args:
project_id: Id of the project.
enforce_step_separation: Prevents the same user from being assigned to multiple steps in the workflow for a same asset,
ensuring independent review and labeling processes
Returns:
A dict with the changed properties which indicates if the mutation was successful,
else an error message.
"""
return ProjectWorkflowUseCases(self.kili_api_gateway).update_project_workflow(
project_id=ProjectId(project_id),
enforce_step_separation=enforce_step_separation,
)
27 changes: 27 additions & 0 deletions src/kili/use_cases/project_workflow/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
"""Project use cases."""

from typing import Dict, Optional

from kili.adapters.kili_api_gateway.project_workflow.types import (
ProjectWorkflowDataKiliAPIGatewayInput,
)
from kili.domain.project import ProjectId
from kili.use_cases.base import BaseUseCases


class ProjectWorkflowUseCases(BaseUseCases):
"""ProjectWorkflow use cases."""

def update_project_workflow(
self,
project_id: ProjectId,
enforce_step_separation: Optional[bool] = None,
) -> Dict[str, object]:
"""Update properties in a project workflow."""
project_workflow_data = ProjectWorkflowDataKiliAPIGatewayInput(
enforce_step_separation=enforce_step_separation,
)

return self._kili_api_gateway.update_properties_in_project_workflow(
project_id, project_workflow_data
)

0 comments on commit 243f735

Please sign in to comment.