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