2014-10-25 15:47:24 -06:00
|
|
|
import ephem
|
|
|
|
from datetime import datetime, timedelta
|
|
|
|
|
2015-04-11 11:32:44 -06:00
|
|
|
from django.conf import settings
|
2014-12-13 11:45:52 -07:00
|
|
|
from django.contrib import messages
|
|
|
|
from django.views.decorators.http import require_POST
|
2014-10-26 18:01:59 -06:00
|
|
|
from django.shortcuts import get_object_or_404, render, redirect
|
|
|
|
from django.core.urlresolvers import reverse
|
2015-04-16 15:42:46 -06:00
|
|
|
from django.utils.timezone import now, make_aware, utc
|
2014-10-25 15:47:24 -06:00
|
|
|
from django.http import JsonResponse
|
2014-10-26 18:01:59 -06:00
|
|
|
from django.contrib.auth.decorators import login_required
|
2014-09-08 13:07:15 -06:00
|
|
|
|
2014-12-14 05:47:50 -07:00
|
|
|
from network.base.models import (Station, Transponder, Observation,
|
|
|
|
Data, Satellite, Antenna)
|
2014-12-13 11:45:52 -07:00
|
|
|
from network.base.forms import StationForm
|
2014-09-08 11:36:12 -06:00
|
|
|
|
2014-09-08 13:07:15 -06:00
|
|
|
|
2014-09-08 11:36:12 -06:00
|
|
|
def index(request):
|
|
|
|
"""View to render index page."""
|
|
|
|
observations = Observation.objects.all()
|
2014-12-03 18:59:06 -07:00
|
|
|
featured_station = Station.objects.filter(online=True).latest('featured_date')
|
2014-09-08 11:36:12 -06:00
|
|
|
|
|
|
|
ctx = {
|
|
|
|
'latest_observations': observations.filter(end__lt=now()),
|
|
|
|
'scheduled_observations': observations.filter(end__gte=now()),
|
2015-04-11 11:32:44 -06:00
|
|
|
'featured_station': featured_station,
|
|
|
|
'mapbox_id': settings.MAPBOX_MAP_ID,
|
|
|
|
'mapbox_token': settings.MAPBOX_TOKEN
|
2014-09-08 11:36:12 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
return render(request, 'base/home.html', ctx)
|
2014-09-08 13:07:15 -06:00
|
|
|
|
|
|
|
|
2014-09-18 07:34:39 -06:00
|
|
|
def observations_list(request):
|
|
|
|
"""View to render Observations page."""
|
|
|
|
observations = Observation.objects.all()
|
|
|
|
|
|
|
|
return render(request, 'base/observations.html', {'observations': observations})
|
|
|
|
|
|
|
|
|
2014-10-26 18:01:59 -06:00
|
|
|
@login_required
|
2014-10-26 14:07:42 -06:00
|
|
|
def observation_new(request):
|
|
|
|
"""View for new observation"""
|
2014-10-26 18:01:59 -06:00
|
|
|
me = request.user
|
|
|
|
if request.method == 'POST':
|
2014-10-26 19:14:26 -06:00
|
|
|
sat_id = request.POST.get('satellite')
|
|
|
|
trans_id = request.POST.get('transponder')
|
2015-04-16 15:42:46 -06:00
|
|
|
start_time = datetime.strptime(request.POST.get('start-time'), '%Y-%m-%d %H:%M')
|
|
|
|
start = make_aware(start_time, utc)
|
|
|
|
end_time = datetime.strptime(request.POST.get('end-time'), '%Y-%m-%d %H:%M')
|
|
|
|
end = make_aware(end_time, utc)
|
2014-10-26 19:14:26 -06:00
|
|
|
sat = Satellite.objects.get(norad_cat_id=sat_id)
|
2014-10-26 18:01:59 -06:00
|
|
|
trans = Transponder.objects.get(id=trans_id)
|
|
|
|
obs = Observation(satellite=sat, transponder=trans,
|
|
|
|
author=me, start=start, end=end)
|
|
|
|
obs.save()
|
2015-04-16 15:42:46 -06:00
|
|
|
|
2014-10-26 18:01:59 -06:00
|
|
|
total = int(request.POST.get('total'))
|
2015-04-16 15:42:46 -06:00
|
|
|
|
2014-10-26 19:14:26 -06:00
|
|
|
for item in range(total):
|
2015-04-16 15:42:46 -06:00
|
|
|
start = datetime.strptime(
|
|
|
|
request.POST.get('{0}-starting_time'.format(item)), '%Y-%m-%d %H:%M:%S.%f'
|
|
|
|
)
|
|
|
|
end = datetime.strptime(
|
|
|
|
request.POST.get('{}-ending_time'.format(item)), '%Y-%m-%d %H:%M:%S.%f'
|
|
|
|
)
|
2014-10-26 19:14:26 -06:00
|
|
|
station_id = request.POST.get('{}-station'.format(item))
|
2014-10-26 18:01:59 -06:00
|
|
|
ground_station = Station.objects.get(id=station_id)
|
2015-04-16 15:42:46 -06:00
|
|
|
Data.objects.create(start=make_aware(start, utc), end=make_aware(end, utc),
|
|
|
|
ground_station=ground_station, observation=obs)
|
2014-10-26 19:14:26 -06:00
|
|
|
|
2014-12-19 06:06:58 -07:00
|
|
|
return redirect(reverse('base:observation_view', kwargs={'id': obs.id}))
|
2014-10-26 18:01:59 -06:00
|
|
|
|
2015-02-03 13:55:14 -07:00
|
|
|
satellites = Satellite.objects.filter(transponder__alive=True)
|
2014-10-26 14:07:42 -06:00
|
|
|
transponders = Transponder.objects.filter(alive=True)
|
|
|
|
|
|
|
|
return render(request, 'base/observation_new.html', {'satellites': satellites,
|
|
|
|
'transponders': transponders})
|
|
|
|
|
|
|
|
|
2014-10-26 08:46:03 -06:00
|
|
|
def prediction_windows(request, sat_id, start_date, end_date):
|
2015-04-16 15:44:10 -06:00
|
|
|
try:
|
|
|
|
sat = Satellite.objects.filter(transponder__alive=True).filter(norad_cat_id=sat_id).get()
|
|
|
|
except:
|
|
|
|
data = {
|
|
|
|
'error': 'You should select a Satellite first.'
|
|
|
|
}
|
|
|
|
return JsonResponse(data, safe=False)
|
2014-10-25 15:47:24 -06:00
|
|
|
satellite = ephem.readtle(str(sat.tle0), str(sat.tle1), str(sat.tle2))
|
|
|
|
|
2014-10-26 08:46:03 -06:00
|
|
|
end_date = datetime.strptime(end_date, '%Y-%m-%d %H:%M')
|
2014-10-25 15:47:24 -06:00
|
|
|
|
2014-10-26 14:07:42 -06:00
|
|
|
data = []
|
2014-10-25 15:47:24 -06:00
|
|
|
|
|
|
|
stations = Station.objects.all()
|
|
|
|
for station in stations:
|
|
|
|
observer = ephem.Observer()
|
|
|
|
observer.lon = str(station.lng)
|
|
|
|
observer.lat = str(station.lat)
|
|
|
|
observer.elevation = station.alt
|
2014-10-26 08:46:03 -06:00
|
|
|
observer.date = str(start_date)
|
2014-10-25 15:47:24 -06:00
|
|
|
station_match = False
|
2014-10-26 14:07:42 -06:00
|
|
|
keep_digging = True
|
|
|
|
while keep_digging:
|
2015-04-16 15:44:10 -06:00
|
|
|
try:
|
|
|
|
tr, azr, tt, altt, ts, azs = observer.next_pass(satellite)
|
|
|
|
except ValueError:
|
|
|
|
data = {
|
|
|
|
'error': 'That satellite seems to stay always below your horizon.'
|
|
|
|
}
|
|
|
|
break
|
2014-10-26 14:07:42 -06:00
|
|
|
|
|
|
|
if ephem.Date(tr).datetime() < end_date:
|
2014-10-25 15:47:24 -06:00
|
|
|
if not station_match:
|
|
|
|
station_windows = {
|
2014-10-26 14:07:42 -06:00
|
|
|
'id': station.id,
|
|
|
|
'name': station.name,
|
2014-10-25 15:47:24 -06:00
|
|
|
'window': []
|
|
|
|
}
|
|
|
|
station_match = True
|
2014-10-26 14:07:42 -06:00
|
|
|
|
|
|
|
if ephem.Date(ts).datetime() > end_date:
|
|
|
|
ts = end_date
|
|
|
|
keep_digging = False
|
|
|
|
else:
|
|
|
|
time_start_new = ephem.Date(ts).datetime() + timedelta(minutes=1)
|
|
|
|
observer.date = time_start_new.strftime("%Y-%m-%d %H:%M:%S.%f")
|
|
|
|
|
2014-10-25 15:47:24 -06:00
|
|
|
station_windows['window'].append(
|
|
|
|
{
|
2014-10-26 14:07:42 -06:00
|
|
|
'start': ephem.Date(tr).datetime().strftime("%Y-%m-%d %H:%M:%S.%f"),
|
|
|
|
'end': ephem.Date(ts).datetime().strftime("%Y-%m-%d %H:%M:%S.%f"),
|
|
|
|
'az_start': azr
|
2014-10-25 15:47:24 -06:00
|
|
|
})
|
2014-10-26 14:07:42 -06:00
|
|
|
|
2014-10-25 15:47:24 -06:00
|
|
|
else:
|
|
|
|
# window start outside of window bounds
|
|
|
|
break
|
|
|
|
|
|
|
|
if station_match:
|
2014-10-26 14:07:42 -06:00
|
|
|
data.append(station_windows)
|
2014-10-25 15:47:24 -06:00
|
|
|
|
2014-10-26 14:07:42 -06:00
|
|
|
return JsonResponse(data, safe=False)
|
2014-10-25 15:47:24 -06:00
|
|
|
|
|
|
|
|
2014-12-19 06:06:58 -07:00
|
|
|
def observation_view(request, id):
|
2014-09-21 14:18:16 -06:00
|
|
|
"""View for single observation page."""
|
|
|
|
observation = get_object_or_404(Observation, id=id)
|
2014-10-07 07:47:16 -06:00
|
|
|
data = Data.objects.filter(observation=observation)
|
2014-09-21 14:18:16 -06:00
|
|
|
|
2014-10-16 07:42:44 -06:00
|
|
|
return render(request, 'base/observation_view.html',
|
|
|
|
{'observation': observation, 'data': data})
|
2014-10-27 18:45:22 -06:00
|
|
|
|
|
|
|
|
|
|
|
def stations_list(request):
|
|
|
|
"""View to render Stations page."""
|
|
|
|
stations = Station.objects.all()
|
2014-12-14 05:50:39 -07:00
|
|
|
form = StationForm()
|
|
|
|
antennas = Antenna.objects.all()
|
2014-10-27 18:45:22 -06:00
|
|
|
|
2014-12-14 05:50:39 -07:00
|
|
|
return render(request, 'base/stations.html',
|
|
|
|
{'stations': stations, 'form': form, 'antennas': antennas})
|
2014-12-01 13:20:38 -07:00
|
|
|
|
|
|
|
|
2014-12-19 06:06:58 -07:00
|
|
|
def station_view(request, id):
|
2014-12-01 13:20:38 -07:00
|
|
|
"""View for single station page."""
|
|
|
|
station = get_object_or_404(Station, id=id)
|
2014-12-13 11:45:52 -07:00
|
|
|
form = StationForm(instance=station)
|
2014-12-14 05:47:50 -07:00
|
|
|
antennas = Antenna.objects.all()
|
2014-12-01 13:20:38 -07:00
|
|
|
|
|
|
|
return render(request, 'base/station_view.html',
|
2015-04-11 11:32:44 -06:00
|
|
|
{'station': station, 'form': form, 'antennas': antennas,
|
|
|
|
'mapbox_id': settings.MAPBOX_MAP_ID,
|
|
|
|
'mapbox_token': settings.MAPBOX_TOKEN})
|
2014-12-13 11:45:52 -07:00
|
|
|
|
|
|
|
|
|
|
|
@require_POST
|
2014-12-19 07:46:31 -07:00
|
|
|
def station_edit(request):
|
2014-12-13 11:45:52 -07:00
|
|
|
"""Edit or add a single station."""
|
2014-12-14 05:47:50 -07:00
|
|
|
if request.POST['id']:
|
|
|
|
pk = request.POST.get('id')
|
|
|
|
station = get_object_or_404(Station, id=pk, owner=request.user)
|
|
|
|
form = StationForm(request.POST, request.FILES, instance=station)
|
|
|
|
else:
|
|
|
|
form = StationForm(request.POST, request.FILES)
|
2014-12-13 11:45:52 -07:00
|
|
|
if form.is_valid():
|
|
|
|
f = form.save(commit=False)
|
|
|
|
f.owner = request.user
|
|
|
|
f.save()
|
|
|
|
form.save_m2m()
|
|
|
|
messages.success(request, 'Successfully saved Ground Station')
|
2014-12-19 07:46:31 -07:00
|
|
|
return redirect(reverse('base:station_view', kwargs={'id': f.id}))
|
2014-12-14 05:47:50 -07:00
|
|
|
else:
|
|
|
|
messages.error(request, 'Some fields missing on the form')
|
|
|
|
return redirect(reverse('users:view_user', kwargs={'username': request.user.username}))
|