bmc_hub/app/timetracking/backend/timer_transaction.py
Christian 85e019783b Add comprehensive test coverage for case creation, assignment, and remote recovery
- Introduced tests for case creation commands, ensuring proper handling of UUIDs and payloads.
- Added tests for v5 assignment functionality, validating employee identification and group assignment.
- Implemented tests for remote recovery scenarios, including handling network failures and response validation.
- Created tests for hardware label generation and validation, ensuring proper URL formatting and QR code generation.
- Developed extensive tests for remote control functionality, covering connection isolation, command execution, and user permissions.
- Added tests for workflow timer registration, ensuring correct handling of timer states and ownership validation.
2026-10-15 12:17:09 +02:00

36 lines
1.7 KiB
Python

"""Serialize opt-in remote/desktop timer writes using the same transaction helpers."""
from contextlib import nullcontext
from functools import wraps
from app.core.config import settings
from app.core.database import atomic_transaction, _transaction_connection, execute_query
def serialized_timer(function):
@wraps(function)
async def wrapped(*args, **kwargs):
# Leave legacy behavior unchanged while remote control is disabled.
if not settings.REMOTE_ENABLED:
return await function(*args, **kwargs)
import inspect
arguments = inspect.signature(function).bind_partial(*args, **kwargs).arguments
user = arguments.get('current_user')
if not isinstance(user, dict) or not user.get('id'):
return await function(*args, **kwargs)
context = nullcontext() if _transaction_connection.get() else atomic_transaction()
with context:
ids = {int(user['id'])}
payload = arguments.get('payload') or {}
if function.__name__ in {'start_live_timer_v1', 'create_manual_time_v1'}:
raw_ids = payload.get('medarbejder_ids') or [payload.get('medarbejder_id')]
if isinstance(raw_ids, list):
for uid in raw_ids:
try:
if uid is not None:
ids.add(int(uid))
except (ValueError, TypeError):
pass # The existing handler supplies the validation error.
execute_query('SELECT user_id FROM users WHERE user_id=ANY(%s) ORDER BY user_id FOR UPDATE', (sorted(ids),))
return await function(*args, **kwargs)
return wrapped