##// END OF EJS Templates
Add view confirmation for write/chng beam methods
Juan C. Espinoza -
r333:176c9ea0dbf6
parent child
Show More
@@ -1,433 +1,446
1 1 from django.shortcuts import render_to_response
2 2 from django.template import RequestContext
3 3 from django.shortcuts import redirect, render, get_object_or_404
4 4 from django.contrib import messages
5 5 from django.conf import settings
6 6 from django.http import HttpResponse
7 7 from django.core.urlresolvers import reverse
8 8 from django.views.decorators.csrf import csrf_exempt
9 9 from django.utils.safestring import mark_safe
10 10
11 11 from datetime import datetime
12 12 from time import sleep
13 13 import os
14 14 import io
15 15
16 16 from apps.main.models import Device, Configuration, Experiment
17 17 from apps.main.views import sidebar
18 18
19 19 from .models import ABSConfiguration, ABSBeam
20 20 from .forms import ABSConfigurationForm, ABSBeamEditForm, ABSBeamAddForm, ABSImportForm
21 21
22 22 from .utils.overJroShow import overJroShow
23 23 from .utils.OverJRO import OverJRO
24 24 # Create your views here.
25 25 import json, ast
26 26
27 27
28 28 def get_values_from_form(form_data):
29 29
30 30 sublistup = []
31 31 sublistdown = []
32 32 subtxlistup = []
33 33 subtxlistdown = []
34 34 subrxlistup = []
35 35 subrxlistdown = []
36 36
37 37 up_values_list = []
38 38 down_values_list = []
39 39 up_txvalues_list = []
40 40 down_txvalues_list = []
41 41 up_rxvalues_list = []
42 42 down_rxvalues_list = []
43 43
44 44 values_list = {}
45 45 cont = 1
46 46
47 47 for i in range(1,65):
48 48 x = float(form_data['abs_up'+str(i)])
49 49 y = float(form_data['abs_down'+str(i)])
50 50 sublistup.append(x)
51 51 sublistdown.append(y)
52 52
53 53 if str(i) in form_data.getlist('uptx_checks'):
54 54 subtxlistup.append(1)
55 55 else:
56 56 subtxlistup.append(0)
57 57 if str(i) in form_data.getlist('downtx_checks'):
58 58 subtxlistdown.append(1)
59 59 else:
60 60 subtxlistdown.append(0)
61 61
62 62 if str(i) in form_data.getlist('uprx_checks'):
63 63 subrxlistup.append(1)
64 64 else:
65 65 subrxlistup.append(0)
66 66 if str(i) in form_data.getlist('downrx_checks'):
67 67 subrxlistdown.append(1)
68 68 else:
69 69 subrxlistdown.append(0)
70 70
71 71 cont = cont+1
72 72
73 73 if cont == 9:
74 74 up_values_list.append(sublistup)
75 75 down_values_list.append(sublistdown)
76 76 sublistup = []
77 77 sublistdown = []
78 78
79 79 up_txvalues_list.append(subtxlistup)
80 80 down_txvalues_list.append(subtxlistdown)
81 81 subtxlistup = []
82 82 subtxlistdown = []
83 83 up_rxvalues_list.append(subrxlistup)
84 84 down_rxvalues_list.append(subrxlistdown)
85 85 subrxlistup = []
86 86 subrxlistdown = []
87 87 cont = 1
88 88
89 89
90 90 list_uesup = []
91 91 list_uesdown = []
92 92 for i in range(1,5):
93 93 if form_data['ues_up'+str(i)] == '':
94 94 list_uesup.append(0.0)
95 95 else:
96 96 list_uesup.append(float(form_data['ues_up'+str(i)]))
97 97
98 98 if form_data['ues_down'+str(i)] == '':
99 99 list_uesdown.append(0.0)
100 100 else:
101 101 list_uesdown.append(float(form_data['ues_down'+str(i)]))
102 102
103 103 onlyrx_list = form_data.getlist('onlyrx')
104 104 only_rx = {}
105 105 if '1' in onlyrx_list:
106 106 only_rx['up'] = True
107 107 else:
108 108 only_rx['up'] = False
109 109 if '2' in onlyrx_list:
110 110 only_rx['down'] = True
111 111 else:
112 112 only_rx['down'] = False
113 113
114 114 antenna = {'antenna_up': up_values_list, 'antenna_down': down_values_list}
115 115 tx = {'up': up_txvalues_list, 'down': down_txvalues_list}
116 116 rx = {'up': up_rxvalues_list, 'down': down_rxvalues_list}
117 117 ues = {'up': list_uesup, 'down': list_uesdown}
118 118 name = str(form_data['beam_name'])
119 119
120 120 beam_data = {'name': name, 'antenna': antenna, 'tx': tx, 'rx': rx, 'ues': ues, 'only_rx': only_rx}
121 121
122 122 return beam_data
123 123
124 124
125 125 def abs_conf(request, id_conf):
126 126
127 127 conf = get_object_or_404(ABSConfiguration, pk=id_conf)
128 128 beams = ABSBeam.objects.filter(abs_conf=conf)
129 129 #------------Colors for Active Beam:-------------
130 130 all_status = {}
131 131 module_messages = json.loads(conf.module_messages)
132 132
133 133 color_status = {}
134 134 for i, status in enumerate(conf.module_status):
135 135 if status == '3': #Running background-color: #00cc00;
136 136 all_status['{}'.format(i+1)] = 2
137 137 color_status['{}'.format(i+1)] = 'class=text-success'#'bgcolor=#00cc00'
138 138 elif status == '2':
139 139 all_status['{}'.format(i+1)] = 1
140 140 color_status['{}'.format(i+1)] = 'class=text-info'
141 141 elif status == '1': #Connected background-color: #ee902c;
142 142 all_status['{}'.format(i+1)] = 1
143 143 color_status['{}'.format(i+1)] = 'class=text-warning'#'bgcolor=#ee902c'
144 144 else: #Disconnected background-color: #ff0000;
145 145 all_status['{}'.format(i+1)] = 0
146 146 color_status['{}'.format(i+1)] = 'class=text-danger'#'bgcolor=#FF0000'
147 147 #------------------------------------------------
148 148
149 149 kwargs = {}
150 150 kwargs['connected_modules'] = str(conf.connected_modules())+'/64'
151 151 kwargs['dev_conf'] = conf
152 152
153 153 if conf.operation_mode == 0:
154 154 kwargs['dev_conf_keys'] = ['label', 'operation_mode']
155 155 else:
156 156 kwargs['dev_conf_keys'] = ['label', 'operation_mode', 'operation_value']
157 157
158 158 kwargs['title'] = 'ABS Configuration'
159 159 kwargs['suptitle'] = 'Details'
160 160 kwargs['button'] = 'Edit Configuration'
161 161
162 162 if conf.active_beam != 0:
163 163 kwargs['active_beam'] = int(conf.active_beam)
164 164
165 165 kwargs['beams'] = beams
166 166 kwargs['modules_status'] = all_status
167 167 kwargs['color_status'] = color_status
168 168 kwargs['module_messages'] = module_messages
169 169 ###### SIDEBAR ######
170 170 kwargs.update(sidebar(conf=conf))
171 171
172 172 return render(request, 'abs_conf.html', kwargs)
173 173
174 174
175 175 def abs_conf_edit(request, id_conf):
176 176
177 177 conf = get_object_or_404(ABSConfiguration, pk=id_conf)
178 178
179 179 beams = ABSBeam.objects.filter(abs_conf=conf)
180 180
181 181 if request.method=='GET':
182 182 form = ABSConfigurationForm(instance=conf)
183 183
184 184 if request.method=='POST':
185 185 form = ABSConfigurationForm(request.POST, instance=conf)
186 186
187 187 if form.is_valid():
188 188 conf = form.save(commit=False)
189 189 conf.save()
190 190 return redirect('url_abs_conf', id_conf=conf.id)
191 191
192 192 ###### SIDEBAR ######
193 193 kwargs = {}
194 194
195 195 kwargs['dev_conf'] = conf
196 196 #kwargs['id_dev'] = conf.id
197 197 kwargs['id_conf'] = conf.id
198 198 kwargs['form'] = form
199 199 kwargs['abs_beams'] = beams
200 200 kwargs['title'] = 'Device Configuration'
201 201 kwargs['suptitle'] = 'Edit'
202 202 kwargs['button'] = 'Save'
203 203
204 204 kwargs['edit'] = True
205 205
206 206 return render(request, 'abs_conf_edit.html', kwargs)
207 207
208 208 @csrf_exempt
209 209 def abs_conf_alert(request):
210 210
211 211 if request.method == 'POST':
212 212 print request.POST
213 213 return HttpResponse(json.dumps({'result':1}), content_type='application/json')
214 214 else:
215 215 return redirect('index')
216 216
217 217
218 218 def import_file(request, id_conf):
219 219
220 220 conf = get_object_or_404(ABSConfiguration, pk=id_conf)
221 221 if request.method=='POST':
222 222 form = ABSImportForm(request.POST, request.FILES)
223 223 if form.is_valid():
224 224 try:
225 225 parms = conf.import_from_file(request.FILES['file_name'])
226 226
227 227 if parms:
228 228 conf.update_from_file(parms)
229 229 messages.success(request, 'Configuration "%s" loaded succesfully' % request.FILES['file_name'])
230 230 return redirect(conf.get_absolute_url_edit())
231 231
232 232 except Exception as e:
233 233 messages.error(request, 'Error parsing file: "%s" - %s' % (request.FILES['file_name'], e))
234 234
235 235 else:
236 236 messages.warning(request, 'Your current configuration will be replaced')
237 237 form = ABSImportForm()
238 238
239 239 kwargs = {}
240 240 kwargs['form'] = form
241 241 kwargs['title'] = 'ABS Configuration'
242 242 kwargs['suptitle'] = 'Import file'
243 243 kwargs['button'] = 'Upload'
244 244 kwargs['previous'] = conf.get_absolute_url()
245 245
246 246 return render(request, 'abs_import.html', kwargs)
247 247
248 248
249 249 def send_beam(request, id_conf, id_beam):
250 250
251 251 conf = get_object_or_404(ABSConfiguration, pk=id_conf)
252 252
253 253 abs = Configuration.objects.filter(pk=conf.device.conf_active).first()
254 254 if abs<>conf:
255 255 url = '#' if abs is None else abs.get_absolute_url()
256 256 label = 'None' if abs is None else abs.label
257 257 messages.warning(
258 258 request,
259 259 mark_safe('The current configuration has not been written in the modules, the active configuration is <a href="{}">{}</a>'.format(
260 260 url,
261 261 label
262 262 ))
263 263 )
264 264 return redirect(conf.get_absolute_url())
265 265
266 266 beam = get_object_or_404(ABSBeam, pk=id_beam)
267
268 if request.method == 'POST':
269
267 270 beams_list = ABSBeam.objects.filter(abs_conf=conf)
268 271 conf.active_beam = id_beam
269 272
270 273 i = 0
271 274 for b in beams_list:
272 275 if b.id == int(id_beam):
273 276 break
274 277 else:
275 278 i += 1
276 279 beam_pos = i + 1 #Estandarizar
277 280 print '%s Position: %s' % (beam.name, str(beam_pos))
278 281 conf.send_beam(beam_pos)
279 282
280 283 return redirect('url_abs_conf', conf.id)
281 284
285 kwargs = {
286 'title': 'ABS',
287 'suptitle': conf.label,
288 'message': 'Are you sure you want to change ABS Beam to: {}?'.format(beam.name),
289 'delete': False
290 }
291 kwargs['menu_configurations'] = 'active'
292
293 return render(request, 'confirm.html', kwargs)
294
282 295
283 296 def add_beam(request, id_conf):
284 297
285 298 conf = get_object_or_404(ABSConfiguration, pk=id_conf)
286 299 confs = Configuration.objects.all()
287 300
288 301 if request.method=='GET':
289 302 form = ABSBeamAddForm()
290 303
291 304 if request.method=='POST':
292 305 form = ABSBeamAddForm(request.POST)
293 306
294 307 beam_data = get_values_from_form(request.POST)
295 308
296 309 new_beam = ABSBeam(
297 310 name = beam_data['name'],
298 311 antenna = json.dumps(beam_data['antenna']),
299 312 abs_conf = conf,
300 313 tx = json.dumps(beam_data['tx']),
301 314 rx = json.dumps(beam_data['rx']),
302 315 ues = json.dumps(beam_data['ues']),
303 316 only_rx = json.dumps(beam_data['only_rx'])
304 317 )
305 318 new_beam.save()
306 319 messages.success(request, 'Beam: "%s" has been added.' % new_beam.name)
307 320
308 321 return redirect('url_edit_abs_conf', conf.id)
309 322
310 323 ###### SIDEBAR ######
311 324 kwargs = {}
312 325
313 326 #kwargs['dev_conf'] = conf.device
314 327 #kwargs['id_dev'] = conf.device
315 328 kwargs['id_conf'] = conf.id
316 329 kwargs['form'] = form
317 330 kwargs['title'] = 'ABS Beams'
318 331 kwargs['suptitle'] = 'Add Beam'
319 332 kwargs['button'] = 'Add'
320 333 kwargs['no_sidebar'] = True
321 334
322 335 #kwargs['previous'] = conf.get_absolute_url_edit()
323 336 kwargs['edit'] = True
324 337
325 338 return render(request, 'abs_add_beam.html', kwargs)
326 339
327 340
328 341 def edit_beam(request, id_conf, id_beam):
329 342
330 343 conf = get_object_or_404(ABSConfiguration, pk=id_conf)
331 344 beam = get_object_or_404(ABSBeam, pk=id_beam)
332 345
333 346 if request.method=='GET':
334 347 form = ABSBeamEditForm(initial={'beam': beam})
335 348
336 349 if request.method=='POST':
337 350 form = ABSBeamEditForm(request.POST)
338 351
339 352 beam_data = get_values_from_form(request.POST)
340 353
341 354 beam.dict_to_parms(beam_data)
342 355 beam.save()
343 356
344 357 messages.success(request, 'Beam: "%s" has been updated.' % beam.name)
345 358
346 359 return redirect('url_edit_abs_conf', conf.id)
347 360
348 361 ###### SIDEBAR ######
349 362 kwargs = {}
350 363
351 364 kwargs['id_conf'] = conf.id
352 365 kwargs['form'] = form
353 366 kwargs['title'] = 'ABS Beams'
354 367 kwargs['suptitle'] = 'Edit Beam'
355 368 kwargs['button'] = 'Save'
356 369 kwargs['no_sidebar'] = True
357 370
358 371 #kwargs['previous'] = conf.get_absolute_url_edit()
359 372 kwargs['edit'] = True
360 373
361 374 return render(request, 'abs_edit_beam.html', kwargs)
362 375
363 376
364 377
365 378 def remove_beam(request, id_conf, id_beam):
366 379
367 380 conf = get_object_or_404(ABSConfiguration, pk=id_conf)
368 381 beam = get_object_or_404(ABSBeam, pk=id_beam)
369 382
370 383 if request.method=='POST':
371 384 if beam:
372 385 try:
373 386 beam.delete()
374 387 messages.success(request, 'Beam: "%s" has been deleted.' % beam)
375 388 except:
376 389 messages.error(request, 'Unable to delete beam: "%s".' % beam)
377 390
378 391 return redirect('url_edit_abs_conf', conf.id)
379 392
380 393 ###### SIDEBAR ######
381 394 kwargs = {}
382 395
383 396 kwargs['object'] = beam
384 397 kwargs['delete'] = True
385 398 kwargs['title'] = 'Delete'
386 399 kwargs['suptitle'] = 'Beam'
387 400 kwargs['previous'] = conf.get_absolute_url_edit()
388 401 return render(request, 'confirm.html', kwargs)
389 402
390 403
391 404
392 405 def plot_patterns(request, id_conf, id_beam=None):
393 406
394 407 kwargs = {}
395 408 conf = get_object_or_404(ABSConfiguration, pk=id_conf)
396 409 beams = ABSBeam.objects.filter(abs_conf=conf)
397 410
398 411 if id_beam:
399 412 beam = get_object_or_404(ABSBeam, pk=id_beam)
400 413 kwargs['beam'] = beam
401 414
402 415 ###### SIDEBAR ######
403 416
404 417 kwargs['dev_conf'] = conf.device
405 418 kwargs['id_dev'] = conf.device
406 419 kwargs['id_conf'] = conf.id
407 420 kwargs['abs_beams'] = beams
408 421 kwargs['title'] = 'ABS Patterns'
409 422 kwargs['suptitle'] = conf.name
410 423 kwargs['no_sidebar'] = True
411 424
412 425 return render(request, 'abs_patterns.html', kwargs)
413 426
414 427
415 428 def plot_pattern(request, id_conf, id_beam, antenna):
416 429
417 430 if antenna=='down':
418 431 sleep(3)
419 432
420 433 conf = get_object_or_404(ABSConfiguration, pk=id_conf)
421 434 beam = get_object_or_404(ABSBeam, pk=id_beam)
422 435 just_rx = 1 if json.loads(beam.only_rx)[antenna] else 0
423 436 phases = json.loads(beam.antenna)['antenna_{}'.format(antenna)]
424 437 gain_tx = json.loads(beam.tx)[antenna]
425 438 gain_rx = json.loads(beam.rx)[antenna]
426 439 ues = json.loads(beam.ues)[antenna]
427 440 newOverJro = overJroShow(beam.name)
428 441 fig = newOverJro.plotPattern2(datetime.today(), phases, gain_tx, gain_rx, ues, just_rx)
429 442 buf = io.BytesIO()
430 443 fig.savefig(buf, format='png')
431 444 response = HttpResponse(buf.getvalue(), content_type='image/png')
432 445 return response
433 446
@@ -1,1915 +1,1926
1 1 import ast
2 2 import json
3 3 import hashlib
4 4 from datetime import datetime, timedelta
5 5
6 6 from django.shortcuts import render, redirect, get_object_or_404, HttpResponse
7 7 from django.utils.safestring import mark_safe
8 8 from django.http import HttpResponseRedirect
9 9 from django.core.urlresolvers import reverse
10 10 from django.db.models import Q
11 11 from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
12 12 from django.contrib import messages
13 13 from django.http.request import QueryDict
14 14 from django.contrib.auth.decorators import login_required, user_passes_test
15 15
16 16 try:
17 17 from urllib.parse import urlencode
18 18 except ImportError:
19 19 from urllib import urlencode
20 20
21 21 from .forms import CampaignForm, ExperimentForm, DeviceForm, ConfigurationForm, LocationForm, UploadFileForm, DownloadFileForm, OperationForm, NewForm
22 22 from .forms import OperationSearchForm, FilterForm, ChangeIpForm
23 23
24 24 from .tasks import task_start
25 25
26 26 from apps.rc.forms import RCConfigurationForm, RCLineCode, RCMixConfigurationForm
27 27 from apps.dds.forms import DDSConfigurationForm
28 28 from apps.jars.forms import JARSConfigurationForm
29 29 from apps.cgs.forms import CGSConfigurationForm
30 30 from apps.abs.forms import ABSConfigurationForm
31 31 from apps.usrp.forms import USRPConfigurationForm
32 32 from .utils import Params
33 33
34 34 from .models import Campaign, Experiment, Device, Configuration, Location, RunningExperiment, DEV_STATES
35 35 from apps.cgs.models import CGSConfiguration
36 36 from apps.jars.models import JARSConfiguration, EXPERIMENT_TYPE
37 37 from apps.usrp.models import USRPConfiguration
38 38 from apps.abs.models import ABSConfiguration
39 39 from apps.rc.models import RCConfiguration, RCLine, RCLineType, RCClock
40 40 from apps.dds.models import DDSConfiguration
41 41
42 42 from radarsys.celery import app
43 43
44 44
45 45 CONF_FORMS = {
46 46 'rc': RCConfigurationForm,
47 47 'dds': DDSConfigurationForm,
48 48 'jars': JARSConfigurationForm,
49 49 'cgs': CGSConfigurationForm,
50 50 'abs': ABSConfigurationForm,
51 51 'usrp': USRPConfigurationForm,
52 52 }
53 53
54 54 CONF_MODELS = {
55 55 'rc': RCConfiguration,
56 56 'dds': DDSConfiguration,
57 57 'jars': JARSConfiguration,
58 58 'cgs': CGSConfiguration,
59 59 'abs': ABSConfiguration,
60 60 'usrp': USRPConfiguration,
61 61 }
62 62
63 63 MIX_MODES = {
64 64 '0': 'P',
65 65 '1': 'S',
66 66 }
67 67
68 68 MIX_OPERATIONS = {
69 69 '0': 'OR',
70 70 '1': 'XOR',
71 71 '2': 'AND',
72 72 '3': 'NAND',
73 73 }
74 74
75 75
76 76 def is_developer(user):
77 77
78 78 groups = [str(g.name) for g in user.groups.all()]
79 79 return 'Developer' in groups or user.is_staff
80 80
81 81
82 82 def is_operator(user):
83 83
84 84 groups = [str(g.name) for g in user.groups.all()]
85 85 return 'Operator' in groups or user.is_staff
86 86
87 87
88 88 def has_been_modified(model):
89 89
90 90 prev_hash = model.hash
91 91 new_hash = hashlib.sha256(str(model.parms_to_dict)).hexdigest()
92 92 if prev_hash != new_hash:
93 93 model.hash = new_hash
94 94 model.save()
95 95 return True
96 96 return False
97 97
98 98
99 99 def index(request):
100 100 kwargs = {'no_sidebar': True}
101 101
102 102 return render(request, 'index.html', kwargs)
103 103
104 104
105 105 def locations(request):
106 106
107 107 page = request.GET.get('page')
108 108 order = ('name',)
109 109
110 110 kwargs = get_paginator(Location, page, order)
111 111
112 112 kwargs['keys'] = ['name', 'description']
113 113 kwargs['title'] = 'Radar System'
114 114 kwargs['suptitle'] = 'List'
115 115 kwargs['no_sidebar'] = True
116 116
117 117 return render(request, 'base_list.html', kwargs)
118 118
119 119
120 120 def location(request, id_loc):
121 121
122 122 location = get_object_or_404(Location, pk=id_loc)
123 123
124 124 kwargs = {}
125 125 kwargs['location'] = location
126 126 kwargs['location_keys'] = ['name', 'description']
127 127
128 128 kwargs['title'] = 'Location'
129 129 kwargs['suptitle'] = 'Details'
130 130
131 131 return render(request, 'location.html', kwargs)
132 132
133 133
134 134 @login_required
135 135 def location_new(request):
136 136
137 137 if request.method == 'GET':
138 138 form = LocationForm()
139 139
140 140 if request.method == 'POST':
141 141 form = LocationForm(request.POST)
142 142
143 143 if form.is_valid():
144 144 form.save()
145 145 return redirect('url_locations')
146 146
147 147 kwargs = {}
148 148 kwargs['form'] = form
149 149 kwargs['title'] = 'Radar System'
150 150 kwargs['suptitle'] = 'New'
151 151 kwargs['button'] = 'Create'
152 152
153 153 return render(request, 'base_edit.html', kwargs)
154 154
155 155
156 156 @login_required
157 157 def location_edit(request, id_loc):
158 158
159 159 location = get_object_or_404(Location, pk=id_loc)
160 160
161 161 if request.method == 'GET':
162 162 form = LocationForm(instance=location)
163 163
164 164 if request.method == 'POST':
165 165 form = LocationForm(request.POST, instance=location)
166 166
167 167 if form.is_valid():
168 168 form.save()
169 169 return redirect('url_locations')
170 170
171 171 kwargs = {}
172 172 kwargs['form'] = form
173 173 kwargs['title'] = 'Location'
174 174 kwargs['suptitle'] = 'Edit'
175 175 kwargs['button'] = 'Update'
176 176
177 177 return render(request, 'base_edit.html', kwargs)
178 178
179 179
180 180 @login_required
181 181 def location_delete(request, id_loc):
182 182
183 183 location = get_object_or_404(Location, pk=id_loc)
184 184
185 185 if request.method == 'POST':
186 186
187 187 if is_developer(request.user):
188 188 location.delete()
189 189 return redirect('url_locations')
190 190
191 191 messages.error(request, 'Not enough permission to delete this object')
192 192 return redirect(location.get_absolute_url())
193 193
194 194 kwargs = {
195 195 'title': 'Delete',
196 196 'suptitle': 'Location',
197 197 'object': location,
198 198 'delete': True
199 199 }
200 200
201 201 return render(request, 'confirm.html', kwargs)
202 202
203 203
204 204 def devices(request):
205 205
206 206 page = request.GET.get('page')
207 207 order = ('location', 'device_type')
208 208
209 209 filters = request.GET.copy()
210 210 kwargs = get_paginator(Device, page, order, filters)
211 211 form = FilterForm(initial=request.GET, extra_fields=['tags'])
212 212
213 213 kwargs['keys'] = ['device_type', 'location',
214 214 'ip_address', 'port_address', 'actions']
215 215 kwargs['title'] = 'Device'
216 216 kwargs['suptitle'] = 'List'
217 217 kwargs['no_sidebar'] = True
218 218 kwargs['form'] = form
219 219 kwargs['add_url'] = reverse('url_add_device')
220 220 filters.pop('page', None)
221 221 kwargs['q'] = urlencode(filters)
222 222 kwargs['menu_devices'] = 'active'
223 223 return render(request, 'base_list.html', kwargs)
224 224
225 225
226 226 def device(request, id_dev):
227 227
228 228 device = get_object_or_404(Device, pk=id_dev)
229 229
230 230 kwargs = {}
231 231 kwargs['device'] = device
232 232 kwargs['device_keys'] = ['device_type',
233 233 'ip_address', 'port_address', 'description']
234 234
235 235 kwargs['title'] = 'Device'
236 236 kwargs['suptitle'] = 'Details'
237 237 kwargs['menu_devices'] = 'active'
238 238
239 239 return render(request, 'device.html', kwargs)
240 240
241 241
242 242 @login_required
243 243 def device_new(request):
244 244
245 245 if request.method == 'GET':
246 246 form = DeviceForm()
247 247
248 248 if request.method == 'POST':
249 249 form = DeviceForm(request.POST)
250 250
251 251 if form.is_valid():
252 252 form.save()
253 253 return redirect('url_devices')
254 254
255 255 kwargs = {}
256 256 kwargs['form'] = form
257 257 kwargs['title'] = 'Device'
258 258 kwargs['suptitle'] = 'New'
259 259 kwargs['button'] = 'Create'
260 260 kwargs['menu_devices'] = 'active'
261 261
262 262 return render(request, 'base_edit.html', kwargs)
263 263
264 264
265 265 @login_required
266 266 def device_edit(request, id_dev):
267 267
268 268 device = get_object_or_404(Device, pk=id_dev)
269 269
270 270 if request.method == 'GET':
271 271 form = DeviceForm(instance=device)
272 272
273 273 if request.method == 'POST':
274 274 form = DeviceForm(request.POST, instance=device)
275 275
276 276 if form.is_valid():
277 277 form.save()
278 278 return redirect(device.get_absolute_url())
279 279
280 280 kwargs = {}
281 281 kwargs['form'] = form
282 282 kwargs['title'] = 'Device'
283 283 kwargs['suptitle'] = 'Edit'
284 284 kwargs['button'] = 'Update'
285 285 kwargs['menu_devices'] = 'active'
286 286
287 287 return render(request, 'base_edit.html', kwargs)
288 288
289 289
290 290 @login_required
291 291 def device_delete(request, id_dev):
292 292
293 293 device = get_object_or_404(Device, pk=id_dev)
294 294
295 295 if request.method == 'POST':
296 296
297 297 if is_developer(request.user):
298 298 device.delete()
299 299 return redirect('url_devices')
300 300
301 301 messages.error(request, 'Not enough permission to delete this object')
302 302 return redirect(device.get_absolute_url())
303 303
304 304 kwargs = {
305 305 'title': 'Delete',
306 306 'suptitle': 'Device',
307 307 'object': device,
308 308 'delete': True
309 309 }
310 310 kwargs['menu_devices'] = 'active'
311 311
312 312 return render(request, 'confirm.html', kwargs)
313 313
314 314
315 315 @login_required
316 316 def device_change_ip(request, id_dev):
317 317
318 318 device = get_object_or_404(Device, pk=id_dev)
319 319
320 320 if request.method == 'POST':
321 321
322 322 if is_developer(request.user):
323 323 device.change_ip(**request.POST.dict())
324 324 level, message = device.message.split('|')
325 325 messages.add_message(request, level, message)
326 326 else:
327 327 messages.error(
328 328 request, 'Not enough permission to delete this object')
329 329 return redirect(device.get_absolute_url())
330 330
331 331 kwargs = {
332 332 'title': 'Device',
333 333 'suptitle': 'Change IP',
334 334 'object': device,
335 335 'previous': device.get_absolute_url(),
336 336 'form': ChangeIpForm(initial={'ip_address': device.ip_address}),
337 337 'message': ' ',
338 338 }
339 339 kwargs['menu_devices'] = 'active'
340 340
341 341 return render(request, 'confirm.html', kwargs)
342 342
343 343
344 344 def campaigns(request):
345 345
346 346 page = request.GET.get('page')
347 347 order = ('-start_date',)
348 348 filters = request.GET.copy()
349 349
350 350 kwargs = get_paginator(Campaign, page, order, filters)
351 351
352 352 form = FilterForm(initial=request.GET, extra_fields=[
353 353 'range_date', 'tags', 'template'])
354 354 kwargs['keys'] = ['name', 'start_date', 'end_date', 'actions']
355 355 kwargs['title'] = 'Campaign'
356 356 kwargs['suptitle'] = 'List'
357 357 kwargs['no_sidebar'] = True
358 358 kwargs['form'] = form
359 359 kwargs['add_url'] = reverse('url_add_campaign')
360 360 filters.pop('page', None)
361 361 kwargs['q'] = urlencode(filters)
362 362 kwargs['menu_campaigns'] = 'active'
363 363
364 364 return render(request, 'base_list.html', kwargs)
365 365
366 366
367 367 def campaign(request, id_camp):
368 368
369 369 campaign = get_object_or_404(Campaign, pk=id_camp)
370 370 experiments = Experiment.objects.filter(campaign=campaign)
371 371
372 372 form = CampaignForm(instance=campaign)
373 373
374 374 kwargs = {}
375 375 kwargs['campaign'] = campaign
376 376 kwargs['campaign_keys'] = ['template', 'name',
377 377 'start_date', 'end_date', 'tags', 'description']
378 378
379 379 kwargs['experiments'] = experiments
380 380 kwargs['experiment_keys'] = [
381 381 'name', 'radar_system', 'start_time', 'end_time']
382 382
383 383 kwargs['title'] = 'Campaign'
384 384 kwargs['suptitle'] = 'Details'
385 385
386 386 kwargs['form'] = form
387 387 kwargs['button'] = 'Add Experiment'
388 388 kwargs['menu_campaigns'] = 'active'
389 389
390 390 return render(request, 'campaign.html', kwargs)
391 391
392 392
393 393 @login_required
394 394 def campaign_new(request):
395 395
396 396 kwargs = {}
397 397
398 398 if request.method == 'GET':
399 399
400 400 if 'template' in request.GET:
401 401 if request.GET['template'] == '0':
402 402 form = NewForm(initial={'create_from': 2},
403 403 template_choices=Campaign.objects.filter(template=True).values_list('id', 'name'))
404 404 else:
405 405 kwargs['button'] = 'Create'
406 406 kwargs['experiments'] = Configuration.objects.filter(
407 407 experiment=request.GET['template'])
408 408 kwargs['experiment_keys'] = ['name', 'start_time', 'end_time']
409 409 camp = Campaign.objects.get(pk=request.GET['template'])
410 410 form = CampaignForm(instance=camp,
411 411 initial={'name': '{}_{:%Y%m%d}'.format(camp.name, datetime.now()),
412 412 'template': False})
413 413 elif 'blank' in request.GET:
414 414 kwargs['button'] = 'Create'
415 415 form = CampaignForm()
416 416 else:
417 417 form = NewForm()
418 418
419 419 if request.method == 'POST':
420 420 kwargs['button'] = 'Create'
421 421 post = request.POST.copy()
422 422 experiments = []
423 423
424 424 for id_exp in post.getlist('experiments'):
425 425 exp = Experiment.objects.get(pk=id_exp)
426 426 new_exp = exp.clone(template=False)
427 427 experiments.append(new_exp)
428 428
429 429 post.setlist('experiments', [])
430 430
431 431 form = CampaignForm(post)
432 432
433 433 if form.is_valid():
434 434 campaign = form.save(commit=False)
435 435 campaign.author = request.user
436 436 for exp in experiments:
437 437 campaign.experiments.add(exp)
438 438 campaign.save()
439 439 return redirect('url_campaign', id_camp=campaign.id)
440 440
441 441 kwargs['form'] = form
442 442 kwargs['title'] = 'Campaign'
443 443 kwargs['suptitle'] = 'New'
444 444 kwargs['menu_campaigns'] = 'active'
445 445
446 446 return render(request, 'campaign_edit.html', kwargs)
447 447
448 448
449 449 @login_required
450 450 def campaign_edit(request, id_camp):
451 451
452 452 campaign = get_object_or_404(Campaign, pk=id_camp)
453 453
454 454 if request.method == 'GET':
455 455 form = CampaignForm(instance=campaign)
456 456
457 457 if request.method == 'POST':
458 458 exps = campaign.experiments.all().values_list('pk', flat=True)
459 459 post = request.POST.copy()
460 460 new_exps = post.getlist('experiments')
461 461 post.setlist('experiments', [])
462 462 form = CampaignForm(post, instance=campaign)
463 463
464 464 if form.is_valid():
465 465 camp = form.save()
466 466 for id_exp in new_exps:
467 467 if int(id_exp) in exps:
468 468 exps.pop(id_exp)
469 469 else:
470 470 exp = Experiment.objects.get(pk=id_exp)
471 471 if exp.template:
472 472 camp.experiments.add(exp.clone(template=False))
473 473 else:
474 474 camp.experiments.add(exp)
475 475
476 476 for id_exp in exps:
477 477 camp.experiments.remove(Experiment.objects.get(pk=id_exp))
478 478
479 479 return redirect('url_campaign', id_camp=id_camp)
480 480
481 481 kwargs = {}
482 482 kwargs['form'] = form
483 483 kwargs['title'] = 'Campaign'
484 484 kwargs['suptitle'] = 'Edit'
485 485 kwargs['button'] = 'Update'
486 486 kwargs['menu_campaigns'] = 'active'
487 487
488 488 return render(request, 'campaign_edit.html', kwargs)
489 489
490 490
491 491 @login_required
492 492 def campaign_delete(request, id_camp):
493 493
494 494 campaign = get_object_or_404(Campaign, pk=id_camp)
495 495
496 496 if request.method == 'POST':
497 497 if is_developer(request.user):
498 498
499 499 for exp in campaign.experiments.all():
500 500 for conf in Configuration.objects.filter(experiment=exp):
501 501 conf.delete()
502 502 exp.delete()
503 503 campaign.delete()
504 504
505 505 return redirect('url_campaigns')
506 506
507 507 messages.error(request, 'Not enough permission to delete this object')
508 508 return redirect(campaign.get_absolute_url())
509 509
510 510 kwargs = {
511 511 'title': 'Delete',
512 512 'suptitle': 'Campaign',
513 513 'object': campaign,
514 514 'delete': True
515 515 }
516 516 kwargs['menu_campaigns'] = 'active'
517 517
518 518 return render(request, 'confirm.html', kwargs)
519 519
520 520
521 521 @login_required
522 522 def campaign_export(request, id_camp):
523 523
524 524 campaign = get_object_or_404(Campaign, pk=id_camp)
525 525 content = campaign.parms_to_dict()
526 526 content_type = 'application/json'
527 527 filename = '%s_%s.json' % (campaign.name, campaign.id)
528 528
529 529 response = HttpResponse(content_type=content_type)
530 530 response['Content-Disposition'] = 'attachment; filename="%s"' % filename
531 531 response.write(json.dumps(content, indent=2))
532 532
533 533 return response
534 534
535 535
536 536 @login_required
537 537 def campaign_import(request, id_camp):
538 538
539 539 campaign = get_object_or_404(Campaign, pk=id_camp)
540 540
541 541 if request.method == 'GET':
542 542 file_form = UploadFileForm()
543 543
544 544 if request.method == 'POST':
545 545 file_form = UploadFileForm(request.POST, request.FILES)
546 546
547 547 if file_form.is_valid():
548 548 new_camp = campaign.dict_to_parms(
549 549 json.load(request.FILES['file']), CONF_MODELS)
550 550 messages.success(
551 551 request, "Parameters imported from: '%s'." % request.FILES['file'].name)
552 552 return redirect(new_camp.get_absolute_url_edit())
553 553
554 554 messages.error(request, "Could not import parameters from file")
555 555
556 556 kwargs = {}
557 557 kwargs['title'] = 'Campaign'
558 558 kwargs['form'] = file_form
559 559 kwargs['suptitle'] = 'Importing file'
560 560 kwargs['button'] = 'Import'
561 561 kwargs['menu_campaigns'] = 'active'
562 562
563 563 return render(request, 'campaign_import.html', kwargs)
564 564
565 565
566 566 def experiments(request):
567 567
568 568 page = request.GET.get('page')
569 569 order = ('location',)
570 570 filters = request.GET.copy()
571 571
572 572 if 'my experiments' in filters:
573 573 filters.pop('my experiments', None)
574 574 filters['mine'] = request.user.id
575 575
576 576 kwargs = get_paginator(Experiment, page, order, filters)
577 577
578 578 fields = ['tags', 'template']
579 579 if request.user.is_authenticated:
580 580 fields.append('my experiments')
581 581
582 582 form = FilterForm(initial=request.GET, extra_fields=fields)
583 583
584 584 kwargs['keys'] = ['name', 'radar_system',
585 585 'start_time', 'end_time', 'actions']
586 586 kwargs['title'] = 'Experiment'
587 587 kwargs['suptitle'] = 'List'
588 588 kwargs['no_sidebar'] = True
589 589 kwargs['form'] = form
590 590 kwargs['add_url'] = reverse('url_add_experiment')
591 591 filters = request.GET.copy()
592 592 filters.pop('page', None)
593 593 kwargs['q'] = urlencode(filters)
594 594 kwargs['menu_experiments'] = 'active'
595 595
596 596 return render(request, 'base_list.html', kwargs)
597 597
598 598
599 599 def experiment(request, id_exp):
600 600
601 601 experiment = get_object_or_404(Experiment, pk=id_exp)
602 602
603 603 configurations = Configuration.objects.filter(
604 604 experiment=experiment, type=0)
605 605
606 606 kwargs = {}
607 607
608 608 kwargs['experiment_keys'] = ['template', 'radar_system',
609 609 'name', 'freq', 'start_time', 'end_time']
610 610 kwargs['experiment'] = experiment
611 611 kwargs['configuration_keys'] = ['name', 'device__ip_address',
612 612 'device__port_address', 'device__status']
613 613 kwargs['configurations'] = configurations
614 614 kwargs['title'] = 'Experiment'
615 615 kwargs['suptitle'] = 'Details'
616 616 kwargs['button'] = 'Add Configuration'
617 617 kwargs['menu_experiments'] = 'active'
618 618
619 619 ###### SIDEBAR ######
620 620 kwargs.update(sidebar(experiment=experiment))
621 621
622 622 return render(request, 'experiment.html', kwargs)
623 623
624 624
625 625 @login_required
626 626 def experiment_new(request, id_camp=None):
627 627
628 628 if not is_developer(request.user):
629 629 messages.error(
630 630 request, 'Developer required, to create new Experiments')
631 631 return redirect('index')
632 632 kwargs = {}
633 633
634 634 if request.method == 'GET':
635 635 if 'template' in request.GET:
636 636 if request.GET['template'] == '0':
637 637 form = NewForm(initial={'create_from': 2},
638 638 template_choices=Experiment.objects.filter(template=True).values_list('id', 'name'))
639 639 else:
640 640 kwargs['button'] = 'Create'
641 641 kwargs['configurations'] = Configuration.objects.filter(
642 642 experiment=request.GET['template'])
643 643 kwargs['configuration_keys'] = ['name', 'device__name',
644 644 'device__ip_address', 'device__port_address']
645 645 exp = Experiment.objects.get(pk=request.GET['template'])
646 646 form = ExperimentForm(instance=exp,
647 647 initial={'name': '{}_{:%y%m%d}'.format(exp.name, datetime.now()),
648 648 'template': False})
649 649 elif 'blank' in request.GET:
650 650 kwargs['button'] = 'Create'
651 651 form = ExperimentForm()
652 652 else:
653 653 form = NewForm()
654 654
655 655 if request.method == 'POST':
656 656 form = ExperimentForm(request.POST)
657 657 if form.is_valid():
658 658 experiment = form.save(commit=False)
659 659 experiment.author = request.user
660 660 experiment.save()
661 661
662 662 if 'template' in request.GET:
663 663 configurations = Configuration.objects.filter(
664 664 experiment=request.GET['template'], type=0)
665 665 for conf in configurations:
666 666 conf.clone(experiment=experiment, template=False)
667 667
668 668 return redirect('url_experiment', id_exp=experiment.id)
669 669
670 670 kwargs['form'] = form
671 671 kwargs['title'] = 'Experiment'
672 672 kwargs['suptitle'] = 'New'
673 673 kwargs['menu_experiments'] = 'active'
674 674
675 675 return render(request, 'experiment_edit.html', kwargs)
676 676
677 677
678 678 @login_required
679 679 def experiment_edit(request, id_exp):
680 680
681 681 experiment = get_object_or_404(Experiment, pk=id_exp)
682 682
683 683 if request.method == 'GET':
684 684 form = ExperimentForm(instance=experiment)
685 685
686 686 if request.method == 'POST':
687 687 form = ExperimentForm(request.POST, instance=experiment)
688 688
689 689 if form.is_valid():
690 690 experiment = form.save()
691 691 return redirect('url_experiment', id_exp=experiment.id)
692 692
693 693 kwargs = {}
694 694 kwargs['form'] = form
695 695 kwargs['title'] = 'Experiment'
696 696 kwargs['suptitle'] = 'Edit'
697 697 kwargs['button'] = 'Update'
698 698 kwargs['menu_experiments'] = 'active'
699 699
700 700 return render(request, 'experiment_edit.html', kwargs)
701 701
702 702
703 703 @login_required
704 704 def experiment_delete(request, id_exp):
705 705
706 706 experiment = get_object_or_404(Experiment, pk=id_exp)
707 707
708 708 if request.method == 'POST':
709 709 if is_developer(request.user):
710 710 for conf in Configuration.objects.filter(experiment=experiment):
711 711 conf.delete()
712 712 experiment.delete()
713 713 return redirect('url_experiments')
714 714
715 715 messages.error(request, 'Not enough permission to delete this object')
716 716 return redirect(experiment.get_absolute_url())
717 717
718 718 kwargs = {
719 719 'title': 'Delete',
720 720 'suptitle': 'Experiment',
721 721 'object': experiment,
722 722 'delete': True
723 723 }
724 724
725 725 return render(request, 'confirm.html', kwargs)
726 726
727 727
728 728 @login_required
729 729 def experiment_export(request, id_exp):
730 730
731 731 experiment = get_object_or_404(Experiment, pk=id_exp)
732 732 content = experiment.parms_to_dict()
733 733 content_type = 'application/json'
734 734 filename = '%s_%s.json' % (experiment.name, experiment.id)
735 735
736 736 response = HttpResponse(content_type=content_type)
737 737 response['Content-Disposition'] = 'attachment; filename="%s"' % filename
738 738 response.write(json.dumps(content, indent=2))
739 739
740 740 return response
741 741
742 742
743 743 @login_required
744 744 def experiment_import(request, id_exp):
745 745
746 746 experiment = get_object_or_404(Experiment, pk=id_exp)
747 747 configurations = Configuration.objects.filter(experiment=experiment)
748 748
749 749 if request.method == 'GET':
750 750 file_form = UploadFileForm()
751 751
752 752 if request.method == 'POST':
753 753 file_form = UploadFileForm(request.POST, request.FILES)
754 754
755 755 if file_form.is_valid():
756 756 new_exp = experiment.dict_to_parms(
757 757 json.load(request.FILES['file']), CONF_MODELS)
758 758 messages.success(
759 759 request, "Parameters imported from: '%s'." % request.FILES['file'].name)
760 760 return redirect(new_exp.get_absolute_url_edit())
761 761
762 762 messages.error(request, "Could not import parameters from file")
763 763
764 764 kwargs = {}
765 765 kwargs['title'] = 'Experiment'
766 766 kwargs['form'] = file_form
767 767 kwargs['suptitle'] = 'Importing file'
768 768 kwargs['button'] = 'Import'
769 769 kwargs['menu_experiments'] = 'active'
770 770
771 771 kwargs.update(sidebar(experiment=experiment))
772 772
773 773 return render(request, 'experiment_import.html', kwargs)
774 774
775 775
776 776 @login_required
777 777 def experiment_start(request, id_exp):
778 778
779 779 exp = get_object_or_404(Experiment, pk=id_exp)
780 780
781 781 if exp.status == 2:
782 782 messages.warning(request, 'Experiment {} already runnnig'.format(exp))
783 783 else:
784 784 exp.status = exp.start()
785 785 if exp.status == 0:
786 786 messages.error(request, 'Experiment {} not start'.format(exp))
787 787 if exp.status == 2:
788 788 messages.success(request, 'Experiment {} started'.format(exp))
789 789
790 790 exp.save()
791 791
792 792 return redirect(exp.get_absolute_url())
793 793
794 794
795 795 @login_required
796 796 def experiment_stop(request, id_exp):
797 797
798 798 exp = get_object_or_404(Experiment, pk=id_exp)
799 799
800 800 if exp.status == 2:
801 801 exp.status = exp.stop()
802 802 exp.save()
803 803 messages.success(request, 'Experiment {} stopped'.format(exp))
804 804 else:
805 805 messages.error(request, 'Experiment {} not running'.format(exp))
806 806
807 807 return redirect(exp.get_absolute_url())
808 808
809 809
810 810 def experiment_status(request, id_exp):
811 811
812 812 exp = get_object_or_404(Experiment, pk=id_exp)
813 813
814 814 exp.get_status()
815 815
816 816 return redirect(exp.get_absolute_url())
817 817
818 818
819 819 @login_required
820 820 def experiment_mix(request, id_exp):
821 821
822 822 experiment = get_object_or_404(Experiment, pk=id_exp)
823 823 rc_confs = [conf for conf in RCConfiguration.objects.filter(
824 824 experiment=id_exp,
825 825 type=0,
826 826 mix=False)]
827 827
828 828 if len(rc_confs) < 2:
829 829 messages.warning(
830 830 request, 'You need at least two RC Configurations to make a mix')
831 831 return redirect(experiment.get_absolute_url())
832 832
833 833 mix_confs = RCConfiguration.objects.filter(experiment=id_exp, mix=True, type=0)
834 834
835 835 if mix_confs:
836 836 mix = mix_confs[0]
837 837 else:
838 838 mix = RCConfiguration(experiment=experiment,
839 839 device=rc_confs[0].device,
840 840 ipp=rc_confs[0].ipp,
841 841 clock_in=rc_confs[0].clock_in,
842 842 clock_divider=rc_confs[0].clock_divider,
843 843 mix=True,
844 844 parameters='')
845 845 mix.save()
846 846
847 847 line_type = RCLineType.objects.get(name='mix')
848 848 for i in range(len(rc_confs[0].get_lines())):
849 849 line = RCLine(rc_configuration=mix, line_type=line_type, channel=i)
850 850 line.save()
851 851
852 852 initial = {'name': mix.name,
853 853 'result': parse_mix_result(mix.parameters),
854 854 'delay': 0,
855 855 'mask': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
856 856 }
857 857
858 858 if request.method == 'GET':
859 859 form = RCMixConfigurationForm(confs=rc_confs, initial=initial)
860 860
861 861 if request.method == 'POST':
862 862 result = mix.parameters
863 863
864 864 if '{}|'.format(request.POST['experiment']) in result:
865 865 messages.error(request, 'Configuration already added')
866 866 else:
867 867 if 'operation' in request.POST:
868 868 operation = MIX_OPERATIONS[request.POST['operation']]
869 869 else:
870 870 operation = ' '
871 871
872 872 mode = MIX_MODES[request.POST['mode']]
873 873
874 874 if result:
875 875 result = '{}-{}|{}|{}|{}|{}'.format(mix.parameters,
876 876 request.POST['experiment'],
877 877 mode,
878 878 operation,
879 879 float(
880 880 request.POST['delay']),
881 881 parse_mask(
882 882 request.POST.getlist('mask'))
883 883 )
884 884 else:
885 885 result = '{}|{}|{}|{}|{}'.format(request.POST['experiment'],
886 886 mode,
887 887 operation,
888 888 float(request.POST['delay']),
889 889 parse_mask(
890 890 request.POST.getlist('mask'))
891 891 )
892 892
893 893 mix.parameters = result
894 894 mix.save()
895 895 mix.update_pulses()
896 896
897 897 initial['result'] = parse_mix_result(result)
898 898 initial['name'] = mix.name
899 899
900 900 form = RCMixConfigurationForm(initial=initial, confs=rc_confs)
901 901
902 902 kwargs = {
903 903 'title': 'Experiment',
904 904 'suptitle': 'Mix Configurations',
905 905 'form': form,
906 906 'extra_button': 'Delete',
907 907 'button': 'Add',
908 908 'cancel': 'Back',
909 909 'previous': experiment.get_absolute_url(),
910 910 'id_exp': id_exp,
911 911
912 912 }
913 913 kwargs['menu_experiments'] = 'active'
914 914
915 915 return render(request, 'experiment_mix.html', kwargs)
916 916
917 917
918 918 @login_required
919 919 def experiment_mix_delete(request, id_exp):
920 920
921 921 conf = RCConfiguration.objects.get(experiment=id_exp, mix=True, type=0)
922 922 values = conf.parameters.split('-')
923 923 conf.parameters = '-'.join(values[:-1])
924 924 conf.save()
925 925
926 926 return redirect('url_mix_experiment', id_exp=id_exp)
927 927
928 928
929 929 def experiment_summary(request, id_exp):
930 930
931 931 experiment = get_object_or_404(Experiment, pk=id_exp)
932 932 configurations = Configuration.objects.filter(
933 933 experiment=experiment, type=0)
934 934
935 935 kwargs = {}
936 936 kwargs['experiment_keys'] = ['radar_system',
937 937 'name', 'freq', 'start_time', 'end_time']
938 938 kwargs['experiment'] = experiment
939 939 kwargs['configurations'] = []
940 940 kwargs['title'] = 'Experiment Summary'
941 941 kwargs['suptitle'] = 'Details'
942 942 kwargs['button'] = 'Verify Parameters'
943 943
944 944 c_vel = 3.0*(10**8) # m/s
945 945 ope_freq = experiment.freq*(10**6) # 1/s
946 946 radar_lambda = c_vel/ope_freq # m
947 947 kwargs['radar_lambda'] = radar_lambda
948 948
949 949 ipp = None
950 950 nsa = 1
951 951 code_id = 0
952 952 tx_line = {}
953 953
954 954 for configuration in configurations.filter(device__device_type__name = 'rc'):
955 955
956 956 if configuration.mix:
957 957 continue
958 958 conf = {'conf': configuration}
959 959 conf['keys'] = []
960 960 conf['NTxs'] = configuration.ntx
961 961 conf['keys'].append('NTxs')
962 962 ipp = configuration.ipp
963 963 conf['IPP'] = ipp
964 964 conf['keys'].append('IPP')
965 965 lines = configuration.get_lines(line_type__name='tx')
966 966
967 967 for tx_line in lines:
968 968 tx_params = json.loads(tx_line.params)
969 969 conf[tx_line.get_name()] = '{} Km'.format(tx_params['pulse_width'])
970 970 conf['keys'].append(tx_line.get_name())
971 971 delays = tx_params['delays']
972 972 if delays not in ('', '0'):
973 973 n = len(delays.split(','))
974 974 taus = '{} Taus: {}'.format(n, delays)
975 975 else:
976 976 taus = '-'
977 977 conf['Taus ({})'.format(tx_line.get_name())] = taus
978 978 conf['keys'].append('Taus ({})'.format(tx_line.get_name()))
979 979 for code_line in configuration.get_lines(line_type__name='codes'):
980 980 code_params = json.loads(code_line.params)
981 981 code_id = code_params['code']
982 982 if tx_line.pk == int(code_params['TX_ref']):
983 983 conf['Code ({})'.format(tx_line.get_name())] = '{}:{}'.format(RCLineCode.objects.get(pk=code_params['code']),
984 984 '-'.join(code_params['codes']))
985 985 conf['keys'].append('Code ({})'.format(tx_line.get_name()))
986 986
987 987 for windows_line in configuration.get_lines(line_type__name='windows'):
988 988 win_params = json.loads(windows_line.params)
989 989 if tx_line.pk == int(win_params['TX_ref']):
990 990 windows = ''
991 991 nsa = win_params['params'][0]['number_of_samples']
992 992 for i, params in enumerate(win_params['params']):
993 993 windows += 'W{}: Ho={first_height} km DH={resolution} km NSA={number_of_samples}<br>'.format(
994 994 i, **params)
995 995 conf['Window'] = mark_safe(windows)
996 996 conf['keys'].append('Window')
997 997
998 998 kwargs['configurations'].append(conf)
999 999
1000 1000 for configuration in configurations.filter(device__device_type__name = 'jars'):
1001 1001
1002 1002 conf = {'conf': configuration}
1003 1003 conf['keys'] = []
1004 1004 conf['Type of Data'] = EXPERIMENT_TYPE[configuration.exp_type][1]
1005 1005 conf['keys'].append('Type of Data')
1006 1006 channels_number = configuration.channels_number
1007 1007 exp_type = configuration.exp_type
1008 1008 fftpoints = configuration.fftpoints
1009 1009 filter_parms = json.loads(configuration.filter_parms)
1010 1010 spectral_number = configuration.spectral_number
1011 1011 acq_profiles = configuration.acq_profiles
1012 1012 cohe_integr = configuration.cohe_integr
1013 1013 profiles_block = configuration.profiles_block
1014 1014
1015 1015 conf['Num of Profiles'] = acq_profiles
1016 1016 conf['keys'].append('Num of Profiles')
1017 1017
1018 1018 conf['Prof per Block'] = profiles_block
1019 1019 conf['keys'].append('Prof per Block')
1020 1020
1021 1021 conf['Blocks per File'] = configuration.raw_data_blocks
1022 1022 conf['keys'].append('Blocks per File')
1023 1023
1024 1024 if exp_type == 0: # Short
1025 1025 bytes_ = 2
1026 1026 b = nsa*2*bytes_*channels_number
1027 1027 else: # Float
1028 1028 bytes_ = 4
1029 1029 channels = channels_number + spectral_number
1030 1030 b = nsa*2*bytes_*fftpoints*channels
1031 1031
1032 1032 codes_num = 7
1033 1033 if code_id == 2:
1034 1034 codes_num = 7
1035 1035 elif code_id == 12:
1036 1036 codes_num = 15
1037 1037
1038 1038 #Jars filter values:
1039 1039
1040 1040 clock = float(filter_parms['clock'])
1041 1041 filter_2 = int(filter_parms['cic_2'])
1042 1042 filter_5 = int(filter_parms['cic_5'])
1043 1043 filter_fir = int(filter_parms['fir'])
1044 1044 Fs_MHz = clock/(filter_2*filter_5*filter_fir)
1045 1045
1046 1046 #Jars values:
1047 1047 if ipp is not None:
1048 1048 IPP_units = ipp/0.15*Fs_MHz
1049 1049 IPP_us = IPP_units / Fs_MHz
1050 1050 IPP_s = IPP_units / (Fs_MHz * (10**6))
1051 1051 Ts = 1/(Fs_MHz*(10**6))
1052 1052
1053 1053 Va = radar_lambda/(4*Ts*cohe_integr)
1054 1054 rate_bh = ((nsa-codes_num)*channels_number*2 *
1055 1055 bytes_/IPP_us)*(36*(10**8)/cohe_integr)
1056 1056 rate_gh = rate_bh/(1024*1024*1024)
1057 1057
1058 1058 conf['Time per Block'] = IPP_s * profiles_block * cohe_integr
1059 1059 conf['keys'].append('Time per Block')
1060 1060 conf['Acq time'] = IPP_s * acq_profiles
1061 1061 conf['keys'].append('Acq time')
1062 1062 conf['Data rate'] = str(rate_gh)+" (GB/h)"
1063 1063 conf['keys'].append('Data rate')
1064 1064 conf['Va (m/s)'] = Va
1065 1065 conf['keys'].append('Va (m/s)')
1066 1066 conf['Vrange (m/s)'] = 3/(2*IPP_s*cohe_integr)
1067 1067 conf['keys'].append('Vrange (m/s)')
1068 1068
1069 1069 kwargs['configurations'].append(conf)
1070 1070 kwargs['menu_experiments'] = 'active'
1071 1071
1072 1072 ###### SIDEBAR ######
1073 1073 kwargs.update(sidebar(experiment=experiment))
1074 1074
1075 1075 return render(request, 'experiment_summary.html', kwargs)
1076 1076
1077 1077
1078 1078 @login_required
1079 1079 def experiment_verify(request, id_exp):
1080 1080
1081 1081 experiment = get_object_or_404(Experiment, pk=id_exp)
1082 1082 experiment_data = experiment.parms_to_dict()
1083 1083 configurations = Configuration.objects.filter(
1084 1084 experiment=experiment, type=0)
1085 1085
1086 1086 kwargs = {}
1087 1087
1088 1088 kwargs['experiment_keys'] = ['template',
1089 1089 'radar_system', 'name', 'start_time', 'end_time']
1090 1090 kwargs['experiment'] = experiment
1091 1091
1092 1092 kwargs['configuration_keys'] = ['name', 'device__ip_address',
1093 1093 'device__port_address', 'device__status']
1094 1094 kwargs['configurations'] = configurations
1095 1095 kwargs['experiment_data'] = experiment_data
1096 1096
1097 1097 kwargs['title'] = 'Verify Experiment'
1098 1098 kwargs['suptitle'] = 'Parameters'
1099 1099
1100 1100 kwargs['button'] = 'Update'
1101 1101
1102 1102 jars_conf = False
1103 1103 rc_conf = False
1104 1104 dds_conf = False
1105 1105
1106 1106 for configuration in configurations:
1107 1107 #-------------------- JARS -----------------------:
1108 1108 if configuration.device.device_type.name == 'jars':
1109 1109 jars_conf = True
1110 1110 jars = configuration
1111 1111 kwargs['jars_conf'] = jars_conf
1112 1112 filter_parms = json.loads(jars.filter_parms)
1113 1113 kwargs['filter_parms'] = filter_parms
1114 1114 #--Sampling Frequency
1115 1115 clock = filter_parms['clock']
1116 1116 filter_2 = filter_parms['cic_2']
1117 1117 filter_5 = filter_parms['cic_5']
1118 1118 filter_fir = filter_parms['fir']
1119 1119 samp_freq_jars = clock/filter_2/filter_5/filter_fir
1120 1120
1121 1121 kwargs['samp_freq_jars'] = samp_freq_jars
1122 1122 kwargs['jars'] = configuration
1123 1123
1124 1124 #--------------------- RC ----------------------:
1125 1125 if configuration.device.device_type.name == 'rc' and not configuration.mix:
1126 1126 rc_conf = True
1127 1127 rc = configuration
1128 1128
1129 1129 rc_parms = configuration.parms_to_dict()
1130 1130
1131 1131 win_lines = rc.get_lines(line_type__name='windows')
1132 1132 if win_lines:
1133 1133 dh = json.loads(win_lines[0].params)['params'][0]['resolution']
1134 1134 #--Sampling Frequency
1135 1135 samp_freq_rc = 0.15/dh
1136 1136 kwargs['samp_freq_rc'] = samp_freq_rc
1137 1137
1138 1138 kwargs['rc_conf'] = rc_conf
1139 1139 kwargs['rc'] = configuration
1140 1140
1141 1141 #-------------------- DDS ----------------------:
1142 1142 if configuration.device.device_type.name == 'dds':
1143 1143 dds_conf = True
1144 1144 dds = configuration
1145 1145 dds_parms = configuration.parms_to_dict()
1146 1146
1147 1147 kwargs['dds_conf'] = dds_conf
1148 1148 kwargs['dds'] = configuration
1149 1149
1150 1150 #------------Validation------------:
1151 1151 #Clock
1152 1152 if dds_conf and rc_conf and jars_conf:
1153 1153 if float(filter_parms['clock']) != float(rc_parms['configurations']['byId'][str(rc.pk)]['clock_in']) and float(rc_parms['configurations']['byId'][str(rc.pk)]['clock_in']) != float(dds_parms['configurations']['byId'][str(dds.pk)]['clock']):
1154 1154 messages.warning(request, "Devices don't have the same clock.")
1155 1155 elif rc_conf and jars_conf:
1156 1156 if float(filter_parms['clock']) != float(rc_parms['configurations']['byId'][str(rc.pk)]['clock_in']):
1157 1157 messages.warning(request, "Devices don't have the same clock.")
1158 1158 elif rc_conf and dds_conf:
1159 1159 if float(rc_parms['configurations']['byId'][str(rc.pk)]['clock_in']) != float(dds_parms['configurations']['byId'][str(dds.pk)]['clock']):
1160 1160 messages.warning(request, "Devices don't have the same clock.")
1161 1161 if float(samp_freq_rc) != float(dds_parms['configurations']['byId'][str(dds.pk)]['frequencyA']):
1162 1162 messages.warning(
1163 1163 request, "Devices don't have the same Frequency A.")
1164 1164
1165 1165 #------------POST METHOD------------:
1166 1166 if request.method == 'POST':
1167 1167 if request.POST['suggest_clock']:
1168 1168 try:
1169 1169 suggest_clock = float(request.POST['suggest_clock'])
1170 1170 except:
1171 1171 messages.warning(request, "Invalid value in CLOCK IN.")
1172 1172 return redirect('url_verify_experiment', id_exp=experiment.id)
1173 1173 else:
1174 1174 suggest_clock = ""
1175 1175 if suggest_clock:
1176 1176 if rc_conf:
1177 1177 rc.clock_in = suggest_clock
1178 1178 rc.save()
1179 1179 if jars_conf:
1180 1180 filter_parms = jars.filter_parms
1181 1181 filter_parms = ast.literal_eval(filter_parms)
1182 1182 filter_parms['clock'] = suggest_clock
1183 1183 jars.filter_parms = json.dumps(filter_parms)
1184 1184 jars.save()
1185 1185 kwargs['filter_parms'] = filter_parms
1186 1186 if dds_conf:
1187 1187 dds.clock = suggest_clock
1188 1188 dds.save()
1189 1189
1190 1190 if request.POST['suggest_frequencyA']:
1191 1191 try:
1192 1192 suggest_frequencyA = float(request.POST['suggest_frequencyA'])
1193 1193 except:
1194 1194 messages.warning(request, "Invalid value in FREQUENCY A.")
1195 1195 return redirect('url_verify_experiment', id_exp=experiment.id)
1196 1196 else:
1197 1197 suggest_frequencyA = ""
1198 1198 if suggest_frequencyA:
1199 1199 if jars_conf:
1200 1200 filter_parms = jars.filter_parms
1201 1201 filter_parms = ast.literal_eval(filter_parms)
1202 1202 filter_parms['fch'] = suggest_frequencyA
1203 1203 jars.filter_parms = json.dumps(filter_parms)
1204 1204 jars.save()
1205 1205 kwargs['filter_parms'] = filter_parms
1206 1206 if dds_conf:
1207 1207 dds.frequencyA_Mhz = request.POST['suggest_frequencyA']
1208 1208 dds.save()
1209 1209
1210 1210 kwargs['menu_experiments'] = 'active'
1211 1211 kwargs.update(sidebar(experiment=experiment))
1212 1212 return render(request, 'experiment_verify.html', kwargs)
1213 1213
1214 1214
1215 1215 def parse_mix_result(s):
1216 1216
1217 1217 values = s.split('-')
1218 1218 html = 'EXP MOD OPE DELAY MASK\r\n'
1219 1219
1220 1220 if not values or values[0] in ('', ' '):
1221 1221 return mark_safe(html)
1222 1222
1223 1223 for i, value in enumerate(values):
1224 1224 if not value:
1225 1225 continue
1226 1226 pk, mode, operation, delay, mask = value.split('|')
1227 1227 conf = RCConfiguration.objects.get(pk=pk)
1228 1228 if i == 0:
1229 1229 html += '{:20.18}{:3}{:4}{:9}km{:>6}\r\n'.format(
1230 1230 conf.name,
1231 1231 mode,
1232 1232 ' ',
1233 1233 delay,
1234 1234 mask)
1235 1235 else:
1236 1236 html += '{:20.18}{:3}{:4}{:9}km{:>6}\r\n'.format(
1237 1237 conf.name,
1238 1238 mode,
1239 1239 operation,
1240 1240 delay,
1241 1241 mask)
1242 1242
1243 1243 return mark_safe(html)
1244 1244
1245 1245
1246 1246 def parse_mask(l):
1247 1247
1248 1248 values = []
1249 1249
1250 1250 for x in range(16):
1251 1251 if '{}'.format(x) in l:
1252 1252 values.append(1)
1253 1253 else:
1254 1254 values.append(0)
1255 1255
1256 1256 values.reverse()
1257 1257
1258 1258 return int(''.join([str(x) for x in values]), 2)
1259 1259
1260 1260
1261 1261 def dev_confs(request):
1262 1262
1263 1263 page = request.GET.get('page')
1264 1264 order = ('-programmed_date', )
1265 1265 filters = request.GET.copy()
1266 1266 if 'my configurations' in filters:
1267 1267 filters.pop('my configurations', None)
1268 1268 filters['mine'] = request.user.id
1269 1269 kwargs = get_paginator(Configuration, page, order, filters)
1270 1270 fields = ['tags', 'template', 'historical']
1271 1271 if request.user.is_authenticated:
1272 1272 fields.append('my configurations')
1273 1273 form = FilterForm(initial=request.GET, extra_fields=fields)
1274 1274 kwargs['keys'] = ['name', 'experiment',
1275 1275 'type', 'programmed_date', 'actions']
1276 1276 kwargs['title'] = 'Configuration'
1277 1277 kwargs['suptitle'] = 'List'
1278 1278 kwargs['no_sidebar'] = True
1279 1279 kwargs['form'] = form
1280 1280 kwargs['add_url'] = reverse('url_add_dev_conf', args=[0])
1281 1281 filters = request.GET.copy()
1282 1282 filters.pop('page', None)
1283 1283 kwargs['q'] = urlencode(filters)
1284 1284 kwargs['menu_configurations'] = 'active'
1285 1285
1286 1286 return render(request, 'base_list.html', kwargs)
1287 1287
1288 1288
1289 1289 def dev_conf(request, id_conf):
1290 1290
1291 1291 conf = get_object_or_404(Configuration, pk=id_conf)
1292 1292
1293 1293 return redirect(conf.get_absolute_url())
1294 1294
1295 1295
1296 1296 @login_required
1297 1297 def dev_conf_new(request, id_exp=0, id_dev=0):
1298 1298
1299 1299 if not is_developer(request.user):
1300 1300 messages.error(
1301 1301 request, 'Developer required, to create new configurations')
1302 1302 return redirect('index')
1303 1303
1304 1304 initial = {}
1305 1305 kwargs = {}
1306 1306
1307 1307 if id_exp != 0:
1308 1308 initial['experiment'] = id_exp
1309 1309
1310 1310 if id_dev != 0:
1311 1311 initial['device'] = id_dev
1312 1312
1313 1313 if request.method == 'GET':
1314 1314
1315 1315 if id_dev:
1316 1316 kwargs['button'] = 'Create'
1317 1317 device = Device.objects.get(pk=id_dev)
1318 1318 DevConfForm = CONF_FORMS[device.device_type.name]
1319 1319 initial['name'] = request.GET['name']
1320 1320 form = DevConfForm(initial=initial)
1321 1321 else:
1322 1322 if 'template' in request.GET:
1323 1323 if request.GET['template'] == '0':
1324 1324 choices = [(conf.pk, '{}'.format(conf))
1325 1325 for conf in Configuration.objects.filter(template=True)]
1326 1326 form = NewForm(initial={'create_from': 2},
1327 1327 template_choices=choices)
1328 1328 else:
1329 1329 kwargs['button'] = 'Create'
1330 1330 conf = Configuration.objects.get(
1331 1331 pk=request.GET['template'])
1332 1332 id_dev = conf.device.pk
1333 1333 DevConfForm = CONF_FORMS[conf.device.device_type.name]
1334 1334 form = DevConfForm(instance=conf,
1335 1335 initial={'name': '{}_{:%y%m%d}'.format(conf.name, datetime.now()),
1336 1336 'template': False,
1337 1337 'experiment': id_exp})
1338 1338 elif 'blank' in request.GET:
1339 1339 kwargs['button'] = 'Create'
1340 1340 form = ConfigurationForm(initial=initial)
1341 1341 else:
1342 1342 form = NewForm()
1343 1343
1344 1344 if request.method == 'POST':
1345 1345
1346 1346 device = Device.objects.get(pk=request.POST['device'])
1347 1347 DevConfForm = CONF_FORMS[device.device_type.name]
1348 1348
1349 1349 form = DevConfForm(request.POST)
1350 1350 kwargs['button'] = 'Create'
1351 1351 if form.is_valid():
1352 1352 conf = form.save(commit=False)
1353 1353 conf.author = request.user
1354 1354 conf.save()
1355 1355
1356 1356 if 'template' in request.GET and conf.device.device_type.name == 'rc':
1357 1357 lines = RCLine.objects.filter(
1358 1358 rc_configuration=request.GET['template'])
1359 1359 for line in lines:
1360 1360 line.clone(rc_configuration=conf)
1361 1361
1362 1362 new_lines = conf.get_lines()
1363 1363 for line in new_lines:
1364 1364 line_params = json.loads(line.params)
1365 1365 if 'TX_ref' in line_params:
1366 1366 ref_line = RCLine.objects.get(pk=line_params['TX_ref'])
1367 1367 line_params['TX_ref'] = ['{}'.format(
1368 1368 l.pk) for l in new_lines if l.get_name() == ref_line.get_name()][0]
1369 1369 line.params = json.dumps(line_params)
1370 1370 line.save()
1371 1371 elif conf.device.device_type.name == 'rc':
1372 1372 clk = RCClock(rc_configuration=conf)
1373 1373 clk.save()
1374 1374
1375 1375 return redirect('url_dev_conf', id_conf=conf.pk)
1376 1376
1377 1377 kwargs['id_exp'] = id_exp
1378 1378 kwargs['form'] = form
1379 1379 kwargs['title'] = 'Configuration'
1380 1380 kwargs['suptitle'] = 'New'
1381 1381 kwargs['menu_configurations'] = 'active'
1382 1382
1383 1383 if id_dev != 0:
1384 1384 device = Device.objects.get(pk=id_dev)
1385 1385 kwargs['device'] = device.device_type.name
1386 1386
1387 1387 return render(request, 'dev_conf_edit.html', kwargs)
1388 1388
1389 1389
1390 1390 @login_required
1391 1391 def dev_conf_edit(request, id_conf):
1392 1392
1393 1393 conf = get_object_or_404(Configuration, pk=id_conf)
1394 1394
1395 1395 DevConfForm = CONF_FORMS[conf.device.device_type.name]
1396 1396
1397 1397 if request.method == 'GET':
1398 1398 form = DevConfForm(instance=conf)
1399 1399
1400 1400 if request.method == 'POST':
1401 1401 form = DevConfForm(request.POST, instance=conf)
1402 1402
1403 1403 if form.is_valid():
1404 1404 form.save()
1405 1405 return redirect('url_dev_conf', id_conf=id_conf)
1406 1406
1407 1407 kwargs = {}
1408 1408 kwargs['form'] = form
1409 1409 kwargs['title'] = 'Device Configuration'
1410 1410 kwargs['suptitle'] = 'Edit'
1411 1411 kwargs['button'] = 'Update'
1412 1412 kwargs['menu_configurations'] = 'active'
1413 1413
1414 1414 ###### SIDEBAR ######
1415 1415 kwargs.update(sidebar(conf=conf))
1416 1416
1417 1417 return render(request, '%s_conf_edit.html' % conf.device.device_type.name, kwargs)
1418 1418
1419 1419
1420 1420 @login_required
1421 1421 def dev_conf_start(request, id_conf):
1422 1422
1423 1423 conf = get_object_or_404(Configuration, pk=id_conf)
1424 1424
1425 1425 if conf.start_device():
1426 1426 messages.success(request, conf.message)
1427 1427 else:
1428 1428 messages.error(request, conf.message)
1429 1429
1430 1430 #conf.status_device()
1431 1431
1432 1432 return redirect(conf.get_absolute_url())
1433 1433
1434 1434
1435 1435 @login_required
1436 1436 def dev_conf_stop(request, id_conf):
1437 1437
1438 1438 conf = get_object_or_404(Configuration, pk=id_conf)
1439 1439
1440 1440 if conf.stop_device():
1441 1441 messages.success(request, conf.message)
1442 1442 else:
1443 1443 messages.error(request, conf.message)
1444 1444
1445 1445 #conf.status_device()
1446 1446
1447 1447 return redirect(conf.get_absolute_url())
1448 1448
1449 1449
1450 1450 @login_required
1451 1451 def dev_conf_status(request, id_conf):
1452 1452
1453 1453 conf = get_object_or_404(Configuration, pk=id_conf)
1454 1454
1455 1455 conf_active = Configuration.objects.filter(pk=conf.device.conf_active).first()
1456 1456 if conf_active<>conf:
1457 1457 url = '#' if conf_active is None else conf_active.get_absolute_url()
1458 1458 label = 'None' if conf_active is None else conf_active.label
1459 1459 messages.warning(
1460 1460 request,
1461 1461 mark_safe('The current configuration has not been written to device, the active configuration is <a href="{}">{}</a>'.format(
1462 1462 url,
1463 1463 label
1464 1464 ))
1465 1465 )
1466 1466
1467 1467 return redirect(conf.get_absolute_url())
1468 1468
1469 1469 if conf.status_device():
1470 1470 messages.success(request, conf.message)
1471 1471 else:
1472 1472 messages.error(request, conf.message)
1473 1473
1474 1474 return redirect(conf.get_absolute_url())
1475 1475
1476 1476
1477 1477 @login_required
1478 1478 def dev_conf_reset(request, id_conf):
1479 1479
1480 1480 conf = get_object_or_404(Configuration, pk=id_conf)
1481 1481
1482 1482 if conf.reset_device():
1483 1483 messages.success(request, conf.message)
1484 1484 else:
1485 1485 messages.error(request, conf.message)
1486 1486
1487 1487 return redirect(conf.get_absolute_url())
1488 1488
1489 1489
1490 1490 @login_required
1491 1491 def dev_conf_write(request, id_conf):
1492 1492
1493 1493 conf = get_object_or_404(Configuration, pk=id_conf)
1494 1494
1495 if request.method == 'POST':
1495 1496 if conf.write_device():
1496 1497 conf.device.conf_active = conf.pk
1497 1498 conf.device.save()
1498 1499 messages.success(request, conf.message)
1499 1500 if has_been_modified(conf):
1500 1501 conf.clone(type=1, template=False)
1501 1502 else:
1502 1503 messages.error(request, conf.message)
1503 1504
1504 1505 return redirect(get_object_or_404(Configuration, pk=id_conf).get_absolute_url())
1505 1506
1507 kwargs = {
1508 'title': 'Write Configuration',
1509 'suptitle': conf.label,
1510 'message': 'Are you sure yo want to write this {} configuration?'.format(conf.device),
1511 'delete': False
1512 }
1513 kwargs['menu_configurations'] = 'active'
1514
1515 return render(request, 'confirm.html', kwargs)
1516
1506 1517
1507 1518 @login_required
1508 1519 def dev_conf_read(request, id_conf):
1509 1520
1510 1521 conf = get_object_or_404(Configuration, pk=id_conf)
1511 1522
1512 1523 DevConfForm = CONF_FORMS[conf.device.device_type.name]
1513 1524
1514 1525 if request.method == 'GET':
1515 1526
1516 1527 parms = conf.read_device()
1517 1528 #conf.status_device()
1518 1529
1519 1530 if not parms:
1520 1531 messages.error(request, conf.message)
1521 1532 return redirect(conf.get_absolute_url())
1522 1533
1523 1534 form = DevConfForm(initial=parms, instance=conf)
1524 1535
1525 1536 if request.method == 'POST':
1526 1537 form = DevConfForm(request.POST, instance=conf)
1527 1538
1528 1539 if form.is_valid():
1529 1540 form.save()
1530 1541 return redirect(conf.get_absolute_url())
1531 1542
1532 1543 messages.error(request, "Parameters could not be saved")
1533 1544
1534 1545 kwargs = {}
1535 1546 kwargs['id_dev'] = conf.id
1536 1547 kwargs['form'] = form
1537 1548 kwargs['title'] = 'Device Configuration'
1538 1549 kwargs['suptitle'] = 'Parameters read from device'
1539 1550 kwargs['button'] = 'Save'
1540 1551
1541 1552 ###### SIDEBAR ######
1542 1553 kwargs.update(sidebar(conf=conf))
1543 1554
1544 1555 return render(request, '%s_conf_edit.html' % conf.device.device_type.name, kwargs)
1545 1556
1546 1557
1547 1558 @login_required
1548 1559 def dev_conf_import(request, id_conf):
1549 1560
1550 1561 conf = get_object_or_404(Configuration, pk=id_conf)
1551 1562 DevConfForm = CONF_FORMS[conf.device.device_type.name]
1552 1563
1553 1564 if request.method == 'GET':
1554 1565 file_form = UploadFileForm()
1555 1566
1556 1567 if request.method == 'POST':
1557 1568 file_form = UploadFileForm(request.POST, request.FILES)
1558 1569
1559 1570 if file_form.is_valid():
1560 1571
1561 1572 data = conf.import_from_file(request.FILES['file'])
1562 1573 parms = Params(data=data).get_conf(
1563 1574 dtype=conf.device.device_type.name)
1564 1575
1565 1576 if parms:
1566 1577
1567 1578 form = DevConfForm(initial=parms, instance=conf)
1568 1579
1569 1580 kwargs = {}
1570 1581 kwargs['id_dev'] = conf.id
1571 1582 kwargs['form'] = form
1572 1583 kwargs['title'] = 'Device Configuration'
1573 1584 kwargs['suptitle'] = 'Parameters imported'
1574 1585 kwargs['button'] = 'Save'
1575 1586 kwargs['action'] = conf.get_absolute_url_edit()
1576 1587 kwargs['previous'] = conf.get_absolute_url()
1577 1588
1578 1589 ###### SIDEBAR ######
1579 1590 kwargs.update(sidebar(conf=conf))
1580 1591
1581 1592 messages.success(
1582 1593 request, "Parameters imported from: '%s'." % request.FILES['file'].name)
1583 1594
1584 1595 return render(request, '%s_conf_edit.html' % conf.device.device_type.name, kwargs)
1585 1596
1586 1597 messages.error(request, "Could not import parameters from file")
1587 1598
1588 1599 kwargs = {}
1589 1600 kwargs['id_dev'] = conf.id
1590 1601 kwargs['title'] = 'Device Configuration'
1591 1602 kwargs['form'] = file_form
1592 1603 kwargs['suptitle'] = 'Importing file'
1593 1604 kwargs['button'] = 'Import'
1594 1605 kwargs['menu_configurations'] = 'active'
1595 1606
1596 1607 kwargs.update(sidebar(conf=conf))
1597 1608
1598 1609 return render(request, 'dev_conf_import.html', kwargs)
1599 1610
1600 1611
1601 1612 @login_required
1602 1613 def dev_conf_export(request, id_conf):
1603 1614
1604 1615 conf = get_object_or_404(Configuration, pk=id_conf)
1605 1616
1606 1617 if request.method == 'GET':
1607 1618 file_form = DownloadFileForm(conf.device.device_type.name)
1608 1619
1609 1620 if request.method == 'POST':
1610 1621 file_form = DownloadFileForm(
1611 1622 conf.device.device_type.name, request.POST)
1612 1623
1613 1624 if file_form.is_valid():
1614 1625 fields = conf.export_to_file(
1615 1626 format=file_form.cleaned_data['format'])
1616 1627 if not fields['content']:
1617 1628 messages.error(request, conf.message)
1618 1629 return redirect(conf.get_absolute_url_export())
1619 1630 response = HttpResponse(content_type=fields['content_type'])
1620 1631 response['Content-Disposition'] = 'attachment; filename="%s"' % fields['filename']
1621 1632 response.write(fields['content'])
1622 1633
1623 1634 return response
1624 1635
1625 1636 messages.error(request, "Could not export parameters")
1626 1637
1627 1638 kwargs = {}
1628 1639 kwargs['id_dev'] = conf.id
1629 1640 kwargs['title'] = 'Device Configuration'
1630 1641 kwargs['form'] = file_form
1631 1642 kwargs['suptitle'] = 'Exporting file'
1632 1643 kwargs['button'] = 'Export'
1633 1644 kwargs['menu_configurations'] = 'active'
1634 1645
1635 1646 return render(request, 'dev_conf_export.html', kwargs)
1636 1647
1637 1648
1638 1649 @login_required
1639 1650 def dev_conf_delete(request, id_conf):
1640 1651
1641 1652 conf = get_object_or_404(Configuration, pk=id_conf)
1642 1653
1643 1654 if request.method == 'POST':
1644 1655 if is_developer(request.user):
1645 1656 conf.delete()
1646 1657 return redirect('url_dev_confs')
1647 1658
1648 1659 messages.error(request, 'Not enough permission to delete this object')
1649 1660 return redirect(conf.get_absolute_url())
1650 1661
1651 1662 kwargs = {
1652 1663 'title': 'Delete',
1653 1664 'suptitle': 'Configuration',
1654 1665 'object': conf,
1655 1666 'delete': True
1656 1667 }
1657 1668 kwargs['menu_configurations'] = 'active'
1658 1669
1659 1670 return render(request, 'confirm.html', kwargs)
1660 1671
1661 1672
1662 1673 def sidebar(**kwargs):
1663 1674
1664 1675 side_data = {}
1665 1676
1666 1677 conf = kwargs.get('conf', None)
1667 1678 experiment = kwargs.get('experiment', None)
1668 1679
1669 1680 if not experiment:
1670 1681 experiment = conf.experiment
1671 1682
1672 1683 if experiment:
1673 1684 side_data['experiment'] = experiment
1674 1685 campaign = experiment.campaign_set.all()
1675 1686 if campaign:
1676 1687 side_data['campaign'] = campaign[0]
1677 1688 experiments = campaign[0].experiments.all().order_by('name')
1678 1689 else:
1679 1690 experiments = [experiment]
1680 1691 configurations = experiment.configuration_set.filter(type=0)
1681 1692 side_data['side_experiments'] = experiments
1682 1693 side_data['side_configurations'] = configurations.order_by(
1683 1694 'device__device_type__name')
1684 1695
1685 1696 return side_data
1686 1697
1687 1698
1688 1699 def get_paginator(model, page, order, filters={}, n=8):
1689 1700
1690 1701 kwargs = {}
1691 1702 query = Q()
1692 1703 if isinstance(filters, QueryDict):
1693 1704 filters = filters.dict()
1694 1705 [filters.pop(key) for key in filters.keys() if filters[key] in ('', ' ')]
1695 1706 filters.pop('page', None)
1696 1707
1697 1708 fields = [f.name for f in model._meta.get_fields()]
1698 1709
1699 1710 if 'template' in filters:
1700 1711 filters['template'] = True
1701 1712 if 'historical' in filters:
1702 1713 filters.pop('historical')
1703 1714 filters['type'] = 1
1704 1715 elif 'type' in fields:
1705 1716 filters['type'] = 0
1706 1717 if 'start_date' in filters:
1707 1718 filters['start_date__gte'] = filters.pop('start_date')
1708 1719 if 'end_date' in filters:
1709 1720 filters['start_date__lte'] = filters.pop('end_date')
1710 1721 if 'tags' in filters:
1711 1722 tags = filters.pop('tags')
1712 1723 if 'tags' in fields:
1713 1724 query = query | Q(tags__icontains=tags)
1714 1725 if 'label' in fields:
1715 1726 query = query | Q(label__icontains=tags)
1716 1727 if 'location' in fields:
1717 1728 query = query | Q(location__name__icontains=tags)
1718 1729 if 'device' in fields:
1719 1730 query = query | Q(device__device_type__name__icontains=tags)
1720 1731 query = query | Q(device__location__name__icontains=tags)
1721 1732 if 'device_type' in fields:
1722 1733 query = query | Q(device_type__name__icontains=tags)
1723 1734
1724 1735 if 'mine' in filters:
1725 1736 filters['author_id'] = filters['mine']
1726 1737 filters.pop('mine')
1727 1738 object_list = model.objects.filter(query, **filters).order_by(*order)
1728 1739 paginator = Paginator(object_list, n)
1729 1740
1730 1741 try:
1731 1742 objects = paginator.page(page)
1732 1743 except PageNotAnInteger:
1733 1744 objects = paginator.page(1)
1734 1745 except EmptyPage:
1735 1746 objects = paginator.page(paginator.num_pages)
1736 1747
1737 1748 kwargs['objects'] = objects
1738 1749 kwargs['offset'] = (int(page)-1)*n if page else 0
1739 1750
1740 1751 return kwargs
1741 1752
1742 1753
1743 1754 def operation(request, id_camp=None):
1744 1755
1745 1756 kwargs = {}
1746 1757 kwargs['title'] = 'Radars Operation'
1747 1758 kwargs['no_sidebar'] = True
1748 1759 kwargs['menu_operation'] = 'active'
1749 1760 campaigns = Campaign.objects.filter(start_date__lte=datetime.now(),
1750 1761 end_date__gte=datetime.now()).order_by('-start_date')
1751 1762
1752 1763 if id_camp:
1753 1764 campaign = get_object_or_404(Campaign, pk=id_camp)
1754 1765 form = OperationForm(
1755 1766 initial={'campaign': campaign.id}, campaigns=campaigns)
1756 1767 kwargs['campaign'] = campaign
1757 1768 else:
1758 1769 # form = OperationForm(campaigns=campaigns)
1759 1770 kwargs['campaigns'] = campaigns
1760 1771 return render(request, 'operation.html', kwargs)
1761 1772
1762 1773 #---Experiment
1763 1774 keys = ['id', 'name', 'start_time', 'end_time', 'status']
1764 1775 kwargs['experiment_keys'] = keys[1:]
1765 1776 kwargs['experiments'] = experiments
1766 1777 #---Radar
1767 1778 kwargs['locations'] = campaign.get_experiments_by_radar()
1768 1779 kwargs['form'] = form
1769 1780
1770 1781 return render(request, 'operation.html', kwargs)
1771 1782
1772 1783
1773 1784 @login_required
1774 1785 def radar_start(request, id_camp, id_radar):
1775 1786
1776 1787 campaign = get_object_or_404(Campaign, pk=id_camp)
1777 1788 experiments = campaign.get_experiments_by_radar(id_radar)[0]['experiments']
1778 1789 now = datetime.now()
1779 1790 for exp in experiments:
1780 1791 start = datetime.combine(datetime.now().date(), exp.start_time)
1781 1792 end = datetime.combine(datetime.now().date(), exp.end_time)
1782 1793 if end < start:
1783 1794 end += timedelta(1)
1784 1795
1785 1796 if exp.status == 2:
1786 1797 messages.warning(
1787 1798 request, 'Experiment {} already running'.format(exp))
1788 1799 continue
1789 1800
1790 1801 if exp.status == 3:
1791 1802 messages.warning(
1792 1803 request, 'Experiment {} already programmed'.format(exp))
1793 1804 continue
1794 1805
1795 1806 if start > campaign.end_date or start < campaign.start_date:
1796 1807 messages.warning(request, 'Experiment {} out of date'.format(exp))
1797 1808 continue
1798 1809
1799 1810 app.control.revoke(exp.task)
1800 1811
1801 1812 if now > start and now <= end:
1802 1813 task = task_start.delay(exp.id)
1803 1814 exp.status = task.wait()
1804 1815 if exp.status == 0:
1805 1816 messages.error(request, 'Experiment {} not start'.format(exp))
1806 1817 if exp.status == 2:
1807 1818 messages.success(request, 'Experiment {} started'.format(exp))
1808 1819 else:
1809 1820 task = task_start.apply_async(
1810 1821 (exp.pk, ), eta=start+timedelta(hours=5))
1811 1822 exp.task = task.id
1812 1823 exp.status = 3
1813 1824 messages.success(
1814 1825 request, 'Experiment {} programmed to start at {}'.format(exp, start))
1815 1826
1816 1827 exp.save()
1817 1828
1818 1829 return HttpResponseRedirect(reverse('url_operation', args=[id_camp]))
1819 1830
1820 1831
1821 1832 @login_required
1822 1833 def radar_stop(request, id_camp, id_radar):
1823 1834
1824 1835 campaign = get_object_or_404(Campaign, pk=id_camp)
1825 1836 experiments = campaign.get_experiments_by_radar(id_radar)[0]['experiments']
1826 1837
1827 1838 for exp in experiments:
1828 1839
1829 1840 if exp.task:
1830 1841 app.control.revoke(exp.task)
1831 1842 if exp.status == 2:
1832 1843 exp.stop()
1833 1844 messages.warning(request, 'Experiment {} stopped'.format(exp))
1834 1845 exp.status = 1
1835 1846 exp.save()
1836 1847
1837 1848 return HttpResponseRedirect(reverse('url_operation', args=[id_camp]))
1838 1849
1839 1850
1840 1851 @login_required
1841 1852 def radar_refresh(request, id_camp, id_radar):
1842 1853
1843 1854 campaign = get_object_or_404(Campaign, pk=id_camp)
1844 1855 experiments = campaign.get_experiments_by_radar(id_radar)[0]['experiments']
1845 1856
1846 1857 i = app.control.inspect()
1847 1858 scheduled = i.scheduled().values()[0]
1848 1859 revoked = i.revoked().values()[0]
1849 1860
1850 1861 for exp in experiments:
1851 1862 if exp.task in revoked:
1852 1863 exp.status = 1
1853 1864 elif exp.task in [t['request']['id'] for t in scheduled if 'task_stop' in t['request']['name']]:
1854 1865 exp.status = 2
1855 1866 elif exp.task in [t['request']['id'] for t in scheduled if 'task_start' in t['request']['name']]:
1856 1867 exp.status = 3
1857 1868 else:
1858 1869 exp.status = 4
1859 1870 exp.save()
1860 1871 return HttpResponseRedirect(reverse('url_operation', args=[id_camp]))
1861 1872
1862 1873 @login_required
1863 1874 def revoke_tasks(request, id_camp):
1864 1875
1865 1876 i = app.control.inspect()
1866 1877 scheduled = i.scheduled().values()[0]
1867 1878 revoked = i.revoked().values()[0]
1868 1879
1869 1880 for t in scheduled:
1870 1881 if t['request']['id'] in revoked:
1871 1882 continue
1872 1883 app.control.revoke(t['request']['id'])
1873 1884 exp = Experiment.objects.get(pk=eval(t['request']['args'])[0])
1874 1885 eta = t['eta']
1875 1886 task = t['request']['name'].split('.')[-1]
1876 1887 messages.warning(request, 'Scheduled {} at {} for experiment {} revoked'.format(task, eta, exp.name))
1877 1888
1878 1889 return HttpResponseRedirect(reverse('url_operation', args=[id_camp]))
1879 1890
1880 1891 @login_required
1881 1892 def show_tasks(request, id_camp):
1882 1893
1883 1894 i = app.control.inspect()
1884 1895 scheduled = i.scheduled().values()[0]
1885 1896 revoked = i.revoked().values()[0]
1886 1897
1887 1898 for t in scheduled:
1888 1899 if t['request']['id'] in revoked:
1889 1900 continue
1890 1901 exp = Experiment.objects.get(pk=eval(t['request']['args'])[0])
1891 1902 eta = t['eta']
1892 1903 task = t['request']['name'].split('.')[-1]
1893 1904 messages.success(request, 'Task {} scheduled at {} for experiment {}'.format(task, eta, exp.name))
1894 1905
1895 1906 return HttpResponseRedirect(reverse('url_operation', args=[id_camp]))
1896 1907
1897 1908 def real_time(request):
1898 1909
1899 1910 graphic_path = "/home/fiorella/Pictures/catwbeanie.jpg"
1900 1911
1901 1912 kwargs = {}
1902 1913 kwargs['title'] = 'CLAIRE'
1903 1914 kwargs['suptitle'] = 'Real Time'
1904 1915 kwargs['no_sidebar'] = True
1905 1916 kwargs['graphic_path'] = graphic_path
1906 1917 kwargs['graphic1_path'] = 'http://www.bluemaize.net/im/girls-accessories/shark-beanie-11.jpg'
1907 1918
1908 1919 return render(request, 'real_time.html', kwargs)
1909 1920
1910 1921 def theme(request, theme):
1911 1922
1912 1923 user = request.user
1913 1924 user.profile.theme = theme
1914 1925 user.save()
1915 1926 return redirect('index') No newline at end of file
General Comments 0
You need to be logged in to leave comments. Login now