views.py
406 lines
| 13.3 KiB
| text/x-python
|
PythonLexer
|
r79 | ||
|
r23 | import json | |
from django.contrib import messages | |||
|
r45 | from django.utils.safestring import mark_safe | |
|
r25 | from django.shortcuts import render, redirect, get_object_or_404, HttpResponse | |
|
r316 | from django.contrib.auth.decorators import login_required | |
|
r23 | ||
|
r172 | from apps.main.models import Experiment, Device | |
|
r25 | from apps.main.views import sidebar | |
|
r23 | ||
|
r45 | from .models import RCConfiguration, RCLine, RCLineType, RCLineCode | |
|
r79 | from .forms import RCConfigurationForm, RCLineForm, RCLineViewForm, RCLineEditForm, RCImportForm, RCLineCodesForm | |
|
r23 | ||
|
r45 | def conf(request, conf_id): | |
|
r23 | ||
|
r45 | conf = get_object_or_404(RCConfiguration, pk=conf_id) | |
|
r172 | ||
|
r23 | lines = RCLine.objects.filter(rc_configuration=conf).order_by('channel') | |
|
r172 | ||
|
r23 | for line in lines: | |
|
r45 | params = json.loads(line.params) | |
line.form = RCLineViewForm(extra_fields=params, line=line) | |||
if 'params' in params: | |||
line.subforms = [RCLineViewForm(extra_fields=fields, line=line, subform=True) for fields in params['params']] | |||
|
r172 | ||
|
r23 | kwargs = {} | |
kwargs['dev_conf'] = conf | |||
kwargs['rc_lines'] = lines | |||
|
r316 | kwargs['dev_conf_keys'] = ['ipp_unit', 'ntx', 'clock_in', 'clock_divider', 'clock', | |
'time_before', 'time_after', 'sync', 'sampling_reference', | |||
'control_tx', 'control_sw'] | |||
|
r172 | ||
|
r316 | kwargs['title'] = 'Configuration' | |
kwargs['suptitle'] = 'Detail' | |||
|
r172 | ||
|
r23 | kwargs['button'] = 'Edit Configuration' | |
###### SIDEBAR ###### | |||
|
r85 | kwargs.update(sidebar(conf=conf)) | |
|
r172 | ||
|
r23 | return render(request, 'rc_conf.html', kwargs) | |
|
r316 | @login_required | |
|
r45 | def conf_edit(request, conf_id): | |
|
r172 | ||
|
r45 | conf = get_object_or_404(RCConfiguration, pk=conf_id) | |
|
r172 | ||
|
r45 | lines = RCLine.objects.filter(rc_configuration=conf).order_by('channel') | |
|
r172 | ||
for line in lines: | |||
params = json.loads(line.params) | |||
|
r79 | line.form = RCLineEditForm(conf=conf, line=line, extra_fields=params) | |
line.subform = False | |||
|
r172 | ||
|
r45 | if 'params' in params: | |
|
r79 | line.subforms = [RCLineEditForm(extra_fields=fields, line=line, subform=i) for i, fields in enumerate(params['params'])] | |
|
r45 | line.subform = True | |
|
r172 | ||
|
r23 | if request.method=='GET': | |
|
r172 | ||
|
r23 | form = RCConfigurationForm(instance=conf) | |
|
r172 | ||
|
r45 | elif request.method=='POST': | |
|
r172 | ||
|
r45 | line_data = {} | |
conf_data = {} | |||
extras = [] | |||
|
r172 | ||
|
r45 | #classified post fields | |
for label,value in request.POST.items(): | |||
if label=='csrfmiddlewaretoken': | |||
continue | |||
|
r172 | ||
|
r45 | if label.count('|')==0: | |
conf_data[label] = value | |||
continue | |||
|
r172 | ||
elif label.split('|')[0]!='-1': | |||
|
r45 | extras.append(label) | |
|
r172 | continue | |
x, pk, name = label.split('|') | |||
|
r79 | if name=='codes': | |
value = [s for s in value.split('\r\n') if s] | |||
|
r172 | ||
|
r45 | if pk in line_data: | |
line_data[pk][name] = value | |||
else: | |||
line_data[pk] = {name:value} | |||
|
r172 | ||
|
r45 | #update conf | |
form = RCConfigurationForm(conf_data, instance=conf) | |||
|
r23 | if form.is_valid(): | |
|
r172 | ||
|
r23 | form.save() | |
|
r172 | ||
#update lines fields | |||
|
r45 | extras.sort() | |
for label in extras: | |||
x, pk, name = label.split('|') | |||
if pk not in line_data: | |||
line_data[pk] = {} | |||
if 'params' not in line_data[pk]: | |||
line_data[pk]['params'] = [] | |||
if len(line_data[pk]['params'])<int(x)+1: | |||
line_data[pk]['params'].append({}) | |||
line_data[pk]['params'][int(x)][name] = float(request.POST[label]) | |||
|
r172 | ||
|
r45 | for pk, params in line_data.items(): | |
line = RCLine.objects.get(pk=pk) | |||
if line.line_type.name in ('windows', 'prog_pulses'): | |||
if 'params' not in params: | |||
params['params'] = [] | |||
line.params = json.dumps(params) | |||
line.save() | |||
|
r172 | ||
|
r45 | #update pulses field | |
|
r172 | conf.update_pulses() | |
|
r45 | messages.success(request, 'RC Configuration successfully updated') | |
|
r172 | ||
return redirect(conf.get_absolute_url()) | |||
|
r23 | kwargs = {} | |
|
r25 | kwargs['dev_conf'] = conf | |
|
r23 | kwargs['form'] = form | |
|
r45 | kwargs['rc_lines'] = lines | |
kwargs['edit'] = True | |||
|
r172 | ||
|
r45 | kwargs['title'] = 'RC Configuration' | |
|
r172 | kwargs['suptitle'] = 'Edit' | |
|
r23 | kwargs['button'] = 'Update' | |
|
r172 | ||
|
r23 | return render(request, 'rc_conf_edit.html', kwargs) | |
|
r79 | def add_line(request, conf_id, line_type_id=None, code_id=None): | |
|
r172 | ||
|
r25 | conf = get_object_or_404(RCConfiguration, pk=conf_id) | |
|
r172 | ||
|
r23 | if request.method=='GET': | |
|
r25 | if line_type_id: | |
line_type = get_object_or_404(RCLineType, pk=line_type_id) | |||
|
r172 | ||
|
r79 | if code_id: | |
form = RCLineForm(initial={'rc_configuration':conf_id, 'line_type': line_type_id, 'code_id': code_id}, | |||
extra_fields=json.loads(line_type.params)) | |||
else: | |||
form = RCLineForm(initial={'rc_configuration':conf_id, 'line_type': line_type_id}, | |||
extra_fields=json.loads(line_type.params)) | |||
|
r25 | else: | |
|
r79 | line_type = {'id':0} | |
|
r25 | form = RCLineForm(initial={'rc_configuration':conf_id}) | |
|
r172 | ||
|
r23 | if request.method=='POST': | |
|
r172 | ||
|
r25 | line_type = get_object_or_404(RCLineType, pk=line_type_id) | |
|
r79 | form = RCLineForm(request.POST, | |
extra_fields=json.loads(line_type.params)) | |||
|
r172 | ||
|
r23 | if form.is_valid(): | |
form.save() | |||
|
r45 | form.instance.update_pulses() | |
return redirect('url_edit_rc_conf', conf.id) | |||
|
r172 | ||
|
r23 | kwargs = {} | |
kwargs['form'] = form | |||
kwargs['title'] = 'RC Configuration' | |||
kwargs['suptitle'] = 'Add Line' | |||
kwargs['button'] = 'Add' | |||
|
r45 | kwargs['previous'] = conf.get_absolute_url_edit() | |
|
r25 | kwargs['dev_conf'] = conf | |
|
r79 | kwargs['line_type'] = line_type | |
|
r172 | ||
|
r23 | return render(request, 'rc_add_line.html', kwargs) | |
|
r79 | def edit_codes(request, conf_id, line_id, code_id=None): | |
|
r172 | ||
|
r79 | conf = get_object_or_404(RCConfiguration, pk=conf_id) | |
|
r172 | line = get_object_or_404(RCLine, pk=line_id) | |
|
r79 | params = json.loads(line.params) | |
|
r172 | ||
|
r79 | if request.method=='GET': | |
if code_id: | |||
code = get_object_or_404(RCLineCode, pk=code_id) | |||
form = RCLineCodesForm(instance=code) | |||
else: | |||
|
r172 | initial = {'code': params['code'], | |
|
r79 | 'codes': params['codes'] if 'codes' in params else [], | |
'number_of_codes': len(params['codes']) if 'codes' in params else 0, | |||
'bits_per_code': len(params['codes'][0]) if 'codes' in params else 0, | |||
} | |||
form = RCLineCodesForm(initial=initial) | |||
|
r172 | ||
|
r79 | if request.method=='POST': | |
form = RCLineCodesForm(request.POST) | |||
if form.is_valid(): | |||
params['code'] = request.POST['code'] | |||
params['codes'] = [s for s in request.POST['codes'].split('\r\n') if s] | |||
line.params = json.dumps(params) | |||
line.save() | |||
messages.success(request, 'Line: "%s" has been updated.' % line) | |||
return redirect('url_edit_rc_conf', conf.id) | |||
|
r172 | ||
|
r79 | kwargs = {} | |
kwargs['form'] = form | |||
kwargs['title'] = line | |||
|
r172 | kwargs['suptitle'] = 'Edit' | |
|
r79 | kwargs['button'] = 'Update' | |
kwargs['dev_conf'] = conf | |||
kwargs['previous'] = conf.get_absolute_url_edit() | |||
kwargs['line'] = line | |||
|
r172 | ||
|
r79 | return render(request, 'rc_edit_codes.html', kwargs) | |
|
r45 | def add_subline(request, conf_id, line_id): | |
|
r172 | ||
|
r45 | conf = get_object_or_404(RCConfiguration, pk=conf_id) | |
line = get_object_or_404(RCLine, pk=line_id) | |||
|
r172 | ||
|
r45 | if request.method == 'POST': | |
if line: | |||
params = json.loads(line.params) | |||
|
r79 | subparams = json.loads(line.line_type.params) | |
if 'params' in subparams: | |||
dum = {} | |||
for key, value in subparams['params'].items(): | |||
dum[key] = value['value'] | |||
params['params'].append(dum) | |||
|
r45 | line.params = json.dumps(params) | |
line.save() | |||
return redirect('url_edit_rc_conf', conf.id) | |||
kwargs = {} | |||
|
r172 | ||
|
r45 | kwargs['title'] = 'Add new' | |
kwargs['suptitle'] = '%s to %s' % (line.line_type.name, line) | |||
|
r172 | ||
|
r45 | return render(request, 'confirm.html', kwargs) | |
|
r23 | ||
def remove_line(request, conf_id, line_id): | |||
|
r172 | ||
|
r23 | conf = get_object_or_404(RCConfiguration, pk=conf_id) | |
line = get_object_or_404(RCLine, pk=line_id) | |||
|
r172 | ||
|
r23 | if request.method == 'POST': | |
if line: | |||
try: | |||
channel = line.channel | |||
line.delete() | |||
for ch in range(channel+1, RCLine.objects.filter(rc_configuration=conf).count()+1): | |||
l = RCLine.objects.get(rc_configuration=conf, channel=ch) | |||
l.channel = l.channel-1 | |||
l.save() | |||
messages.success(request, 'Line: "%s" has been deleted.' % line) | |||
except: | |||
|
r172 | messages.error(request, 'Unable to delete line: "%s".' % line) | |
|
r23 | ||
|
r45 | return redirect('url_edit_rc_conf', conf.id) | |
|
r172 | ||
|
r23 | kwargs = {} | |
|
r172 | ||
|
r23 | kwargs['object'] = line | |
|
r142 | kwargs['delete'] = True | |
kwargs['title'] = 'Delete' | |||
kwargs['suptitle'] = 'Line' | |||
|
r45 | kwargs['previous'] = conf.get_absolute_url_edit() | |
|
r23 | return render(request, 'confirm.html', kwargs) | |
|
r79 | ||
|
r45 | def remove_subline(request, conf_id, line_id, subline_id): | |
|
r172 | ||
|
r23 | conf = get_object_or_404(RCConfiguration, pk=conf_id) | |
|
r45 | line = get_object_or_404(RCLine, pk=line_id) | |
|
r172 | ||
|
r45 | if request.method == 'POST': | |
if line: | |||
params = json.loads(line.params) | |||
params['params'].remove(params['params'][int(subline_id)-1]) | |||
|
r25 | line.params = json.dumps(params) | |
|
r45 | line.save() | |
return redirect('url_edit_rc_conf', conf.id) | |||
|
r23 | ||
|
r45 | kwargs = {} | |
|
r172 | ||
|
r45 | kwargs['object'] = line | |
kwargs['object_name'] = line.line_type.name | |||
kwargs['delete_view'] = True | |||
kwargs['title'] = 'Confirm delete' | |||
|
r172 | ||
|
r45 | return render(request, 'confirm.html', kwargs) | |
|
r172 | ||
|
r23 | ||
|
r45 | def update_lines_position(request, conf_id): | |
|
r172 | ||
|
r23 | conf = get_object_or_404(RCConfiguration, pk=conf_id) | |
|
r172 | ||
|
r25 | if request.method=='POST': | |
ch = 0 | |||
|
r172 | for item in request.POST['items'].split('&'): | |
|
r25 | line = RCLine.objects.get(pk=item.split('=')[-1]) | |
line.channel = ch | |||
|
r23 | line.save() | |
|
r172 | ch += 1 | |
|
r25 | lines = RCLine.objects.filter(rc_configuration=conf).order_by('channel') | |
|
r172 | ||
|
r25 | for line in lines: | |
|
r172 | params = json.loads(line.params) | |
|
r79 | line.form = RCLineEditForm(conf=conf, line=line, extra_fields=params) | |
|
r172 | ||
|
r79 | if 'params' in params: | |
line.subform = True | |||
line.subforms = [RCLineEditForm(extra_fields=fields, line=line, subform=i) for i, fields in enumerate(params['params'])] | |||
|
r172 | ||
|
r79 | html = render(request, 'rc_lines.html', {'dev_conf':conf, 'rc_lines':lines, 'edit':True}) | |
|
r172 | data = {'html': html.content.decode('utf8')} | |
|
r25 | return HttpResponse(json.dumps(data), content_type="application/json") | |
|
r45 | return redirect('url_edit_rc_conf', conf.id) | |
|
r79 | ||
|
r172 | ||
|
r45 | def import_file(request, conf_id): | |
|
r172 | ||
|
r45 | conf = get_object_or_404(RCConfiguration, pk=conf_id) | |
if request.method=='POST': | |||
form = RCImportForm(request.POST, request.FILES) | |||
|
r172 | if form.is_valid(): | |
|
r121 | try: | |
|
r264 | data = conf.import_from_file(request.FILES['file_name']) | |
conf.dict_to_parms(data) | |||
conf.update_pulses() | |||
|
r45 | messages.success(request, 'Configuration "%s" loaded succesfully' % request.FILES['file_name']) | |
|
r111 | return redirect(conf.get_absolute_url_edit()) | |
|
r172 | ||
except Exception as e: | |||
|
r264 | messages.error(request, 'Error parsing file: "%s" - %s' % (request.FILES['file_name'], repr(e))) | |
|
r45 | else: | |
messages.warning(request, 'Your current configuration will be replaced') | |||
|
r172 | form = RCImportForm() | |
|
r45 | kwargs = {} | |
kwargs['form'] = form | |||
kwargs['title'] = 'RC Configuration' | |||
kwargs['suptitle'] = 'Import file' | |||
kwargs['button'] = 'Upload' | |||
kwargs['previous'] = conf.get_absolute_url() | |||
|
r172 | ||
|
r45 | return render(request, 'rc_import.html', kwargs) | |
|
r172 | ||
|
r0 | ||
|
r111 | def plot_pulses(request, conf_id): | |
|
r172 | ||
conf = get_object_or_404(RCConfiguration, pk=conf_id) | |||
|
r157 | km = True if 'km' in request.GET else False | |
|
r172 | ||
|
r157 | script, div = conf.plot_pulses(km=km) | |
|
r172 | ||
|
r79 | kwargs = {} | |
|
r175 | kwargs['no_sidebar'] = True | |
kwargs['title'] = 'RC Pulses' | |||
kwargs['suptitle'] = conf.name | |||
kwargs['div'] = mark_safe(div) | |||
kwargs['script'] = mark_safe(script) | |||
kwargs['units'] = conf.km2unit | |||
kwargs['kms'] = 1/conf.km2unit | |||
if km: | |||
kwargs['km_selected'] = True | |||
if 'json' in request.GET: | |||
return HttpResponse(json.dumps({'div':mark_safe(div), 'script':mark_safe(script)}), content_type="application/json") | |||
else: | |||
return render(request, 'rc_pulses.html', kwargs) | |||
def plot_pulses2(request, conf_id): | |||
|
r172 | ||
|
r175 | conf = get_object_or_404(RCConfiguration, pk=conf_id) | |
km = True if 'km' in request.GET else False | |||
script, div = conf.plot_pulses2(km=km) | |||
kwargs = {} | |||
kwargs['no_sidebar'] = True | |||
|
r79 | kwargs['title'] = 'RC Pulses' | |
|
r172 | kwargs['suptitle'] = conf.name | |
|
r79 | kwargs['div'] = mark_safe(div) | |
kwargs['script'] = mark_safe(script) | |||
|
r116 | kwargs['units'] = conf.km2unit | |
kwargs['kms'] = 1/conf.km2unit | |||
|
r172 | ||
|
r157 | if km: | |
kwargs['km_selected'] = True | |||
|
r172 | ||
if 'json' in request.GET: | |||
|
r111 | return HttpResponse(json.dumps({'div':mark_safe(div), 'script':mark_safe(script)}), content_type="application/json") | |
else: | |||
return render(request, 'rc_pulses.html', kwargs) | |||
|
r316 | ||
def conf_raw(request, conf_id): | |||
conf = get_object_or_404(RCConfiguration, pk=conf_id) | |||
raw = conf.write_device(raw=True) | |||
return HttpResponse(raw, content_type='application/json') |