##// END OF EJS Templates
experiment_start view has been updated ...
Fiorella Quino -
r251:27d9b9b9fdc5
parent child
Show More
@@ -1,1649 +1,1655
1 1 import ast
2 2 import json
3 3 from datetime import datetime
4 4
5 5 from django.shortcuts import render, redirect, get_object_or_404, HttpResponse
6 6 from django.utils.safestring import mark_safe
7 7 from django.http import HttpResponseRedirect
8 8 from django.core.urlresolvers import reverse
9 9 from django.db.models import Q
10 10 from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
11 11 from django.contrib import messages
12 12 from django.http.request import QueryDict
13 13
14 14 try:
15 15 from urllib.parse import urlencode
16 16 except ImportError:
17 17 from urllib import urlencode
18 18
19 19 from .forms import CampaignForm, ExperimentForm, DeviceForm, ConfigurationForm, LocationForm, UploadFileForm, DownloadFileForm, OperationForm, NewForm
20 20 from .forms import OperationSearchForm, FilterForm, ChangeIpForm
21 21
22 22 from .tasks import task_start, task_stop
23 23
24 24 from apps.rc.forms import RCConfigurationForm, RCLineCode, RCMixConfigurationForm
25 25 from apps.dds.forms import DDSConfigurationForm
26 26 from apps.jars.forms import JARSConfigurationForm
27 27 from apps.cgs.forms import CGSConfigurationForm
28 28 from apps.abs.forms import ABSConfigurationForm
29 29 from apps.usrp.forms import USRPConfigurationForm
30 30
31 31 from .models import Campaign, Experiment, Device, Configuration, Location, RunningExperiment
32 32 from apps.cgs.models import CGSConfiguration
33 33 from apps.jars.models import JARSConfiguration, EXPERIMENT_TYPE
34 34 from apps.usrp.models import USRPConfiguration
35 35 from apps.abs.models import ABSConfiguration
36 36 from apps.rc.models import RCConfiguration, RCLine, RCLineType
37 37 from apps.dds.models import DDSConfiguration
38 38
39 39 from django.contrib.auth.decorators import login_required
40 40 from django.contrib.auth.decorators import user_passes_test
41 41 from django.contrib.admin.views.decorators import staff_member_required
42 42
43 43 CONF_FORMS = {
44 44 'rc': RCConfigurationForm,
45 45 'dds': DDSConfigurationForm,
46 46 'jars': JARSConfigurationForm,
47 47 'cgs': CGSConfigurationForm,
48 48 'abs': ABSConfigurationForm,
49 49 'usrp': USRPConfigurationForm,
50 50 }
51 51
52 52 CONF_MODELS = {
53 53 'rc': RCConfiguration,
54 54 'dds': DDSConfiguration,
55 55 'jars': JARSConfiguration,
56 56 'cgs': CGSConfiguration,
57 57 'abs': ABSConfiguration,
58 58 'usrp': USRPConfiguration,
59 59 }
60 60
61 61 MIX_MODES = {
62 62 '0': 'P',
63 63 '1': 'S',
64 64 }
65 65
66 66 MIX_OPERATIONS = {
67 67 '0': 'OR',
68 68 '1': 'XOR',
69 69 '2': 'AND',
70 70 '3': 'NAND',
71 71 }
72 72
73 73 def index(request):
74 74 kwargs = {'no_sidebar':True}
75 75
76 76 return render(request, 'index.html', kwargs)
77 77
78 78
79 79 def locations(request):
80 80
81 81 page = request.GET.get('page')
82 82 order = ('name',)
83 83
84 84 kwargs = get_paginator(Location, page, order)
85 85
86 86 kwargs['keys'] = ['name', 'description']
87 87 kwargs['title'] = 'Radar System'
88 88 kwargs['suptitle'] = 'List'
89 89 kwargs['no_sidebar'] = True
90 90
91 91 return render(request, 'base_list.html', kwargs)
92 92
93 93
94 94 def location(request, id_loc):
95 95
96 96 location = get_object_or_404(Location, pk=id_loc)
97 97
98 98 kwargs = {}
99 99 kwargs['location'] = location
100 100 kwargs['location_keys'] = ['name', 'description']
101 101
102 102 kwargs['title'] = 'Location'
103 103 kwargs['suptitle'] = 'Details'
104 104
105 105 return render(request, 'location.html', kwargs)
106 106
107 107
108 108 @user_passes_test(lambda u:u.is_staff)
109 109 def location_new(request):
110 110
111 111 if request.method == 'GET':
112 112 form = LocationForm()
113 113
114 114 if request.method == 'POST':
115 115 form = LocationForm(request.POST)
116 116
117 117 if form.is_valid():
118 118 form.save()
119 119 return redirect('url_locations')
120 120
121 121 kwargs = {}
122 122 kwargs['form'] = form
123 123 kwargs['title'] = 'Radar System'
124 124 kwargs['suptitle'] = 'New'
125 125 kwargs['button'] = 'Create'
126 126
127 127 return render(request, 'base_edit.html', kwargs)
128 128
129 129
130 130 @user_passes_test(lambda u:u.is_staff)
131 131 def location_edit(request, id_loc):
132 132
133 133 location = get_object_or_404(Location, pk=id_loc)
134 134
135 135 if request.method=='GET':
136 136 form = LocationForm(instance=location)
137 137
138 138 if request.method=='POST':
139 139 form = LocationForm(request.POST, instance=location)
140 140
141 141 if form.is_valid():
142 142 form.save()
143 143 return redirect('url_locations')
144 144
145 145 kwargs = {}
146 146 kwargs['form'] = form
147 147 kwargs['title'] = 'Location'
148 148 kwargs['suptitle'] = 'Edit'
149 149 kwargs['button'] = 'Update'
150 150
151 151 return render(request, 'base_edit.html', kwargs)
152 152
153 153
154 154 @user_passes_test(lambda u:u.is_staff)
155 155 def location_delete(request, id_loc):
156 156
157 157 location = get_object_or_404(Location, pk=id_loc)
158 158
159 159 if request.method=='POST':
160 160
161 161 if request.user.is_staff:
162 162 location.delete()
163 163 return redirect('url_locations')
164 164
165 165 messages.error(request, 'Not enough permission to delete this object')
166 166 return redirect(location.get_absolute_url())
167 167
168 168 kwargs = {
169 169 'title': 'Delete',
170 170 'suptitle': 'Location',
171 171 'object': location,
172 172 'previous': location.get_absolute_url(),
173 173 'delete': True
174 174 }
175 175
176 176 return render(request, 'confirm.html', kwargs)
177 177
178 178
179 179 def devices(request):
180 180
181 181 page = request.GET.get('page')
182 182 order = ('device_type', 'name')
183 183
184 184 kwargs = get_paginator(Device, page, order)
185 185 kwargs['keys'] = ['name', 'ip_address', 'port_address', 'device_type']
186 186 kwargs['title'] = 'Device'
187 187 kwargs['suptitle'] = 'List'
188 188 kwargs['no_sidebar'] = True
189 189
190 190 return render(request, 'base_list.html', kwargs)
191 191
192 192
193 193 def device(request, id_dev):
194 194
195 195 device = get_object_or_404(Device, pk=id_dev)
196 196
197 197 kwargs = {}
198 198 kwargs['device'] = device
199 199 kwargs['device_keys'] = ['device_type', 'name', 'ip_address', 'port_address', 'description']
200 200
201 201 kwargs['title'] = 'Device'
202 202 kwargs['suptitle'] = 'Details'
203 203
204 204 return render(request, 'device.html', kwargs)
205 205
206 206
207 207 @user_passes_test(lambda u:u.is_staff)
208 208 def device_new(request):
209 209
210 210 if request.method == 'GET':
211 211 form = DeviceForm()
212 212
213 213 if request.method == 'POST':
214 214 form = DeviceForm(request.POST)
215 215
216 216 if form.is_valid():
217 217 form.save()
218 218 return redirect('url_devices')
219 219
220 220 kwargs = {}
221 221 kwargs['form'] = form
222 222 kwargs['title'] = 'Device'
223 223 kwargs['suptitle'] = 'New'
224 224 kwargs['button'] = 'Create'
225 225
226 226 return render(request, 'base_edit.html', kwargs)
227 227
228 228
229 229 @user_passes_test(lambda u:u.is_staff)
230 230 def device_edit(request, id_dev):
231 231
232 232 device = get_object_or_404(Device, pk=id_dev)
233 233
234 234 if request.method=='GET':
235 235 form = DeviceForm(instance=device)
236 236
237 237 if request.method=='POST':
238 238 form = DeviceForm(request.POST, instance=device)
239 239
240 240 if form.is_valid():
241 241 form.save()
242 242 return redirect(device.get_absolute_url())
243 243
244 244 kwargs = {}
245 245 kwargs['form'] = form
246 246 kwargs['title'] = 'Device'
247 247 kwargs['suptitle'] = 'Edit'
248 248 kwargs['button'] = 'Update'
249 249
250 250 return render(request, 'base_edit.html', kwargs)
251 251
252 252
253 253 @user_passes_test(lambda u:u.is_staff)
254 254 def device_delete(request, id_dev):
255 255
256 256 device = get_object_or_404(Device, pk=id_dev)
257 257
258 258 if request.method=='POST':
259 259
260 260 if request.user.is_staff:
261 261 device.delete()
262 262 return redirect('url_devices')
263 263
264 264 messages.error(request, 'Not enough permission to delete this object')
265 265 return redirect(device.get_absolute_url())
266 266
267 267 kwargs = {
268 268 'title': 'Delete',
269 269 'suptitle': 'Device',
270 270 'object': device,
271 271 'previous': device.get_absolute_url(),
272 272 'delete': True
273 273 }
274 274
275 275 return render(request, 'confirm.html', kwargs)
276 276
277 277
278 278 @user_passes_test(lambda u:u.is_staff)
279 279 def device_change_ip(request, id_dev):
280 280
281 281 device = get_object_or_404(Device, pk=id_dev)
282 282
283 283 if request.method=='POST':
284 284
285 285 if request.user.is_staff:
286 286 device.change_ip(**request.POST.dict())
287 287 level, message = device.message.split('|')
288 288 messages.add_message(request, level, message)
289 289 else:
290 290 messages.error(request, 'Not enough permission to delete this object')
291 291 return redirect(device.get_absolute_url())
292 292
293 293 kwargs = {
294 294 'title': 'Device',
295 295 'suptitle': 'Change IP',
296 296 'object': device,
297 297 'previous': device.get_absolute_url(),
298 298 'form': ChangeIpForm(initial={'ip_address':device.ip_address}),
299 299 'message' : ' ',
300 300 }
301 301
302 302 return render(request, 'confirm.html', kwargs)
303 303
304 304
305 305 def campaigns(request):
306 306
307 307 page = request.GET.get('page')
308 308 order = ('start_date',)
309 309 filters = request.GET.copy()
310 310
311 311 kwargs = get_paginator(Campaign, page, order, filters)
312 312
313 313 form = FilterForm(initial=request.GET, extra_fields=['range_date', 'tags','template'])
314 314 kwargs['keys'] = ['name', 'start_date', 'end_date']
315 315 kwargs['title'] = 'Campaign'
316 316 kwargs['suptitle'] = 'List'
317 317 kwargs['no_sidebar'] = True
318 318 kwargs['form'] = form
319 319 filters.pop('page', None)
320 320 kwargs['q'] = urlencode(filters)
321 321
322 322 return render(request, 'base_list.html', kwargs)
323 323
324 324
325 325 def campaign(request, id_camp):
326 326
327 327 campaign = get_object_or_404(Campaign, pk=id_camp)
328 328 experiments = Experiment.objects.filter(campaign=campaign)
329 329
330 330 form = CampaignForm(instance=campaign)
331 331
332 332 kwargs = {}
333 333 kwargs['campaign'] = campaign
334 334 kwargs['campaign_keys'] = ['template', 'name', 'start_date', 'end_date', 'tags', 'description']
335 335
336 336 kwargs['experiments'] = experiments
337 337 kwargs['experiment_keys'] = ['name', 'radar_system', 'start_time', 'end_time']
338 338
339 339 kwargs['title'] = 'Campaign'
340 340 kwargs['suptitle'] = 'Details'
341 341
342 342 kwargs['form'] = form
343 343 kwargs['button'] = 'Add Experiment'
344 344
345 345 return render(request, 'campaign.html', kwargs)
346 346
347 347
348 348 @user_passes_test(lambda u:u.is_staff)
349 349 def campaign_new(request):
350 350
351 351 kwargs = {}
352 352
353 353 if request.method == 'GET':
354 354
355 355 if 'template' in request.GET:
356 356 if request.GET['template']=='0':
357 357 form = NewForm(initial={'create_from':2},
358 358 template_choices=Campaign.objects.filter(template=True).values_list('id', 'name'))
359 359 else:
360 360 kwargs['button'] = 'Create'
361 361 kwargs['experiments'] = Configuration.objects.filter(experiment=request.GET['template'])
362 362 kwargs['experiment_keys'] = ['name', 'start_time', 'end_time']
363 363 camp = Campaign.objects.get(pk=request.GET['template'])
364 364 form = CampaignForm(instance=camp,
365 365 initial={'name':'{} [{:%Y/%m/%d}]'.format(camp.name, datetime.now()),
366 366 'template':False})
367 367 elif 'blank' in request.GET:
368 368 kwargs['button'] = 'Create'
369 369 form = CampaignForm()
370 370 else:
371 371 form = NewForm()
372 372
373 373 if request.method == 'POST':
374 374 kwargs['button'] = 'Create'
375 375 post = request.POST.copy()
376 376 experiments = []
377 377
378 378 for id_exp in post.getlist('experiments'):
379 379 exp = Experiment.objects.get(pk=id_exp)
380 380 new_exp = exp.clone(template=False)
381 381 experiments.append(new_exp)
382 382
383 383 post.setlist('experiments', [])
384 384
385 385 form = CampaignForm(post)
386 386
387 387 if form.is_valid():
388 388 campaign = form.save()
389 389 for exp in experiments:
390 390 campaign.experiments.add(exp)
391 391 campaign.save()
392 392 return redirect('url_campaign', id_camp=campaign.id)
393 393
394 394 kwargs['form'] = form
395 395 kwargs['title'] = 'Campaign'
396 396 kwargs['suptitle'] = 'New'
397 397
398 398 return render(request, 'campaign_edit.html', kwargs)
399 399
400 400
401 401 @user_passes_test(lambda u:u.is_staff)
402 402 def campaign_edit(request, id_camp):
403 403
404 404 campaign = get_object_or_404(Campaign, pk=id_camp)
405 405
406 406 if request.method=='GET':
407 407 form = CampaignForm(instance=campaign)
408 408
409 409 if request.method=='POST':
410 410 exps = campaign.experiments.all().values_list('pk', flat=True)
411 411 post = request.POST.copy()
412 412 new_exps = post.getlist('experiments')
413 413 post.setlist('experiments', [])
414 414 form = CampaignForm(post, instance=campaign)
415 415
416 416 if form.is_valid():
417 417 camp = form.save()
418 418 for id_exp in new_exps:
419 419 if int(id_exp) in exps:
420 420 exps.pop(id_exp)
421 421 else:
422 422 exp = Experiment.objects.get(pk=id_exp)
423 423 if exp.template:
424 424 camp.experiments.add(exp.clone(template=False))
425 425 else:
426 426 camp.experiments.add(exp)
427 427
428 428 for id_exp in exps:
429 429 camp.experiments.remove(Experiment.objects.get(pk=id_exp))
430 430
431 431 return redirect('url_campaign', id_camp=id_camp)
432 432
433 433 kwargs = {}
434 434 kwargs['form'] = form
435 435 kwargs['title'] = 'Campaign'
436 436 kwargs['suptitle'] = 'Edit'
437 437 kwargs['button'] = 'Update'
438 438
439 439 return render(request, 'campaign_edit.html', kwargs)
440 440
441 441
442 442 @user_passes_test(lambda u:u.is_staff)
443 443 def campaign_delete(request, id_camp):
444 444
445 445 campaign = get_object_or_404(Campaign, pk=id_camp)
446 446
447 447 if request.method=='POST':
448 448 if request.user.is_staff:
449 449
450 450 for exp in campaign.experiments.all():
451 451 for conf in Configuration.objects.filter(experiment=exp):
452 452 conf.delete()
453 453 exp.delete()
454 454 campaign.delete()
455 455
456 456 return redirect('url_campaigns')
457 457
458 458 messages.error(request, 'Not enough permission to delete this object')
459 459 return redirect(campaign.get_absolute_url())
460 460
461 461 kwargs = {
462 462 'title': 'Delete',
463 463 'suptitle': 'Campaign',
464 464 'object': campaign,
465 465 'previous': campaign.get_absolute_url(),
466 466 'delete': True
467 467 }
468 468
469 469 return render(request, 'confirm.html', kwargs)
470 470
471 471
472 472 @user_passes_test(lambda u:u.is_staff)
473 473 def campaign_export(request, id_camp):
474 474
475 475 campaign = get_object_or_404(Campaign, pk=id_camp)
476 476 content = campaign.parms_to_dict()
477 477 content_type = 'application/json'
478 478 filename = '%s_%s.json' %(campaign.name, campaign.id)
479 479
480 480 response = HttpResponse(content_type=content_type)
481 481 response['Content-Disposition'] = 'attachment; filename="%s"' %filename
482 482 response.write(content)
483 483
484 484 return response
485 485
486 486
487 487 @user_passes_test(lambda u:u.is_staff)
488 488 def campaign_import(request, id_camp):
489 489
490 490 campaign = get_object_or_404(Campaign, pk=id_camp)
491 491
492 492 if request.method == 'GET':
493 493 file_form = UploadFileForm()
494 494
495 495 if request.method == 'POST':
496 496 file_form = UploadFileForm(request.POST, request.FILES)
497 497
498 498 if file_form.is_valid():
499 499
500 500 parms = campaign.import_from_file(request.FILES['file'])
501 501
502 502 if parms:
503 503 parms['name'] = parms['campaign']
504 504
505 505 new_camp = campaign.dict_to_parms(parms, CONF_MODELS)
506 506
507 507 messages.success(request, "Parameters imported from: '%s'." %request.FILES['file'].name)
508 508
509 509 return redirect(new_camp.get_absolute_url_edit())
510 510
511 511 messages.error(request, "Could not import parameters from file")
512 512
513 513 kwargs = {}
514 514 kwargs['title'] = 'Campaign'
515 515 kwargs['form'] = file_form
516 516 kwargs['suptitle'] = 'Importing file'
517 517 kwargs['button'] = 'Import'
518 518
519 519 return render(request, 'campaign_import.html', kwargs)
520 520
521 521
522 522 def experiments(request):
523 523
524 524 page = request.GET.get('page')
525 525 order = ('location',)
526 526 filters = request.GET.copy()
527 527
528 528 kwargs = get_paginator(Experiment, page, order, filters)
529 529
530 530 form = FilterForm(initial=request.GET, extra_fields=['tags','template'])
531 531
532 532 kwargs['keys'] = ['name', 'radar_system', 'start_time', 'end_time']
533 533 kwargs['title'] = 'Experiment'
534 534 kwargs['suptitle'] = 'List'
535 535 kwargs['no_sidebar'] = True
536 536 kwargs['form'] = form
537 537 filters.pop('page', None)
538 538 kwargs['q'] = urlencode(filters)
539 539
540 540 return render(request, 'base_list.html', kwargs)
541 541
542 542
543 543 def experiment(request, id_exp):
544 544
545 545 experiment = get_object_or_404(Experiment, pk=id_exp)
546 546 experiment.get_status()
547 547 configurations = Configuration.objects.filter(experiment=experiment, type=0)
548 548
549 549 kwargs = {}
550 550
551 551 kwargs['experiment_keys'] = ['radar_system', 'name', 'start_time', 'end_time']
552 552 kwargs['experiment'] = experiment
553 553
554 554 kwargs['configuration_keys'] = ['name', 'device__ip_address', 'device__port_address', 'device__status']
555 555 kwargs['configurations'] = configurations
556 556
557 557 kwargs['title'] = 'Experiment'
558 558 kwargs['suptitle'] = 'Details'
559 559
560 560 kwargs['button'] = 'Add Configuration'
561 561
562 562 ###### SIDEBAR ######
563 563 kwargs.update(sidebar(experiment=experiment))
564 564
565 565 return render(request, 'experiment.html', kwargs)
566 566
567 567
568 568 @user_passes_test(lambda u:u.is_staff)
569 569 def experiment_new(request, id_camp=None):
570 570
571 571 kwargs = {}
572 572
573 573 if request.method == 'GET':
574 574 if 'template' in request.GET:
575 575 if request.GET['template']=='0':
576 576 form = NewForm(initial={'create_from':2},
577 577 template_choices=Experiment.objects.filter(template=True).values_list('id', 'name'))
578 578 else:
579 579 kwargs['button'] = 'Create'
580 580 kwargs['configurations'] = Configuration.objects.filter(experiment=request.GET['template'])
581 581 kwargs['configuration_keys'] = ['name', 'device__name', 'device__ip_address', 'device__port_address']
582 582 exp=Experiment.objects.get(pk=request.GET['template'])
583 583 form = ExperimentForm(instance=exp,
584 584 initial={'name': '{} [{:%Y/%m/%d}]'.format(exp.name, datetime.now()),
585 585 'template': False})
586 586 elif 'blank' in request.GET:
587 587 kwargs['button'] = 'Create'
588 588 form = ExperimentForm()
589 589 else:
590 590 form = NewForm()
591 591
592 592 if request.method == 'POST':
593 593 form = ExperimentForm(request.POST)
594 594 if form.is_valid():
595 595 experiment = form.save()
596 596
597 597 if 'template' in request.GET:
598 598 configurations = Configuration.objects.filter(experiment=request.GET['template'], type=0)
599 599 for conf in configurations:
600 600 conf.clone(experiment=experiment, template=False)
601 601
602 602 return redirect('url_experiment', id_exp=experiment.id)
603 603
604 604 kwargs['form'] = form
605 605 kwargs['title'] = 'Experiment'
606 606 kwargs['suptitle'] = 'New'
607 607
608 608 return render(request, 'experiment_edit.html', kwargs)
609 609
610 610
611 611 @user_passes_test(lambda u:u.is_staff)
612 612 def experiment_edit(request, id_exp):
613 613
614 614 experiment = get_object_or_404(Experiment, pk=id_exp)
615 615
616 616 if request.method == 'GET':
617 617 form = ExperimentForm(instance=experiment)
618 618
619 619 if request.method=='POST':
620 620 form = ExperimentForm(request.POST, instance=experiment)
621 621
622 622 if form.is_valid():
623 623 experiment = form.save()
624 624 return redirect('url_experiment', id_exp=experiment.id)
625 625
626 626 kwargs = {}
627 627 kwargs['form'] = form
628 628 kwargs['title'] = 'Experiment'
629 629 kwargs['suptitle'] = 'Edit'
630 630 kwargs['button'] = 'Update'
631 631
632 632 return render(request, 'experiment_edit.html', kwargs)
633 633
634 634
635 635 @user_passes_test(lambda u:u.is_staff)
636 636 def experiment_delete(request, id_exp):
637 637
638 638 experiment = get_object_or_404(Experiment, pk=id_exp)
639 639
640 640 if request.method=='POST':
641 641 if request.user.is_staff:
642 642 for conf in Configuration.objects.filter(experiment=experiment):
643 643 conf.delete()
644 644 experiment.delete()
645 645 return redirect('url_experiments')
646 646
647 647 messages.error(request, 'Not enough permission to delete this object')
648 648 return redirect(experiment.get_absolute_url())
649 649
650 650 kwargs = {
651 651 'title': 'Delete',
652 652 'suptitle': 'Experiment',
653 653 'object': experiment,
654 654 'previous': experiment.get_absolute_url(),
655 655 'delete': True
656 656 }
657 657
658 658 return render(request, 'confirm.html', kwargs)
659 659
660 660
661 661 @user_passes_test(lambda u:u.is_staff)
662 662 def experiment_export(request, id_exp):
663 663
664 664 experiment = get_object_or_404(Experiment, pk=id_exp)
665 665 content = experiment.parms_to_dict()
666 666 content_type = 'application/json'
667 667 filename = '%s_%s.json' %(experiment.name, experiment.id)
668 668
669 669 response = HttpResponse(content_type=content_type)
670 670 response['Content-Disposition'] = 'attachment; filename="%s"' %filename
671 671 response.write(content)
672 672
673 673 return response
674 674
675 675
676 676 @user_passes_test(lambda u:u.is_staff)
677 677 def experiment_import(request, id_exp):
678 678
679 679 experiment = get_object_or_404(Experiment, pk=id_exp)
680 680 configurations = Configuration.objects.filter(experiment=experiment)
681 681
682 682 if request.method == 'GET':
683 683 file_form = UploadFileForm()
684 684
685 685 if request.method == 'POST':
686 686 file_form = UploadFileForm(request.POST, request.FILES)
687 687
688 688 if file_form.is_valid():
689 689
690 690 parms = experiment.import_from_file(request.FILES['file'])
691 691
692 692 if parms:
693 693
694 694 new_exp = experiment.dict_to_parms(parms, CONF_MODELS)
695 695
696 696 if new_exp.__class__.__name__=='dict':
697 697 messages.error(request, new_exp['Error'] )
698 698 return redirect(experiment.get_absolute_url_import())
699 699
700 700 messages.success(request, "Parameters imported from: '%s'." %request.FILES['file'].name)
701 701
702 702 return redirect(new_exp.get_absolute_url_edit())
703 703
704 704 messages.error(request, "Could not import parameters from file")
705 705
706 706 kwargs = {}
707 707 kwargs['title'] = 'Experiment'
708 708 kwargs['form'] = file_form
709 709 kwargs['suptitle'] = 'Importing file'
710 710 kwargs['button'] = 'Import'
711 711
712 712 kwargs.update(sidebar(experiment=experiment))
713 713
714 714 return render(request, 'experiment_import.html', kwargs)
715 715
716 716
717 717 @user_passes_test(lambda u:u.is_staff)
718 718 def experiment_start(request, id_exp):
719 719
720 720 exp = get_object_or_404(Experiment, pk=id_exp)
721 721
722 722 if exp.status == 2:
723 723 messages.warning(request, 'Experiment {} already running'.format(exp))
724 724
725 725 elif exp.status == 3:
726 726 messages.warning(request, 'Experiment {} already programmed'.format(exp))
727 727
728 if not (exp.start_time < datetime.now().time() < exp.end_time):
729 exp.status==1
730 exp.save()
731 messages.warning(request, 'Experiment {} is out of time'.format(exp))
732 return redirect(exp.get_absolute_url())
733
728 734 else:
729 735 task = task_start.delay(exp.pk)
730 736 exp.status = task.wait()
731 737 if exp.status==0:
732 738 messages.error(request, 'Experiment {} not start'.format(exp))
733 739 if exp.status==2:
734 740 messages.success(request, 'Experiment {} started'.format(exp))
735 741
736 742 exp.save()
737 743
738 744 return redirect(exp.get_absolute_url())
739 745
740 746
741 747 @user_passes_test(lambda u:u.is_staff)
742 748 def experiment_stop(request, id_exp):
743 749
744 750 exp = get_object_or_404(Experiment, pk=id_exp)
745 751
746 752 if exp.status == 2:
747 753 task = task_stop.delay(exp.pk)
748 754 exp.status = task.wait()
749 755 messages.warning(request, 'Experiment {} stopped'.format(exp))
750 756 exp.save()
751 757 else:
752 758 messages.error(request, 'Experiment {} not running'.format(exp))
753 759
754 760 return redirect(exp.get_absolute_url())
755 761
756 762
757 763 @user_passes_test(lambda u:u.is_staff)
758 764 def experiment_mix(request, id_exp):
759 765
760 766 experiment = get_object_or_404(Experiment, pk=id_exp)
761 767 rc_confs = [conf for conf in RCConfiguration.objects.filter(experiment=id_exp,
762 768 mix=False)]
763 769
764 770 if len(rc_confs)<2:
765 771 messages.warning(request, 'You need at least two RC Configurations to make a mix')
766 772 return redirect(experiment.get_absolute_url())
767 773
768 774 mix_confs = RCConfiguration.objects.filter(experiment=id_exp, mix=True)
769 775
770 776 if mix_confs:
771 777 mix = mix_confs[0]
772 778 else:
773 779 mix = RCConfiguration(experiment=experiment,
774 780 device=rc_confs[0].device,
775 781 ipp=rc_confs[0].ipp,
776 782 clock_in=rc_confs[0].clock_in,
777 783 clock_divider=rc_confs[0].clock_divider,
778 784 mix=True,
779 785 parameters='')
780 786 mix.save()
781 787
782 788 line_type = RCLineType.objects.get(name='mix')
783 789 for i in range(len(rc_confs[0].get_lines())):
784 790 line = RCLine(rc_configuration=mix, line_type=line_type, channel=i)
785 791 line.save()
786 792
787 793 initial = {'name': mix.name,
788 794 'result': parse_mix_result(mix.parameters),
789 795 'delay': 0,
790 796 'mask': [0,1,2,3,4,5,6,7]
791 797 }
792 798
793 799 if request.method=='GET':
794 800 form = RCMixConfigurationForm(confs=rc_confs, initial=initial)
795 801
796 802 if request.method=='POST':
797 803 result = mix.parameters
798 804
799 805 if '{}|'.format(request.POST['experiment']) in result:
800 806 messages.error(request, 'Configuration already added')
801 807 else:
802 808 if 'operation' in request.POST:
803 809 operation = MIX_OPERATIONS[request.POST['operation']]
804 810 else:
805 811 operation = ' '
806 812
807 813 mode = MIX_MODES[request.POST['mode']]
808 814
809 815 if result:
810 816 result = '{}-{}|{}|{}|{}|{}'.format(mix.parameters,
811 817 request.POST['experiment'],
812 818 mode,
813 819 operation,
814 820 float(request.POST['delay']),
815 821 parse_mask(request.POST.getlist('mask'))
816 822 )
817 823 else:
818 824 result = '{}|{}|{}|{}|{}'.format(request.POST['experiment'],
819 825 mode,
820 826 operation,
821 827 float(request.POST['delay']),
822 828 parse_mask(request.POST.getlist('mask'))
823 829 )
824 830
825 831 mix.parameters = result
826 832 mix.name = request.POST['name']
827 833 mix.save()
828 834 mix.update_pulses()
829 835
830 836 initial['result'] = parse_mix_result(result)
831 837 initial['name'] = mix.name
832 838
833 839 form = RCMixConfigurationForm(initial=initial, confs=rc_confs)
834 840
835 841
836 842 kwargs = {
837 843 'title': 'Experiment',
838 844 'suptitle': 'Mix Configurations',
839 845 'form' : form,
840 846 'extra_button': 'Delete',
841 847 'button': 'Add',
842 848 'cancel': 'Back',
843 849 'previous': experiment.get_absolute_url(),
844 850 'id_exp':id_exp,
845 851
846 852 }
847 853
848 854 return render(request, 'experiment_mix.html', kwargs)
849 855
850 856
851 857 @user_passes_test(lambda u:u.is_staff)
852 858 def experiment_mix_delete(request, id_exp):
853 859
854 860 conf = RCConfiguration.objects.get(experiment=id_exp, mix=True)
855 861 values = conf.parameters.split('-')
856 862 conf.parameters = '-'.join(values[:-1])
857 863 conf.save()
858 864
859 865 return redirect('url_mix_experiment', id_exp=id_exp)
860 866
861 867
862 868 def experiment_summary(request, id_exp):
863 869
864 870 experiment = get_object_or_404(Experiment, pk=id_exp)
865 871 configurations = Configuration.objects.filter(experiment=experiment, type=0)
866 872
867 873 kwargs = {}
868 874
869 875 kwargs['experiment_keys'] = ['radar_system', 'name', 'start_time', 'end_time']
870 876 kwargs['experiment'] = experiment
871 877
872 878 kwargs['configurations'] = []
873 879
874 880 kwargs['title'] = 'Experiment Summary'
875 881 kwargs['suptitle'] = 'Details'
876 882
877 883 kwargs['button'] = 'Verify Parameters'
878 884
879 885 jars_conf = False
880 886 rc_conf = False
881 887
882 888 for configuration in configurations:
883 889
884 890 #--------------------- RC ----------------------:
885 891 if configuration.device.device_type.name == 'rc':
886 892 if configuration.mix:
887 893 continue
888 894 rc_conf = True
889 895 ipp = configuration.ipp
890 896 lines = configuration.get_lines(line_type__name='tx')
891 897 configuration.tx_lines = []
892 898
893 899 for tx_line in lines:
894 900 line = {'name':tx_line.get_name()}
895 901 tx_params = json.loads(tx_line.params)
896 902 line['width'] = tx_params['pulse_width']
897 903 if line['width'] in (0, '0'):
898 904 continue
899 905 delays = tx_params['delays']
900 906
901 907 if delays not in ('', '0'):
902 908 n = len(delays.split(','))
903 909 line['taus'] = '{} Taus: {}'.format(n, delays)
904 910 else:
905 911 line['taus'] = '-'
906 912
907 913 for code_line in configuration.get_lines(line_type__name='codes'):
908 914 code_params = json.loads(code_line.params)
909 915 if tx_line.pk==int(code_params['TX_ref']):
910 916 line['codes'] = '{}:{}'.format(RCLineCode.objects.get(pk=code_params['code']),
911 917 '-'.join(code_params['codes']))
912 918
913 919 for windows_line in configuration.get_lines(line_type__name='windows'):
914 920 win_params = json.loads(windows_line.params)
915 921 if tx_line.pk==int(win_params['TX_ref']):
916 922 windows = ''
917 923 for i, params in enumerate(win_params['params']):
918 924 windows += 'W{}: Ho={first_height} km DH={resolution} km NSA={number_of_samples}<br>'.format(i, **params)
919 925 line['windows'] = mark_safe(windows)
920 926
921 927 configuration.tx_lines.append(line)
922 928
923 929 #-------------------- JARS -----------------------:
924 930 if configuration.device.device_type.name == 'jars':
925 931 jars_conf = True
926 932 kwargs['exp_type'] = EXPERIMENT_TYPE[configuration.exp_type][1]
927 933 channels_number = configuration.channels_number
928 934 exp_type = configuration.exp_type
929 935 fftpoints = configuration.fftpoints
930 936 filter_parms = configuration.filter_parms
931 937 filter_parms = ast.literal_eval(filter_parms)
932 938 spectral_number = configuration.spectral_number
933 939
934 940
935 941 kwargs['configurations'].append(configuration)
936 942
937 943
938 944 #------ RC & JARS ------:
939 945 ipp = 937.5 #
940 946 nsa = 200#
941 947 dh = 1.5 #
942 948 channels_number = 5 #
943 949
944 950 if rc_conf and jars_conf:
945 951 if exp_type == 0: #Short
946 952 bytes = 2
947 953 b = nsa*2*bytes*channels_number
948 954 else: #Float
949 955 bytes = 4
950 956 channels = channels_number + spectral_number
951 957 b = nsa*2*bytes*fftpoints*channels
952 958
953 959 ipps = (ipp*pow(10,-6))/0.15
954 960 GB = 1048576.0*1024.0
955 961 Hour = 3600
956 962 rate = b/ipps
957 963 rate = rate *(1/GB)*(Hour)
958 964 kwargs['rate'] = str(rate)+" GB/h"
959 965 else:
960 966 kwargs['rate'] = ''
961 967
962 968 ###### SIDEBAR ######
963 969 kwargs.update(sidebar(experiment=experiment))
964 970
965 971 return render(request, 'experiment_summary.html', kwargs)
966 972
967 973
968 974 @user_passes_test(lambda u:u.is_staff)
969 975 def experiment_verify(request, id_exp):
970 976
971 977 experiment = get_object_or_404(Experiment, pk=id_exp)
972 978 experiment_data = json.loads(experiment.parms_to_dict())
973 979 configurations = Configuration.objects.filter(experiment=experiment, type=0)
974 980
975 981 kwargs = {}
976 982
977 983 kwargs['experiment_keys'] = ['template', 'radar_system', 'name', 'start_time', 'end_time']
978 984 kwargs['experiment'] = experiment
979 985
980 986 kwargs['configuration_keys'] = ['name', 'device__ip_address', 'device__port_address', 'device__status']
981 987 kwargs['configurations'] = configurations
982 988 kwargs['experiment_data'] = experiment_data
983 989
984 990 kwargs['title'] = 'Verify Experiment'
985 991 kwargs['suptitle'] = 'Parameters'
986 992
987 993 kwargs['button'] = 'Update'
988 994
989 995 jars_conf = False
990 996 rc_conf = False
991 997 dds_conf = False
992 998
993 999 for configuration in configurations:
994 1000 #-------------------- JARS -----------------------:
995 1001 if configuration.device.device_type.name == 'jars':
996 1002 jars_conf = True
997 1003 jars = configuration
998 1004 kwargs['jars_conf'] = jars_conf
999 1005 filter_parms = configuration.filter_parms
1000 1006 filter_parms = ast.literal_eval(filter_parms)
1001 1007 kwargs['filter_parms'] = filter_parms
1002 1008 #--Sampling Frequency
1003 1009 clock = filter_parms['clock']
1004 1010 filter_2 = filter_parms['filter_2']
1005 1011 filter_5 = filter_parms['filter_5']
1006 1012 filter_fir = filter_parms['filter_fir']
1007 1013 samp_freq_jars = clock/filter_2/filter_5/filter_fir
1008 1014
1009 1015 kwargs['samp_freq_jars'] = samp_freq_jars
1010 1016 kwargs['jars'] = configuration
1011 1017
1012 1018 #--------------------- RC ----------------------:
1013 1019 if configuration.device.device_type.name == 'rc' and not configuration.mix:
1014 1020 rc_conf = True
1015 1021 rc = configuration
1016 1022
1017 1023 rc_parms = configuration.parms_to_dict()
1018 1024
1019 1025 win_lines = rc.get_lines(line_type__name='windows')
1020 1026 if win_lines:
1021 1027 dh = json.loads(win_lines[0].params)['params'][0]['resolution']
1022 1028 #--Sampling Frequency
1023 1029 samp_freq_rc = 0.15/dh
1024 1030 kwargs['samp_freq_rc'] = samp_freq_rc
1025 1031
1026 1032 kwargs['rc_conf'] = rc_conf
1027 1033 kwargs['rc'] = configuration
1028 1034
1029 1035 #-------------------- DDS ----------------------:
1030 1036 if configuration.device.device_type.name == 'dds':
1031 1037 dds_conf = True
1032 1038 dds = configuration
1033 1039 dds_parms = configuration.parms_to_dict()
1034 1040
1035 1041 kwargs['dds_conf'] = dds_conf
1036 1042 kwargs['dds'] = configuration
1037 1043
1038 1044
1039 1045 #------------Validation------------:
1040 1046 #Clock
1041 1047 if dds_conf and rc_conf and jars_conf:
1042 1048 if float(filter_parms['clock']) != float(rc_parms['clock_in']) and float(rc_parms['clock_in']) != float(dds_parms['clock']):
1043 1049 messages.warning(request, "Devices don't have the same clock.")
1044 1050 elif rc_conf and jars_conf:
1045 1051 if float(filter_parms['clock']) != float(rc_parms['clock_in']):
1046 1052 messages.warning(request, "Devices don't have the same clock.")
1047 1053 elif rc_conf and dds_conf:
1048 1054 if float(rc_parms['clock_in']) != float(dds_parms['clock']):
1049 1055 messages.warning(request, "Devices don't have the same clock.")
1050 1056 if float(samp_freq_rc) != float(dds_parms['frequencyA']):
1051 1057 messages.warning(request, "Devices don't have the same Frequency A.")
1052 1058
1053 1059
1054 1060 #------------POST METHOD------------:
1055 1061 if request.method == 'POST':
1056 1062 if request.POST['suggest_clock']:
1057 1063 try:
1058 1064 suggest_clock = float(request.POST['suggest_clock'])
1059 1065 except:
1060 1066 messages.warning(request, "Invalid value in CLOCK IN.")
1061 1067 return redirect('url_verify_experiment', id_exp=experiment.id)
1062 1068 else:
1063 1069 suggest_clock = ""
1064 1070 if suggest_clock:
1065 1071 if rc_conf:
1066 1072 rc.clock_in = suggest_clock
1067 1073 rc.save()
1068 1074 if jars_conf:
1069 1075 filter_parms = jars.filter_parms
1070 1076 filter_parms = ast.literal_eval(filter_parms)
1071 1077 filter_parms['clock'] = suggest_clock
1072 1078 jars.filter_parms = json.dumps(filter_parms)
1073 1079 jars.save()
1074 1080 kwargs['filter_parms'] = filter_parms
1075 1081 if dds_conf:
1076 1082 dds.clock = suggest_clock
1077 1083 dds.save()
1078 1084
1079 1085 if request.POST['suggest_frequencyA']:
1080 1086 try:
1081 1087 suggest_frequencyA = float(request.POST['suggest_frequencyA'])
1082 1088 except:
1083 1089 messages.warning(request, "Invalid value in FREQUENCY A.")
1084 1090 return redirect('url_verify_experiment', id_exp=experiment.id)
1085 1091 else:
1086 1092 suggest_frequencyA = ""
1087 1093 if suggest_frequencyA:
1088 1094 if jars_conf:
1089 1095 filter_parms = jars.filter_parms
1090 1096 filter_parms = ast.literal_eval(filter_parms)
1091 1097 filter_parms['fch'] = suggest_frequencyA
1092 1098 jars.filter_parms = json.dumps(filter_parms)
1093 1099 jars.save()
1094 1100 kwargs['filter_parms'] = filter_parms
1095 1101 if dds_conf:
1096 1102 dds.frequencyA_Mhz = request.POST['suggest_frequencyA']
1097 1103 dds.save()
1098 1104
1099 1105 ###### SIDEBAR ######
1100 1106 kwargs.update(sidebar(experiment=experiment))
1101 1107
1102 1108
1103 1109
1104 1110
1105 1111
1106 1112 return render(request, 'experiment_verify.html', kwargs)
1107 1113
1108 1114
1109 1115 #@user_passes_test(lambda u:u.is_staff)
1110 1116 def parse_mix_result(s):
1111 1117
1112 1118 values = s.split('-')
1113 1119 html = 'EXP MOD OPE DELAY MASK\r\n'
1114 1120
1115 1121 if not values or values[0] in ('', ' '):
1116 1122 return mark_safe(html)
1117 1123
1118 1124 for i, value in enumerate(values):
1119 1125 if not value:
1120 1126 continue
1121 1127 pk, mode, operation, delay, mask = value.split('|')
1122 1128 conf = RCConfiguration.objects.get(pk=pk)
1123 1129 if i==0:
1124 1130 html += '{:20.18}{:3}{:4}{:9}km{:>6}\r\n'.format(
1125 1131 conf.name,
1126 1132 mode,
1127 1133 ' ',
1128 1134 delay,
1129 1135 mask)
1130 1136 else:
1131 1137 html += '{:20.18}{:3}{:4}{:9}km{:>6}\r\n'.format(
1132 1138 conf.name,
1133 1139 mode,
1134 1140 operation,
1135 1141 delay,
1136 1142 mask)
1137 1143
1138 1144 return mark_safe(html)
1139 1145
1140 1146 def parse_mask(l):
1141 1147
1142 1148 values = []
1143 1149
1144 1150 for x in range(8):
1145 1151 if '{}'.format(x) in l:
1146 1152 values.append(1)
1147 1153 else:
1148 1154 values.append(0)
1149 1155
1150 1156 values.reverse()
1151 1157
1152 1158 return int(''.join([str(x) for x in values]), 2)
1153 1159
1154 1160
1155 1161 def dev_confs(request):
1156 1162
1157 1163
1158 1164 page = request.GET.get('page')
1159 1165 order = ('type', 'device__device_type', 'experiment')
1160 1166 filters = request.GET.copy()
1161 1167
1162 1168 kwargs = get_paginator(Configuration, page, order, filters)
1163 1169
1164 1170 form = FilterForm(initial=request.GET, extra_fields=['tags','template'])
1165 1171 kwargs['keys'] = ['name', 'experiment', 'type', 'programmed_date']
1166 1172 kwargs['title'] = 'Configuration'
1167 1173 kwargs['suptitle'] = 'List'
1168 1174 kwargs['no_sidebar'] = True
1169 1175 kwargs['form'] = form
1170 1176 filters.pop('page', None)
1171 1177 kwargs['q'] = urlencode(filters)
1172 1178
1173 1179 return render(request, 'base_list.html', kwargs)
1174 1180
1175 1181
1176 1182 def dev_conf(request, id_conf):
1177 1183
1178 1184 conf = get_object_or_404(Configuration, pk=id_conf)
1179 1185
1180 1186 return redirect(conf.get_absolute_url())
1181 1187
1182 1188
1183 1189 @user_passes_test(lambda u:u.is_staff)
1184 1190 def dev_conf_new(request, id_exp=0, id_dev=0):
1185 1191
1186 1192 initial = {}
1187 1193 kwargs = {}
1188 1194
1189 1195 if id_exp!=0:
1190 1196 initial['experiment'] = id_exp
1191 1197
1192 1198 if id_dev!=0:
1193 1199 initial['device'] = id_dev
1194 1200
1195 1201 if request.method == 'GET':
1196 1202
1197 1203 if id_dev:
1198 1204 kwargs['button'] = 'Create'
1199 1205 device = Device.objects.get(pk=id_dev)
1200 1206 DevConfForm = CONF_FORMS[device.device_type.name]
1201 1207 initial['name'] = request.GET['name']
1202 1208 form = DevConfForm(initial=initial)
1203 1209 else:
1204 1210 if 'template' in request.GET:
1205 1211 if request.GET['template']=='0':
1206 1212 choices = [(conf.pk, '{}'.format(conf)) for conf in Configuration.objects.filter(template=True)]
1207 1213 form = NewForm(initial={'create_from':2},
1208 1214 template_choices=choices)
1209 1215 else:
1210 1216 kwargs['button'] = 'Create'
1211 1217 conf = Configuration.objects.get(pk=request.GET['template'])
1212 1218 id_dev = conf.device.pk
1213 1219 DevConfForm = CONF_FORMS[conf.device.device_type.name]
1214 1220 form = DevConfForm(instance=conf,
1215 1221 initial={'name': '{} [{:%Y/%m/%d}]'.format(conf.name, datetime.now()),
1216 1222 'template': False,
1217 1223 'experiment':id_exp})
1218 1224 elif 'blank' in request.GET:
1219 1225 kwargs['button'] = 'Create'
1220 1226 form = ConfigurationForm(initial=initial)
1221 1227 else:
1222 1228 form = NewForm()
1223 1229
1224 1230 if request.method == 'POST':
1225 1231
1226 1232 device = Device.objects.get(pk=request.POST['device'])
1227 1233 DevConfForm = CONF_FORMS[device.device_type.name]
1228 1234
1229 1235 form = DevConfForm(request.POST)
1230 1236 kwargs['button'] = 'Create'
1231 1237 if form.is_valid():
1232 1238 conf = form.save()
1233 1239
1234 1240 if 'template' in request.GET and conf.device.device_type.name=='rc':
1235 1241 lines = RCLine.objects.filter(rc_configuration=request.GET['template'])
1236 1242 for line in lines:
1237 1243 line.clone(rc_configuration=conf)
1238 1244
1239 1245 if conf.device.device_type.name=='jars':
1240 1246 conf.add_parms_to_filter()
1241 1247
1242 1248 return redirect('url_dev_conf', id_conf=conf.pk)
1243 1249
1244 1250 kwargs['id_exp'] = id_exp
1245 1251 kwargs['form'] = form
1246 1252 kwargs['title'] = 'Configuration'
1247 1253 kwargs['suptitle'] = 'New'
1248 1254
1249 1255
1250 1256 if id_dev != 0:
1251 1257 device = Device.objects.get(pk=id_dev)
1252 1258 kwargs['device'] = device.device_type.name
1253 1259
1254 1260 return render(request, 'dev_conf_edit.html', kwargs)
1255 1261
1256 1262
1257 1263 @user_passes_test(lambda u:u.is_staff)
1258 1264 def dev_conf_edit(request, id_conf):
1259 1265
1260 1266 conf = get_object_or_404(Configuration, pk=id_conf)
1261 1267
1262 1268 DevConfForm = CONF_FORMS[conf.device.device_type.name]
1263 1269
1264 1270 if request.method=='GET':
1265 1271 form = DevConfForm(instance=conf)
1266 1272
1267 1273 if request.method=='POST':
1268 1274 form = DevConfForm(request.POST, instance=conf)
1269 1275
1270 1276 if form.is_valid():
1271 1277 form.save()
1272 1278 return redirect('url_dev_conf', id_conf=id_conf)
1273 1279
1274 1280 kwargs = {}
1275 1281 kwargs['form'] = form
1276 1282 kwargs['title'] = 'Device Configuration'
1277 1283 kwargs['suptitle'] = 'Edit'
1278 1284 kwargs['button'] = 'Update'
1279 1285
1280 1286 ###### SIDEBAR ######
1281 1287 kwargs.update(sidebar(conf=conf))
1282 1288
1283 1289 return render(request, '%s_conf_edit.html' % conf.device.device_type.name, kwargs)
1284 1290
1285 1291
1286 1292 @user_passes_test(lambda u:u.is_staff)
1287 1293 def dev_conf_start(request, id_conf):
1288 1294
1289 1295 conf = get_object_or_404(Configuration, pk=id_conf)
1290 1296
1291 1297 if conf.start_device():
1292 1298 messages.success(request, conf.message)
1293 1299 else:
1294 1300 messages.error(request, conf.message)
1295 1301
1296 1302 #conf.status_device()
1297 1303
1298 1304 return redirect(conf.get_absolute_url())
1299 1305
1300 1306
1301 1307 @user_passes_test(lambda u:u.is_staff)
1302 1308 def dev_conf_stop(request, id_conf):
1303 1309
1304 1310 conf = get_object_or_404(Configuration, pk=id_conf)
1305 1311
1306 1312 if conf.stop_device():
1307 1313 messages.success(request, conf.message)
1308 1314 else:
1309 1315 messages.error(request, conf.message)
1310 1316
1311 1317 #conf.status_device()
1312 1318
1313 1319 return redirect(conf.get_absolute_url())
1314 1320
1315 1321
1316 1322 def dev_conf_status(request, id_conf):
1317 1323
1318 1324 conf = get_object_or_404(Configuration, pk=id_conf)
1319 1325
1320 1326 if conf.status_device():
1321 1327 messages.success(request, conf.message)
1322 1328 else:
1323 1329 messages.error(request, conf.message)
1324 1330
1325 1331 return redirect(conf.get_absolute_url())
1326 1332
1327 1333
1328 1334 @user_passes_test(lambda u:u.is_staff)
1329 1335 def dev_conf_write(request, id_conf):
1330 1336
1331 1337 conf = get_object_or_404(Configuration, pk=id_conf)
1332 1338
1333 1339 if conf.write_device():
1334 1340 messages.success(request, conf.message)
1335 1341 conf.clone(type=1, template=False)
1336 1342 else:
1337 1343 messages.error(request, conf.message)
1338 1344
1339 1345 return redirect(conf.get_absolute_url())
1340 1346
1341 1347
1342 1348 @user_passes_test(lambda u:u.is_staff)
1343 1349 def dev_conf_read(request, id_conf):
1344 1350
1345 1351 conf = get_object_or_404(Configuration, pk=id_conf)
1346 1352
1347 1353 DevConfForm = CONF_FORMS[conf.device.device_type.name]
1348 1354
1349 1355 if request.method=='GET':
1350 1356
1351 1357 parms = conf.read_device()
1352 1358 #conf.status_device()
1353 1359
1354 1360 if not parms:
1355 1361 messages.error(request, conf.message)
1356 1362 return redirect(conf.get_absolute_url())
1357 1363
1358 1364 form = DevConfForm(initial=parms, instance=conf)
1359 1365
1360 1366 if request.method=='POST':
1361 1367 form = DevConfForm(request.POST, instance=conf)
1362 1368
1363 1369 if form.is_valid():
1364 1370 form.save()
1365 1371 return redirect(conf.get_absolute_url())
1366 1372
1367 1373 messages.error(request, "Parameters could not be saved")
1368 1374
1369 1375 kwargs = {}
1370 1376 kwargs['id_dev'] = conf.id
1371 1377 kwargs['form'] = form
1372 1378 kwargs['title'] = 'Device Configuration'
1373 1379 kwargs['suptitle'] = 'Parameters read from device'
1374 1380 kwargs['button'] = 'Save'
1375 1381
1376 1382 ###### SIDEBAR ######
1377 1383 kwargs.update(sidebar(conf=conf))
1378 1384
1379 1385 return render(request, '%s_conf_edit.html' %conf.device.device_type.name, kwargs)
1380 1386
1381 1387
1382 1388 @user_passes_test(lambda u:u.is_staff)
1383 1389 def dev_conf_import(request, id_conf):
1384 1390
1385 1391 conf = get_object_or_404(Configuration, pk=id_conf)
1386 1392 DevConfForm = CONF_FORMS[conf.device.device_type.name]
1387 1393
1388 1394 if request.method == 'GET':
1389 1395 file_form = UploadFileForm()
1390 1396
1391 1397 if request.method == 'POST':
1392 1398 file_form = UploadFileForm(request.POST, request.FILES)
1393 1399
1394 1400 if file_form.is_valid():
1395 1401
1396 1402 parms = conf.import_from_file(request.FILES['file'])
1397 1403
1398 1404 if parms:
1399 1405 messages.success(request, "Parameters imported from: '%s'." %request.FILES['file'].name)
1400 1406 form = DevConfForm(initial=parms, instance=conf)
1401 1407
1402 1408 kwargs = {}
1403 1409 kwargs['id_dev'] = conf.id
1404 1410 kwargs['form'] = form
1405 1411 kwargs['title'] = 'Device Configuration'
1406 1412 kwargs['suptitle'] = 'Parameters imported'
1407 1413 kwargs['button'] = 'Save'
1408 1414 kwargs['action'] = conf.get_absolute_url_edit()
1409 1415 kwargs['previous'] = conf.get_absolute_url()
1410 1416
1411 1417 ###### SIDEBAR ######
1412 1418 kwargs.update(sidebar(conf=conf))
1413 1419
1414 1420 return render(request, '%s_conf_edit.html' % conf.device.device_type.name, kwargs)
1415 1421
1416 1422 messages.error(request, "Could not import parameters from file")
1417 1423
1418 1424 kwargs = {}
1419 1425 kwargs['id_dev'] = conf.id
1420 1426 kwargs['title'] = 'Device Configuration'
1421 1427 kwargs['form'] = file_form
1422 1428 kwargs['suptitle'] = 'Importing file'
1423 1429 kwargs['button'] = 'Import'
1424 1430
1425 1431 kwargs.update(sidebar(conf=conf))
1426 1432
1427 1433 return render(request, 'dev_conf_import.html', kwargs)
1428 1434
1429 1435
1430 1436 @user_passes_test(lambda u:u.is_staff)
1431 1437 def dev_conf_export(request, id_conf):
1432 1438
1433 1439 conf = get_object_or_404(Configuration, pk=id_conf)
1434 1440
1435 1441 if request.method == 'GET':
1436 1442 file_form = DownloadFileForm(conf.device.device_type.name)
1437 1443
1438 1444 if request.method == 'POST':
1439 1445 file_form = DownloadFileForm(conf.device.device_type.name, request.POST)
1440 1446
1441 1447 if file_form.is_valid():
1442 1448 fields = conf.export_to_file(format = file_form.cleaned_data['format'])
1443 1449
1444 1450 response = HttpResponse(content_type=fields['content_type'])
1445 1451 response['Content-Disposition'] = 'attachment; filename="%s"' %fields['filename']
1446 1452 response.write(fields['content'])
1447 1453
1448 1454 return response
1449 1455
1450 1456 messages.error(request, "Could not export parameters")
1451 1457
1452 1458 kwargs = {}
1453 1459 kwargs['id_dev'] = conf.id
1454 1460 kwargs['title'] = 'Device Configuration'
1455 1461 kwargs['form'] = file_form
1456 1462 kwargs['suptitle'] = 'Exporting file'
1457 1463 kwargs['button'] = 'Export'
1458 1464
1459 1465 return render(request, 'dev_conf_export.html', kwargs)
1460 1466
1461 1467
1462 1468 @user_passes_test(lambda u:u.is_staff)
1463 1469 def dev_conf_delete(request, id_conf):
1464 1470
1465 1471 conf = get_object_or_404(Configuration, pk=id_conf)
1466 1472
1467 1473 if request.method=='POST':
1468 1474 if request.user.is_staff:
1469 1475 conf.delete()
1470 1476 return redirect('url_dev_confs')
1471 1477
1472 1478 messages.error(request, 'Not enough permission to delete this object')
1473 1479 return redirect(conf.get_absolute_url())
1474 1480
1475 1481 kwargs = {
1476 1482 'title': 'Delete',
1477 1483 'suptitle': 'Experiment',
1478 1484 'object': conf,
1479 1485 'previous': conf.get_absolute_url(),
1480 1486 'delete': True
1481 1487 }
1482 1488
1483 1489 return render(request, 'confirm.html', kwargs)
1484 1490
1485 1491
1486 1492 def sidebar(**kwargs):
1487 1493
1488 1494 side_data = {}
1489 1495
1490 1496 conf = kwargs.get('conf', None)
1491 1497 experiment = kwargs.get('experiment', None)
1492 1498
1493 1499 if not experiment:
1494 1500 experiment = conf.experiment
1495 1501
1496 1502 if experiment:
1497 1503 side_data['experiment'] = experiment
1498 1504 campaign = experiment.campaign_set.all()
1499 1505 if campaign:
1500 1506 side_data['campaign'] = campaign[0]
1501 1507 experiments = campaign[0].experiments.all()
1502 1508 else:
1503 1509 experiments = [experiment]
1504 1510 configurations = experiment.configuration_set.filter(type=0)
1505 1511 side_data['side_experiments'] = experiments
1506 1512 side_data['side_configurations'] = configurations
1507 1513
1508 1514 return side_data
1509 1515
1510 1516 def get_paginator(model, page, order, filters={}, n=10):
1511 1517
1512 1518 kwargs = {}
1513 1519 query = Q()
1514 1520 if isinstance(filters, QueryDict):
1515 1521 filters = filters.dict()
1516 1522 [filters.pop(key) for key in filters.keys() if filters[key] in ('', ' ')]
1517 1523 filters.pop('page', None)
1518 1524
1519 1525 if 'template' in filters:
1520 1526 filters['template'] = True
1521 1527 if 'start_date' in filters:
1522 1528 filters['start_date__gte'] = filters.pop('start_date')
1523 1529 if 'end_date' in filters:
1524 1530 filters['start_date__lte'] = filters.pop('end_date')
1525 1531 if 'tags' in filters:
1526 1532 tags = filters.pop('tags')
1527 1533 fields = [f.name for f in model._meta.get_fields()]
1528 1534
1529 1535 if 'tags' in fields:
1530 1536 query = query | Q(tags__icontains=tags)
1531 1537 if 'name' in fields:
1532 1538 query = query | Q(name__icontains=tags)
1533 1539 if 'location' in fields:
1534 1540 query = query | Q(location__name__icontains=tags)
1535 1541 if 'device' in fields:
1536 1542 query = query | Q(device__device_type__name__icontains=tags)
1537 1543
1538 1544 object_list = model.objects.filter(query, **filters).order_by(*order)
1539 1545 paginator = Paginator(object_list, n)
1540 1546
1541 1547 try:
1542 1548 objects = paginator.page(page)
1543 1549 except PageNotAnInteger:
1544 1550 objects = paginator.page(1)
1545 1551 except EmptyPage:
1546 1552 objects = paginator.page(paginator.num_pages)
1547 1553
1548 1554 kwargs['objects'] = objects
1549 1555 kwargs['offset'] = (int(page)-1)*n if page else 0
1550 1556
1551 1557 return kwargs
1552 1558
1553 1559 def operation(request, id_camp=None):
1554 1560
1555 1561 kwargs = {}
1556 1562 kwargs['title'] = 'Radars Operation'
1557 1563 kwargs['no_sidebar'] = True
1558 1564 campaigns = Campaign.objects.filter(start_date__lte=datetime.now(),
1559 1565 end_date__gte=datetime.now()).order_by('-start_date')
1560 1566
1561 1567
1562 1568 if id_camp:
1563 1569 campaign = get_object_or_404(Campaign, pk = id_camp)
1564 1570 form = OperationForm(initial={'campaign': campaign.id}, campaigns=campaigns)
1565 1571 kwargs['campaign'] = campaign
1566 1572 else:
1567 1573 form = OperationForm(campaigns=campaigns)
1568 1574 kwargs['form'] = form
1569 1575 return render(request, 'operation.html', kwargs)
1570 1576
1571 1577 #---Experiment
1572 1578 keys = ['id', 'name', 'start_time', 'end_time', 'status']
1573 1579 kwargs['experiment_keys'] = keys[1:]
1574 1580 kwargs['experiments'] = experiments
1575 1581 #---Radar
1576 1582 kwargs['locations'] = campaign.get_experiments_by_radar()
1577 1583 kwargs['form'] = form
1578 1584
1579 1585 return render(request, 'operation.html', kwargs)
1580 1586
1581 1587
1582 1588 @login_required
1583 1589 def radar_start(request, id_camp, id_radar):
1584 1590
1585 1591 campaign = get_object_or_404(Campaign, pk = id_camp)
1586 1592 experiments = campaign.get_experiments_by_radar(id_radar)[0]['experiments']
1587 1593 now = datetime.utcnow()
1588 1594
1589 1595 for exp in experiments:
1590 1596 date = datetime.combine(datetime.now().date(), exp.start_time)
1591 1597
1592 1598 if exp.status == 2:
1593 1599 messages.warning(request, 'Experiment {} already running'.format(exp))
1594 1600 continue
1595 1601
1596 1602 if exp.status == 3:
1597 1603 messages.warning(request, 'Experiment {} already programmed'.format(exp))
1598 1604 continue
1599 1605
1600 1606 if date>campaign.end_date or date<campaign.start_date:
1601 1607 messages.warning(request, 'Experiment {} out of date'.format(exp))
1602 1608 continue
1603 1609
1604 1610 if now>=date:
1605 1611 task = task_start.delay(exp.pk)
1606 1612 exp.status = task.wait()
1607 1613 if exp.status==0:
1608 1614 messages.error(request, 'Experiment {} not start'.format(exp))
1609 1615 if exp.status==2:
1610 1616 messages.success(request, 'Experiment {} started'.format(exp))
1611 1617 else:
1612 1618 task = task_start.apply_async((exp.pk,), eta=date)
1613 1619 exp.status = 3
1614 1620 messages.success(request, 'Experiment {} programmed to start at {}'.format(exp, date))
1615 1621
1616 1622 exp.save()
1617 1623
1618 1624 return HttpResponseRedirect(reverse('url_operation', args=[id_camp]))
1619 1625
1620 1626
1621 1627 @login_required
1622 1628 def radar_stop(request, id_camp, id_radar):
1623 1629
1624 1630 campaign = get_object_or_404(Campaign, pk = id_camp)
1625 1631 experiments = campaign.get_experiments_by_radar(id_radar)[0]['experiments']
1626 1632
1627 1633 for exp in experiments:
1628 1634
1629 1635 if exp.status == 2:
1630 1636 task = task_stop.delay(exp.pk)
1631 1637 exp.status = task.wait()
1632 1638 messages.warning(request, 'Experiment {} stopped'.format(exp))
1633 1639 exp.save()
1634 1640 else:
1635 1641 messages.error(request, 'Experiment {} not running'.format(exp))
1636 1642
1637 1643 return HttpResponseRedirect(reverse('url_operation', args=[id_camp]))
1638 1644
1639 1645
1640 1646 @login_required
1641 1647 def radar_refresh(request, id_camp, id_radar):
1642 1648
1643 1649 campaign = get_object_or_404(Campaign, pk = id_camp)
1644 1650 experiments = campaign.get_experiments_by_radar(id_radar)[0]['experiments']
1645 1651
1646 1652 for exp in experiments:
1647 1653 exp.get_status()
1648 1654
1649 1655 return HttpResponseRedirect(reverse('url_operation', args=[id_camp]))
General Comments 0
You need to be logged in to leave comments. Login now