diff --git a/dbapp/mainapp/templates/mainapp/data_entry.html b/dbapp/mainapp/templates/mainapp/data_entry.html index 3529d2e..ecb2c60 100644 --- a/dbapp/mainapp/templates/mainapp/data_entry.html +++ b/dbapp/mainapp/templates/mainapp/data_entry.html @@ -183,7 +183,7 @@ document.addEventListener('DOMContentLoaded', function() { } // Search for ObjItem data - async function searchObjItemData(objectName, satelliteId) { + async function searchObjItemData(objectName, satelliteId, latitude, longitude) { try { const params = new URLSearchParams({ name: objectName, @@ -193,6 +193,11 @@ document.addEventListener('DOMContentLoaded', function() { 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 data = await response.json(); @@ -232,7 +237,24 @@ document.addEventListener('DOMContentLoaded', function() { // Search for ObjItem data 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 if (!objItemData.found) { diff --git a/dbapp/mainapp/views/data_entry.py b/dbapp/mainapp/views/data_entry.py index dfa5248..6b9ea1a 100644 --- a/dbapp/mainapp/views/data_entry.py +++ b/dbapp/mainapp/views/data_entry.py @@ -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})