##// END OF EJS Templates
App JARS funcional
gonzalesluisfrancisco -
r345:cf456d2fb627
parent child
Show More
@@ -0,0 +1,2
1 {% extends "base_edit.html" %}
2
@@ -1,47 +1,46
1 # Integrated Radar System (SIR)
1 # Integrated Radar System (SIR)
2
2
3 The Integrated Radar System (SIR) is a web application that allows the configuration of the radar devices as required by the experiment,
3 The Integrated Radar System (SIR) is a web application that allows the configuration of the radar devices as required by the experiment,
4 This app allows the creation of Campaigns, Experiment and Device Configurations.
4 This app allows the creation of Campaigns, Experiment and Device Configurations.
5 For the python3.0 update please check the requeriments vrsion for each package. It depends on the python 3.7 or 3.8 version.
5 For the python3.0 update please check the requeriments vrsion for each package. It depends on the python 3.7 or 3.8 version. Special attention with the bokeh version.
6 Special attention with the bokeh version.
7 For more information visit: http://jro-dev.igp.gob.pe:3000/projects/sistema-integrado-de-radar/wiki
6 For more information visit: http://jro-dev.igp.gob.pe:3000/projects/sistema-integrado-de-radar/wiki
8
7
9 ## Installation
8 ## Installation
10
9
11 We recommend use docker/docker-compose for test/production but you can install the aplication as a normal django app.
10 We recommend use docker/docker-compose for test/production but you can install the aplication as a normal django app.
12
11
13 ### 1. Download
12 ### 1. Download
14
13
15 Download the application *radarsys* to your workspace
14 Download the application *radarsys* to your workspace
16
15
17 $ cd /path/to/your/workspace
16 $ cd /path/to/your/workspace
18 $ git clone http://jro-dev.igp.gob.pe/rhodecode/radarsys && cd radarsys
17 $ git clone http://jro-dev.igp.gob.pe/rhodecode/radarsys && cd radarsys
19
18
20 ### 2. Config app
19 ### 2. Config app
21
20
22 Update enviroment vars (/path/to/radarsys/.env)
21 Update enviroment vars (/path/to/radarsys/.env)
23
22
24 REDIS_HOST=radarsys-redis
23 REDIS_HOST=radarsys-redis
25 REDIS_PORT=6300
24 REDIS_PORT=6300
26 POSTGRES_DB_NAME=radarsys
25 POSTGRES_DB_NAME=radarsys
27 POSTGRES_PORT_5432_TCP_ADDR=radarsys-postgres
26 POSTGRES_PORT_5432_TCP_ADDR=radarsys-postgres
28 POSTGRES_PORT_5432_TCP_PORT=5400
27 POSTGRES_PORT_5432_TCP_PORT=5400
29 POSTGRES_USER=docker
28 POSTGRES_USER=docker
30 POSTGRES_PASSWORD=****
29 POSTGRES_PASSWORD=****
31 PGDATA=/var/lib/postgresql/data
30 PGDATA=/var/lib/postgresql/data
32 LC_ALL=C.UTF-8
31 LC_ALL=C.UTF-8
33
32
34 ### 3. Build application & make migrations (only once at installation)
33 ### 3. Build application & make migrations (only once at installation)
35
34
36 $ cd /path/to/radarsys
35 $ cd /path/to/radarsys
37 $ docker-compose build
36 $ docker-compose build
38 $ docker-compose run web python manage.py makemigrations
37 $ docker-compose run web python manage.py makemigrations
39 $ docker-compose run web python manage.py migrate
38 $ docker-compose run web python manage.py migrate
40 $ docker-compose run web python manage.py loaddata apps/main/fixtures/main_initial_data.json
39 $ docker-compose run web python manage.py loaddata apps/main/fixtures/main_initial_data.json
41 $ docker-compose run web python manage.py loaddata apps/rc/fixtures/rc_initial_data.json
40 $ docker-compose run web python manage.py loaddata apps/rc/fixtures/rc_initial_data.json
42 $ docker-compose run web python manage.py loaddata apps/jars/fixtures/initial_filters_data.json
41 $ docker-compose run web python manage.py loaddata apps/jars/fixtures/initial_filters_data.json
43 $ docker-compose run web python manage.py collectstatic
42 $ docker-compose run web python manage.py collectstatic
44
43
45 ### 4. Run containers
44 ### 4. Run containers
46
45
47 $ docker-compose up -d
46 $ docker-compose up -d
@@ -1,446 +1,445
1 from django.shortcuts import render_to_response
1 from django.shortcuts import render_to_response
2 from django.template import RequestContext
2 from django.template import RequestContext
3 from django.shortcuts import redirect, render, get_object_or_404
3 from django.shortcuts import redirect, render, get_object_or_404
4 from django.contrib import messages
4 from django.contrib import messages
5 from django.conf import settings
5 from django.conf import settings
6 from django.http import HttpResponse
6 from django.http import HttpResponse
7 from django.urls import reverse
7 from django.urls import reverse
8 from django.views.decorators.csrf import csrf_exempt
8 from django.views.decorators.csrf import csrf_exempt
9 from django.utils.safestring import mark_safe
9 from django.utils.safestring import mark_safe
10
10
11 from datetime import datetime
11 from datetime import datetime
12 from time import sleep
12 from time import sleep
13 import os
13 import os
14 import io
14 import io
15
15
16 from apps.main.models import Device, Configuration, Experiment
16 from apps.main.models import Device, Configuration, Experiment
17 from apps.main.views import sidebar
17 from apps.main.views import sidebar
18
18
19 from .models import ABSConfiguration, ABSBeam
19 from .models import ABSConfiguration, ABSBeam
20 from .forms import ABSConfigurationForm, ABSBeamEditForm, ABSBeamAddForm, ABSImportForm
20 from .forms import ABSConfigurationForm, ABSBeamEditForm, ABSBeamAddForm, ABSImportForm
21
21
22 from .utils.overJroShow import overJroShow
22 from .utils.overJroShow import overJroShow
23 #from .utils.OverJRO import OverJRO
23 #from .utils.OverJRO import OverJRO
24 # Create your views here.
24 #Create your views here.
25 import json, ast
25 import json, ast
26
26
27
27
28 def get_values_from_form(form_data):
28 def get_values_from_form(form_data):
29
29
30 sublistup = []
30 sublistup = []
31 sublistdown = []
31 sublistdown = []
32 subtxlistup = []
32 subtxlistup = []
33 subtxlistdown = []
33 subtxlistdown = []
34 subrxlistup = []
34 subrxlistup = []
35 subrxlistdown = []
35 subrxlistdown = []
36
36
37 up_values_list = []
37 up_values_list = []
38 down_values_list = []
38 down_values_list = []
39 up_txvalues_list = []
39 up_txvalues_list = []
40 down_txvalues_list = []
40 down_txvalues_list = []
41 up_rxvalues_list = []
41 up_rxvalues_list = []
42 down_rxvalues_list = []
42 down_rxvalues_list = []
43
43
44 values_list = {}
44 values_list = {}
45 cont = 1
45 cont = 1
46
46
47 for i in range(1,65):
47 for i in range(1,65):
48 x = float(form_data['abs_up'+str(i)])
48 x = float(form_data['abs_up'+str(i)])
49 y = float(form_data['abs_down'+str(i)])
49 y = float(form_data['abs_down'+str(i)])
50 sublistup.append(x)
50 sublistup.append(x)
51 sublistdown.append(y)
51 sublistdown.append(y)
52
52
53 if str(i) in form_data.getlist('uptx_checks'):
53 if str(i) in form_data.getlist('uptx_checks'):
54 subtxlistup.append(1)
54 subtxlistup.append(1)
55 else:
55 else:
56 subtxlistup.append(0)
56 subtxlistup.append(0)
57 if str(i) in form_data.getlist('downtx_checks'):
57 if str(i) in form_data.getlist('downtx_checks'):
58 subtxlistdown.append(1)
58 subtxlistdown.append(1)
59 else:
59 else:
60 subtxlistdown.append(0)
60 subtxlistdown.append(0)
61
61
62 if str(i) in form_data.getlist('uprx_checks'):
62 if str(i) in form_data.getlist('uprx_checks'):
63 subrxlistup.append(1)
63 subrxlistup.append(1)
64 else:
64 else:
65 subrxlistup.append(0)
65 subrxlistup.append(0)
66 if str(i) in form_data.getlist('downrx_checks'):
66 if str(i) in form_data.getlist('downrx_checks'):
67 subrxlistdown.append(1)
67 subrxlistdown.append(1)
68 else:
68 else:
69 subrxlistdown.append(0)
69 subrxlistdown.append(0)
70
70
71 cont = cont+1
71 cont = cont+1
72
72
73 if cont == 9:
73 if cont == 9:
74 up_values_list.append(sublistup)
74 up_values_list.append(sublistup)
75 down_values_list.append(sublistdown)
75 down_values_list.append(sublistdown)
76 sublistup = []
76 sublistup = []
77 sublistdown = []
77 sublistdown = []
78
78
79 up_txvalues_list.append(subtxlistup)
79 up_txvalues_list.append(subtxlistup)
80 down_txvalues_list.append(subtxlistdown)
80 down_txvalues_list.append(subtxlistdown)
81 subtxlistup = []
81 subtxlistup = []
82 subtxlistdown = []
82 subtxlistdown = []
83 up_rxvalues_list.append(subrxlistup)
83 up_rxvalues_list.append(subrxlistup)
84 down_rxvalues_list.append(subrxlistdown)
84 down_rxvalues_list.append(subrxlistdown)
85 subrxlistup = []
85 subrxlistup = []
86 subrxlistdown = []
86 subrxlistdown = []
87 cont = 1
87 cont = 1
88
88
89
89
90 list_uesup = []
90 list_uesup = []
91 list_uesdown = []
91 list_uesdown = []
92 for i in range(1,5):
92 for i in range(1,5):
93 if form_data['ues_up'+str(i)] == '':
93 if form_data['ues_up'+str(i)] == '':
94 list_uesup.append(0.0)
94 list_uesup.append(0.0)
95 else:
95 else:
96 list_uesup.append(float(form_data['ues_up'+str(i)]))
96 list_uesup.append(float(form_data['ues_up'+str(i)]))
97
97
98 if form_data['ues_down'+str(i)] == '':
98 if form_data['ues_down'+str(i)] == '':
99 list_uesdown.append(0.0)
99 list_uesdown.append(0.0)
100 else:
100 else:
101 list_uesdown.append(float(form_data['ues_down'+str(i)]))
101 list_uesdown.append(float(form_data['ues_down'+str(i)]))
102
102
103 onlyrx_list = form_data.getlist('onlyrx')
103 onlyrx_list = form_data.getlist('onlyrx')
104 only_rx = {}
104 only_rx = {}
105 if '1' in onlyrx_list:
105 if '1' in onlyrx_list:
106 only_rx['up'] = True
106 only_rx['up'] = True
107 else:
107 else:
108 only_rx['up'] = False
108 only_rx['up'] = False
109 if '2' in onlyrx_list:
109 if '2' in onlyrx_list:
110 only_rx['down'] = True
110 only_rx['down'] = True
111 else:
111 else:
112 only_rx['down'] = False
112 only_rx['down'] = False
113
113
114 antenna = {'antenna_up': up_values_list, 'antenna_down': down_values_list}
114 antenna = {'antenna_up': up_values_list, 'antenna_down': down_values_list}
115 tx = {'up': up_txvalues_list, 'down': down_txvalues_list}
115 tx = {'up': up_txvalues_list, 'down': down_txvalues_list}
116 rx = {'up': up_rxvalues_list, 'down': down_rxvalues_list}
116 rx = {'up': up_rxvalues_list, 'down': down_rxvalues_list}
117 ues = {'up': list_uesup, 'down': list_uesdown}
117 ues = {'up': list_uesup, 'down': list_uesdown}
118 name = str(form_data['beam_name'])
118 name = str(form_data['beam_name'])
119
119
120 beam_data = {'name': name, 'antenna': antenna, 'tx': tx, 'rx': rx, 'ues': ues, 'only_rx': only_rx}
120 beam_data = {'name': name, 'antenna': antenna, 'tx': tx, 'rx': rx, 'ues': ues, 'only_rx': only_rx}
121
121
122 return beam_data
122 return beam_data
123
123
124
124
125 def abs_conf(request, id_conf):
125 def abs_conf(request, id_conf):
126
126
127 conf = get_object_or_404(ABSConfiguration, pk=id_conf)
127 conf = get_object_or_404(ABSConfiguration, pk=id_conf)
128 beams = ABSBeam.objects.filter(abs_conf=conf)
128 beams = ABSBeam.objects.filter(abs_conf=conf)
129 #------------Colors for Active Beam:-------------
129 #------------Colors for Active Beam:-------------
130 all_status = {}
130 all_status = {}
131 module_messages = json.loads(conf.module_messages)
131 module_messages = json.loads(conf.module_messages)
132
132
133 color_status = {}
133 color_status = {}
134 for i, status in enumerate(conf.module_status):
134 for i, status in enumerate(conf.module_status):
135 if status == '3': #Running background-color: #00cc00;
135 if status == '3': #Running background-color: #00cc00;
136 all_status['{}'.format(i+1)] = 2
136 all_status['{}'.format(i+1)] = 2
137 color_status['{}'.format(i+1)] = 'class=text-success'#'bgcolor=#00cc00'
137 color_status['{}'.format(i+1)] = 'class=text-success'#'bgcolor=#00cc00'
138 elif status == '2':
138 elif status == '2':
139 all_status['{}'.format(i+1)] = 1
139 all_status['{}'.format(i+1)] = 1
140 color_status['{}'.format(i+1)] = 'class=text-info'
140 color_status['{}'.format(i+1)] = 'class=text-info'
141 elif status == '1': #Connected background-color: #ee902c;
141 elif status == '1': #Connected background-color: #ee902c;
142 all_status['{}'.format(i+1)] = 1
142 all_status['{}'.format(i+1)] = 1
143 color_status['{}'.format(i+1)] = 'class=text-warning'#'bgcolor=#ee902c'
143 color_status['{}'.format(i+1)] = 'class=text-warning'#'bgcolor=#ee902c'
144 else: #Disconnected background-color: #ff0000;
144 else: #Disconnected background-color: #ff0000;
145 all_status['{}'.format(i+1)] = 0
145 all_status['{}'.format(i+1)] = 0
146 color_status['{}'.format(i+1)] = 'class=text-danger'#'bgcolor=#FF0000'
146 color_status['{}'.format(i+1)] = 'class=text-danger'#'bgcolor=#FF0000'
147 #------------------------------------------------
147 #------------------------------------------------
148
148
149 kwargs = {}
149 kwargs = {}
150 kwargs['connected_modules'] = str(conf.connected_modules())+'/64'
150 kwargs['connected_modules'] = str(conf.connected_modules())+'/64'
151 kwargs['dev_conf'] = conf
151 kwargs['dev_conf'] = conf
152
152
153 if conf.operation_mode == 0:
153 if conf.operation_mode == 0:
154 kwargs['dev_conf_keys'] = ['label', 'operation_mode']
154 kwargs['dev_conf_keys'] = ['label', 'operation_mode']
155 else:
155 else:
156 kwargs['dev_conf_keys'] = ['label', 'operation_mode', 'operation_value']
156 kwargs['dev_conf_keys'] = ['label', 'operation_mode', 'operation_value']
157
157
158 kwargs['title'] = 'ABS Configuration'
158 kwargs['title'] = 'ABS Configuration'
159 kwargs['suptitle'] = 'Details'
159 kwargs['suptitle'] = 'Details'
160 kwargs['button'] = 'Edit Configuration'
160 kwargs['button'] = 'Edit Configuration'
161
161
162 if conf.active_beam != 0:
162 if conf.active_beam != 0:
163 kwargs['active_beam'] = int(conf.active_beam)
163 kwargs['active_beam'] = int(conf.active_beam)
164
164
165 kwargs['beams'] = beams
165 kwargs['beams'] = beams
166 kwargs['modules_status'] = all_status
166 kwargs['modules_status'] = all_status
167 kwargs['color_status'] = color_status
167 kwargs['color_status'] = color_status
168 kwargs['module_messages'] = module_messages
168 kwargs['module_messages'] = module_messages
169 ###### SIDEBAR ######
169 ###### SIDEBAR ######
170 kwargs.update(sidebar(conf=conf))
170 kwargs.update(sidebar(conf=conf))
171
171
172 return render(request, 'abs_conf.html', kwargs)
172 return render(request, 'abs_conf.html', kwargs)
173
173
174
174
175 def abs_conf_edit(request, id_conf):
175 def abs_conf_edit(request, id_conf):
176
176
177 conf = get_object_or_404(ABSConfiguration, pk=id_conf)
177 conf = get_object_or_404(ABSConfiguration, pk=id_conf)
178
178
179 beams = ABSBeam.objects.filter(abs_conf=conf)
179 beams = ABSBeam.objects.filter(abs_conf=conf)
180
180
181 if request.method=='GET':
181 if request.method=='GET':
182 form = ABSConfigurationForm(instance=conf)
182 form = ABSConfigurationForm(instance=conf)
183
183
184 if request.method=='POST':
184 if request.method=='POST':
185 form = ABSConfigurationForm(request.POST, instance=conf)
185 form = ABSConfigurationForm(request.POST, instance=conf)
186
186
187 if form.is_valid():
187 if form.is_valid():
188 conf = form.save(commit=False)
188 conf = form.save(commit=False)
189 conf.save()
189 conf.save()
190 return redirect('url_abs_conf', id_conf=conf.id)
190 return redirect('url_abs_conf', id_conf=conf.id)
191
191
192 ###### SIDEBAR ######
192 ###### SIDEBAR ######
193 kwargs = {}
193 kwargs = {}
194
194
195 kwargs['dev_conf'] = conf
195 kwargs['dev_conf'] = conf
196 #kwargs['id_dev'] = conf.id
196 #kwargs['id_dev'] = conf.id
197 kwargs['id_conf'] = conf.id
197 kwargs['id_conf'] = conf.id
198 kwargs['form'] = form
198 kwargs['form'] = form
199 kwargs['abs_beams'] = beams
199 kwargs['abs_beams'] = beams
200 kwargs['title'] = 'Device Configuration'
200 kwargs['title'] = 'Device Configuration'
201 kwargs['suptitle'] = 'Edit'
201 kwargs['suptitle'] = 'Edit'
202 kwargs['button'] = 'Save'
202 kwargs['button'] = 'Save'
203
203
204 kwargs['edit'] = True
204 kwargs['edit'] = True
205
205
206 return render(request, 'abs_conf_edit.html', kwargs)
206 return render(request, 'abs_conf_edit.html', kwargs)
207
207
208 @csrf_exempt
208 @csrf_exempt
209 def abs_conf_alert(request):
209 def abs_conf_alert(request):
210
210
211 if request.method == 'POST':
211 if request.method == 'POST':
212 print (request.POST)
212 print (request.POST)
213 return HttpResponse(json.dumps({'result':1}), content_type='application/json')
213 return HttpResponse(json.dumps({'result':1}), content_type='application/json')
214 else:
214 else:
215 return redirect('index')
215 return redirect('index')
216
216
217
217
218 def import_file(request, id_conf):
218 def import_file(request, id_conf):
219
219
220 conf = get_object_or_404(ABSConfiguration, pk=id_conf)
220 conf = get_object_or_404(ABSConfiguration, pk=id_conf)
221 if request.method=='POST':
221 if request.method=='POST':
222 form = ABSImportForm(request.POST, request.FILES)
222 form = ABSImportForm(request.POST, request.FILES)
223 if form.is_valid():
223 if form.is_valid():
224 try:
224 try:
225 parms = conf.import_from_file(request.FILES['file_name'])
225 parms = conf.import_from_file(request.FILES['file_name'])
226
226
227 if parms:
227 if parms:
228 conf.update_from_file(parms)
228 conf.update_from_file(parms)
229 messages.success(request, 'Configuration "%s" loaded succesfully' % request.FILES['file_name'])
229 messages.success(request, 'Configuration "%s" loaded succesfully' % request.FILES['file_name'])
230 return redirect(conf.get_absolute_url_edit())
230 return redirect(conf.get_absolute_url_edit())
231
231
232 except Exception as e:
232 except Exception as e:
233 messages.error(request, 'Error parsing file: "%s" - %s' % (request.FILES['file_name'], e))
233 messages.error(request, 'Error parsing file: "%s" - %s' % (request.FILES['file_name'], e))
234
234
235 else:
235 else:
236 messages.warning(request, 'Your current configuration will be replaced')
236 messages.warning(request, 'Your current configuration will be replaced')
237 form = ABSImportForm()
237 form = ABSImportForm()
238
238
239 kwargs = {}
239 kwargs = {}
240 kwargs['form'] = form
240 kwargs['form'] = form
241 kwargs['title'] = 'ABS Configuration'
241 kwargs['title'] = 'ABS Configuration'
242 kwargs['suptitle'] = 'Import file'
242 kwargs['suptitle'] = 'Import file'
243 kwargs['button'] = 'Upload'
243 kwargs['button'] = 'Upload'
244 kwargs['previous'] = conf.get_absolute_url()
244 kwargs['previous'] = conf.get_absolute_url()
245
245
246 return render(request, 'abs_import.html', kwargs)
246 return render(request, 'abs_import.html', kwargs)
247
247
248
248
249 def send_beam(request, id_conf, id_beam):
249 def send_beam(request, id_conf, id_beam):
250
250
251 conf = get_object_or_404(ABSConfiguration, pk=id_conf)
251 conf = get_object_or_404(ABSConfiguration, pk=id_conf)
252
252
253 abs = Configuration.objects.filter(pk=conf.device.conf_active).first()
253 abs = Configuration.objects.filter(pk=conf.device.conf_active).first()
254 if abs!=conf:
254 if abs!=conf:
255 url = '#' if abs is None else abs.get_absolute_url()
255 url = '#' if abs is None else abs.get_absolute_url()
256 label = 'None' if abs is None else abs.label
256 label = 'None' if abs is None else abs.label
257 messages.warning(
257 messages.warning(
258 request,
258 request,
259 mark_safe('The current configuration has not been written in the modules, the active configuration is <a href="{}">{}</a>'.format(
259 mark_safe('The current configuration has not been written in the modules, the active configuration is <a href="{}">{}</a>'.format(
260 url,
260 url,
261 label
261 label
262 ))
262 ))
263 )
263 )
264 return redirect(conf.get_absolute_url())
264 return redirect(conf.get_absolute_url())
265
265
266 beam = get_object_or_404(ABSBeam, pk=id_beam)
266 beam = get_object_or_404(ABSBeam, pk=id_beam)
267
267
268 if request.method == 'POST':
268 if request.method == 'POST':
269
269
270 beams_list = ABSBeam.objects.filter(abs_conf=conf)
270 beams_list = ABSBeam.objects.filter(abs_conf=conf)
271 conf.active_beam = id_beam
271 conf.active_beam = id_beam
272
272
273 i = 0
273 i = 0
274 for b in beams_list:
274 for b in beams_list:
275 if b.id == int(id_beam):
275 if b.id == int(id_beam):
276 break
276 break
277 else:
277 else:
278 i += 1
278 i += 1
279 beam_pos = i + 1 #Estandarizar
279 beam_pos = i + 1 #Estandarizar
280 print ('%s Position: %s') % (beam.name, str(beam_pos))
280 print ('%s Position: %s') % (beam.name, str(beam_pos))
281 conf.send_beam(beam_pos)
281 conf.send_beam(beam_pos)
282
282
283 return redirect('url_abs_conf', conf.id)
283 return redirect('url_abs_conf', conf.id)
284
284
285 kwargs = {
285 kwargs = {
286 'title': 'ABS',
286 'title': 'ABS',
287 'suptitle': conf.label,
287 'suptitle': conf.label,
288 'message': 'Are you sure you want to change ABS Beam to: {}?'.format(beam.name),
288 'message': 'Are you sure you want to change ABS Beam to: {}?'.format(beam.name),
289 'delete': False
289 'delete': False
290 }
290 }
291 kwargs['menu_configurations'] = 'active'
291 kwargs['menu_configurations'] = 'active'
292
292
293 return render(request, 'confirm.html', kwargs)
293 return render(request, 'confirm.html', kwargs)
294
294
295
295
296 def add_beam(request, id_conf):
296 def add_beam(request, id_conf):
297
297
298 conf = get_object_or_404(ABSConfiguration, pk=id_conf)
298 conf = get_object_or_404(ABSConfiguration, pk=id_conf)
299 confs = Configuration.objects.all()
299 confs = Configuration.objects.all()
300
300
301 if request.method=='GET':
301 if request.method=='GET':
302 form = ABSBeamAddForm()
302 form = ABSBeamAddForm()
303
303
304 if request.method=='POST':
304 if request.method=='POST':
305 form = ABSBeamAddForm(request.POST)
305 form = ABSBeamAddForm(request.POST)
306
306
307 beam_data = get_values_from_form(request.POST)
307 beam_data = get_values_from_form(request.POST)
308
308
309 new_beam = ABSBeam(
309 new_beam = ABSBeam(
310 name = beam_data['name'],
310 name = beam_data['name'],
311 antenna = json.dumps(beam_data['antenna']),
311 antenna = json.dumps(beam_data['antenna']),
312 abs_conf = conf,
312 abs_conf = conf,
313 tx = json.dumps(beam_data['tx']),
313 tx = json.dumps(beam_data['tx']),
314 rx = json.dumps(beam_data['rx']),
314 rx = json.dumps(beam_data['rx']),
315 ues = json.dumps(beam_data['ues']),
315 ues = json.dumps(beam_data['ues']),
316 only_rx = json.dumps(beam_data['only_rx'])
316 only_rx = json.dumps(beam_data['only_rx'])
317 )
317 )
318 new_beam.save()
318 new_beam.save()
319 messages.success(request, 'Beam: "%s" has been added.' % new_beam.name)
319 messages.success(request, 'Beam: "%s" has been added.' % new_beam.name)
320
320
321 return redirect('url_edit_abs_conf', conf.id)
321 return redirect('url_edit_abs_conf', conf.id)
322
322
323 ###### SIDEBAR ######
323 ###### SIDEBAR ######
324 kwargs = {}
324 kwargs = {}
325
325
326 #kwargs['dev_conf'] = conf.device
326 #kwargs['dev_conf'] = conf.device
327 #kwargs['id_dev'] = conf.device
327 #kwargs['id_dev'] = conf.device
328 kwargs['id_conf'] = conf.id
328 #kwargs['previous'] = conf.get_absolute_url_edit()
329 kwargs['form'] = form
329 kwargs['id_conf'] = conf.id
330 kwargs['title'] = 'ABS Beams'
330 kwargs['form'] = form
331 kwargs['suptitle'] = 'Add Beam'
331 kwargs['title'] = 'ABS Beams'
332 kwargs['button'] = 'Add'
332 kwargs['suptitle'] = 'Add Beam'
333 kwargs['button'] = 'Add'
333 kwargs['no_sidebar'] = True
334 kwargs['no_sidebar'] = True
334
335 kwargs['edit'] = True
335 #kwargs['previous'] = conf.get_absolute_url_edit()
336 kwargs['edit'] = True
337
336
338 return render(request, 'abs_add_beam.html', kwargs)
337 return render(request, 'abs_add_beam.html', kwargs)
339
338
340
339
341 def edit_beam(request, id_conf, id_beam):
340 def edit_beam(request, id_conf, id_beam):
342
341
343 conf = get_object_or_404(ABSConfiguration, pk=id_conf)
342 conf = get_object_or_404(ABSConfiguration, pk=id_conf)
344 beam = get_object_or_404(ABSBeam, pk=id_beam)
343 beam = get_object_or_404(ABSBeam, pk=id_beam)
345
344
346 if request.method=='GET':
345 if request.method=='GET':
347 form = ABSBeamEditForm(initial={'beam': beam})
346 form = ABSBeamEditForm(initial={'beam': beam})
348
347
349 if request.method=='POST':
348 if request.method=='POST':
350 form = ABSBeamEditForm(request.POST)
349 form = ABSBeamEditForm(request.POST)
351
350
352 beam_data = get_values_from_form(request.POST)
351 beam_data = get_values_from_form(request.POST)
353
352
354 beam.dict_to_parms(beam_data)
353 beam.dict_to_parms(beam_data)
355 beam.save()
354 beam.save()
356
355
357 messages.success(request, 'Beam: "%s" has been updated.' % beam.name)
356 messages.success(request, 'Beam: "%s" has been updated.' % beam.name)
358
357
359 return redirect('url_edit_abs_conf', conf.id)
358 return redirect('url_edit_abs_conf', conf.id)
360
359
361 ###### SIDEBAR ######
360 ###### SIDEBAR ######
362 kwargs = {}
361 kwargs = {}
363
362
364 kwargs['id_conf'] = conf.id
363 kwargs['id_conf'] = conf.id
365 kwargs['form'] = form
364 kwargs['form'] = form
366 kwargs['title'] = 'ABS Beams'
365 kwargs['title'] = 'ABS Beams'
367 kwargs['suptitle'] = 'Edit Beam'
366 kwargs['suptitle'] = 'Edit Beam'
368 kwargs['button'] = 'Save'
367 kwargs['button'] = 'Save'
369 kwargs['no_sidebar'] = True
368 kwargs['no_sidebar'] = True
370
369
371 #kwargs['previous'] = conf.get_absolute_url_edit()
370 #kwargs['previous'] = conf.get_absolute_url_edit()
372 kwargs['edit'] = True
371 kwargs['edit'] = True
373
372
374 return render(request, 'abs_edit_beam.html', kwargs)
373 return render(request, 'abs_edit_beam.html', kwargs)
375
374
376
375
377
376
378 def remove_beam(request, id_conf, id_beam):
377 def remove_beam(request, id_conf, id_beam):
379
378
380 conf = get_object_or_404(ABSConfiguration, pk=id_conf)
379 conf = get_object_or_404(ABSConfiguration, pk=id_conf)
381 beam = get_object_or_404(ABSBeam, pk=id_beam)
380 beam = get_object_or_404(ABSBeam, pk=id_beam)
382
381
383 if request.method=='POST':
382 if request.method=='POST':
384 if beam:
383 if beam:
385 try:
384 try:
386 beam.delete()
385 beam.delete()
387 messages.success(request, 'Beam: "%s" has been deleted.' % beam)
386 messages.success(request, 'Beam: "%s" has been deleted.' % beam)
388 except:
387 except:
389 messages.error(request, 'Unable to delete beam: "%s".' % beam)
388 messages.error(request, 'Unable to delete beam: "%s".' % beam)
390
389
391 return redirect('url_edit_abs_conf', conf.id)
390 return redirect('url_edit_abs_conf', conf.id)
392
391
393 ###### SIDEBAR ######
392 ###### SIDEBAR ######
394 kwargs = {}
393 kwargs = {}
395
394
396 kwargs['object'] = beam
395 kwargs['object'] = beam
397 kwargs['delete'] = True
396 kwargs['delete'] = True
398 kwargs['title'] = 'Delete'
397 kwargs['title'] = 'Delete'
399 kwargs['suptitle'] = 'Beam'
398 kwargs['suptitle'] = 'Beam'
400 kwargs['previous'] = conf.get_absolute_url_edit()
399 kwargs['previous'] = conf.get_absolute_url_edit()
401 return render(request, 'confirm.html', kwargs)
400 return render(request, 'confirm.html', kwargs)
402
401
403
402
404
403
405 def plot_patterns(request, id_conf, id_beam=None):
404 def plot_patterns(request, id_conf, id_beam=None):
406
405
407 kwargs = {}
406 kwargs = {}
408 conf = get_object_or_404(ABSConfiguration, pk=id_conf)
407 conf = get_object_or_404(ABSConfiguration, pk=id_conf)
409 beams = ABSBeam.objects.filter(abs_conf=conf)
408 beams = ABSBeam.objects.filter(abs_conf=conf)
410
409
411 if id_beam:
410 if id_beam:
412 beam = get_object_or_404(ABSBeam, pk=id_beam)
411 beam = get_object_or_404(ABSBeam, pk=id_beam)
413 kwargs['beam'] = beam
412 kwargs['beam'] = beam
414
413
415 ###### SIDEBAR ######
414 ###### SIDEBAR ######
416
415
417 kwargs['dev_conf'] = conf.device
416 kwargs['dev_conf'] = conf.device
418 kwargs['id_dev'] = conf.device
417 kwargs['id_dev'] = conf.device
419 kwargs['id_conf'] = conf.id
418 kwargs['id_conf'] = conf.id
420 kwargs['abs_beams'] = beams
419 kwargs['abs_beams'] = beams
421 kwargs['title'] = 'ABS Patterns'
420 kwargs['title'] = 'ABS Patterns'
422 kwargs['suptitle'] = conf.name
421 kwargs['suptitle'] = conf.name
423 kwargs['no_sidebar'] = True
422 kwargs['no_sidebar'] = True
424
423
425 return render(request, 'abs_patterns.html', kwargs)
424 return render(request, 'abs_patterns.html', kwargs)
426
425
427
426
428 def plot_pattern(request, id_conf, id_beam, antenna):
427 def plot_pattern(request, id_conf, id_beam, antenna):
429
428
430 if antenna=='down':
429 if antenna=='down':
431 sleep(3)
430 sleep(3)
432
431
433 conf = get_object_or_404(ABSConfiguration, pk=id_conf)
432 conf = get_object_or_404(ABSConfiguration, pk=id_conf)
434 beam = get_object_or_404(ABSBeam, pk=id_beam)
433 beam = get_object_or_404(ABSBeam, pk=id_beam)
435 just_rx = 1 if json.loads(beam.only_rx)[antenna] else 0
434 just_rx = 1 if json.loads(beam.only_rx)[antenna] else 0
436 phases = json.loads(beam.antenna)['antenna_{}'.format(antenna)]
435 phases = json.loads(beam.antenna)['antenna_{}'.format(antenna)]
437 gain_tx = json.loads(beam.tx)[antenna]
436 gain_tx = json.loads(beam.tx)[antenna]
438 gain_rx = json.loads(beam.rx)[antenna]
437 gain_rx = json.loads(beam.rx)[antenna]
439 ues = json.loads(beam.ues)[antenna]
438 ues = json.loads(beam.ues)[antenna]
440 newOverJro = overJroShow(beam.name)
439 newOverJro = overJroShow(beam.name)
441 fig = newOverJro.plotPattern2(datetime.today(), phases, gain_tx, gain_rx, ues, just_rx)
440 fig = newOverJro.plotPattern2(datetime.today(), phases, gain_tx, gain_rx, ues, just_rx)
442 buf = io.BytesIO()
441 buf = io.BytesIO()
443 fig.savefig(buf, format='png')
442 fig.savefig(buf, format='png')
444 response = HttpResponse(buf.getvalue(), content_type='image/png')
443 response = HttpResponse(buf.getvalue(), content_type='image/png')
445 return response
444 return response
446
445
@@ -1,102 +1,111
1 import os
1 import os
2
2
3 from django import forms
3 from django import forms
4 from apps.main.models import Device, Experiment
4 from apps.main.models import Device, Experiment
5 from .models import JARSConfiguration, JARSFilter
5 from .models import JARSConfiguration, JARSFilter
6 from .widgets import SpectralWidget
6 from .widgets import SpectralWidget
7 from apps.main.forms import add_empty_choice
7 from apps.main.forms import add_empty_choice
8
8
9 def create_choices_from_model(model, filter_id=None):
9 def create_choices_from_model(model, filter_id=None):
10
10
11 #instance = globals()[model]
11 #instance = globals()[model]
12 choices = model.objects.all().values_list('pk', 'name')
12 choices = model.objects.all().values_list('pk', 'name')
13 choices = add_empty_choice(choices)
13 choices = add_empty_choice(choices,label="New Choice")
14 return choices
14 return choices
15
15
16 class JARSConfigurationForm(forms.ModelForm):
16 class JARSConfigurationForm(forms.ModelForm):
17 def __init__(self, *args, **kwargs):
17 def __init__(self, *args, **kwargs):
18 super(JARSConfigurationForm, self).__init__(*args, **kwargs)
18 super(JARSConfigurationForm, self).__init__(*args, **kwargs)
19 instance = getattr(self, 'instance', None)
19 instance = getattr(self, 'instance', None)
20
20
21 if instance and instance.pk:
21 if instance and instance.pk:
22 devices = Device.objects.filter(device_type__name='jars')
22 devices = Device.objects.filter(device_type__name='jars')
23 self.fields['device'].widget.choices = [(device.id, device) for device in devices]
23 self.fields['device'].widget.choices = [(device.id, device) for device in devices]
24 self.fields['spectral_number'].widget.attrs['readonly'] = True
24 self.fields['spectral_number'].widget.attrs['readonly'] = True
25 self.fields['spectral'].widget = SpectralWidget()
25 self.fields['spectral'].widget = SpectralWidget()
26
26
27 class Meta:
27 class Meta:
28 model = JARSConfiguration
28 model = JARSConfiguration
29 exclude = ('type', 'parameters', 'status', 'filter_parms', 'author', 'hash', 'filter')
29 exclude = ('type', 'parameters', 'status', 'filter_parms', 'author', 'hash', 'filter')
30
30
31 class JARSFilterForm(forms.ModelForm):
31 class JARSFilterForm(forms.ModelForm):
32 def __init__(self, *args, **kwargs):
32 def __init__(self, *args, **kwargs):
33 super(JARSFilterForm, self).__init__(*args, **kwargs)
33 super(JARSFilterForm, self).__init__(*args, **kwargs)
34 instance = getattr(self, 'instance', None)
34 instance = getattr(self, 'instance', None)
35
35
36 self.fields['f_decimal'].widget.attrs['readonly'] = True
36 self.fields['f_decimal'].widget.attrs['readonly'] = True
37
37
38 if 'initial' in kwargs:
38 if 'initial' in kwargs:
39 self.fields['filter_template'] = forms.ChoiceField(
39 self.fields['filter_template'] = forms.ChoiceField(
40 choices=create_choices_from_model(JARSFilter),
40 choices = create_choices_from_model(JARSFilter),
41 initial = kwargs['initial']['id']
41 initial = kwargs['initial']['id']
42 )
42 )
43 # self.fields['name'].initial = kwargs['initial']['id']
43 # self.fields['name'].initial = kwargs['initial']['id']
44
44
45 # filter_id = kwargs['initial']['filter_id']
45 # filter_id = kwargs['initial']['filter_id']
46
46
47 # if filter_id == 0:
47 # if filter_id == 0:
48 # for value in self.fields:
48 # for value in self.fields:
49 # if value != 'name':
49 # if value != 'name':
50 # self.fields.pop(value)
50 # self.fields.pop(value)
51 # self.fields['name'].label = "Filter Template Name"
51 # self.fields['name'].label = "Filter Template Name"
52 # else:
52 # else:
53 # self.fields['name'] = forms.ChoiceField(choices=create_choices_from_model(JARSFilter, kwargs['initial']['filter_id']))
53 # self.fields['name'] = forms.ChoiceField(choices=create_choices_from_model(JARSFilter, kwargs['initial']['filter_id']))
54 # jars_filter = JARSFilter.objects.get(pk=kwargs['initial']['filter_id'])
54 # jars_filter = JARSFilter.objects.get(pk=kwargs['initial']['filter_id'])
55 # labels = [f.name for f in jars_filter._meta.get_fields()]
55 # labels = [f.name for f in jars_filter._meta.get_fields()]
56
56
57 # for label in ['id']:
57 # for label in ['id']:
58 # labels.remove(label)
58 # labels.remove(label)
59 # for label in labels:
59 # for label in labels:
60 # self.fields['name'].initial = kwargs['initial']['filter_id']
60 # self.fields['name'].initial = kwargs['initial']['filter_id']
61 # self.fields[label].initial = getattr(jars_filter,label)
61 # self.fields[label].initial = getattr(jars_filter,label)
62 # self.fields['name'].label = "Filter Template Name"
62 # self.fields['name'].label = "Filter Template Name"
63
63
64 class Meta:
64 class Meta:
65 model = JARSFilter
65 model = JARSFilter
66 exclude = ('name', )
66 exclude = ('name', )
67
67
68 class JARSFilterFormNew(forms.ModelForm):
69 def __init__(self, *args, **kwargs):
70 super(JARSFilterFormNew, self).__init__(*args, **kwargs)
71
72 self.fields['f_decimal'].widget.attrs['readonly'] = True
73
74 class Meta:
75 model = JARSFilter
76 exclude = ()
68
77
69 class ExtFileField(forms.FileField):
78 class ExtFileField(forms.FileField):
70 """
79 """
71 Same as forms.FileField, but you can specify a file extension whitelist.
80 Same as forms.FileField, but you can specify a file extension whitelist.
72
81
73 >>> from django.core.files.uploadedfile import SimpleUploadedFile
82 >>> from django.core.files.uploadedfile import SimpleUploadedFile
74 >>>
83 >>>
75 >>> t = ExtFileField(ext_whitelist=(".pdf", ".txt"))
84 >>> t = ExtFileField(ext_whitelist=(".pdf", ".txt"))
76 >>>
85 >>>
77 >>> t.clean(SimpleUploadedFile('filename.pdf', 'Some File Content'))
86 >>> t.clean(SimpleUploadedFile('filename.pdf', 'Some File Content'))
78 >>> t.clean(SimpleUploadedFile('filename.txt', 'Some File Content'))
87 >>> t.clean(SimpleUploadedFile('filename.txt', 'Some File Content'))
79 >>>
88 >>>
80 >>> t.clean(SimpleUploadedFile('filename.exe', 'Some File Content'))
89 >>> t.clean(SimpleUploadedFile('filename.exe', 'Some File Content'))
81 Traceback (most recent call last):
90 Traceback (most recent call last):
82 ...
91 ...
83 ValidationError: [u'Not allowed filetype!']
92 ValidationError: [u'Not allowed filetype!']
84 """
93 """
85 def __init__(self, *args, **kwargs):
94 def __init__(self, *args, **kwargs):
86 extensions = kwargs.pop("extensions")
95 extensions = kwargs.pop("extensions")
87 self.extensions = [i.lower() for i in extensions]
96 self.extensions = [i.lower() for i in extensions]
88
97
89 super(ExtFileField, self).__init__(*args, **kwargs)
98 super(ExtFileField, self).__init__(*args, **kwargs)
90
99
91 def clean(self, *args, **kwargs):
100 def clean(self, *args, **kwargs):
92 data = super(ExtFileField, self).clean(*args, **kwargs)
101 data = super(ExtFileField, self).clean(*args, **kwargs)
93 filename = data.name
102 filename = data.name
94 ext = os.path.splitext(filename)[1]
103 ext = os.path.splitext(filename)[1]
95 ext = ext.lower()
104 ext = ext.lower()
96 if ext not in self.extensions:
105 if ext not in self.extensions:
97 raise forms.ValidationError('Not allowed file type: %s' % ext)
106 raise forms.ValidationError('Not allowed file type: %s' % ext)
98
107
99
108
100 class JARSImportForm(forms.Form):
109 class JARSImportForm(forms.Form):
101
110
102 file_name = ExtFileField(extensions=['.racp','.json'])
111 file_name = ExtFileField(extensions=['.racp','.json'])
@@ -1,389 +1,404
1 import json
1 import json
2 import requests
2 import requests
3
3
4 from django.db import models
4 from django.db import models
5 from django.core.validators import MinValueValidator, MaxValueValidator
5 from django.core.validators import MinValueValidator, MaxValueValidator
6 from django.urls import reverse
6 from django.urls import reverse
7
7
8 from apps.main.models import Configuration
8 from apps.main.models import Configuration
9 from apps.main.utils import Params
9 from apps.main.utils import Params
10 from .utils import create_jarsfiles
10 from .utils import create_jarsfiles
11
11
12 # Create your models here.
12 # Create your models here.
13
13
14 EXPERIMENT_TYPE = (
14 EXPERIMENT_TYPE = (
15 (0, 'RAW_DATA'),
15 (0, 'RAW_DATA'),
16 (1, 'PDATA'),
16 (1, 'PDATA'),
17 )
17 )
18
18
19 DATA_TYPE = (
19 DATA_TYPE = (
20 (0, 'SHORT'),
20 (0, 'SHORT'),
21 (1, 'FLOAT'),
21 (1, 'FLOAT'),
22 )
22 )
23
23
24 DECODE_TYPE = (
24 DECODE_TYPE = (
25 (0, 'None'),
25 (0, 'None'),
26 (1, 'TimeDomain'),
26 (1, 'TimeDomain'),
27 (2, 'FreqDomain'),
27 (2, 'FreqDomain'),
28 (3, 'InvFreqDomain'),
28 (3, 'InvFreqDomain'),
29 )
29 )
30
30
31 FILTER = '{"id":1, "clock": 60, "multiplier": 5, "frequency": 49.92, "f_decimal": 721554506, "fir": 2, "cic_2": 12, "cic_5": 25}'
31 FILTER = '{"id":1, "clock": 60, "multiplier": 5, "frequency": 49.92, "f_decimal": 721554506, "fir": 2, "cic_2": 12, "cic_5": 25}'
32
32
33 class JARSFilter(models.Model):
33 class JARSFilter(models.Model):
34
34
35 JARS_NBITS = 32
35 JARS_NBITS = 32
36
36
37 name = models.CharField(verbose_name='Name', max_length=60, unique=True, default='')
37 name = models.CharField(verbose_name='Name', max_length=60, unique=True, default='')
38 clock = models.FloatField(verbose_name='Clock In (MHz)', validators=[
38 clock = models.FloatField(verbose_name='Clock In (MHz)', validators=[
39 MinValueValidator(5), MaxValueValidator(75)], null=True, default=60)
39 MinValueValidator(5), MaxValueValidator(75)], null=True, default=60)
40 multiplier = models.PositiveIntegerField(verbose_name='Multiplier', validators=[
40 multiplier = models.PositiveIntegerField(verbose_name='Multiplier', validators=[
41 MinValueValidator(1), MaxValueValidator(20)], default=5)
41 MinValueValidator(1), MaxValueValidator(20)], default=5)
42 frequency = models.FloatField(verbose_name='Frequency (MHz)', validators=[
42 frequency = models.FloatField(verbose_name='Frequency (MHz)', validators=[
43 MaxValueValidator(150)], null=True, default=49.9200)
43 MaxValueValidator(150)], null=True, default=49.9200)
44 f_decimal = models.BigIntegerField(verbose_name='Frequency (Decimal)', validators=[
44 f_decimal = models.BigIntegerField(verbose_name='Frequency (Decimal)', validators=[
45 MinValueValidator(-9223372036854775808), MaxValueValidator(2**JARS_NBITS-1)], null=True, default=721554505)
45 MinValueValidator(-9223372036854775808), MaxValueValidator(2**JARS_NBITS-1)], null=True, default=721554505)
46 cic_2 = models.PositiveIntegerField(verbose_name='CIC2', validators=[
46 cic_2 = models.PositiveIntegerField(verbose_name='CIC2', validators=[
47 MinValueValidator(2), MaxValueValidator(100)], default=10)
47 MinValueValidator(2), MaxValueValidator(100)], default=10)
48 scale_cic_2 = models.PositiveIntegerField(verbose_name='Scale CIC2', validators=[
48 scale_cic_2 = models.PositiveIntegerField(verbose_name='Scale CIC2', validators=[
49 MinValueValidator(0), MaxValueValidator(6)], default=1)
49 MinValueValidator(0), MaxValueValidator(6)], default=1)
50 cic_5 = models.PositiveIntegerField(verbose_name='CIC5', validators=[
50 cic_5 = models.PositiveIntegerField(verbose_name='CIC5', validators=[
51 MinValueValidator(1), MaxValueValidator(100)], default=1)
51 MinValueValidator(1), MaxValueValidator(100)], default=1)
52 scale_cic_5 = models.PositiveIntegerField(verbose_name='Scale CIC5', validators=[
52 scale_cic_5 = models.PositiveIntegerField(verbose_name='Scale CIC5', validators=[
53 MinValueValidator(0), MaxValueValidator(20)], default=5)
53 MinValueValidator(0), MaxValueValidator(20)], default=5)
54 fir = models.PositiveIntegerField(verbose_name='FIR', validators=[
54 fir = models.PositiveIntegerField(verbose_name='FIR', validators=[
55 MinValueValidator(1), MaxValueValidator(100)], default=6)
55 MinValueValidator(1), MaxValueValidator(100)], default=6)
56 scale_fir = models.PositiveIntegerField(verbose_name='Scale FIR', validators=[
56 scale_fir = models.PositiveIntegerField(verbose_name='Scale FIR', validators=[
57 MinValueValidator(0), MaxValueValidator(7)], default=3)
57 MinValueValidator(0), MaxValueValidator(7)], default=3)
58 number_taps = models.PositiveIntegerField(verbose_name='Number of taps', validators=[
58 number_taps = models.PositiveIntegerField(verbose_name='Number of taps', validators=[
59 MinValueValidator(1), MaxValueValidator(256)], default=4)
59 MinValueValidator(1), MaxValueValidator(256)], default=4)
60 taps = models.CharField(verbose_name='Taps', max_length=1600, default='0')
60 taps = models.CharField(verbose_name='Taps', max_length=1600, default='0')
61
61
62 class Meta:
62 class Meta:
63 db_table = 'jars_filters'
63 db_table = 'jars_filters'
64
64
65 def __unicode__(self):
65 def __unicode__(self):
66 return u'%s' % (self.name)
66 return u'%s' % (self.name)
67
67
68 def jsonify(self):
68 def jsonify(self):
69
69
70 data = {}
70 data = {}
71 ignored = ()
71 ignored = ()
72
72
73 for field in self._meta.fields:
73 for field in self._meta.fields:
74 if field.name in ignored:
74 if field.name in ignored:
75 continue
75 continue
76 data[field.name] = field.value_from_object(self)
76 data[field.name] = field.value_from_object(self)
77
77
78 return data
78 return data
79
79
80 def parms_to_dict(self):
80 def parms_to_dict(self):
81
81
82 parameters = {}
82 parameters = {}
83
83
84 parameters['name'] = self.name
84 parameters['name'] = self.name
85 parameters['clock'] = float(self.clock)
85 parameters['clock'] = float(self.clock)
86 parameters['multiplier'] = int(self.multiplier)
86 parameters['multiplier'] = int(self.multiplier)
87 parameters['frequency'] = float(self.frequency)
87 parameters['frequency'] = float(self.frequency)
88 parameters['f_decimal'] = int(self.frequency)
88 parameters['f_decimal'] = int(self.frequency)
89 parameters['fir'] = int(self.fir)
89 parameters['fir'] = int(self.fir)
90 parameters['cic_2'] = int(self.cic_2)
90 parameters['cic_2'] = int(self.cic_2)
91 parameters['cic_5'] = int(self.cic_5)
91 parameters['cic_5'] = int(self.cic_5)
92
92
93 return parameters
93 return parameters
94
94
95 def dict_to_parms(self, parameters):
95 def dict_to_parms(self, parameters):
96
96
97 self.name = parameters['name']
97 self.name = parameters['name']
98 self.clock = parameters['clock']
98 self.clock = parameters['clock']
99 self.multiplier = parameters['multiplier']
99 self.multiplier = parameters['multiplier']
100 self.frequency = parameters['frequency']
100 self.frequency = parameters['frequency']
101 self.f_decimal = parameters['f_decimal']
101 self.f_decimal = parameters['f_decimal']
102 self.fir = parameters['fir']
102 self.fir = parameters['fir']
103 self.cic_2 = parameters['cic_2']
103 self.cic_2 = parameters['cic_2']
104 self.cic_5 = parameters['cic_5']
104 self.cic_5 = parameters['cic_5']
105
105
106 def dict_to_parms_new(self, parameters):
107
108 self.name = parameters['name']
109 self.clock = parameters['clock']
110 self.multiplier = parameters['multiplier']
111 self.frequency = parameters['frequency']
112 self.f_decimal = parameters['f_decimal']
113 self.fir = parameters['fir']
114 self.cic_2 = parameters['cic_2']
115 self.cic_5 = parameters['cic_5']
116 self.scale_fir = parameters['scale_fir']
117 self.scale_cic_2 = parameters['scale_cic_2']
118 self.scale_cic_5 = parameters['scale_cic_5']
119 self.number_taps = parameters['number_taps']
120 self.taps = parameters['taps']
106
121
107 class JARSConfiguration(Configuration):
122 class JARSConfiguration(Configuration):
108
123
109 ADC_RESOLUTION = 8
124 ADC_RESOLUTION = 8
110 PCI_DIO_BUSWIDTH = 32
125 PCI_DIO_BUSWIDTH = 32
111 HEADER_VERSION = 1103
126 HEADER_VERSION = 1103
112 BEGIN_ON_START = True
127 BEGIN_ON_START = True
113 REFRESH_RATE = 1
128 REFRESH_RATE = 1
114
129
115 exp_type = models.PositiveIntegerField(
130 exp_type = models.PositiveIntegerField(
116 verbose_name='Experiment Type', choices=EXPERIMENT_TYPE, default=0)
131 verbose_name='Experiment Type', choices=EXPERIMENT_TYPE, default=0)
117 cards_number = models.PositiveIntegerField(verbose_name='Number of Cards', validators=[
132 cards_number = models.PositiveIntegerField(verbose_name='Number of Cards', validators=[
118 MinValueValidator(1), MaxValueValidator(4)], default=1)
133 MinValueValidator(1), MaxValueValidator(4)], default=1)
119 channels_number = models.PositiveIntegerField(verbose_name='Number of Channels', validators=[
134 channels_number = models.PositiveIntegerField(verbose_name='Number of Channels', validators=[
120 MinValueValidator(1), MaxValueValidator(8)], default=5)
135 MinValueValidator(1), MaxValueValidator(8)], default=5)
121 channels = models.CharField(
136 channels = models.CharField(
122 verbose_name='Channels', max_length=15, default='1,2,3,4,5')
137 verbose_name='Channels', max_length=15, default='1,2,3,4,5')
123 data_type = models.PositiveIntegerField(
138 data_type = models.PositiveIntegerField(
124 verbose_name='Data Type', choices=DATA_TYPE, default=0)
139 verbose_name='Data Type', choices=DATA_TYPE, default=0)
125 raw_data_blocks = models.PositiveIntegerField(
140 raw_data_blocks = models.PositiveIntegerField(
126 verbose_name='Raw Data Blocks', validators=[MaxValueValidator(5000)], default=60)
141 verbose_name='Raw Data Blocks', validators=[MaxValueValidator(5000)], default=60)
127 profiles_block = models.PositiveIntegerField(
142 profiles_block = models.PositiveIntegerField(
128 verbose_name='Profiles Per Block', default=400)
143 verbose_name='Profiles Per Block', default=400)
129 acq_profiles = models.PositiveIntegerField(
144 acq_profiles = models.PositiveIntegerField(
130 verbose_name='Acquired Profiles', default=400)
145 verbose_name='Acquired Profiles', default=400)
131 ftp_interval = models.PositiveIntegerField(
146 ftp_interval = models.PositiveIntegerField(
132 verbose_name='FTP Interval', default=60)
147 verbose_name='FTP Interval', default=60)
133 fftpoints = models.PositiveIntegerField(
148 fftpoints = models.PositiveIntegerField(
134 verbose_name='FFT Points', default=16)
149 verbose_name='FFT Points', default=16)
135 cohe_integr_str = models.PositiveIntegerField(
150 cohe_integr_str = models.PositiveIntegerField(
136 verbose_name='Coh. Int. Stride', validators=[MinValueValidator(1)], default=30)
151 verbose_name='Coh. Int. Stride', validators=[MinValueValidator(1)], default=30)
137 cohe_integr = models.PositiveIntegerField(
152 cohe_integr = models.PositiveIntegerField(
138 verbose_name='Coherent Integrations', validators=[MinValueValidator(1)], default=30)
153 verbose_name='Coherent Integrations', validators=[MinValueValidator(1)], default=30)
139 incohe_integr = models.PositiveIntegerField(
154 incohe_integr = models.PositiveIntegerField(
140 verbose_name='Incoherent Integrations', validators=[MinValueValidator(1)], default=30)
155 verbose_name='Incoherent Integrations', validators=[MinValueValidator(1)], default=30)
141 decode_data = models.PositiveIntegerField(
156 decode_data = models.PositiveIntegerField(
142 verbose_name='Decode Data', choices=DECODE_TYPE, default=0)
157 verbose_name='Decode Data', choices=DECODE_TYPE, default=0)
143 post_coh_int = models.BooleanField(
158 post_coh_int = models.BooleanField(
144 verbose_name='Post Coherent Integration', default=False)
159 verbose_name='Post Coherent Integration', default=False)
145 spectral_number = models.PositiveIntegerField(
160 spectral_number = models.PositiveIntegerField(
146 verbose_name='# Spectral Combinations', validators=[MinValueValidator(1)], default=1)
161 verbose_name='# Spectral Combinations', validators=[MinValueValidator(1)], default=1)
147 spectral = models.CharField(
162 spectral = models.CharField(
148 verbose_name='Combinations', max_length=5000, default='[0, 0],')
163 verbose_name='Combinations', max_length=5000, default='[0, 0],')
149 create_directory = models.BooleanField(
164 create_directory = models.BooleanField(
150 verbose_name='Create Directory Per Day', default=True)
165 verbose_name='Create Directory Per Day', default=True)
151 include_expname = models.BooleanField(
166 include_expname = models.BooleanField(
152 verbose_name='Experiment Name in Directory', default=False)
167 verbose_name='Experiment Name in Directory', default=False)
153 #view_raw_data = models.BooleanField(verbose_name='View Raw Data', default=True)
168 #view_raw_data = models.BooleanField(verbose_name='View Raw Data', default=True)
154 save_ch_dc = models.BooleanField(
169 save_ch_dc = models.BooleanField(
155 verbose_name='Save Channels DC', default=True)
170 verbose_name='Save Channels DC', default=True)
156 save_data = models.BooleanField(verbose_name='Save Data', default=True)
171 save_data = models.BooleanField(verbose_name='Save Data', default=True)
157 filter_parms = models.CharField(
172 filter_parms = models.CharField(
158 max_length=10000, default=FILTER)
173 max_length=10000, default=FILTER)
159 filter = models.ForeignKey(
174 filter = models.ForeignKey(
160 'JARSFilter', verbose_name='Filter', null=True, blank=True, on_delete=models.CASCADE)
175 'JARSFilter', verbose_name='Filter', null=True, blank=True, on_delete=models.CASCADE)
161
176
162 class Meta:
177 class Meta:
163 db_table = 'jars_configurations'
178 db_table = 'jars_configurations'
164
179
165 def filter_resolution(self):
180 def filter_resolution(self):
166 filter_parms = json.loads(self.filter_parms)
181 filter_parms = json.loads(self.filter_parms)
167 clock = float(filter_parms['clock'])
182 clock = float(filter_parms['clock'])
168 cic_2 = filter_parms['cic_2']
183 cic_2 = filter_parms['cic_2']
169 cic_5 = filter_parms['cic_5']
184 cic_5 = filter_parms['cic_5']
170 fir = filter_parms['fir']
185 fir = filter_parms['fir']
171 resolution = round((clock/(cic_2*cic_5*fir)), 2)
186 resolution = round((clock/(cic_2*cic_5*fir)), 2)
172 return resolution
187 return resolution
173
188
174 def dict_to_parms(self, params, id=None):
189 def dict_to_parms(self, params, id=None):
175
190
176 if id is not None:
191 if id is not None:
177 data = Params(params).get_conf(id_conf=id)
192 data = Params(params).get_conf(id_conf=id)
178 else:
193 else:
179 data = Params(params).get_conf(dtype='jars')
194 data = Params(params).get_conf(dtype='jars')
180 data['filter_parms'] = params['filter_parms']
195 data['filter_parms'] = params['filter_parms']
181
196
182 # self.name = data['name']
197 # self.name = data['name']
183 self.exp_type = data['exp_type']
198 self.exp_type = data['exp_type']
184 #----PDATA----
199 #----PDATA----
185 if self.exp_type == 1:
200 if self.exp_type == 1:
186 self.incohe_integr = data['incohe_integr']
201 self.incohe_integr = data['incohe_integr']
187 self.spectral_number = data['spectral_number']
202 self.spectral_number = data['spectral_number']
188 self.spectral = data['spectral']
203 self.spectral = data['spectral']
189 self.fftpoints = data['fftpoints']
204 self.fftpoints = data['fftpoints']
190 self.save_ch_dc = data['save_ch_dc']
205 self.save_ch_dc = data['save_ch_dc']
191 else:
206 else:
192 self.raw_data_blocks = data['raw_data_blocks']
207 self.raw_data_blocks = data['raw_data_blocks']
193 #----PDATA----
208 #----PDATA----
194 self.cards_number = data['cards_number']
209 self.cards_number = data['cards_number']
195 self.channels_number = data['channels_number']
210 self.channels_number = data['channels_number']
196 self.channels = data['channels']
211 self.channels = data['channels']
197 self.data_type = data['data_type']
212 self.data_type = data['data_type']
198 self.profiles_block = data['profiles_block']
213 self.profiles_block = data['profiles_block']
199 self.acq_profiles = data['acq_profiles']
214 self.acq_profiles = data['acq_profiles']
200 self.ftp_interval = data['ftp_interval']
215 self.ftp_interval = data['ftp_interval']
201 self.cohe_integr_str = data['cohe_integr_str']
216 self.cohe_integr_str = data['cohe_integr_str']
202 self.cohe_integr = data['cohe_integr']
217 self.cohe_integr = data['cohe_integr']
203 #----DECODE----
218 #----DECODE----
204 self.decode_data = data['decode_data']
219 self.decode_data = data['decode_data']
205 self.post_coh_int = data['post_coh_int']
220 self.post_coh_int = data['post_coh_int']
206 #----DECODE----
221 #----DECODE----
207 self.create_directory = data['create_directory']
222 self.create_directory = data['create_directory']
208 self.include_expname = data['include_expname']
223 self.include_expname = data['include_expname']
209 self.save_data = data['save_data']
224 self.save_data = data['save_data']
210 self.filter_parms = json.dumps(data['filter_parms'])
225 self.filter_parms = json.dumps(data['filter_parms'])
211
226
212 self.save()
227 self.save()
213
228
214 def parms_to_text(self, file_format='jars'):
229 def parms_to_text(self, file_format='jars'):
215
230
216 data = self.experiment.parms_to_dict()
231 data = self.experiment.parms_to_dict()
217
232
218 for key in data['configurations']['allIds']:
233 for key in data['configurations']['allIds']:
219 if data['configurations']['byId'][key]['device_type'] in ('dds', 'cgs'):
234 if data['configurations']['byId'][key]['device_type'] in ('dds', 'cgs'):
220 data['configurations']['allIds'].remove(key)
235 data['configurations']['allIds'].remove(key)
221 data['configurations']['byId'].pop(key)
236 data['configurations']['byId'].pop(key)
222 elif data['configurations']['byId'][key]['device_type'] == 'jars':
237 elif data['configurations']['byId'][key]['device_type'] == 'jars':
223 data['configurations']['byId'][key] = self.parms_to_dict(
238 data['configurations']['byId'][key] = self.parms_to_dict(
224 )['configurations']['byId'][str(self.pk)]
239 )['configurations']['byId'][str(self.pk)]
225 elif data['configurations']['byId'][key]['device_type'] == 'rc':
240 elif data['configurations']['byId'][key]['device_type'] == 'rc':
226 data['configurations']['byId'][key]['pulses'] = ''
241 data['configurations']['byId'][key]['pulses'] = ''
227 data['configurations']['byId'][key]['delays'] = ''
242 data['configurations']['byId'][key]['delays'] = ''
228 rc_ids = [pk for pk in data['configurations']['allIds']
243 rc_ids = [pk for pk in data['configurations']['allIds']
229 if data['configurations']['byId'][pk]['device_type'] == 'rc']
244 if data['configurations']['byId'][pk]['device_type'] == 'rc']
230 mix_ids = [pk for pk in rc_ids if data['configurations']
245 mix_ids = [pk for pk in rc_ids if data['configurations']
231 ['byId'][pk]['mix']]
246 ['byId'][pk]['mix']]
232
247
233 if mix_ids:
248 if mix_ids:
234 params = data['configurations']['byId'][mix_ids[0]]['parameters']
249 params = data['configurations']['byId'][mix_ids[0]]['parameters']
235 rc = data['configurations']['byId'][params.split(
250 rc = data['configurations']['byId'][params.split(
236 '-')[0].split('|')[0]]
251 '-')[0].split('|')[0]]
237 rc['mix'] = True
252 rc['mix'] = True
238 data['configurations']['byId'][rc['id']] = rc
253 data['configurations']['byId'][rc['id']] = rc
239 elif len(rc_ids) == 0:
254 elif len(rc_ids) == 0:
240 self.message = 'File needs RC configuration'
255 self.message = 'File needs RC configuration'
241 return ''
256 return ''
242
257
243 json_data = json.dumps(data)
258 json_data = json.dumps(data)
244 racp_file, filter_file = create_jarsfiles(json_data)
259 racp_file, filter_file = create_jarsfiles(json_data)
245 if file_format == 'racp':
260 if file_format == 'racp':
246 return racp_file
261 return racp_file
247
262
248 return filter_file
263 return filter_file
249
264
250 def request(self, cmd, method='get', **kwargs):
265 def request(self, cmd, method='get', **kwargs):
251
266
252 req = getattr(requests, method)(self.device.url(cmd), **kwargs)
267 req = getattr(requests, method)(self.device.url(cmd), **kwargs)
253 payload = req.json()
268 payload = req.json()
254 return payload
269 return payload
255
270
256 def status_device(self):
271 def status_device(self):
257
272
258 try:
273 try:
259 payload = self.request('status',
274 payload = self.request('status',
260 params={'name': self.experiment.name})
275 params={'name': self.experiment.name})
261 self.device.status = payload['status']
276 self.device.status = payload['status']
262 self.device.save()
277 self.device.save()
263 self.message = payload['message']
278 self.message = payload['message']
264 except Exception as e:
279 except Exception as e:
265 self.device.status = 0
280 self.device.status = 0
266 self.message = str(e)
281 self.message = str(e)
267 self.device.save()
282 self.device.save()
268 return False
283 return False
269
284
270 return True
285 return True
271
286
272 def stop_device(self):
287 def stop_device(self):
273
288
274 try:
289 try:
275 payload = self.request('stop', 'post')
290 payload = self.request('stop', 'post')
276 self.device.status = payload['status']
291 self.device.status = payload['status']
277 self.device.save()
292 self.device.save()
278 self.message = payload['message']
293 self.message = payload['message']
279 except Exception as e:
294 except Exception as e:
280 self.device.status = 0
295 self.device.status = 0
281 self.message = str(e)
296 self.message = str(e)
282 self.device.save()
297 self.device.save()
283 return False
298 return False
284
299
285 return True
300 return True
286
301
287 def read_device(self):
302 def read_device(self):
288
303
289 try:
304 try:
290 payload = self.request(
305 payload = self.request(
291 'read', params={'name': self.experiment.name})
306 'read', params={'name': self.experiment.name})
292 self.message = 'Configuration loaded'
307 self.message = 'Configuration loaded'
293 except:
308 except:
294 self.device.status = 0
309 self.device.status = 0
295 self.device.save()
310 self.device.save()
296 self.message = 'Could not read JARS configuration.'
311 self.message = 'Could not read JARS configuration.'
297 return False
312 return False
298
313
299 return payload
314 return payload
300
315
301 def write_device(self):
316 def write_device(self):
302
317
303 if self.device.status == 3:
318 if self.device.status == 3:
304 self.message = 'Could not configure device. Software Acquisition is running'
319 self.message = 'Could not configure device. Software Acquisition is running'
305 return False
320 return False
306
321
307 data = self.experiment.parms_to_dict()
322 data = self.experiment.parms_to_dict()
308
323 #print(data)
309 for key in data['configurations']['allIds']:
324 for key in data['configurations']['allIds']:
310 if data['configurations']['byId'][key]['device_type'] in ('dds', 'cgs'):
325 if data['configurations']['byId'][key]['device_type'] in ('dds', 'cgs'):
311 data['configurations']['allIds'].remove(key)
326 data['configurations']['allIds'].remove(key)
312 data['configurations']['byId'].pop(key)
327 data['configurations']['byId'].pop(key)
313 elif data['configurations']['byId'][key]['device_type'] == 'rc':
328 elif data['configurations']['byId'][key]['device_type'] == 'rc':
314 data['configurations']['byId'][key]['pulses'] = ''
329 data['configurations']['byId'][key]['pulses'] = ''
315 data['configurations']['byId'][key]['delays'] = ''
330 data['configurations']['byId'][key]['delays'] = ''
316 rc_ids = [pk for pk in data['configurations']['allIds']
331 rc_ids = [pk for pk in data['configurations']['allIds']
317 if data['configurations']['byId'][pk]['device_type'] == 'rc']
332 if data['configurations']['byId'][pk]['device_type'] == 'rc']
318 if len(rc_ids) == 0:
333 if len(rc_ids) == 0:
319 self.message = 'Missing RC configuration'
334 self.message = 'Missing RC configuration'
320 return False
335 return False
321
336
322 json_data = json.dumps(data)
337 json_data = json.dumps(data)
323
338
324 try:
339 try:
325 payload = self.request('write', 'post', json=json_data)
340 payload = self.request('write', 'post', json=json_data)
326 self.device.status = payload['status']
341 self.device.status = payload['status']
327 self.message = payload['message']
342 self.message = payload['message']
328 self.device.save()
343 self.device.save()
329 if self.device.status == 1:
344 if self.device.status == 1:
330 return False
345 return False
331
346
332 except Exception as e:
347 except Exception as e:
333 self.device.status = 0
348 self.device.status = 0
334 self.message = str(e)
349 self.message = str(e)
335 self.device.save()
350 self.device.save()
336 return False
351 return False
337
352
338 return True
353 return True
339
354
340 def start_device(self):
355 def start_device(self):
341
356
342 try:
357 try:
343 payload = self.request('start', 'post',
358 payload = self.request('start', 'post',
344 json={'name': self.experiment.name})
359 json={'name': self.experiment.name})
345 self.device.status = payload['status']
360 self.device.status = payload['status']
346 self.message = payload['message']
361 self.message = payload['message']
347 self.device.save()
362 self.device.save()
348 if self.device.status == 1:
363 if self.device.status == 1:
349 return False
364 return False
350
365
351 except Exception as e:
366 except Exception as e:
352 self.device.status = 0
367 self.device.status = 0
353 self.message = str(e)
368 self.message = str(e)
354 self.device.save()
369 self.device.save()
355 return False
370 return False
356
371
357 return True
372 return True
358
373
359 def get_log(self):
374 def get_log(self):
360
375
361 payload = None
376 payload = None
362
377
363 try:
378 try:
364 payload = requests.get(self.device.url('get_log'), params={
379 payload = requests.get(self.device.url('get_log'), params={
365 'name': self.experiment.name})
380 'name': self.experiment.name})
366 except:
381 except:
367 self.device.status = 0
382 self.device.status = 0
368 self.device.save()
383 self.device.save()
369 self.message = 'Jars API is not running.'
384 self.message = 'Jars API is not running.'
370 return False
385 return False
371
386
372 self.message = 'Jars API is running'
387 self.message = 'Jars API is running'
373
388
374 return payload
389 return payload
375
390
376 def update_from_file(self, filename):
391 def update_from_file(self, filename):
377
392
378 f = JARSFile(filename)
393 f = JARSFile(filename)
379 self.dict_to_parms(f.data)
394 self.dict_to_parms(f.data)
380 self.save()
395 self.save()
381
396
382 def get_absolute_url_import(self):
397 def get_absolute_url_import(self):
383 return reverse('url_import_jars_conf', args=[str(self.id)])
398 return reverse('url_import_jars_conf', args=[str(self.id)])
384
399
385 def get_absolute_url_read(self):
400 def get_absolute_url_read(self):
386 return reverse('url_read_jars_conf', args=[str(self.id)])
401 return reverse('url_read_jars_conf', args=[str(self.id)])
387
402
388 def get_absolute_url_log(self):
403 def get_absolute_url_log(self):
389 return reverse('url_get_jars_log', args=[str(self.id)])
404 return reverse('url_get_jars_log', args=[str(self.id)])
@@ -1,20 +1,20
1 {% extends "base.html" %}
1 {% extends "base.html" %}
2 {% load bootstrap3 %}
2 {% load bootstrap4 %}
3 {% block mainactive %}active{% endblock %}
3 {% block mainactive %}active{% endblock %}
4
4
5 {% block content-title %}Acquisition System{% endblock %}
5 {% block content-title %}Acquisition System{% endblock %}
6 {% block content-suptitle %}JARS{% endblock %}
6 {% block content-suptitle %}JARS{% endblock %}
7
7
8 {% block content %}
8 {% block content %}
9 <form class="form" method="post" action="">
9 <form class="form" method="post" action="">
10 {% csrf_token %}
10 {% csrf_token %}
11 {% bootstrap_form form layout='horizontal' size='medium' %}
11 {% bootstrap_form form layout='horizontal' size='medium' %}
12 <div style="clear: both;"></div>
12 <div style="clear: both;"></div>
13 <br>
13 <br>
14 <button type="submit" class="btn btn-primary pull-right" id="bt_update">Update</button>
14 <button type="submit" class="btn btn-primary pull-right" id="bt_update">Update</button>
15 </form>
15 </form>
16 {% endblock %}
16 {% endblock %}
17
17
18 {% block sidebar%}
18 {% block sidebar%}
19 {% include "sidebar_devices.html" %}
19 {% include "sidebar_devices.html" %}
20 {% endblock %}
20 {% endblock %}
@@ -1,25 +1,25
1 {% extends "dev_conf.html" %}
1 {% extends "dev_conf.html" %}
2 {% load static %}
2 {% load static %}
3 {% load bootstrap3 %}
3 {% load bootstrap4 %}
4 {% load main_tags %}
4 {% load main_tags %}
5
5
6 {% block extra-menu-actions %}
6 {% block extra-menu-actions %}
7 <li><a href="{{ dev_conf.get_absolute_url_log }}"><span class="fas fa-save" aria-hidden="true"></span>
7 <li><a href="{{ dev_conf.get_absolute_url_log }}"><span class="fas fa-save" aria-hidden="true"></span>
8 Get Log File</a></li>
8 Get Log File</a></li>
9 {% endblock %}
9 {% endblock %}
10
10
11 {% block extra-content %}
11 {% block extra-content %}
12
12
13 <div class="clearfix"></div>
13 <div class="clearfix"></div>
14 <h2>Filter: {{resolution}}</h2>
14 <h2>Filter: {{resolution}}</h2>
15 <br>
15 <br>
16 <table class="table table-bordered">
16 <table class="table table-bordered">
17 {% for key in filter_keys %}
17 {% for key in filter_keys %}
18 <tr>
18 <tr>
19 <th>{% get_verbose_field_name filter_obj key %}</th>
19 <th>{% get_verbose_field_name filter_obj key %}</th>
20 <td>{{filter|attr:key}}</td>
20 <td>{{filter|attr:key}}</td>
21 </tr>
21 </tr>
22 {% endfor %}
22 {% endfor %}
23 </table>
23 </table>
24
24
25 {% endblock extra-content%} No newline at end of file
25 {% endblock extra-content%}
@@ -1,40 +1,43
1 {% extends "dev_conf_edit.html" %}
1 {% extends "dev_conf_edit.html" %}
2 {% load bootstrap3 %}
2 {% load bootstrap4 %}
3 {% load static %}
3 {% load static %}
4 {% load main_tags %}
4 {% load main_tags %}
5
5
6 {% block content %}
6 {% block content %}
7 <form class="form" method="post">
7 <form class="form" method="post">
8 {% csrf_token %}
8 {% csrf_token %}
9 {% bootstrap_form form layout='horizontal' size='medium' %}
9 {% bootstrap_form form layout='horizontal' size='medium' %}
10 <div style="clear: both;"></div>
10 <div style="clear: both;"></div>
11 <h2>Filter <small>{{filter_name}}</small></h2>
11 <h2>Filter <small>{{filter_name}}</small></h2>
12 <br>
12 <br>
13 {% bootstrap_form filter_form layout='horizontal' size='medium' %}
13 {% bootstrap_form filter_form layout='horizontal' size='medium' %}
14 <div style="clear: both;"></div>
14 <div style="clear: both;"></div>
15 <br>
15 <br>
16 <div class="pull-right">
16 <div class="pull-right">
17 <button type="button" class="btn btn-primary" onclick="{% if previous %}window.location.replace('{{ previous }}');{% else %}history.go(-1);{% endif %}">Cancel</button>
17 <button type="button" class="btn btn-primary" onclick="{% if previous %}window.location.replace('{{ previous }}');{% else %}history.go(-1);{% endif %}">Cancel</button>
18 <button type="submit" class="btn btn-primary">{{button}}</button>
18 <button type="submit" class="btn btn-primary">{{button}}</button>
19 </div>
19 </div>
20
20
21 <div style="clear: both;"></div>
21 <div style="clear: both;"></div>
22 <br>
22 <br>
23 </form>
23 </form>
24 {% endblock %}
24 {% endblock %}
25
25
26 {% block extra-js%}
26 {% block extra-js%}
27 <script src="{% static 'js/jars.js' %}"></script>
27 <script src="{% static 'js/jars.js' %}"></script>
28 <script src="{% static 'js/filters.js' %}"></script>
28 <script src="{% static 'js/filters.js' %}"></script>
29 <script type="text/javascript">
29 <script type="text/javascript">
30
30
31 $("#bt_cancel").click(function () {
31 $("#bt_cancel").click(function () {
32 document.location = "{% url 'url_jars_conf' id_dev %}";
32 document.location = "{% url 'url_jars_conf' id_dev %}";
33 });
33 });
34
34
35 $("#id_filter_template").change(function () {
35 $("#id_filter_template").change(function () {
36 document.location = "{% url 'url_change_jars_filter' id_dev %}" + $("#id_filter_template").val();
36 if($("#id_filter_template").val()!=0)
37 document.location = "{% url 'url_change_jars_filter' id_dev %}" + $("#id_filter_template").val();
38 else
39 document.location = "{% url 'url_new_jars_filter' id_dev %}"
37 });
40 });
38
41
39 </script>
42 </script>
40 {% endblock %} No newline at end of file
43 {% endblock %}
@@ -1,13 +1,14
1 from django.urls import path
1 from django.urls import path
2
2
3 from . import views
3 from . import views
4
4
5 urlpatterns = (
5 urlpatterns = (
6 path('<int:id_conf>/', views.jars_conf, name='url_jars_conf'),
6 path('<int:id_conf>/', views.jars_conf, name='url_jars_conf'),
7 path('<int:id_conf>/edit/', views.jars_conf_edit, name='url_edit_jars_conf'),
7 path('<int:id_conf>/edit/', views.jars_conf_edit, name='url_edit_jars_conf'),
8 path('<int:conf_id>/change_filter/', views.change_filter, name='url_change_jars_filter'),
8 path('<int:conf_id>/change_filter/', views.change_filter, name='url_change_jars_filter'),
9 path('<int:conf_id>/change_filter/<int:filter_id>/', views.change_filter, name='url_change_jars_filter'),
9 path('<int:conf_id>/change_filter/<int:filter_id>/', views.change_filter, name='url_change_jars_filter'),
10 path('<int:conf_id>/new_filter/', views.new_filter, name='url_new_jars_filter'),
10 path('<int:conf_id>/import/', views.import_file, name='url_import_jars_conf'),
11 path('<int:conf_id>/import/', views.import_file, name='url_import_jars_conf'),
11 path('<int:conf_id>/read/', views.read_conf, name='url_read_jars_conf'),
12 path('<int:conf_id>/read/', views.read_conf, name='url_read_jars_conf'),
12 path('<int:conf_id>/get_log/', views.get_log, name='url_get_jars_log'),
13 path('<int:conf_id>/get_log/', views.get_log, name='url_get_jars_log'),
13 )
14 )
@@ -1,194 +1,221
1 from django.shortcuts import render_to_response
1 from django.shortcuts import render_to_response
2 from django.template import RequestContext
2 from django.template import RequestContext
3 from django.shortcuts import redirect, render, get_object_or_404
3 from django.shortcuts import redirect, render, get_object_or_404
4 from django.contrib import messages
4 from django.contrib import messages
5 from django.http import HttpResponse
5 from django.http import HttpResponse
6
6
7 from apps.main.models import Device
7 from apps.main.models import Device
8 from apps.main.views import sidebar
8 from apps.main.views import sidebar
9
9
10 from .models import JARSConfiguration, JARSFilter
10 from .models import JARSConfiguration, JARSFilter
11 from .forms import JARSConfigurationForm, JARSFilterForm, JARSImportForm
11 from .forms import JARSConfigurationForm, JARSFilterForm, JARSImportForm,JARSFilterFormNew
12
12
13 import json
13 import json
14 # Create your views here.
14 # Create your views here.
15
15
16 def jars_conf(request, id_conf):
16 def jars_conf(request, id_conf):
17
17
18 conf = get_object_or_404(JARSConfiguration, pk=id_conf)
18 conf = get_object_or_404(JARSConfiguration, pk=id_conf)
19
19
20 filter_parms = json.loads(conf.filter_parms)
20 filter_parms = json.loads(conf.filter_parms)
21
21
22 kwargs = {}
22 kwargs = {}
23 kwargs['filter'] = filter_parms
23 kwargs['filter'] = filter_parms
24 kwargs['filter_obj'] = JARSFilter.objects.get(pk=1)
24 kwargs['filter_obj'] = JARSFilter.objects.get(pk=1)
25 kwargs['filter_keys'] = ['clock', 'multiplier', 'frequency', 'f_decimal',
25 kwargs['filter_keys'] = ['clock', 'multiplier', 'frequency', 'f_decimal',
26 'cic_2', 'scale_cic_2', 'cic_5', 'scale_cic_5', 'fir',
26 'cic_2', 'scale_cic_2', 'cic_5', 'scale_cic_5', 'fir',
27 'scale_fir', 'number_taps', 'taps']
27 'scale_fir', 'number_taps', 'taps']
28
28
29 filter_resolution = conf.filter_resolution()
29 filter_resolution = conf.filter_resolution()
30 kwargs['resolution'] = '{} (MHz)'.format(filter_resolution)
30 kwargs['resolution'] = '{} (MHz)'.format(filter_resolution)
31 if filter_resolution < 1:
31 if filter_resolution < 1:
32 kwargs['resolution'] = '{} (kHz)'.format(filter_resolution*1000)
32 kwargs['resolution'] = '{} (kHz)'.format(filter_resolution*1000)
33
33
34 kwargs['status'] = conf.device.get_status_display()
34 kwargs['status'] = conf.device.get_status_display()
35 kwargs['dev_conf'] = conf
35 kwargs['dev_conf'] = conf
36 kwargs['dev_conf_keys'] = ['cards_number', 'channels_number', 'channels',
36 kwargs['dev_conf_keys'] = ['cards_number', 'channels_number', 'channels',
37 'ftp_interval', 'data_type','acq_profiles',
37 'ftp_interval', 'data_type','acq_profiles',
38 'profiles_block', 'raw_data_blocks', 'ftp_interval',
38 'profiles_block', 'raw_data_blocks', 'ftp_interval',
39 'cohe_integr_str', 'cohe_integr', 'decode_data', 'post_coh_int',
39 'cohe_integr_str', 'cohe_integr', 'decode_data', 'post_coh_int',
40 'incohe_integr', 'fftpoints', 'spectral_number',
40 'incohe_integr', 'fftpoints', 'spectral_number',
41 'spectral', 'create_directory', 'include_expname',
41 'spectral', 'create_directory', 'include_expname',
42 'save_ch_dc', 'save_data']
42 'save_ch_dc', 'save_data']
43
43
44 if conf.exp_type == 0:
44 if conf.exp_type == 0:
45 for field in ['incohe_integr','fftpoints','spectral_number', 'spectral', 'save_ch_dc']:
45 for field in ['incohe_integr','fftpoints','spectral_number', 'spectral', 'save_ch_dc']:
46 kwargs['dev_conf_keys'].remove(field)
46 kwargs['dev_conf_keys'].remove(field)
47
47
48 if conf.decode_data == 0:
48 if conf.decode_data == 0:
49 kwargs['dev_conf_keys'].remove('decode_data')
49 kwargs['dev_conf_keys'].remove('decode_data')
50 kwargs['dev_conf_keys'].remove('post_coh_int')
50 kwargs['dev_conf_keys'].remove('post_coh_int')
51
51
52 kwargs['title'] = 'JARS Configuration'
52 kwargs['title'] = 'JARS Configuration'
53 kwargs['suptitle'] = 'Details'
53 kwargs['suptitle'] = 'Details'
54
54
55 ###### SIDEBAR ######
55 ###### SIDEBAR ######
56 kwargs.update(sidebar(conf=conf))
56 kwargs.update(sidebar(conf=conf))
57
57
58 return render(request, 'jars_conf.html', kwargs)
58 return render(request, 'jars_conf.html', kwargs)
59
59
60 def jars_conf_edit(request, id_conf):
60 def jars_conf_edit(request, id_conf):
61
61
62 conf = get_object_or_404(JARSConfiguration, pk=id_conf)
62 conf = get_object_or_404(JARSConfiguration, pk=id_conf)
63
64 filter_parms = json.loads(conf.filter_parms)
63 filter_parms = json.loads(conf.filter_parms)
65
64
66 if request.method=='GET':
65 if request.method=='GET':
67 form = JARSConfigurationForm(instance=conf)
66 form = JARSConfigurationForm(instance=conf)
68 filter_form = JARSFilterForm(initial=filter_parms)
67 filter_form = JARSFilterForm(initial=filter_parms)
69
68
70 if request.method=='POST':
69 if request.method=='POST':
71 form = JARSConfigurationForm(request.POST, instance=conf)
70 form = JARSConfigurationForm(request.POST, instance=conf)
72 filter_form = JARSFilterForm(request.POST)
71 filter_form = JARSFilterForm(request.POST)
73
72
74 if filter_form.is_valid():
73 if filter_form.is_valid():
75 jars_filter = filter_form.cleaned_data
74 jars_filter = filter_form.cleaned_data
76 jars_filter['id'] = request.POST['filter_template']
75 jars_filter['id'] = request.POST['filter_template']
77 else:
76 else:
78 messages.error(request, filter_form.errors)
77 messages.error(request, filter_form.errors)
79
78
80 if form.is_valid():
79 if form.is_valid():
81 conf = form.save(commit=False)
80 conf = form.save(commit=False)
82 conf.filter_parms = json.dumps(jars_filter)
81 conf.filter_parms = json.dumps(jars_filter)
83 conf.save()
82 conf.save()
84 return redirect('url_jars_conf', id_conf=conf.id)
83 return redirect('url_jars_conf', id_conf=conf.id)
85
84
86 kwargs = {}
85 kwargs = {}
87
86
88 kwargs['id_dev'] = conf.id
87 kwargs['id_dev'] = conf.id
89 kwargs['form'] = form
88 kwargs['form'] = form
90 kwargs['filter_form'] = filter_form
89 kwargs['filter_form'] = filter_form
91 kwargs['filter_name'] = JARSFilter.objects.get(pk=filter_parms['id']).name
90 kwargs['filter_name'] = JARSFilter.objects.get(pk=filter_parms['id']).name
92 kwargs['title'] = 'Device Configuration'
91 kwargs['title'] = 'Device Configuration'
93 kwargs['suptitle'] = 'Edit'
92 kwargs['suptitle'] = 'Edit'
94 kwargs['button'] = 'Save'
93 kwargs['button'] = 'Save'
95
94
96 return render(request, 'jars_conf_edit.html', kwargs)
95 return render(request, 'jars_conf_edit.html', kwargs)
97
96
98 def import_file(request, conf_id):
97 def import_file(request, conf_id):
99
98
100 conf = get_object_or_404(JARSConfiguration, pk=conf_id)
99 conf = get_object_or_404(JARSConfiguration, pk=conf_id)
101 if request.method=='POST':
100 if request.method=='POST':
102 form = JARSImportForm(request.POST, request.FILES)
101 form = JARSImportForm(request.POST, request.FILES)
103 if form.is_valid():
102 if form.is_valid():
104 try:
103 try:
105 data = conf.import_from_file(request.FILES['file_name'])
104 data = conf.import_from_file(request.FILES['file_name'])
106 conf.dict_to_parms(data)
105 conf.dict_to_parms(data)
107 messages.success(request, 'Configuration "%s" loaded succesfully' % request.FILES['file_name'])
106 messages.success(request, 'Configuration "%s" loaded succesfully' % request.FILES['file_name'])
108 return redirect(conf.get_absolute_url_edit())
107 return redirect(conf.get_absolute_url_edit())
109
108
110 except Exception as e:
109 except Exception as e:
111 messages.error(request, 'Error parsing file: "%s" - %s' % (request.FILES['file_name'], repr(e)))
110 messages.error(request, 'Error parsing file: "%s" - %s' % (request.FILES['file_name'], repr(e)))
112 else:
111 else:
113 messages.warning(request, 'Your current configuration will be replaced')
112 messages.warning(request, 'Your current configuration will be replaced')
114 form = JARSImportForm()
113 form = JARSImportForm()
115
114
116 kwargs = {}
115 kwargs = {}
117 kwargs['form'] = form
116 kwargs['form'] = form
118 kwargs['title'] = 'JARS Configuration'
117 kwargs['title'] = 'JARS Configuration'
119 kwargs['suptitle'] = 'Import file'
118 kwargs['suptitle'] = 'Import file'
120 kwargs['button'] = 'Upload'
119 kwargs['button'] = 'Upload'
121 kwargs['previous'] = conf.get_absolute_url()
120 kwargs['previous'] = conf.get_absolute_url()
122
121
123 return render(request, 'jars_import.html', kwargs)
122 return render(request, 'jars_import.html', kwargs)
124
123
125 def read_conf(request, conf_id):
124 def read_conf(request, conf_id):
126
125
127 conf = get_object_or_404(JARSConfiguration, pk=conf_id)
126 conf = get_object_or_404(JARSConfiguration, pk=conf_id)
128 #filter = get_object_or_404(JARSfilter, pk=filter_id)
127 #filter = get_object_or_404(JARSfilter, pk=filter_id)
129
128
130 if request.method=='GET':
129 if request.method=='GET':
131
130
132 parms = conf.read_device()
131 parms = conf.read_device()
133 conf.status_device()
132 conf.status_device()
134
133
135 if not parms:
134 if not parms:
136 messages.error(request, conf.message)
135 messages.error(request, conf.message)
137 return redirect(conf.get_absolute_url())
136 return redirect(conf.get_absolute_url())
138
137
139 form = JARSConfigurationForm(initial=parms, instance=conf)
138 form = JARSConfigurationForm(initial=parms, instance=conf)
140
139
141 if request.method=='POST':
140 if request.method=='POST':
142 form = JARSConfigurationForm(request.POST, instance=conf)
141 form = JARSConfigurationForm(request.POST, instance=conf)
143
142
144 if form.is_valid():
143 if form.is_valid():
145 form.save()
144 form.save()
146 return redirect(conf.get_absolute_url())
145 return redirect(conf.get_absolute_url())
147
146
148 messages.error(request, "Parameters could not be saved")
147 messages.error(request, "Parameters could not be saved")
149
148
150 kwargs = {}
149 kwargs = {}
151 kwargs['id_dev'] = conf.id
150 kwargs['id_dev'] = conf.id
152 kwargs['filter_id'] = conf.filter.id
151 kwargs['filter_id'] = conf.filter.id
153 kwargs['form'] = form
152 kwargs['form'] = form
154 kwargs['title'] = 'Device Configuration'
153 kwargs['title'] = 'Device Configuration'
155 kwargs['suptitle'] = 'Parameters read from device'
154 kwargs['suptitle'] = 'Parameters read from device'
156 kwargs['button'] = 'Save'
155 kwargs['button'] = 'Save'
157
156
158 ###### SIDEBAR ######
157 ###### SIDEBAR ######
159 kwargs.update(sidebar(conf=conf))
158 kwargs.update(sidebar(conf=conf))
160
159
161 return render(request, 'jars_conf_edit.html', kwargs)
160 return render(request, 'jars_conf_edit.html', kwargs)
162
161
162 def new_filter(request, conf_id):
163 conf = get_object_or_404(JARSConfiguration, pk=conf_id)
164 form = JARSFilterFormNew()
165
166 if request.method=='POST':
167 filter_form = JARSFilterFormNew(request.POST)
168
169 if filter_form.is_valid():
170 jars_filter = filter_form.cleaned_data
171 jars_filter['id'] = request.POST['name']
172 else:
173 messages.error(request, filter_form.errors)
174
175 #print(json.dumps(jars_filter))
176 jars_filter_obj = JARSFilter()
177 jars_filter_obj.dict_to_parms_new(request.POST)
178 jars_filter_obj.save()
179 return redirect('url_edit_jars_conf', id_conf=conf.id)
180
181 kwargs = {}
182 kwargs['id_dev'] = conf.id
183 kwargs['form'] = form
184 kwargs['title'] = 'New JARS Filter'
185 kwargs['suptitle'] = 'Parameters'
186 kwargs['button'] = 'Save'
187
188 return render(request, 'jars_new_filter.html', kwargs)
189
163 def change_filter(request, conf_id, filter_id):
190 def change_filter(request, conf_id, filter_id):
164
191
165 conf = get_object_or_404(JARSConfiguration, pk=conf_id)
192 conf = get_object_or_404(JARSConfiguration, pk=conf_id)
166 filter = get_object_or_404(JARSFilter, pk=filter_id)
193 filter = get_object_or_404(JARSFilter, pk=filter_id)
167 conf.filter_parms = json.dumps(filter.jsonify())
194 conf.filter_parms = json.dumps(filter.jsonify())
168 conf.save()
195 conf.save()
169
196
170 return redirect('url_edit_jars_conf', id_conf=conf.id)
197 return redirect('url_edit_jars_conf', id_conf=conf.id)
171
198
172 def get_log(request, conf_id):
199 def get_log(request, conf_id):
173
200
174 conf = get_object_or_404(JARSConfiguration, pk=conf_id)
201 conf = get_object_or_404(JARSConfiguration, pk=conf_id)
175 response = conf.get_log()
202 response = conf.get_log()
176
203
177 if not response:
204 if not response:
178 message = conf.message
205 message = conf.message
179 messages.error(request, message)
206 messages.error(request, message)
180 return redirect('url_jars_conf', id_conf=conf.id)
207 return redirect('url_jars_conf', id_conf=conf.id)
181
208
182 try:
209 try:
183 message = response.json()['message']
210 message = response.json()['message']
184 messages.error(request, message)
211 messages.error(request, message)
185 return redirect('url_jars_conf', id_conf=conf.id)
212 return redirect('url_jars_conf', id_conf=conf.id)
186 except Exception as e:
213 except Exception as e:
187 message = 'Restarting Report.txt has been downloaded successfully.'
214 message = 'Restarting Report.txt has been downloaded successfully.'+e
188
215
189 content = response
216 content = response
190 filename = 'Log_%s_%s.txt' %(conf.experiment.name, conf.experiment.id)
217 filename = 'Log_%s_%s.txt' %(conf.experiment.name, conf.experiment.id)
191 response = HttpResponse(content,content_type='text/plain')
218 response = HttpResponse(content,content_type='text/plain')
192 response['Content-Disposition'] = 'attachment; filename="%s"' %filename
219 response['Content-Disposition'] = 'attachment; filename="%s"' %filename
193
220
194 return response
221 return response
@@ -1,165 +1,165
1
1
2 import ast
2 import ast
3 import json
3 import json
4 from itertools import chain
4 from itertools import chain
5
5
6 from django import forms
6 from django import forms
7 from django.utils.safestring import mark_safe
7 from django.utils.safestring import mark_safe
8 from django.utils.html import conditional_escape
8 from django.utils.html import conditional_escape
9
9
10
10
11 class SpectralWidget(forms.widgets.TextInput):
11 class SpectralWidget(forms.widgets.TextInput):
12
12
13 def render(self, label, value, attrs=None):
13 def render(self, name, value, attrs=None, renderer=None):
14
14 label = name
15 readonly = 'readonly' if attrs.get('readonly', False) else ''
15 readonly = 'readonly' if attrs.get('readonly', False) else ''
16 name = attrs.get('name', label)
16 name = attrs.get('name', label)
17 if value == None:
17 if value == None:
18 value = '[0, 0],'
18 value = '[0, 0],'
19 if '[' in value:
19 if '[' in value:
20 if value[len(value)-1] == ",":
20 if value[len(value)-1] == ",":
21 value = ast.literal_eval(value)
21 value = ast.literal_eval(value)
22 else:
22 else:
23 value = value + ","
23 value = value + ","
24 value = ast.literal_eval(value)
24 value = ast.literal_eval(value)
25
25
26 codes = value
26 codes = value
27 if not isinstance(value, list):
27 if not isinstance(value, list):
28 text=''
28 text=''
29 #lista = []
29 #lista = []
30 #if len(value) > 1:
30 #if len(value) > 1:
31 for val in value:
31 for val in value:
32 text = text+str(val)+','
32 text = text+str(val)+','
33 #lista.append(val)
33 #lista.append(val)
34 codes=text
34 codes=text
35 else:
35 else:
36 codes=''
36 codes=''
37
37
38 html = '''<textarea rows="5" {0} class="form-control" id="id_{1}" name="{2}" style="white-space:nowrap; overflow:scroll;">{3}</textarea>
38 html = '''<textarea rows="5" {0} class="form-control" id="id_{1}" name="{2}" style="white-space:nowrap; overflow:scroll;">{3}</textarea>
39 <input type="text" class="col-md-1 col-no-padding" id="num1" value=0>
39 <input type="text" class="col-md-1 col-no-padding" id="num1" value=0>
40 <input type="text" class="col-md-1 col-no-padding" id="num2" value=0>
40 <input type="text" class="col-md-1 col-no-padding" id="num2" value=0>
41 <button type="button" class="button" id="add_spectral_button"> Add </button>
41 <button type="button" class="button" id="add_spectral_button"> Add </button>
42 <button type="button" class="button" id="delete_spectral_button"> Delete </button>
42 <button type="button" class="button" id="delete_spectral_button"> Delete </button>
43 <button type="button" class="button pull-right" id="cross_spectral_button"> Cross </button>
43 <button type="button" class="button pull-right" id="cross_spectral_button"> Cross </button>
44 <button type="button" class="button pull-right" id="self_spectral_button"> Self </button>
44 <button type="button" class="button pull-right" id="self_spectral_button"> Self </button>
45 <button type="button" class="button pull-right" id="all_spectral_button"> All </button>
45 <button type="button" class="button pull-right" id="all_spectral_button"> All </button>
46 '''.format(readonly, label, name, codes)
46 '''.format(readonly, label, name, codes)
47
47
48 script = '''
48 script = '''
49 <script type="text/javascript">
49 <script type="text/javascript">
50 $(document).ready(function () {{
50 $(document).ready(function () {{
51
51
52 var spectral_number1 = $("#num1").val();
52 var spectral_number1 = $("#num1").val();
53 var spectral_number2 = $("#num2").val();
53 var spectral_number2 = $("#num2").val();
54
54
55
55
56 $("#all_spectral_button").click(function(){{
56 $("#all_spectral_button").click(function(){{
57 var sequence1 = selfSpectral()
57 var sequence1 = selfSpectral()
58 var sequence2 = crossSpectral()
58 var sequence2 = crossSpectral()
59 $("#id_spectral").val(sequence1+sequence2)
59 $("#id_spectral").val(sequence1+sequence2)
60 updateSpectralNumber()
60 updateSpectralNumber()
61 }});
61 }});
62
62
63
63
64 $("#add_spectral_button").click(function(){{
64 $("#add_spectral_button").click(function(){{
65 var spectral_comb = $("#id_spectral").val();
65 var spectral_comb = $("#id_spectral").val();
66 var spectral_number1 = $("#num1").val();
66 var spectral_number1 = $("#num1").val();
67 var spectral_number2 = $("#num2").val();
67 var spectral_number2 = $("#num2").val();
68 var str = spectral_number1+", "+spectral_number2;
68 var str = spectral_number1+", "+spectral_number2;
69 //not to duplicate
69 //not to duplicate
70 var n = spectral_comb.search(str);
70 var n = spectral_comb.search(str);
71 if (n==-1){
71 if (n==-1){
72 $("#id_spectral").val(spectral_comb+"["+$("#num1").val()+", "+$("#num2").val()+"],")
72 $("#id_spectral").val(spectral_comb+"["+$("#num1").val()+", "+$("#num2").val()+"],")
73 }
73 }
74 updateSpectralNumber()
74 updateSpectralNumber()
75 }});
75 }});
76
76
77
77
78 $("#self_spectral_button").click(function(){{
78 $("#self_spectral_button").click(function(){{
79 var sequence = selfSpectral()
79 var sequence = selfSpectral()
80 $("#id_spectral").val(sequence)
80 $("#id_spectral").val(sequence)
81
81
82 updateSpectralNumber()
82 updateSpectralNumber()
83 }});
83 }});
84
84
85 $("#cross_spectral_button").click(function(){{
85 $("#cross_spectral_button").click(function(){{
86 var sequence = crossSpectral()
86 var sequence = crossSpectral()
87 $("#id_spectral").val(sequence)
87 $("#id_spectral").val(sequence)
88
88
89 updateSpectralNumber()
89 updateSpectralNumber()
90 }});
90 }});
91
91
92
92
93 function selfSpectral() {
93 function selfSpectral() {
94 var channels = $("#id_channels").val();
94 var channels = $("#id_channels").val();
95 var n = (channels.length)-1;
95 var n = (channels.length)-1;
96 var num = parseInt(channels[n]);
96 var num = parseInt(channels[n]);
97 sequence = ""
97 sequence = ""
98 for (i = 0; i < num; i++) {
98 for (i = 0; i < num; i++) {
99 sequence = sequence + "[" + i.toString() + ", " + i.toString() + "],"
99 sequence = sequence + "[" + i.toString() + ", " + i.toString() + "],"
100 }
100 }
101 return sequence
101 return sequence
102 }
102 }
103
103
104
104
105 function crossSpectral() {
105 function crossSpectral() {
106 var channels = $("#id_channels").val();
106 var channels = $("#id_channels").val();
107 var n = (channels.length)-1;
107 var n = (channels.length)-1;
108 var num = parseInt(channels[n]);
108 var num = parseInt(channels[n]);
109 sequence = ""
109 sequence = ""
110 for (i = 0; i < num; i++) {
110 for (i = 0; i < num; i++) {
111 for (j = i+1; j < num; j++) {
111 for (j = i+1; j < num; j++) {
112 sequence = sequence + "[" + i.toString() + ", " + j.toString() + "],"
112 sequence = sequence + "[" + i.toString() + ", " + j.toString() + "],"
113 }
113 }
114 }
114 }
115 return sequence
115 return sequence
116 }
116 }
117
117
118
118
119 function updateSpectralNumber(){
119 function updateSpectralNumber(){
120 var spectral_comb = $("#id_spectral").val();
120 var spectral_comb = $("#id_spectral").val();
121 var num = spectral_comb.length;
121 var num = spectral_comb.length;
122 var cont = 0
122 var cont = 0
123 for (i = 0; i < num; i++) {
123 for (i = 0; i < num; i++) {
124 if (spectral_comb[i] == "]"){
124 if (spectral_comb[i] == "]"){
125 cont = cont + 1
125 cont = cont + 1
126 }
126 }
127 }
127 }
128 $("#id_spectral_number").val(cont)
128 $("#id_spectral_number").val(cont)
129 }
129 }
130
130
131
131
132 $("#delete_spectral_button").click(function(){{
132 $("#delete_spectral_button").click(function(){{
133 var spectral_comb = $("#id_spectral").val();
133 var spectral_comb = $("#id_spectral").val();
134 var spectral_number1 = $("#num1").val();
134 var spectral_number1 = $("#num1").val();
135 var spectral_number2 = $("#num2").val();
135 var spectral_number2 = $("#num2").val();
136 var str = spectral_number1+", "+spectral_number2;
136 var str = spectral_number1+", "+spectral_number2;
137 var n = spectral_comb.search(str);
137 var n = spectral_comb.search(str);
138 if (n==-1){
138 if (n==-1){
139
139
140 }
140 }
141 else {
141 else {
142 n= spectral_comb.length;
142 n= spectral_comb.length;
143 if (n<8){
143 if (n<8){
144 var tuple = "["+$("#num1").val()+", "+$("#num2").val()+"],"
144 var tuple = "["+$("#num1").val()+", "+$("#num2").val()+"],"
145 var txt = spectral_comb.replace(tuple,'');
145 var txt = spectral_comb.replace(tuple,'');
146 }
146 }
147 else {
147 else {
148 var tuple = ",["+$("#num1").val()+", "+$("#num2").val()+"]"
148 var tuple = ",["+$("#num1").val()+", "+$("#num2").val()+"]"
149 var txt = spectral_comb.replace(tuple,'');
149 var txt = spectral_comb.replace(tuple,'');
150 }
150 }
151 $("#id_spectral").val(txt)
151 $("#id_spectral").val(txt)
152
152
153 var tuple = "["+$("#num1").val()+", "+$("#num2").val()+"],"
153 var tuple = "["+$("#num1").val()+", "+$("#num2").val()+"],"
154 var txt = spectral_comb.replace(tuple,'');
154 var txt = spectral_comb.replace(tuple,'');
155 $("#id_spectral").val(txt)
155 $("#id_spectral").val(txt)
156 }
156 }
157 updateSpectralNumber()
157 updateSpectralNumber()
158 }});
158 }});
159
159
160
160
161 }});
161 }});
162 </script>
162 </script>
163 '''
163 '''
164
164
165 return mark_safe(html+script)
165 return mark_safe(html+script)
@@ -1,808 +1,816
1
1
2 import os
2 import os
3 import json
3 import json
4 import requests
4 import requests
5 import time
5 import time
6 from datetime import datetime
6 from datetime import datetime
7
7
8 try:
8 try:
9 from polymorphic.models import PolymorphicModel
9 from polymorphic.models import PolymorphicModel
10 except:
10 except:
11 from polymorphic import PolymorphicModel
11 from polymorphic import PolymorphicModel
12
12
13 from django.template.base import kwarg_re
13 from django.template.base import kwarg_re
14 from django.db import models
14 from django.db import models
15 from django.urls import reverse
15 from django.urls import reverse
16 from django.core.validators import MinValueValidator, MaxValueValidator
16 from django.core.validators import MinValueValidator, MaxValueValidator
17 from django.shortcuts import get_object_or_404
17 from django.shortcuts import get_object_or_404
18 from django.contrib.auth.models import User
18 from django.contrib.auth.models import User
19 from django.db.models.signals import post_save
19 from django.db.models.signals import post_save
20 from django.dispatch import receiver
20 from django.dispatch import receiver
21
21
22 from apps.main.utils import Params
22 from apps.main.utils import Params
23 from apps.rc.utils import RCFile
23 from apps.rc.utils import RCFile
24 from apps.jars.utils import RacpFile
24 from apps.jars.utils import RacpFile
25 from devices.dds import api as dds_api
25 from devices.dds import api as dds_api
26 from devices.dds import data as dds_data
26 from devices.dds import data as dds_data
27
27
28
28
29 DEV_PORTS = {
29 DEV_PORTS = {
30 'rc' : 2000,
30 'rc' : 2000,
31 'dds' : 2000,
31 'dds' : 2000,
32 'jars' : 2000,
32 'jars' : 2000,
33 'usrp' : 2000,
33 'usrp' : 2000,
34 'cgs' : 8080,
34 'cgs' : 8080,
35 'abs' : 8080,
35 'abs' : 8080,
36 'dds_rest': 80
36 'dds_rest': 80
37 }
37 }
38
38
39 RADAR_STATES = (
39 RADAR_STATES = (
40 (0, 'No connected'),
40 (0, 'No connected'),
41 (1, 'Connected'),
41 (1, 'Connected'),
42 (2, 'Configured'),
42 (2, 'Configured'),
43 (3, 'Running'),
43 (3, 'Running'),
44 (4, 'Scheduled'),
44 (4, 'Scheduled'),
45 )
45 )
46
46
47 EXPERIMENT_TYPE = (
47 EXPERIMENT_TYPE = (
48 (0, 'RAW_DATA'),
48 (0, 'RAW_DATA'),
49 (1, 'PDATA'),
49 (1, 'PDATA'),
50 )
50 )
51
51
52 DECODE_TYPE = (
52 DECODE_TYPE = (
53 (0, 'None'),
53 (0, 'None'),
54 (1, 'TimeDomain'),
54 (1, 'TimeDomain'),
55 (2, 'FreqDomain'),
55 (2, 'FreqDomain'),
56 (3, 'InvFreqDomain'),
56 (3, 'InvFreqDomain'),
57 )
57 )
58
58
59 DEV_STATES = (
59 DEV_STATES = (
60 (0, 'No connected'),
60 (0, 'No connected'),
61 (1, 'Connected'),
61 (1, 'Connected'),
62 (2, 'Configured'),
62 (2, 'Configured'),
63 (3, 'Running'),
63 (3, 'Running'),
64 (4, 'Unknown'),
64 (4, 'Unknown'),
65 )
65 )
66
66
67 DEV_TYPES = (
67 DEV_TYPES = (
68 ('', 'Select a device type'),
68 ('', 'Select a device type'),
69 ('rc', 'Radar Controller'),
69 ('rc', 'Radar Controller'),
70 ('dds', 'Direct Digital Synthesizer'),
70 ('dds', 'Direct Digital Synthesizer'),
71 ('jars', 'Jicamarca Radar Acquisition System'),
71 ('jars', 'Jicamarca Radar Acquisition System'),
72 ('usrp', 'Universal Software Radio Peripheral'),
72 ('usrp', 'Universal Software Radio Peripheral'),
73 ('cgs', 'Clock Generator System'),
73 ('cgs', 'Clock Generator System'),
74 ('abs', 'Automatic Beam Switching'),
74 ('abs', 'Automatic Beam Switching'),
75 ('dds_rest', 'Direct Digital Synthesizer_REST'),
75 ('dds_rest', 'Direct Digital Synthesizer_REST'),
76 )
76 )
77
77
78 EXP_STATES = (
78 EXP_STATES = (
79 (0,'Error'), #RED
79 (0,'Error'), #RED
80 (1,'Cancelled'), #YELLOW
80 (1,'Cancelled'), #YELLOW
81 (2,'Running'), #GREEN
81 (2,'Running'), #GREEN
82 (3,'Scheduled'), #BLUE
82 (3,'Scheduled'), #BLUE
83 (4,'Unknown'), #WHITE
83 (4,'Unknown'), #WHITE
84 )
84 )
85
85
86 CONF_TYPES = (
86 CONF_TYPES = (
87 (0, 'Active'),
87 (0, 'Active'),
88 (1, 'Historical'),
88 (1, 'Historical'),
89 )
89 )
90
90
91 class Profile(models.Model):
91 class Profile(models.Model):
92 user = models.OneToOneField(User, on_delete=models.CASCADE)
92 user = models.OneToOneField(User, on_delete=models.CASCADE)
93 theme = models.CharField(max_length=30, default='spacelab')
93 theme = models.CharField(max_length=30, default='spacelab')
94
94
95
95
96 @receiver(post_save, sender=User)
96 @receiver(post_save, sender=User)
97 def create_user_profile(sender, instance, created, **kwargs):
97 def create_user_profile(sender, instance, created, **kwargs):
98 if created:
98 if created:
99 Profile.objects.create(user=instance)
99 Profile.objects.create(user=instance)
100
100
101 @receiver(post_save, sender=User)
101 @receiver(post_save, sender=User)
102 def save_user_profile(sender, instance, **kwargs):
102 def save_user_profile(sender, instance, **kwargs):
103 instance.profile.save()
103 instance.profile.save()
104
104
105
105
106 class Location(models.Model):
106 class Location(models.Model):
107
107
108 name = models.CharField(max_length = 30)
108 name = models.CharField(max_length = 30)
109 description = models.TextField(blank=True, null=True)
109 description = models.TextField(blank=True, null=True)
110
110
111 class Meta:
111 class Meta:
112 db_table = 'db_location'
112 db_table = 'db_location'
113
113
114 def __str__(self):
114 def __str__(self):
115 return u'%s' % self.name
115 return u'%s' % self.name
116
116
117 def get_absolute_url(self):
117 def get_absolute_url(self):
118 return reverse('url_location', args=[str(self.id)])
118 return reverse('url_location', args=[str(self.id)])
119
119
120
120
121 class DeviceType(models.Model):
121 class DeviceType(models.Model):
122
122
123 name = models.CharField(max_length = 10, choices = DEV_TYPES, default = 'dds_rest')
123 name = models.CharField(max_length = 10, choices = DEV_TYPES, default = 'dds_rest')
124 sequence = models.PositiveSmallIntegerField(default=55)
124 sequence = models.PositiveSmallIntegerField(default=55)
125 description = models.TextField(blank=True, null=True)
125 description = models.TextField(blank=True, null=True)
126
126
127 class Meta:
127 class Meta:
128 db_table = 'db_device_types'
128 db_table = 'db_device_types'
129
129
130 def __str__(self):
130 def __str__(self):
131 return u'%s' % self.get_name_display()
131 return u'%s' % self.get_name_display()
132
132
133 class Device(models.Model):
133 class Device(models.Model):
134
134
135 device_type = models.ForeignKey('DeviceType', on_delete=models.CASCADE)
135 device_type = models.ForeignKey('DeviceType', on_delete=models.CASCADE)
136 location = models.ForeignKey('Location', on_delete=models.CASCADE)
136 location = models.ForeignKey('Location', on_delete=models.CASCADE)
137 ip_address = models.GenericIPAddressField(protocol='IPv4', default='0.0.0.0')
137 ip_address = models.GenericIPAddressField(protocol='IPv4', default='0.0.0.0')
138 port_address = models.PositiveSmallIntegerField(default=2000)
138 port_address = models.PositiveSmallIntegerField(default=2000)
139 description = models.TextField(blank=True, null=True)
139 description = models.TextField(blank=True, null=True)
140 status = models.PositiveSmallIntegerField(default=4, choices=DEV_STATES)
140 status = models.PositiveSmallIntegerField(default=4, choices=DEV_STATES)
141 conf_active = models.PositiveIntegerField(default=0, verbose_name='Current configuration')
141 conf_active = models.PositiveIntegerField(default=0, verbose_name='Current configuration')
142
142
143 class Meta:
143 class Meta:
144 db_table = 'db_devices'
144 db_table = 'db_devices'
145
145
146 def __str__(self):
146 def __str__(self):
147 ret = u'{} [{}]'.format(self.device_type.name.upper(), self.location.name)
147 ret = u'{} [{}]'.format(self.device_type.name.upper(), self.location.name)
148
148
149 return ret
149 return ret
150
150
151 @property
151 @property
152 def name(self):
152 def name(self):
153 return str(self)
153 return str(self)
154
154
155 def get_status(self):
155 def get_status(self):
156 return self.status
156 return self.status
157
157
158 @property
158 @property
159 def status_color(self):
159 def status_color(self):
160 color = 'muted'
160 color = 'muted'
161 if self.status == 0:
161 if self.status == 0:
162 color = "danger"
162 color = "danger"
163 elif self.status == 1:
163 elif self.status == 1:
164 color = "warning"
164 color = "warning"
165 elif self.status == 2:
165 elif self.status == 2:
166 color = "info"
166 color = "info"
167 elif self.status == 3:
167 elif self.status == 3:
168 color = "success"
168 color = "success"
169
169
170 return color
170 return color
171
171
172 def url(self, path=None):
172 def url(self, path=None):
173
173
174 if path:
174 if path:
175 return 'http://{}:{}/{}/'.format(self.ip_address, self.port_address, path)
175 return 'http://{}:{}/{}/'.format(self.ip_address, self.port_address, path)
176 else:
176 else:
177 return 'http://{}:{}/'.format(self.ip_address, self.port_address)
177 return 'http://{}:{}/'.format(self.ip_address, self.port_address)
178
178
179 def get_absolute_url(self):
179 def get_absolute_url(self):
180 return reverse('url_device', args=[str(self.id)])
180 return reverse('url_device', args=[str(self.id)])
181
181
182 def get_absolute_url_edit(self):
182 def get_absolute_url_edit(self):
183 return reverse('url_edit_device', args=[str(self.id)])
183 return reverse('url_edit_device', args=[str(self.id)])
184
184
185 def get_absolute_url_delete(self):
185 def get_absolute_url_delete(self):
186 return reverse('url_delete_device', args=[str(self.id)])
186 return reverse('url_delete_device', args=[str(self.id)])
187
187
188 def change_ip(self, ip_address, mask, gateway, dns, **kwargs):
188 def change_ip(self, ip_address, mask, gateway, dns, **kwargs):
189
189
190 if self.device_type.name=='dds':
190 if self.device_type.name=='dds':
191 try:
191 try:
192 answer = dds_api.change_ip(ip = self.ip_address,
192 answer = dds_api.change_ip(ip = self.ip_address,
193 port = self.port_address,
193 port = self.port_address,
194 new_ip = ip_address,
194 new_ip = ip_address,
195 mask = mask,
195 mask = mask,
196 gateway = gateway)
196 gateway = gateway)
197 if answer[0]=='1':
197 if answer[0]=='1':
198 self.message = '25|DDS - {}'.format(answer)
198 self.message = '25|DDS - {}'.format(answer)
199 self.ip_address = ip_address
199 self.ip_address = ip_address
200 self.save()
200 self.save()
201 else:
201 else:
202 self.message = '30|DDS - {}'.format(answer)
202 self.message = '30|DDS - {}'.format(answer)
203 return False
203 return False
204 except Exception as e:
204 except Exception as e:
205 self.message = '40|{}'.format(str(e))
205 self.message = '40|{}'.format(str(e))
206 return False
206 return False
207
207
208 elif self.device_type.name=='rc':
208 elif self.device_type.name=='rc':
209 headers = {'content-type': "application/json",
209 headers = {'content-type': "application/json",
210 'cache-control': "no-cache"}
210 'cache-control': "no-cache"}
211
211
212 ip = [int(x) for x in ip_address.split('.')]
212 ip = [int(x) for x in ip_address.split('.')]
213 dns = [int(x) for x in dns.split('.')]
213 dns = [int(x) for x in dns.split('.')]
214 gateway = [int(x) for x in gateway.split('.')]
214 gateway = [int(x) for x in gateway.split('.')]
215 subnet = [int(x) for x in mask.split('.')]
215 subnet = [int(x) for x in mask.split('.')]
216
216
217 payload = {
217 payload = {
218 "ip": ip,
218 "ip": ip,
219 "dns": dns,
219 "dns": dns,
220 "gateway": gateway,
220 "gateway": gateway,
221 "subnet": subnet
221 "subnet": subnet
222 }
222 }
223
223
224 req = requests.post(self.url('changeip'), data=json.dumps(payload), headers=headers)
224 req = requests.post(self.url('changeip'), data=json.dumps(payload), headers=headers)
225 try:
225 try:
226 answer = req.json()
226 answer = req.json()
227 if answer['changeip']=='ok':
227 if answer['changeip']=='ok':
228 self.message = '25|IP succesfully changed'
228 self.message = '25|IP succesfully changed'
229 self.ip_address = ip_address
229 self.ip_address = ip_address
230 self.save()
230 self.save()
231 else:
231 else:
232 self.message = '30|An error ocuur when changing IP'
232 self.message = '30|An error ocuur when changing IP'
233 except Exception as e:
233 except Exception as e:
234 self.message = '40|{}'.format(str(e))
234 self.message = '40|{}'.format(str(e))
235 else:
235 else:
236 self.message = 'Not implemented'
236 self.message = 'Not implemented'
237 return False
237 return False
238
238
239 return True
239 return True
240
240
241
241
242 class Campaign(models.Model):
242 class Campaign(models.Model):
243
243
244 template = models.BooleanField(default=False)
244 template = models.BooleanField(default=False)
245 name = models.CharField(max_length=60, unique=True)
245 name = models.CharField(max_length=60, unique=True)
246 start_date = models.DateTimeField(blank=True, null=True)
246 start_date = models.DateTimeField(blank=True, null=True)
247 end_date = models.DateTimeField(blank=True, null=True)
247 end_date = models.DateTimeField(blank=True, null=True)
248 tags = models.CharField(max_length=40, blank=True, null=True)
248 tags = models.CharField(max_length=40, blank=True, null=True)
249 description = models.TextField(blank=True, null=True)
249 description = models.TextField(blank=True, null=True)
250 experiments = models.ManyToManyField('Experiment', blank=True)
250 experiments = models.ManyToManyField('Experiment', blank=True)
251 author = models.ForeignKey(User, null=True, blank=True,on_delete=models.CASCADE)
251 author = models.ForeignKey(User, null=True, blank=True,on_delete=models.CASCADE)
252
252
253 class Meta:
253 class Meta:
254 db_table = 'db_campaigns'
254 db_table = 'db_campaigns'
255 ordering = ('name',)
255 ordering = ('name',)
256
256
257 def __str__(self):
257 def __str__(self):
258 if self.template:
258 if self.template:
259 return u'{} (template)'.format(self.name)
259 return u'{} (template)'.format(self.name)
260 else:
260 else:
261 return u'{}'.format(self.name)
261 return u'{}'.format(self.name)
262
262
263 def jsonify(self):
263 def jsonify(self):
264
264
265 data = {}
265 data = {}
266
266
267 ignored = ('template')
267 ignored = ('template')
268
268
269 for field in self._meta.fields:
269 for field in self._meta.fields:
270 if field.name in ignored:
270 if field.name in ignored:
271 continue
271 continue
272 data[field.name] = field.value_from_object(self)
272 data[field.name] = field.value_from_object(self)
273
273
274 data['start_date'] = data['start_date'].strftime('%Y-%m-%d')
274 data['start_date'] = data['start_date'].strftime('%Y-%m-%d')
275 data['end_date'] = data['end_date'].strftime('%Y-%m-%d')
275 data['end_date'] = data['end_date'].strftime('%Y-%m-%d')
276
276
277 return data
277 return data
278
278
279 def parms_to_dict(self):
279 def parms_to_dict(self):
280
280
281 params = Params({})
281 params = Params({})
282 params.add(self.jsonify(), 'campaigns')
282 params.add(self.jsonify(), 'campaigns')
283
283
284 for exp in Experiment.objects.filter(campaign = self):
284 for exp in Experiment.objects.filter(campaign = self):
285 params.add(exp.jsonify(), 'experiments')
285 params.add(exp.jsonify(), 'experiments')
286 configurations = Configuration.objects.filter(experiment=exp, type=0)
286 configurations = Configuration.objects.filter(experiment=exp, type=0)
287
287
288 for conf in configurations:
288 for conf in configurations:
289 params.add(conf.jsonify(), 'configurations')
289 params.add(conf.jsonify(), 'configurations')
290 if conf.device.device_type.name=='rc':
290 if conf.device.device_type.name=='rc':
291 for line in conf.get_lines():
291 for line in conf.get_lines():
292 params.add(line.jsonify(), 'lines')
292 params.add(line.jsonify(), 'lines')
293
293
294 return params.data
294 return params.data
295
295
296 def dict_to_parms(self, parms, CONF_MODELS):
296 def dict_to_parms(self, parms, CONF_MODELS):
297
297
298 experiments = Experiment.objects.filter(campaign = self)
298 experiments = Experiment.objects.filter(campaign = self)
299
299
300 if experiments:
300 if experiments:
301 for experiment in experiments:
301 for experiment in experiments:
302 experiment.delete()
302 experiment.delete()
303
303
304 for id_exp in parms['experiments']['allIds']:
304 for id_exp in parms['experiments']['allIds']:
305 exp_parms = parms['experiments']['byId'][id_exp]
305 exp_parms = parms['experiments']['byId'][id_exp]
306 dum = (datetime.now() - datetime(1970, 1, 1)).total_seconds()
306 dum = (datetime.now() - datetime(1970, 1, 1)).total_seconds()
307 exp = Experiment(name='{}'.format(dum))
307 exp = Experiment(name='{}'.format(dum))
308 exp.save()
308 exp.save()
309 exp.dict_to_parms(parms, CONF_MODELS, id_exp=id_exp)
309 exp.dict_to_parms(parms, CONF_MODELS, id_exp=id_exp)
310 self.experiments.add(exp)
310 self.experiments.add(exp)
311
311
312 camp_parms = parms['campaigns']['byId'][parms['campaigns']['allIds'][0]]
312 camp_parms = parms['campaigns']['byId'][parms['campaigns']['allIds'][0]]
313
313
314 self.name = '{}-{}'.format(camp_parms['name'], datetime.now().strftime('%y%m%d'))
314 self.name = '{}-{}'.format(camp_parms['name'], datetime.now().strftime('%y%m%d'))
315 self.start_date = camp_parms['start_date']
315 self.start_date = camp_parms['start_date']
316 self.end_date = camp_parms['end_date']
316 self.end_date = camp_parms['end_date']
317 self.tags = camp_parms['tags']
317 self.tags = camp_parms['tags']
318 self.save()
318 self.save()
319
319
320 return self
320 return self
321
321
322 def get_experiments_by_radar(self, radar=None):
322 def get_experiments_by_radar(self, radar=None):
323
323
324 ret = []
324 ret = []
325 if radar:
325 if radar:
326 locations = Location.objects.filter(pk=radar)
326 locations = Location.objects.filter(pk=radar)
327 else:
327 else:
328 locations = set([e.location for e in self.experiments.all()])
328 locations = set([e.location for e in self.experiments.all()])
329
329
330 for loc in locations:
330 for loc in locations:
331 dum = {}
331 dum = {}
332 dum['name'] = loc.name
332 dum['name'] = loc.name
333 dum['id'] = loc.pk
333 dum['id'] = loc.pk
334 dum['experiments'] = [e for e in self.experiments.all() if e.location==loc]
334 dum['experiments'] = [e for e in self.experiments.all() if e.location==loc]
335 ret.append(dum)
335 ret.append(dum)
336
336
337 return ret
337 return ret
338
338
339 def get_absolute_url(self):
339 def get_absolute_url(self):
340 return reverse('url_campaign', args=[str(self.id)])
340 return reverse('url_campaign', args=[str(self.id)])
341
341
342 def get_absolute_url_edit(self):
342 def get_absolute_url_edit(self):
343 return reverse('url_edit_campaign', args=[str(self.id)])
343 return reverse('url_edit_campaign', args=[str(self.id)])
344
344
345 def get_absolute_url_delete(self):
345 def get_absolute_url_delete(self):
346 return reverse('url_delete_campaign', args=[str(self.id)])
346 return reverse('url_delete_campaign', args=[str(self.id)])
347
347
348 def get_absolute_url_export(self):
348 def get_absolute_url_export(self):
349 return reverse('url_export_campaign', args=[str(self.id)])
349 return reverse('url_export_campaign', args=[str(self.id)])
350
350
351 def get_absolute_url_import(self):
351 def get_absolute_url_import(self):
352 return reverse('url_import_campaign', args=[str(self.id)])
352 return reverse('url_import_campaign', args=[str(self.id)])
353
353
354
354
355 class RunningExperiment(models.Model):
355 class RunningExperiment(models.Model):
356 radar = models.OneToOneField('Location', on_delete=models.CASCADE)
356 radar = models.OneToOneField('Location', on_delete=models.CASCADE)
357 running_experiment = models.ManyToManyField('Experiment', blank = True)
357 running_experiment = models.ManyToManyField('Experiment', blank = True)
358 status = models.PositiveSmallIntegerField(default=0, choices=RADAR_STATES)
358 status = models.PositiveSmallIntegerField(default=0, choices=RADAR_STATES)
359
359
360
360
361 class Experiment(models.Model):
361 class Experiment(models.Model):
362
362
363 template = models.BooleanField(default=False)
363 template = models.BooleanField(default=False)
364 name = models.CharField(max_length=40, default='', unique=True)
364 name = models.CharField(max_length=40, default='', unique=True)
365 location = models.ForeignKey('Location', null=True, blank=True, on_delete=models.CASCADE)
365 location = models.ForeignKey('Location', null=True, blank=True, on_delete=models.CASCADE)
366 freq = models.FloatField(verbose_name='Operating Freq. (MHz)', validators=[MinValueValidator(1), MaxValueValidator(10000)], default=49.9200)
366 freq = models.FloatField(verbose_name='Operating Freq. (MHz)', validators=[MinValueValidator(1), MaxValueValidator(10000)], default=49.9200)
367 start_time = models.TimeField(default='00:00:00')
367 start_time = models.TimeField(default='00:00:00')
368 end_time = models.TimeField(default='23:59:59')
368 end_time = models.TimeField(default='23:59:59')
369 task = models.CharField(max_length=36, default='', blank=True, null=True)
369 task = models.CharField(max_length=36, default='', blank=True, null=True)
370 status = models.PositiveSmallIntegerField(default=4, choices=EXP_STATES)
370 status = models.PositiveSmallIntegerField(default=4, choices=EXP_STATES)
371 author = models.ForeignKey(User, null=True, blank=True,on_delete=models.CASCADE)
371 author = models.ForeignKey(User, null=True, blank=True,on_delete=models.CASCADE)
372 hash = models.CharField(default='', max_length=64, null=True, blank=True)
372 hash = models.CharField(default='', max_length=64, null=True, blank=True)
373
373
374 class Meta:
374 class Meta:
375 db_table = 'db_experiments'
375 db_table = 'db_experiments'
376 ordering = ('template', 'name')
376 ordering = ('template', 'name')
377
377
378 def __str__(self):
378 def __str__(self):
379 if self.template:
379 if self.template:
380 return u'%s (template)' % (self.name)
380 return u'%s (template)' % (self.name)
381 else:
381 else:
382 return u'%s' % (self.name)
382 return u'%s' % (self.name)
383
383
384 def jsonify(self):
384 def jsonify(self):
385
385
386 data = {}
386 data = {}
387
387
388 ignored = ('template')
388 ignored = ('template')
389
389
390 for field in self._meta.fields:
390 for field in self._meta.fields:
391 if field.name in ignored:
391 if field.name in ignored:
392 continue
392 continue
393 data[field.name] = field.value_from_object(self)
393 data[field.name] = field.value_from_object(self)
394
394
395 data['start_time'] = data['start_time'].strftime('%H:%M:%S')
395 data['start_time'] = data['start_time'].strftime('%H:%M:%S')
396 data['end_time'] = data['end_time'].strftime('%H:%M:%S')
396 data['end_time'] = data['end_time'].strftime('%H:%M:%S')
397 data['location'] = self.location.name
397 data['location'] = self.location.name
398 data['configurations'] = ['{}'.format(conf.pk) for
398 data['configurations'] = ['{}'.format(conf.pk) for
399 conf in Configuration.objects.filter(experiment=self, type=0)]
399 conf in Configuration.objects.filter(experiment=self, type=0)]
400
400
401 return data
401 return data
402
402
403 @property
403 @property
404 def radar_system(self):
404 def radar_system(self):
405 return self.location
405 return self.location
406
406
407 def clone(self, **kwargs):
407 def clone(self, **kwargs):
408
408
409 confs = Configuration.objects.filter(experiment=self, type=0)
409 confs = Configuration.objects.filter(experiment=self, type=0)
410 self.pk = None
410 self.pk = None
411 self.name = '{}_{:%y%m%d}'.format(self.name, datetime.now())
411 self.name = '{}_{:%y%m%d}'.format(self.name, datetime.now())
412 for attr, value in kwargs.items():
412 for attr, value in kwargs.items():
413 setattr(self, attr, value)
413 setattr(self, attr, value)
414
414
415 self.save()
415 self.save()
416
416
417 for conf in confs:
417 for conf in confs:
418 conf.clone(experiment=self, template=False)
418 conf.clone(experiment=self, template=False)
419
419
420 return self
420 return self
421
421
422 def start(self):
422 def start(self):
423 '''
423 '''
424 Configure and start experiments's devices
424 Configure and start experiments's devices
425 ABS-CGS-DDS-RC-JARS
425 ABS-CGS-DDS-RC-JARS
426 '''
426 '''
427
427
428 confs = []
428 confs = []
429 allconfs = Configuration.objects.filter(experiment=self, type = 0).order_by('-device__device_type__sequence')
429 allconfs = Configuration.objects.filter(experiment=self, type = 0).order_by('-device__device_type__sequence')
430 rc_mix = [conf for conf in allconfs if conf.device.device_type.name=='rc' and conf.mix]
430 rc_mix = [conf for conf in allconfs if conf.device.device_type.name=='rc' and conf.mix]
431 if rc_mix:
431 if rc_mix:
432 for conf in allconfs:
432 for conf in allconfs:
433 if conf.device.device_type.name == 'rc' and not conf.mix:
433 if conf.device.device_type.name == 'rc' and not conf.mix:
434 continue
434 continue
435 confs.append(conf)
435 confs.append(conf)
436 else:
436 else:
437 confs = allconfs
437 confs = allconfs
438
438
439 try:
439 try:
440 for conf in confs:
440 for conf in confs:
441 conf.stop_device()
441 conf.stop_device()
442 conf.write_device()
442 conf.write_device()
443 conf.device.conf_active = conf.pk
443 conf.device.conf_active = conf.pk
444 conf.device.save()
444 conf.device.save()
445 conf.start_device()
445 conf.start_device()
446 time.sleep(1)
446 time.sleep(1)
447 except:
447 except:
448 return 0
448 return 0
449 return 2
449 return 2
450
450
451
451
452 def stop(self):
452 def stop(self):
453 '''
453 '''
454 Stop experiments's devices
454 Stop experiments's devices
455 DDS-JARS-RC-CGS-ABS
455 DDS-JARS-RC-CGS-ABS
456 '''
456 '''
457
457
458 confs = Configuration.objects.filter(experiment=self, type = 0).order_by('device__device_type__sequence')
458 confs = Configuration.objects.filter(experiment=self, type = 0).order_by('device__device_type__sequence')
459 confs=confs.exclude(device__device_type__name='cgs')
459 confs=confs.exclude(device__device_type__name='cgs')
460 try:
460 try:
461 for conf in confs:
461 for conf in confs:
462 conf.stop_device()
462 conf.stop_device()
463 except:
463 except:
464 return 0
464 return 0
465 return 1
465 return 1
466
466
467 def get_status(self):
467 def get_status(self):
468
468
469 if self.status == 3:
469 if self.status == 3:
470 return
470 return
471
471
472 confs = Configuration.objects.filter(experiment=self, type=0)
472 confs = Configuration.objects.filter(experiment=self, type=0)
473
473
474 for conf in confs:
474 for conf in confs:
475 conf.status_device()
475 conf.status_device()
476
476
477 total = confs.aggregate(models.Sum('device__status'))['device__status__sum']
477 total = confs.aggregate(models.Sum('device__status'))['device__status__sum']
478
478
479 if total==2*confs.count():
479 if total==2*confs.count():
480 status = 1
480 status = 1
481 elif total == 3*confs.count():
481 elif total == 3*confs.count():
482 status = 2
482 status = 2
483 else:
483 else:
484 status = 0
484 status = 0
485
485
486 self.status = status
486 self.status = status
487 self.save()
487 self.save()
488
488
489 def status_color(self):
489 def status_color(self):
490 color = 'muted'
490 color = 'muted'
491 if self.status == 0:
491 if self.status == 0:
492 color = "danger"
492 color = "danger"
493 elif self.status == 1:
493 elif self.status == 1:
494 color = "warning"
494 color = "warning"
495 elif self.status == 2:
495 elif self.status == 2:
496 color = "success"
496 color = "success"
497 elif self.status == 3:
497 elif self.status == 3:
498 color = "info"
498 color = "info"
499
499
500 return color
500 return color
501
501
502 def parms_to_dict(self):
502 def parms_to_dict(self):
503
503
504 params = Params({})
504 params = Params({})
505 params.add(self.jsonify(), 'experiments')
505 params.add(self.jsonify(), 'experiments')
506
506
507 configurations = Configuration.objects.filter(experiment=self, type=0)
507 configurations = Configuration.objects.filter(experiment=self, type=0)
508
508
509 for conf in configurations:
509 for conf in configurations:
510 params.add(conf.jsonify(), 'configurations')
510 params.add(conf.jsonify(), 'configurations')
511 if conf.device.device_type.name=='rc':
511 if conf.device.device_type.name=='rc':
512 for line in conf.get_lines():
512 for line in conf.get_lines():
513 params.add(line.jsonify(), 'lines')
513 params.add(line.jsonify(), 'lines')
514
514
515 return params.data
515 return params.data
516
516
517 def dict_to_parms(self, parms, CONF_MODELS, id_exp=None):
517 def dict_to_parms(self, parms, CONF_MODELS, id_exp=None):
518
518
519 configurations = Configuration.objects.filter(experiment=self)
519 configurations = Configuration.objects.filter(experiment=self)
520
520
521 if id_exp is not None:
521 if id_exp is not None:
522 exp_parms = parms['experiments']['byId'][id_exp]
522 exp_parms = parms['experiments']['byId'][id_exp]
523 else:
523 else:
524 exp_parms = parms['experiments']['byId'][parms['experiments']['allIds'][0]]
524 exp_parms = parms['experiments']['byId'][parms['experiments']['allIds'][0]]
525
525
526 if configurations:
526 if configurations:
527 for configuration in configurations:
527 for configuration in configurations:
528 configuration.delete()
528 configuration.delete()
529
529
530 for id_conf in exp_parms['configurations']:
530 for id_conf in exp_parms['configurations']:
531 conf_parms = parms['configurations']['byId'][id_conf]
531 conf_parms = parms['configurations']['byId'][id_conf]
532 device = Device.objects.filter(device_type__name=conf_parms['device_type'])[0]
532 device = Device.objects.filter(device_type__name=conf_parms['device_type'])[0]
533 model = CONF_MODELS[conf_parms['device_type']]
533 model = CONF_MODELS[conf_parms['device_type']]
534 conf = model(
534 conf = model(
535 experiment = self,
535 experiment = self,
536 device = device,
536 device = device,
537 )
537 )
538 conf.dict_to_parms(parms, id=id_conf)
538 conf.dict_to_parms(parms, id=id_conf)
539
539
540
540
541 location, created = Location.objects.get_or_create(name=exp_parms['location'])
541 location, created = Location.objects.get_or_create(name=exp_parms['location'])
542 self.name = '{}-{}'.format(exp_parms['name'], datetime.now().strftime('%y%m%d'))
542 self.name = '{}-{}'.format(exp_parms['name'], datetime.now().strftime('%y%m%d'))
543 self.location = location
543 self.location = location
544 self.start_time = exp_parms['start_time']
544 self.start_time = exp_parms['start_time']
545 self.end_time = exp_parms['end_time']
545 self.end_time = exp_parms['end_time']
546 self.save()
546 self.save()
547
547
548 return self
548 return self
549
549
550 def get_absolute_url(self):
550 def get_absolute_url(self):
551 return reverse('url_experiment', args=[str(self.id)])
551 return reverse('url_experiment', args=[str(self.id)])
552
552
553 def get_absolute_url_edit(self):
553 def get_absolute_url_edit(self):
554 return reverse('url_edit_experiment', args=[str(self.id)])
554 return reverse('url_edit_experiment', args=[str(self.id)])
555
555
556 def get_absolute_url_delete(self):
556 def get_absolute_url_delete(self):
557 return reverse('url_delete_experiment', args=[str(self.id)])
557 return reverse('url_delete_experiment', args=[str(self.id)])
558
558
559 def get_absolute_url_import(self):
559 def get_absolute_url_import(self):
560 return reverse('url_import_experiment', args=[str(self.id)])
560 return reverse('url_import_experiment', args=[str(self.id)])
561
561
562 def get_absolute_url_export(self):
562 def get_absolute_url_export(self):
563 return reverse('url_export_experiment', args=[str(self.id)])
563 return reverse('url_export_experiment', args=[str(self.id)])
564
564
565 def get_absolute_url_start(self):
565 def get_absolute_url_start(self):
566 return reverse('url_start_experiment', args=[str(self.id)])
566 return reverse('url_start_experiment', args=[str(self.id)])
567
567
568 def get_absolute_url_stop(self):
568 def get_absolute_url_stop(self):
569 return reverse('url_stop_experiment', args=[str(self.id)])
569 return reverse('url_stop_experiment', args=[str(self.id)])
570
570
571
571
572 class Configuration(PolymorphicModel):
572 class Configuration(PolymorphicModel):
573
573
574 template = models.BooleanField(default=False)
574 template = models.BooleanField(default=False)
575 # name = models.CharField(verbose_name="Configuration Name", max_length=40, default='')
575 # name = models.CharField(verbose_name="Configuration Name", max_length=40, default='')
576 device = models.ForeignKey('Device', verbose_name='Device', null=True, on_delete=models.CASCADE)
576 device = models.ForeignKey('Device', verbose_name='Device', null=True, on_delete=models.CASCADE)
577 label = models.CharField(verbose_name="Label", max_length=40, default='', blank=True, null=True)
577 label = models.CharField(verbose_name="Label", max_length=40, default='', blank=True, null=True)
578 experiment = models.ForeignKey('Experiment', verbose_name='Experiment', null=True, blank=True, on_delete=models.CASCADE)
578 experiment = models.ForeignKey('Experiment', verbose_name='Experiment', null=True, blank=True, on_delete=models.CASCADE)
579 type = models.PositiveSmallIntegerField(default=0, choices=CONF_TYPES)
579 type = models.PositiveSmallIntegerField(default=0, choices=CONF_TYPES)
580 created_date = models.DateTimeField(auto_now_add=True)
580 created_date = models.DateTimeField(auto_now_add=True)
581 programmed_date = models.DateTimeField(auto_now=True)
581 programmed_date = models.DateTimeField(auto_now=True)
582 parameters = models.TextField(default='{}')
582 parameters = models.TextField(default='{}')
583 author = models.ForeignKey(User, null=True, blank=True,on_delete=models.CASCADE)
583 author = models.ForeignKey(User, null=True, blank=True,on_delete=models.CASCADE)
584 hash = models.CharField(default='', max_length=64, null=True, blank=True)
584 hash = models.CharField(default='', max_length=64, null=True, blank=True)
585 message = ""
585 message = ""
586
586
587 class Meta:
587 class Meta:
588 db_table = 'db_configurations'
588 db_table = 'db_configurations'
589 ordering = ('device__device_type__name',)
589 ordering = ('device__device_type__name',)
590
590
591 def __str__(self):
591 def __str__(self):
592
592
593 ret = u'{} '.format(self.device.device_type.name.upper())
593 ret = u'{} '.format(self.device.device_type.name.upper())
594
594
595 if 'mix' in [f.name for f in self._meta.get_fields()]:
595 if 'mix' in [f.name for f in self._meta.get_fields()]:
596 if self.mix:
596 if self.mix:
597 ret = '{} MIX '.format(self.device.device_type.name.upper())
597 ret = '{} MIX '.format(self.device.device_type.name.upper())
598
598
599 if 'label' in [f.name for f in self._meta.get_fields()]:
599 if 'label' in [f.name for f in self._meta.get_fields()]:
600 ret += '{}'.format(self.label)
600 ret += '{}'.format(self.label)
601
601
602 if self.template:
602 if self.template:
603 ret += ' (template)'
603 ret += ' (template)'
604
604
605 return ret
605 return ret
606
606
607 @property
607 @property
608 def name(self):
608 def name(self):
609
609
610 return str(self)
610 return str(self)
611
611
612 def jsonify(self):
612 def jsonify(self):
613
613
614 data = {}
614 data = {}
615
615
616 ignored = ('type', 'polymorphic_ctype', 'configuration_ptr',
616 ignored = ('type', 'polymorphic_ctype', 'configuration_ptr',
617 'created_date', 'programmed_date', 'template', 'device',
617 'created_date', 'programmed_date', 'template', 'device',
618 'experiment')
618 'experiment')
619
619
620 for field in self._meta.fields:
620 for field in self._meta.fields:
621 if field.name in ignored:
621 if field.name in ignored:
622 continue
622 continue
623 data[field.name] = field.value_from_object(self)
623 data[field.name] = field.value_from_object(self)
624
624
625 data['device_type'] = self.device.device_type.name
625 data['device_type'] = self.device.device_type.name
626
626
627 if self.device.device_type.name == 'rc':
627 if self.device.device_type.name == 'rc':
628 data['lines'] = ['{}'.format(line.pk) for line in self.get_lines()]
628 data['lines'] = ['{}'.format(line.pk) for line in self.get_lines()]
629 data['delays'] = self.get_delays()
629 data['delays'] = self.get_delays()
630 data['pulses'] = self.get_pulses()
630 data['pulses'] = self.get_pulses()
631
631
632 elif self.device.device_type.name == 'jars':
632 elif self.device.device_type.name == 'jars':
633 data['decode_type'] = DECODE_TYPE[self.decode_data][1]
633 data['decode_type'] = DECODE_TYPE[self.decode_data][1]
634
634
635 elif self.device.device_type.name == 'dds':
635 elif self.device.device_type.name == 'dds':
636 data['frequencyA_Mhz'] = float(data['frequencyA_Mhz'])
636 data['frequencyA_Mhz'] = float(data['frequencyA_Mhz'])
637 data['frequencyB_Mhz'] = float(data['frequencyB_Mhz'])
637 data['frequencyB_Mhz'] = float(data['frequencyB_Mhz'])
638 data['phaseA'] = dds_data.phase_to_binary(data['phaseA_degrees'])
638 data['phaseA'] = dds_data.phase_to_binary(data['phaseA_degrees'])
639 data['phaseB'] = dds_data.phase_to_binary(data['phaseB_degrees'])
639 data['phaseB'] = dds_data.phase_to_binary(data['phaseB_degrees'])
640
640
641 elif self.device.device_type.name == 'dds_rest':
642 data['frequencyA_Mhz'] = float(data['frequencyA_Mhz'])
643 data['frequencyB_Mhz'] = float(data['frequencyB_Mhz'])
644 data['phaseA'] = dds_data.phase_to_binary(data['phaseA_degrees'])
645 data['phaseB'] = dds_data.phase_to_binary(data['phaseB_degrees'])
646 data['delta_frequency_Mhz'] = float(data['delta_frequency_Mhz'] or 0.00)
647 data['update_clock_Mhz'] = float(data['update_clock_Mhz'] or 0.00)
648 data['ramp_rate_clock_Mhz'] = float(data['ramp_rate_clock_Mhz'] or 0.0)
641 return data
649 return data
642
650
643 def clone(self, **kwargs):
651 def clone(self, **kwargs):
644
652
645 self.pk = None
653 self.pk = None
646 self.id = None
654 self.id = None
647 for attr, value in kwargs.items():
655 for attr, value in kwargs.items():
648 setattr(self, attr, value)
656 setattr(self, attr, value)
649
657
650 self.save()
658 self.save()
651
659
652 return self
660 return self
653
661
654 def parms_to_dict(self):
662 def parms_to_dict(self):
655
663
656 params = Params({})
664 params = Params({})
657 params.add(self.jsonify(), 'configurations')
665 params.add(self.jsonify(), 'configurations')
658
666
659 if self.device.device_type.name=='rc':
667 if self.device.device_type.name=='rc':
660 for line in self.get_lines():
668 for line in self.get_lines():
661 params.add(line.jsonify(), 'lines')
669 params.add(line.jsonify(), 'lines')
662
670
663 return params.data
671 return params.data
664
672
665 def parms_to_text(self):
673 def parms_to_text(self):
666
674
667 raise NotImplementedError("This method should be implemented in %s Configuration model" %str(self.device.device_type.name).upper())
675 raise NotImplementedError("This method should be implemented in %s Configuration model" %str(self.device.device_type.name).upper())
668
676
669
677
670 def parms_to_binary(self):
678 def parms_to_binary(self):
671
679
672 raise NotImplementedError("This method should be implemented in %s Configuration model" %str(self.device.device_type.name).upper())
680 raise NotImplementedError("This method should be implemented in %s Configuration model" %str(self.device.device_type.name).upper())
673
681
674
682
675 def dict_to_parms(self, parameters, id=None):
683 def dict_to_parms(self, parameters, id=None):
676
684
677 params = Params(parameters)
685 params = Params(parameters)
678
686
679 if id:
687 if id:
680 data = params.get_conf(id_conf=id)
688 data = params.get_conf(id_conf=id)
681 else:
689 else:
682 data = params.get_conf(dtype=self.device.device_type.name)
690 data = params.get_conf(dtype=self.device.device_type.name)
683
691
684 if data['device_type']=='rc':
692 if data['device_type']=='rc':
685 self.clean_lines()
693 self.clean_lines()
686 lines = data.pop('lines', None)
694 lines = data.pop('lines', None)
687 for line_id in lines:
695 for line_id in lines:
688 pass
696 pass
689
697
690 for key, value in data.items():
698 for key, value in data.items():
691 if key not in ('id', 'device_type'):
699 if key not in ('id', 'device_type'):
692 setattr(self, key, value)
700 setattr(self, key, value)
693
701
694 self.save()
702 self.save()
695
703
696
704
697 def export_to_file(self, format="json"):
705 def export_to_file(self, format="json"):
698
706
699 content_type = ''
707 content_type = ''
700
708
701 if format == 'racp':
709 if format == 'racp':
702 content_type = 'text/plain'
710 content_type = 'text/plain'
703 filename = '%s_%s.%s' %(self.device.device_type.name, self.name, 'racp')
711 filename = '%s_%s.%s' %(self.device.device_type.name, self.name, 'racp')
704 content = self.parms_to_text(file_format = 'racp')
712 content = self.parms_to_text(file_format = 'racp')
705
713
706 if format == 'text':
714 if format == 'text':
707 content_type = 'text/plain'
715 content_type = 'text/plain'
708 filename = '%s_%s.%s' %(self.device.device_type.name, self.name, self.device.device_type.name)
716 filename = '%s_%s.%s' %(self.device.device_type.name, self.name, self.device.device_type.name)
709 content = self.parms_to_text()
717 content = self.parms_to_text()
710
718
711 if format == 'binary':
719 if format == 'binary':
712 content_type = 'application/octet-stream'
720 content_type = 'application/octet-stream'
713 filename = '%s_%s.bin' %(self.device.device_type.name, self.name)
721 filename = '%s_%s.bin' %(self.device.device_type.name, self.name)
714 content = self.parms_to_binary()
722 content = self.parms_to_binary()
715
723
716 if not content_type:
724 if not content_type:
717 content_type = 'application/json'
725 content_type = 'application/json'
718 filename = '%s_%s.json' %(self.device.device_type.name, self.name)
726 filename = '%s_%s.json' %(self.device.device_type.name, self.name)
719 content = json.dumps(self.parms_to_dict(), indent=2)
727 content = json.dumps(self.parms_to_dict(), indent=2)
720
728
721 fields = {'content_type':content_type,
729 fields = {'content_type':content_type,
722 'filename':filename,
730 'filename':filename,
723 'content':content
731 'content':content
724 }
732 }
725
733
726 return fields
734 return fields
727
735
728 def import_from_file(self, fp):
736 def import_from_file(self, fp):
729
737
730 parms = {}
738 parms = {}
731
739
732 path, ext = os.path.splitext(fp.name)
740 path, ext = os.path.splitext(fp.name)
733
741
734 if ext == '.json':
742 if ext == '.json':
735 parms = json.load(fp)
743 parms = json.load(fp)
736
744
737 if ext == '.dds':
745 if ext == '.dds':
738 lines = fp.readlines()
746 lines = fp.readlines()
739 parms = dds_data.text_to_dict(lines)
747 parms = dds_data.text_to_dict(lines)
740
748
741 if ext == '.racp':
749 if ext == '.racp':
742 if self.device.device_type.name == 'jars':
750 if self.device.device_type.name == 'jars':
743 parms = RacpFile(fp).to_dict()
751 parms = RacpFile(fp).to_dict()
744 parms['filter_parms'] = json.loads(self.filter_parms)
752 parms['filter_parms'] = json.loads(self.filter_parms)
745 return parms
753 return parms
746 parms = RCFile(fp).to_dict()
754 parms = RCFile(fp).to_dict()
747
755
748 return parms
756 return parms
749
757
750 def status_device(self):
758 def status_device(self):
751
759
752 self.message = 'Function not implemented'
760 self.message = 'Function not implemented'
753 return False
761 return False
754
762
755
763
756 def stop_device(self):
764 def stop_device(self):
757
765
758 self.message = 'Function not implemented'
766 self.message = 'Function not implemented'
759 return False
767 return False
760
768
761
769
762 def start_device(self):
770 def start_device(self):
763
771
764 self.message = 'Function not implemented'
772 self.message = 'Function not implemented'
765 return False
773 return False
766
774
767
775
768 def write_device(self, parms):
776 def write_device(self, parms):
769
777
770 self.message = 'Function not implemented'
778 self.message = 'Function not implemented'
771 return False
779 return False
772
780
773
781
774 def read_device(self):
782 def read_device(self):
775
783
776 self.message = 'Function not implemented'
784 self.message = 'Function not implemented'
777 return False
785 return False
778
786
779
787
780 def get_absolute_url(self):
788 def get_absolute_url(self):
781 return reverse('url_%s_conf' % self.device.device_type.name, args=[str(self.id)])
789 return reverse('url_%s_conf' % self.device.device_type.name, args=[str(self.id)])
782
790
783 def get_absolute_url_edit(self):
791 def get_absolute_url_edit(self):
784 return reverse('url_edit_%s_conf' % self.device.device_type.name, args=[str(self.id)])
792 return reverse('url_edit_%s_conf' % self.device.device_type.name, args=[str(self.id)])
785
793
786 def get_absolute_url_delete(self):
794 def get_absolute_url_delete(self):
787 return reverse('url_delete_dev_conf', args=[str(self.id)])
795 return reverse('url_delete_dev_conf', args=[str(self.id)])
788
796
789 def get_absolute_url_import(self):
797 def get_absolute_url_import(self):
790 return reverse('url_import_dev_conf', args=[str(self.id)])
798 return reverse('url_import_dev_conf', args=[str(self.id)])
791
799
792 def get_absolute_url_export(self):
800 def get_absolute_url_export(self):
793 return reverse('url_export_dev_conf', args=[str(self.id)])
801 return reverse('url_export_dev_conf', args=[str(self.id)])
794
802
795 def get_absolute_url_write(self):
803 def get_absolute_url_write(self):
796 return reverse('url_write_dev_conf', args=[str(self.id)])
804 return reverse('url_write_dev_conf', args=[str(self.id)])
797
805
798 def get_absolute_url_read(self):
806 def get_absolute_url_read(self):
799 return reverse('url_read_dev_conf', args=[str(self.id)])
807 return reverse('url_read_dev_conf', args=[str(self.id)])
800
808
801 def get_absolute_url_start(self):
809 def get_absolute_url_start(self):
802 return reverse('url_start_dev_conf', args=[str(self.id)])
810 return reverse('url_start_dev_conf', args=[str(self.id)])
803
811
804 def get_absolute_url_stop(self):
812 def get_absolute_url_stop(self):
805 return reverse('url_stop_dev_conf', args=[str(self.id)])
813 return reverse('url_stop_dev_conf', args=[str(self.id)])
806
814
807 def get_absolute_url_status(self):
815 def get_absolute_url_status(self):
808 return reverse('url_status_dev_conf', args=[str(self.id)])
816 return reverse('url_status_dev_conf', args=[str(self.id)])
@@ -1,322 +1,320
1
1
2 import ast
2 import ast
3 import json
3 import json
4 from itertools import chain
4 from itertools import chain
5
5
6 from django import forms
6 from django import forms
7 from django.utils.safestring import mark_safe
7 from django.utils.safestring import mark_safe
8 from django.utils.encoding import force_text
8 from django.utils.encoding import force_text
9 from django.utils.html import conditional_escape
9 from django.utils.html import conditional_escape
10
10
11 try:
11 try:
12 basestring # attempt to evaluate basestring
12 basestring # attempt to evaluate basestring
13 def isstr(s):
13 def isstr(s):
14 return isinstance(s, basestring)
14 return isinstance(s, basestring)
15 except NameError:
15 except NameError:
16 def isstr(s):
16 def isstr(s):
17 return isinstance(s, str)
17 return isinstance(s, str)
18
18
19 class KmUnitWidget(forms.widgets.TextInput):
19 class KmUnitWidget(forms.widgets.TextInput):
20
20
21 def render(self, name, value, attrs=None,renderer=None):
21 def render(self, name, value, attrs=None,renderer=None):
22 label = name
22 label = name
23 if isinstance(value, (int, float)):
23 if isinstance(value, (int, float)):
24 unit = int(value*attrs['km2unit'])
24 unit = int(value*attrs['km2unit'])
25 elif isstr(value):
25 elif isstr(value):
26 units = []
26 units = []
27 values = [s for s in value.split(',') if s]
27 values = [s for s in value.split(',') if s]
28 for val in values:
28 for val in values:
29 units.append('{0:.0f}'.format(float(val)*attrs['km2unit']))
29 units.append('{0:.0f}'.format(float(val)*attrs['km2unit']))
30
30
31 unit = ','.join(units)
31 unit = ','.join(units)
32
32
33 disabled = 'disabled' if attrs.get('disabled', False) else ''
33 disabled = 'disabled' if attrs.get('disabled', False) else ''
34 name = attrs.get('name', label)
34 name = attrs.get('name', label)
35 if attrs['id'] in ('id_delays',):
35 if attrs['id'] in ('id_delays',):
36 input_type = 'text'
36 input_type = 'text'
37 else:
37 else:
38 input_type = 'number'
38 input_type = 'number'
39
39
40 if 'line' in attrs:
40 if 'line' in attrs:
41 label += '_{0}_{1}'.format(attrs['line'].pk, name.split('|')[0])
41 label += '_{0}_{1}'.format(attrs['line'].pk, name.split('|')[0])
42
42
43 html = '''<div class="col-md-12 col-no-padding">
43 html = '''<div class="col-md-12 col-no-padding">
44 <div class="col-md-5 col-no-padding"><input type="{0}" step="any" {1} class="form-control" id="id_{2}" name="{3}" value="{4}"></div>
44 <div class="col-md-5 col-no-padding"><input type="{0}" step="any" {1} class="form-control" id="id_{2}" name="{3}" value="{4}"></div>
45 <div class="col-md-1 col-no-padding">Km</div>
45 <div class="col-md-1 col-no-padding">Km</div>
46 <div class="col-md-5 col-no-padding"><input type="{0}" step="any" {1} class="form-control" id="id_{2}_unit" value="{5}"></div>
46 <div class="col-md-5 col-no-padding"><input type="{0}" step="any" {1} class="form-control" id="id_{2}_unit" value="{5}"></div>
47 <div class="col-md-1 col-no-padding">Units</div></div><br>'''.format(input_type, disabled, label, name, value, unit)
47 <div class="col-md-1 col-no-padding">Units</div></div><br>'''.format(input_type, disabled, label, name, value, unit)
48
48
49 script = '''<script type="text/javascript">
49 script = '''<script type="text/javascript">
50 $(document).ready(function () {{
50 $(document).ready(function () {{
51
51
52 km_fields.push("id_{label}");
52 km_fields.push("id_{label}");
53 unit_fields.push("id_{label}_unit");
53 unit_fields.push("id_{label}_unit");
54
54
55 $("#id_{label}").change(function() {{
55 $("#id_{label}").change(function() {{
56 $("#id_{label}_unit").val(str2unit($(this).val()));
56 $("#id_{label}_unit").val(str2unit($(this).val()));
57 $("#id_{label}").val(str2km($("#id_{label}_unit").val()));
57 $("#id_{label}").val(str2km($("#id_{label}_unit").val()));
58 updateWindows("#id_{label}");
58 updateWindows("#id_{label}");
59 }});
59 }});
60 $("#id_{label}_unit").change(function() {{
60 $("#id_{label}_unit").change(function() {{
61 $(this).val(str2int($(this).val()));
61 $(this).val(str2int($(this).val()));
62 $("#id_{label}").val(str2km($(this).val()));
62 $("#id_{label}").val(str2km($(this).val()));
63 updateWindows("#id_{label}");
63 updateWindows("#id_{label}");
64 }});
64 }});
65 }});
65 }});
66 </script>'''.format(label=label)
66 </script>'''.format(label=label)
67
67
68 if disabled:
68 if disabled:
69 return mark_safe(html)
69 return mark_safe(html)
70 else:
70 else:
71 return mark_safe(html+script)
71 return mark_safe(html+script)
72
72
73
73
74 class UnitKmWidget(forms.widgets.TextInput):
74 class UnitKmWidget(forms.widgets.TextInput):
75
75
76 def render(self, name, value, attrs=None,renderer=None):
76 def render(self, name, value, attrs=None,renderer=None):
77 label = name
77 label = name
78 if isinstance(value, (int, float)):
78 if isinstance(value, (int, float)):
79 km = value/attrs['km2unit']
79 km = value/attrs['km2unit']
80 elif isinstance(value, basestring):
80 elif isinstance(value, basestring):
81 kms = []
81 kms = []
82 values = [s for s in value.split(',') if s]
82 values = [s for s in value.split(',') if s]
83 for val in values:
83 for val in values:
84 kms.append('{0:.0f}'.format(float(val)/attrs['km2unit']))
84 kms.append('{0:.0f}'.format(float(val)/attrs['km2unit']))
85
85
86 km = ','.join(kms)
86 km = ','.join(kms)
87
87
88 disabled = 'disabled' if attrs.get('disabled', False) else ''
88 disabled = 'disabled' if attrs.get('disabled', False) else ''
89 name = attrs.get('name', label)
89 name = attrs.get('name', label)
90
90
91 if 'line' in attrs:
91 if 'line' in attrs:
92 label += '_{0}_{1}'.format(attrs['line'].pk, name.split('|')[0])
92 label += '_{0}_{1}'.format(attrs['line'].pk, name.split('|')[0])
93
93
94 html = '''<div class="col-md-12 col-no-padding">
94 html = '''<div class="col-md-12 col-no-padding">
95 <div class="col-md-5 col-no-padding"><input type="number" step="any" {0} class="form-control" id="id_{1}_unit" name="{2}" value="{3}"></div>
95 <div class="col-md-5 col-no-padding"><input type="number" step="any" {0} class="form-control" id="id_{1}_unit" name="{2}" value="{3}"></div>
96 <div class="col-md-1 col-no-padding">Units</div>
96 <div class="col-md-1 col-no-padding">Units</div>
97 <div class="col-md-5 col-no-padding"><input type="number" step="any" {4} class="form-control" id="id_{5}" value="{6}"></div>
97 <div class="col-md-5 col-no-padding"><input type="number" step="any" {4} class="form-control" id="id_{5}" value="{6}"></div>
98 <div class="col-md-1 col-no-padding">Km</div></div>'''.format(disabled, label, name, value, disabled, label, km)
98 <div class="col-md-1 col-no-padding">Km</div></div>'''.format(disabled, label, name, value, disabled, label, km)
99
99
100 script = '''<script type="text/javascript">
100 script = '''<script type="text/javascript">
101 $(document).ready(function () {{
101 $(document).ready(function () {{
102
102
103 km_fields.push("id_{label}");
103 km_fields.push("id_{label}");
104 unit_fields.push("id_{label}_unit");
104 unit_fields.push("id_{label}_unit");
105
105
106 $("#id_{label}").change(function() {{
106 $("#id_{label}").change(function() {{
107 $("#id_{label}_unit").val(str2unit($(this).val()));
107 $("#id_{label}_unit").val(str2unit($(this).val()));
108 }});
108 }});
109 $("#id_{label}_unit").change(function() {{
109 $("#id_{label}_unit").change(function() {{
110 $("#id_{label}").val(str2km($(this).val()));
110 $("#id_{label}").val(str2km($(this).val()));
111 }});
111 }});
112 }});
112 }});
113 </script>'''.format(label=label)
113 </script>'''.format(label=label)
114
114
115 if disabled:
115 if disabled:
116 return mark_safe(html)
116 return mark_safe(html)
117 else:
117 else:
118 return mark_safe(html+script)
118 return mark_safe(html+script)
119
119
120
120
121 class KmUnitHzWidget(forms.widgets.TextInput):
121 class KmUnitHzWidget(forms.widgets.TextInput):
122
122
123 def render(self, name, value, attrs=None,renderer=None):
123 def render(self, name, value, attrs=None,renderer=None):
124 label = name
124 label = name
125 unit = float(value)*attrs['km2unit']
125 unit = float(value)*attrs['km2unit']
126 if unit%10==0:
126 if unit%10==0:
127 unit = int(unit)
127 unit = int(unit)
128 hz = 150000*float(value)**-1
128 hz = 150000*float(value)**-1
129
129
130 disabled = 'disabled' if attrs.get('disabled', False) else ''
130 disabled = 'disabled' if attrs.get('disabled', False) else ''
131 name = attrs.get('name', label)
131 name = attrs.get('name', label)
132
132
133 if 'line' in attrs:
133 if 'line' in attrs:
134 label += '_{0}'.format(attrs['line'].pk)
134 label += '_{0}'.format(attrs['line'].pk)
135
135
136 html = '''<div class="col-md-12 col-no-padding">
136 html = '''<div class="col-md-12 col-no-padding">
137 <div class="col-md-3 col-no-padding"><input type="number" step="any" {0} class="form-control" id="id_{1}" name="{2}" value="{3}"></div>
137 <div class="col-md-3 col-no-padding"><input type="number" step="any" {0} class="form-control" id="id_{1}" name="{2}" value="{3}"></div>
138 <div class="col-md-1 col-no-padding">Km</div>
138 <div class="col-md-1 col-no-padding">Km</div>
139 <div class="col-md-3 col-no-padding"><input type="number" step="any" {4} class="form-control" id="id_{1}_unit" value="{5}"></div>
139 <div class="col-md-3 col-no-padding"><input type="number" step="any" {4} class="form-control" id="id_{1}_unit" value="{5}"></div>
140 <div class="col-md-1 col-no-padding">Units</div>
140 <div class="col-md-1 col-no-padding">Units</div>
141 <div class="col-md-3 col-no-padding"><input type="number" step="any" {4} class="form-control" id="id_{1}_hz" value="{6}"></div>
141 <div class="col-md-3 col-no-padding"><input type="number" step="any" {4} class="form-control" id="id_{1}_hz" value="{6}"></div>
142 <div class="col-md-1 col-no-padding">Hz</div>
142 <div class="col-md-1 col-no-padding">Hz</div>
143 </div>'''.format(disabled, label, name, value, disabled, unit, hz)
143 </div>'''.format(disabled, label, name, value, disabled, unit, hz)
144
144
145 script = '''<script type="text/javascript">
145 script = '''<script type="text/javascript">
146 $(document).ready(function () {{
146 $(document).ready(function () {{
147 km_fields.push("id_{label}");
147 km_fields.push("id_{label}");
148 unit_fields.push("id_{label}_unit");
148 unit_fields.push("id_{label}_unit");
149 $("#id_{label}").change(function() {{
149 $("#id_{label}").change(function() {{
150 $("#id_{label}_unit").val(str2unit($(this).val()));
150 $("#id_{label}_unit").val(str2unit($(this).val()));
151 $("#id_{label}").val(str2km($("#id_{label}_unit").val()));
151 $("#id_{label}").val(str2km($("#id_{label}_unit").val()));
152 $("#id_{label}_hz").val(str2hz($(this).val()));
152 $("#id_{label}_hz").val(str2hz($(this).val()));
153 updateDc();
153 updateDc();
154 }});
154 }});
155 $("#id_{label}_unit").change(function() {{
155 $("#id_{label}_unit").change(function() {{
156 $(this).val(Math.round(parseFloat($(this).val())/10)*10);
156 $(this).val(Math.round(parseFloat($(this).val())/10)*10);
157 $("#id_{label}").val(str2km($(this).val()));
157 $("#id_{label}").val(str2km($(this).val()));
158 $("#id_{label}_hz").val(str2hz($("#id_{label}").val()));
158 $("#id_{label}_hz").val(str2hz($("#id_{label}").val()));
159 updateDc();
159 updateDc();
160 }});
160 }});
161 $("#id_{label}_hz").change(function() {{
161 $("#id_{label}_hz").change(function() {{
162 $("#id_{label}").val(str2hz($(this).val()));
162 $("#id_{label}").val(str2hz($(this).val()));
163 $("#id_{label}_unit").val(str2unit($("#id_{label}").val()));
163 $("#id_{label}_unit").val(str2unit($("#id_{label}").val()));
164 updateDc();
164 updateDc();
165 }});
165 }});
166 }});
166 }});
167 </script>'''.format(label=label)
167 </script>'''.format(label=label)
168
168
169 if disabled:
169 if disabled:
170 return mark_safe(html)
170 return mark_safe(html)
171 else:
171 else:
172 return mark_safe(html+script)
172 return mark_safe(html+script)
173
173
174
174
175 class KmUnitDcWidget(forms.widgets.TextInput):
175 class KmUnitDcWidget(forms.widgets.TextInput):
176
176
177 def render(self, name, value, attrs=None,renderer=None):
177 def render(self, name, value, attrs=None,renderer=None):
178 label = name
178 label = name
179 unit = int(float(value)*attrs['km2unit'])
179 unit = int(float(value)*attrs['km2unit'])
180
180
181 disabled = 'disabled' if attrs.get('disabled', False) else ''
181 disabled = 'disabled' if attrs.get('disabled', False) else ''
182 name = attrs.get('name', label)
182 name = attrs.get('name', label)
183
183
184 label += '_{0}'.format(attrs['line'].pk)
184 label += '_{0}'.format(attrs['line'].pk)
185
185
186 dc = float(json.loads(attrs['line'].params)['pulse_width'])*100/attrs['line'].rc_configuration.ipp
186 dc = float(json.loads(attrs['line'].params)['pulse_width'])*100/attrs['line'].rc_configuration.ipp
187
187
188 html = '''<div class="col-md-12 col-no-padding">
188 html = '''<div class="col-md-12 col-no-padding">
189 <div class="col-md-3 col-no-padding"><input type="number" step="any" {0} class="form-control" id="id_{1}" name="{2}" value="{3}"></div>
189 <div class="col-md-3 col-no-padding"><input type="number" step="any" {0} class="form-control" id="id_{1}" name="{2}" value="{3}"></div>
190 <div class="col-md-1 col-no-padding">Km</div>
190 <div class="col-md-1 col-no-padding">Km</div>
191 <div class="col-md-3 col-no-padding"><input type="number" step="any" {4} class="form-control" id="id_{1}_unit" value="{5}"></div>
191 <div class="col-md-3 col-no-padding"><input type="number" step="any" {4} class="form-control" id="id_{1}_unit" value="{5}"></div>
192 <div class="col-md-1 col-no-padding">Units</div>
192 <div class="col-md-1 col-no-padding">Units</div>
193 <div class="col-md-3 col-no-padding"><input type="number" step="any" {4} class="form-control" id="id_{1}_dc" value="{6}"></div>
193 <div class="col-md-3 col-no-padding"><input type="number" step="any" {4} class="form-control" id="id_{1}_dc" value="{6}"></div>
194 <div class="col-md-1 col-no-padding">DC[%]</div>
194 <div class="col-md-1 col-no-padding">DC[%]</div>
195 </div>'''.format(disabled, label, name, value, disabled, unit, dc)
195 </div>'''.format(disabled, label, name, value, disabled, unit, dc)
196
196
197 script = '''<script type="text/javascript">
197 script = '''<script type="text/javascript">
198 $(document).ready(function () {{
198 $(document).ready(function () {{
199 km_fields.push("id_{label}");
199 km_fields.push("id_{label}");
200 unit_fields.push("id_{label}_unit");
200 unit_fields.push("id_{label}_unit");
201 dc_fields.push("id_{label}");
201 dc_fields.push("id_{label}");
202 $("#id_{label}").change(function() {{
202 $("#id_{label}").change(function() {{
203 $("#id_{label}_unit").val(str2unit($(this).val()));
203 $("#id_{label}_unit").val(str2unit($(this).val()));
204 $("#id_{label}").val(str2km($("#id_{label}_unit").val()));
204 $("#id_{label}").val(str2km($("#id_{label}_unit").val()));
205 $("#id_{label}_dc").val(str2dc($("#id_{label}").val()));
205 $("#id_{label}_dc").val(str2dc($("#id_{label}").val()));
206 }});
206 }});
207 $("#id_{label}_unit").change(function() {{
207 $("#id_{label}_unit").change(function() {{
208 $("#id_{label}").val(str2km($(this).val()));
208 $("#id_{label}").val(str2km($(this).val()));
209 $("#id_{label}_dc").val(str2dc($("#id_{label}").val()));
209 $("#id_{label}_dc").val(str2dc($("#id_{label}").val()));
210 }});
210 }});
211
211
212 $("#id_{label}_dc").change(function() {{
212 $("#id_{label}_dc").change(function() {{
213 $("#id_{label}").val(parseFloat($(this).val())*100/parseFloat($("#id_ipp").val()));
213 $("#id_{label}").val(parseFloat($(this).val())*100/parseFloat($("#id_ipp").val()));
214 $("#id_{label}_unit").val(str2unit($("#id_{label}").val()));
214 $("#id_{label}_unit").val(str2unit($("#id_{label}").val()));
215 }});
215 }});
216 }});
216 }});
217 </script>'''.format(label=label)
217 </script>'''.format(label=label)
218
218
219 if disabled:
219 if disabled:
220 return mark_safe(html)
220 return mark_safe(html)
221 else:
221 else:
222 return mark_safe(html+script)
222 return mark_safe(html+script)
223
223
224
224
225 class DefaultWidget(forms.widgets.TextInput):
225 class DefaultWidget(forms.widgets.TextInput):
226
226
227 def render(self, name, value, attrs=None,renderer=None):
227 def render(self, name, value, attrs=None,renderer=None):
228 print("Default widget")
228 print("Default widget")
229 label = name
229 label = name
230 disabled = 'disabled' if attrs.get('disabled', False) else ''
230 disabled = 'disabled' if attrs.get('disabled', False) else ''
231 itype = 'number' if label in ('number_of_samples', 'last_height') else 'text'
231 itype = 'number' if label in ('number_of_samples', 'last_height') else 'text'
232 print(label)
232 print(label)
233 name = attrs.get('name', label)
233 name = attrs.get('name', label)
234 print(name)
234 print(name)
235 if 'line' in attrs:
235 if 'line' in attrs:
236 label += '_{0}_{1}'.format(attrs['line'].pk, name.split('|')[0])
236 label += '_{0}_{1}'.format(attrs['line'].pk, name.split('|')[0])
237 print(label)
237 print(label)
238 if itype=='number':
238 if itype=='number':
239 html = '<div class="col-md-12 col-no-padding"><div class="col-md-5 col-no-padding"><input {0} type="{1}" step="any" class="form-control" id="id_{2}" name="{3}" value="{4}"></div></div>'.format(disabled, itype, label, name, value)
239 html = '<div class="col-md-12 col-no-padding"><div class="col-md-5 col-no-padding"><input {0} type="{1}" step="any" class="form-control" id="id_{2}" name="{3}" value="{4}"></div></div>'.format(disabled, itype, label, name, value)
240 else:
240 else:
241 html = '<div class="col-md-12 col-no-padding"><div class="col-md-5 col-no-padding"><input {0} type="{1}" step="any" class="form-control" id="id_{2}" name="{3}" value="{4}"></div></div>'.format(disabled, itype, label, name, value)
241 html = '<div class="col-md-12 col-no-padding"><div class="col-md-5 col-no-padding"><input {0} type="{1}" step="any" class="form-control" id="id_{2}" name="{3}" value="{4}"></div></div>'.format(disabled, itype, label, name, value)
242
242
243 if 'last_height' in label or 'number_of_samples' in label:
243 if 'last_height' in label or 'number_of_samples' in label:
244 script = '''<script type="text/javascript">
244 script = '''<script type="text/javascript">
245 $(document).ready(function () {{
245 $(document).ready(function () {{
246
246
247 $("#id_{label}").change(function() {{
247 $("#id_{label}").change(function() {{
248 updateWindows("#id_{label}");
248 updateWindows("#id_{label}");
249 }});
249 }});
250
250
251 }});
251 }});
252 </script>'''.format(label=label)
252 </script>'''.format(label=label)
253 else:
253 else:
254 script = ''
254 script = ''
255
255
256 if disabled:
256 if disabled:
257 return mark_safe(html)
257 return mark_safe(html)
258 else:
258 else:
259 return mark_safe(html+script)
259 return mark_safe(html+script)
260
260
261
262
263 return mark_safe(html)
261 return mark_safe(html)
264
262
265
263
266 class HiddenWidget(forms.widgets.HiddenInput):
264 class HiddenWidget(forms.widgets.HiddenInput):
267
265
268 def render(self, name, value, attrs=None,renderer=None):
266 def render(self, name, value, attrs=None,renderer=None):
269 label = name
267 label = name
270 disabled = 'disabled' if attrs.get('disabled', False) else ''
268 disabled = 'disabled' if attrs.get('disabled', False) else ''
271 name = self.attrs.get('name', label)
269 name = self.attrs.get('name', label)
272
270
273 html = '<input {0} type="hidden" class="form-control" id="id_{1}" name="{2}" value="{3}">'.format(disabled, label, name, value)
271 html = '<input {0} type="hidden" class="form-control" id="id_{1}" name="{2}" value="{3}">'.format(disabled, label, name, value)
274
272
275 return mark_safe(html)
273 return mark_safe(html)
276
274
277
275
278 class CodesWidget(forms.widgets.Textarea):
276 class CodesWidget(forms.widgets.Textarea):
279
277
280 def render(self, name, value, attrs=None,renderer=None):
278 def render(self, name, value, attrs=None,renderer=None):
281 label = name
279 label = name
282 disabled = 'disabled' if attrs.get('disabled', False) else ''
280 disabled = 'disabled' if attrs.get('disabled', False) else ''
283 name = attrs.get('name', label)
281 name = attrs.get('name', label)
284
282
285 if '[' in value:
283 if '[' in value:
286 value = ast.literal_eval(value)
284 value = ast.literal_eval(value)
287
285
288 if isinstance(value, list):
286 if isinstance(value, list):
289 codes = '\r\n'.join(value)
287 codes = '\r\n'.join(value)
290 else:
288 else:
291 codes = value
289 codes = value
292
290
293 html = '<textarea rows="5" {0} class="form-control" id="id_{1}" name="{2}" style="white-space:nowrap; overflow:scroll;">{3}</textarea>'.format(disabled, label, name, codes)
291 html = '<textarea rows="5" {0} class="form-control" id="id_{1}" name="{2}" style="white-space:nowrap; overflow:scroll;">{3}</textarea>'.format(disabled, label, name, codes)
294
292
295 return mark_safe(html)
293 return mark_safe(html)
296
294
297 class HCheckboxSelectMultiple(forms.CheckboxSelectMultiple):
295 class HCheckboxSelectMultiple(forms.CheckboxSelectMultiple):
298
296
299 def render(self, name, value, attrs=None, choices=(),renderer=None):
297 def render(self, name, value, attrs=None, choices=(),renderer=None):
300
298
301 if value is None: value = []
299 if value is None: value = []
302 has_id = attrs and 'id' in attrs
300 has_id = attrs and 'id' in attrs
303 final_attrs = self.build_attrs(attrs, {'name': name})
301 final_attrs = self.build_attrs(attrs, {'name': name})
304 output = [u'<br><ul>']
302 output = [u'<br><ul>']
305 # Normalize to strings
303 # Normalize to strings
306 str_values = set([force_text(v) for v in value])
304 str_values = set([force_text(v) for v in value])
307 for i, (option_value, option_label) in enumerate(chain(self.choices, choices)):
305 for i, (option_value, option_label) in enumerate(chain(self.choices, choices)):
308 # If an ID attribute was given, add a numeric index as a suffix,
306 # If an ID attribute was given, add a numeric index as a suffix,
309 # so that the checkboxes don't all have the same ID attribute.
307 # so that the checkboxes don't all have the same ID attribute.
310 if has_id:
308 if has_id:
311 final_attrs = dict(final_attrs, id='%s_%s' % (attrs['id'], i))
309 final_attrs = dict(final_attrs, id='%s_%s' % (attrs['id'], i))
312 label_for = u' for="%s"' % final_attrs['id']
310 label_for = u' for="%s"' % final_attrs['id']
313 else:
311 else:
314 label_for = ''
312 label_for = ''
315
313
316 cb = forms.CheckboxInput(final_attrs, check_test=lambda value: value in str_values)
314 cb = forms.CheckboxInput(final_attrs, check_test=lambda value: value in str_values)
317 option_value = force_text(option_value)
315 option_value = force_text(option_value)
318 rendered_cb = cb.render(name, option_value)
316 rendered_cb = cb.render(name, option_value)
319 option_label = conditional_escape(force_text(option_label))
317 option_label = conditional_escape(force_text(option_label))
320 output.append(u'<span><label%s>%s %s</label></span>' % (label_for, rendered_cb, option_label))
318 output.append(u'<span><label%s>%s %s</label></span>' % (label_for, rendered_cb, option_label))
321 output.append(u'</div><br>')
319 output.append(u'</div><br>')
322 return mark_safe(u'\n'.join(output))
320 return mark_safe(u'\n'.join(output))
@@ -1,142 +1,142
1 """
1 """
2 Django settings for radarsys project.
2 Django settings for radarsys project.
3
3
4 Generated by 'django-admin startproject' using Django 1.8.6.
4 Generated by 'django-admin startproject' using Django 1.8.6.
5
5
6 For more information on this file, see
6 For more information on this file, see
7 https://docs.djangoproject.com/en/1.8/topics/settings/
7 https://docs.djangoproject.com/en/1.8/topics/settings/
8
8
9 For the full list of settings and their values, see
9 For the full list of settings and their values, see
10 https://docs.djangoproject.com/en/1.8/ref/settings/
10 https://docs.djangoproject.com/en/1.8/ref/settings/
11 """
11 """
12
12
13 # Build paths inside the project like this: os.path.join(BASE_DIR, ...)
13 # Build paths inside the project like this: os.path.join(BASE_DIR, ...)
14 import os
14 import os
15
15
16 BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
16 BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
17
17
18 # Quick-start development settings - unsuitable for production
18 # Quick-start development settings - unsuitable for production
19 # See https://docs.djangoproject.com/en/1.8/howto/deployment/checklist/
19 # See https://docs.djangoproject.com/en/1.8/howto/deployment/checklist/
20
20
21 # SECURITY WARNING: keep the secret key used in production secret!
21 # SECURITY WARNING: keep the secret key used in production secret!
22 SECRET_KEY = 'xshb$k5fc-+j16)cvyffj&9u__0q3$l!hieh#+tbzqg)*f^km0'
22 SECRET_KEY = 'xshb$k5fc-+j16)cvyffj&9u__0q3$l!hieh#+tbzqg)*f^km0'
23
23
24 # SECURITY WARNING: don't run with debug turned on in production!
24 # SECURITY WARNING: don't run with debug turned on in production!
25 DEBUG = True
25 DEBUG = True
26
26
27 ALLOWED_HOSTS = ['*']
27 ALLOWED_HOSTS = ['*']
28
28
29 # Application definition
29 # Application definition
30
30
31 INSTALLED_APPS = [
31 INSTALLED_APPS = [
32 'django.contrib.admin',
32 'django.contrib.admin',
33 'django.contrib.auth',
33 'django.contrib.auth',
34 'django.contrib.contenttypes',
34 'django.contrib.contenttypes',
35 'django.contrib.sessions',
35 'django.contrib.sessions',
36 'django.contrib.messages',
36 'django.contrib.messages',
37 'django.contrib.staticfiles',
37 'django.contrib.staticfiles',
38 'bootstrap4',
38 'bootstrap4',
39 'polymorphic',
39 'polymorphic',
40 'apps.accounts',
40 'apps.accounts',
41 'apps.main',
41 'apps.main',
42 'apps.misc',
42 'apps.misc',
43 'apps.rc',
43 'apps.rc',
44 'apps.dds',
44 'apps.dds',
45 'apps.jars',
45 'apps.jars',
46 'apps.usrp',
46 'apps.usrp',
47 'apps.abs',
47 'apps.abs',
48 'apps.cgs',
48 'apps.cgs',
49 'apps.dds_rest',
49 'apps.dds_rest',
50 ]
50 ]
51
51
52 MIDDLEWARE = [
52 MIDDLEWARE = [
53 'django.middleware.security.SecurityMiddleware',
53 'django.middleware.security.SecurityMiddleware',
54 'django.contrib.sessions.middleware.SessionMiddleware',
54 'django.contrib.sessions.middleware.SessionMiddleware',
55 'django.middleware.common.CommonMiddleware',
55 'django.middleware.common.CommonMiddleware',
56 'django.middleware.csrf.CsrfViewMiddleware',
56 'django.middleware.csrf.CsrfViewMiddleware',
57 'django.contrib.auth.middleware.AuthenticationMiddleware',
57 'django.contrib.auth.middleware.AuthenticationMiddleware',
58 'django.contrib.messages.middleware.MessageMiddleware',
58 'django.contrib.messages.middleware.MessageMiddleware',
59 'django.middleware.clickjacking.XFrameOptionsMiddleware',
59 'django.middleware.clickjacking.XFrameOptionsMiddleware',
60
60
61 ]
61 ]
62
62
63 ROOT_URLCONF = 'radarsys.urls'
63 ROOT_URLCONF = 'radarsys.urls'
64
64
65 TEMPLATES = [
65 TEMPLATES = [
66 {
66 {
67 'BACKEND': 'django.template.backends.django.DjangoTemplates',
67 'BACKEND': 'django.template.backends.django.DjangoTemplates',
68 'DIRS': [os.path.join(BASE_DIR, "templates")],
68 'DIRS': [os.path.join(BASE_DIR, "templates")],
69 'APP_DIRS': True,
69 'APP_DIRS': True,
70 'OPTIONS': {
70 'OPTIONS': {
71 'context_processors': [
71 'context_processors': [
72 'django.template.context_processors.debug',
72 'django.template.context_processors.debug',
73 'django.template.context_processors.request',
73 'django.template.context_processors.request',
74 'django.contrib.auth.context_processors.auth',
74 'django.contrib.auth.context_processors.auth',
75 'django.contrib.messages.context_processors.messages',
75 'django.contrib.messages.context_processors.messages',
76 'apps.main.processors.radarsys_globals',
76 'apps.main.processors.radarsys_globals',
77 ],
77 ],
78 },
78 },
79 },
79 },
80 ]
80 ]
81
81
82 WSGI_APPLICATION = 'radarsys.wsgi.application'
82 WSGI_APPLICATION = 'radarsys.wsgi.application'
83
83
84
84
85 # Database
85 # Database
86 # https://docs.djangoproject.com/en/1.8/ref/settings/#databases
86 # https://docs.djangoproject.com/en/1.8/ref/settings/#databases
87
87
88 DATABASES = {
88 DATABASES = {
89 'default': {
89 'default': {
90 'ENGINE': 'django.db.backends.sqlite3',
90 'ENGINE': 'django.db.backends.sqlite3',
91 'NAME': 'radarsys.sqlite',
91 'NAME': 'radarsys.sqlite',
92 }
92 }
93 # 'default': {
93 # 'default': {
94 # 'ENGINE': 'django.db.backends.postgresql_psycopg2',
94 # 'ENGINE': 'django.db.backends.postgresql_psycopg2',
95 # 'NAME': os.environ.get('DB_NAME', 'radarsys'),
95 # 'NAME': os.environ.get('DB_NAME', 'radarsys'),
96 # 'USER': os.environ.get('DB_USER', 'docker'),
96 # 'USER': os.environ.get('DB_USER', 'docker'),
97 # 'PASSWORD': os.environ.get('DB_PASSWORD', 'docker'),
97 # 'PASSWORD': os.environ.get('DB_PASSWORD', 'docker'),
98 # 'HOST': os.environ.get('POSTGRES_PORT_5432_TCP_ADDR', 'localhost'),
98 # 'HOST': os.environ.get('POSTGRES_PORT_5432_TCP_ADDR', 'localhost'),
99 # 'PORT': os.environ.get('POSTGRES_PORT_5432_TCP_PORT', '5400'),
99 # 'PORT': os.environ.get('POSTGRES_PORT_5432_TCP_PORT', '5400'),
100 #}
100 #}
101 }
101 }
102
102
103 # Internationalization
103 # Internationalization
104 # https://docs.djangoproject.com/en/1.8/topics/i18n/
104 # https://docs.djangoproject.com/en/1.8/topics/i18n/
105
105
106 LANGUAGE_CODE = 'en-us'
106 LANGUAGE_CODE = 'en-us'
107
107
108 TIME_ZONE = os.environ.get('TZ', 'America/Lima')
108 TIME_ZONE = os.environ.get('TZ', 'America/Lima')
109
109
110 USE_I18N = True
110 USE_I18N = True
111
111
112 USE_L10N = True
112 USE_L10N = True
113
113
114 USE_TZ = False
114 USE_TZ = False
115
115
116 # Static files (CSS, JavaScript, Images)
116 # Static files (CSS, JavaScript, Images)
117 # https://docs.djangoproject.com/en/1.8/howto/static-files/
117 # https://docs.djangoproject.com/en/1.8/howto/static-files/
118
118
119 MEDIA_URL = '/media/'
119 MEDIA_URL = '/media/'
120 MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
120 MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
121
121
122 STATIC_URL = '/static/'
122 STATIC_URL = '/static/'
123 STATIC_ROOT = os.path.join(BASE_DIR, 'static')
123 STATIC_ROOT = os.path.join(BASE_DIR, 'static')
124
124
125 STATICFILES_FINDERS = (
125 STATICFILES_FINDERS = (
126 'django.contrib.staticfiles.finders.FileSystemFinder',
126 'django.contrib.staticfiles.finders.FileSystemFinder',
127 'django.contrib.staticfiles.finders.AppDirectoriesFinder',
127 'django.contrib.staticfiles.finders.AppDirectoriesFinder',
128 )
128 )
129
129
130 # Celery stuff
130 # Celery stuff
131 REDIS_HOST = os.environ.get('REDIS_HOST', '127.0.0.1')
131 REDIS_HOST = os.environ.get('REDIS_HOST', '127.0.0.1')
132 REDIS_PORT = os.environ.get('REDIS_PORT', 6300)
132 REDIS_PORT = os.environ.get('REDIS_PORT', 6300)
133
133
134 BROKER_TRANSPORT = 'redis'
134 BROKER_TRANSPORT = 'redis'
135 BROKER_URL = 'redis://{}:{}/0'.format(REDIS_HOST, REDIS_PORT)
135 BROKER_URL = 'redis://{}:{}/0'.format(REDIS_HOST, REDIS_PORT)
136
136
137 CELERY_RESULT_BACKEND = 'redis://{}:{}/0'.format(REDIS_HOST, REDIS_PORT)
137 CELERY_RESULT_BACKEND = 'redis://{}:{}/0'.format(REDIS_HOST, REDIS_PORT)
138 CELERY_BROKER_TRANSPORT = BROKER_URL
138 CELERY_BROKER_TRANSPORT = BROKER_URL
139 CELERY_ACCEPT_CONTENT = ['application/json']
139 CELERY_ACCEPT_CONTENT = ['application/json']
140 CELERY_TASK_SERIALIZER = 'json'
140 CELERY_TASK_SERIALIZER = 'json'
141 CELERY_RESULT_SERIALIZER = 'json'
141 CELERY_RESULT_SERIALIZER = 'json'
142 CELERY_ENABLE_UTC = False
142 CELERY_ENABLE_UTC = False
General Comments 0
You need to be logged in to leave comments. Login now