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

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

@@ -183,7 +183,7 @@ document.addEventListener('DOMContentLoaded', function() {
} }
// Search for ObjItem data // Search for ObjItem data
async function searchObjItemData(objectName, satelliteId) { async function searchObjItemData(objectName, satelliteId, latitude, longitude) {
try { try {
const params = new URLSearchParams({ const params = new URLSearchParams({
name: objectName, name: objectName,
@@ -193,6 +193,11 @@ document.addEventListener('DOMContentLoaded', function() {
params.append('satellite_id', satelliteId); params.append('satellite_id', satelliteId);
} }
if (latitude && longitude) {
params.append('latitude', latitude);
params.append('longitude', longitude);
}
const response = await fetch(`/api/search-objitem/?${params.toString()}`); const response = await fetch(`/api/search-objitem/?${params.toString()}`);
const data = await response.json(); const data = await response.json();
@@ -232,7 +237,24 @@ document.addEventListener('DOMContentLoaded', function() {
// Search for ObjItem data // Search for ObjItem data
const satelliteId = satelliteSelect.value; const satelliteId = satelliteSelect.value;
const objItemData = await searchObjItemData(parsedData.object_name, satelliteId);
// Extract latitude and longitude from coordinates
let latitude = null;
let longitude = null;
if (parsedData.coordinates && parsedData.coordinates !== '-') {
const coordParts = parsedData.coordinates.split(',').map(c => c.trim());
if (coordParts.length === 2) {
latitude = coordParts[0];
longitude = coordParts[1];
}
}
const objItemData = await searchObjItemData(
parsedData.object_name,
satelliteId,
latitude,
longitude
);
// Show warning if object not found // Show warning if object not found
if (!objItemData.found) { if (!objItemData.found) {

View File

@@ -35,13 +35,18 @@ class DataEntryView(LoginRequiredMixin, View):
class SearchObjItemAPIView(LoginRequiredMixin, View): class SearchObjItemAPIView(LoginRequiredMixin, View):
""" """
API endpoint for searching ObjItem by name. API endpoint for searching ObjItem by name and coordinates.
Returns first matching ObjItem with all required data. Returns closest matching ObjItem with all required data.
""" """
def get(self, request): 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() name = request.GET.get('name', '').strip()
satellite_id = request.GET.get('satellite_id', '').strip() satellite_id = request.GET.get('satellite_id', '').strip()
latitude = request.GET.get('latitude', '').strip()
longitude = request.GET.get('longitude', '').strip()
if not name: if not name:
return JsonResponse({'error': 'Name parameter is required'}, status=400) return JsonResponse({'error': 'Name parameter is required'}, status=400)
@@ -57,8 +62,11 @@ class SearchObjItemAPIView(LoginRequiredMixin, View):
except (ValueError, TypeError): except (ValueError, TypeError):
pass pass
# Search for ObjItem # Filter ObjItems with geo data
objitem = ObjItem.objects.filter(query).select_related( query &= Q(geo_obj__coords__isnull=False)
# Get queryset
objitems = ObjItem.objects.filter(query).select_related(
'parameter_obj', 'parameter_obj',
'parameter_obj__id_satellite', 'parameter_obj__id_satellite',
'parameter_obj__polarization', 'parameter_obj__polarization',
@@ -67,7 +75,25 @@ class SearchObjItemAPIView(LoginRequiredMixin, View):
'geo_obj' 'geo_obj'
).prefetch_related( ).prefetch_related(
'geo_obj__mirrors' '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: if not objitem:
return JsonResponse({'found': False}) return JsonResponse({'found': False})