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