Поправил вставку данных

This commit is contained in:
2025-11-27 12:17:41 +03:00
parent 810d3a8f7f
commit 0be829b97b
2 changed files with 55 additions and 7 deletions

View File

@@ -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})