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