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