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