|
|
import ast
|
|
|
import json
|
|
|
import hashlib
|
|
|
from datetime import datetime, timedelta
|
|
|
|
|
|
from django.shortcuts import render, redirect, get_object_or_404, HttpResponse
|
|
|
from django.utils.safestring import mark_safe
|
|
|
from django.http import HttpResponseRedirect
|
|
|
from django.urls import reverse
|
|
|
from django.db.models import Q
|
|
|
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
|
|
|
from django.contrib import messages
|
|
|
from django.http.request import QueryDict
|
|
|
from django.contrib.auth.decorators import login_required, user_passes_test
|
|
|
|
|
|
from django.utils.timezone import is_aware
|
|
|
|
|
|
try:
|
|
|
from urllib.parse import urlencode
|
|
|
except ImportError:
|
|
|
from urllib import urlencode
|
|
|
|
|
|
from .forms import ExperimentForm, ExperimentEditionForm, DeviceForm, ConfigurationForm, UploadFileForm, DownloadFileForm, NewForm
|
|
|
from .forms import FilterForm, ChangeIpForm
|
|
|
|
|
|
from apps.pedestal.forms import PedestalConfigurationForm, PedestalEditionForm
|
|
|
from apps.generator.forms import GeneratorConfigurationForm
|
|
|
from apps.usrp_rx.forms import USRPRXConfigurationForm, USRPRXEditionForm
|
|
|
from apps.usrp_tx.forms import USRPTXConfigurationForm, USRPTXEditionForm
|
|
|
from .utils import Params
|
|
|
|
|
|
from .models import Experiment, Device, Configuration, DEV_STATES
|
|
|
from apps.pedestal.models import PedestalConfiguration
|
|
|
from apps.generator.models import GeneratorConfiguration
|
|
|
from apps.usrp_rx.models import USRPRXConfiguration
|
|
|
from apps.usrp_tx.models import USRPTXConfiguration
|
|
|
from apps.usrp_tx.validations import validation_usrp_tx_code
|
|
|
from .gps import gps_response
|
|
|
|
|
|
|
|
|
#comentario test
|
|
|
CONF_FORMS = {
|
|
|
'pedestal': PedestalConfigurationForm,
|
|
|
'generator': GeneratorConfigurationForm,
|
|
|
'usrp_rx': USRPRXConfigurationForm,
|
|
|
'usrp_tx': USRPTXConfigurationForm,
|
|
|
}
|
|
|
|
|
|
CONF_MODELS = {
|
|
|
'pedestal': PedestalConfiguration,
|
|
|
'generator': GeneratorConfiguration,
|
|
|
'usrp_rx': USRPRXConfiguration,
|
|
|
'usrp_tx': USRPTXConfiguration,
|
|
|
}
|
|
|
|
|
|
MIX_MODES = {
|
|
|
'0': 'P',
|
|
|
'1': 'S',
|
|
|
}
|
|
|
|
|
|
MIX_OPERATIONS = {
|
|
|
'0': 'OR',
|
|
|
'1': 'XOR',
|
|
|
'2': 'AND',
|
|
|
'3': 'NAND',
|
|
|
}
|
|
|
|
|
|
|
|
|
def is_developer(user):
|
|
|
|
|
|
groups = [str(g.name) for g in user.groups.all()]
|
|
|
return 'Developer' in groups or user.is_staff
|
|
|
|
|
|
|
|
|
def is_operator(user):
|
|
|
|
|
|
groups = [str(g.name) for g in user.groups.all()]
|
|
|
return 'Operator' in groups or user.is_staff
|
|
|
|
|
|
|
|
|
def has_been_modified(model):
|
|
|
|
|
|
prev_hash = model.hash
|
|
|
new_hash = hashlib.sha256(str(model.parms_to_dict).encode()).hexdigest()
|
|
|
if prev_hash != new_hash:
|
|
|
model.hash = new_hash
|
|
|
model.save()
|
|
|
return True
|
|
|
return False
|
|
|
|
|
|
|
|
|
def index(request):
|
|
|
kwargs = {'no_sidebar': True}
|
|
|
|
|
|
return render(request, 'index.html', kwargs)
|
|
|
|
|
|
|
|
|
def devices(request):
|
|
|
|
|
|
page = request.GET.get('page')
|
|
|
order = ('device_type',)
|
|
|
|
|
|
filters = request.GET.copy()
|
|
|
kwargs = get_paginator(Device, page, order, filters)
|
|
|
form = FilterForm(initial=request.GET, extra_fields=['tags'])
|
|
|
|
|
|
kwargs['keys'] = ['device_type',
|
|
|
'ip_address', 'port_address', 'actions']
|
|
|
kwargs['title'] = 'Device'
|
|
|
kwargs['suptitle'] = 'List'
|
|
|
kwargs['no_sidebar'] = True
|
|
|
kwargs['form'] = form
|
|
|
kwargs['add_url'] = reverse('url_add_device')
|
|
|
filters.pop('page', None)
|
|
|
kwargs['q'] = urlencode(filters)
|
|
|
kwargs['menu_devices'] = 'active'
|
|
|
return render(request, 'base_list.html', kwargs)
|
|
|
|
|
|
|
|
|
def device(request, id_dev):
|
|
|
|
|
|
device = get_object_or_404(Device, pk=id_dev)
|
|
|
|
|
|
kwargs = {}
|
|
|
kwargs['device'] = device
|
|
|
kwargs['device_keys'] = ['device_type',
|
|
|
'ip_address', 'port_address', 'description']
|
|
|
|
|
|
kwargs['title'] = 'Device'
|
|
|
kwargs['suptitle'] = 'Details'
|
|
|
kwargs['menu_devices'] = 'active'
|
|
|
|
|
|
return render(request, 'device.html', kwargs)
|
|
|
|
|
|
|
|
|
@login_required
|
|
|
def device_new(request):
|
|
|
|
|
|
if request.method == 'GET':
|
|
|
form = DeviceForm()
|
|
|
|
|
|
if request.method == 'POST':
|
|
|
form = DeviceForm(request.POST)
|
|
|
|
|
|
if form.is_valid():
|
|
|
form.save()
|
|
|
return redirect('url_devices')
|
|
|
|
|
|
kwargs = {}
|
|
|
kwargs['form'] = form
|
|
|
kwargs['title'] = 'Device'
|
|
|
kwargs['suptitle'] = 'New'
|
|
|
kwargs['button'] = 'Create'
|
|
|
kwargs['menu_devices'] = 'active'
|
|
|
|
|
|
return render(request, 'base_edit.html', kwargs)
|
|
|
|
|
|
|
|
|
@login_required
|
|
|
def device_edit(request, id_dev):
|
|
|
|
|
|
device = get_object_or_404(Device, pk=id_dev)
|
|
|
|
|
|
if request.method == 'GET':
|
|
|
form = DeviceForm(instance=device)
|
|
|
|
|
|
if request.method == 'POST':
|
|
|
form = DeviceForm(request.POST, instance=device)
|
|
|
|
|
|
if form.is_valid():
|
|
|
form.save()
|
|
|
return redirect(device.get_absolute_url())
|
|
|
|
|
|
kwargs = {}
|
|
|
kwargs['form'] = form
|
|
|
kwargs['title'] = 'Device'
|
|
|
kwargs['suptitle'] = 'Edit'
|
|
|
kwargs['button'] = 'Update'
|
|
|
kwargs['menu_devices'] = 'active'
|
|
|
|
|
|
return render(request, 'base_edit.html', kwargs)
|
|
|
|
|
|
|
|
|
@login_required
|
|
|
def device_delete(request, id_dev):
|
|
|
|
|
|
device = get_object_or_404(Device, pk=id_dev)
|
|
|
|
|
|
if request.method == 'POST':
|
|
|
|
|
|
if is_developer(request.user):
|
|
|
device.delete()
|
|
|
return redirect('url_devices')
|
|
|
|
|
|
messages.error(request, 'Not enough permission to delete this object')
|
|
|
return redirect(device.get_absolute_url())
|
|
|
|
|
|
kwargs = {
|
|
|
'title': 'Delete',
|
|
|
'suptitle': 'Device',
|
|
|
'object': device,
|
|
|
'delete': True
|
|
|
}
|
|
|
kwargs['menu_devices'] = 'active'
|
|
|
|
|
|
return render(request, 'confirm.html', kwargs)
|
|
|
|
|
|
|
|
|
@login_required
|
|
|
def device_change_ip(request, id_dev):
|
|
|
|
|
|
device = get_object_or_404(Device, pk=id_dev)
|
|
|
|
|
|
if request.method == 'POST':
|
|
|
|
|
|
if is_developer(request.user):
|
|
|
device.change_ip(**request.POST.dict())
|
|
|
level, message = device.message.split('|')
|
|
|
messages.add_message(request, level, message)
|
|
|
else:
|
|
|
messages.error(
|
|
|
request, 'Not enough permission to delete this object')
|
|
|
return redirect(device.get_absolute_url())
|
|
|
|
|
|
kwargs = {
|
|
|
'title': 'Device',
|
|
|
'suptitle': 'Change IP',
|
|
|
'object': device,
|
|
|
'previous': device.get_absolute_url(),
|
|
|
'form': ChangeIpForm(initial={'ip_address': device.ip_address}),
|
|
|
'message': ' ',
|
|
|
}
|
|
|
kwargs['menu_devices'] = 'active'
|
|
|
|
|
|
return render(request, 'confirm.html', kwargs)
|
|
|
|
|
|
|
|
|
def experiments(request):
|
|
|
|
|
|
page = request.GET.get('page')
|
|
|
order = ('id',)
|
|
|
filters = request.GET.copy()
|
|
|
|
|
|
if 'my experiments' in filters:
|
|
|
filters.pop('my experiments', None)
|
|
|
filters['mine'] = request.user.id
|
|
|
|
|
|
kwargs = get_paginator(Experiment, page, order, filters)
|
|
|
|
|
|
fields = ['tags']
|
|
|
if request.user.is_authenticated:
|
|
|
fields.append('my experiments')
|
|
|
|
|
|
form = FilterForm(initial=request.GET, extra_fields=fields)
|
|
|
|
|
|
kwargs['keys'] = ['name', 'pedestal', 'reception_rx', 'transmission_tx', 'actions']
|
|
|
kwargs['title'] = 'Experiment'
|
|
|
kwargs['suptitle'] = 'List'
|
|
|
kwargs['no_sidebar'] = True
|
|
|
kwargs['form'] = form
|
|
|
kwargs['add_url'] = reverse('url_add_experiment')
|
|
|
filters = request.GET.copy()
|
|
|
filters.pop('page', None)
|
|
|
kwargs['q'] = urlencode(filters)
|
|
|
kwargs['menu_experiments'] = 'active'
|
|
|
|
|
|
return render(request, 'base_list.html', kwargs)
|
|
|
|
|
|
|
|
|
def experiment(request, id_exp):
|
|
|
|
|
|
experiment = get_object_or_404(Experiment, pk=id_exp)
|
|
|
id_p = experiment.pedestal_id
|
|
|
id_rx = experiment.reception_rx_id
|
|
|
id_tx = experiment.transmission_tx_id
|
|
|
conf_pedestal = PedestalConfiguration.objects.get(id = id_p)
|
|
|
conf_rx = USRPRXConfiguration.objects.get(id = id_rx)
|
|
|
conf_tx = USRPTXConfiguration.objects.get(id = id_tx)
|
|
|
|
|
|
gps_data = gps_response(experiment.generator.ip_address)
|
|
|
experiment.latitude = gps_data["statusRpt"]["lat"]
|
|
|
experiment.longitude = gps_data["statusRpt"]["lng"]
|
|
|
experiment.altitude = gps_data["statusRpt"]["alt"]
|
|
|
experiment.save()
|
|
|
|
|
|
kwargs = {}
|
|
|
kwargs['experiment_keys'] = ['name', 'latitude', 'longitude', 'altitude', 'heading']
|
|
|
kwargs['experiment'] = experiment
|
|
|
|
|
|
if conf_pedestal.mode == 'position':
|
|
|
kwargs['experiment_pedestal_keys'] = ['mode', 'axis', 'angle']
|
|
|
elif conf_pedestal.mode == 'speed':
|
|
|
kwargs['experiment_pedestal_keys'] = ['mode', 'axis', 'speed']
|
|
|
else:
|
|
|
kwargs['experiment_pedestal_keys'] = ['mode', 'axis', 'speed', 'angle', 'min_value', 'max_value']
|
|
|
kwargs['experiment_pedestal'] = conf_pedestal
|
|
|
|
|
|
kwargs['experiment_rx_keys'] = ['ip_address_rx', 'daughterboard_rx', 'antenna_rx', 'samplerate_rx', 'frequency_rx', 'datadir', 'clocksource', 'timesource', 'clockrate']
|
|
|
kwargs['experiment_rx'] = conf_rx
|
|
|
|
|
|
if not conf_tx.enable_2:
|
|
|
kwargs['experiment_tx_keys'] = ['ip_address', 'daughterboard', 'antenna', 'frequency', 'samplerate', 'ipp', 'delay', 'pulse_1', 'code_type_1', 'code_1', 'repetitions_1']
|
|
|
else:
|
|
|
kwargs['experiment_tx_keys'] = ['ip_address', 'daughterboard', 'antenna', 'frequency', 'samplerate', 'ipp', 'delay', 'pulse_1', 'code_type_1', 'code_1', 'repetitions_1',
|
|
|
'pulse_2', 'code_type_2', 'code_2', 'repetitions_2']
|
|
|
kwargs['experiment_tx'] = conf_tx
|
|
|
|
|
|
kwargs['title'] = 'Experiment'
|
|
|
kwargs['suptitle'] = 'Details'
|
|
|
kwargs['button'] = 'Add Configuration'
|
|
|
kwargs['menu_experiments'] = 'active'
|
|
|
|
|
|
###### SIDEBAR ######
|
|
|
kwargs.update(sidebar(confs=[conf_pedestal, conf_rx, conf_tx]))
|
|
|
|
|
|
return render(request, 'experiment.html', kwargs)
|
|
|
|
|
|
|
|
|
@login_required
|
|
|
def experiment_new(request, id_camp=None):
|
|
|
|
|
|
if not is_developer(request.user):
|
|
|
messages.error(
|
|
|
request, 'Developer required, to create new Experiments')
|
|
|
return redirect('index')
|
|
|
kwargs = {}
|
|
|
|
|
|
if request.method == 'GET':
|
|
|
kwargs['button'] = 'Create'
|
|
|
form = ExperimentForm()
|
|
|
|
|
|
if request.method == 'POST':
|
|
|
form = ExperimentForm(request.POST)
|
|
|
if form.is_valid():
|
|
|
experiment = form.save(commit=False)
|
|
|
experiment.author = request.user
|
|
|
experiment.save()
|
|
|
messages.success(request, 'Experiment configuration successfully created')
|
|
|
return redirect('url_experiment', id_exp=experiment.id)
|
|
|
|
|
|
kwargs['form'] = form
|
|
|
kwargs['title'] = 'Experiment'
|
|
|
kwargs['suptitle'] = 'New'
|
|
|
kwargs['menu_experiments'] = 'active'
|
|
|
|
|
|
return render(request, 'experiment_edit.html', kwargs)
|
|
|
|
|
|
|
|
|
@login_required
|
|
|
def experiment_edit(request, id_exp):
|
|
|
|
|
|
experiment = get_object_or_404(Experiment, pk=id_exp)
|
|
|
id_p = experiment.pedestal_id
|
|
|
id_rx = experiment.reception_rx_id
|
|
|
id_tx = experiment.transmission_tx_id
|
|
|
conf_pedestal = PedestalConfiguration.objects.get(id = id_p)
|
|
|
conf_rx = USRPRXConfiguration.objects.get(id = id_rx)
|
|
|
conf_tx = USRPTXConfiguration.objects.get(id = id_tx)
|
|
|
|
|
|
if request.method == 'GET':
|
|
|
form = ExperimentEditionForm(instance=experiment)
|
|
|
form_pedestal = PedestalEditionForm(instance=conf_pedestal)
|
|
|
form_rx = USRPRXEditionForm(instance=conf_rx)
|
|
|
form_tx = USRPTXEditionForm(instance=conf_tx)
|
|
|
|
|
|
if request.method == 'POST':
|
|
|
form = ExperimentEditionForm(request.POST, instance=experiment)
|
|
|
form_pedestal = PedestalEditionForm(request.POST, instance=conf_pedestal)
|
|
|
form_rx = USRPRXEditionForm(request.POST, instance=conf_rx)
|
|
|
form_tx = USRPTXEditionForm(request.POST, instance=conf_tx)
|
|
|
|
|
|
if form.is_valid() and form_pedestal.is_valid() and form_rx.is_valid() and form_tx.is_valid():
|
|
|
experiment = form.save(commit=False)
|
|
|
pedestal = form_pedestal.save(commit=False)
|
|
|
rx = form_rx.save(commit=False)
|
|
|
tx = form_tx.save(commit=False)
|
|
|
|
|
|
pedestal.save()
|
|
|
rx.save()
|
|
|
validation_usrp_tx_code(request, tx)
|
|
|
tx.save()
|
|
|
messages.success(request, 'Experiment configuration successfully updated')
|
|
|
return redirect('url_experiment', id_exp=experiment.id)
|
|
|
|
|
|
kwargs = {}
|
|
|
kwargs['form'] = form
|
|
|
kwargs['form_pedestal'] = form_pedestal
|
|
|
kwargs['form_rx'] = form_rx
|
|
|
kwargs['form_tx'] = form_tx
|
|
|
kwargs['title'] = 'Experiment'
|
|
|
kwargs['suptitle'] = 'Edit'
|
|
|
kwargs['button'] = 'Update'
|
|
|
kwargs['menu_experiments'] = 'active'
|
|
|
|
|
|
return render(request, 'experiment_edit.html', kwargs)
|
|
|
|
|
|
|
|
|
@login_required
|
|
|
def experiment_delete(request, id_exp):
|
|
|
|
|
|
experiment = get_object_or_404(Experiment, pk=id_exp)
|
|
|
|
|
|
if request.method == 'POST':
|
|
|
if is_developer(request.user):
|
|
|
#for conf in Configuration.objects.filter(experiment=experiment):
|
|
|
#conf.delete()
|
|
|
experiment.delete()
|
|
|
return redirect('url_experiments')
|
|
|
|
|
|
messages.error(request, 'Not enough permission to delete this object')
|
|
|
return redirect(experiment.get_absolute_url())
|
|
|
|
|
|
kwargs = {
|
|
|
'title': 'Delete',
|
|
|
'suptitle': 'Experiment',
|
|
|
'object': experiment,
|
|
|
'delete': True
|
|
|
}
|
|
|
|
|
|
return render(request, 'confirm.html', kwargs)
|
|
|
|
|
|
|
|
|
@login_required
|
|
|
def experiment_export(request, id_exp):
|
|
|
|
|
|
experiment = get_object_or_404(Experiment, pk=id_exp)
|
|
|
content = experiment.parms_to_dict()
|
|
|
content_type = 'application/json'
|
|
|
filename = '%s_%s.json' % (experiment.name, experiment.id)
|
|
|
|
|
|
response = HttpResponse(content_type=content_type)
|
|
|
response['Content-Disposition'] = 'attachment; filename="%s"' % filename
|
|
|
response.write(json.dumps(content, indent=2))
|
|
|
|
|
|
return response
|
|
|
|
|
|
|
|
|
@login_required
|
|
|
def experiment_import(request, id_exp):
|
|
|
|
|
|
experiment = get_object_or_404(Experiment, pk=id_exp)
|
|
|
configurations = Configuration.objects.filter(experiment=experiment)
|
|
|
|
|
|
if request.method == 'GET':
|
|
|
file_form = UploadFileForm()
|
|
|
|
|
|
if request.method == 'POST':
|
|
|
file_form = UploadFileForm(request.POST, request.FILES)
|
|
|
|
|
|
if file_form.is_valid():
|
|
|
new_exp = experiment.dict_to_parms(
|
|
|
json.load(request.FILES['file']), CONF_MODELS)
|
|
|
messages.success(
|
|
|
request, "Parameters imported from: '%s'." % request.FILES['file'].name)
|
|
|
return redirect(new_exp.get_absolute_url_edit())
|
|
|
|
|
|
messages.error(request, "Could not import parameters from file")
|
|
|
|
|
|
kwargs = {}
|
|
|
kwargs['title'] = 'Experiment'
|
|
|
kwargs['form'] = file_form
|
|
|
kwargs['suptitle'] = 'Importing file'
|
|
|
kwargs['button'] = 'Import'
|
|
|
kwargs['menu_experiments'] = 'active'
|
|
|
|
|
|
kwargs.update(sidebar(experiment=experiment))
|
|
|
|
|
|
return render(request, 'experiment_import.html', kwargs)
|
|
|
|
|
|
|
|
|
@login_required
|
|
|
def experiment_start(request, id_exp):
|
|
|
exp = get_object_or_404(Experiment, pk=id_exp)
|
|
|
|
|
|
if exp.status == 2:
|
|
|
messages.warning(request, 'Experiment {} already runnnig'.format(exp.name))
|
|
|
else:
|
|
|
exp.status = exp.start()
|
|
|
if exp.status == 5:
|
|
|
messages.warning(request, 'Experiment {} already runnnig'.format(Experiment.objects.filter(status=2)[0]))
|
|
|
if exp.status == 0:
|
|
|
messages.error(request, 'Experiment {} not start'.format(exp))
|
|
|
if exp.status == 2:
|
|
|
messages.success(request, 'Experiment {} started'.format(exp))
|
|
|
|
|
|
exp.save()
|
|
|
|
|
|
return redirect(exp.get_absolute_url())
|
|
|
|
|
|
|
|
|
@login_required
|
|
|
def experiment_stop(request, id_exp):
|
|
|
all_status = Experiment.objects.filter(status=2)
|
|
|
exp = get_object_or_404(Experiment, pk=id_exp)
|
|
|
|
|
|
if exp.status == 2 or exp.status == 4 or exp.status == 5:
|
|
|
for one_exp in all_status:
|
|
|
if one_exp != exp:
|
|
|
one_exp.status = 4
|
|
|
one_exp.mode_stop = 'web'
|
|
|
one_exp.save()
|
|
|
|
|
|
exp.status = exp.stop()
|
|
|
exp.mode_stop = 'web'
|
|
|
exp.save()
|
|
|
messages.success(request, 'Experiment {} stopped'.format(exp))
|
|
|
else:
|
|
|
messages.error(request, 'Experiment {} not running'.format(exp))
|
|
|
|
|
|
return redirect(exp.get_absolute_url())
|
|
|
|
|
|
|
|
|
def experiment_status(request, id_exp):
|
|
|
|
|
|
exp = get_object_or_404(Experiment, pk=id_exp)
|
|
|
|
|
|
exp.get_status()
|
|
|
|
|
|
return redirect(exp.get_absolute_url())
|
|
|
|
|
|
|
|
|
def experiment_summary(request, id_exp):
|
|
|
|
|
|
experiment = get_object_or_404(Experiment, pk=id_exp)
|
|
|
configurations = Configuration.objects.filter(
|
|
|
experiment=experiment, type=0)
|
|
|
|
|
|
kwargs = {}
|
|
|
kwargs['experiment_keys'] = ['radar_system',
|
|
|
'name', 'freq', 'start_time', 'end_time']
|
|
|
kwargs['experiment'] = experiment
|
|
|
kwargs['configurations'] = []
|
|
|
kwargs['title'] = 'Experiment Summary'
|
|
|
kwargs['suptitle'] = 'Details'
|
|
|
kwargs['button'] = 'Verify Parameters'
|
|
|
|
|
|
c_vel = 3.0*(10**8) # m/s
|
|
|
ope_freq = experiment.freq*(10**6) # 1/s
|
|
|
radar_lambda = c_vel/ope_freq # m
|
|
|
kwargs['radar_lambda'] = radar_lambda
|
|
|
|
|
|
ipp = None
|
|
|
nsa = 1
|
|
|
code_id = 0
|
|
|
tx_line = {}
|
|
|
|
|
|
for configuration in configurations.filter(device__device_type__name = 'pedestal'):
|
|
|
|
|
|
if configuration.mix:
|
|
|
continue
|
|
|
conf = {'conf': configuration}
|
|
|
conf['keys'] = []
|
|
|
conf['NTxs'] = configuration.ntx
|
|
|
conf['keys'].append('NTxs')
|
|
|
ipp = configuration.ipp
|
|
|
conf['IPP'] = ipp
|
|
|
conf['keys'].append('IPP')
|
|
|
lines = configuration.get_lines(line_type__name='tx')
|
|
|
|
|
|
for tx_line in lines:
|
|
|
tx_params = json.loads(tx_line.params)
|
|
|
conf[tx_line.get_name()] = '{} Km'.format(tx_params['pulse_width'])
|
|
|
conf['keys'].append(tx_line.get_name())
|
|
|
delays = tx_params['delays']
|
|
|
if delays not in ('', '0'):
|
|
|
n = len(delays.split(','))
|
|
|
taus = '{} Taus: {}'.format(n, delays)
|
|
|
else:
|
|
|
taus = '-'
|
|
|
conf['Taus ({})'.format(tx_line.get_name())] = taus
|
|
|
conf['keys'].append('Taus ({})'.format(tx_line.get_name()))
|
|
|
for code_line in configuration.get_lines(line_type__name='codes'):
|
|
|
code_params = json.loads(code_line.params)
|
|
|
code_id = code_params['code']
|
|
|
if tx_line.pk == int(code_params['TX_ref']):
|
|
|
conf['Code ({})'.format(tx_line.get_name())] = '{}:{}'.format(RCLineCode.objects.get(pk=code_params['code']),
|
|
|
'-'.join(code_params['codes']))
|
|
|
conf['keys'].append('Code ({})'.format(tx_line.get_name()))
|
|
|
|
|
|
for windows_line in configuration.get_lines(line_type__name='windows'):
|
|
|
win_params = json.loads(windows_line.params)
|
|
|
if tx_line.pk == int(win_params['TX_ref']):
|
|
|
windows = ''
|
|
|
nsa = win_params['params'][0]['number_of_samples']
|
|
|
for i, params in enumerate(win_params['params']):
|
|
|
windows += 'W{}: Ho={first_height} km DH={resolution} km NSA={number_of_samples}<br>'.format(
|
|
|
i, **params)
|
|
|
conf['Window'] = mark_safe(windows)
|
|
|
conf['keys'].append('Window')
|
|
|
|
|
|
kwargs['configurations'].append(conf)
|
|
|
|
|
|
for configuration in configurations.filter(device__device_type__name = 'jars'):
|
|
|
|
|
|
conf = {'conf': configuration}
|
|
|
conf['keys'] = []
|
|
|
conf['Type of Data'] = EXPERIMENT_TYPE[configuration.exp_type][1]
|
|
|
conf['keys'].append('Type of Data')
|
|
|
channels_number = configuration.channels_number
|
|
|
exp_type = configuration.exp_type
|
|
|
fftpoints = configuration.fftpoints
|
|
|
filter_parms = json.loads(configuration.filter_parms)
|
|
|
spectral_number = configuration.spectral_number
|
|
|
acq_profiles = configuration.acq_profiles
|
|
|
cohe_integr = configuration.cohe_integr
|
|
|
profiles_block = configuration.profiles_block
|
|
|
|
|
|
conf['Num of Profiles'] = acq_profiles
|
|
|
conf['keys'].append('Num of Profiles')
|
|
|
|
|
|
conf['Prof per Block'] = profiles_block
|
|
|
conf['keys'].append('Prof per Block')
|
|
|
|
|
|
conf['Blocks per File'] = configuration.raw_data_blocks
|
|
|
conf['keys'].append('Blocks per File')
|
|
|
|
|
|
if exp_type == 0: # Short
|
|
|
bytes_ = 2
|
|
|
b = nsa*2*bytes_*channels_number
|
|
|
else: # Float
|
|
|
bytes_ = 4
|
|
|
channels = channels_number + spectral_number
|
|
|
b = nsa*2*bytes_*fftpoints*channels
|
|
|
|
|
|
codes_num = 7
|
|
|
if code_id == 2:
|
|
|
codes_num = 7
|
|
|
elif code_id == 12:
|
|
|
codes_num = 15
|
|
|
|
|
|
#Jars filter values:
|
|
|
|
|
|
clock = float(filter_parms['clock'])
|
|
|
filter_2 = int(filter_parms['cic_2'])
|
|
|
filter_5 = int(filter_parms['cic_5'])
|
|
|
filter_fir = int(filter_parms['fir'])
|
|
|
Fs_MHz = clock/(filter_2*filter_5*filter_fir)
|
|
|
|
|
|
#Jars values:
|
|
|
if ipp is not None:
|
|
|
IPP_units = ipp/0.15*Fs_MHz
|
|
|
IPP_us = IPP_units / Fs_MHz
|
|
|
IPP_s = IPP_units / (Fs_MHz * (10**6))
|
|
|
Ts = 1/(Fs_MHz*(10**6))
|
|
|
|
|
|
Va = radar_lambda/(4*Ts*cohe_integr)
|
|
|
rate_bh = ((nsa-codes_num)*channels_number*2 *
|
|
|
bytes_/IPP_us)*(36*(10**8)/cohe_integr)
|
|
|
rate_gh = rate_bh/(1024*1024*1024)
|
|
|
|
|
|
conf['Time per Block'] = IPP_s * profiles_block * cohe_integr
|
|
|
conf['keys'].append('Time per Block')
|
|
|
conf['Acq time'] = IPP_s * acq_profiles
|
|
|
conf['keys'].append('Acq time')
|
|
|
conf['Data rate'] = str(rate_gh)+" (GB/h)"
|
|
|
conf['keys'].append('Data rate')
|
|
|
conf['Va (m/s)'] = Va
|
|
|
conf['keys'].append('Va (m/s)')
|
|
|
conf['Vrange (m/s)'] = 3/(2*IPP_s*cohe_integr)
|
|
|
conf['keys'].append('Vrange (m/s)')
|
|
|
|
|
|
kwargs['configurations'].append(conf)
|
|
|
kwargs['menu_experiments'] = 'active'
|
|
|
|
|
|
###### SIDEBAR ######
|
|
|
kwargs.update(sidebar(experiment=experiment))
|
|
|
|
|
|
return render(request, 'experiment_summary.html', kwargs)
|
|
|
|
|
|
|
|
|
@login_required
|
|
|
def experiment_verify(request, id_exp):
|
|
|
|
|
|
experiment = get_object_or_404(Experiment, pk=id_exp)
|
|
|
experiment_data = experiment.parms_to_dict()
|
|
|
configurations = Configuration.objects.filter(
|
|
|
experiment=experiment, type=0)
|
|
|
|
|
|
kwargs = {}
|
|
|
|
|
|
kwargs['experiment_keys'] = ['name', 'start_time', 'end_time']
|
|
|
kwargs['experiment'] = experiment
|
|
|
|
|
|
kwargs['configuration_keys'] = ['name', 'device__ip_address',
|
|
|
'device__port_address', 'device__status']
|
|
|
kwargs['configurations'] = configurations
|
|
|
kwargs['experiment_data'] = experiment_data
|
|
|
|
|
|
kwargs['title'] = 'Verify Experiment'
|
|
|
kwargs['suptitle'] = 'Parameters'
|
|
|
|
|
|
kwargs['button'] = 'Update'
|
|
|
|
|
|
jars_conf = False
|
|
|
rc_conf = False
|
|
|
dds_conf = False
|
|
|
|
|
|
for configuration in configurations:
|
|
|
#-------------------- JARS -----------------------:
|
|
|
if configuration.device.device_type.name == 'jars':
|
|
|
jars_conf = True
|
|
|
jars = configuration
|
|
|
kwargs['jars_conf'] = jars_conf
|
|
|
filter_parms = json.loads(jars.filter_parms)
|
|
|
kwargs['filter_parms'] = filter_parms
|
|
|
#--Sampling Frequency
|
|
|
clock = filter_parms['clock']
|
|
|
filter_2 = filter_parms['cic_2']
|
|
|
filter_5 = filter_parms['cic_5']
|
|
|
filter_fir = filter_parms['fir']
|
|
|
samp_freq_jars = clock/filter_2/filter_5/filter_fir
|
|
|
|
|
|
kwargs['samp_freq_jars'] = samp_freq_jars
|
|
|
kwargs['jars'] = configuration
|
|
|
|
|
|
#--------------------- RC ----------------------:
|
|
|
if configuration.device.device_type.name == 'pedestal' and not configuration.mix:
|
|
|
rc_conf = True
|
|
|
rc = configuration
|
|
|
|
|
|
rc_parms = configuration.parms_to_dict()
|
|
|
|
|
|
win_lines = rc.get_lines(line_type__name='windows')
|
|
|
if win_lines:
|
|
|
dh = json.loads(win_lines[0].params)['params'][0]['resolution']
|
|
|
#--Sampling Frequency
|
|
|
samp_freq_rc = 0.15/dh
|
|
|
kwargs['samp_freq_rc'] = samp_freq_rc
|
|
|
|
|
|
kwargs['rc_conf'] = rc_conf
|
|
|
kwargs['rc'] = configuration
|
|
|
|
|
|
#-------------------- DDS ----------------------:
|
|
|
if configuration.device.device_type.name == 'dds':
|
|
|
dds_conf = True
|
|
|
dds = configuration
|
|
|
dds_parms = configuration.parms_to_dict()
|
|
|
|
|
|
kwargs['dds_conf'] = dds_conf
|
|
|
kwargs['dds'] = configuration
|
|
|
|
|
|
#------------Validation------------:
|
|
|
#Clock
|
|
|
if dds_conf and rc_conf and jars_conf:
|
|
|
if float(filter_parms['clock']) != float(rc_parms['configurations']['byId'][str(rc.pk)]['clock_in']) and float(rc_parms['configurations']['byId'][str(rc.pk)]['clock_in']) != float(dds_parms['configurations']['byId'][str(dds.pk)]['clock']):
|
|
|
messages.warning(request, "Devices don't have the same clock.")
|
|
|
elif rc_conf and jars_conf:
|
|
|
if float(filter_parms['clock']) != float(rc_parms['configurations']['byId'][str(rc.pk)]['clock_in']):
|
|
|
messages.warning(request, "Devices don't have the same clock.")
|
|
|
elif rc_conf and dds_conf:
|
|
|
if float(rc_parms['configurations']['byId'][str(rc.pk)]['clock_in']) != float(dds_parms['configurations']['byId'][str(dds.pk)]['clock']):
|
|
|
messages.warning(request, "Devices don't have the same clock.")
|
|
|
if float(samp_freq_rc) != float(dds_parms['configurations']['byId'][str(dds.pk)]['frequencyA']):
|
|
|
messages.warning(
|
|
|
request, "Devices don't have the same Frequency A.")
|
|
|
|
|
|
#------------POST METHOD------------:
|
|
|
if request.method == 'POST':
|
|
|
if request.POST['suggest_clock']:
|
|
|
try:
|
|
|
suggest_clock = float(request.POST['suggest_clock'])
|
|
|
except:
|
|
|
messages.warning(request, "Invalid value in CLOCK IN.")
|
|
|
return redirect('url_verify_experiment', id_exp=experiment.id)
|
|
|
else:
|
|
|
suggest_clock = ""
|
|
|
if suggest_clock:
|
|
|
if rc_conf:
|
|
|
rc.clock_in = suggest_clock
|
|
|
rc.save()
|
|
|
if jars_conf:
|
|
|
filter_parms = jars.filter_parms
|
|
|
filter_parms = ast.literal_eval(filter_parms)
|
|
|
filter_parms['clock'] = suggest_clock
|
|
|
jars.filter_parms = json.dumps(filter_parms)
|
|
|
jars.save()
|
|
|
kwargs['filter_parms'] = filter_parms
|
|
|
if dds_conf:
|
|
|
dds.clock = suggest_clock
|
|
|
dds.save()
|
|
|
|
|
|
if request.POST['suggest_frequencyA']:
|
|
|
try:
|
|
|
suggest_frequencyA = float(request.POST['suggest_frequencyA'])
|
|
|
except:
|
|
|
messages.warning(request, "Invalid value in FREQUENCY A.")
|
|
|
return redirect('url_verify_experiment', id_exp=experiment.id)
|
|
|
else:
|
|
|
suggest_frequencyA = ""
|
|
|
if suggest_frequencyA:
|
|
|
if jars_conf:
|
|
|
filter_parms = jars.filter_parms
|
|
|
filter_parms = ast.literal_eval(filter_parms)
|
|
|
filter_parms['fch'] = suggest_frequencyA
|
|
|
jars.filter_parms = json.dumps(filter_parms)
|
|
|
jars.save()
|
|
|
kwargs['filter_parms'] = filter_parms
|
|
|
if dds_conf:
|
|
|
dds.frequencyA_Mhz = request.POST['suggest_frequencyA']
|
|
|
dds.save()
|
|
|
|
|
|
kwargs['menu_experiments'] = 'active'
|
|
|
kwargs.update(sidebar(experiment=experiment))
|
|
|
return render(request, 'experiment_verify.html', kwargs)
|
|
|
|
|
|
|
|
|
def dev_confs(request):
|
|
|
|
|
|
page = request.GET.get('page')
|
|
|
order = ('-programmed_date', )
|
|
|
filters = request.GET.copy()
|
|
|
if 'my configurations' in filters:
|
|
|
filters.pop('my configurations', None)
|
|
|
filters['mine'] = request.user.id
|
|
|
kwargs = get_paginator(Configuration, page, order, filters)
|
|
|
fields = ['tags', 'historical']
|
|
|
if request.user.is_authenticated:
|
|
|
fields.append('my configurations')
|
|
|
form = FilterForm(initial=request.GET, extra_fields=fields)
|
|
|
kwargs['keys'] = ['name', 'device', 'type', 'actions']
|
|
|
if request.GET.get('historical') == 'on':
|
|
|
kwargs['keys'].insert(3, 'experiment')
|
|
|
kwargs['keys'].insert(4, 'experiment_date')
|
|
|
else:
|
|
|
kwargs['keys'].insert(3, 'programmed_date')
|
|
|
|
|
|
kwargs['title'] = 'Configuration'
|
|
|
kwargs['suptitle'] = 'List'
|
|
|
kwargs['no_sidebar'] = True
|
|
|
kwargs['form'] = form
|
|
|
kwargs['add_url'] = reverse('url_add_dev_conf', args=[0])
|
|
|
filters = request.GET.copy()
|
|
|
filters.pop('page', None)
|
|
|
kwargs['q'] = urlencode(filters)
|
|
|
kwargs['menu_configurations'] = 'active'
|
|
|
|
|
|
return render(request, 'base_list.html', kwargs)
|
|
|
|
|
|
|
|
|
def dev_conf(request, id_conf):
|
|
|
|
|
|
conf = get_object_or_404(Configuration, pk=id_conf)
|
|
|
|
|
|
return redirect(conf.get_absolute_url())
|
|
|
|
|
|
|
|
|
@login_required
|
|
|
def dev_conf_new(request, id_exp=0, id_dev=0):
|
|
|
|
|
|
if not is_developer(request.user):
|
|
|
messages.error(
|
|
|
request, 'Developer required, to create new configurations')
|
|
|
return redirect('index')
|
|
|
|
|
|
initial = {}
|
|
|
kwargs = {}
|
|
|
|
|
|
if id_exp != 0:
|
|
|
initial['experiment'] = id_exp
|
|
|
|
|
|
if id_dev != 0:
|
|
|
initial['device'] = id_dev
|
|
|
|
|
|
if request.method == 'GET':
|
|
|
|
|
|
if id_dev:
|
|
|
kwargs['button'] = 'Create'
|
|
|
device = Device.objects.get(pk=id_dev)
|
|
|
DevConfForm = CONF_FORMS[device.device_type.name]
|
|
|
initial['name'] = request.GET['name']
|
|
|
form = DevConfForm(initial=initial)
|
|
|
else:
|
|
|
kwargs['button'] = 'Create'
|
|
|
form = ConfigurationForm(initial=initial)
|
|
|
|
|
|
if request.method == 'POST':
|
|
|
|
|
|
device = Device.objects.get(pk=request.POST['device'])
|
|
|
DevConfForm = CONF_FORMS[device.device_type.name]
|
|
|
|
|
|
form = DevConfForm(request.POST)
|
|
|
kwargs['button'] = 'Create'
|
|
|
if form.is_valid():
|
|
|
conf = form.save(commit=False)
|
|
|
|
|
|
if device.device_type.name == 'usrp_tx':
|
|
|
validation_usrp_tx_code(request, conf)
|
|
|
|
|
|
conf.save()
|
|
|
conf.author = request.user
|
|
|
|
|
|
messages.success(request, device.device_type.name + ' configuration successfully created')
|
|
|
return redirect('url_dev_conf', id_conf=conf.pk)
|
|
|
|
|
|
kwargs['id_exp'] = id_exp
|
|
|
kwargs['form'] = form
|
|
|
kwargs['title'] = 'Configuration'
|
|
|
kwargs['suptitle'] = 'New'
|
|
|
kwargs['menu_configurations'] = 'active'
|
|
|
|
|
|
if id_dev != 0:
|
|
|
device = Device.objects.get(pk=id_dev)
|
|
|
kwargs['device'] = device.device_type.name
|
|
|
return render(request, 'dev_conf_edit.html', kwargs)
|
|
|
|
|
|
|
|
|
@login_required
|
|
|
def dev_conf_edit(request, id_conf):
|
|
|
|
|
|
conf = get_object_or_404(Configuration, pk=id_conf)
|
|
|
|
|
|
DevConfForm = CONF_FORMS[conf.device.device_type.name]
|
|
|
|
|
|
if request.method == 'GET':
|
|
|
form = DevConfForm(instance=conf)
|
|
|
|
|
|
if request.method == 'POST':
|
|
|
form = DevConfForm(request.POST, instance=conf)
|
|
|
|
|
|
if form.is_valid():
|
|
|
form.save()
|
|
|
return redirect('url_dev_conf', id_conf=id_conf)
|
|
|
|
|
|
kwargs = {}
|
|
|
kwargs['form'] = form
|
|
|
kwargs['title'] = 'Device Configuration'
|
|
|
kwargs['suptitle'] = 'Edit'
|
|
|
kwargs['button'] = 'Update'
|
|
|
kwargs['menu_configurations'] = 'active'
|
|
|
|
|
|
###### SIDEBAR ######
|
|
|
kwargs.update(sidebar(conf=conf))
|
|
|
|
|
|
return render(request, '%s_conf_edit.html' % conf.device.device_type.name, kwargs)
|
|
|
|
|
|
|
|
|
@login_required
|
|
|
def dev_conf_start(request, id_conf):
|
|
|
|
|
|
conf = get_object_or_404(Configuration, pk=id_conf)
|
|
|
|
|
|
if conf.start_device():
|
|
|
messages.success(request, conf.message)
|
|
|
else:
|
|
|
messages.error(request, conf.message)
|
|
|
|
|
|
#conf.status_device()
|
|
|
|
|
|
return redirect(conf.get_absolute_url())
|
|
|
|
|
|
|
|
|
@login_required
|
|
|
def dev_conf_stop(request, id_conf):
|
|
|
|
|
|
conf = get_object_or_404(Configuration, pk=id_conf)
|
|
|
|
|
|
if conf.stop_device():
|
|
|
messages.success(request, conf.message)
|
|
|
else:
|
|
|
messages.error(request, conf.message)
|
|
|
|
|
|
#conf.status_device()
|
|
|
|
|
|
return redirect(conf.get_absolute_url())
|
|
|
|
|
|
|
|
|
@login_required
|
|
|
def dev_conf_status(request, id_conf):
|
|
|
|
|
|
conf = get_object_or_404(Configuration, pk=id_conf)
|
|
|
|
|
|
conf_active = Configuration.objects.filter(pk=conf.device.conf_active).first()
|
|
|
if conf_active!=conf:
|
|
|
url = '#' if conf_active is None else conf_active.get_absolute_url()
|
|
|
label = 'None' if conf_active is None else conf_active.label
|
|
|
messages.warning(
|
|
|
request,
|
|
|
mark_safe('The current configuration has not been written to device, the active configuration is <a href="{}">{}</a>'.format(
|
|
|
url,
|
|
|
label
|
|
|
))
|
|
|
)
|
|
|
|
|
|
return redirect(conf.get_absolute_url())
|
|
|
|
|
|
if conf.status_device():
|
|
|
messages.success(request, conf.message)
|
|
|
else:
|
|
|
messages.error(request, conf.message)
|
|
|
|
|
|
return redirect(conf.get_absolute_url())
|
|
|
|
|
|
|
|
|
@login_required
|
|
|
def dev_conf_reset(request, id_conf):
|
|
|
|
|
|
conf = get_object_or_404(Configuration, pk=id_conf)
|
|
|
|
|
|
if conf.reset_device():
|
|
|
messages.success(request, conf.message)
|
|
|
else:
|
|
|
messages.error(request, conf.message)
|
|
|
|
|
|
return redirect(conf.get_absolute_url())
|
|
|
|
|
|
|
|
|
@login_required
|
|
|
def dev_conf_write(request, id_conf):
|
|
|
|
|
|
conf = get_object_or_404(Configuration, pk=id_conf)
|
|
|
|
|
|
if request.method == 'POST':
|
|
|
if conf.write_device():
|
|
|
conf.device.conf_active = conf.pk
|
|
|
conf.device.save()
|
|
|
messages.success(request, conf.message)
|
|
|
if has_been_modified(conf):
|
|
|
conf.clone(type=1)
|
|
|
else:
|
|
|
messages.error(request, conf.message)
|
|
|
|
|
|
return redirect(get_object_or_404(Configuration, pk=id_conf).get_absolute_url())
|
|
|
|
|
|
kwargs = {
|
|
|
'title': 'Write Configuration',
|
|
|
'suptitle': conf.label,
|
|
|
'message': 'Are you sure yo want to write this {} configuration?'.format(conf.device),
|
|
|
'delete': False
|
|
|
}
|
|
|
kwargs['menu_configurations'] = 'active'
|
|
|
|
|
|
return render(request, 'confirm.html', kwargs)
|
|
|
|
|
|
|
|
|
@login_required
|
|
|
def dev_conf_read(request, id_conf):
|
|
|
|
|
|
conf = get_object_or_404(Configuration, pk=id_conf)
|
|
|
|
|
|
DevConfForm = CONF_FORMS[conf.device.device_type.name]
|
|
|
|
|
|
if request.method == 'GET':
|
|
|
parms = conf.read_device()
|
|
|
#conf.status_device()
|
|
|
|
|
|
if not parms:
|
|
|
messages.error(request, conf.message)
|
|
|
return redirect(conf.get_absolute_url())
|
|
|
|
|
|
form = DevConfForm(initial=parms, instance=conf)
|
|
|
|
|
|
if request.method == 'POST':
|
|
|
form = DevConfForm(request.POST, instance=conf)
|
|
|
|
|
|
if form.is_valid():
|
|
|
form.save()
|
|
|
return redirect(conf.get_absolute_url())
|
|
|
|
|
|
messages.error(request, "Parameters could not be saved")
|
|
|
|
|
|
kwargs = {}
|
|
|
kwargs['id_dev'] = conf.id
|
|
|
kwargs['form'] = form
|
|
|
kwargs['title'] = 'Device Configuration'
|
|
|
kwargs['suptitle'] = 'Parameters read from device'
|
|
|
kwargs['button'] = 'Save'
|
|
|
|
|
|
###### SIDEBAR ######
|
|
|
kwargs.update(sidebar(conf=conf))
|
|
|
|
|
|
return render(request, '%s_conf_edit.html' % conf.device.device_type.name, kwargs)
|
|
|
|
|
|
|
|
|
@login_required
|
|
|
def dev_conf_import(request, id_conf):
|
|
|
|
|
|
conf = get_object_or_404(Configuration, pk=id_conf)
|
|
|
DevConfForm = CONF_FORMS[conf.device.device_type.name]
|
|
|
|
|
|
if request.method == 'GET':
|
|
|
file_form = UploadFileForm()
|
|
|
|
|
|
if request.method == 'POST':
|
|
|
file_form = UploadFileForm(request.POST, request.FILES)
|
|
|
|
|
|
if file_form.is_valid():
|
|
|
|
|
|
data = conf.import_from_file(request.FILES['file'])
|
|
|
parms = Params(data=data).get_conf(
|
|
|
dtype=conf.device.device_type.name)
|
|
|
|
|
|
if parms:
|
|
|
|
|
|
form = DevConfForm(initial=parms, instance=conf)
|
|
|
|
|
|
kwargs = {}
|
|
|
kwargs['id_dev'] = conf.id
|
|
|
kwargs['form'] = form
|
|
|
kwargs['title'] = 'Device Configuration'
|
|
|
kwargs['suptitle'] = 'Parameters imported'
|
|
|
kwargs['button'] = 'Save'
|
|
|
kwargs['action'] = conf.get_absolute_url_edit()
|
|
|
kwargs['previous'] = conf.get_absolute_url()
|
|
|
|
|
|
###### SIDEBAR ######
|
|
|
kwargs.update(sidebar(conf=conf))
|
|
|
|
|
|
messages.success(
|
|
|
request, "Parameters imported from: '%s'." % request.FILES['file'].name)
|
|
|
|
|
|
return render(request, '%s_conf_edit.html' % conf.device.device_type.name, kwargs)
|
|
|
|
|
|
messages.error(request, "Could not import parameters from file")
|
|
|
|
|
|
kwargs = {}
|
|
|
kwargs['id_dev'] = conf.id
|
|
|
kwargs['title'] = 'Device Configuration'
|
|
|
kwargs['form'] = file_form
|
|
|
kwargs['suptitle'] = 'Importing file'
|
|
|
kwargs['button'] = 'Import'
|
|
|
kwargs['menu_configurations'] = 'active'
|
|
|
|
|
|
kwargs.update(sidebar(conf=conf))
|
|
|
|
|
|
return render(request, 'dev_conf_import.html', kwargs)
|
|
|
|
|
|
|
|
|
@login_required
|
|
|
def dev_conf_export(request, id_conf):
|
|
|
|
|
|
conf = get_object_or_404(Configuration, pk=id_conf)
|
|
|
|
|
|
if request.method == 'GET':
|
|
|
file_form = DownloadFileForm(conf.device.device_type.name)
|
|
|
|
|
|
if request.method == 'POST':
|
|
|
file_form = DownloadFileForm(
|
|
|
conf.device.device_type.name, request.POST)
|
|
|
|
|
|
if file_form.is_valid():
|
|
|
fields = conf.export_to_file(
|
|
|
format=file_form.cleaned_data['format'])
|
|
|
|
|
|
if not fields['content']:
|
|
|
messages.error(request, conf.message)
|
|
|
return redirect(conf.get_absolute_url_export())
|
|
|
response = HttpResponse(content_type=fields['content_type'])
|
|
|
response['Content-Disposition'] = 'attachment; filename="%s"' % fields['filename']
|
|
|
response.write(fields['content'])
|
|
|
|
|
|
return response
|
|
|
|
|
|
messages.error(request, "Could not export parameters")
|
|
|
|
|
|
kwargs = {}
|
|
|
kwargs['id_dev'] = conf.id
|
|
|
kwargs['title'] = 'Device Configuration'
|
|
|
kwargs['form'] = file_form
|
|
|
kwargs['suptitle'] = 'Exporting file'
|
|
|
kwargs['button'] = 'Export'
|
|
|
kwargs['menu_configurations'] = 'active'
|
|
|
|
|
|
return render(request, 'dev_conf_export.html', kwargs)
|
|
|
|
|
|
|
|
|
@login_required
|
|
|
def dev_conf_delete(request, id_conf):
|
|
|
|
|
|
conf = get_object_or_404(Configuration, pk=id_conf)
|
|
|
|
|
|
if request.method == 'POST':
|
|
|
if is_developer(request.user):
|
|
|
try:
|
|
|
conf.delete()
|
|
|
except Exception as e:
|
|
|
messages.error(request, "The device configuration is protected")
|
|
|
return redirect('url_dev_confs')
|
|
|
|
|
|
messages.error(request, 'Not enough permission to delete this object')
|
|
|
return redirect(conf.get_absolute_url())
|
|
|
|
|
|
kwargs = {
|
|
|
'title': 'Delete',
|
|
|
'suptitle': 'Configuration',
|
|
|
'object': conf,
|
|
|
'delete': True
|
|
|
}
|
|
|
kwargs['menu_configurations'] = 'active'
|
|
|
|
|
|
return render(request, 'confirm.html', kwargs)
|
|
|
|
|
|
|
|
|
def sidebar(**kwargs):
|
|
|
|
|
|
side_data = {}
|
|
|
|
|
|
conf = kwargs.get('conf', None)
|
|
|
confs = kwargs.get('confs', None)
|
|
|
experiment = kwargs.get('experiment', None)
|
|
|
|
|
|
if confs:
|
|
|
side_data['side_configurations'] = confs
|
|
|
|
|
|
if experiment:
|
|
|
side_data['experiment'] = experiment
|
|
|
experiments = [experiment]
|
|
|
#configurations = experiment.configuration_set.filter(type=0)
|
|
|
side_data['side_experiments'] = experiments
|
|
|
#side_data['side_configurations'] = configurations.order_by('device__device_type__name')
|
|
|
|
|
|
return side_data
|
|
|
|
|
|
|
|
|
def get_paginator(model, page, order, filters={}, n=8):
|
|
|
|
|
|
kwargs = {}
|
|
|
query = Q()
|
|
|
if isinstance(filters, QueryDict):
|
|
|
filters = filters.dict()
|
|
|
[filters.pop(key) for key in list(filters) if filters[key] in ('', ' ')]
|
|
|
filters.pop('page', None)
|
|
|
|
|
|
fields = [f.name for f in model._meta.get_fields()]
|
|
|
|
|
|
if 'historical' in filters:
|
|
|
filters.pop('historical')
|
|
|
filters['type'] = 1
|
|
|
elif 'type' in fields:
|
|
|
filters['type'] = 0
|
|
|
if 'start_date' in filters:
|
|
|
filters['start_date__gte'] = filters.pop('start_date')
|
|
|
if 'end_date' in filters:
|
|
|
filters['start_date__lte'] = filters.pop('end_date')
|
|
|
if 'tags' in filters:
|
|
|
tags = filters.pop('tags')
|
|
|
if 'tags' in fields:
|
|
|
query = query | Q(tags__icontains=tags)
|
|
|
if 'label' in fields:
|
|
|
query = query | Q(label__icontains=tags)
|
|
|
if 'device' in fields:
|
|
|
query = query | Q(device__device_type__name__icontains=tags)
|
|
|
if 'device_type' in fields:
|
|
|
query = query | Q(device_type__name__icontains=tags)
|
|
|
|
|
|
if 'mine' in filters:
|
|
|
filters['author_id'] = filters['mine']
|
|
|
filters.pop('mine')
|
|
|
object_list = model.objects.filter(query, **filters).order_by(*order)
|
|
|
paginator = Paginator(object_list, n)
|
|
|
|
|
|
try:
|
|
|
objects = paginator.page(page)
|
|
|
except PageNotAnInteger:
|
|
|
objects = paginator.page(1)
|
|
|
except EmptyPage:
|
|
|
objects = paginator.page(paginator.num_pages)
|
|
|
|
|
|
kwargs['objects'] = objects
|
|
|
kwargs['offset'] = (int(page)-1)*n if page else 0
|
|
|
|
|
|
return kwargs
|
|
|
|
|
|
@login_required
|
|
|
def revoke_tasks(request, id_camp):
|
|
|
|
|
|
i = app.control.inspect()
|
|
|
scheduled = list(i.scheduled().values())[0]
|
|
|
revoked = list(i.revoked().values())[0]
|
|
|
|
|
|
for t in scheduled:
|
|
|
if t['request']['id'] in revoked:
|
|
|
continue
|
|
|
app.control.revoke(t['request']['id'])
|
|
|
exp = Experiment.objects.get(pk=eval(str(t['request']['args']))[0])
|
|
|
eta = t['eta']
|
|
|
task = t['request']['name'].split('.')[-1]
|
|
|
messages.warning(request, 'Scheduled {} at {} for experiment {} revoked'.format(task, eta, exp.name))
|
|
|
|
|
|
return HttpResponseRedirect(reverse('url_operation', args=[id_camp]))
|
|
|
|
|
|
@login_required
|
|
|
def show_tasks(request, id_camp):
|
|
|
|
|
|
i = app.control.inspect()
|
|
|
scheduled = list(i.scheduled().values())[0]
|
|
|
revoked = list(i.revoked().values())[0]
|
|
|
|
|
|
for t in scheduled:
|
|
|
if t['request']['id'] in revoked:
|
|
|
continue
|
|
|
exp = Experiment.objects.get(pk=eval(str(t['request']['args']))[0])
|
|
|
eta = t['eta']
|
|
|
task = t['request']['name'].split('.')[-1]
|
|
|
messages.success(request, 'Task {} scheduled at {} for experiment {}'.format(task, eta, exp.name))
|
|
|
|
|
|
return HttpResponseRedirect(reverse('url_operation', args=[id_camp]))
|
|
|
|
|
|
def real_time(request):
|
|
|
|
|
|
graphic_path = "/home/fiorella/Pictures/catwbeanie.jpg"
|
|
|
|
|
|
kwargs = {}
|
|
|
kwargs['title'] = 'CLAIRE'
|
|
|
kwargs['suptitle'] = 'Real Time'
|
|
|
kwargs['no_sidebar'] = True
|
|
|
kwargs['graphic_path'] = graphic_path
|
|
|
kwargs['graphic1_path'] = 'http://www.bluemaize.net/im/girls-accessories/shark-beanie-11.jpg'
|
|
|
|
|
|
return render(request, 'real_time.html', kwargs)
|
|
|
|
|
|
def theme(request, theme):
|
|
|
|
|
|
user = request.user
|
|
|
user.profile.theme = theme
|
|
|
user.save()
|
|
|
return redirect('index')
|
|
|
|