views.py
401 lines
| 13.0 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 | ||
|
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 | ||||
|
r172 | kwargs['dev_conf_keys'] = ['name', 'ipp_unit', 'ntx', 'clock_in', 'clock_divider', 'clock', | ||
|
r79 | 'time_before', 'time_after', 'sync', 'sampling_reference', 'control_tx', 'control_sw'] | ||
|
r172 | |||
|
r23 | kwargs['title'] = 'RC Configuration' | ||
kwargs['suptitle'] = 'Details' | ||||
|
r172 | |||
|
r23 | kwargs['button'] = 'Edit Configuration' | ||
###### SIDEBAR ###### | ||||
|
r85 | kwargs.update(sidebar(conf=conf)) | ||
|
r172 | |||
|
r23 | return render(request, 'rc_conf.html', kwargs) | ||
|
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' | ||
kwargs['previous'] = conf.get_absolute_url() | ||||
|
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: | ||
|
r157 | #if True: | ||
|
r79 | conf.update_from_file(request.FILES['file_name']) | ||
|
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: | ||||
|
r121 | messages.error(request, 'Error parsing file: "%s" - %s' % (request.FILES['file_name'], e)) | ||
|
r172 | |||
|
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) | ||||