84 lines
3.0 KiB
Python
84 lines
3.0 KiB
Python
from django.shortcuts import render
|
|
from django.http import JsonResponse
|
|
import requests
|
|
from django.core import serializers
|
|
from django.http import HttpResponse, HttpResponseNotFound
|
|
from django.views.decorators.cache import cache_page
|
|
from django.views.decorators.http import require_GET
|
|
from django.utils.decorators import method_decorator
|
|
from django.views import View
|
|
from django.views.generic import TemplateView
|
|
from mainapp.models import Satellite
|
|
from .models import Transponders
|
|
from .utils import get_band_names
|
|
|
|
class CesiumMapView(TemplateView):
|
|
template_name = 'mapsapp/map3d.html'
|
|
|
|
def get_context_data(self, **kwargs):
|
|
context = super().get_context_data(**kwargs)
|
|
context['sats'] = Satellite.objects.all()
|
|
return context
|
|
|
|
class GetFootprintsView(View):
|
|
def get(self, request, sat_id):
|
|
try:
|
|
sat_name = Satellite.objects.get(id=sat_id).name
|
|
footprint_names = get_band_names(sat_name)
|
|
|
|
return JsonResponse(footprint_names, safe=False)
|
|
except Exception as e:
|
|
return JsonResponse({"error": str(e)}, status=400)
|
|
|
|
|
|
class TileProxyView(View):
|
|
@method_decorator(require_GET)
|
|
@method_decorator(cache_page(60 * 60 * 24)) # Cache for 24 hours
|
|
def dispatch(self, *args, **kwargs):
|
|
return super().dispatch(*args, **kwargs)
|
|
|
|
def get(self, request, footprint_name, z, x, y):
|
|
if not footprint_name.replace('-', '').replace('_', '').isalnum():
|
|
return HttpResponse("Invalid footprint name", status=400)
|
|
|
|
url = f"https://static.satbeams.com/tiles/{footprint_name}/{z}/{x}/{y}.png"
|
|
|
|
try:
|
|
resp = requests.get(url, timeout=10)
|
|
if resp.status_code == 200:
|
|
response = HttpResponse(resp.content, content_type='image/png')
|
|
response["Access-Control-Allow-Origin"] = "*"
|
|
return response
|
|
else:
|
|
return HttpResponseNotFound("Tile not found")
|
|
except Exception as e:
|
|
return HttpResponse(f"Proxy error: {e}", status=500)
|
|
|
|
class LeafletMapView(TemplateView):
|
|
template_name = 'mapsapp/map2d.html'
|
|
|
|
def get_context_data(self, **kwargs):
|
|
context = super().get_context_data(**kwargs)
|
|
context['sats'] = Satellite.objects.all()
|
|
context['trans'] = Transponders.objects.all()
|
|
return context
|
|
|
|
|
|
class GetTransponderOnSatIdView(View):
|
|
def get(self, request, sat_id):
|
|
trans = Transponders.objects.filter(sat_id=sat_id)
|
|
output = []
|
|
for tran in trans:
|
|
output.append(
|
|
{
|
|
"name": tran.name,
|
|
"frequency": tran.downlink,
|
|
"frequency_range": tran.frequency_range,
|
|
"zone_name": tran.zone_name,
|
|
"polarization": tran.polarization.name
|
|
}
|
|
)
|
|
if not trans:
|
|
return JsonResponse({'error': 'Объектов не найдено'}, status=400)
|
|
|
|
return JsonResponse(output, safe=False) |