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