##// END OF EJS Templates
Fix bugs and add revoke tasks method
Juan C. Espinoza -
r330:9627993550b8
parent child
Show More
@@ -1,67 +1,68
1 1 from django.conf.urls import url
2 2
3 3 from apps.main import views
4 4
5 5 urlpatterns = (
6 6 url(r'^$', views.index, name='index'),
7 7
8 8 url(r'^realtime/$', views.real_time, name='url_real_time'),
9 9
10 10 url(r'^theme/(?P<theme>[a-z]+)/$', views.theme, name='url_theme'),
11 11
12 12 url(r'^location/new/$', views.location_new, name='url_add_location'),
13 13 url(r'^location/$', views.locations, name='url_locations'),
14 14 url(r'^location/(?P<id_loc>-?\d+)/$', views.location, name='url_location'),
15 15 url(r'^location/(?P<id_loc>-?\d+)/edit/$', views.location_edit, name='url_edit_location'),
16 16 url(r'^location/(?P<id_loc>-?\d+)/delete/$', views.location_delete, name='url_delete_location'),
17 17
18 18 url(r'^device/new/$', views.device_new, name='url_add_device'),
19 19 url(r'^device/$', views.devices, name='url_devices'),
20 20 url(r'^device/(?P<id_dev>-?\d+)/$', views.device, name='url_device'),
21 21 url(r'^device/(?P<id_dev>-?\d+)/edit/$', views.device_edit, name='url_edit_device'),
22 22 url(r'^device/(?P<id_dev>-?\d+)/delete/$', views.device_delete, name='url_delete_device'),
23 23 url(r'^device/(?P<id_dev>-?\d+)/change_ip/$', views.device_change_ip, name='url_change_ip_device'),
24 24
25 25 url(r'^campaign/new/$', views.campaign_new, name='url_add_campaign'),
26 26 url(r'^campaign/$', views.campaigns, name='url_campaigns'),
27 27 url(r'^campaign/(?P<id_camp>-?\d+)/$', views.campaign, name='url_campaign'),
28 28 url(r'^campaign/(?P<id_camp>-?\d+)/edit/$', views.campaign_edit, name='url_edit_campaign'),
29 29 url(r'^campaign/(?P<id_camp>-?\d+)/delete/$', views.campaign_delete, name='url_delete_campaign'),
30 30 url(r'^campaign/(?P<id_camp>-?\d+)/export/$', views.campaign_export, name='url_export_campaign'),
31 31 url(r'^campaign/(?P<id_camp>-?\d+)/import/$', views.campaign_import, name='url_import_campaign'),
32 32
33 33 url(r'^experiment/new/$', views.experiment_new, name='url_add_experiment'),
34 34 url(r'^experiment/$', views.experiments, name='url_experiments'),
35 35 url(r'^experiment/(?P<id_exp>-?\d+)/$', views.experiment, name='url_experiment'),
36 36 url(r'^experiment/(?P<id_exp>-?\d+)/edit/$', views.experiment_edit, name='url_edit_experiment'),
37 37 url(r'^experiment/(?P<id_exp>-?\d+)/delete/$', views.experiment_delete, name='url_delete_experiment'),
38 38 url(r'^experiment/(?P<id_exp>-?\d+)/export/$', views.experiment_export, name='url_export_experiment'),
39 39 url(r'^experiment/(?P<id_exp>-?\d+)/import/$', views.experiment_import, name='url_import_experiment'),
40 40 url(r'^experiment/(?P<id_exp>-?\d+)/start/$', views.experiment_start, name='url_start_experiment'),
41 41 url(r'^experiment/(?P<id_exp>-?\d+)/stop/$', views.experiment_stop, name='url_stop_experiment'),
42 42 url(r'^experiment/(?P<id_exp>-?\d+)/mix/$', views.experiment_mix, name='url_mix_experiment'),
43 43 url(r'^experiment/(?P<id_exp>-?\d+)/mix/delete/$', views.experiment_mix_delete, name='url_delete_mix_experiment'),
44 44 url(r'^experiment/(?P<id_exp>-?\d+)/summary/$', views.experiment_summary, name='url_sum_experiment'),
45 45 url(r'^experiment/(?P<id_exp>-?\d+)/verify/$', views.experiment_verify, name='url_verify_experiment'),
46 46
47 47 url(r'^experiment/(?P<id_exp>-?\d+)/new_dev_conf/$', views.dev_conf_new, name='url_add_dev_conf'),
48 48 url(r'^experiment/(?P<id_exp>-?\d+)/new_dev_conf/(?P<id_dev>-?\d+)/$', views.dev_conf_new, name='url_add_dev_conf'),
49 49 url(r'^dev_conf/$', views.dev_confs, name='url_dev_confs'),
50 50 url(r'^dev_conf/(?P<id_conf>-?\d+)/$', views.dev_conf, name='url_dev_conf'),
51 51 url(r'^dev_conf/(?P<id_conf>-?\d+)/edit/$', views.dev_conf_edit, name='url_edit_dev_conf'),
52 52 url(r'^dev_conf/(?P<id_conf>-?\d+)/delete/$', views.dev_conf_delete, name='url_delete_dev_conf'),
53 53
54 54 url(r'^dev_conf/(?P<id_conf>-?\d+)/write/$', views.dev_conf_write, name='url_write_dev_conf'),
55 55 url(r'^dev_conf/(?P<id_conf>-?\d+)/read/$', views.dev_conf_read, name='url_read_dev_conf'),
56 56 url(r'^dev_conf/(?P<id_conf>-?\d+)/import/$', views.dev_conf_import, name='url_import_dev_conf'),
57 57 url(r'^dev_conf/(?P<id_conf>-?\d+)/export/$', views.dev_conf_export, name='url_export_dev_conf'),
58 58 url(r'^dev_conf/(?P<id_conf>-?\d+)/start/$', views.dev_conf_start, name='url_start_dev_conf'),
59 59 url(r'^dev_conf/(?P<id_conf>-?\d+)/stop/$', views.dev_conf_stop, name='url_stop_dev_conf'),
60 60 url(r'^dev_conf/(?P<id_conf>-?\d+)/status/$', views.dev_conf_status, name='url_status_dev_conf'),
61 61
62 62 url(r'^operation/$', views.operation, name='url_operation'),
63 63 url(r'^operation/(?P<id_camp>-?\d+)/$', views.operation, name='url_operation'),
64 url(r'^operation/(?P<id_camp>-?\d+)/revoke$', views.revoke_tasks, name='url_operation_revoke'),
64 65 url(r'^operation/(?P<id_camp>-?\d+)/radar/(?P<id_radar>-?\d+)/start/$', views.radar_start, name='url_radar_start'),
65 66 url(r'^operation/(?P<id_camp>-?\d+)/radar/(?P<id_radar>-?\d+)/stop/$', views.radar_stop, name='url_radar_stop'),
66 67 url(r'^operation/(?P<id_camp>-?\d+)/radar/(?P<id_radar>-?\d+)/refresh/$', views.radar_refresh, name='url_radar_refresh'),
67 68 )
@@ -1,1881 +1,1898
1 1 import ast
2 2 import json
3 3 import hashlib
4 4 from datetime import datetime, timedelta
5 5
6 6 from django.shortcuts import render, redirect, get_object_or_404, HttpResponse
7 7 from django.utils.safestring import mark_safe
8 8 from django.http import HttpResponseRedirect
9 9 from django.core.urlresolvers import reverse
10 10 from django.db.models import Q
11 11 from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
12 12 from django.contrib import messages
13 13 from django.http.request import QueryDict
14 14 from django.contrib.auth.decorators import login_required, user_passes_test
15 15
16 16 try:
17 17 from urllib.parse import urlencode
18 18 except ImportError:
19 19 from urllib import urlencode
20 20
21 21 from .forms import CampaignForm, ExperimentForm, DeviceForm, ConfigurationForm, LocationForm, UploadFileForm, DownloadFileForm, OperationForm, NewForm
22 22 from .forms import OperationSearchForm, FilterForm, ChangeIpForm
23 23
24 24 from .tasks import task_start
25 25
26 26 from apps.rc.forms import RCConfigurationForm, RCLineCode, RCMixConfigurationForm
27 27 from apps.dds.forms import DDSConfigurationForm
28 28 from apps.jars.forms import JARSConfigurationForm
29 29 from apps.cgs.forms import CGSConfigurationForm
30 30 from apps.abs.forms import ABSConfigurationForm
31 31 from apps.usrp.forms import USRPConfigurationForm
32 32 from .utils import Params
33 33
34 34 from .models import Campaign, Experiment, Device, Configuration, Location, RunningExperiment, DEV_STATES
35 35 from apps.cgs.models import CGSConfiguration
36 36 from apps.jars.models import JARSConfiguration, EXPERIMENT_TYPE
37 37 from apps.usrp.models import USRPConfiguration
38 38 from apps.abs.models import ABSConfiguration
39 39 from apps.rc.models import RCConfiguration, RCLine, RCLineType, RCClock
40 40 from apps.dds.models import DDSConfiguration
41 41
42 42 from radarsys.celery import app
43 43
44 44
45 45 CONF_FORMS = {
46 46 'rc': RCConfigurationForm,
47 47 'dds': DDSConfigurationForm,
48 48 'jars': JARSConfigurationForm,
49 49 'cgs': CGSConfigurationForm,
50 50 'abs': ABSConfigurationForm,
51 51 'usrp': USRPConfigurationForm,
52 52 }
53 53
54 54 CONF_MODELS = {
55 55 'rc': RCConfiguration,
56 56 'dds': DDSConfiguration,
57 57 'jars': JARSConfiguration,
58 58 'cgs': CGSConfiguration,
59 59 'abs': ABSConfiguration,
60 60 'usrp': USRPConfiguration,
61 61 }
62 62
63 63 MIX_MODES = {
64 64 '0': 'P',
65 65 '1': 'S',
66 66 }
67 67
68 68 MIX_OPERATIONS = {
69 69 '0': 'OR',
70 70 '1': 'XOR',
71 71 '2': 'AND',
72 72 '3': 'NAND',
73 73 }
74 74
75 75
76 76 def is_developer(user):
77 77
78 78 groups = [str(g.name) for g in user.groups.all()]
79 79 return 'Developer' in groups or user.is_staff
80 80
81 81
82 82 def is_operator(user):
83 83
84 84 groups = [str(g.name) for g in user.groups.all()]
85 85 return 'Operator' in groups or user.is_staff
86 86
87 87
88 88 def has_been_modified(model):
89 89
90 90 prev_hash = model.hash
91 91 new_hash = hashlib.sha256(str(model.parms_to_dict)).hexdigest()
92 92 if prev_hash != new_hash:
93 93 model.hash = new_hash
94 94 model.save()
95 95 return True
96 96 return False
97 97
98 98
99 99 def index(request):
100 100 kwargs = {'no_sidebar': True}
101 101
102 102 return render(request, 'index.html', kwargs)
103 103
104 104
105 105 def locations(request):
106 106
107 107 page = request.GET.get('page')
108 108 order = ('name',)
109 109
110 110 kwargs = get_paginator(Location, page, order)
111 111
112 112 kwargs['keys'] = ['name', 'description']
113 113 kwargs['title'] = 'Radar System'
114 114 kwargs['suptitle'] = 'List'
115 115 kwargs['no_sidebar'] = True
116 116
117 117 return render(request, 'base_list.html', kwargs)
118 118
119 119
120 120 def location(request, id_loc):
121 121
122 122 location = get_object_or_404(Location, pk=id_loc)
123 123
124 124 kwargs = {}
125 125 kwargs['location'] = location
126 126 kwargs['location_keys'] = ['name', 'description']
127 127
128 128 kwargs['title'] = 'Location'
129 129 kwargs['suptitle'] = 'Details'
130 130
131 131 return render(request, 'location.html', kwargs)
132 132
133 133
134 134 @login_required
135 135 def location_new(request):
136 136
137 137 if request.method == 'GET':
138 138 form = LocationForm()
139 139
140 140 if request.method == 'POST':
141 141 form = LocationForm(request.POST)
142 142
143 143 if form.is_valid():
144 144 form.save()
145 145 return redirect('url_locations')
146 146
147 147 kwargs = {}
148 148 kwargs['form'] = form
149 149 kwargs['title'] = 'Radar System'
150 150 kwargs['suptitle'] = 'New'
151 151 kwargs['button'] = 'Create'
152 152
153 153 return render(request, 'base_edit.html', kwargs)
154 154
155 155
156 156 @login_required
157 157 def location_edit(request, id_loc):
158 158
159 159 location = get_object_or_404(Location, pk=id_loc)
160 160
161 161 if request.method == 'GET':
162 162 form = LocationForm(instance=location)
163 163
164 164 if request.method == 'POST':
165 165 form = LocationForm(request.POST, instance=location)
166 166
167 167 if form.is_valid():
168 168 form.save()
169 169 return redirect('url_locations')
170 170
171 171 kwargs = {}
172 172 kwargs['form'] = form
173 173 kwargs['title'] = 'Location'
174 174 kwargs['suptitle'] = 'Edit'
175 175 kwargs['button'] = 'Update'
176 176
177 177 return render(request, 'base_edit.html', kwargs)
178 178
179 179
180 180 @login_required
181 181 def location_delete(request, id_loc):
182 182
183 183 location = get_object_or_404(Location, pk=id_loc)
184 184
185 185 if request.method == 'POST':
186 186
187 187 if is_developer(request.user):
188 188 location.delete()
189 189 return redirect('url_locations')
190 190
191 191 messages.error(request, 'Not enough permission to delete this object')
192 192 return redirect(location.get_absolute_url())
193 193
194 194 kwargs = {
195 195 'title': 'Delete',
196 196 'suptitle': 'Location',
197 197 'object': location,
198 198 'delete': True
199 199 }
200 200
201 201 return render(request, 'confirm.html', kwargs)
202 202
203 203
204 204 def devices(request):
205 205
206 206 page = request.GET.get('page')
207 207 order = ('location', 'device_type')
208 208
209 209 filters = request.GET.copy()
210 210 kwargs = get_paginator(Device, page, order, filters)
211 211 form = FilterForm(initial=request.GET, extra_fields=['tags'])
212 212
213 213 kwargs['keys'] = ['device_type', 'location',
214 214 'ip_address', 'port_address', 'actions']
215 215 kwargs['title'] = 'Device'
216 216 kwargs['suptitle'] = 'List'
217 217 kwargs['no_sidebar'] = True
218 218 kwargs['form'] = form
219 219 kwargs['add_url'] = reverse('url_add_device')
220 220 filters.pop('page', None)
221 221 kwargs['q'] = urlencode(filters)
222 222 kwargs['menu_devices'] = 'active'
223 223 return render(request, 'base_list.html', kwargs)
224 224
225 225
226 226 def device(request, id_dev):
227 227
228 228 device = get_object_or_404(Device, pk=id_dev)
229 229
230 230 kwargs = {}
231 231 kwargs['device'] = device
232 232 kwargs['device_keys'] = ['device_type',
233 233 'ip_address', 'port_address', 'description']
234 234
235 235 kwargs['title'] = 'Device'
236 236 kwargs['suptitle'] = 'Details'
237 237 kwargs['menu_devices'] = 'active'
238 238
239 239 return render(request, 'device.html', kwargs)
240 240
241 241
242 242 @login_required
243 243 def device_new(request):
244 244
245 245 if request.method == 'GET':
246 246 form = DeviceForm()
247 247
248 248 if request.method == 'POST':
249 249 form = DeviceForm(request.POST)
250 250
251 251 if form.is_valid():
252 252 form.save()
253 253 return redirect('url_devices')
254 254
255 255 kwargs = {}
256 256 kwargs['form'] = form
257 257 kwargs['title'] = 'Device'
258 258 kwargs['suptitle'] = 'New'
259 259 kwargs['button'] = 'Create'
260 260 kwargs['menu_devices'] = 'active'
261 261
262 262 return render(request, 'base_edit.html', kwargs)
263 263
264 264
265 265 @login_required
266 266 def device_edit(request, id_dev):
267 267
268 268 device = get_object_or_404(Device, pk=id_dev)
269 269
270 270 if request.method == 'GET':
271 271 form = DeviceForm(instance=device)
272 272
273 273 if request.method == 'POST':
274 274 form = DeviceForm(request.POST, instance=device)
275 275
276 276 if form.is_valid():
277 277 form.save()
278 278 return redirect(device.get_absolute_url())
279 279
280 280 kwargs = {}
281 281 kwargs['form'] = form
282 282 kwargs['title'] = 'Device'
283 283 kwargs['suptitle'] = 'Edit'
284 284 kwargs['button'] = 'Update'
285 285 kwargs['menu_devices'] = 'active'
286 286
287 287 return render(request, 'base_edit.html', kwargs)
288 288
289 289
290 290 @login_required
291 291 def device_delete(request, id_dev):
292 292
293 293 device = get_object_or_404(Device, pk=id_dev)
294 294
295 295 if request.method == 'POST':
296 296
297 297 if is_developer(request.user):
298 298 device.delete()
299 299 return redirect('url_devices')
300 300
301 301 messages.error(request, 'Not enough permission to delete this object')
302 302 return redirect(device.get_absolute_url())
303 303
304 304 kwargs = {
305 305 'title': 'Delete',
306 306 'suptitle': 'Device',
307 307 'object': device,
308 308 'delete': True
309 309 }
310 310 kwargs['menu_devices'] = 'active'
311 311
312 312 return render(request, 'confirm.html', kwargs)
313 313
314 314
315 315 @login_required
316 316 def device_change_ip(request, id_dev):
317 317
318 318 device = get_object_or_404(Device, pk=id_dev)
319 319
320 320 if request.method == 'POST':
321 321
322 322 if is_developer(request.user):
323 323 device.change_ip(**request.POST.dict())
324 324 level, message = device.message.split('|')
325 325 messages.add_message(request, level, message)
326 326 else:
327 327 messages.error(
328 328 request, 'Not enough permission to delete this object')
329 329 return redirect(device.get_absolute_url())
330 330
331 331 kwargs = {
332 332 'title': 'Device',
333 333 'suptitle': 'Change IP',
334 334 'object': device,
335 335 'previous': device.get_absolute_url(),
336 336 'form': ChangeIpForm(initial={'ip_address': device.ip_address}),
337 337 'message': ' ',
338 338 }
339 339 kwargs['menu_devices'] = 'active'
340 340
341 341 return render(request, 'confirm.html', kwargs)
342 342
343 343
344 344 def campaigns(request):
345 345
346 346 page = request.GET.get('page')
347 347 order = ('-start_date',)
348 348 filters = request.GET.copy()
349 349
350 350 kwargs = get_paginator(Campaign, page, order, filters)
351 351
352 352 form = FilterForm(initial=request.GET, extra_fields=[
353 353 'range_date', 'tags', 'template'])
354 354 kwargs['keys'] = ['name', 'start_date', 'end_date', 'actions']
355 355 kwargs['title'] = 'Campaign'
356 356 kwargs['suptitle'] = 'List'
357 357 kwargs['no_sidebar'] = True
358 358 kwargs['form'] = form
359 359 kwargs['add_url'] = reverse('url_add_campaign')
360 360 filters.pop('page', None)
361 361 kwargs['q'] = urlencode(filters)
362 362 kwargs['menu_campaigns'] = 'active'
363 363
364 364 return render(request, 'base_list.html', kwargs)
365 365
366 366
367 367 def campaign(request, id_camp):
368 368
369 369 campaign = get_object_or_404(Campaign, pk=id_camp)
370 370 experiments = Experiment.objects.filter(campaign=campaign)
371 371
372 372 form = CampaignForm(instance=campaign)
373 373
374 374 kwargs = {}
375 375 kwargs['campaign'] = campaign
376 376 kwargs['campaign_keys'] = ['template', 'name',
377 377 'start_date', 'end_date', 'tags', 'description']
378 378
379 379 kwargs['experiments'] = experiments
380 380 kwargs['experiment_keys'] = [
381 381 'name', 'radar_system', 'start_time', 'end_time']
382 382
383 383 kwargs['title'] = 'Campaign'
384 384 kwargs['suptitle'] = 'Details'
385 385
386 386 kwargs['form'] = form
387 387 kwargs['button'] = 'Add Experiment'
388 388 kwargs['menu_campaigns'] = 'active'
389 389
390 390 return render(request, 'campaign.html', kwargs)
391 391
392 392
393 393 @login_required
394 394 def campaign_new(request):
395 395
396 396 kwargs = {}
397 397
398 398 if request.method == 'GET':
399 399
400 400 if 'template' in request.GET:
401 401 if request.GET['template'] == '0':
402 402 form = NewForm(initial={'create_from': 2},
403 403 template_choices=Campaign.objects.filter(template=True).values_list('id', 'name'))
404 404 else:
405 405 kwargs['button'] = 'Create'
406 406 kwargs['experiments'] = Configuration.objects.filter(
407 407 experiment=request.GET['template'])
408 408 kwargs['experiment_keys'] = ['name', 'start_time', 'end_time']
409 409 camp = Campaign.objects.get(pk=request.GET['template'])
410 410 form = CampaignForm(instance=camp,
411 411 initial={'name': '{}_{:%Y%m%d}'.format(camp.name, datetime.now()),
412 412 'template': False})
413 413 elif 'blank' in request.GET:
414 414 kwargs['button'] = 'Create'
415 415 form = CampaignForm()
416 416 else:
417 417 form = NewForm()
418 418
419 419 if request.method == 'POST':
420 420 kwargs['button'] = 'Create'
421 421 post = request.POST.copy()
422 422 experiments = []
423 423
424 424 for id_exp in post.getlist('experiments'):
425 425 exp = Experiment.objects.get(pk=id_exp)
426 426 new_exp = exp.clone(template=False)
427 427 experiments.append(new_exp)
428 428
429 429 post.setlist('experiments', [])
430 430
431 431 form = CampaignForm(post)
432 432
433 433 if form.is_valid():
434 434 campaign = form.save(commit=False)
435 435 campaign.author = request.user
436 436 for exp in experiments:
437 437 campaign.experiments.add(exp)
438 438 campaign.save()
439 439 return redirect('url_campaign', id_camp=campaign.id)
440 440
441 441 kwargs['form'] = form
442 442 kwargs['title'] = 'Campaign'
443 443 kwargs['suptitle'] = 'New'
444 444 kwargs['menu_campaigns'] = 'active'
445 445
446 446 return render(request, 'campaign_edit.html', kwargs)
447 447
448 448
449 449 @login_required
450 450 def campaign_edit(request, id_camp):
451 451
452 452 campaign = get_object_or_404(Campaign, pk=id_camp)
453 453
454 454 if request.method == 'GET':
455 455 form = CampaignForm(instance=campaign)
456 456
457 457 if request.method == 'POST':
458 458 exps = campaign.experiments.all().values_list('pk', flat=True)
459 459 post = request.POST.copy()
460 460 new_exps = post.getlist('experiments')
461 461 post.setlist('experiments', [])
462 462 form = CampaignForm(post, instance=campaign)
463 463
464 464 if form.is_valid():
465 465 camp = form.save()
466 466 for id_exp in new_exps:
467 467 if int(id_exp) in exps:
468 468 exps.pop(id_exp)
469 469 else:
470 470 exp = Experiment.objects.get(pk=id_exp)
471 471 if exp.template:
472 472 camp.experiments.add(exp.clone(template=False))
473 473 else:
474 474 camp.experiments.add(exp)
475 475
476 476 for id_exp in exps:
477 477 camp.experiments.remove(Experiment.objects.get(pk=id_exp))
478 478
479 479 return redirect('url_campaign', id_camp=id_camp)
480 480
481 481 kwargs = {}
482 482 kwargs['form'] = form
483 483 kwargs['title'] = 'Campaign'
484 484 kwargs['suptitle'] = 'Edit'
485 485 kwargs['button'] = 'Update'
486 486 kwargs['menu_campaigns'] = 'active'
487 487
488 488 return render(request, 'campaign_edit.html', kwargs)
489 489
490 490
491 491 @login_required
492 492 def campaign_delete(request, id_camp):
493 493
494 494 campaign = get_object_or_404(Campaign, pk=id_camp)
495 495
496 496 if request.method == 'POST':
497 497 if is_developer(request.user):
498 498
499 499 for exp in campaign.experiments.all():
500 500 for conf in Configuration.objects.filter(experiment=exp):
501 501 conf.delete()
502 502 exp.delete()
503 503 campaign.delete()
504 504
505 505 return redirect('url_campaigns')
506 506
507 507 messages.error(request, 'Not enough permission to delete this object')
508 508 return redirect(campaign.get_absolute_url())
509 509
510 510 kwargs = {
511 511 'title': 'Delete',
512 512 'suptitle': 'Campaign',
513 513 'object': campaign,
514 514 'delete': True
515 515 }
516 516 kwargs['menu_campaigns'] = 'active'
517 517
518 518 return render(request, 'confirm.html', kwargs)
519 519
520 520
521 521 @login_required
522 522 def campaign_export(request, id_camp):
523 523
524 524 campaign = get_object_or_404(Campaign, pk=id_camp)
525 525 content = campaign.parms_to_dict()
526 526 content_type = 'application/json'
527 527 filename = '%s_%s.json' % (campaign.name, campaign.id)
528 528
529 529 response = HttpResponse(content_type=content_type)
530 530 response['Content-Disposition'] = 'attachment; filename="%s"' % filename
531 531 response.write(json.dumps(content, indent=2))
532 532
533 533 return response
534 534
535 535
536 536 @login_required
537 537 def campaign_import(request, id_camp):
538 538
539 539 campaign = get_object_or_404(Campaign, pk=id_camp)
540 540
541 541 if request.method == 'GET':
542 542 file_form = UploadFileForm()
543 543
544 544 if request.method == 'POST':
545 545 file_form = UploadFileForm(request.POST, request.FILES)
546 546
547 547 if file_form.is_valid():
548 548 new_camp = campaign.dict_to_parms(
549 549 json.load(request.FILES['file']), CONF_MODELS)
550 550 messages.success(
551 551 request, "Parameters imported from: '%s'." % request.FILES['file'].name)
552 552 return redirect(new_camp.get_absolute_url_edit())
553 553
554 554 messages.error(request, "Could not import parameters from file")
555 555
556 556 kwargs = {}
557 557 kwargs['title'] = 'Campaign'
558 558 kwargs['form'] = file_form
559 559 kwargs['suptitle'] = 'Importing file'
560 560 kwargs['button'] = 'Import'
561 561 kwargs['menu_campaigns'] = 'active'
562 562
563 563 return render(request, 'campaign_import.html', kwargs)
564 564
565 565
566 566 def experiments(request):
567 567
568 568 page = request.GET.get('page')
569 569 order = ('location',)
570 570 filters = request.GET.copy()
571 571
572 572 if 'my experiments' in filters:
573 573 filters.pop('my experiments', None)
574 574 filters['mine'] = request.user.id
575 575
576 576 kwargs = get_paginator(Experiment, page, order, filters)
577 577
578 578 fields = ['tags', 'template']
579 579 if request.user.is_authenticated:
580 580 fields.append('my experiments')
581 581
582 582 form = FilterForm(initial=request.GET, extra_fields=fields)
583 583
584 584 kwargs['keys'] = ['name', 'radar_system',
585 585 'start_time', 'end_time', 'actions']
586 586 kwargs['title'] = 'Experiment'
587 587 kwargs['suptitle'] = 'List'
588 588 kwargs['no_sidebar'] = True
589 589 kwargs['form'] = form
590 590 kwargs['add_url'] = reverse('url_add_experiment')
591 591 filters = request.GET.copy()
592 592 filters.pop('page', None)
593 593 kwargs['q'] = urlencode(filters)
594 594 kwargs['menu_experiments'] = 'active'
595 595
596 596 return render(request, 'base_list.html', kwargs)
597 597
598 598
599 599 def experiment(request, id_exp):
600 600
601 601 experiment = get_object_or_404(Experiment, pk=id_exp)
602 602
603 603 configurations = Configuration.objects.filter(
604 604 experiment=experiment, type=0)
605 605
606 606 kwargs = {}
607 607
608 608 kwargs['experiment_keys'] = ['template', 'radar_system',
609 609 'name', 'freq', 'start_time', 'end_time']
610 610 kwargs['experiment'] = experiment
611 611 kwargs['configuration_keys'] = ['name', 'device__ip_address',
612 612 'device__port_address', 'device__status']
613 613 kwargs['configurations'] = configurations
614 614 kwargs['title'] = 'Experiment'
615 615 kwargs['suptitle'] = 'Details'
616 616 kwargs['button'] = 'Add Configuration'
617 617 kwargs['menu_experiments'] = 'active'
618 618
619 619 ###### SIDEBAR ######
620 620 kwargs.update(sidebar(experiment=experiment))
621 621
622 622 return render(request, 'experiment.html', kwargs)
623 623
624 624
625 625 @login_required
626 626 def experiment_new(request, id_camp=None):
627 627
628 628 if not is_developer(request.user):
629 629 messages.error(
630 630 request, 'Developer required, to create new Experiments')
631 631 return redirect('index')
632 632 kwargs = {}
633 633
634 634 if request.method == 'GET':
635 635 if 'template' in request.GET:
636 636 if request.GET['template'] == '0':
637 637 form = NewForm(initial={'create_from': 2},
638 638 template_choices=Experiment.objects.filter(template=True).values_list('id', 'name'))
639 639 else:
640 640 kwargs['button'] = 'Create'
641 641 kwargs['configurations'] = Configuration.objects.filter(
642 642 experiment=request.GET['template'])
643 643 kwargs['configuration_keys'] = ['name', 'device__name',
644 644 'device__ip_address', 'device__port_address']
645 645 exp = Experiment.objects.get(pk=request.GET['template'])
646 646 form = ExperimentForm(instance=exp,
647 647 initial={'name': '{}_{:%y%m%d}'.format(exp.name, datetime.now()),
648 648 'template': False})
649 649 elif 'blank' in request.GET:
650 650 kwargs['button'] = 'Create'
651 651 form = ExperimentForm()
652 652 else:
653 653 form = NewForm()
654 654
655 655 if request.method == 'POST':
656 656 form = ExperimentForm(request.POST)
657 657 if form.is_valid():
658 658 experiment = form.save(commit=False)
659 659 experiment.author = request.user
660 660 experiment.save()
661 661
662 662 if 'template' in request.GET:
663 663 configurations = Configuration.objects.filter(
664 664 experiment=request.GET['template'], type=0)
665 665 for conf in configurations:
666 666 conf.clone(experiment=experiment, template=False)
667 667
668 668 return redirect('url_experiment', id_exp=experiment.id)
669 669
670 670 kwargs['form'] = form
671 671 kwargs['title'] = 'Experiment'
672 672 kwargs['suptitle'] = 'New'
673 673 kwargs['menu_experiments'] = 'active'
674 674
675 675 return render(request, 'experiment_edit.html', kwargs)
676 676
677 677
678 678 @login_required
679 679 def experiment_edit(request, id_exp):
680 680
681 681 experiment = get_object_or_404(Experiment, pk=id_exp)
682 682
683 683 if request.method == 'GET':
684 684 form = ExperimentForm(instance=experiment)
685 685
686 686 if request.method == 'POST':
687 687 form = ExperimentForm(request.POST, instance=experiment)
688 688
689 689 if form.is_valid():
690 690 experiment = form.save()
691 691 return redirect('url_experiment', id_exp=experiment.id)
692 692
693 693 kwargs = {}
694 694 kwargs['form'] = form
695 695 kwargs['title'] = 'Experiment'
696 696 kwargs['suptitle'] = 'Edit'
697 697 kwargs['button'] = 'Update'
698 698 kwargs['menu_experiments'] = 'active'
699 699
700 700 return render(request, 'experiment_edit.html', kwargs)
701 701
702 702
703 703 @login_required
704 704 def experiment_delete(request, id_exp):
705 705
706 706 experiment = get_object_or_404(Experiment, pk=id_exp)
707 707
708 708 if request.method == 'POST':
709 709 if is_developer(request.user):
710 710 for conf in Configuration.objects.filter(experiment=experiment):
711 711 conf.delete()
712 712 experiment.delete()
713 713 return redirect('url_experiments')
714 714
715 715 messages.error(request, 'Not enough permission to delete this object')
716 716 return redirect(experiment.get_absolute_url())
717 717
718 718 kwargs = {
719 719 'title': 'Delete',
720 720 'suptitle': 'Experiment',
721 721 'object': experiment,
722 722 'delete': True
723 723 }
724 724
725 725 return render(request, 'confirm.html', kwargs)
726 726
727 727
728 728 @login_required
729 729 def experiment_export(request, id_exp):
730 730
731 731 experiment = get_object_or_404(Experiment, pk=id_exp)
732 732 content = experiment.parms_to_dict()
733 733 content_type = 'application/json'
734 734 filename = '%s_%s.json' % (experiment.name, experiment.id)
735 735
736 736 response = HttpResponse(content_type=content_type)
737 737 response['Content-Disposition'] = 'attachment; filename="%s"' % filename
738 738 response.write(json.dumps(content, indent=2))
739 739
740 740 return response
741 741
742 742
743 743 @login_required
744 744 def experiment_import(request, id_exp):
745 745
746 746 experiment = get_object_or_404(Experiment, pk=id_exp)
747 747 configurations = Configuration.objects.filter(experiment=experiment)
748 748
749 749 if request.method == 'GET':
750 750 file_form = UploadFileForm()
751 751
752 752 if request.method == 'POST':
753 753 file_form = UploadFileForm(request.POST, request.FILES)
754 754
755 755 if file_form.is_valid():
756 756 new_exp = experiment.dict_to_parms(
757 757 json.load(request.FILES['file']), CONF_MODELS)
758 758 messages.success(
759 759 request, "Parameters imported from: '%s'." % request.FILES['file'].name)
760 760 return redirect(new_exp.get_absolute_url_edit())
761 761
762 762 messages.error(request, "Could not import parameters from file")
763 763
764 764 kwargs = {}
765 765 kwargs['title'] = 'Experiment'
766 766 kwargs['form'] = file_form
767 767 kwargs['suptitle'] = 'Importing file'
768 768 kwargs['button'] = 'Import'
769 769 kwargs['menu_experiments'] = 'active'
770 770
771 771 kwargs.update(sidebar(experiment=experiment))
772 772
773 773 return render(request, 'experiment_import.html', kwargs)
774 774
775 775
776 776 @login_required
777 777 def experiment_start(request, id_exp):
778 778
779 779 exp = get_object_or_404(Experiment, pk=id_exp)
780 780
781 781 if exp.status == 2:
782 782 messages.warning(request, 'Experiment {} already runnnig'.format(exp))
783 783 else:
784 784 exp.status = exp.start()
785 785 if exp.status == 0:
786 786 messages.error(request, 'Experiment {} not start'.format(exp))
787 787 if exp.status == 2:
788 788 messages.success(request, 'Experiment {} started'.format(exp))
789 789
790 790 exp.save()
791 791
792 792 return redirect(exp.get_absolute_url())
793 793
794 794
795 795 @login_required
796 796 def experiment_stop(request, id_exp):
797 797
798 798 exp = get_object_or_404(Experiment, pk=id_exp)
799 799
800 800 if exp.status == 2:
801 801 exp.status = exp.stop()
802 802 exp.save()
803 803 messages.success(request, 'Experiment {} stopped'.format(exp))
804 804 else:
805 805 messages.error(request, 'Experiment {} not running'.format(exp))
806 806
807 807 return redirect(exp.get_absolute_url())
808 808
809 809
810 810 def experiment_status(request, id_exp):
811 811
812 812 exp = get_object_or_404(Experiment, pk=id_exp)
813 813
814 814 exp.get_status()
815 815
816 816 return redirect(exp.get_absolute_url())
817 817
818 818
819 819 @login_required
820 820 def experiment_mix(request, id_exp):
821 821
822 822 experiment = get_object_or_404(Experiment, pk=id_exp)
823 823 rc_confs = [conf for conf in RCConfiguration.objects.filter(
824 824 experiment=id_exp,
825 825 type=0,
826 826 mix=False)]
827 827
828 828 if len(rc_confs) < 2:
829 829 messages.warning(
830 830 request, 'You need at least two RC Configurations to make a mix')
831 831 return redirect(experiment.get_absolute_url())
832 832
833 833 mix_confs = RCConfiguration.objects.filter(experiment=id_exp, mix=True, type=0)
834 834
835 835 if mix_confs:
836 836 mix = mix_confs[0]
837 837 else:
838 838 mix = RCConfiguration(experiment=experiment,
839 839 device=rc_confs[0].device,
840 840 ipp=rc_confs[0].ipp,
841 841 clock_in=rc_confs[0].clock_in,
842 842 clock_divider=rc_confs[0].clock_divider,
843 843 mix=True,
844 844 parameters='')
845 845 mix.save()
846 846
847 847 line_type = RCLineType.objects.get(name='mix')
848 848 for i in range(len(rc_confs[0].get_lines())):
849 849 line = RCLine(rc_configuration=mix, line_type=line_type, channel=i)
850 850 line.save()
851 851
852 852 initial = {'name': mix.name,
853 853 'result': parse_mix_result(mix.parameters),
854 854 'delay': 0,
855 855 'mask': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
856 856 }
857 857
858 858 if request.method == 'GET':
859 859 form = RCMixConfigurationForm(confs=rc_confs, initial=initial)
860 860
861 861 if request.method == 'POST':
862 862 result = mix.parameters
863 863
864 864 if '{}|'.format(request.POST['experiment']) in result:
865 865 messages.error(request, 'Configuration already added')
866 866 else:
867 867 if 'operation' in request.POST:
868 868 operation = MIX_OPERATIONS[request.POST['operation']]
869 869 else:
870 870 operation = ' '
871 871
872 872 mode = MIX_MODES[request.POST['mode']]
873 873
874 874 if result:
875 875 result = '{}-{}|{}|{}|{}|{}'.format(mix.parameters,
876 876 request.POST['experiment'],
877 877 mode,
878 878 operation,
879 879 float(
880 880 request.POST['delay']),
881 881 parse_mask(
882 882 request.POST.getlist('mask'))
883 883 )
884 884 else:
885 885 result = '{}|{}|{}|{}|{}'.format(request.POST['experiment'],
886 886 mode,
887 887 operation,
888 888 float(request.POST['delay']),
889 889 parse_mask(
890 890 request.POST.getlist('mask'))
891 891 )
892 892
893 893 mix.parameters = result
894 894 mix.save()
895 895 mix.update_pulses()
896 896
897 897 initial['result'] = parse_mix_result(result)
898 898 initial['name'] = mix.name
899 899
900 900 form = RCMixConfigurationForm(initial=initial, confs=rc_confs)
901 901
902 902 kwargs = {
903 903 'title': 'Experiment',
904 904 'suptitle': 'Mix Configurations',
905 905 'form': form,
906 906 'extra_button': 'Delete',
907 907 'button': 'Add',
908 908 'cancel': 'Back',
909 909 'previous': experiment.get_absolute_url(),
910 910 'id_exp': id_exp,
911 911
912 912 }
913 913 kwargs['menu_experiments'] = 'active'
914 914
915 915 return render(request, 'experiment_mix.html', kwargs)
916 916
917 917
918 918 @login_required
919 919 def experiment_mix_delete(request, id_exp):
920 920
921 921 conf = RCConfiguration.objects.get(experiment=id_exp, mix=True, type=0)
922 922 values = conf.parameters.split('-')
923 923 conf.parameters = '-'.join(values[:-1])
924 924 conf.save()
925 925
926 926 return redirect('url_mix_experiment', id_exp=id_exp)
927 927
928 928
929 929 def experiment_summary(request, id_exp):
930 930
931 931 experiment = get_object_or_404(Experiment, pk=id_exp)
932 932 configurations = Configuration.objects.filter(
933 933 experiment=experiment, type=0)
934 934
935 935 kwargs = {}
936 936 kwargs['experiment_keys'] = ['radar_system',
937 937 'name', 'freq', 'start_time', 'end_time']
938 938 kwargs['experiment'] = experiment
939 939 kwargs['configurations'] = []
940 940 kwargs['title'] = 'Experiment Summary'
941 941 kwargs['suptitle'] = 'Details'
942 942 kwargs['button'] = 'Verify Parameters'
943 943
944 944 c_vel = 3.0*(10**8) # m/s
945 945 ope_freq = experiment.freq*(10**6) # 1/s
946 946 radar_lambda = c_vel/ope_freq # m
947 947 kwargs['radar_lambda'] = radar_lambda
948 948
949 949 ipp = None
950 950 nsa = 1
951 951 code_id = 0
952 952 tx_line = {}
953 953
954 954 for configuration in configurations.filter(device__device_type__name = 'rc'):
955 955
956 956 if configuration.mix:
957 957 continue
958 958 conf = {'conf': configuration}
959 959 conf['keys'] = []
960 960 conf['NTxs'] = configuration.ntx
961 961 conf['keys'].append('NTxs')
962 962 ipp = configuration.ipp
963 963 conf['IPP'] = ipp
964 964 conf['keys'].append('IPP')
965 965 lines = configuration.get_lines(line_type__name='tx')
966 966
967 967 for tx_line in lines:
968 968 tx_params = json.loads(tx_line.params)
969 969 conf[tx_line.get_name()] = '{} Km'.format(tx_params['pulse_width'])
970 970 conf['keys'].append(tx_line.get_name())
971 971 delays = tx_params['delays']
972 972 if delays not in ('', '0'):
973 973 n = len(delays.split(','))
974 974 taus = '{} Taus: {}'.format(n, delays)
975 975 else:
976 976 taus = '-'
977 977 conf['Taus ({})'.format(tx_line.get_name())] = taus
978 978 conf['keys'].append('Taus ({})'.format(tx_line.get_name()))
979 979 for code_line in configuration.get_lines(line_type__name='codes'):
980 980 code_params = json.loads(code_line.params)
981 981 code_id = code_params['code']
982 982 if tx_line.pk == int(code_params['TX_ref']):
983 983 conf['Code ({})'.format(tx_line.get_name())] = '{}:{}'.format(RCLineCode.objects.get(pk=code_params['code']),
984 984 '-'.join(code_params['codes']))
985 985 conf['keys'].append('Code ({})'.format(tx_line.get_name()))
986 986
987 987 for windows_line in configuration.get_lines(line_type__name='windows'):
988 988 win_params = json.loads(windows_line.params)
989 989 if tx_line.pk == int(win_params['TX_ref']):
990 990 windows = ''
991 991 nsa = win_params['params'][0]['number_of_samples']
992 992 for i, params in enumerate(win_params['params']):
993 993 windows += 'W{}: Ho={first_height} km DH={resolution} km NSA={number_of_samples}<br>'.format(
994 994 i, **params)
995 995 conf['Window'] = mark_safe(windows)
996 996 conf['keys'].append('Window')
997 997
998 998 kwargs['configurations'].append(conf)
999 999
1000 1000 for configuration in configurations.filter(device__device_type__name = 'jars'):
1001 1001
1002 1002 conf = {'conf': configuration}
1003 1003 conf['keys'] = []
1004 1004 conf['Type of Data'] = EXPERIMENT_TYPE[configuration.exp_type][1]
1005 1005 conf['keys'].append('Type of Data')
1006 1006 channels_number = configuration.channels_number
1007 1007 exp_type = configuration.exp_type
1008 1008 fftpoints = configuration.fftpoints
1009 1009 filter_parms = json.loads(configuration.filter_parms)
1010 1010 spectral_number = configuration.spectral_number
1011 1011 acq_profiles = configuration.acq_profiles
1012 1012 cohe_integr = configuration.cohe_integr
1013 1013 profiles_block = configuration.profiles_block
1014 1014
1015 1015 conf['Num of Profiles'] = acq_profiles
1016 1016 conf['keys'].append('Num of Profiles')
1017 1017
1018 1018 conf['Prof per Block'] = profiles_block
1019 1019 conf['keys'].append('Prof per Block')
1020 1020
1021 1021 conf['Blocks per File'] = configuration.raw_data_blocks
1022 1022 conf['keys'].append('Blocks per File')
1023 1023
1024 1024 if exp_type == 0: # Short
1025 1025 bytes_ = 2
1026 1026 b = nsa*2*bytes_*channels_number
1027 1027 else: # Float
1028 1028 bytes_ = 4
1029 1029 channels = channels_number + spectral_number
1030 1030 b = nsa*2*bytes_*fftpoints*channels
1031 1031
1032 1032 codes_num = 7
1033 1033 if code_id == 2:
1034 1034 codes_num = 7
1035 1035 elif code_id == 12:
1036 1036 codes_num = 15
1037 1037
1038 1038 #Jars filter values:
1039 1039
1040 1040 clock = float(filter_parms['clock'])
1041 1041 filter_2 = int(filter_parms['cic_2'])
1042 1042 filter_5 = int(filter_parms['cic_5'])
1043 1043 filter_fir = int(filter_parms['fir'])
1044 1044 Fs_MHz = clock/(filter_2*filter_5*filter_fir)
1045 1045
1046 1046 #Jars values:
1047 1047 if ipp is not None:
1048 1048 IPP_units = ipp/0.15*Fs_MHz
1049 1049 IPP_us = IPP_units / Fs_MHz
1050 1050 IPP_s = IPP_units / (Fs_MHz * (10**6))
1051 1051 Ts = 1/(Fs_MHz*(10**6))
1052 1052
1053 1053 Va = radar_lambda/(4*Ts*cohe_integr)
1054 1054 rate_bh = ((nsa-codes_num)*channels_number*2 *
1055 1055 bytes_/IPP_us)*(36*(10**8)/cohe_integr)
1056 1056 rate_gh = rate_bh/(1024*1024*1024)
1057 1057
1058 1058 conf['Time per Block'] = IPP_s * profiles_block * cohe_integr
1059 1059 conf['keys'].append('Time per Block')
1060 1060 conf['Acq time'] = IPP_s * acq_profiles
1061 1061 conf['keys'].append('Acq time')
1062 1062 conf['Data rate'] = str(rate_gh)+" (GB/h)"
1063 1063 conf['keys'].append('Data rate')
1064 1064 conf['Va (m/s)'] = Va
1065 1065 conf['keys'].append('Va (m/s)')
1066 1066 conf['Vrange (m/s)'] = 3/(2*IPP_s*cohe_integr)
1067 1067 conf['keys'].append('Vrange (m/s)')
1068 1068
1069 1069 kwargs['configurations'].append(conf)
1070 1070 kwargs['menu_experiments'] = 'active'
1071 1071
1072 1072 ###### SIDEBAR ######
1073 1073 kwargs.update(sidebar(experiment=experiment))
1074 1074
1075 1075 return render(request, 'experiment_summary.html', kwargs)
1076 1076
1077 1077
1078 1078 @login_required
1079 1079 def experiment_verify(request, id_exp):
1080 1080
1081 1081 experiment = get_object_or_404(Experiment, pk=id_exp)
1082 1082 experiment_data = experiment.parms_to_dict()
1083 1083 configurations = Configuration.objects.filter(
1084 1084 experiment=experiment, type=0)
1085 1085
1086 1086 kwargs = {}
1087 1087
1088 1088 kwargs['experiment_keys'] = ['template',
1089 1089 'radar_system', 'name', 'start_time', 'end_time']
1090 1090 kwargs['experiment'] = experiment
1091 1091
1092 1092 kwargs['configuration_keys'] = ['name', 'device__ip_address',
1093 1093 'device__port_address', 'device__status']
1094 1094 kwargs['configurations'] = configurations
1095 1095 kwargs['experiment_data'] = experiment_data
1096 1096
1097 1097 kwargs['title'] = 'Verify Experiment'
1098 1098 kwargs['suptitle'] = 'Parameters'
1099 1099
1100 1100 kwargs['button'] = 'Update'
1101 1101
1102 1102 jars_conf = False
1103 1103 rc_conf = False
1104 1104 dds_conf = False
1105 1105
1106 1106 for configuration in configurations:
1107 1107 #-------------------- JARS -----------------------:
1108 1108 if configuration.device.device_type.name == 'jars':
1109 1109 jars_conf = True
1110 1110 jars = configuration
1111 1111 kwargs['jars_conf'] = jars_conf
1112 1112 filter_parms = json.loads(jars.filter_parms)
1113 1113 kwargs['filter_parms'] = filter_parms
1114 1114 #--Sampling Frequency
1115 1115 clock = filter_parms['clock']
1116 1116 filter_2 = filter_parms['cic_2']
1117 1117 filter_5 = filter_parms['cic_5']
1118 1118 filter_fir = filter_parms['fir']
1119 1119 samp_freq_jars = clock/filter_2/filter_5/filter_fir
1120 1120
1121 1121 kwargs['samp_freq_jars'] = samp_freq_jars
1122 1122 kwargs['jars'] = configuration
1123 1123
1124 1124 #--------------------- RC ----------------------:
1125 1125 if configuration.device.device_type.name == 'rc' and not configuration.mix:
1126 1126 rc_conf = True
1127 1127 rc = configuration
1128 1128
1129 1129 rc_parms = configuration.parms_to_dict()
1130 1130
1131 1131 win_lines = rc.get_lines(line_type__name='windows')
1132 1132 if win_lines:
1133 1133 dh = json.loads(win_lines[0].params)['params'][0]['resolution']
1134 1134 #--Sampling Frequency
1135 1135 samp_freq_rc = 0.15/dh
1136 1136 kwargs['samp_freq_rc'] = samp_freq_rc
1137 1137
1138 1138 kwargs['rc_conf'] = rc_conf
1139 1139 kwargs['rc'] = configuration
1140 1140
1141 1141 #-------------------- DDS ----------------------:
1142 1142 if configuration.device.device_type.name == 'dds':
1143 1143 dds_conf = True
1144 1144 dds = configuration
1145 1145 dds_parms = configuration.parms_to_dict()
1146 1146
1147 1147 kwargs['dds_conf'] = dds_conf
1148 1148 kwargs['dds'] = configuration
1149 1149
1150 1150 #------------Validation------------:
1151 1151 #Clock
1152 1152 if dds_conf and rc_conf and jars_conf:
1153 1153 if float(filter_parms['clock']) != float(rc_parms['configurations']['byId'][str(rc.pk)]['clock_in']) and float(rc_parms['configurations']['byId'][str(rc.pk)]['clock_in']) != float(dds_parms['configurations']['byId'][str(dds.pk)]['clock']):
1154 1154 messages.warning(request, "Devices don't have the same clock.")
1155 1155 elif rc_conf and jars_conf:
1156 1156 if float(filter_parms['clock']) != float(rc_parms['configurations']['byId'][str(rc.pk)]['clock_in']):
1157 1157 messages.warning(request, "Devices don't have the same clock.")
1158 1158 elif rc_conf and dds_conf:
1159 1159 if float(rc_parms['configurations']['byId'][str(rc.pk)]['clock_in']) != float(dds_parms['configurations']['byId'][str(dds.pk)]['clock']):
1160 1160 messages.warning(request, "Devices don't have the same clock.")
1161 1161 if float(samp_freq_rc) != float(dds_parms['configurations']['byId'][str(dds.pk)]['frequencyA']):
1162 1162 messages.warning(
1163 1163 request, "Devices don't have the same Frequency A.")
1164 1164
1165 1165 #------------POST METHOD------------:
1166 1166 if request.method == 'POST':
1167 1167 if request.POST['suggest_clock']:
1168 1168 try:
1169 1169 suggest_clock = float(request.POST['suggest_clock'])
1170 1170 except:
1171 1171 messages.warning(request, "Invalid value in CLOCK IN.")
1172 1172 return redirect('url_verify_experiment', id_exp=experiment.id)
1173 1173 else:
1174 1174 suggest_clock = ""
1175 1175 if suggest_clock:
1176 1176 if rc_conf:
1177 1177 rc.clock_in = suggest_clock
1178 1178 rc.save()
1179 1179 if jars_conf:
1180 1180 filter_parms = jars.filter_parms
1181 1181 filter_parms = ast.literal_eval(filter_parms)
1182 1182 filter_parms['clock'] = suggest_clock
1183 1183 jars.filter_parms = json.dumps(filter_parms)
1184 1184 jars.save()
1185 1185 kwargs['filter_parms'] = filter_parms
1186 1186 if dds_conf:
1187 1187 dds.clock = suggest_clock
1188 1188 dds.save()
1189 1189
1190 1190 if request.POST['suggest_frequencyA']:
1191 1191 try:
1192 1192 suggest_frequencyA = float(request.POST['suggest_frequencyA'])
1193 1193 except:
1194 1194 messages.warning(request, "Invalid value in FREQUENCY A.")
1195 1195 return redirect('url_verify_experiment', id_exp=experiment.id)
1196 1196 else:
1197 1197 suggest_frequencyA = ""
1198 1198 if suggest_frequencyA:
1199 1199 if jars_conf:
1200 1200 filter_parms = jars.filter_parms
1201 1201 filter_parms = ast.literal_eval(filter_parms)
1202 1202 filter_parms['fch'] = suggest_frequencyA
1203 1203 jars.filter_parms = json.dumps(filter_parms)
1204 1204 jars.save()
1205 1205 kwargs['filter_parms'] = filter_parms
1206 1206 if dds_conf:
1207 1207 dds.frequencyA_Mhz = request.POST['suggest_frequencyA']
1208 1208 dds.save()
1209 1209
1210 1210 kwargs['menu_experiments'] = 'active'
1211 1211 kwargs.update(sidebar(experiment=experiment))
1212 1212 return render(request, 'experiment_verify.html', kwargs)
1213 1213
1214 1214
1215 1215 def parse_mix_result(s):
1216 1216
1217 1217 values = s.split('-')
1218 1218 html = 'EXP MOD OPE DELAY MASK\r\n'
1219 1219
1220 1220 if not values or values[0] in ('', ' '):
1221 1221 return mark_safe(html)
1222 1222
1223 1223 for i, value in enumerate(values):
1224 1224 if not value:
1225 1225 continue
1226 1226 pk, mode, operation, delay, mask = value.split('|')
1227 1227 conf = RCConfiguration.objects.get(pk=pk)
1228 1228 if i == 0:
1229 1229 html += '{:20.18}{:3}{:4}{:9}km{:>6}\r\n'.format(
1230 1230 conf.name,
1231 1231 mode,
1232 1232 ' ',
1233 1233 delay,
1234 1234 mask)
1235 1235 else:
1236 1236 html += '{:20.18}{:3}{:4}{:9}km{:>6}\r\n'.format(
1237 1237 conf.name,
1238 1238 mode,
1239 1239 operation,
1240 1240 delay,
1241 1241 mask)
1242 1242
1243 1243 return mark_safe(html)
1244 1244
1245 1245
1246 1246 def parse_mask(l):
1247 1247
1248 1248 values = []
1249 1249
1250 1250 for x in range(16):
1251 1251 if '{}'.format(x) in l:
1252 1252 values.append(1)
1253 1253 else:
1254 1254 values.append(0)
1255 1255
1256 1256 values.reverse()
1257 1257
1258 1258 return int(''.join([str(x) for x in values]), 2)
1259 1259
1260 1260
1261 1261 def dev_confs(request):
1262 1262
1263 1263 page = request.GET.get('page')
1264 order = ('programmed_date', )
1264 order = ('-programmed_date', )
1265 1265 filters = request.GET.copy()
1266 1266 if 'my configurations' in filters:
1267 1267 filters.pop('my configurations', None)
1268 1268 filters['mine'] = request.user.id
1269 1269 kwargs = get_paginator(Configuration, page, order, filters)
1270 1270 fields = ['tags', 'template', 'historical']
1271 1271 if request.user.is_authenticated:
1272 1272 fields.append('my configurations')
1273 1273 form = FilterForm(initial=request.GET, extra_fields=fields)
1274 1274 kwargs['keys'] = ['name', 'experiment',
1275 1275 'type', 'programmed_date', 'actions']
1276 1276 kwargs['title'] = 'Configuration'
1277 1277 kwargs['suptitle'] = 'List'
1278 1278 kwargs['no_sidebar'] = True
1279 1279 kwargs['form'] = form
1280 1280 kwargs['add_url'] = reverse('url_add_dev_conf', args=[0])
1281 1281 filters = request.GET.copy()
1282 1282 filters.pop('page', None)
1283 1283 kwargs['q'] = urlencode(filters)
1284 1284 kwargs['menu_configurations'] = 'active'
1285 1285
1286 1286 return render(request, 'base_list.html', kwargs)
1287 1287
1288 1288
1289 1289 def dev_conf(request, id_conf):
1290 1290
1291 1291 conf = get_object_or_404(Configuration, pk=id_conf)
1292 1292
1293 1293 return redirect(conf.get_absolute_url())
1294 1294
1295 1295
1296 1296 @login_required
1297 1297 def dev_conf_new(request, id_exp=0, id_dev=0):
1298 1298
1299 1299 if not is_developer(request.user):
1300 1300 messages.error(
1301 1301 request, 'Developer required, to create new configurations')
1302 1302 return redirect('index')
1303 1303
1304 1304 initial = {}
1305 1305 kwargs = {}
1306 1306
1307 1307 if id_exp != 0:
1308 1308 initial['experiment'] = id_exp
1309 1309
1310 1310 if id_dev != 0:
1311 1311 initial['device'] = id_dev
1312 1312
1313 1313 if request.method == 'GET':
1314 1314
1315 1315 if id_dev:
1316 1316 kwargs['button'] = 'Create'
1317 1317 device = Device.objects.get(pk=id_dev)
1318 1318 DevConfForm = CONF_FORMS[device.device_type.name]
1319 1319 initial['name'] = request.GET['name']
1320 1320 form = DevConfForm(initial=initial)
1321 1321 else:
1322 1322 if 'template' in request.GET:
1323 1323 if request.GET['template'] == '0':
1324 1324 choices = [(conf.pk, '{}'.format(conf))
1325 1325 for conf in Configuration.objects.filter(template=True)]
1326 1326 form = NewForm(initial={'create_from': 2},
1327 1327 template_choices=choices)
1328 1328 else:
1329 1329 kwargs['button'] = 'Create'
1330 1330 conf = Configuration.objects.get(
1331 1331 pk=request.GET['template'])
1332 1332 id_dev = conf.device.pk
1333 1333 DevConfForm = CONF_FORMS[conf.device.device_type.name]
1334 1334 form = DevConfForm(instance=conf,
1335 1335 initial={'name': '{}_{:%y%m%d}'.format(conf.name, datetime.now()),
1336 1336 'template': False,
1337 1337 'experiment': id_exp})
1338 1338 elif 'blank' in request.GET:
1339 1339 kwargs['button'] = 'Create'
1340 1340 form = ConfigurationForm(initial=initial)
1341 1341 else:
1342 1342 form = NewForm()
1343 1343
1344 1344 if request.method == 'POST':
1345 1345
1346 1346 device = Device.objects.get(pk=request.POST['device'])
1347 1347 DevConfForm = CONF_FORMS[device.device_type.name]
1348 1348
1349 1349 form = DevConfForm(request.POST)
1350 1350 kwargs['button'] = 'Create'
1351 1351 if form.is_valid():
1352 1352 conf = form.save(commit=False)
1353 1353 conf.author = request.user
1354 1354 conf.save()
1355 1355
1356 1356 if 'template' in request.GET and conf.device.device_type.name == 'rc':
1357 1357 lines = RCLine.objects.filter(
1358 1358 rc_configuration=request.GET['template'])
1359 1359 for line in lines:
1360 1360 line.clone(rc_configuration=conf)
1361 1361
1362 1362 new_lines = conf.get_lines()
1363 1363 for line in new_lines:
1364 1364 line_params = json.loads(line.params)
1365 1365 if 'TX_ref' in line_params:
1366 1366 ref_line = RCLine.objects.get(pk=line_params['TX_ref'])
1367 1367 line_params['TX_ref'] = ['{}'.format(
1368 1368 l.pk) for l in new_lines if l.get_name() == ref_line.get_name()][0]
1369 1369 line.params = json.dumps(line_params)
1370 1370 line.save()
1371 1371 elif conf.device.device_type.name == 'rc':
1372 1372 clk = RCClock(rc_configuration=conf)
1373 1373 clk.save()
1374 1374
1375 1375 return redirect('url_dev_conf', id_conf=conf.pk)
1376 1376
1377 1377 kwargs['id_exp'] = id_exp
1378 1378 kwargs['form'] = form
1379 1379 kwargs['title'] = 'Configuration'
1380 1380 kwargs['suptitle'] = 'New'
1381 1381 kwargs['menu_configurations'] = 'active'
1382 1382
1383 1383 if id_dev != 0:
1384 1384 device = Device.objects.get(pk=id_dev)
1385 1385 kwargs['device'] = device.device_type.name
1386 1386
1387 1387 return render(request, 'dev_conf_edit.html', kwargs)
1388 1388
1389 1389
1390 1390 @login_required
1391 1391 def dev_conf_edit(request, id_conf):
1392 1392
1393 1393 conf = get_object_or_404(Configuration, pk=id_conf)
1394 1394
1395 1395 DevConfForm = CONF_FORMS[conf.device.device_type.name]
1396 1396
1397 1397 if request.method == 'GET':
1398 1398 form = DevConfForm(instance=conf)
1399 1399
1400 1400 if request.method == 'POST':
1401 1401 form = DevConfForm(request.POST, instance=conf)
1402 1402
1403 1403 if form.is_valid():
1404 1404 form.save()
1405 1405 return redirect('url_dev_conf', id_conf=id_conf)
1406 1406
1407 1407 kwargs = {}
1408 1408 kwargs['form'] = form
1409 1409 kwargs['title'] = 'Device Configuration'
1410 1410 kwargs['suptitle'] = 'Edit'
1411 1411 kwargs['button'] = 'Update'
1412 1412 kwargs['menu_configurations'] = 'active'
1413 1413
1414 1414 ###### SIDEBAR ######
1415 1415 kwargs.update(sidebar(conf=conf))
1416 1416
1417 1417 return render(request, '%s_conf_edit.html' % conf.device.device_type.name, kwargs)
1418 1418
1419 1419
1420 1420 @login_required
1421 1421 def dev_conf_start(request, id_conf):
1422 1422
1423 1423 conf = get_object_or_404(Configuration, pk=id_conf)
1424 1424
1425 1425 if conf.start_device():
1426 1426 messages.success(request, conf.message)
1427 1427 else:
1428 1428 messages.error(request, conf.message)
1429 1429
1430 1430 #conf.status_device()
1431 1431
1432 1432 return redirect(conf.get_absolute_url())
1433 1433
1434 1434
1435 1435 @login_required
1436 1436 def dev_conf_stop(request, id_conf):
1437 1437
1438 1438 conf = get_object_or_404(Configuration, pk=id_conf)
1439 1439
1440 1440 if conf.stop_device():
1441 1441 messages.success(request, conf.message)
1442 1442 else:
1443 1443 messages.error(request, conf.message)
1444 1444
1445 1445 #conf.status_device()
1446 1446
1447 1447 return redirect(conf.get_absolute_url())
1448 1448
1449 1449
1450 1450 @login_required
1451 1451 def dev_conf_status(request, id_conf):
1452 1452
1453 1453 conf = get_object_or_404(Configuration, pk=id_conf)
1454 1454
1455 1455 conf_active = Configuration.objects.filter(pk=conf.device.conf_active).first()
1456 1456 if conf_active<>conf:
1457 1457 url = '#' if conf_active is None else conf_active.get_absolute_url()
1458 1458 label = 'None' if conf_active is None else conf_active.label
1459 1459 messages.warning(
1460 1460 request,
1461 1461 mark_safe('The current configuration has not been written to device, the active configuration is <a href="{}">{}</a>'.format(
1462 1462 url,
1463 1463 label
1464 1464 ))
1465 1465 )
1466 1466
1467 1467 return redirect(conf.get_absolute_url())
1468 1468
1469 1469 if conf.status_device():
1470 1470 messages.success(request, conf.message)
1471 1471 else:
1472 1472 messages.error(request, conf.message)
1473 1473
1474 1474 return redirect(conf.get_absolute_url())
1475 1475
1476 1476
1477 1477 @login_required
1478 1478 def dev_conf_reset(request, id_conf):
1479 1479
1480 1480 conf = get_object_or_404(Configuration, pk=id_conf)
1481 1481
1482 1482 if conf.reset_device():
1483 1483 messages.success(request, conf.message)
1484 1484 else:
1485 1485 messages.error(request, conf.message)
1486 1486
1487 1487 return redirect(conf.get_absolute_url())
1488 1488
1489 1489
1490 1490 @login_required
1491 1491 def dev_conf_write(request, id_conf):
1492 1492
1493 1493 conf = get_object_or_404(Configuration, pk=id_conf)
1494 1494
1495 1495 if conf.write_device():
1496 1496 conf.device.conf_active = conf.pk
1497 1497 conf.device.save()
1498 1498 messages.success(request, conf.message)
1499 1499 if has_been_modified(conf):
1500 1500 conf.clone(type=1, template=False)
1501 1501 else:
1502 1502 messages.error(request, conf.message)
1503 1503
1504 1504 return redirect(get_object_or_404(Configuration, pk=id_conf).get_absolute_url())
1505 1505
1506 1506
1507 1507 @login_required
1508 1508 def dev_conf_read(request, id_conf):
1509 1509
1510 1510 conf = get_object_or_404(Configuration, pk=id_conf)
1511 1511
1512 1512 DevConfForm = CONF_FORMS[conf.device.device_type.name]
1513 1513
1514 1514 if request.method == 'GET':
1515 1515
1516 1516 parms = conf.read_device()
1517 1517 #conf.status_device()
1518 1518
1519 1519 if not parms:
1520 1520 messages.error(request, conf.message)
1521 1521 return redirect(conf.get_absolute_url())
1522 1522
1523 1523 form = DevConfForm(initial=parms, instance=conf)
1524 1524
1525 1525 if request.method == 'POST':
1526 1526 form = DevConfForm(request.POST, instance=conf)
1527 1527
1528 1528 if form.is_valid():
1529 1529 form.save()
1530 1530 return redirect(conf.get_absolute_url())
1531 1531
1532 1532 messages.error(request, "Parameters could not be saved")
1533 1533
1534 1534 kwargs = {}
1535 1535 kwargs['id_dev'] = conf.id
1536 1536 kwargs['form'] = form
1537 1537 kwargs['title'] = 'Device Configuration'
1538 1538 kwargs['suptitle'] = 'Parameters read from device'
1539 1539 kwargs['button'] = 'Save'
1540 1540
1541 1541 ###### SIDEBAR ######
1542 1542 kwargs.update(sidebar(conf=conf))
1543 1543
1544 1544 return render(request, '%s_conf_edit.html' % conf.device.device_type.name, kwargs)
1545 1545
1546 1546
1547 1547 @login_required
1548 1548 def dev_conf_import(request, id_conf):
1549 1549
1550 1550 conf = get_object_or_404(Configuration, pk=id_conf)
1551 1551 DevConfForm = CONF_FORMS[conf.device.device_type.name]
1552 1552
1553 1553 if request.method == 'GET':
1554 1554 file_form = UploadFileForm()
1555 1555
1556 1556 if request.method == 'POST':
1557 1557 file_form = UploadFileForm(request.POST, request.FILES)
1558 1558
1559 1559 if file_form.is_valid():
1560 1560
1561 1561 data = conf.import_from_file(request.FILES['file'])
1562 1562 parms = Params(data=data).get_conf(
1563 1563 dtype=conf.device.device_type.name)
1564 1564
1565 1565 if parms:
1566 1566
1567 1567 form = DevConfForm(initial=parms, instance=conf)
1568 1568
1569 1569 kwargs = {}
1570 1570 kwargs['id_dev'] = conf.id
1571 1571 kwargs['form'] = form
1572 1572 kwargs['title'] = 'Device Configuration'
1573 1573 kwargs['suptitle'] = 'Parameters imported'
1574 1574 kwargs['button'] = 'Save'
1575 1575 kwargs['action'] = conf.get_absolute_url_edit()
1576 1576 kwargs['previous'] = conf.get_absolute_url()
1577 1577
1578 1578 ###### SIDEBAR ######
1579 1579 kwargs.update(sidebar(conf=conf))
1580 1580
1581 1581 messages.success(
1582 1582 request, "Parameters imported from: '%s'." % request.FILES['file'].name)
1583 1583
1584 1584 return render(request, '%s_conf_edit.html' % conf.device.device_type.name, kwargs)
1585 1585
1586 1586 messages.error(request, "Could not import parameters from file")
1587 1587
1588 1588 kwargs = {}
1589 1589 kwargs['id_dev'] = conf.id
1590 1590 kwargs['title'] = 'Device Configuration'
1591 1591 kwargs['form'] = file_form
1592 1592 kwargs['suptitle'] = 'Importing file'
1593 1593 kwargs['button'] = 'Import'
1594 1594 kwargs['menu_configurations'] = 'active'
1595 1595
1596 1596 kwargs.update(sidebar(conf=conf))
1597 1597
1598 1598 return render(request, 'dev_conf_import.html', kwargs)
1599 1599
1600 1600
1601 1601 @login_required
1602 1602 def dev_conf_export(request, id_conf):
1603 1603
1604 1604 conf = get_object_or_404(Configuration, pk=id_conf)
1605 1605
1606 1606 if request.method == 'GET':
1607 1607 file_form = DownloadFileForm(conf.device.device_type.name)
1608 1608
1609 1609 if request.method == 'POST':
1610 1610 file_form = DownloadFileForm(
1611 1611 conf.device.device_type.name, request.POST)
1612 1612
1613 1613 if file_form.is_valid():
1614 1614 fields = conf.export_to_file(
1615 1615 format=file_form.cleaned_data['format'])
1616 1616 if not fields['content']:
1617 1617 messages.error(request, conf.message)
1618 1618 return redirect(conf.get_absolute_url_export())
1619 1619 response = HttpResponse(content_type=fields['content_type'])
1620 1620 response['Content-Disposition'] = 'attachment; filename="%s"' % fields['filename']
1621 1621 response.write(fields['content'])
1622 1622
1623 1623 return response
1624 1624
1625 1625 messages.error(request, "Could not export parameters")
1626 1626
1627 1627 kwargs = {}
1628 1628 kwargs['id_dev'] = conf.id
1629 1629 kwargs['title'] = 'Device Configuration'
1630 1630 kwargs['form'] = file_form
1631 1631 kwargs['suptitle'] = 'Exporting file'
1632 1632 kwargs['button'] = 'Export'
1633 1633 kwargs['menu_configurations'] = 'active'
1634 1634
1635 1635 return render(request, 'dev_conf_export.html', kwargs)
1636 1636
1637 1637
1638 1638 @login_required
1639 1639 def dev_conf_delete(request, id_conf):
1640 1640
1641 1641 conf = get_object_or_404(Configuration, pk=id_conf)
1642 1642
1643 1643 if request.method == 'POST':
1644 1644 if is_developer(request.user):
1645 1645 conf.delete()
1646 1646 return redirect('url_dev_confs')
1647 1647
1648 1648 messages.error(request, 'Not enough permission to delete this object')
1649 1649 return redirect(conf.get_absolute_url())
1650 1650
1651 1651 kwargs = {
1652 1652 'title': 'Delete',
1653 1653 'suptitle': 'Configuration',
1654 1654 'object': conf,
1655 1655 'delete': True
1656 1656 }
1657 1657 kwargs['menu_configurations'] = 'active'
1658 1658
1659 1659 return render(request, 'confirm.html', kwargs)
1660 1660
1661 1661
1662 1662 def sidebar(**kwargs):
1663 1663
1664 1664 side_data = {}
1665 1665
1666 1666 conf = kwargs.get('conf', None)
1667 1667 experiment = kwargs.get('experiment', None)
1668 1668
1669 1669 if not experiment:
1670 1670 experiment = conf.experiment
1671 1671
1672 1672 if experiment:
1673 1673 side_data['experiment'] = experiment
1674 1674 campaign = experiment.campaign_set.all()
1675 1675 if campaign:
1676 1676 side_data['campaign'] = campaign[0]
1677 1677 experiments = campaign[0].experiments.all().order_by('name')
1678 1678 else:
1679 1679 experiments = [experiment]
1680 1680 configurations = experiment.configuration_set.filter(type=0)
1681 1681 side_data['side_experiments'] = experiments
1682 1682 side_data['side_configurations'] = configurations.order_by(
1683 1683 'device__device_type__name')
1684 1684
1685 1685 return side_data
1686 1686
1687 1687
1688 1688 def get_paginator(model, page, order, filters={}, n=8):
1689 1689
1690 1690 kwargs = {}
1691 1691 query = Q()
1692 1692 if isinstance(filters, QueryDict):
1693 1693 filters = filters.dict()
1694 1694 [filters.pop(key) for key in filters.keys() if filters[key] in ('', ' ')]
1695 1695 filters.pop('page', None)
1696 1696
1697 1697 fields = [f.name for f in model._meta.get_fields()]
1698 1698
1699 1699 if 'template' in filters:
1700 1700 filters['template'] = True
1701 1701 if 'historical' in filters:
1702 1702 filters.pop('historical')
1703 1703 filters['type'] = 1
1704 1704 elif 'type' in fields:
1705 1705 filters['type'] = 0
1706 1706 if 'start_date' in filters:
1707 1707 filters['start_date__gte'] = filters.pop('start_date')
1708 1708 if 'end_date' in filters:
1709 1709 filters['start_date__lte'] = filters.pop('end_date')
1710 1710 if 'tags' in filters:
1711 1711 tags = filters.pop('tags')
1712 1712 if 'tags' in fields:
1713 1713 query = query | Q(tags__icontains=tags)
1714 1714 if 'label' in fields:
1715 1715 query = query | Q(label__icontains=tags)
1716 1716 if 'location' in fields:
1717 1717 query = query | Q(location__name__icontains=tags)
1718 1718 if 'device' in fields:
1719 1719 query = query | Q(device__device_type__name__icontains=tags)
1720 1720 query = query | Q(device__location__name__icontains=tags)
1721 1721 if 'device_type' in fields:
1722 1722 query = query | Q(device_type__name__icontains=tags)
1723 1723
1724 1724 if 'mine' in filters:
1725 1725 filters['author_id'] = filters['mine']
1726 1726 filters.pop('mine')
1727 1727 object_list = model.objects.filter(query, **filters).order_by(*order)
1728 1728 paginator = Paginator(object_list, n)
1729 1729
1730 1730 try:
1731 1731 objects = paginator.page(page)
1732 1732 except PageNotAnInteger:
1733 1733 objects = paginator.page(1)
1734 1734 except EmptyPage:
1735 1735 objects = paginator.page(paginator.num_pages)
1736 1736
1737 1737 kwargs['objects'] = objects
1738 1738 kwargs['offset'] = (int(page)-1)*n if page else 0
1739 1739
1740 1740 return kwargs
1741 1741
1742 1742
1743 1743 def operation(request, id_camp=None):
1744 1744
1745 1745 kwargs = {}
1746 1746 kwargs['title'] = 'Radars Operation'
1747 1747 kwargs['no_sidebar'] = True
1748 1748 kwargs['menu_operation'] = 'active'
1749 1749 campaigns = Campaign.objects.filter(start_date__lte=datetime.now(),
1750 1750 end_date__gte=datetime.now()).order_by('-start_date')
1751 1751
1752 1752 if id_camp:
1753 1753 campaign = get_object_or_404(Campaign, pk=id_camp)
1754 1754 form = OperationForm(
1755 1755 initial={'campaign': campaign.id}, campaigns=campaigns)
1756 1756 kwargs['campaign'] = campaign
1757 1757 else:
1758 1758 # form = OperationForm(campaigns=campaigns)
1759 1759 kwargs['campaigns'] = campaigns
1760 1760 return render(request, 'operation.html', kwargs)
1761 1761
1762 1762 #---Experiment
1763 1763 keys = ['id', 'name', 'start_time', 'end_time', 'status']
1764 1764 kwargs['experiment_keys'] = keys[1:]
1765 1765 kwargs['experiments'] = experiments
1766 1766 #---Radar
1767 1767 kwargs['locations'] = campaign.get_experiments_by_radar()
1768 1768 kwargs['form'] = form
1769 1769
1770 1770 return render(request, 'operation.html', kwargs)
1771 1771
1772 1772
1773 1773 @login_required
1774 1774 def radar_start(request, id_camp, id_radar):
1775 1775
1776 1776 campaign = get_object_or_404(Campaign, pk=id_camp)
1777 1777 experiments = campaign.get_experiments_by_radar(id_radar)[0]['experiments']
1778 1778 now = datetime.now()
1779 1779 for exp in experiments:
1780 1780 start = datetime.combine(datetime.now().date(), exp.start_time)
1781 1781 end = datetime.combine(datetime.now().date(), exp.end_time)
1782 1782 if end < start:
1783 1783 end += timedelta(1)
1784 1784
1785 1785 if exp.status == 2:
1786 1786 messages.warning(
1787 1787 request, 'Experiment {} already running'.format(exp))
1788 1788 continue
1789 1789
1790 1790 if exp.status == 3:
1791 1791 messages.warning(
1792 1792 request, 'Experiment {} already programmed'.format(exp))
1793 1793 continue
1794 1794
1795 1795 if start > campaign.end_date or start < campaign.start_date:
1796 1796 messages.warning(request, 'Experiment {} out of date'.format(exp))
1797 1797 continue
1798
1798
1799 app.control.revoke(exp.task)
1800
1799 1801 if now > start and now <= end:
1800 exp.status = 3
1801 exp.save()
1802 1802 task = task_start.delay(exp.id)
1803 1803 exp.status = task.wait()
1804 1804 if exp.status == 0:
1805 1805 messages.error(request, 'Experiment {} not start'.format(exp))
1806 1806 if exp.status == 2:
1807 1807 messages.success(request, 'Experiment {} started'.format(exp))
1808 1808 else:
1809 1809 task = task_start.apply_async(
1810 1810 (exp.pk, ), eta=start+timedelta(hours=5))
1811 1811 exp.task = task.id
1812 1812 exp.status = 3
1813 1813 messages.success(
1814 1814 request, 'Experiment {} programmed to start at {}'.format(exp, start))
1815 1815
1816 1816 exp.save()
1817 1817
1818 1818 return HttpResponseRedirect(reverse('url_operation', args=[id_camp]))
1819 1819
1820 1820
1821 1821 @login_required
1822 1822 def radar_stop(request, id_camp, id_radar):
1823 1823
1824 1824 campaign = get_object_or_404(Campaign, pk=id_camp)
1825 1825 experiments = campaign.get_experiments_by_radar(id_radar)[0]['experiments']
1826 1826
1827 1827 for exp in experiments:
1828 1828
1829 1829 if exp.task:
1830 1830 app.control.revoke(exp.task)
1831 1831 if exp.status == 2:
1832 1832 exp.stop()
1833 1833 messages.warning(request, 'Experiment {} stopped'.format(exp))
1834 1834 exp.status = 1
1835 1835 exp.save()
1836 1836
1837 1837 return HttpResponseRedirect(reverse('url_operation', args=[id_camp]))
1838 1838
1839 1839
1840 1840 @login_required
1841 1841 def radar_refresh(request, id_camp, id_radar):
1842 1842
1843 1843 campaign = get_object_or_404(Campaign, pk=id_camp)
1844 1844 experiments = campaign.get_experiments_by_radar(id_radar)[0]['experiments']
1845 1845
1846 1846 i = app.control.inspect()
1847 scheduled = i.scheduled().values[0]
1848 revoked = i.revoked().values[0]
1847 scheduled = i.scheduled().values()[0]
1848 revoked = i.revoked().values()[0]
1849 1849
1850 1850 for exp in experiments:
1851 1851 if exp.task in revoked:
1852 1852 exp.status = 1
1853 elif exp.task in [t['request']['id'] for t in scheduled if 'task_start' in t['request']['name']]:
1854 exp.status = 2
1855 1853 elif exp.task in [t['request']['id'] for t in scheduled if 'task_stop' in t['request']['name']]:
1854 exp.status = 2
1855 elif exp.task in [t['request']['id'] for t in scheduled if 'task_start' in t['request']['name']]:
1856 1856 exp.status = 3
1857 1857 else:
1858 1858 exp.status = 4
1859 1859 exp.save()
1860 1860 return HttpResponseRedirect(reverse('url_operation', args=[id_camp]))
1861 1861
1862 @login_required
1863 def revoke_tasks(request, id_camp):
1864
1865 i = app.control.inspect()
1866 scheduled = i.scheduled().values()[0]
1867 revoked = i.revoked().values()[0]
1868
1869 for t in scheduled:
1870 if t['request']['id'] in revoked:
1871 continue
1872 app.control.revoke(t['request']['id'])
1873 exp = Experiment.objects.get(pk=eval(t['request']['args'])[0])
1874 eta = t['eta']
1875 task = t['request']['name'].split('.')[-1]
1876 messages.warning(request, 'Scheduled {} at {} for experiment {} revoked'.format(task, eta, exp.name))
1877
1878 return HttpResponseRedirect(reverse('url_operation', args=[id_camp]))
1862 1879
1863 1880 def real_time(request):
1864 1881
1865 1882 graphic_path = "/home/fiorella/Pictures/catwbeanie.jpg"
1866 1883
1867 1884 kwargs = {}
1868 1885 kwargs['title'] = 'CLAIRE'
1869 1886 kwargs['suptitle'] = 'Real Time'
1870 1887 kwargs['no_sidebar'] = True
1871 1888 kwargs['graphic_path'] = graphic_path
1872 1889 kwargs['graphic1_path'] = 'http://www.bluemaize.net/im/girls-accessories/shark-beanie-11.jpg'
1873 1890
1874 1891 return render(request, 'real_time.html', kwargs)
1875 1892
1876 1893 def theme(request, theme):
1877 1894
1878 1895 user = request.user
1879 1896 user.profile.theme = theme
1880 1897 user.save()
1881 1898 return redirect('index') No newline at end of file
@@ -1,161 +1,161
1 1 var km_fields = [];
2 2 var unit_fields = [];
3 3 var dc_fields = [];
4 4
5 5
6 6 function str2hz(s){
7 7
8 8 return 150000*Math.pow(parseFloat(s), -1);
9 9 }
10 10
11 11
12 12 function str2unit(s){
13 var km2unit = (20/3)*(parseFloat($('#id_clock_in').val())/parseFloat($('#id_clock_divider').val()));
13 var km2unit = (20/3)*(parseFloat($('#id_frequency').val())/parseFloat($('#id_clock_divider').val()));
14 14 var ret = "";
15 15 values = s.split(",");
16 16 for (i=0; i<values.length; i++) {
17 17 ret += Math.round(parseFloat(values[i])*km2unit);
18 18 ret += ",";
19 19 }
20 20 return ret.substring(0, ret.length-1);
21 21 }
22 22
23 23
24 24 function str2int(s){
25 25 var ret = "";
26 26 values = s.split(",");
27 27 for (i=0; i<values.length; i++) {
28 28 ret += Math.round(parseFloat(values[i]));
29 29 ret += ",";
30 30 }
31 31 return ret.substring(0, ret.length-1);
32 32 }
33 33
34 34
35 35 function str2km(s){
36 var km2unit = (20/3)*(parseFloat($('#id_clock_in').val())/parseFloat($('#id_clock_divider').val()));
36 var km2unit = (20/3)*(parseFloat($('#id_frequency').val())/parseFloat($('#id_clock_divider').val()));
37 37 var ret = "";
38 38 values = s.split(",");
39 39 for (i=0; i<values.length; i++) {
40 40 ret += parseFloat(values[i])/km2unit;
41 41 ret += ",";
42 42 }
43 43 return ret.substring(0, ret.length-1);
44 44 }
45 45
46 46 function str2dc(s){
47 47
48 48 return parseFloat(s)*100/parseFloat($('#id_ipp').val())
49 49 }
50 50
51 51
52 52 function updateUnits() {
53 53
54 54 for (j=0; j<km_fields.length; j++){
55 55 label_unit = "#"+km_fields[j]+"_unit";
56 56 label = "#"+km_fields[j];
57 57 $(label_unit).val(str2unit($(label).val()));
58 58 }
59 59 }
60 60
61 61
62 62 function updateDc() {
63 63
64 64 for (j=0; j<dc_fields.length; j++){
65 65 label_dc = "#"+dc_fields[j]+"_dc";
66 66 label = "#"+dc_fields[j];
67 67 $(label_dc).val(str2dc($(label).val()));
68 68 }
69 69 }
70 70
71 71
72 72 function updateWindows(label) {
73 73
74 74 if (label.indexOf("first_height")>0){
75 75 llabel = label.replace("first_height", "last_height");
76 76 rlabel = label.replace("first_height", "resolution");
77 77 nlabel = label.replace("first_height", "number_of_samples");
78 78 value = parseFloat($(label).val())+parseFloat($(rlabel).val())*(parseInt($(nlabel).val())-1);
79 79 $(llabel).val(value);
80 80 }
81 81
82 82 if (label.indexOf("resolution")>0){
83 83 llabel = label.replace("resolution", "last_height");
84 84 flabel = label.replace("resolution", "first_height");
85 85 nlabel = label.replace("resolution", "number_of_samples");
86 86 value = parseFloat($(flabel).val())+parseFloat($(label).val())*(parseInt($(nlabel).val())-1);
87 87 $(llabel).val(value);
88 88 }
89 89
90 90 if (label.indexOf("number_of_samples")>0){
91 91 llabel = label.replace("number_of_samples", "last_height");
92 92 rlabel = label.replace("number_of_samples", "resolution");
93 93 flabel = label.replace("number_of_samples", "first_height");
94 94 value = parseFloat($(flabel).val())+parseFloat($(rlabel).val())*(parseInt($(label).val())-1);
95 95 $(llabel).val(value);
96 96 }
97 97
98 98 if (label.indexOf("last_height")>0){
99 99 flabel = label.replace("last_height", "first_height");
100 100 rlabel = label.replace("last_height", "resolution");
101 101 nlabel = label.replace("last_height", "number_of_samples");
102 102
103 103 nvalue = Math.round((parseFloat($(label).val())-parseFloat($(flabel).val()))/parseFloat($(rlabel).val()))+1;
104 104 $(nlabel).val(nvalue);
105 105 value = parseFloat($(flabel).val())+parseFloat($(rlabel).val())*(nvalue-1);
106 106 $(label).val(value);
107 107 }
108 108
109 109 }
110 110
111 111 function updateClock() {
112 112 if ($("#id_reference").val()==0){
113 113 var ref = 25;
114 114 }else{
115 115 var ref = 10;
116 116 }
117 117 $("#id_frequency").val(parseFloat($('#id_multiplier').val())*ref/parseFloat($('#id_divisor').val()));
118 118 $("#id_clock").val(parseFloat($('#id_frequency').val())/parseFloat($('#id_clock_divider').val()));
119 119 updateUnits();
120 120 }
121 121
122 122
123 123 $("#id_frequency").change(function() {
124 124 $("#id_clock").val(parseFloat($('#id_frequency').val())/parseFloat($('#id_clock_divider').val()));
125 125 updateUnits();
126 126 });
127 127
128 128 $("#id_clock_divider").change(function() {
129 129 $("#id_clock").val(parseFloat($('#id_frequency').val())/parseFloat($('#id_clock_divider').val()));
130 130 updateUnits();
131 131 });
132 132
133 133 $("#id_mode").change(function() {
134 134 if ($("#id_mode").val()=="False"){
135 135 $('#id_multiplier').removeProp("readonly");
136 136 $('#id_divisor').removeProp("readonly");
137 137 $('#id_reference').removeProp("readonly");
138 138 $('#id_frequency').prop("readonly", true);
139 139 updateClock();
140 140 }else{
141 141 $('#id_frequency').removeProp("readonly");
142 142 $('#id_multiplier').prop("readonly", true);
143 143 $('#id_divisor').prop("readonly", true);
144 144 $('#id_reference').prop("readonly", true);
145 145 $('#id_reference').val(1)
146 146 $('#id_frequency').val(60);
147 147 $("#id_clock").val(parseFloat($('#id_frequency').val())/parseFloat($('#id_clock_divider').val()));
148 148 }
149 149 });
150 150
151 151 $("#id_multiplier").change(function() {
152 152 updateClock();
153 153 });
154 154
155 155 $("#id_divisor").change(function() {
156 156 updateClock();
157 157 });
158 158
159 159 $("#id_reference").change(function() {
160 160 updateClock();
161 161 }); No newline at end of file
@@ -1,417 +1,420
1 1
2 2 import json
3 3
4 4 from django.contrib import messages
5 5 from django.utils.safestring import mark_safe
6 6 from django.shortcuts import render, redirect, get_object_or_404, HttpResponse
7 7 from django.contrib.auth.decorators import login_required
8 8
9 9 from apps.main.models import Experiment, Device
10 10 from apps.main.views import sidebar
11 11
12 12 from .models import RCConfiguration, RCLine, RCLineType, RCLineCode, RCClock
13 13 from .forms import RCConfigurationForm, RCLineForm, RCLineViewForm, RCLineEditForm, RCImportForm, RCLineCodesForm, RCClockForm
14 14
15 15
16 16 def conf(request, conf_id):
17 17
18 18 conf = get_object_or_404(RCConfiguration, pk=conf_id)
19 19
20 20 lines = RCLine.objects.filter(rc_configuration=conf).order_by('channel')
21 clk = RCClock.objects.get(rc_configuration=conf)
21 clk = RCClock.objects.filter(rc_configuration=conf).first()
22 if clk is None:
23 clk = RCClock(rc_configuration=conf)
24 clk.save()
22 25
23 26 for line in lines:
24 27 params = json.loads(line.params)
25 28 line.form = RCLineViewForm(extra_fields=params, line=line)
26 29 if 'params' in params:
27 30 line.subforms = [RCLineViewForm(extra_fields=fields, line=line, subform=True) for fields in params['params']]
28 31
29 32 kwargs = {}
30 33 kwargs['clock'] = clk
31 34 kwargs['dev_conf'] = conf
32 35 kwargs['rc_lines'] = lines
33 36 kwargs['dev_conf_keys'] = ['ipp_unit', 'ntx', 'clock_divider', 'clock',
34 37 'time_before', 'time_after', 'sync', 'sampling_reference',
35 38 'control_tx', 'control_sw']
36 39
37 40 kwargs['title'] = 'Configuration'
38 41 kwargs['suptitle'] = 'Detail'
39 42
40 43 kwargs['button'] = 'Edit Configuration'
41 44 ###### SIDEBAR ######
42 45 kwargs.update(sidebar(conf=conf))
43 46
44 47 return render(request, 'rc_conf.html', kwargs)
45 48
46 49 @login_required
47 50 def conf_edit(request, conf_id):
48 51
49 52 conf = get_object_or_404(RCConfiguration, pk=conf_id)
50 53 clock = RCClock.objects.get(rc_configuration=conf)
51 54 lines = RCLine.objects.filter(rc_configuration=conf).order_by('channel')
52 55
53 56 for line in lines:
54 57 params = json.loads(line.params)
55 58 line.form = RCLineEditForm(conf=conf, line=line, extra_fields=params)
56 59 line.subform = False
57 60
58 61 if 'params' in params:
59 62 line.subforms = [RCLineEditForm(extra_fields=fields, line=line, subform=i) for i, fields in enumerate(params['params'])]
60 63 line.subform = True
61 64
62 65 if request.method=='GET':
63 66
64 67 form = RCConfigurationForm(instance=conf)
65 68 form_clock = RCClockForm(instance=clock)
66 69
67 70 elif request.method=='POST':
68 71
69 72 line_data = {}
70 73 conf_data = {}
71 74 clock_data = {}
72 75 extras = []
73 76
74 77 #classified post fields
75 78 for label,value in request.POST.items():
76 79 if label=='csrfmiddlewaretoken':
77 80 continue
78 81
79 82 if label.count('|')==0:
80 83 if label in ('mode', 'multiplier', 'divisor', 'reference', 'frequency'):
81 84 clock_data[label] = value
82 85 else:
83 86 conf_data[label] = value
84 87 continue
85 88
86 89 elif label.split('|')[0]!='-1':
87 90 extras.append(label)
88 91 continue
89 92
90 93 x, pk, name = label.split('|')
91 94
92 95 if name=='codes':
93 96 value = [s for s in value.split('\r\n') if s]
94 97
95 98 if pk in line_data:
96 99 line_data[pk][name] = value
97 100 else:
98 101 line_data[pk] = {name:value}
99 102
100 103 #update conf
101 104
102 105 form_clock = RCClockForm(clock_data, instance=clock)
103 106 form = RCConfigurationForm(conf_data, instance=conf)
104 107
105 108 if form_clock.is_valid() and form.is_valid():
106 109 form_clock.save()
107 110 form.save()
108 111
109 112 #update lines fields
110 113 extras.sort()
111 114 for label in extras:
112 115 x, pk, name = label.split('|')
113 116 if pk not in line_data:
114 117 line_data[pk] = {}
115 118 if 'params' not in line_data[pk]:
116 119 line_data[pk]['params'] = []
117 120 if len(line_data[pk]['params'])<int(x)+1:
118 121 line_data[pk]['params'].append({})
119 122 line_data[pk]['params'][int(x)][name] = float(request.POST[label])
120 123
121 124 for pk, params in line_data.items():
122 125 line = RCLine.objects.get(pk=pk)
123 126 if line.line_type.name in ('windows', 'prog_pulses'):
124 127 if 'params' not in params:
125 128 params['params'] = []
126 129 line.params = json.dumps(params)
127 130 line.save()
128 131
129 132 #update pulses field
130 133 conf.update_pulses()
131 134
132 135 messages.success(request, 'RC Configuration successfully updated')
133 136
134 137 return redirect(conf.get_absolute_url())
135 138
136 139 kwargs = {}
137 140 kwargs['dev_conf'] = conf
138 141 kwargs['form'] = form
139 142 kwargs['form_clock'] = form_clock
140 143 kwargs['rc_lines'] = lines
141 144 kwargs['edit'] = True
142 145
143 146 kwargs['title'] = 'RC Configuration'
144 147 kwargs['suptitle'] = 'Edit'
145 148 kwargs['button'] = 'Update'
146 149
147 150 return render(request, 'rc_conf_edit.html', kwargs)
148 151
149 152
150 153 def add_line(request, conf_id, line_type_id=None, code_id=None):
151 154
152 155 conf = get_object_or_404(RCConfiguration, pk=conf_id)
153 156
154 157 if request.method=='GET':
155 158 if line_type_id:
156 159 line_type = get_object_or_404(RCLineType, pk=line_type_id)
157 160
158 161 if code_id:
159 162 form = RCLineForm(initial={'rc_configuration':conf_id, 'line_type': line_type_id, 'code_id': code_id},
160 163 extra_fields=json.loads(line_type.params))
161 164 else:
162 165 form = RCLineForm(initial={'rc_configuration':conf_id, 'line_type': line_type_id},
163 166 extra_fields=json.loads(line_type.params))
164 167 else:
165 168 line_type = {'id':0}
166 169 form = RCLineForm(initial={'rc_configuration':conf_id})
167 170
168 171 if request.method=='POST':
169 172
170 173 line_type = get_object_or_404(RCLineType, pk=line_type_id)
171 174 form = RCLineForm(request.POST,
172 175 extra_fields=json.loads(line_type.params))
173 176
174 177 if form.is_valid():
175 178 form.save()
176 179 form.instance.update_pulses()
177 180 return redirect('url_edit_rc_conf', conf.id)
178 181
179 182 kwargs = {}
180 183 kwargs['form'] = form
181 184 kwargs['title'] = 'RC Configuration'
182 185 kwargs['suptitle'] = 'Add Line'
183 186 kwargs['button'] = 'Add'
184 187 kwargs['previous'] = conf.get_absolute_url_edit()
185 188 kwargs['dev_conf'] = conf
186 189 kwargs['line_type'] = line_type
187 190
188 191 return render(request, 'rc_add_line.html', kwargs)
189 192
190 193 def edit_codes(request, conf_id, line_id, code_id=None):
191 194
192 195 conf = get_object_or_404(RCConfiguration, pk=conf_id)
193 196 line = get_object_or_404(RCLine, pk=line_id)
194 197 params = json.loads(line.params)
195 198
196 199 if request.method=='GET':
197 200 if code_id:
198 201 code = get_object_or_404(RCLineCode, pk=code_id)
199 202 form = RCLineCodesForm(instance=code)
200 203 else:
201 204 initial = {'code': params['code'],
202 205 'codes': params['codes'] if 'codes' in params else [],
203 206 'number_of_codes': len(params['codes']) if 'codes' in params else 0,
204 207 'bits_per_code': len(params['codes'][0]) if 'codes' in params else 0,
205 208 }
206 209 form = RCLineCodesForm(initial=initial)
207 210
208 211 if request.method=='POST':
209 212 form = RCLineCodesForm(request.POST)
210 213 if form.is_valid():
211 214 params['code'] = request.POST['code']
212 215 params['codes'] = [s for s in request.POST['codes'].split('\r\n') if s]
213 216 line.params = json.dumps(params)
214 217 line.save()
215 218 messages.success(request, 'Line: "%s" has been updated.' % line)
216 219 return redirect('url_edit_rc_conf', conf.id)
217 220
218 221 kwargs = {}
219 222 kwargs['form'] = form
220 223 kwargs['title'] = line
221 224 kwargs['suptitle'] = 'Edit'
222 225 kwargs['button'] = 'Update'
223 226 kwargs['dev_conf'] = conf
224 227 kwargs['previous'] = conf.get_absolute_url_edit()
225 228 kwargs['line'] = line
226 229
227 230 return render(request, 'rc_edit_codes.html', kwargs)
228 231
229 232 def add_subline(request, conf_id, line_id):
230 233
231 234 conf = get_object_or_404(RCConfiguration, pk=conf_id)
232 235 line = get_object_or_404(RCLine, pk=line_id)
233 236
234 237 if request.method == 'POST':
235 238 if line:
236 239 params = json.loads(line.params)
237 240 subparams = json.loads(line.line_type.params)
238 241 if 'params' in subparams:
239 242 dum = {}
240 243 for key, value in subparams['params'].items():
241 244 dum[key] = value['value']
242 245 params['params'].append(dum)
243 246 line.params = json.dumps(params)
244 247 line.save()
245 248 return redirect('url_edit_rc_conf', conf.id)
246 249
247 250 kwargs = {}
248 251
249 252 kwargs['title'] = 'Add new'
250 253 kwargs['suptitle'] = '%s to %s' % (line.line_type.name, line)
251 254
252 255 return render(request, 'confirm.html', kwargs)
253 256
254 257 def remove_line(request, conf_id, line_id):
255 258
256 259 conf = get_object_or_404(RCConfiguration, pk=conf_id)
257 260 line = get_object_or_404(RCLine, pk=line_id)
258 261
259 262 if request.method == 'POST':
260 263 if line:
261 264 try:
262 265 channel = line.channel
263 266 line.delete()
264 267 for ch in range(channel+1, RCLine.objects.filter(rc_configuration=conf).count()+1):
265 268 l = RCLine.objects.get(rc_configuration=conf, channel=ch)
266 269 l.channel = l.channel-1
267 270 l.save()
268 271 messages.success(request, 'Line: "%s" has been deleted.' % line)
269 272 except:
270 273 messages.error(request, 'Unable to delete line: "%s".' % line)
271 274
272 275 return redirect('url_edit_rc_conf', conf.id)
273 276
274 277 kwargs = {}
275 278
276 279 kwargs['object'] = line
277 280 kwargs['delete'] = True
278 281 kwargs['title'] = 'Delete'
279 282 kwargs['suptitle'] = 'Line'
280 283 kwargs['previous'] = conf.get_absolute_url_edit()
281 284 return render(request, 'confirm.html', kwargs)
282 285
283 286
284 287 def remove_subline(request, conf_id, line_id, subline_id):
285 288
286 289 conf = get_object_or_404(RCConfiguration, pk=conf_id)
287 290 line = get_object_or_404(RCLine, pk=line_id)
288 291
289 292 if request.method == 'POST':
290 293 if line:
291 294 params = json.loads(line.params)
292 295 params['params'].remove(params['params'][int(subline_id)-1])
293 296 line.params = json.dumps(params)
294 297 line.save()
295 298
296 299 return redirect('url_edit_rc_conf', conf.id)
297 300
298 301 kwargs = {}
299 302
300 303 kwargs['object'] = line
301 304 kwargs['object_name'] = line.line_type.name
302 305 kwargs['delete_view'] = True
303 306 kwargs['title'] = 'Confirm delete'
304 307
305 308 return render(request, 'confirm.html', kwargs)
306 309
307 310
308 311 def update_lines_position(request, conf_id):
309 312
310 313 conf = get_object_or_404(RCConfiguration, pk=conf_id)
311 314
312 315 if request.method=='POST':
313 316 ch = 0
314 317 for item in request.POST['items'].split('&'):
315 318 line = RCLine.objects.get(pk=item.split('=')[-1])
316 319 line.channel = ch
317 320 line.save()
318 321 ch += 1
319 322
320 323 lines = RCLine.objects.filter(rc_configuration=conf).order_by('channel')
321 324
322 325 for line in lines:
323 326 params = json.loads(line.params)
324 327 line.form = RCLineEditForm(conf=conf, line=line, extra_fields=params)
325 328
326 329 if 'params' in params:
327 330 line.subform = True
328 331 line.subforms = [RCLineEditForm(extra_fields=fields, line=line, subform=i) for i, fields in enumerate(params['params'])]
329 332
330 333 html = render(request, 'rc_lines.html', {'dev_conf':conf, 'rc_lines':lines, 'edit':True})
331 334 data = {'html': html.content.decode('utf8')}
332 335
333 336 return HttpResponse(json.dumps(data), content_type="application/json")
334 337 return redirect('url_edit_rc_conf', conf.id)
335 338
336 339
337 340 def import_file(request, conf_id):
338 341
339 342 conf = get_object_or_404(RCConfiguration, pk=conf_id)
340 343 if request.method=='POST':
341 344 form = RCImportForm(request.POST, request.FILES)
342 345 if form.is_valid():
343 346 try:
344 347 data = conf.import_from_file(request.FILES['file_name'])
345 348 conf.dict_to_parms(data)
346 349 conf.update_pulses()
347 350 messages.success(request, 'Configuration "%s" loaded succesfully' % request.FILES['file_name'])
348 351 return redirect(conf.get_absolute_url_edit())
349 352
350 353 except Exception as e:
351 354 messages.error(request, 'Error parsing file: "%s" - %s' % (request.FILES['file_name'], repr(e)))
352 355 else:
353 356 messages.warning(request, 'Your current configuration will be replaced')
354 357 form = RCImportForm()
355 358
356 359 kwargs = {}
357 360 kwargs['form'] = form
358 361 kwargs['title'] = 'RC Configuration'
359 362 kwargs['suptitle'] = 'Import file'
360 363 kwargs['button'] = 'Upload'
361 364 kwargs['previous'] = conf.get_absolute_url()
362 365
363 366 return render(request, 'rc_import.html', kwargs)
364 367
365 368
366 369 def plot_pulses(request, conf_id):
367 370
368 371 conf = get_object_or_404(RCConfiguration, pk=conf_id)
369 372 km = True if 'km' in request.GET else False
370 373
371 374 script, div = conf.plot_pulses(km=km)
372 375
373 376 kwargs = {}
374 377 kwargs['no_sidebar'] = True
375 378 kwargs['title'] = 'RC Pulses'
376 379 kwargs['suptitle'] = conf.name
377 380 kwargs['div'] = mark_safe(div)
378 381 kwargs['script'] = mark_safe(script)
379 382 kwargs['units'] = conf.km2unit
380 383 kwargs['kms'] = 1/conf.km2unit
381 384
382 385 if km:
383 386 kwargs['km_selected'] = True
384 387
385 388 if 'json' in request.GET:
386 389 return HttpResponse(json.dumps({'div':mark_safe(div), 'script':mark_safe(script)}), content_type="application/json")
387 390 else:
388 391 return render(request, 'rc_pulses.html', kwargs)
389 392
390 393 def plot_pulses2(request, conf_id):
391 394
392 395 conf = get_object_or_404(RCConfiguration, pk=conf_id)
393 396 km = True if 'km' in request.GET else False
394 397
395 398 script, div = conf.plot_pulses2(km=km)
396 399
397 400 kwargs = {}
398 401 kwargs['no_sidebar'] = True
399 402 kwargs['title'] = 'RC Pulses'
400 403 kwargs['suptitle'] = conf.name
401 404 kwargs['div'] = mark_safe(div)
402 405 kwargs['script'] = mark_safe(script)
403 406 kwargs['units'] = conf.km2unit
404 407 kwargs['kms'] = 1/conf.km2unit
405 408
406 409 if km:
407 410 kwargs['km_selected'] = True
408 411
409 412 if 'json' in request.GET:
410 413 return HttpResponse(json.dumps({'div':mark_safe(div), 'script':mark_safe(script)}), content_type="application/json")
411 414 else:
412 415 return render(request, 'rc_pulses.html', kwargs)
413 416
414 417 def conf_raw(request, conf_id):
415 418 conf = get_object_or_404(RCConfiguration, pk=conf_id)
416 419 raw = conf.write_device(raw=True)
417 420 return HttpResponse(raw, content_type='application/json') No newline at end of file
General Comments 0
You need to be logged in to leave comments. Login now