Fixed python time again.. and again..

This commit is contained in:
Brage Skjønborg 2026-01-23 02:06:16 +01:00
parent 9780923e6a
commit dd3de9b380
2 changed files with 37 additions and 22 deletions

View File

@ -1,17 +1,19 @@
import json import json
from typing import Optional from typing import Optional
from uuid import UUID
from db.database import Database from db.database import Database
from models.enums import TaskStatus from models.enums import TaskStatus
from models.event import MetadataSearchResultEvent from models.event import MetadataSearchResultEvent
from models.task import MetadataSearchPayload, Task, MetadataSearchTask, MetadataSearchData from models.task import MetadataSearchPayload, MetadataSearchTask
from utils.logger import logger from utils.logger import logger
from utils.time import parse_mysql_ts, utc_now from utils.time import parse_mysql_ts, utc_now
def fetch_next_task(db: Database) -> Optional[Task]: def fetch_next_task(db: Database) -> Optional[MetadataSearchTask]:
db.validate() db.validate()
cursor = db.conn.cursor(dictionary=True) cursor = db.conn.cursor(dictionary=True)
cursor.execute( cursor.execute(
"SELECT * FROM TASKS WHERE TASK='MetadataSearchTask' AND STATUS='Pending' AND CLAIMED=0 AND CONSUMED=0 " "SELECT * FROM TASKS "
"WHERE TASK='MetadataSearchTask' AND STATUS='Pending' AND CLAIMED=0 AND CONSUMED=0 "
"ORDER BY PERSISTED_AT ASC LIMIT 1" "ORDER BY PERSISTED_AT ASC LIMIT 1"
) )
row = cursor.fetchone() row = cursor.fetchone()
@ -19,29 +21,41 @@ def fetch_next_task(db: Database) -> Optional[Task]:
return None return None
try: try:
if row["TASK"] == "MetadataSearchTask": # 1. Parse payload (JSON → Pydantic)
# hele JSON ligger i DATA payload = MetadataSearchPayload.model_validate_json(row["DATA"])
payload = MetadataSearchPayload.model_validate_json(row["DATA"])
return MetadataSearchTask( # 2. Parse UUIDs (DB gir str → modellen krever UUID)
referenceId=row["REFERENCE_ID"], reference_id = UUID(row["REFERENCE_ID"])
taskId=row["TASK_ID"], task_id = UUID(row["TASK_ID"])
task=row["TASK"],
status=row["STATUS"], # 3. Parse enum (DB gir str → modellen krever TaskStatus)
data=payload.data, status = TaskStatus(row["STATUS"])
claimed=row["CLAIMED"],
claimedBy=row["CLAIMED_BY"], # 4. Parse timestamps (DB gir str → modellen krever datetime)
consumed=row["CONSUMED"], last_check_in = parse_mysql_ts(row["LAST_CHECK_IN"])
lastCheckIn=parse_mysql_ts(row["LAST_CHECK_IN"]), persisted_at = parse_mysql_ts(row["PERSISTED_AT"])
persistedAt=parse_mysql_ts(row["PERSISTED_AT"])
) # 5. Bygg modellen med riktige typer
else: return MetadataSearchTask(
return None referenceId=reference_id,
except Exception as e: taskId=task_id,
logger.error(f"❌ Feil ved deserialisering av task {row.get('TASK_ID')}: {e}") task=row["TASK"],
status=status,
data=payload.data,
claimed=row["CLAIMED"],
claimedBy=row["CLAIMED_BY"],
consumed=row["CONSUMED"],
lastCheckIn=last_check_in,
persistedAt=persisted_at
)
except Exception:
logger.exception(f"❌ Feil ved deserialisering av task {row.get('TASK_ID')}")
mark_failed(db, row["TASK_ID"]) mark_failed(db, row["TASK_ID"])
return None return None
def mark_failed(db: Database, task_id: str) -> None: def mark_failed(db: Database, task_id: str) -> None:
cursor = db.conn.cursor() cursor = db.conn.cursor()
cursor.execute( cursor.execute(

View File

@ -8,3 +8,4 @@ def parse_mysql_ts(value):
if value is None: if value is None:
return None return None
return datetime.strptime(value, "%Y-%m-%d %H:%M:%S.%f").replace(tzinfo=timezone.utc) return datetime.strptime(value, "%Y-%m-%d %H:%M:%S.%f").replace(tzinfo=timezone.utc)