views.py
385 lines
| 13.1 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 | |||
|
r45 | from apps.main.models import Configuration, 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 | ||
from .utils import plot_pulses | ||||
|
r23 | |||
|
r45 | def conf(request, conf_id): | ||
|
r23 | |||
|
r45 | conf = get_object_or_404(RCConfiguration, pk=conf_id) | ||
|
r23 | |||
lines = RCLine.objects.filter(rc_configuration=conf).order_by('channel') | ||||
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']] | ||||
|
r23 | |||
kwargs = {} | ||||
kwargs['dev_conf'] = conf | ||||
kwargs['rc_lines'] = lines | ||||
|
r79 | kwargs['dev_conf_keys'] = ['name', 'ipp', 'ntx', 'clock_in', 'clock_divider', 'clock', | ||
'time_before', 'time_after', 'sync', 'sampling_reference', 'control_tx', 'control_sw'] | ||||
|
r23 | |||
kwargs['title'] = 'RC Configuration' | ||||
kwargs['suptitle'] = 'Details' | ||||
kwargs['button'] = 'Edit Configuration' | ||||
###### SIDEBAR ###### | ||||
|
r85 | kwargs.update(sidebar(conf=conf)) | ||
|
r23 | |||
return render(request, 'rc_conf.html', kwargs) | ||||
|
r45 | |||
def conf_edit(request, conf_id): | ||||
|
r23 | |||
|
r45 | conf = get_object_or_404(RCConfiguration, pk=conf_id) | ||
|
r23 | |||
|
r45 | lines = RCLine.objects.filter(rc_configuration=conf).order_by('channel') | ||
|
r79 | for line in lines: | ||
params = json.loads(line.params) | ||||
line.form = RCLineEditForm(conf=conf, line=line, extra_fields=params) | ||||
line.subform = False | ||||
|
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 | ||
|
r23 | |||
if request.method=='GET': | ||||
|
r45 | |||
|
r23 | form = RCConfigurationForm(instance=conf) | ||
|
r45 | |||
elif request.method=='POST': | ||||
|
r23 | |||
|
r45 | line_data = {} | ||
conf_data = {} | ||||
extras = [] | ||||
|
r23 | |||
|
r45 | #classified post fields | ||
for label,value in request.POST.items(): | ||||
if label=='csrfmiddlewaretoken': | ||||
continue | ||||
|
r79 | |||
|
r45 | if label.count('|')==0: | ||
conf_data[label] = value | ||||
continue | ||||
|
r79 | |||
elif label.split('|')[0]<>'-1': | ||||
|
r45 | extras.append(label) | ||
continue | ||||
|
r79 | x, pk, name = label.split('|') | ||
if name=='codes': | ||||
value = [s for s in value.split('\r\n') if s] | ||||
|
r45 | if pk in line_data: | ||
line_data[pk][name] = value | ||||
else: | ||||
line_data[pk] = {name:value} | ||||
#update conf | ||||
form = RCConfigurationForm(conf_data, instance=conf) | ||||
|
r23 | if form.is_valid(): | ||
|
r45 | |||
|
r23 | form.save() | ||
|
r45 | |||
#update lines fields | ||||
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]) | ||||
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() | ||||
#update pulses field | ||||
|
r107 | conf.update_pulses() | ||
|
r45 | |||
messages.success(request, 'RC Configuration successfully updated') | ||||
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 | ||||
kwargs['title'] = 'RC Configuration' | ||||
|
r23 | kwargs['suptitle'] = 'Edit' | ||
kwargs['button'] = 'Update' | ||||
kwargs['previous'] = conf.get_absolute_url() | ||||
|
r25 | |||
|
r23 | return render(request, 'rc_conf_edit.html', kwargs) | ||
|
r79 | def add_line(request, conf_id, line_type_id=None, code_id=None): | ||
|
r23 | |||
|
r25 | conf = get_object_or_404(RCConfiguration, pk=conf_id) | ||
|
r23 | |||
if request.method=='GET': | ||||
|
r25 | if line_type_id: | ||
line_type = get_object_or_404(RCLineType, pk=line_type_id) | ||||
|
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}) | ||
|
r23 | |||
if request.method=='POST': | ||||
|
r79 | |||
|
r25 | line_type = get_object_or_404(RCLineType, pk=line_type_id) | ||
|
r79 | form = RCLineForm(request.POST, | ||
extra_fields=json.loads(line_type.params)) | ||||
|
r23 | |||
if form.is_valid(): | ||||
form.save() | ||||
|
r45 | form.instance.update_pulses() | ||
return redirect('url_edit_rc_conf', conf.id) | ||||
|
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 | ||
|
r25 | |||
|
r23 | return render(request, 'rc_add_line.html', kwargs) | ||
|
r79 | def edit_codes(request, conf_id, line_id, code_id=None): | ||
conf = get_object_or_404(RCConfiguration, pk=conf_id) | ||||
line = get_object_or_404(RCLine, pk=line_id) | ||||
params = json.loads(line.params) | ||||
if request.method=='GET': | ||||
if code_id: | ||||
code = get_object_or_404(RCLineCode, pk=code_id) | ||||
form = RCLineCodesForm(instance=code) | ||||
else: | ||||
initial = {'code': params['code'], | ||||
'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) | ||||
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) | ||||
kwargs = {} | ||||
kwargs['form'] = form | ||||
kwargs['title'] = line | ||||
kwargs['suptitle'] = 'Edit' | ||||
kwargs['button'] = 'Update' | ||||
kwargs['dev_conf'] = conf | ||||
kwargs['previous'] = conf.get_absolute_url_edit() | ||||
kwargs['line'] = line | ||||
return render(request, 'rc_edit_codes.html', kwargs) | ||||
|
r45 | def add_subline(request, conf_id, line_id): | ||
conf = get_object_or_404(RCConfiguration, pk=conf_id) | ||||
line = get_object_or_404(RCLine, pk=line_id) | ||||
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 = {} | ||||
kwargs['title'] = 'Add new' | ||||
kwargs['suptitle'] = '%s to %s' % (line.line_type.name, line) | ||||
return render(request, 'confirm.html', kwargs) | ||||
|
r23 | |||
def remove_line(request, conf_id, line_id): | ||||
conf = get_object_or_404(RCConfiguration, pk=conf_id) | ||||
line = get_object_or_404(RCLine, pk=line_id) | ||||
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: | ||||
messages.error(request, 'Unable to delete line: "%s".' % line) | ||||
|
r45 | return redirect('url_edit_rc_conf', conf.id) | ||
|
r23 | |||
kwargs = {} | ||||
kwargs['object'] = line | ||||
kwargs['delete_view'] = True | ||||
kwargs['title'] = 'Confirm delete' | ||||
|
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): | ||
|
r23 | |||
conf = get_object_or_404(RCConfiguration, pk=conf_id) | ||||
|
r45 | line = get_object_or_404(RCLine, pk=line_id) | ||
|
r23 | |||
|
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 = {} | ||
|
r25 | |||
|
r45 | kwargs['object'] = line | ||
kwargs['object_name'] = line.line_type.name | ||||
kwargs['delete_view'] = True | ||||
kwargs['title'] = 'Confirm delete' | ||||
|
r25 | |||
|
r45 | return render(request, 'confirm.html', kwargs) | ||
|
r25 | |||
|
r23 | |||
|
r45 | def update_lines_position(request, conf_id): | ||
|
r23 | |||
conf = get_object_or_404(RCConfiguration, pk=conf_id) | ||||
|
r25 | |||
if request.method=='POST': | ||||
ch = 0 | ||||
for item in request.POST['items'].split('&'): | ||||
line = RCLine.objects.get(pk=item.split('=')[-1]) | ||||
line.channel = ch | ||||
|
r23 | line.save() | ||
|
r25 | ch += 1 | ||
lines = RCLine.objects.filter(rc_configuration=conf).order_by('channel') | ||||
for line in lines: | ||||
|
r79 | params = json.loads(line.params) | ||
line.form = RCLineEditForm(conf=conf, line=line, extra_fields=params) | ||||
if 'params' in params: | ||||
line.subform = True | ||||
line.subforms = [RCLineEditForm(extra_fields=fields, line=line, subform=i) for i, fields in enumerate(params['params'])] | ||||
|
r25 | |||
|
r79 | html = render(request, 'rc_lines.html', {'dev_conf':conf, 'rc_lines':lines, 'edit':True}) | ||
|
r25 | data = {'html': html.content} | ||
return HttpResponse(json.dumps(data), content_type="application/json") | ||||
|
r45 | return redirect('url_edit_rc_conf', conf.id) | ||
|
r79 | |||
|
r45 | |||
def import_file(request, conf_id): | ||||
|
r25 | |||
|
r45 | conf = get_object_or_404(RCConfiguration, pk=conf_id) | ||
if request.method=='POST': | ||||
form = RCImportForm(request.POST, request.FILES) | ||||
if form.is_valid(): | ||||
#try: | ||||
if True: | ||||
|
r79 | conf.update_from_file(request.FILES['file_name']) | ||
conf.save() | ||||
|
r45 | for line in conf.get_lines(): | ||
if line.line_type.name=='tr': | ||||
continue | ||||
line.update_pulses() | ||||
for tr in conf.get_lines('tr'): | ||||
|
r79 | tr.update_pulses() | ||
|
r45 | |||
messages.success(request, 'Configuration "%s" loaded succesfully' % request.FILES['file_name']) | ||||
return redirect(conf.get_absolute_url()) | ||||
#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') | ||||
|
r79 | form = RCImportForm() | ||
|
r45 | |||
kwargs = {} | ||||
kwargs['form'] = form | ||||
kwargs['title'] = 'RC Configuration' | ||||
kwargs['suptitle'] = 'Import file' | ||||
kwargs['button'] = 'Upload' | ||||
kwargs['previous'] = conf.get_absolute_url() | ||||
return render(request, 'rc_import.html', kwargs) | ||||
|
r79 | |||
|
r0 | |||
|
r45 | def view_pulses(request, conf_id): | ||
conf = get_object_or_404(RCConfiguration, pk=conf_id) | ||||
lines = RCLine.objects.filter(rc_configuration=conf) | ||||
unit = (conf.clock/conf.clock_divider)*3./20 | ||||
|
r107 | N = conf.ipp*conf.km2unit*conf.ntx | ||
|
r45 | |||
|
r79 | script, div = plot_pulses(unit, N, lines) | ||
|
r45 | |||
|
r79 | kwargs = {} | ||
|
r45 | |||
|
r79 | kwargs['title'] = 'RC Pulses' | ||
kwargs['suptitle'] = conf.name | ||||
kwargs['div'] = mark_safe(div) | ||||
kwargs['script'] = mark_safe(script) | ||||
return render(request, 'rc_pulses.html', kwargs) | ||||
|
r45 | |||