Поправил вставку данных
This commit is contained in:
@@ -35,13 +35,18 @@ class DataEntryView(LoginRequiredMixin, View):
|
||||
|
||||
class SearchObjItemAPIView(LoginRequiredMixin, View):
|
||||
"""
|
||||
API endpoint for searching ObjItem by name.
|
||||
Returns first matching ObjItem with all required data.
|
||||
API endpoint for searching ObjItem by name and coordinates.
|
||||
Returns closest matching ObjItem with all required data.
|
||||
"""
|
||||
|
||||
def get(self, request):
|
||||
from django.contrib.gis.geos import Point
|
||||
from django.contrib.gis.db.models.functions import Distance
|
||||
|
||||
name = request.GET.get('name', '').strip()
|
||||
satellite_id = request.GET.get('satellite_id', '').strip()
|
||||
latitude = request.GET.get('latitude', '').strip()
|
||||
longitude = request.GET.get('longitude', '').strip()
|
||||
|
||||
if not name:
|
||||
return JsonResponse({'error': 'Name parameter is required'}, status=400)
|
||||
@@ -57,8 +62,11 @@ class SearchObjItemAPIView(LoginRequiredMixin, View):
|
||||
except (ValueError, TypeError):
|
||||
pass
|
||||
|
||||
# Search for ObjItem
|
||||
objitem = ObjItem.objects.filter(query).select_related(
|
||||
# Filter ObjItems with geo data
|
||||
query &= Q(geo_obj__coords__isnull=False)
|
||||
|
||||
# Get queryset
|
||||
objitems = ObjItem.objects.filter(query).select_related(
|
||||
'parameter_obj',
|
||||
'parameter_obj__id_satellite',
|
||||
'parameter_obj__polarization',
|
||||
@@ -67,7 +75,25 @@ class SearchObjItemAPIView(LoginRequiredMixin, View):
|
||||
'geo_obj'
|
||||
).prefetch_related(
|
||||
'geo_obj__mirrors'
|
||||
).first()
|
||||
)
|
||||
|
||||
# If coordinates provided, find closest point
|
||||
if latitude and longitude:
|
||||
try:
|
||||
lat = float(latitude.replace(',', '.'))
|
||||
lon = float(longitude.replace(',', '.'))
|
||||
point = Point(lon, lat, srid=4326)
|
||||
|
||||
# Order by distance and get closest
|
||||
objitem = objitems.annotate(
|
||||
distance=Distance('geo_obj__coords', point)
|
||||
).order_by('distance').first()
|
||||
except (ValueError, TypeError):
|
||||
# If coordinate parsing fails, just get first match
|
||||
objitem = objitems.first()
|
||||
else:
|
||||
# No coordinates provided, get first match
|
||||
objitem = objitems.first()
|
||||
|
||||
if not objitem:
|
||||
return JsonResponse({'found': False})
|
||||
|
||||
Reference in New Issue
Block a user