##// END OF EJS Templates
experiment_start view has been updated ...
Fiorella Quino -
r251:27d9b9b9fdc5
parent child
Show More
@@ -1,1649 +1,1655
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
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
31 from .models import Campaign, Experiment, Device, Configuration, Location, RunningExperiment
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 if exp.status == 2:
722 if exp.status == 2:
723 messages.warning(request, 'Experiment {} already running'.format(exp))
723 messages.warning(request, 'Experiment {} already running'.format(exp))
724
724
725 elif exp.status == 3:
725 elif exp.status == 3:
726 messages.warning(request, 'Experiment {} already programmed'.format(exp))
726 messages.warning(request, 'Experiment {} already programmed'.format(exp))
727
727
728 if not (exp.start_time < datetime.now().time() < exp.end_time):
729 exp.status==1
730 exp.save()
731 messages.warning(request, 'Experiment {} is out of time'.format(exp))
732 return redirect(exp.get_absolute_url())
733
728 else:
734 else:
729 task = task_start.delay(exp.pk)
735 task = task_start.delay(exp.pk)
730 exp.status = task.wait()
736 exp.status = task.wait()
731 if exp.status==0:
737 if exp.status==0:
732 messages.error(request, 'Experiment {} not start'.format(exp))
738 messages.error(request, 'Experiment {} not start'.format(exp))
733 if exp.status==2:
739 if exp.status==2:
734 messages.success(request, 'Experiment {} started'.format(exp))
740 messages.success(request, 'Experiment {} started'.format(exp))
735
741
736 exp.save()
742 exp.save()
737
743
738 return redirect(exp.get_absolute_url())
744 return redirect(exp.get_absolute_url())
739
745
740
746
741 @user_passes_test(lambda u:u.is_staff)
747 @user_passes_test(lambda u:u.is_staff)
742 def experiment_stop(request, id_exp):
748 def experiment_stop(request, id_exp):
743
749
744 exp = get_object_or_404(Experiment, pk=id_exp)
750 exp = get_object_or_404(Experiment, pk=id_exp)
745
751
746 if exp.status == 2:
752 if exp.status == 2:
747 task = task_stop.delay(exp.pk)
753 task = task_stop.delay(exp.pk)
748 exp.status = task.wait()
754 exp.status = task.wait()
749 messages.warning(request, 'Experiment {} stopped'.format(exp))
755 messages.warning(request, 'Experiment {} stopped'.format(exp))
750 exp.save()
756 exp.save()
751 else:
757 else:
752 messages.error(request, 'Experiment {} not running'.format(exp))
758 messages.error(request, 'Experiment {} not running'.format(exp))
753
759
754 return redirect(exp.get_absolute_url())
760 return redirect(exp.get_absolute_url())
755
761
756
762
757 @user_passes_test(lambda u:u.is_staff)
763 @user_passes_test(lambda u:u.is_staff)
758 def experiment_mix(request, id_exp):
764 def experiment_mix(request, id_exp):
759
765
760 experiment = get_object_or_404(Experiment, pk=id_exp)
766 experiment = get_object_or_404(Experiment, pk=id_exp)
761 rc_confs = [conf for conf in RCConfiguration.objects.filter(experiment=id_exp,
767 rc_confs = [conf for conf in RCConfiguration.objects.filter(experiment=id_exp,
762 mix=False)]
768 mix=False)]
763
769
764 if len(rc_confs)<2:
770 if len(rc_confs)<2:
765 messages.warning(request, 'You need at least two RC Configurations to make a mix')
771 messages.warning(request, 'You need at least two RC Configurations to make a mix')
766 return redirect(experiment.get_absolute_url())
772 return redirect(experiment.get_absolute_url())
767
773
768 mix_confs = RCConfiguration.objects.filter(experiment=id_exp, mix=True)
774 mix_confs = RCConfiguration.objects.filter(experiment=id_exp, mix=True)
769
775
770 if mix_confs:
776 if mix_confs:
771 mix = mix_confs[0]
777 mix = mix_confs[0]
772 else:
778 else:
773 mix = RCConfiguration(experiment=experiment,
779 mix = RCConfiguration(experiment=experiment,
774 device=rc_confs[0].device,
780 device=rc_confs[0].device,
775 ipp=rc_confs[0].ipp,
781 ipp=rc_confs[0].ipp,
776 clock_in=rc_confs[0].clock_in,
782 clock_in=rc_confs[0].clock_in,
777 clock_divider=rc_confs[0].clock_divider,
783 clock_divider=rc_confs[0].clock_divider,
778 mix=True,
784 mix=True,
779 parameters='')
785 parameters='')
780 mix.save()
786 mix.save()
781
787
782 line_type = RCLineType.objects.get(name='mix')
788 line_type = RCLineType.objects.get(name='mix')
783 for i in range(len(rc_confs[0].get_lines())):
789 for i in range(len(rc_confs[0].get_lines())):
784 line = RCLine(rc_configuration=mix, line_type=line_type, channel=i)
790 line = RCLine(rc_configuration=mix, line_type=line_type, channel=i)
785 line.save()
791 line.save()
786
792
787 initial = {'name': mix.name,
793 initial = {'name': mix.name,
788 'result': parse_mix_result(mix.parameters),
794 'result': parse_mix_result(mix.parameters),
789 'delay': 0,
795 'delay': 0,
790 'mask': [0,1,2,3,4,5,6,7]
796 'mask': [0,1,2,3,4,5,6,7]
791 }
797 }
792
798
793 if request.method=='GET':
799 if request.method=='GET':
794 form = RCMixConfigurationForm(confs=rc_confs, initial=initial)
800 form = RCMixConfigurationForm(confs=rc_confs, initial=initial)
795
801
796 if request.method=='POST':
802 if request.method=='POST':
797 result = mix.parameters
803 result = mix.parameters
798
804
799 if '{}|'.format(request.POST['experiment']) in result:
805 if '{}|'.format(request.POST['experiment']) in result:
800 messages.error(request, 'Configuration already added')
806 messages.error(request, 'Configuration already added')
801 else:
807 else:
802 if 'operation' in request.POST:
808 if 'operation' in request.POST:
803 operation = MIX_OPERATIONS[request.POST['operation']]
809 operation = MIX_OPERATIONS[request.POST['operation']]
804 else:
810 else:
805 operation = ' '
811 operation = ' '
806
812
807 mode = MIX_MODES[request.POST['mode']]
813 mode = MIX_MODES[request.POST['mode']]
808
814
809 if result:
815 if result:
810 result = '{}-{}|{}|{}|{}|{}'.format(mix.parameters,
816 result = '{}-{}|{}|{}|{}|{}'.format(mix.parameters,
811 request.POST['experiment'],
817 request.POST['experiment'],
812 mode,
818 mode,
813 operation,
819 operation,
814 float(request.POST['delay']),
820 float(request.POST['delay']),
815 parse_mask(request.POST.getlist('mask'))
821 parse_mask(request.POST.getlist('mask'))
816 )
822 )
817 else:
823 else:
818 result = '{}|{}|{}|{}|{}'.format(request.POST['experiment'],
824 result = '{}|{}|{}|{}|{}'.format(request.POST['experiment'],
819 mode,
825 mode,
820 operation,
826 operation,
821 float(request.POST['delay']),
827 float(request.POST['delay']),
822 parse_mask(request.POST.getlist('mask'))
828 parse_mask(request.POST.getlist('mask'))
823 )
829 )
824
830
825 mix.parameters = result
831 mix.parameters = result
826 mix.name = request.POST['name']
832 mix.name = request.POST['name']
827 mix.save()
833 mix.save()
828 mix.update_pulses()
834 mix.update_pulses()
829
835
830 initial['result'] = parse_mix_result(result)
836 initial['result'] = parse_mix_result(result)
831 initial['name'] = mix.name
837 initial['name'] = mix.name
832
838
833 form = RCMixConfigurationForm(initial=initial, confs=rc_confs)
839 form = RCMixConfigurationForm(initial=initial, confs=rc_confs)
834
840
835
841
836 kwargs = {
842 kwargs = {
837 'title': 'Experiment',
843 'title': 'Experiment',
838 'suptitle': 'Mix Configurations',
844 'suptitle': 'Mix Configurations',
839 'form' : form,
845 'form' : form,
840 'extra_button': 'Delete',
846 'extra_button': 'Delete',
841 'button': 'Add',
847 'button': 'Add',
842 'cancel': 'Back',
848 'cancel': 'Back',
843 'previous': experiment.get_absolute_url(),
849 'previous': experiment.get_absolute_url(),
844 'id_exp':id_exp,
850 'id_exp':id_exp,
845
851
846 }
852 }
847
853
848 return render(request, 'experiment_mix.html', kwargs)
854 return render(request, 'experiment_mix.html', kwargs)
849
855
850
856
851 @user_passes_test(lambda u:u.is_staff)
857 @user_passes_test(lambda u:u.is_staff)
852 def experiment_mix_delete(request, id_exp):
858 def experiment_mix_delete(request, id_exp):
853
859
854 conf = RCConfiguration.objects.get(experiment=id_exp, mix=True)
860 conf = RCConfiguration.objects.get(experiment=id_exp, mix=True)
855 values = conf.parameters.split('-')
861 values = conf.parameters.split('-')
856 conf.parameters = '-'.join(values[:-1])
862 conf.parameters = '-'.join(values[:-1])
857 conf.save()
863 conf.save()
858
864
859 return redirect('url_mix_experiment', id_exp=id_exp)
865 return redirect('url_mix_experiment', id_exp=id_exp)
860
866
861
867
862 def experiment_summary(request, id_exp):
868 def experiment_summary(request, id_exp):
863
869
864 experiment = get_object_or_404(Experiment, pk=id_exp)
870 experiment = get_object_or_404(Experiment, pk=id_exp)
865 configurations = Configuration.objects.filter(experiment=experiment, type=0)
871 configurations = Configuration.objects.filter(experiment=experiment, type=0)
866
872
867 kwargs = {}
873 kwargs = {}
868
874
869 kwargs['experiment_keys'] = ['radar_system', 'name', 'start_time', 'end_time']
875 kwargs['experiment_keys'] = ['radar_system', 'name', 'start_time', 'end_time']
870 kwargs['experiment'] = experiment
876 kwargs['experiment'] = experiment
871
877
872 kwargs['configurations'] = []
878 kwargs['configurations'] = []
873
879
874 kwargs['title'] = 'Experiment Summary'
880 kwargs['title'] = 'Experiment Summary'
875 kwargs['suptitle'] = 'Details'
881 kwargs['suptitle'] = 'Details'
876
882
877 kwargs['button'] = 'Verify Parameters'
883 kwargs['button'] = 'Verify Parameters'
878
884
879 jars_conf = False
885 jars_conf = False
880 rc_conf = False
886 rc_conf = False
881
887
882 for configuration in configurations:
888 for configuration in configurations:
883
889
884 #--------------------- RC ----------------------:
890 #--------------------- RC ----------------------:
885 if configuration.device.device_type.name == 'rc':
891 if configuration.device.device_type.name == 'rc':
886 if configuration.mix:
892 if configuration.mix:
887 continue
893 continue
888 rc_conf = True
894 rc_conf = True
889 ipp = configuration.ipp
895 ipp = configuration.ipp
890 lines = configuration.get_lines(line_type__name='tx')
896 lines = configuration.get_lines(line_type__name='tx')
891 configuration.tx_lines = []
897 configuration.tx_lines = []
892
898
893 for tx_line in lines:
899 for tx_line in lines:
894 line = {'name':tx_line.get_name()}
900 line = {'name':tx_line.get_name()}
895 tx_params = json.loads(tx_line.params)
901 tx_params = json.loads(tx_line.params)
896 line['width'] = tx_params['pulse_width']
902 line['width'] = tx_params['pulse_width']
897 if line['width'] in (0, '0'):
903 if line['width'] in (0, '0'):
898 continue
904 continue
899 delays = tx_params['delays']
905 delays = tx_params['delays']
900
906
901 if delays not in ('', '0'):
907 if delays not in ('', '0'):
902 n = len(delays.split(','))
908 n = len(delays.split(','))
903 line['taus'] = '{} Taus: {}'.format(n, delays)
909 line['taus'] = '{} Taus: {}'.format(n, delays)
904 else:
910 else:
905 line['taus'] = '-'
911 line['taus'] = '-'
906
912
907 for code_line in configuration.get_lines(line_type__name='codes'):
913 for code_line in configuration.get_lines(line_type__name='codes'):
908 code_params = json.loads(code_line.params)
914 code_params = json.loads(code_line.params)
909 if tx_line.pk==int(code_params['TX_ref']):
915 if tx_line.pk==int(code_params['TX_ref']):
910 line['codes'] = '{}:{}'.format(RCLineCode.objects.get(pk=code_params['code']),
916 line['codes'] = '{}:{}'.format(RCLineCode.objects.get(pk=code_params['code']),
911 '-'.join(code_params['codes']))
917 '-'.join(code_params['codes']))
912
918
913 for windows_line in configuration.get_lines(line_type__name='windows'):
919 for windows_line in configuration.get_lines(line_type__name='windows'):
914 win_params = json.loads(windows_line.params)
920 win_params = json.loads(windows_line.params)
915 if tx_line.pk==int(win_params['TX_ref']):
921 if tx_line.pk==int(win_params['TX_ref']):
916 windows = ''
922 windows = ''
917 for i, params in enumerate(win_params['params']):
923 for i, params in enumerate(win_params['params']):
918 windows += 'W{}: Ho={first_height} km DH={resolution} km NSA={number_of_samples}<br>'.format(i, **params)
924 windows += 'W{}: Ho={first_height} km DH={resolution} km NSA={number_of_samples}<br>'.format(i, **params)
919 line['windows'] = mark_safe(windows)
925 line['windows'] = mark_safe(windows)
920
926
921 configuration.tx_lines.append(line)
927 configuration.tx_lines.append(line)
922
928
923 #-------------------- JARS -----------------------:
929 #-------------------- JARS -----------------------:
924 if configuration.device.device_type.name == 'jars':
930 if configuration.device.device_type.name == 'jars':
925 jars_conf = True
931 jars_conf = True
926 kwargs['exp_type'] = EXPERIMENT_TYPE[configuration.exp_type][1]
932 kwargs['exp_type'] = EXPERIMENT_TYPE[configuration.exp_type][1]
927 channels_number = configuration.channels_number
933 channels_number = configuration.channels_number
928 exp_type = configuration.exp_type
934 exp_type = configuration.exp_type
929 fftpoints = configuration.fftpoints
935 fftpoints = configuration.fftpoints
930 filter_parms = configuration.filter_parms
936 filter_parms = configuration.filter_parms
931 filter_parms = ast.literal_eval(filter_parms)
937 filter_parms = ast.literal_eval(filter_parms)
932 spectral_number = configuration.spectral_number
938 spectral_number = configuration.spectral_number
933
939
934
940
935 kwargs['configurations'].append(configuration)
941 kwargs['configurations'].append(configuration)
936
942
937
943
938 #------ RC & JARS ------:
944 #------ RC & JARS ------:
939 ipp = 937.5 #
945 ipp = 937.5 #
940 nsa = 200#
946 nsa = 200#
941 dh = 1.5 #
947 dh = 1.5 #
942 channels_number = 5 #
948 channels_number = 5 #
943
949
944 if rc_conf and jars_conf:
950 if rc_conf and jars_conf:
945 if exp_type == 0: #Short
951 if exp_type == 0: #Short
946 bytes = 2
952 bytes = 2
947 b = nsa*2*bytes*channels_number
953 b = nsa*2*bytes*channels_number
948 else: #Float
954 else: #Float
949 bytes = 4
955 bytes = 4
950 channels = channels_number + spectral_number
956 channels = channels_number + spectral_number
951 b = nsa*2*bytes*fftpoints*channels
957 b = nsa*2*bytes*fftpoints*channels
952
958
953 ipps = (ipp*pow(10,-6))/0.15
959 ipps = (ipp*pow(10,-6))/0.15
954 GB = 1048576.0*1024.0
960 GB = 1048576.0*1024.0
955 Hour = 3600
961 Hour = 3600
956 rate = b/ipps
962 rate = b/ipps
957 rate = rate *(1/GB)*(Hour)
963 rate = rate *(1/GB)*(Hour)
958 kwargs['rate'] = str(rate)+" GB/h"
964 kwargs['rate'] = str(rate)+" GB/h"
959 else:
965 else:
960 kwargs['rate'] = ''
966 kwargs['rate'] = ''
961
967
962 ###### SIDEBAR ######
968 ###### SIDEBAR ######
963 kwargs.update(sidebar(experiment=experiment))
969 kwargs.update(sidebar(experiment=experiment))
964
970
965 return render(request, 'experiment_summary.html', kwargs)
971 return render(request, 'experiment_summary.html', kwargs)
966
972
967
973
968 @user_passes_test(lambda u:u.is_staff)
974 @user_passes_test(lambda u:u.is_staff)
969 def experiment_verify(request, id_exp):
975 def experiment_verify(request, id_exp):
970
976
971 experiment = get_object_or_404(Experiment, pk=id_exp)
977 experiment = get_object_or_404(Experiment, pk=id_exp)
972 experiment_data = json.loads(experiment.parms_to_dict())
978 experiment_data = json.loads(experiment.parms_to_dict())
973 configurations = Configuration.objects.filter(experiment=experiment, type=0)
979 configurations = Configuration.objects.filter(experiment=experiment, type=0)
974
980
975 kwargs = {}
981 kwargs = {}
976
982
977 kwargs['experiment_keys'] = ['template', 'radar_system', 'name', 'start_time', 'end_time']
983 kwargs['experiment_keys'] = ['template', 'radar_system', 'name', 'start_time', 'end_time']
978 kwargs['experiment'] = experiment
984 kwargs['experiment'] = experiment
979
985
980 kwargs['configuration_keys'] = ['name', 'device__ip_address', 'device__port_address', 'device__status']
986 kwargs['configuration_keys'] = ['name', 'device__ip_address', 'device__port_address', 'device__status']
981 kwargs['configurations'] = configurations
987 kwargs['configurations'] = configurations
982 kwargs['experiment_data'] = experiment_data
988 kwargs['experiment_data'] = experiment_data
983
989
984 kwargs['title'] = 'Verify Experiment'
990 kwargs['title'] = 'Verify Experiment'
985 kwargs['suptitle'] = 'Parameters'
991 kwargs['suptitle'] = 'Parameters'
986
992
987 kwargs['button'] = 'Update'
993 kwargs['button'] = 'Update'
988
994
989 jars_conf = False
995 jars_conf = False
990 rc_conf = False
996 rc_conf = False
991 dds_conf = False
997 dds_conf = False
992
998
993 for configuration in configurations:
999 for configuration in configurations:
994 #-------------------- JARS -----------------------:
1000 #-------------------- JARS -----------------------:
995 if configuration.device.device_type.name == 'jars':
1001 if configuration.device.device_type.name == 'jars':
996 jars_conf = True
1002 jars_conf = True
997 jars = configuration
1003 jars = configuration
998 kwargs['jars_conf'] = jars_conf
1004 kwargs['jars_conf'] = jars_conf
999 filter_parms = configuration.filter_parms
1005 filter_parms = configuration.filter_parms
1000 filter_parms = ast.literal_eval(filter_parms)
1006 filter_parms = ast.literal_eval(filter_parms)
1001 kwargs['filter_parms'] = filter_parms
1007 kwargs['filter_parms'] = filter_parms
1002 #--Sampling Frequency
1008 #--Sampling Frequency
1003 clock = filter_parms['clock']
1009 clock = filter_parms['clock']
1004 filter_2 = filter_parms['filter_2']
1010 filter_2 = filter_parms['filter_2']
1005 filter_5 = filter_parms['filter_5']
1011 filter_5 = filter_parms['filter_5']
1006 filter_fir = filter_parms['filter_fir']
1012 filter_fir = filter_parms['filter_fir']
1007 samp_freq_jars = clock/filter_2/filter_5/filter_fir
1013 samp_freq_jars = clock/filter_2/filter_5/filter_fir
1008
1014
1009 kwargs['samp_freq_jars'] = samp_freq_jars
1015 kwargs['samp_freq_jars'] = samp_freq_jars
1010 kwargs['jars'] = configuration
1016 kwargs['jars'] = configuration
1011
1017
1012 #--------------------- RC ----------------------:
1018 #--------------------- RC ----------------------:
1013 if configuration.device.device_type.name == 'rc' and not configuration.mix:
1019 if configuration.device.device_type.name == 'rc' and not configuration.mix:
1014 rc_conf = True
1020 rc_conf = True
1015 rc = configuration
1021 rc = configuration
1016
1022
1017 rc_parms = configuration.parms_to_dict()
1023 rc_parms = configuration.parms_to_dict()
1018
1024
1019 win_lines = rc.get_lines(line_type__name='windows')
1025 win_lines = rc.get_lines(line_type__name='windows')
1020 if win_lines:
1026 if win_lines:
1021 dh = json.loads(win_lines[0].params)['params'][0]['resolution']
1027 dh = json.loads(win_lines[0].params)['params'][0]['resolution']
1022 #--Sampling Frequency
1028 #--Sampling Frequency
1023 samp_freq_rc = 0.15/dh
1029 samp_freq_rc = 0.15/dh
1024 kwargs['samp_freq_rc'] = samp_freq_rc
1030 kwargs['samp_freq_rc'] = samp_freq_rc
1025
1031
1026 kwargs['rc_conf'] = rc_conf
1032 kwargs['rc_conf'] = rc_conf
1027 kwargs['rc'] = configuration
1033 kwargs['rc'] = configuration
1028
1034
1029 #-------------------- DDS ----------------------:
1035 #-------------------- DDS ----------------------:
1030 if configuration.device.device_type.name == 'dds':
1036 if configuration.device.device_type.name == 'dds':
1031 dds_conf = True
1037 dds_conf = True
1032 dds = configuration
1038 dds = configuration
1033 dds_parms = configuration.parms_to_dict()
1039 dds_parms = configuration.parms_to_dict()
1034
1040
1035 kwargs['dds_conf'] = dds_conf
1041 kwargs['dds_conf'] = dds_conf
1036 kwargs['dds'] = configuration
1042 kwargs['dds'] = configuration
1037
1043
1038
1044
1039 #------------Validation------------:
1045 #------------Validation------------:
1040 #Clock
1046 #Clock
1041 if dds_conf and rc_conf and jars_conf:
1047 if dds_conf and rc_conf and jars_conf:
1042 if float(filter_parms['clock']) != float(rc_parms['clock_in']) and float(rc_parms['clock_in']) != float(dds_parms['clock']):
1048 if float(filter_parms['clock']) != float(rc_parms['clock_in']) and float(rc_parms['clock_in']) != float(dds_parms['clock']):
1043 messages.warning(request, "Devices don't have the same clock.")
1049 messages.warning(request, "Devices don't have the same clock.")
1044 elif rc_conf and jars_conf:
1050 elif rc_conf and jars_conf:
1045 if float(filter_parms['clock']) != float(rc_parms['clock_in']):
1051 if float(filter_parms['clock']) != float(rc_parms['clock_in']):
1046 messages.warning(request, "Devices don't have the same clock.")
1052 messages.warning(request, "Devices don't have the same clock.")
1047 elif rc_conf and dds_conf:
1053 elif rc_conf and dds_conf:
1048 if float(rc_parms['clock_in']) != float(dds_parms['clock']):
1054 if float(rc_parms['clock_in']) != float(dds_parms['clock']):
1049 messages.warning(request, "Devices don't have the same clock.")
1055 messages.warning(request, "Devices don't have the same clock.")
1050 if float(samp_freq_rc) != float(dds_parms['frequencyA']):
1056 if float(samp_freq_rc) != float(dds_parms['frequencyA']):
1051 messages.warning(request, "Devices don't have the same Frequency A.")
1057 messages.warning(request, "Devices don't have the same Frequency A.")
1052
1058
1053
1059
1054 #------------POST METHOD------------:
1060 #------------POST METHOD------------:
1055 if request.method == 'POST':
1061 if request.method == 'POST':
1056 if request.POST['suggest_clock']:
1062 if request.POST['suggest_clock']:
1057 try:
1063 try:
1058 suggest_clock = float(request.POST['suggest_clock'])
1064 suggest_clock = float(request.POST['suggest_clock'])
1059 except:
1065 except:
1060 messages.warning(request, "Invalid value in CLOCK IN.")
1066 messages.warning(request, "Invalid value in CLOCK IN.")
1061 return redirect('url_verify_experiment', id_exp=experiment.id)
1067 return redirect('url_verify_experiment', id_exp=experiment.id)
1062 else:
1068 else:
1063 suggest_clock = ""
1069 suggest_clock = ""
1064 if suggest_clock:
1070 if suggest_clock:
1065 if rc_conf:
1071 if rc_conf:
1066 rc.clock_in = suggest_clock
1072 rc.clock_in = suggest_clock
1067 rc.save()
1073 rc.save()
1068 if jars_conf:
1074 if jars_conf:
1069 filter_parms = jars.filter_parms
1075 filter_parms = jars.filter_parms
1070 filter_parms = ast.literal_eval(filter_parms)
1076 filter_parms = ast.literal_eval(filter_parms)
1071 filter_parms['clock'] = suggest_clock
1077 filter_parms['clock'] = suggest_clock
1072 jars.filter_parms = json.dumps(filter_parms)
1078 jars.filter_parms = json.dumps(filter_parms)
1073 jars.save()
1079 jars.save()
1074 kwargs['filter_parms'] = filter_parms
1080 kwargs['filter_parms'] = filter_parms
1075 if dds_conf:
1081 if dds_conf:
1076 dds.clock = suggest_clock
1082 dds.clock = suggest_clock
1077 dds.save()
1083 dds.save()
1078
1084
1079 if request.POST['suggest_frequencyA']:
1085 if request.POST['suggest_frequencyA']:
1080 try:
1086 try:
1081 suggest_frequencyA = float(request.POST['suggest_frequencyA'])
1087 suggest_frequencyA = float(request.POST['suggest_frequencyA'])
1082 except:
1088 except:
1083 messages.warning(request, "Invalid value in FREQUENCY A.")
1089 messages.warning(request, "Invalid value in FREQUENCY A.")
1084 return redirect('url_verify_experiment', id_exp=experiment.id)
1090 return redirect('url_verify_experiment', id_exp=experiment.id)
1085 else:
1091 else:
1086 suggest_frequencyA = ""
1092 suggest_frequencyA = ""
1087 if suggest_frequencyA:
1093 if suggest_frequencyA:
1088 if jars_conf:
1094 if jars_conf:
1089 filter_parms = jars.filter_parms
1095 filter_parms = jars.filter_parms
1090 filter_parms = ast.literal_eval(filter_parms)
1096 filter_parms = ast.literal_eval(filter_parms)
1091 filter_parms['fch'] = suggest_frequencyA
1097 filter_parms['fch'] = suggest_frequencyA
1092 jars.filter_parms = json.dumps(filter_parms)
1098 jars.filter_parms = json.dumps(filter_parms)
1093 jars.save()
1099 jars.save()
1094 kwargs['filter_parms'] = filter_parms
1100 kwargs['filter_parms'] = filter_parms
1095 if dds_conf:
1101 if dds_conf:
1096 dds.frequencyA_Mhz = request.POST['suggest_frequencyA']
1102 dds.frequencyA_Mhz = request.POST['suggest_frequencyA']
1097 dds.save()
1103 dds.save()
1098
1104
1099 ###### SIDEBAR ######
1105 ###### SIDEBAR ######
1100 kwargs.update(sidebar(experiment=experiment))
1106 kwargs.update(sidebar(experiment=experiment))
1101
1107
1102
1108
1103
1109
1104
1110
1105
1111
1106 return render(request, 'experiment_verify.html', kwargs)
1112 return render(request, 'experiment_verify.html', kwargs)
1107
1113
1108
1114
1109 #@user_passes_test(lambda u:u.is_staff)
1115 #@user_passes_test(lambda u:u.is_staff)
1110 def parse_mix_result(s):
1116 def parse_mix_result(s):
1111
1117
1112 values = s.split('-')
1118 values = s.split('-')
1113 html = 'EXP MOD OPE DELAY MASK\r\n'
1119 html = 'EXP MOD OPE DELAY MASK\r\n'
1114
1120
1115 if not values or values[0] in ('', ' '):
1121 if not values or values[0] in ('', ' '):
1116 return mark_safe(html)
1122 return mark_safe(html)
1117
1123
1118 for i, value in enumerate(values):
1124 for i, value in enumerate(values):
1119 if not value:
1125 if not value:
1120 continue
1126 continue
1121 pk, mode, operation, delay, mask = value.split('|')
1127 pk, mode, operation, delay, mask = value.split('|')
1122 conf = RCConfiguration.objects.get(pk=pk)
1128 conf = RCConfiguration.objects.get(pk=pk)
1123 if i==0:
1129 if i==0:
1124 html += '{:20.18}{:3}{:4}{:9}km{:>6}\r\n'.format(
1130 html += '{:20.18}{:3}{:4}{:9}km{:>6}\r\n'.format(
1125 conf.name,
1131 conf.name,
1126 mode,
1132 mode,
1127 ' ',
1133 ' ',
1128 delay,
1134 delay,
1129 mask)
1135 mask)
1130 else:
1136 else:
1131 html += '{:20.18}{:3}{:4}{:9}km{:>6}\r\n'.format(
1137 html += '{:20.18}{:3}{:4}{:9}km{:>6}\r\n'.format(
1132 conf.name,
1138 conf.name,
1133 mode,
1139 mode,
1134 operation,
1140 operation,
1135 delay,
1141 delay,
1136 mask)
1142 mask)
1137
1143
1138 return mark_safe(html)
1144 return mark_safe(html)
1139
1145
1140 def parse_mask(l):
1146 def parse_mask(l):
1141
1147
1142 values = []
1148 values = []
1143
1149
1144 for x in range(8):
1150 for x in range(8):
1145 if '{}'.format(x) in l:
1151 if '{}'.format(x) in l:
1146 values.append(1)
1152 values.append(1)
1147 else:
1153 else:
1148 values.append(0)
1154 values.append(0)
1149
1155
1150 values.reverse()
1156 values.reverse()
1151
1157
1152 return int(''.join([str(x) for x in values]), 2)
1158 return int(''.join([str(x) for x in values]), 2)
1153
1159
1154
1160
1155 def dev_confs(request):
1161 def dev_confs(request):
1156
1162
1157
1163
1158 page = request.GET.get('page')
1164 page = request.GET.get('page')
1159 order = ('type', 'device__device_type', 'experiment')
1165 order = ('type', 'device__device_type', 'experiment')
1160 filters = request.GET.copy()
1166 filters = request.GET.copy()
1161
1167
1162 kwargs = get_paginator(Configuration, page, order, filters)
1168 kwargs = get_paginator(Configuration, page, order, filters)
1163
1169
1164 form = FilterForm(initial=request.GET, extra_fields=['tags','template'])
1170 form = FilterForm(initial=request.GET, extra_fields=['tags','template'])
1165 kwargs['keys'] = ['name', 'experiment', 'type', 'programmed_date']
1171 kwargs['keys'] = ['name', 'experiment', 'type', 'programmed_date']
1166 kwargs['title'] = 'Configuration'
1172 kwargs['title'] = 'Configuration'
1167 kwargs['suptitle'] = 'List'
1173 kwargs['suptitle'] = 'List'
1168 kwargs['no_sidebar'] = True
1174 kwargs['no_sidebar'] = True
1169 kwargs['form'] = form
1175 kwargs['form'] = form
1170 filters.pop('page', None)
1176 filters.pop('page', None)
1171 kwargs['q'] = urlencode(filters)
1177 kwargs['q'] = urlencode(filters)
1172
1178
1173 return render(request, 'base_list.html', kwargs)
1179 return render(request, 'base_list.html', kwargs)
1174
1180
1175
1181
1176 def dev_conf(request, id_conf):
1182 def dev_conf(request, id_conf):
1177
1183
1178 conf = get_object_or_404(Configuration, pk=id_conf)
1184 conf = get_object_or_404(Configuration, pk=id_conf)
1179
1185
1180 return redirect(conf.get_absolute_url())
1186 return redirect(conf.get_absolute_url())
1181
1187
1182
1188
1183 @user_passes_test(lambda u:u.is_staff)
1189 @user_passes_test(lambda u:u.is_staff)
1184 def dev_conf_new(request, id_exp=0, id_dev=0):
1190 def dev_conf_new(request, id_exp=0, id_dev=0):
1185
1191
1186 initial = {}
1192 initial = {}
1187 kwargs = {}
1193 kwargs = {}
1188
1194
1189 if id_exp!=0:
1195 if id_exp!=0:
1190 initial['experiment'] = id_exp
1196 initial['experiment'] = id_exp
1191
1197
1192 if id_dev!=0:
1198 if id_dev!=0:
1193 initial['device'] = id_dev
1199 initial['device'] = id_dev
1194
1200
1195 if request.method == 'GET':
1201 if request.method == 'GET':
1196
1202
1197 if id_dev:
1203 if id_dev:
1198 kwargs['button'] = 'Create'
1204 kwargs['button'] = 'Create'
1199 device = Device.objects.get(pk=id_dev)
1205 device = Device.objects.get(pk=id_dev)
1200 DevConfForm = CONF_FORMS[device.device_type.name]
1206 DevConfForm = CONF_FORMS[device.device_type.name]
1201 initial['name'] = request.GET['name']
1207 initial['name'] = request.GET['name']
1202 form = DevConfForm(initial=initial)
1208 form = DevConfForm(initial=initial)
1203 else:
1209 else:
1204 if 'template' in request.GET:
1210 if 'template' in request.GET:
1205 if request.GET['template']=='0':
1211 if request.GET['template']=='0':
1206 choices = [(conf.pk, '{}'.format(conf)) for conf in Configuration.objects.filter(template=True)]
1212 choices = [(conf.pk, '{}'.format(conf)) for conf in Configuration.objects.filter(template=True)]
1207 form = NewForm(initial={'create_from':2},
1213 form = NewForm(initial={'create_from':2},
1208 template_choices=choices)
1214 template_choices=choices)
1209 else:
1215 else:
1210 kwargs['button'] = 'Create'
1216 kwargs['button'] = 'Create'
1211 conf = Configuration.objects.get(pk=request.GET['template'])
1217 conf = Configuration.objects.get(pk=request.GET['template'])
1212 id_dev = conf.device.pk
1218 id_dev = conf.device.pk
1213 DevConfForm = CONF_FORMS[conf.device.device_type.name]
1219 DevConfForm = CONF_FORMS[conf.device.device_type.name]
1214 form = DevConfForm(instance=conf,
1220 form = DevConfForm(instance=conf,
1215 initial={'name': '{} [{:%Y/%m/%d}]'.format(conf.name, datetime.now()),
1221 initial={'name': '{} [{:%Y/%m/%d}]'.format(conf.name, datetime.now()),
1216 'template': False,
1222 'template': False,
1217 'experiment':id_exp})
1223 'experiment':id_exp})
1218 elif 'blank' in request.GET:
1224 elif 'blank' in request.GET:
1219 kwargs['button'] = 'Create'
1225 kwargs['button'] = 'Create'
1220 form = ConfigurationForm(initial=initial)
1226 form = ConfigurationForm(initial=initial)
1221 else:
1227 else:
1222 form = NewForm()
1228 form = NewForm()
1223
1229
1224 if request.method == 'POST':
1230 if request.method == 'POST':
1225
1231
1226 device = Device.objects.get(pk=request.POST['device'])
1232 device = Device.objects.get(pk=request.POST['device'])
1227 DevConfForm = CONF_FORMS[device.device_type.name]
1233 DevConfForm = CONF_FORMS[device.device_type.name]
1228
1234
1229 form = DevConfForm(request.POST)
1235 form = DevConfForm(request.POST)
1230 kwargs['button'] = 'Create'
1236 kwargs['button'] = 'Create'
1231 if form.is_valid():
1237 if form.is_valid():
1232 conf = form.save()
1238 conf = form.save()
1233
1239
1234 if 'template' in request.GET and conf.device.device_type.name=='rc':
1240 if 'template' in request.GET and conf.device.device_type.name=='rc':
1235 lines = RCLine.objects.filter(rc_configuration=request.GET['template'])
1241 lines = RCLine.objects.filter(rc_configuration=request.GET['template'])
1236 for line in lines:
1242 for line in lines:
1237 line.clone(rc_configuration=conf)
1243 line.clone(rc_configuration=conf)
1238
1244
1239 if conf.device.device_type.name=='jars':
1245 if conf.device.device_type.name=='jars':
1240 conf.add_parms_to_filter()
1246 conf.add_parms_to_filter()
1241
1247
1242 return redirect('url_dev_conf', id_conf=conf.pk)
1248 return redirect('url_dev_conf', id_conf=conf.pk)
1243
1249
1244 kwargs['id_exp'] = id_exp
1250 kwargs['id_exp'] = id_exp
1245 kwargs['form'] = form
1251 kwargs['form'] = form
1246 kwargs['title'] = 'Configuration'
1252 kwargs['title'] = 'Configuration'
1247 kwargs['suptitle'] = 'New'
1253 kwargs['suptitle'] = 'New'
1248
1254
1249
1255
1250 if id_dev != 0:
1256 if id_dev != 0:
1251 device = Device.objects.get(pk=id_dev)
1257 device = Device.objects.get(pk=id_dev)
1252 kwargs['device'] = device.device_type.name
1258 kwargs['device'] = device.device_type.name
1253
1259
1254 return render(request, 'dev_conf_edit.html', kwargs)
1260 return render(request, 'dev_conf_edit.html', kwargs)
1255
1261
1256
1262
1257 @user_passes_test(lambda u:u.is_staff)
1263 @user_passes_test(lambda u:u.is_staff)
1258 def dev_conf_edit(request, id_conf):
1264 def dev_conf_edit(request, id_conf):
1259
1265
1260 conf = get_object_or_404(Configuration, pk=id_conf)
1266 conf = get_object_or_404(Configuration, pk=id_conf)
1261
1267
1262 DevConfForm = CONF_FORMS[conf.device.device_type.name]
1268 DevConfForm = CONF_FORMS[conf.device.device_type.name]
1263
1269
1264 if request.method=='GET':
1270 if request.method=='GET':
1265 form = DevConfForm(instance=conf)
1271 form = DevConfForm(instance=conf)
1266
1272
1267 if request.method=='POST':
1273 if request.method=='POST':
1268 form = DevConfForm(request.POST, instance=conf)
1274 form = DevConfForm(request.POST, instance=conf)
1269
1275
1270 if form.is_valid():
1276 if form.is_valid():
1271 form.save()
1277 form.save()
1272 return redirect('url_dev_conf', id_conf=id_conf)
1278 return redirect('url_dev_conf', id_conf=id_conf)
1273
1279
1274 kwargs = {}
1280 kwargs = {}
1275 kwargs['form'] = form
1281 kwargs['form'] = form
1276 kwargs['title'] = 'Device Configuration'
1282 kwargs['title'] = 'Device Configuration'
1277 kwargs['suptitle'] = 'Edit'
1283 kwargs['suptitle'] = 'Edit'
1278 kwargs['button'] = 'Update'
1284 kwargs['button'] = 'Update'
1279
1285
1280 ###### SIDEBAR ######
1286 ###### SIDEBAR ######
1281 kwargs.update(sidebar(conf=conf))
1287 kwargs.update(sidebar(conf=conf))
1282
1288
1283 return render(request, '%s_conf_edit.html' % conf.device.device_type.name, kwargs)
1289 return render(request, '%s_conf_edit.html' % conf.device.device_type.name, kwargs)
1284
1290
1285
1291
1286 @user_passes_test(lambda u:u.is_staff)
1292 @user_passes_test(lambda u:u.is_staff)
1287 def dev_conf_start(request, id_conf):
1293 def dev_conf_start(request, id_conf):
1288
1294
1289 conf = get_object_or_404(Configuration, pk=id_conf)
1295 conf = get_object_or_404(Configuration, pk=id_conf)
1290
1296
1291 if conf.start_device():
1297 if conf.start_device():
1292 messages.success(request, conf.message)
1298 messages.success(request, conf.message)
1293 else:
1299 else:
1294 messages.error(request, conf.message)
1300 messages.error(request, conf.message)
1295
1301
1296 #conf.status_device()
1302 #conf.status_device()
1297
1303
1298 return redirect(conf.get_absolute_url())
1304 return redirect(conf.get_absolute_url())
1299
1305
1300
1306
1301 @user_passes_test(lambda u:u.is_staff)
1307 @user_passes_test(lambda u:u.is_staff)
1302 def dev_conf_stop(request, id_conf):
1308 def dev_conf_stop(request, id_conf):
1303
1309
1304 conf = get_object_or_404(Configuration, pk=id_conf)
1310 conf = get_object_or_404(Configuration, pk=id_conf)
1305
1311
1306 if conf.stop_device():
1312 if conf.stop_device():
1307 messages.success(request, conf.message)
1313 messages.success(request, conf.message)
1308 else:
1314 else:
1309 messages.error(request, conf.message)
1315 messages.error(request, conf.message)
1310
1316
1311 #conf.status_device()
1317 #conf.status_device()
1312
1318
1313 return redirect(conf.get_absolute_url())
1319 return redirect(conf.get_absolute_url())
1314
1320
1315
1321
1316 def dev_conf_status(request, id_conf):
1322 def dev_conf_status(request, id_conf):
1317
1323
1318 conf = get_object_or_404(Configuration, pk=id_conf)
1324 conf = get_object_or_404(Configuration, pk=id_conf)
1319
1325
1320 if conf.status_device():
1326 if conf.status_device():
1321 messages.success(request, conf.message)
1327 messages.success(request, conf.message)
1322 else:
1328 else:
1323 messages.error(request, conf.message)
1329 messages.error(request, conf.message)
1324
1330
1325 return redirect(conf.get_absolute_url())
1331 return redirect(conf.get_absolute_url())
1326
1332
1327
1333
1328 @user_passes_test(lambda u:u.is_staff)
1334 @user_passes_test(lambda u:u.is_staff)
1329 def dev_conf_write(request, id_conf):
1335 def dev_conf_write(request, id_conf):
1330
1336
1331 conf = get_object_or_404(Configuration, pk=id_conf)
1337 conf = get_object_or_404(Configuration, pk=id_conf)
1332
1338
1333 if conf.write_device():
1339 if conf.write_device():
1334 messages.success(request, conf.message)
1340 messages.success(request, conf.message)
1335 conf.clone(type=1, template=False)
1341 conf.clone(type=1, template=False)
1336 else:
1342 else:
1337 messages.error(request, conf.message)
1343 messages.error(request, conf.message)
1338
1344
1339 return redirect(conf.get_absolute_url())
1345 return redirect(conf.get_absolute_url())
1340
1346
1341
1347
1342 @user_passes_test(lambda u:u.is_staff)
1348 @user_passes_test(lambda u:u.is_staff)
1343 def dev_conf_read(request, id_conf):
1349 def dev_conf_read(request, id_conf):
1344
1350
1345 conf = get_object_or_404(Configuration, pk=id_conf)
1351 conf = get_object_or_404(Configuration, pk=id_conf)
1346
1352
1347 DevConfForm = CONF_FORMS[conf.device.device_type.name]
1353 DevConfForm = CONF_FORMS[conf.device.device_type.name]
1348
1354
1349 if request.method=='GET':
1355 if request.method=='GET':
1350
1356
1351 parms = conf.read_device()
1357 parms = conf.read_device()
1352 #conf.status_device()
1358 #conf.status_device()
1353
1359
1354 if not parms:
1360 if not parms:
1355 messages.error(request, conf.message)
1361 messages.error(request, conf.message)
1356 return redirect(conf.get_absolute_url())
1362 return redirect(conf.get_absolute_url())
1357
1363
1358 form = DevConfForm(initial=parms, instance=conf)
1364 form = DevConfForm(initial=parms, instance=conf)
1359
1365
1360 if request.method=='POST':
1366 if request.method=='POST':
1361 form = DevConfForm(request.POST, instance=conf)
1367 form = DevConfForm(request.POST, instance=conf)
1362
1368
1363 if form.is_valid():
1369 if form.is_valid():
1364 form.save()
1370 form.save()
1365 return redirect(conf.get_absolute_url())
1371 return redirect(conf.get_absolute_url())
1366
1372
1367 messages.error(request, "Parameters could not be saved")
1373 messages.error(request, "Parameters could not be saved")
1368
1374
1369 kwargs = {}
1375 kwargs = {}
1370 kwargs['id_dev'] = conf.id
1376 kwargs['id_dev'] = conf.id
1371 kwargs['form'] = form
1377 kwargs['form'] = form
1372 kwargs['title'] = 'Device Configuration'
1378 kwargs['title'] = 'Device Configuration'
1373 kwargs['suptitle'] = 'Parameters read from device'
1379 kwargs['suptitle'] = 'Parameters read from device'
1374 kwargs['button'] = 'Save'
1380 kwargs['button'] = 'Save'
1375
1381
1376 ###### SIDEBAR ######
1382 ###### SIDEBAR ######
1377 kwargs.update(sidebar(conf=conf))
1383 kwargs.update(sidebar(conf=conf))
1378
1384
1379 return render(request, '%s_conf_edit.html' %conf.device.device_type.name, kwargs)
1385 return render(request, '%s_conf_edit.html' %conf.device.device_type.name, kwargs)
1380
1386
1381
1387
1382 @user_passes_test(lambda u:u.is_staff)
1388 @user_passes_test(lambda u:u.is_staff)
1383 def dev_conf_import(request, id_conf):
1389 def dev_conf_import(request, id_conf):
1384
1390
1385 conf = get_object_or_404(Configuration, pk=id_conf)
1391 conf = get_object_or_404(Configuration, pk=id_conf)
1386 DevConfForm = CONF_FORMS[conf.device.device_type.name]
1392 DevConfForm = CONF_FORMS[conf.device.device_type.name]
1387
1393
1388 if request.method == 'GET':
1394 if request.method == 'GET':
1389 file_form = UploadFileForm()
1395 file_form = UploadFileForm()
1390
1396
1391 if request.method == 'POST':
1397 if request.method == 'POST':
1392 file_form = UploadFileForm(request.POST, request.FILES)
1398 file_form = UploadFileForm(request.POST, request.FILES)
1393
1399
1394 if file_form.is_valid():
1400 if file_form.is_valid():
1395
1401
1396 parms = conf.import_from_file(request.FILES['file'])
1402 parms = conf.import_from_file(request.FILES['file'])
1397
1403
1398 if parms:
1404 if parms:
1399 messages.success(request, "Parameters imported from: '%s'." %request.FILES['file'].name)
1405 messages.success(request, "Parameters imported from: '%s'." %request.FILES['file'].name)
1400 form = DevConfForm(initial=parms, instance=conf)
1406 form = DevConfForm(initial=parms, instance=conf)
1401
1407
1402 kwargs = {}
1408 kwargs = {}
1403 kwargs['id_dev'] = conf.id
1409 kwargs['id_dev'] = conf.id
1404 kwargs['form'] = form
1410 kwargs['form'] = form
1405 kwargs['title'] = 'Device Configuration'
1411 kwargs['title'] = 'Device Configuration'
1406 kwargs['suptitle'] = 'Parameters imported'
1412 kwargs['suptitle'] = 'Parameters imported'
1407 kwargs['button'] = 'Save'
1413 kwargs['button'] = 'Save'
1408 kwargs['action'] = conf.get_absolute_url_edit()
1414 kwargs['action'] = conf.get_absolute_url_edit()
1409 kwargs['previous'] = conf.get_absolute_url()
1415 kwargs['previous'] = conf.get_absolute_url()
1410
1416
1411 ###### SIDEBAR ######
1417 ###### SIDEBAR ######
1412 kwargs.update(sidebar(conf=conf))
1418 kwargs.update(sidebar(conf=conf))
1413
1419
1414 return render(request, '%s_conf_edit.html' % conf.device.device_type.name, kwargs)
1420 return render(request, '%s_conf_edit.html' % conf.device.device_type.name, kwargs)
1415
1421
1416 messages.error(request, "Could not import parameters from file")
1422 messages.error(request, "Could not import parameters from file")
1417
1423
1418 kwargs = {}
1424 kwargs = {}
1419 kwargs['id_dev'] = conf.id
1425 kwargs['id_dev'] = conf.id
1420 kwargs['title'] = 'Device Configuration'
1426 kwargs['title'] = 'Device Configuration'
1421 kwargs['form'] = file_form
1427 kwargs['form'] = file_form
1422 kwargs['suptitle'] = 'Importing file'
1428 kwargs['suptitle'] = 'Importing file'
1423 kwargs['button'] = 'Import'
1429 kwargs['button'] = 'Import'
1424
1430
1425 kwargs.update(sidebar(conf=conf))
1431 kwargs.update(sidebar(conf=conf))
1426
1432
1427 return render(request, 'dev_conf_import.html', kwargs)
1433 return render(request, 'dev_conf_import.html', kwargs)
1428
1434
1429
1435
1430 @user_passes_test(lambda u:u.is_staff)
1436 @user_passes_test(lambda u:u.is_staff)
1431 def dev_conf_export(request, id_conf):
1437 def dev_conf_export(request, id_conf):
1432
1438
1433 conf = get_object_or_404(Configuration, pk=id_conf)
1439 conf = get_object_or_404(Configuration, pk=id_conf)
1434
1440
1435 if request.method == 'GET':
1441 if request.method == 'GET':
1436 file_form = DownloadFileForm(conf.device.device_type.name)
1442 file_form = DownloadFileForm(conf.device.device_type.name)
1437
1443
1438 if request.method == 'POST':
1444 if request.method == 'POST':
1439 file_form = DownloadFileForm(conf.device.device_type.name, request.POST)
1445 file_form = DownloadFileForm(conf.device.device_type.name, request.POST)
1440
1446
1441 if file_form.is_valid():
1447 if file_form.is_valid():
1442 fields = conf.export_to_file(format = file_form.cleaned_data['format'])
1448 fields = conf.export_to_file(format = file_form.cleaned_data['format'])
1443
1449
1444 response = HttpResponse(content_type=fields['content_type'])
1450 response = HttpResponse(content_type=fields['content_type'])
1445 response['Content-Disposition'] = 'attachment; filename="%s"' %fields['filename']
1451 response['Content-Disposition'] = 'attachment; filename="%s"' %fields['filename']
1446 response.write(fields['content'])
1452 response.write(fields['content'])
1447
1453
1448 return response
1454 return response
1449
1455
1450 messages.error(request, "Could not export parameters")
1456 messages.error(request, "Could not export parameters")
1451
1457
1452 kwargs = {}
1458 kwargs = {}
1453 kwargs['id_dev'] = conf.id
1459 kwargs['id_dev'] = conf.id
1454 kwargs['title'] = 'Device Configuration'
1460 kwargs['title'] = 'Device Configuration'
1455 kwargs['form'] = file_form
1461 kwargs['form'] = file_form
1456 kwargs['suptitle'] = 'Exporting file'
1462 kwargs['suptitle'] = 'Exporting file'
1457 kwargs['button'] = 'Export'
1463 kwargs['button'] = 'Export'
1458
1464
1459 return render(request, 'dev_conf_export.html', kwargs)
1465 return render(request, 'dev_conf_export.html', kwargs)
1460
1466
1461
1467
1462 @user_passes_test(lambda u:u.is_staff)
1468 @user_passes_test(lambda u:u.is_staff)
1463 def dev_conf_delete(request, id_conf):
1469 def dev_conf_delete(request, id_conf):
1464
1470
1465 conf = get_object_or_404(Configuration, pk=id_conf)
1471 conf = get_object_or_404(Configuration, pk=id_conf)
1466
1472
1467 if request.method=='POST':
1473 if request.method=='POST':
1468 if request.user.is_staff:
1474 if request.user.is_staff:
1469 conf.delete()
1475 conf.delete()
1470 return redirect('url_dev_confs')
1476 return redirect('url_dev_confs')
1471
1477
1472 messages.error(request, 'Not enough permission to delete this object')
1478 messages.error(request, 'Not enough permission to delete this object')
1473 return redirect(conf.get_absolute_url())
1479 return redirect(conf.get_absolute_url())
1474
1480
1475 kwargs = {
1481 kwargs = {
1476 'title': 'Delete',
1482 'title': 'Delete',
1477 'suptitle': 'Experiment',
1483 'suptitle': 'Experiment',
1478 'object': conf,
1484 'object': conf,
1479 'previous': conf.get_absolute_url(),
1485 'previous': conf.get_absolute_url(),
1480 'delete': True
1486 'delete': True
1481 }
1487 }
1482
1488
1483 return render(request, 'confirm.html', kwargs)
1489 return render(request, 'confirm.html', kwargs)
1484
1490
1485
1491
1486 def sidebar(**kwargs):
1492 def sidebar(**kwargs):
1487
1493
1488 side_data = {}
1494 side_data = {}
1489
1495
1490 conf = kwargs.get('conf', None)
1496 conf = kwargs.get('conf', None)
1491 experiment = kwargs.get('experiment', None)
1497 experiment = kwargs.get('experiment', None)
1492
1498
1493 if not experiment:
1499 if not experiment:
1494 experiment = conf.experiment
1500 experiment = conf.experiment
1495
1501
1496 if experiment:
1502 if experiment:
1497 side_data['experiment'] = experiment
1503 side_data['experiment'] = experiment
1498 campaign = experiment.campaign_set.all()
1504 campaign = experiment.campaign_set.all()
1499 if campaign:
1505 if campaign:
1500 side_data['campaign'] = campaign[0]
1506 side_data['campaign'] = campaign[0]
1501 experiments = campaign[0].experiments.all()
1507 experiments = campaign[0].experiments.all()
1502 else:
1508 else:
1503 experiments = [experiment]
1509 experiments = [experiment]
1504 configurations = experiment.configuration_set.filter(type=0)
1510 configurations = experiment.configuration_set.filter(type=0)
1505 side_data['side_experiments'] = experiments
1511 side_data['side_experiments'] = experiments
1506 side_data['side_configurations'] = configurations
1512 side_data['side_configurations'] = configurations
1507
1513
1508 return side_data
1514 return side_data
1509
1515
1510 def get_paginator(model, page, order, filters={}, n=10):
1516 def get_paginator(model, page, order, filters={}, n=10):
1511
1517
1512 kwargs = {}
1518 kwargs = {}
1513 query = Q()
1519 query = Q()
1514 if isinstance(filters, QueryDict):
1520 if isinstance(filters, QueryDict):
1515 filters = filters.dict()
1521 filters = filters.dict()
1516 [filters.pop(key) for key in filters.keys() if filters[key] in ('', ' ')]
1522 [filters.pop(key) for key in filters.keys() if filters[key] in ('', ' ')]
1517 filters.pop('page', None)
1523 filters.pop('page', None)
1518
1524
1519 if 'template' in filters:
1525 if 'template' in filters:
1520 filters['template'] = True
1526 filters['template'] = True
1521 if 'start_date' in filters:
1527 if 'start_date' in filters:
1522 filters['start_date__gte'] = filters.pop('start_date')
1528 filters['start_date__gte'] = filters.pop('start_date')
1523 if 'end_date' in filters:
1529 if 'end_date' in filters:
1524 filters['start_date__lte'] = filters.pop('end_date')
1530 filters['start_date__lte'] = filters.pop('end_date')
1525 if 'tags' in filters:
1531 if 'tags' in filters:
1526 tags = filters.pop('tags')
1532 tags = filters.pop('tags')
1527 fields = [f.name for f in model._meta.get_fields()]
1533 fields = [f.name for f in model._meta.get_fields()]
1528
1534
1529 if 'tags' in fields:
1535 if 'tags' in fields:
1530 query = query | Q(tags__icontains=tags)
1536 query = query | Q(tags__icontains=tags)
1531 if 'name' in fields:
1537 if 'name' in fields:
1532 query = query | Q(name__icontains=tags)
1538 query = query | Q(name__icontains=tags)
1533 if 'location' in fields:
1539 if 'location' in fields:
1534 query = query | Q(location__name__icontains=tags)
1540 query = query | Q(location__name__icontains=tags)
1535 if 'device' in fields:
1541 if 'device' in fields:
1536 query = query | Q(device__device_type__name__icontains=tags)
1542 query = query | Q(device__device_type__name__icontains=tags)
1537
1543
1538 object_list = model.objects.filter(query, **filters).order_by(*order)
1544 object_list = model.objects.filter(query, **filters).order_by(*order)
1539 paginator = Paginator(object_list, n)
1545 paginator = Paginator(object_list, n)
1540
1546
1541 try:
1547 try:
1542 objects = paginator.page(page)
1548 objects = paginator.page(page)
1543 except PageNotAnInteger:
1549 except PageNotAnInteger:
1544 objects = paginator.page(1)
1550 objects = paginator.page(1)
1545 except EmptyPage:
1551 except EmptyPage:
1546 objects = paginator.page(paginator.num_pages)
1552 objects = paginator.page(paginator.num_pages)
1547
1553
1548 kwargs['objects'] = objects
1554 kwargs['objects'] = objects
1549 kwargs['offset'] = (int(page)-1)*n if page else 0
1555 kwargs['offset'] = (int(page)-1)*n if page else 0
1550
1556
1551 return kwargs
1557 return kwargs
1552
1558
1553 def operation(request, id_camp=None):
1559 def operation(request, id_camp=None):
1554
1560
1555 kwargs = {}
1561 kwargs = {}
1556 kwargs['title'] = 'Radars Operation'
1562 kwargs['title'] = 'Radars Operation'
1557 kwargs['no_sidebar'] = True
1563 kwargs['no_sidebar'] = True
1558 campaigns = Campaign.objects.filter(start_date__lte=datetime.now(),
1564 campaigns = Campaign.objects.filter(start_date__lte=datetime.now(),
1559 end_date__gte=datetime.now()).order_by('-start_date')
1565 end_date__gte=datetime.now()).order_by('-start_date')
1560
1566
1561
1567
1562 if id_camp:
1568 if id_camp:
1563 campaign = get_object_or_404(Campaign, pk = id_camp)
1569 campaign = get_object_or_404(Campaign, pk = id_camp)
1564 form = OperationForm(initial={'campaign': campaign.id}, campaigns=campaigns)
1570 form = OperationForm(initial={'campaign': campaign.id}, campaigns=campaigns)
1565 kwargs['campaign'] = campaign
1571 kwargs['campaign'] = campaign
1566 else:
1572 else:
1567 form = OperationForm(campaigns=campaigns)
1573 form = OperationForm(campaigns=campaigns)
1568 kwargs['form'] = form
1574 kwargs['form'] = form
1569 return render(request, 'operation.html', kwargs)
1575 return render(request, 'operation.html', kwargs)
1570
1576
1571 #---Experiment
1577 #---Experiment
1572 keys = ['id', 'name', 'start_time', 'end_time', 'status']
1578 keys = ['id', 'name', 'start_time', 'end_time', 'status']
1573 kwargs['experiment_keys'] = keys[1:]
1579 kwargs['experiment_keys'] = keys[1:]
1574 kwargs['experiments'] = experiments
1580 kwargs['experiments'] = experiments
1575 #---Radar
1581 #---Radar
1576 kwargs['locations'] = campaign.get_experiments_by_radar()
1582 kwargs['locations'] = campaign.get_experiments_by_radar()
1577 kwargs['form'] = form
1583 kwargs['form'] = form
1578
1584
1579 return render(request, 'operation.html', kwargs)
1585 return render(request, 'operation.html', kwargs)
1580
1586
1581
1587
1582 @login_required
1588 @login_required
1583 def radar_start(request, id_camp, id_radar):
1589 def radar_start(request, id_camp, id_radar):
1584
1590
1585 campaign = get_object_or_404(Campaign, pk = id_camp)
1591 campaign = get_object_or_404(Campaign, pk = id_camp)
1586 experiments = campaign.get_experiments_by_radar(id_radar)[0]['experiments']
1592 experiments = campaign.get_experiments_by_radar(id_radar)[0]['experiments']
1587 now = datetime.utcnow()
1593 now = datetime.utcnow()
1588
1594
1589 for exp in experiments:
1595 for exp in experiments:
1590 date = datetime.combine(datetime.now().date(), exp.start_time)
1596 date = datetime.combine(datetime.now().date(), exp.start_time)
1591
1597
1592 if exp.status == 2:
1598 if exp.status == 2:
1593 messages.warning(request, 'Experiment {} already running'.format(exp))
1599 messages.warning(request, 'Experiment {} already running'.format(exp))
1594 continue
1600 continue
1595
1601
1596 if exp.status == 3:
1602 if exp.status == 3:
1597 messages.warning(request, 'Experiment {} already programmed'.format(exp))
1603 messages.warning(request, 'Experiment {} already programmed'.format(exp))
1598 continue
1604 continue
1599
1605
1600 if date>campaign.end_date or date<campaign.start_date:
1606 if date>campaign.end_date or date<campaign.start_date:
1601 messages.warning(request, 'Experiment {} out of date'.format(exp))
1607 messages.warning(request, 'Experiment {} out of date'.format(exp))
1602 continue
1608 continue
1603
1609
1604 if now>=date:
1610 if now>=date:
1605 task = task_start.delay(exp.pk)
1611 task = task_start.delay(exp.pk)
1606 exp.status = task.wait()
1612 exp.status = task.wait()
1607 if exp.status==0:
1613 if exp.status==0:
1608 messages.error(request, 'Experiment {} not start'.format(exp))
1614 messages.error(request, 'Experiment {} not start'.format(exp))
1609 if exp.status==2:
1615 if exp.status==2:
1610 messages.success(request, 'Experiment {} started'.format(exp))
1616 messages.success(request, 'Experiment {} started'.format(exp))
1611 else:
1617 else:
1612 task = task_start.apply_async((exp.pk,), eta=date)
1618 task = task_start.apply_async((exp.pk,), eta=date)
1613 exp.status = 3
1619 exp.status = 3
1614 messages.success(request, 'Experiment {} programmed to start at {}'.format(exp, date))
1620 messages.success(request, 'Experiment {} programmed to start at {}'.format(exp, date))
1615
1621
1616 exp.save()
1622 exp.save()
1617
1623
1618 return HttpResponseRedirect(reverse('url_operation', args=[id_camp]))
1624 return HttpResponseRedirect(reverse('url_operation', args=[id_camp]))
1619
1625
1620
1626
1621 @login_required
1627 @login_required
1622 def radar_stop(request, id_camp, id_radar):
1628 def radar_stop(request, id_camp, id_radar):
1623
1629
1624 campaign = get_object_or_404(Campaign, pk = id_camp)
1630 campaign = get_object_or_404(Campaign, pk = id_camp)
1625 experiments = campaign.get_experiments_by_radar(id_radar)[0]['experiments']
1631 experiments = campaign.get_experiments_by_radar(id_radar)[0]['experiments']
1626
1632
1627 for exp in experiments:
1633 for exp in experiments:
1628
1634
1629 if exp.status == 2:
1635 if exp.status == 2:
1630 task = task_stop.delay(exp.pk)
1636 task = task_stop.delay(exp.pk)
1631 exp.status = task.wait()
1637 exp.status = task.wait()
1632 messages.warning(request, 'Experiment {} stopped'.format(exp))
1638 messages.warning(request, 'Experiment {} stopped'.format(exp))
1633 exp.save()
1639 exp.save()
1634 else:
1640 else:
1635 messages.error(request, 'Experiment {} not running'.format(exp))
1641 messages.error(request, 'Experiment {} not running'.format(exp))
1636
1642
1637 return HttpResponseRedirect(reverse('url_operation', args=[id_camp]))
1643 return HttpResponseRedirect(reverse('url_operation', args=[id_camp]))
1638
1644
1639
1645
1640 @login_required
1646 @login_required
1641 def radar_refresh(request, id_camp, id_radar):
1647 def radar_refresh(request, id_camp, id_radar):
1642
1648
1643 campaign = get_object_or_404(Campaign, pk = id_camp)
1649 campaign = get_object_or_404(Campaign, pk = id_camp)
1644 experiments = campaign.get_experiments_by_radar(id_radar)[0]['experiments']
1650 experiments = campaign.get_experiments_by_radar(id_radar)[0]['experiments']
1645
1651
1646 for exp in experiments:
1652 for exp in experiments:
1647 exp.get_status()
1653 exp.get_status()
1648
1654
1649 return HttpResponseRedirect(reverse('url_operation', args=[id_camp]))
1655 return HttpResponseRedirect(reverse('url_operation', args=[id_camp]))
General Comments 0
You need to be logged in to leave comments. Login now