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