Поправил вставку данных
This commit is contained in:
@@ -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) {
|
||||||
|
|||||||
@@ -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})
|
||||||
|
|||||||
Reference in New Issue
Block a user