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