views.py
405 lines
| 12.0 KiB
| text/x-python
|
PythonLexer
|
r166 | from django.shortcuts import render_to_response | |
from django.template import RequestContext | |||
from django.shortcuts import redirect, render, get_object_or_404 | |||
from django.contrib import messages | |||
|
r177 | from django.conf import settings | |
from django.http import HttpResponse | |||
|
r183 | from django.core.urlresolvers import reverse | |
|
r177 | ||
from datetime import datetime | |||
from time import sleep | |||
import os | |||
|
r309 | import io | |
|
r0 | ||
|
r205 | from apps.main.models import Device, Configuration, Experiment | |
|
r166 | from apps.main.views import sidebar | |
from .models import ABSConfiguration, ABSBeam | |||
|
r190 | from .forms import ABSConfigurationForm, ABSBeamEditForm, ABSBeamAddForm, ABSImportForm | |
|
r177 | ||
from .utils.overJroShow import overJroShow | |||
from .utils.OverJRO import OverJRO | |||
|
r0 | # Create your views here. | |
|
r166 | import json, ast | |
def get_values_from_form(form_data): | |||
sublistup = [] | |||
sublistdown = [] | |||
subtxlistup = [] | |||
subtxlistdown = [] | |||
subrxlistup = [] | |||
subrxlistdown = [] | |||
up_values_list = [] | |||
down_values_list = [] | |||
up_txvalues_list = [] | |||
down_txvalues_list = [] | |||
up_rxvalues_list = [] | |||
down_rxvalues_list = [] | |||
values_list = {} | |||
cont = 1 | |||
for i in range(1,65): | |||
x = float(form_data['abs_up'+str(i)]) | |||
y = float(form_data['abs_down'+str(i)]) | |||
sublistup.append(x) | |||
sublistdown.append(y) | |||
if str(i) in form_data.getlist('uptx_checks'): | |||
subtxlistup.append(1) | |||
else: | |||
subtxlistup.append(0) | |||
if str(i) in form_data.getlist('downtx_checks'): | |||
subtxlistdown.append(1) | |||
else: | |||
subtxlistdown.append(0) | |||
if str(i) in form_data.getlist('uprx_checks'): | |||
subrxlistup.append(1) | |||
else: | |||
subrxlistup.append(0) | |||
if str(i) in form_data.getlist('downrx_checks'): | |||
subrxlistdown.append(1) | |||
else: | |||
subrxlistdown.append(0) | |||
cont = cont+1 | |||
if cont == 9: | |||
up_values_list.append(sublistup) | |||
down_values_list.append(sublistdown) | |||
sublistup = [] | |||
sublistdown = [] | |||
up_txvalues_list.append(subtxlistup) | |||
down_txvalues_list.append(subtxlistdown) | |||
subtxlistup = [] | |||
subtxlistdown = [] | |||
up_rxvalues_list.append(subrxlistup) | |||
down_rxvalues_list.append(subrxlistdown) | |||
subrxlistup = [] | |||
subrxlistdown = [] | |||
cont = 1 | |||
list_uesup = [] | |||
list_uesdown = [] | |||
for i in range(1,5): | |||
if form_data['ues_up'+str(i)] == '': | |||
list_uesup.append(0.0) | |||
else: | |||
list_uesup.append(float(form_data['ues_up'+str(i)])) | |||
if form_data['ues_down'+str(i)] == '': | |||
list_uesdown.append(0.0) | |||
else: | |||
list_uesdown.append(float(form_data['ues_down'+str(i)])) | |||
onlyrx_list = form_data.getlist('onlyrx') | |||
only_rx = {} | |||
if '1' in onlyrx_list: | |||
only_rx['up'] = True | |||
else: | |||
only_rx['up'] = False | |||
if '2' in onlyrx_list: | |||
only_rx['down'] = True | |||
else: | |||
only_rx['down'] = False | |||
antenna = {'antenna_up': up_values_list, 'antenna_down': down_values_list} | |||
tx = {'up': up_txvalues_list, 'down': down_txvalues_list} | |||
rx = {'up': up_rxvalues_list, 'down': down_rxvalues_list} | |||
ues = {'up': list_uesup, 'down': list_uesdown} | |||
name = str(form_data['beam_name']) | |||
beam_data = {'name': name, 'antenna': antenna, 'tx': tx, 'rx': rx, 'ues': ues, 'only_rx': only_rx} | |||
return beam_data | |||
|
r307 | def abs_conf(request, id_conf): | |
|
r166 | ||
|
r307 | conf = get_object_or_404(ABSConfiguration, pk=id_conf) | |
beams = ABSBeam.objects.filter(abs_conf=conf) | |||
|
r182 | #------------Colors for Active Beam:------------- | |
|
r307 | all_status = {} | |
|
r203 | module_messages = json.loads(conf.module_messages) | |
|
r182 | ||
color_status = {} | |||
|
r307 | for i, status in enumerate(conf.module_status): | |
if status == '3': #Running background-color: #00cc00; | |||
all_status['{}'.format(i+1)] = 2 | |||
color_status['{}'.format(i+1)] = 'class=text-success'#'bgcolor=#00cc00' | |||
elif status == '1': #Connected background-color: #ee902c; | |||
all_status['{}'.format(i+1)] = 1 | |||
color_status['{}'.format(i+1)] = 'class=text-warning'#'bgcolor=#ee902c' | |||
else: #Disconnected background-color: #ff0000; | |||
all_status['{}'.format(i+1)] = 0 | |||
color_status['{}'.format(i+1)] = 'class=text-danger'#'bgcolor=#FF0000' | |||
|
r182 | #------------------------------------------------ | |
|
r166 | ||
kwargs = {} | |||
|
r199 | kwargs['connected_modules'] = str(conf.connected_modules())+'/64' | |
|
r166 | kwargs['dev_conf'] = conf | |
|
r307 | ||
|
r206 | if conf.operation_mode == 0: | |
|
r316 | kwargs['dev_conf_keys'] = ['label', 'operation_mode'] | |
|
r206 | else: | |
|
r316 | kwargs['dev_conf_keys'] = ['label', 'operation_mode', 'operation_value'] | |
|
r166 | ||
kwargs['title'] = 'ABS Configuration' | |||
kwargs['suptitle'] = 'Details' | |||
kwargs['button'] = 'Edit Configuration' | |||
|
r307 | ||
if conf.active_beam != 0: | |||
kwargs['active_beam'] = int(conf.active_beam) | |||
kwargs['beams'] = beams | |||
kwargs['modules_status'] = all_status | |||
|
r182 | kwargs['color_status'] = color_status | |
|
r203 | kwargs['module_messages'] = module_messages | |
|
r166 | ###### SIDEBAR ###### | |
kwargs.update(sidebar(conf=conf)) | |||
return render(request, 'abs_conf.html', kwargs) | |||
|
r258 | ||
|
r166 | def abs_conf_edit(request, id_conf): | |
conf = get_object_or_404(ABSConfiguration, pk=id_conf) | |||
|
r190 | ||
|
r181 | beams = ABSBeam.objects.filter(abs_conf=conf) | |
|
r166 | ||
if request.method=='GET': | |||
form = ABSConfigurationForm(instance=conf) | |||
if request.method=='POST': | |||
form = ABSConfigurationForm(request.POST, instance=conf) | |||
if form.is_valid(): | |||
conf = form.save(commit=False) | |||
conf.save() | |||
return redirect('url_abs_conf', id_conf=conf.id) | |||
###### SIDEBAR ###### | |||
kwargs = {} | |||
kwargs['dev_conf'] = conf | |||
#kwargs['id_dev'] = conf.id | |||
kwargs['id_conf'] = conf.id | |||
kwargs['form'] = form | |||
kwargs['abs_beams'] = beams | |||
kwargs['title'] = 'Device Configuration' | |||
kwargs['suptitle'] = 'Edit' | |||
kwargs['button'] = 'Save' | |||
kwargs['edit'] = True | |||
return render(request, 'abs_conf_edit.html', kwargs) | |||
|
r190 | def import_file(request, id_conf): | |
conf = get_object_or_404(ABSConfiguration, pk=id_conf) | |||
if request.method=='POST': | |||
form = ABSImportForm(request.POST, request.FILES) | |||
if form.is_valid(): | |||
try: | |||
parms = conf.import_from_file(request.FILES['file_name']) | |||
if parms: | |||
conf.update_from_file(parms) | |||
messages.success(request, 'Configuration "%s" loaded succesfully' % request.FILES['file_name']) | |||
return redirect(conf.get_absolute_url_edit()) | |||
except Exception as e: | |||
messages.error(request, 'Error parsing file: "%s" - %s' % (request.FILES['file_name'], e)) | |||
else: | |||
messages.warning(request, 'Your current configuration will be replaced') | |||
form = ABSImportForm() | |||
kwargs = {} | |||
kwargs['form'] = form | |||
kwargs['title'] = 'ABS Configuration' | |||
kwargs['suptitle'] = 'Import file' | |||
kwargs['button'] = 'Upload' | |||
kwargs['previous'] = conf.get_absolute_url() | |||
return render(request, 'abs_import.html', kwargs) | |||
|
r183 | def send_beam(request, id_conf, id_beam): | |
conf = get_object_or_404(ABSConfiguration, pk=id_conf) | |||
beam = get_object_or_404(ABSBeam, pk=id_beam) | |||
beams_list = ABSBeam.objects.filter(abs_conf=conf) | |||
|
r307 | conf.active_beam = id_beam | |
|
r183 | i = 0 | |
for b in beams_list: | |||
if b.id == int(id_beam): | |||
break | |||
else: | |||
i += 1 | |||
beam_pos = i + 1 #Estandarizar | |||
|
r278 | print '%s Position: %s' % (beam.name, str(beam_pos)) | |
|
r307 | conf.send_beam(beam_pos) | |
|
r183 | ||
return redirect('url_abs_conf', conf.id) | |||
|
r166 | ||
def add_beam(request, id_conf): | |||
conf = get_object_or_404(ABSConfiguration, pk=id_conf) | |||
confs = Configuration.objects.all() | |||
if request.method=='GET': | |||
form = ABSBeamAddForm() | |||
if request.method=='POST': | |||
form = ABSBeamAddForm(request.POST) | |||
beam_data = get_values_from_form(request.POST) | |||
new_beam = ABSBeam( | |||
|
r307 | name = beam_data['name'], | |
antenna = json.dumps(beam_data['antenna']), | |||
abs_conf = conf, | |||
tx = json.dumps(beam_data['tx']), | |||
rx = json.dumps(beam_data['rx']), | |||
ues = json.dumps(beam_data['ues']), | |||
only_rx = json.dumps(beam_data['only_rx']) | |||
|
r166 | ) | |
new_beam.save() | |||
messages.success(request, 'Beam: "%s" has been added.' % new_beam.name) | |||
return redirect('url_edit_abs_conf', conf.id) | |||
###### SIDEBAR ###### | |||
kwargs = {} | |||
#kwargs['dev_conf'] = conf.device | |||
#kwargs['id_dev'] = conf.device | |||
kwargs['id_conf'] = conf.id | |||
kwargs['form'] = form | |||
kwargs['title'] = 'ABS Beams' | |||
kwargs['suptitle'] = 'Add Beam' | |||
kwargs['button'] = 'Add' | |||
kwargs['no_sidebar'] = True | |||
#kwargs['previous'] = conf.get_absolute_url_edit() | |||
kwargs['edit'] = True | |||
return render(request, 'abs_add_beam.html', kwargs) | |||
def edit_beam(request, id_conf, id_beam): | |||
conf = get_object_or_404(ABSConfiguration, pk=id_conf) | |||
beam = get_object_or_404(ABSBeam, pk=id_beam) | |||
if request.method=='GET': | |||
form = ABSBeamEditForm(initial={'beam': beam}) | |||
if request.method=='POST': | |||
form = ABSBeamEditForm(request.POST) | |||
beam_data = get_values_from_form(request.POST) | |||
beam.dict_to_parms(beam_data) | |||
beam.save() | |||
messages.success(request, 'Beam: "%s" has been updated.' % beam.name) | |||
return redirect('url_edit_abs_conf', conf.id) | |||
###### SIDEBAR ###### | |||
kwargs = {} | |||
kwargs['id_conf'] = conf.id | |||
kwargs['form'] = form | |||
kwargs['title'] = 'ABS Beams' | |||
kwargs['suptitle'] = 'Edit Beam' | |||
kwargs['button'] = 'Save' | |||
kwargs['no_sidebar'] = True | |||
#kwargs['previous'] = conf.get_absolute_url_edit() | |||
kwargs['edit'] = True | |||
|
r168 | return render(request, 'abs_edit_beam.html', kwargs) | |
|
r166 | ||
def remove_beam(request, id_conf, id_beam): | |||
conf = get_object_or_404(ABSConfiguration, pk=id_conf) | |||
beam = get_object_or_404(ABSBeam, pk=id_beam) | |||
if request.method=='POST': | |||
if beam: | |||
try: | |||
beam.remove_beamfromlist() | |||
beam.delete() | |||
messages.success(request, 'Beam: "%s" has been deleted.' % beam) | |||
except: | |||
messages.error(request, 'Unable to delete beam: "%s".' % beam) | |||
return redirect('url_edit_abs_conf', conf.id) | |||
###### SIDEBAR ###### | |||
kwargs = {} | |||
kwargs['object'] = beam | |||
kwargs['delete'] = True | |||
kwargs['title'] = 'Delete' | |||
kwargs['suptitle'] = 'Beam' | |||
kwargs['previous'] = conf.get_absolute_url_edit() | |||
return render(request, 'confirm.html', kwargs) | |||
|
r177 | ||
|
r180 | def plot_patterns(request, id_conf, id_beam=None): | |
|
r177 | ||
kwargs = {} | |||
|
r180 | conf = get_object_or_404(ABSConfiguration, pk=id_conf) | |
beams = ABSBeam.objects.filter(abs_conf=conf) | |||
|
r190 | ||
|
r180 | if id_beam: | |
beam = get_object_or_404(ABSBeam, pk=id_beam) | |||
|
r309 | kwargs['beam'] = beam | |
|
r190 | ||
###### SIDEBAR ###### | |||
|
r177 | ||
kwargs['dev_conf'] = conf.device | |||
kwargs['id_dev'] = conf.device | |||
kwargs['id_conf'] = conf.id | |||
kwargs['abs_beams'] = beams | |||
kwargs['title'] = 'ABS Patterns' | |||
kwargs['suptitle'] = conf.name | |||
kwargs['no_sidebar'] = True | |||
return render(request, 'abs_patterns.html', kwargs) | |||
|
r180 | def plot_pattern(request, id_conf, id_beam, antenna): | |
|
r190 | ||
|
r180 | if antenna=='down': | |
sleep(3) | |||
|
r190 | ||
|
r180 | conf = get_object_or_404(ABSConfiguration, pk=id_conf) | |
beam = get_object_or_404(ABSBeam, pk=id_beam) | |||
|
r190 | just_rx = 1 if json.loads(beam.only_rx)[antenna] else 0 | |
|
r180 | phases = json.loads(beam.antenna)['antenna_{}'.format(antenna)] | |
gain_tx = json.loads(beam.tx)[antenna] | |||
gain_rx = json.loads(beam.rx)[antenna] | |||
ues = json.loads(beam.ues)[antenna] | |||
|
r309 | newOverJro = overJroShow(beam.name) | |
|
r190 | fig = newOverJro.plotPattern2(datetime.today(), phases, gain_tx, gain_rx, ues, just_rx) | |
|
r309 | buf = io.BytesIO() | |
fig.savefig(buf, format='png') | |||
response = HttpResponse(buf.getvalue(), content_type='image/png') | |||
|
r177 | return response | |
|
r309 |