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