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