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 #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) kwargs = {} kwargs['experiment_keys'] = ['name', 'latitude', 'longitude', 'heading'] kwargs['experiment'] = experiment kwargs['experiment_pedestal_keys'] = ['mode', 'axis', 'speed', 'angle'] kwargs['experiment_pedestal'] = conf_pedestal kwargs['experiment_rx_keys'] = ['samplerate', 'frequency', 'datadir', 'clocksource', 'timesource', 'clockrate'] kwargs['experiment_rx'] = conf_rx kwargs['experiment_tx_keys'] = ['frequency', 'samplerate', 'ipp', 'delay', 'pulse_1', 'code_type_1', 'code_1', 'repetitions_1', 'enable_2', '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() 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(): experiment = form.save() form_pedestal.save() form_rx.save() form_tx.save() 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) exp.status = 0 if exp.status == 2: messages.warning(request, 'Experiment {} already runnnig'.format(exp)) else: exp.status = exp.start() 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): exp = get_object_or_404(Experiment, pk=id_exp) if exp.status == 2: exp.status = exp.stop() 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}
'.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', 'programmed_date', 'actions'] 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) conf.author = request.user conf.save() 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 {}'.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')