aboutsummaryrefslogtreecommitdiff
path: root/jb/managers/amt.py
diff options
context:
space:
mode:
authorMax Nanis2026-09-13 19:03:55 +0000
committerMax Nanis2026-09-13 19:03:55 +0000
commit8fbe8d439b418796932aaa88297e006c714e4d13 (patch)
tree6c800476edc1e771fc570b559d483df8d59d4324 /jb/managers/amt.py
parent12f6fee851b68e86af658dfa17e4a0daed457dd1 (diff)
parent2c94f248d2438071a918fa9a30bf114ef9aa29b4 (diff)
downloadamt-jb-8fbe8d439b418796932aaa88297e006c714e4d13.tar.gz
amt-jb-8fbe8d439b418796932aaa88297e006c714e4d13.zip
Merges pull request #3
Off of Amazon!!!
Diffstat (limited to 'jb/managers/amt.py')
-rw-r--r--jb/managers/amt.py47
1 files changed, 20 insertions, 27 deletions
diff --git a/jb/managers/amt.py b/jb/managers/amt.py
index 88ae07d..17e5630 100644
--- a/jb/managers/amt.py
+++ b/jb/managers/amt.py
@@ -1,25 +1,24 @@
-import logging
-from datetime import timezone, datetime
-from typing import Tuple, Optional, List, Dict, Any
+from datetime import datetime, timezone
+from typing import Any
import botocore.exceptions
-from generalresearchutils.currency import USDCent
+from generalresearch.currency import USDCent
from mypy_boto3_mturk import MTurkClient
from mypy_boto3_mturk.type_defs import (
AssignmentTypeDef,
BonusPaymentTypeDef,
CreateHITTypeResponseTypeDef,
- GetHITResponseTypeDef,
CreateHITWithHITTypeResponseTypeDef,
+ GetHITResponseTypeDef,
)
from pydantic import ValidationError
from jb.config import TOPIC_ARN
-from jb.models import AMTAccount
+from jb.models.amt import AMTAccount
from jb.models.assignment import Assignment
from jb.models.bonus import Bonus
from jb.models.definitions import HitStatus
-from jb.models.hit import HitType, HitQuestion, Hit
+from jb.models.hit import Hit, HitQuestion, HitType
REJECT_MESSAGE_UNKNOWN_ASSIGNMENT = "Unknown assignment"
REJECT_MESSAGE_NO_WORK = "Assignment was submitted with no attempted work."
@@ -56,7 +55,7 @@ class AMTManager:
}
)
- def get_hit_if_exists(self, amt_hit_id: str) -> Tuple[Optional[Hit], Optional[str]]:
+ def get_hit_if_exists(self, amt_hit_id: str) -> tuple[Hit | None, str | None]:
try:
res: GetHITResponseTypeDef = self.amt_client.get_hit(HITId=amt_hit_id)
@@ -78,7 +77,7 @@ class AMTManager:
return HitStatus.Disposed
else:
- logging.warning(msg)
+ LOG.warning(msg)
return HitStatus.Unassignable
return res.status
@@ -137,7 +136,7 @@ class AMTManager:
# Baddies have been known to submit assignments with purposely
# malformed "answer" (xml) section, which will raise
# a pydantic validation error. Try to parse again with no Answer.
- logging.exception(e)
+ LOG.exception(e)
ass_res["Answer"] = None
# If it wasn't the Answer that caused the ValidationError, it'll raise again
assignment = Assignment.from_amt_get_assignment(ass_res)
@@ -146,13 +145,13 @@ class AMTManager:
assert assignment.id is None
return assignment
- def get_assignment_if_exists(self, amt_assignment_id: str) -> Optional[Assignment]:
+ def get_assignment_if_exists(self, amt_assignment_id: str) -> Assignment | None:
expected_err_msg = f"Assignment {amt_assignment_id} does not exist"
try:
return self.get_assignment(amt_assignment_id=amt_assignment_id)
except botocore.exceptions.ClientError as e:
- logging.warning(e)
+ LOG.warning(e)
error_code = e.response["Error"]["Code"]
error_msg = e.response["Error"]["Message"]
if error_code == "RequestError" and expected_err_msg in error_msg:
@@ -161,7 +160,7 @@ class AMTManager:
def reject_assignment_if_possible(
self, amt_assignment_id: str, msg: str = REJECT_MESSAGE_UNKNOWN_ASSIGNMENT
- ) -> Optional[Dict[str, Any]]:
+ ) -> dict[str, Any] | None:
# Unclear to me when this would fail
try:
@@ -170,7 +169,7 @@ class AMTManager:
)
except botocore.exceptions.ClientError as e:
- logging.warning(e)
+ LOG.warning(e)
return None
def approve_assignment_if_possible(
@@ -178,7 +177,7 @@ class AMTManager:
amt_assignment_id: str,
msg: str = APPROVAL_MESSAGE,
override_rejection: bool = False,
- ) -> Optional[Dict[str, Any]]:
+ ) -> dict[str, Any] | None:
# Unclear to me when this would fail
try:
@@ -189,7 +188,7 @@ class AMTManager:
)
except botocore.exceptions.ClientError as e:
- logging.warning(e)
+ LOG.warning(e)
return None
def update_hit_review_status(self, amt_hit_id: str, revert: bool = False) -> None:
@@ -198,7 +197,7 @@ class AMTManager:
self.amt_client.update_hit_review_status(HITId=amt_hit_id, Revert=revert)
except botocore.exceptions.ClientError as e:
- logging.warning(f"{amt_hit_id=}, {e}")
+ LOG.warning(f"{amt_hit_id=}, {e}")
error_msg = e.response["Error"]["Message"]
if "does not exist" in error_msg:
@@ -207,8 +206,6 @@ class AMTManager:
# elif "This HIT is currently in the state 'Reviewing'" in error_msg:
# logging.warning(error_msg)
- return None
-
def send_bonus(
self,
amt_worker_id: str,
@@ -216,7 +213,7 @@ class AMTManager:
amt_assignment_id: str,
reason: str,
unique_request_token: str,
- ) -> Optional[Dict[str, Any]]:
+ ) -> dict[str, Any] | None:
try:
return self.amt_client.send_bonus(
WorkerId=amt_worker_id,
@@ -227,14 +224,12 @@ class AMTManager:
)
except botocore.exceptions.ClientError as e:
- logging.warning(f"{amt_worker_id=} {amt_assignment_id=}, {e}")
+ LOG.warning(f"{amt_worker_id=} {amt_assignment_id=}, {e}")
return None
- def get_bonus(
- self, amt_assignment_id: str, payout_event_id: str
- ) -> Optional[Bonus]:
+ def get_bonus(self, amt_assignment_id: str, payout_event_id: str) -> Bonus | None:
- res: List[BonusPaymentTypeDef] = self.amt_client.list_bonus_payments(
+ res: list[BonusPaymentTypeDef] = self.amt_client.list_bonus_payments(
AssignmentId=amt_assignment_id
)["BonusPayments"]
@@ -268,5 +263,3 @@ class AMTManager:
self.amt_client.update_expiration_for_hit(
HITId=hit["HITId"], ExpireAt=now
)
-
- return None