Skip to content

Commit 90eacda

Browse files
committed
feat: added qualifications check in POST /assignment endpoint
1 parent 1a898e5 commit 90eacda

File tree

4 files changed

+26
-4
lines changed

4 files changed

+26
-4
lines changed

packages/examples/cvat/exchange-oracle/src/endpoints/authentication.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,10 @@ class AuthorizationData(BaseModel):
3737
email: str
3838

3939

40+
class AssignmentAuthorizationData(AuthorizationData):
41+
qualifications: list[str]
42+
43+
4044
AuthDataT = TypeVar("AuthDataT", bound=AuthorizationData)
4145

4246

packages/examples/cvat/exchange-oracle/src/endpoints/exchange.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
from src.db import SessionLocal
1919
from src.db import engine as db_engine
2020
from src.endpoints.authentication import (
21+
AssignmentAuthorizationData,
2122
AuthorizationData,
2223
AuthorizationParam,
2324
JobListAuthorizationData,
@@ -395,13 +396,17 @@ def _page_serializer(
395396
description="Start an assignment within the task for the annotator",
396397
)
397398
async def create_assignment(
398-
data: AssignmentRequest, token: Annotated[AuthorizationData, AuthorizationParam]
399+
data: AssignmentRequest,
400+
token: Annotated[
401+
AssignmentAuthorizationData, make_auth_dependency(AssignmentAuthorizationData)
402+
],
399403
) -> AssignmentResponse:
400404
try:
401405
assignment_id = oracle_service.create_assignment(
402406
escrow_address=data.escrow_address,
403407
chain_id=data.chain_id,
404408
wallet_address=token.wallet_address,
409+
qualifications=token.qualifications,
405410
)
406411
except oracle_service.UserHasUnfinishedAssignmentError as e:
407412
raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail=str(e)) from e

packages/examples/cvat/exchange-oracle/src/services/cvat.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -973,7 +973,7 @@ def get_user_assignments_in_cvat_projects(
973973

974974
def has_active_user_assignments(
975975
session: Session,
976-
wallet_address: int,
976+
wallet_address: str,
977977
escrow_address: str,
978978
chain_id: int,
979979
) -> bool:

packages/examples/cvat/exchange-oracle/src/services/exchange.py

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,12 @@
33

44
import src.cvat.api_calls as cvat_api
55
import src.services.cvat as cvat_service
6+
from src.chain.escrow import get_escrow_manifest
67
from src.core.types import JobStatuses, Networks, ProjectStatuses, TaskTypes
78
from src.db import SessionLocal
89
from src.db.utils import ForUpdateParams
910
from src.models.cvat import Job
10-
from src.utils.assignments import get_default_assignment_timeout
11+
from src.utils.assignments import get_default_assignment_timeout, parse_manifest
1112
from src.utils.requests import get_or_404
1213
from src.utils.time import utcnow
1314

@@ -20,14 +21,26 @@ def __str__(self) -> str:
2021
)
2122

2223

23-
def create_assignment(escrow_address: str, chain_id: Networks, wallet_address: str) -> str | None:
24+
class UserQualificationError(Exception):
25+
def __str__(self) -> str:
26+
return "User doesn't have required qualifications."
27+
28+
29+
def create_assignment(
30+
escrow_address: str, chain_id: Networks, wallet_address: str, qualifications: list[str]
31+
) -> str | None:
2432
with SessionLocal.begin() as session:
2533
user = get_or_404(
2634
cvat_service.get_user_by_id(session, wallet_address, for_update=True),
2735
wallet_address,
2836
object_type_name="user",
2937
)
3038

39+
manifest = parse_manifest(get_escrow_manifest(chain_id, escrow_address))
40+
41+
if not all(q in qualifications for q in manifest.qualifications):
42+
raise UserQualificationError
43+
3144
if cvat_service.has_active_user_assignments(
3245
session,
3346
wallet_address=wallet_address,

0 commit comments

Comments
 (0)