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