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