84 lines
2.9 KiB
Python
84 lines
2.9 KiB
Python
import http
|
|
import logging
|
|
from datetime import datetime
|
|
from django.utils import timezone
|
|
from django.views.generic import View
|
|
from django.http import JsonResponse
|
|
|
|
from events.models import Event, Lap
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
from timer.models import TimeRecord
|
|
|
|
|
|
class HealthCheckApiView(View):
|
|
"""
|
|
View to check if the server is running
|
|
returns standard JsonResponse with status 'ok'
|
|
"""
|
|
@staticmethod
|
|
def get(request, *args, **kwargs):
|
|
return JsonResponse({"status": "ok"}, status=http.HTTPStatus.OK, safe=False)
|
|
|
|
|
|
class WriteTimeApiView(View):
|
|
"""
|
|
View to write time records
|
|
create a new TimeRecord object with the given parameters and save it to the database
|
|
returns standard JsonResponse with status 'ok' if successful or error message if not
|
|
"""
|
|
@staticmethod
|
|
def get(request, *args, **kwargs):
|
|
try:
|
|
|
|
# parse datetime from string of unix timestamp with milliseconds '1741169756.049847'
|
|
record_time = timezone.make_aware(datetime.fromtimestamp(float(kwargs['time'])))
|
|
|
|
# create new TimeRecord object and save it to the database
|
|
TimeRecord(
|
|
chip_id=kwargs['chip_id'],
|
|
timer_id=kwargs['timer_id'],
|
|
time=record_time,
|
|
).save()
|
|
|
|
# find the active event
|
|
event = Event.objects.filter(
|
|
is_actual=True,
|
|
)
|
|
|
|
# if there is no active event, log error
|
|
if not event:
|
|
logger.error("No active event found")
|
|
return JsonResponse({"status": "ok"}, status=http.HTTPStatus.OK, safe=False)
|
|
|
|
# find registration with the given card_id
|
|
registration = event[0].registrations.filter(
|
|
chip_id=kwargs['chip_id'],
|
|
)
|
|
|
|
if not registration:
|
|
logger.error(f"No registration found for chip_id: {kwargs['chip_id']}")
|
|
return JsonResponse({"status": "ok"}, status=http.HTTPStatus.OK, safe=False)
|
|
|
|
# if there is more than one registration with the same card_id, log error
|
|
if len(registration) > 1:
|
|
logger.error(f"Multiple registrations found for chip_id: {kwargs['chip_id']}")
|
|
|
|
# create new lap or update existing lap
|
|
laps = Lap.objects.filter(registration=registration[0])
|
|
open_lap = laps.filter(end=None)
|
|
if not open_lap:
|
|
registration[0].laps.create(
|
|
start=record_time,
|
|
number=len(laps) + 1,
|
|
)
|
|
else:
|
|
open_lap[0].end = record_time
|
|
open_lap[0].save()
|
|
|
|
return JsonResponse({"status": "ok"}, status=http.HTTPStatus.OK ,safe=False)
|
|
except Exception as e:
|
|
logger.error(f"Error while writing lap: {e}")
|
|
return JsonResponse({"status": "ok"}, status=http.HTTPStatus.OK, safe=False)
|