""" Data entry view for satellite points. """ import json import re from datetime import datetime from django.contrib.auth.mixins import LoginRequiredMixin from django.db.models import Q from django.http import JsonResponse from django.shortcuts import render from django.views import View from ..models import ObjItem, Satellite class DataEntryView(LoginRequiredMixin, View): """ View for data entry form with Tabulator table. """ def get(self, request): # Get satellites that have points satellites = Satellite.objects.filter( parameters__objitem__isnull=False ).distinct().order_by('name') context = { 'satellites': satellites, "full_width_page": True } return render(request, 'mainapp/data_entry.html', context) class SearchObjItemAPIView(LoginRequiredMixin, View): """ API endpoint for searching ObjItem by name. Returns first matching ObjItem with all required data. """ def get(self, request): name = request.GET.get('name', '').strip() satellite_id = request.GET.get('satellite_id', '').strip() if not name: return JsonResponse({'error': 'Name parameter is required'}, status=400) # Build query query = Q(name__iexact=name) # Add satellite filter if provided if satellite_id: try: sat_id = int(satellite_id) query &= Q(parameter_obj__id_satellite_id=sat_id) except (ValueError, TypeError): pass # Search for ObjItem objitem = ObjItem.objects.filter(query).select_related( 'parameter_obj', 'parameter_obj__id_satellite', 'parameter_obj__polarization', 'parameter_obj__modulation', 'parameter_obj__standard', 'geo_obj' ).prefetch_related( 'geo_obj__mirrors' ).first() if not objitem: return JsonResponse({'found': False}) # Prepare response data data = { 'found': True, 'frequency': None, 'freq_range': None, 'bod_velocity': None, 'modulation': None, 'snr': None, 'mirrors': None, } # Get parameter data if hasattr(objitem, 'parameter_obj') and objitem.parameter_obj: param = objitem.parameter_obj data['frequency'] = param.frequency if param.frequency else None data['freq_range'] = param.freq_range if param.freq_range else None data['bod_velocity'] = param.bod_velocity if param.bod_velocity else None data['modulation'] = param.modulation.name if param.modulation else None data['snr'] = param.snr if param.snr else None # Get mirrors data if hasattr(objitem, 'geo_obj') and objitem.geo_obj: mirrors = objitem.geo_obj.mirrors.all() if mirrors: data['mirrors'] = ', '.join([m.name for m in mirrors]) return JsonResponse(data)