##// END OF EJS Templates
Todo actualizado y Funcional (excepto redis,celery,nginx), y sin migraciones, ahora cambiaré de usuario
Renato-TUF -
r358:4e9ccf3e2223
parent child
Show More
@@ -1,1976 +1,2028
1 import ast
1 import ast
2 import json
2 import json
3 import hashlib
3 import hashlib
4 from datetime import datetime, timedelta
4 from datetime import datetime, timedelta
5
5
6 from django.shortcuts import render, redirect, get_object_or_404, HttpResponse
6 from django.shortcuts import render, redirect, get_object_or_404, HttpResponse
7 from django.utils.safestring import mark_safe
7 from django.utils.safestring import mark_safe
8 from django.http import HttpResponseRedirect
8 from django.http import HttpResponseRedirect
9 from django.urls import reverse
9 from django.urls import reverse
10 from django.db.models import Q
10 from django.db.models import Q
11 from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
11 from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
12 from django.contrib import messages
12 from django.contrib import messages
13 from django.http.request import QueryDict
13 from django.http.request import QueryDict
14 from django.contrib.auth.decorators import login_required, user_passes_test
14 from django.contrib.auth.decorators import login_required, user_passes_test
15
15
16 from django.utils.timezone import is_aware
16 from django.utils.timezone import is_aware
17
17
18 try:
18 try:
19 from urllib.parse import urlencode
19 from urllib.parse import urlencode
20 except ImportError:
20 except ImportError:
21 from urllib import urlencode
21 from urllib import urlencode
22
22
23 from .forms import CampaignForm, ExperimentForm, DeviceForm, ConfigurationForm, LocationForm, UploadFileForm, DownloadFileForm, OperationForm, NewForm
23 from .forms import CampaignForm, ExperimentForm, DeviceForm, ConfigurationForm, LocationForm, UploadFileForm, DownloadFileForm, OperationForm, NewForm
24 from .forms import OperationSearchForm, FilterForm, ChangeIpForm
24 from .forms import OperationSearchForm, FilterForm, ChangeIpForm
25
25
26 from apps.rc.forms import RCConfigurationForm, RCLineCode, RCMixConfigurationForm
26 from apps.rc.forms import RCConfigurationForm, RCLineCode, RCMixConfigurationForm
27 from apps.dds.forms import DDSConfigurationForm
27 from apps.dds.forms import DDSConfigurationForm
28 from apps.jars.forms import JARSConfigurationForm
28 from apps.jars.forms import JARSConfigurationForm
29 from apps.cgs.forms import CGSConfigurationForm
29 from apps.cgs.forms import CGSConfigurationForm
30 from apps.abs.forms import ABSConfigurationForm
30 from apps.abs.forms import ABSConfigurationForm
31 from apps.usrp.forms import USRPConfigurationForm
31 from apps.usrp.forms import USRPConfigurationForm
32 from apps.dds_rest.forms import DDSRestConfigurationForm
32 from apps.dds_rest.forms import DDSRestConfigurationForm
33 from .utils import Params
33 from .utils import Params
34
34
35 from .models import Campaign, Experiment, Device, Configuration, Location, RunningExperiment, DEV_STATES
35 from .models import Campaign, Experiment, Device, Configuration, Location, RunningExperiment, DEV_STATES
36 from apps.cgs.models import CGSConfiguration
36 from apps.cgs.models import CGSConfiguration
37 from apps.jars.models import JARSConfiguration, EXPERIMENT_TYPE
37 from apps.jars.models import JARSConfiguration, EXPERIMENT_TYPE
38 from apps.usrp.models import USRPConfiguration
38 from apps.usrp.models import USRPConfiguration
39 from apps.abs.models import ABSConfiguration
39 from apps.abs.models import ABSConfiguration
40 from apps.rc.models import RCConfiguration, RCLine, RCLineType, RCClock
40 from apps.rc.models import RCConfiguration, RCLine, RCLineType, RCClock
41 from apps.dds.models import DDSConfiguration
41 from apps.dds.models import DDSConfiguration
42 from apps.dds_rest.models import DDSRestConfiguration
42 from apps.dds_rest.models import DDSRestConfiguration
43
43
44 #from .tasks import task_start
44 #from .tasks import task_start
45 from radarsys.celery import app
45 from radarsys.celery import app
46
46
47 #comentario test
47 #comentario test
48 CONF_FORMS = {
48 CONF_FORMS = {
49 'rc': RCConfigurationForm,
49 'rc': RCConfigurationForm,
50 'dds': DDSConfigurationForm,
50 'dds': DDSConfigurationForm,
51 'dds_rest': DDSRestConfigurationForm,
51 'dds_rest': DDSRestConfigurationForm,
52 'jars': JARSConfigurationForm,
52 'jars': JARSConfigurationForm,
53 'cgs': CGSConfigurationForm,
53 'cgs': CGSConfigurationForm,
54 'abs': ABSConfigurationForm,
54 'abs': ABSConfigurationForm,
55 'usrp': USRPConfigurationForm,
55 'usrp': USRPConfigurationForm,
56 }
56 }
57
57
58 CONF_MODELS = {
58 CONF_MODELS = {
59 'rc': RCConfiguration,
59 'rc': RCConfiguration,
60 'dds': DDSConfiguration,
60 'dds': DDSConfiguration,
61 'dds_rest': DDSRestConfiguration,
61 'dds_rest': DDSRestConfiguration,
62 'jars': JARSConfiguration,
62 'jars': JARSConfiguration,
63 'cgs': CGSConfiguration,
63 'cgs': CGSConfiguration,
64 'abs': ABSConfiguration,
64 'abs': ABSConfiguration,
65 'usrp': USRPConfiguration,
65 'usrp': USRPConfiguration,
66 }
66 }
67
67
68 MIX_MODES = {
68 MIX_MODES = {
69 '0': 'P',
69 '0': 'P',
70 '1': 'S',
70 '1': 'S',
71 }
71 }
72
72
73 MIX_OPERATIONS = {
73 MIX_OPERATIONS = {
74 '0': 'OR',
74 '0': 'OR',
75 '1': 'XOR',
75 '1': 'XOR',
76 '2': 'AND',
76 '2': 'AND',
77 '3': 'NAND',
77 '3': 'NAND',
78 }
78 }
79
79
80
80
81 def is_developer(user):
81 def is_developer(user):
82
82
83 groups = [str(g.name) for g in user.groups.all()]
83 groups = [str(g.name) for g in user.groups.all()]
84 return 'Developer' in groups or user.is_staff
84 return 'Developer' in groups or user.is_staff
85
85
86
86
87 def is_operator(user):
87 def is_operator(user):
88
88
89 groups = [str(g.name) for g in user.groups.all()]
89 groups = [str(g.name) for g in user.groups.all()]
90 return 'Operator' in groups or user.is_staff
90 return 'Operator' in groups or user.is_staff
91
91
92
92
93 def has_been_modified(model):
93 def has_been_modified(model):
94
94
95 prev_hash = model.hash
95 prev_hash = model.hash
96 new_hash = hashlib.sha256(str(model.parms_to_dict).encode()).hexdigest()
96 new_hash = hashlib.sha256(str(model.parms_to_dict).encode()).hexdigest()
97 if prev_hash != new_hash:
97 if prev_hash != new_hash:
98 model.hash = new_hash
98 model.hash = new_hash
99 model.save()
99 model.save()
100 return True
100 return True
101 return False
101 return False
102
102
103
103
104 def index(request):
104 def index(request):
105 kwargs = {'no_sidebar': True}
105 kwargs = {'no_sidebar': True}
106
106
107 return render(request, 'index.html', kwargs)
107 return render(request, 'index.html', kwargs)
108
108
109
109
110 def locations(request):
110 def locations(request):
111
111
112 page = request.GET.get('page')
112 page = request.GET.get('page')
113 order = ('name',)
113 order = ('name',)
114
114
115 kwargs = get_paginator(Location, page, order)
115 kwargs = get_paginator(Location, page, order)
116
116
117 kwargs['keys'] = ['name', 'description']
117 kwargs['keys'] = ['name', 'description']
118 kwargs['title'] = 'Radar System'
118 kwargs['title'] = 'Radar System'
119 kwargs['suptitle'] = 'List'
119 kwargs['suptitle'] = 'List'
120 kwargs['no_sidebar'] = True
120 kwargs['no_sidebar'] = True
121
121
122 return render(request, 'base_list.html', kwargs)
122 return render(request, 'base_list.html', kwargs)
123
123
124
124
125 def location(request, id_loc):
125 def location(request, id_loc):
126
126
127 location = get_object_or_404(Location, pk=id_loc)
127 location = get_object_or_404(Location, pk=id_loc)
128
128
129 kwargs = {}
129 kwargs = {}
130 kwargs['location'] = location
130 kwargs['location'] = location
131 kwargs['location_keys'] = ['name', 'description']
131 kwargs['location_keys'] = ['name', 'description']
132
132
133 kwargs['title'] = 'Location'
133 kwargs['title'] = 'Location'
134 kwargs['suptitle'] = 'Details'
134 kwargs['suptitle'] = 'Details'
135
135
136 return render(request, 'location.html', kwargs)
136 return render(request, 'location.html', kwargs)
137
137
138
138
139 @login_required
139 @login_required
140 def location_new(request):
140 def location_new(request):
141
141
142 if request.method == 'GET':
142 if request.method == 'GET':
143 form = LocationForm()
143 form = LocationForm()
144
144
145 if request.method == 'POST':
145 if request.method == 'POST':
146 form = LocationForm(request.POST)
146 form = LocationForm(request.POST)
147
147
148 if form.is_valid():
148 if form.is_valid():
149 form.save()
149 form.save()
150 return redirect('url_locations')
150 return redirect('url_locations')
151
151
152 kwargs = {}
152 kwargs = {}
153 kwargs['form'] = form
153 kwargs['form'] = form
154 kwargs['title'] = 'Radar System'
154 kwargs['title'] = 'Radar System'
155 kwargs['suptitle'] = 'New'
155 kwargs['suptitle'] = 'New'
156 kwargs['button'] = 'Create'
156 kwargs['button'] = 'Create'
157
157
158 return render(request, 'base_edit.html', kwargs)
158 return render(request, 'base_edit.html', kwargs)
159
159
160
160
161 @login_required
161 @login_required
162 def location_edit(request, id_loc):
162 def location_edit(request, id_loc):
163
163
164 location = get_object_or_404(Location, pk=id_loc)
164 location = get_object_or_404(Location, pk=id_loc)
165
165
166 if request.method == 'GET':
166 if request.method == 'GET':
167 form = LocationForm(instance=location)
167 form = LocationForm(instance=location)
168
168
169 if request.method == 'POST':
169 if request.method == 'POST':
170 form = LocationForm(request.POST, instance=location)
170 form = LocationForm(request.POST, instance=location)
171
171
172 if form.is_valid():
172 if form.is_valid():
173 form.save()
173 form.save()
174 return redirect('url_locations')
174 return redirect('url_locations')
175
175
176 kwargs = {}
176 kwargs = {}
177 kwargs['form'] = form
177 kwargs['form'] = form
178 kwargs['title'] = 'Location'
178 kwargs['title'] = 'Location'
179 kwargs['suptitle'] = 'Edit'
179 kwargs['suptitle'] = 'Edit'
180 kwargs['button'] = 'Update'
180 kwargs['button'] = 'Update'
181
181
182 return render(request, 'base_edit.html', kwargs)
182 return render(request, 'base_edit.html', kwargs)
183
183
184
184
185 @login_required
185 @login_required
186 def location_delete(request, id_loc):
186 def location_delete(request, id_loc):
187
187
188 location = get_object_or_404(Location, pk=id_loc)
188 location = get_object_or_404(Location, pk=id_loc)
189
189
190 if request.method == 'POST':
190 if request.method == 'POST':
191
191
192 if is_developer(request.user):
192 if is_developer(request.user):
193 location.delete()
193 location.delete()
194 return redirect('url_locations')
194 return redirect('url_locations')
195
195
196 messages.error(request, 'Not enough permission to delete this object')
196 messages.error(request, 'Not enough permission to delete this object')
197 return redirect(location.get_absolute_url())
197 return redirect(location.get_absolute_url())
198
198
199 kwargs = {
199 kwargs = {
200 'title': 'Delete',
200 'title': 'Delete',
201 'suptitle': 'Location',
201 'suptitle': 'Location',
202 'object': location,
202 'object': location,
203 'delete': True
203 'delete': True
204 }
204 }
205
205
206 return render(request, 'confirm.html', kwargs)
206 return render(request, 'confirm.html', kwargs)
207
207
208
208
209 def devices(request):
209 def devices(request):
210
210
211 page = request.GET.get('page')
211 page = request.GET.get('page')
212 order = ('location', 'device_type')
212 order = ('location', 'device_type')
213
213
214 filters = request.GET.copy()
214 filters = request.GET.copy()
215 kwargs = get_paginator(Device, page, order, filters)
215 kwargs = get_paginator(Device, page, order, filters)
216 form = FilterForm(initial=request.GET, extra_fields=['tags'])
216 form = FilterForm(initial=request.GET, extra_fields=['tags'])
217
217
218 kwargs['keys'] = ['device_type', 'location',
218 kwargs['keys'] = ['device_type', 'location',
219 'ip_address', 'port_address', 'actions']
219 'ip_address', 'port_address', 'actions']
220 kwargs['title'] = 'Device'
220 kwargs['title'] = 'Device'
221 kwargs['suptitle'] = 'List'
221 kwargs['suptitle'] = 'List'
222 kwargs['no_sidebar'] = True
222 kwargs['no_sidebar'] = True
223 kwargs['form'] = form
223 kwargs['form'] = form
224 kwargs['add_url'] = reverse('url_add_device')
224 kwargs['add_url'] = reverse('url_add_device')
225 filters.pop('page', None)
225 filters.pop('page', None)
226 kwargs['q'] = urlencode(filters)
226 kwargs['q'] = urlencode(filters)
227 kwargs['menu_devices'] = 'active'
227 kwargs['menu_devices'] = 'active'
228 return render(request, 'base_list.html', kwargs)
228 return render(request, 'base_list.html', kwargs)
229
229
230
230
231 def device(request, id_dev):
231 def device(request, id_dev):
232
232
233 device = get_object_or_404(Device, pk=id_dev)
233 device = get_object_or_404(Device, pk=id_dev)
234
234
235 kwargs = {}
235 kwargs = {}
236 kwargs['device'] = device
236 kwargs['device'] = device
237 kwargs['device_keys'] = ['device_type',
237 kwargs['device_keys'] = ['device_type',
238 'ip_address', 'port_address', 'description']
238 'ip_address', 'port_address', 'description']
239
239
240 kwargs['title'] = 'Device'
240 kwargs['title'] = 'Device'
241 kwargs['suptitle'] = 'Details'
241 kwargs['suptitle'] = 'Details'
242 kwargs['menu_devices'] = 'active'
242 kwargs['menu_devices'] = 'active'
243
243
244 return render(request, 'device.html', kwargs)
244 return render(request, 'device.html', kwargs)
245
245
246
246
247 @login_required
247 @login_required
248 def device_new(request):
248 def device_new(request):
249
249
250 if request.method == 'GET':
250 if request.method == 'GET':
251 form = DeviceForm()
251 form = DeviceForm()
252
252
253 if request.method == 'POST':
253 if request.method == 'POST':
254 form = DeviceForm(request.POST)
254 form = DeviceForm(request.POST)
255
255
256 if form.is_valid():
256 if form.is_valid():
257 form.save()
257 form.save()
258 return redirect('url_devices')
258 return redirect('url_devices')
259
259
260 kwargs = {}
260 kwargs = {}
261 kwargs['form'] = form
261 kwargs['form'] = form
262 kwargs['title'] = 'Device'
262 kwargs['title'] = 'Device'
263 kwargs['suptitle'] = 'New_2'
263 kwargs['suptitle'] = 'New_2'
264 kwargs['button'] = 'Create'
264 kwargs['button'] = 'Create'
265 kwargs['menu_devices'] = 'active'
265 kwargs['menu_devices'] = 'active'
266
266
267 return render(request, 'base_edit.html', kwargs)
267 return render(request, 'base_edit.html', kwargs)
268
268
269
269
270 @login_required
270 @login_required
271 def device_edit(request, id_dev):
271 def device_edit(request, id_dev):
272
272
273 device = get_object_or_404(Device, pk=id_dev)
273 device = get_object_or_404(Device, pk=id_dev)
274
274
275 if request.method == 'GET':
275 if request.method == 'GET':
276 form = DeviceForm(instance=device)
276 form = DeviceForm(instance=device)
277
277
278 if request.method == 'POST':
278 if request.method == 'POST':
279 form = DeviceForm(request.POST, instance=device)
279 form = DeviceForm(request.POST, instance=device)
280
280
281 if form.is_valid():
281 if form.is_valid():
282 form.save()
282 form.save()
283 return redirect(device.get_absolute_url())
283 return redirect(device.get_absolute_url())
284
284
285 kwargs = {}
285 kwargs = {}
286 kwargs['form'] = form
286 kwargs['form'] = form
287 kwargs['title'] = 'Device'
287 kwargs['title'] = 'Device'
288 kwargs['suptitle'] = 'Edit'
288 kwargs['suptitle'] = 'Edit'
289 kwargs['button'] = 'Update'
289 kwargs['button'] = 'Update'
290 kwargs['menu_devices'] = 'active'
290 kwargs['menu_devices'] = 'active'
291
291
292 return render(request, 'base_edit.html', kwargs)
292 return render(request, 'base_edit.html', kwargs)
293
293
294
294
295 @login_required
295 @login_required
296 def device_delete(request, id_dev):
296 def device_delete(request, id_dev):
297
297
298 device = get_object_or_404(Device, pk=id_dev)
298 device = get_object_or_404(Device, pk=id_dev)
299
299
300 if request.method == 'POST':
300 if request.method == 'POST':
301
301
302 if is_developer(request.user):
302 if is_developer(request.user):
303 device.delete()
303 device.delete()
304 return redirect('url_devices')
304 return redirect('url_devices')
305
305
306 messages.error(request, 'Not enough permission to delete this object')
306 messages.error(request, 'Not enough permission to delete this object')
307 return redirect(device.get_absolute_url())
307 return redirect(device.get_absolute_url())
308
308
309 kwargs = {
309 kwargs = {
310 'title': 'Delete',
310 'title': 'Delete',
311 'suptitle': 'Device',
311 'suptitle': 'Device',
312 'object': device,
312 'object': device,
313 'delete': True
313 'delete': True
314 }
314 }
315 kwargs['menu_devices'] = 'active'
315 kwargs['menu_devices'] = 'active'
316
316
317 return render(request, 'confirm.html', kwargs)
317 return render(request, 'confirm.html', kwargs)
318
318
319
319
320 @login_required
320 @login_required
321 def device_change_ip(request, id_dev):
321 def device_change_ip(request, id_dev):
322
322
323 device = get_object_or_404(Device, pk=id_dev)
323 device = get_object_or_404(Device, pk=id_dev)
324
324
325 if request.method == 'POST':
325 if request.method == 'POST':
326
326
327 if is_developer(request.user):
327 if is_developer(request.user):
328 device.change_ip(**request.POST.dict())
328 device.change_ip(**request.POST.dict())
329
329
330 print(device.ip_address, device.message)
330 print(device.ip_address, device.message)
331
331
332 level, message = device.message.split('|')
332 level, message = device.message.split('|')
333 messages.add_message(request, level, message)
333 messages.add_message(request, level, message)
334 else:
334 else:
335 messages.error(
335 messages.error(
336 request, 'Not enough permission to delete this object')
336 request, 'Not enough permission to delete this object')
337 return redirect(device.get_absolute_url())
337 return redirect(device.get_absolute_url())
338
338
339 kwargs = {
339 kwargs = {
340 'title': 'Device',
340 'title': 'Device',
341 'suptitle': 'Change IP',
341 'suptitle': 'Change IP',
342 'object': device,
342 'object': device,
343 'previous': device.get_absolute_url(),
343 'previous': device.get_absolute_url(),
344 'form': ChangeIpForm(initial={'ip_address': device.ip_address}),
344 'form': ChangeIpForm(initial={'ip_address': device.ip_address}),
345 'message': ' ',
345 'message': ' ',
346 }
346 }
347 kwargs['menu_devices'] = 'active'
347 kwargs['menu_devices'] = 'active'
348
348
349 return render(request, 'confirm.html', kwargs)
349 return render(request, 'confirm.html', kwargs)
350
350
351
351
352 def campaigns(request):
352 def campaigns(request):
353
353
354 page = request.GET.get('page')
354 page = request.GET.get('page')
355 order = ('-start_date',)
355 order = ('-start_date',)
356 filters = request.GET.copy()
356 filters = request.GET.copy()
357
357
358 kwargs = get_paginator(Campaign, page, order, filters)
358 kwargs = get_paginator(Campaign, page, order, filters)
359
359
360 form = FilterForm(initial=request.GET, extra_fields=[
360 form = FilterForm(initial=request.GET, extra_fields=[
361 'range_date', 'tags', 'template'])
361 'range_date', 'tags', 'template'])
362 kwargs['keys'] = ['name', 'start_date', 'end_date', 'actions']
362 kwargs['keys'] = ['name', 'start_date', 'end_date', 'actions']
363 kwargs['title'] = 'Campaign'
363 kwargs['title'] = 'Campaign'
364 kwargs['suptitle'] = 'List'
364 kwargs['suptitle'] = 'List'
365 kwargs['no_sidebar'] = True
365 kwargs['no_sidebar'] = True
366 kwargs['form'] = form
366 kwargs['form'] = form
367 kwargs['add_url'] = reverse('url_add_campaign')
367 kwargs['add_url'] = reverse('url_add_campaign')
368 filters.pop('page', None)
368 filters.pop('page', None)
369 kwargs['q'] = urlencode(filters)
369 kwargs['q'] = urlencode(filters)
370 kwargs['menu_campaigns'] = 'active'
370 kwargs['menu_campaigns'] = 'active'
371
371
372 return render(request, 'base_list.html', kwargs)
372 return render(request, 'base_list.html', kwargs)
373
373
374
374
375 def campaign(request, id_camp):
375 def campaign(request, id_camp):
376
376
377 campaign = get_object_or_404(Campaign, pk=id_camp)
377 campaign = get_object_or_404(Campaign, pk=id_camp)
378 experiments = Experiment.objects.filter(campaign=campaign)
378 experiments = Experiment.objects.filter(campaign=campaign)
379
379
380 form = CampaignForm(instance=campaign)
380 form = CampaignForm(instance=campaign)
381
381
382 kwargs = {}
382 kwargs = {}
383 kwargs['campaign'] = campaign
383 kwargs['campaign'] = campaign
384 kwargs['campaign_keys'] = ['template', 'name',
384 kwargs['campaign_keys'] = ['template', 'name',
385 'start_date', 'end_date', 'tags', 'description']
385 'start_date', 'end_date', 'tags', 'description']
386
386
387 kwargs['experiments'] = experiments
387 kwargs['experiments'] = experiments
388 kwargs['experiment_keys'] = [
388 kwargs['experiment_keys'] = [
389 'name', 'radar_system', 'start_time', 'end_time']
389 'name', 'radar_system', 'start_time', 'end_time']
390
390
391 kwargs['title'] = 'Campaign'
391 kwargs['title'] = 'Campaign'
392 kwargs['suptitle'] = 'Details'
392 kwargs['suptitle'] = 'Details'
393
393
394 kwargs['form'] = form
394 kwargs['form'] = form
395 kwargs['button'] = 'Add Experiment'
395 kwargs['button'] = 'Add Experiment'
396 kwargs['menu_campaigns'] = 'active'
396 kwargs['menu_campaigns'] = 'active'
397
397
398 return render(request, 'campaign.html', kwargs)
398 return render(request, 'campaign.html', kwargs)
399
399
400
400
401 @login_required
401 @login_required
402 def campaign_new(request):
402 def campaign_new(request):
403
403
404 kwargs = {}
404 kwargs = {}
405
405
406 if request.method == 'GET':
406 if request.method == 'GET':
407
407
408 if 'template' in request.GET:
408 if 'template' in request.GET:
409 if request.GET['template'] == '0':
409 if request.GET['template'] == '0':
410 form = NewForm(initial={'create_from': 2},
410 form = NewForm(initial={'create_from': 2},
411 template_choices=Campaign.objects.filter(template=True).values_list('id', 'name'))
411 template_choices=Campaign.objects.filter(template=True).values_list('id', 'name'))
412 else:
412 else:
413 kwargs['button'] = 'Create'
413 kwargs['button'] = 'Create'
414 kwargs['experiments'] = Configuration.objects.filter(
414 kwargs['experiments'] = Configuration.objects.filter(
415 experiment=request.GET['template'])
415 experiment=request.GET['template'])
416 kwargs['experiment_keys'] = ['name', 'start_time', 'end_time']
416 kwargs['experiment_keys'] = ['name', 'start_time', 'end_time']
417 camp = Campaign.objects.get(pk=request.GET['template'])
417 camp = Campaign.objects.get(pk=request.GET['template'])
418 form = CampaignForm(instance=camp,
418 form = CampaignForm(instance=camp,
419 initial={'name': '{}_{:%Y%m%d}'.format(camp.name, datetime.now()),
419 initial={'name': '{}_{:%Y%m%d}'.format(camp.name, datetime.now()),
420 'template': False})
420 'template': False})
421 elif 'blank' in request.GET:
421 elif 'blank' in request.GET:
422 kwargs['button'] = 'Create'
422 kwargs['button'] = 'Create'
423 form = CampaignForm()
423 form = CampaignForm()
424 else:
424 else:
425 form = NewForm()
425 form = NewForm()
426
426
427 if request.method == 'POST':
427 if request.method == 'POST':
428 kwargs['button'] = 'Create'
428 kwargs['button'] = 'Create'
429 post = request.POST.copy()
429 post = request.POST.copy()
430 experiments = []
430 experiments = []
431
431
432 for id_exp in post.getlist('experiments'):
432 for id_exp in post.getlist('experiments'):
433 exp = Experiment.objects.get(pk=id_exp)
433 exp = Experiment.objects.get(pk=id_exp)
434 new_exp = exp.clone(template=False)
434 new_exp = exp.clone(template=False)
435 experiments.append(new_exp)
435 experiments.append(new_exp)
436
436
437 post.setlist('experiments', [])
437 post.setlist('experiments', [])
438
438
439 form = CampaignForm(post)
439 form = CampaignForm(post)
440
440
441 if form.is_valid():
441 if form.is_valid():
442 campaign = form.save(commit=False)
442 campaign = form.save(commit=False)
443 campaign.author = request.user
443 campaign.author = request.user
444 for exp in experiments:
444 for exp in experiments:
445 campaign.experiments.add(exp)
445 campaign.experiments.add(exp)
446 campaign.save()
446 campaign.save()
447 return redirect('url_campaign', id_camp=campaign.id)
447 return redirect('url_campaign', id_camp=campaign.id)
448
448
449 kwargs['form'] = form
449 kwargs['form'] = form
450 kwargs['title'] = 'Campaign'
450 kwargs['title'] = 'Campaign'
451 kwargs['suptitle'] = 'New'
451 kwargs['suptitle'] = 'New'
452 kwargs['menu_campaigns'] = 'active'
452 kwargs['menu_campaigns'] = 'active'
453
453
454 return render(request, 'campaign_edit.html', kwargs)
454 return render(request, 'campaign_edit.html', kwargs)
455
455
456
456
457 @login_required
457 @login_required
458 def campaign_edit(request, id_camp):
458 def campaign_edit(request, id_camp):
459
459
460 campaign = get_object_or_404(Campaign, pk=id_camp)
460 campaign = get_object_or_404(Campaign, pk=id_camp)
461
461
462 if request.method == 'GET':
462 if request.method == 'GET':
463 form = CampaignForm(instance=campaign)
463 form = CampaignForm(instance=campaign)
464
464
465 if request.method == 'POST':
465 if request.method == 'POST':
466 exps = campaign.experiments.all().values_list('pk', flat=True)
466 exps = campaign.experiments.all().values_list('pk', flat=True)
467 post = request.POST.copy()
467 post = request.POST.copy()
468 new_exps = post.getlist('experiments')
468 new_exps = post.getlist('experiments')
469 post.setlist('experiments', [])
469 post.setlist('experiments', [])
470 form = CampaignForm(post, instance=campaign)
470 form = CampaignForm(post, instance=campaign)
471
471
472 if form.is_valid():
472 if form.is_valid():
473 camp = form.save()
473 camp = form.save()
474 for id_exp in new_exps:
474 for id_exp in new_exps:
475 if int(id_exp) in exps:
475 if int(id_exp) in exps:
476 exps.pop(id_exp)
476 exps.pop(id_exp)
477 else:
477 else:
478 exp = Experiment.objects.get(pk=id_exp)
478 exp = Experiment.objects.get(pk=id_exp)
479 if exp.template:
479 if exp.template:
480 camp.experiments.add(exp.clone(template=False))
480 camp.experiments.add(exp.clone(template=False))
481 else:
481 else:
482 camp.experiments.add(exp)
482 camp.experiments.add(exp)
483
483
484 for id_exp in exps:
484 for id_exp in exps:
485 camp.experiments.remove(Experiment.objects.get(pk=id_exp))
485 camp.experiments.remove(Experiment.objects.get(pk=id_exp))
486
486
487 return redirect('url_campaign', id_camp=id_camp)
487 return redirect('url_campaign', id_camp=id_camp)
488
488
489 kwargs = {}
489 kwargs = {}
490 kwargs['form'] = form
490 kwargs['form'] = form
491 kwargs['title'] = 'Campaign'
491 kwargs['title'] = 'Campaign'
492 kwargs['suptitle'] = 'Edit'
492 kwargs['suptitle'] = 'Edit'
493 kwargs['button'] = 'Update'
493 kwargs['button'] = 'Update'
494 kwargs['menu_campaigns'] = 'active'
494 kwargs['menu_campaigns'] = 'active'
495
495
496 return render(request, 'campaign_edit.html', kwargs)
496 return render(request, 'campaign_edit.html', kwargs)
497
497
498
498
499 @login_required
499 @login_required
500 def campaign_delete(request, id_camp):
500 def campaign_delete(request, id_camp):
501
501
502 campaign = get_object_or_404(Campaign, pk=id_camp)
502 campaign = get_object_or_404(Campaign, pk=id_camp)
503
503
504 if request.method == 'POST':
504 if request.method == 'POST':
505 if is_developer(request.user):
505 if is_developer(request.user):
506
506
507 for exp in campaign.experiments.all():
507 for exp in campaign.experiments.all():
508 for conf in Configuration.objects.filter(experiment=exp):
508 for conf in Configuration.objects.filter(experiment=exp):
509 conf.delete()
509 conf.delete()
510 exp.delete()
510 exp.delete()
511 campaign.delete()
511 campaign.delete()
512
512
513 return redirect('url_campaigns')
513 return redirect('url_campaigns')
514
514
515 messages.error(request, 'Not enough permission to delete this object')
515 messages.error(request, 'Not enough permission to delete this object')
516 return redirect(campaign.get_absolute_url())
516 return redirect(campaign.get_absolute_url())
517
517
518 kwargs = {
518 kwargs = {
519 'title': 'Delete',
519 'title': 'Delete',
520 'suptitle': 'Campaign',
520 'suptitle': 'Campaign',
521 'object': campaign,
521 'object': campaign,
522 'delete': True
522 'delete': True
523 }
523 }
524 kwargs['menu_campaigns'] = 'active'
524 kwargs['menu_campaigns'] = 'active'
525
525
526 return render(request, 'confirm.html', kwargs)
526 return render(request, 'confirm.html', kwargs)
527
527
528
528
529 @login_required
529 @login_required
530 def campaign_export(request, id_camp):
530 def campaign_export(request, id_camp):
531
531
532 campaign = get_object_or_404(Campaign, pk=id_camp)
532 campaign = get_object_or_404(Campaign, pk=id_camp)
533 content = campaign.parms_to_dict()
533 content = campaign.parms_to_dict()
534 content_type = 'application/json'
534 content_type = 'application/json'
535 filename = '%s_%s.json' % (campaign.name, campaign.id)
535 filename = '%s_%s.json' % (campaign.name, campaign.id)
536
536
537 response = HttpResponse(content_type=content_type)
537 response = HttpResponse(content_type=content_type)
538 response['Content-Disposition'] = 'attachment; filename="%s"' % filename
538 response['Content-Disposition'] = 'attachment; filename="%s"' % filename
539 response.write(json.dumps(content, indent=2))
539 response.write(json.dumps(content, indent=2))
540
540
541 return response
541 return response
542
542
543
543
544 @login_required
544 @login_required
545 def campaign_import(request, id_camp):
545 def campaign_import(request, id_camp):
546
546
547 campaign = get_object_or_404(Campaign, pk=id_camp)
547 campaign = get_object_or_404(Campaign, pk=id_camp)
548
548
549 if request.method == 'GET':
549 if request.method == 'GET':
550 file_form = UploadFileForm()
550 file_form = UploadFileForm()
551
551
552 if request.method == 'POST':
552 if request.method == 'POST':
553 file_form = UploadFileForm(request.POST, request.FILES)
553 file_form = UploadFileForm(request.POST, request.FILES)
554
554
555 if file_form.is_valid():
555 if file_form.is_valid():
556 new_camp = campaign.dict_to_parms(
556 new_camp = campaign.dict_to_parms(
557 json.load(request.FILES['file']), CONF_MODELS)
557 json.load(request.FILES['file']), CONF_MODELS)
558 messages.success(
558 messages.success(
559 request, "Parameters imported from: '%s'." % request.FILES['file'].name)
559 request, "Parameters imported from: '%s'." % request.FILES['file'].name)
560 return redirect(new_camp.get_absolute_url_edit())
560 return redirect(new_camp.get_absolute_url_edit())
561
561
562 messages.error(request, "Could not import parameters from file")
562 messages.error(request, "Could not import parameters from file")
563
563
564 kwargs = {}
564 kwargs = {}
565 kwargs['title'] = 'Campaign'
565 kwargs['title'] = 'Campaign'
566 kwargs['form'] = file_form
566 kwargs['form'] = file_form
567 kwargs['suptitle'] = 'Importing file'
567 kwargs['suptitle'] = 'Importing file'
568 kwargs['button'] = 'Import'
568 kwargs['button'] = 'Import'
569 kwargs['menu_campaigns'] = 'active'
569 kwargs['menu_campaigns'] = 'active'
570
570
571 return render(request, 'campaign_import.html', kwargs)
571 return render(request, 'campaign_import.html', kwargs)
572
572
573
573
574 def experiments(request):
574 def experiments(request):
575
575
576 page = request.GET.get('page')
576 page = request.GET.get('page')
577 order = ('location',)
577 order = ('location',)
578 filters = request.GET.copy()
578 filters = request.GET.copy()
579
579
580 if 'my experiments' in filters:
580 if 'my experiments' in filters:
581 filters.pop('my experiments', None)
581 filters.pop('my experiments', None)
582 filters['mine'] = request.user.id
582 filters['mine'] = request.user.id
583
583
584 kwargs = get_paginator(Experiment, page, order, filters)
584 kwargs = get_paginator(Experiment, page, order, filters)
585
585
586 fields = ['tags', 'template']
586 fields = ['tags', 'template']
587 if request.user.is_authenticated:
587 if request.user.is_authenticated:
588 fields.append('my experiments')
588 fields.append('my experiments')
589
589
590 form = FilterForm(initial=request.GET, extra_fields=fields)
590 form = FilterForm(initial=request.GET, extra_fields=fields)
591
591
592 kwargs['keys'] = ['name', 'radar_system',
592 kwargs['keys'] = ['name', 'radar_system',
593 'start_time', 'end_time', 'actions']
593 'start_time', 'end_time', 'actions']
594 kwargs['title'] = 'Experiment'
594 kwargs['title'] = 'Experiment'
595 kwargs['suptitle'] = 'List'
595 kwargs['suptitle'] = 'List'
596 kwargs['no_sidebar'] = True
596 kwargs['no_sidebar'] = True
597 kwargs['form'] = form
597 kwargs['form'] = form
598 kwargs['add_url'] = reverse('url_add_experiment')
598 kwargs['add_url'] = reverse('url_add_experiment')
599 filters = request.GET.copy()
599 filters = request.GET.copy()
600 filters.pop('page', None)
600 filters.pop('page', None)
601 kwargs['q'] = urlencode(filters)
601 kwargs['q'] = urlencode(filters)
602 kwargs['menu_experiments'] = 'active'
602 kwargs['menu_experiments'] = 'active'
603
603
604 return render(request, 'base_list.html', kwargs)
604 return render(request, 'base_list.html', kwargs)
605
605
606
606
607 def experiment(request, id_exp):
607 def experiment(request, id_exp):
608
608
609 experiment = get_object_or_404(Experiment, pk=id_exp)
609 experiment = get_object_or_404(Experiment, pk=id_exp)
610
610
611 configurations = Configuration.objects.filter(
611 configurations = Configuration.objects.filter(
612 experiment=experiment, type=0)
612 experiment=experiment, type=0)
613
613
614 kwargs = {}
614 kwargs = {}
615
615
616 kwargs['experiment_keys'] = ['template', 'radar_system',
616 kwargs['experiment_keys'] = ['template', 'radar_system',
617 'name', 'freq', 'start_time', 'end_time']
617 'name', 'freq', 'start_time', 'end_time']
618 kwargs['experiment'] = experiment
618 kwargs['experiment'] = experiment
619 kwargs['configuration_keys'] = ['name', 'device__ip_address',
619 kwargs['configuration_keys'] = ['name', 'device__ip_address',
620 'device__port_address', 'device__status']
620 'device__port_address', 'device__status']
621 kwargs['configurations'] = configurations
621 kwargs['configurations'] = configurations
622 kwargs['title'] = 'Experiment'
622 kwargs['title'] = 'Experiment'
623 kwargs['suptitle'] = 'Details'
623 kwargs['suptitle'] = 'Details'
624 kwargs['button'] = 'Add Configuration'
624 kwargs['button'] = 'Add Configuration'
625 kwargs['menu_experiments'] = 'active'
625 kwargs['menu_experiments'] = 'active'
626
626
627 ###### SIDEBAR ######
627 ###### SIDEBAR ######
628 kwargs.update(sidebar(experiment=experiment))
628 kwargs.update(sidebar(experiment=experiment))
629
629
630 return render(request, 'experiment.html', kwargs)
630 return render(request, 'experiment.html', kwargs)
631
631
632
632
633 @login_required
633 @login_required
634 def experiment_new(request, id_camp=None):
634 def experiment_new(request, id_camp=None):
635
635
636 if not is_developer(request.user):
636 if not is_developer(request.user):
637 messages.error(
637 messages.error(
638 request, 'Developer required, to create new Experiments')
638 request, 'Developer required, to create new Experiments')
639 return redirect('index')
639 return redirect('index')
640 kwargs = {}
640 kwargs = {}
641
641
642 if request.method == 'GET':
642 if request.method == 'GET':
643 if 'template' in request.GET:
643 if 'template' in request.GET:
644 if request.GET['template'] == '0':
644 if request.GET['template'] == '0':
645 form = NewForm(initial={'create_from': 2},
645 form = NewForm(initial={'create_from': 2},
646 template_choices=Experiment.objects.filter(template=True).values_list('id', 'name'))
646 template_choices=Experiment.objects.filter(template=True).values_list('id', 'name'))
647 else:
647 else:
648 kwargs['button'] = 'Create'
648 kwargs['button'] = 'Create'
649 kwargs['configurations'] = Configuration.objects.filter(
649 kwargs['configurations'] = Configuration.objects.filter(
650 experiment=request.GET['template'])
650 experiment=request.GET['template'])
651 kwargs['configuration_keys'] = ['name', 'device__name',
651 kwargs['configuration_keys'] = ['name', 'device__name',
652 'device__ip_address', 'device__port_address']
652 'device__ip_address', 'device__port_address']
653 exp = Experiment.objects.get(pk=request.GET['template'])
653 exp = Experiment.objects.get(pk=request.GET['template'])
654 form = ExperimentForm(instance=exp,
654 form = ExperimentForm(instance=exp,
655 initial={'name': '{}_{:%y%m%d}'.format(exp.name, datetime.now()),
655 initial={'name': '{}_{:%y%m%d}'.format(exp.name, datetime.now()),
656 'template': False})
656 'template': False})
657 elif 'blank' in request.GET:
657 elif 'blank' in request.GET:
658 kwargs['button'] = 'Create'
658 kwargs['button'] = 'Create'
659 form = ExperimentForm()
659 form = ExperimentForm()
660 else:
660 else:
661 form = NewForm()
661 form = NewForm()
662
662
663 if request.method == 'POST':
663 if request.method == 'POST':
664 form = ExperimentForm(request.POST)
664 form = ExperimentForm(request.POST)
665 if form.is_valid():
665 if form.is_valid():
666 experiment = form.save(commit=False)
666 experiment = form.save(commit=False)
667 experiment.author = request.user
667 experiment.author = request.user
668 experiment.save()
668 experiment.save()
669
669
670 if 'template' in request.GET:
670 if 'template' in request.GET:
671 configurations = Configuration.objects.filter(
671 configurations = Configuration.objects.filter(
672 experiment=request.GET['template'], type=0)
672 experiment=request.GET['template'], type=0)
673 for conf in configurations:
673 for conf in configurations:
674 conf.clone(experiment=experiment, template=False)
674 conf.clone(experiment=experiment, template=False)
675
675
676 return redirect('url_experiment', id_exp=experiment.id)
676 return redirect('url_experiment', id_exp=experiment.id)
677
677
678 kwargs['form'] = form
678 kwargs['form'] = form
679 kwargs['title'] = 'Experiment'
679 kwargs['title'] = 'Experiment'
680 kwargs['suptitle'] = 'New'
680 kwargs['suptitle'] = 'New'
681 kwargs['menu_experiments'] = 'active'
681 kwargs['menu_experiments'] = 'active'
682
682
683 return render(request, 'experiment_edit.html', kwargs)
683 return render(request, 'experiment_edit.html', kwargs)
684
684
685
685
686 @login_required
686 @login_required
687 def experiment_edit(request, id_exp):
687 def experiment_edit(request, id_exp):
688
688
689 experiment = get_object_or_404(Experiment, pk=id_exp)
689 experiment = get_object_or_404(Experiment, pk=id_exp)
690
690
691 if request.method == 'GET':
691 if request.method == 'GET':
692 form = ExperimentForm(instance=experiment)
692 form = ExperimentForm(instance=experiment)
693
693
694 if request.method == 'POST':
694 if request.method == 'POST':
695 form = ExperimentForm(request.POST, instance=experiment)
695 form = ExperimentForm(request.POST, instance=experiment)
696
696
697 if form.is_valid():
697 if form.is_valid():
698 experiment = form.save()
698 experiment = form.save()
699 return redirect('url_experiment', id_exp=experiment.id)
699 return redirect('url_experiment', id_exp=experiment.id)
700
700
701 kwargs = {}
701 kwargs = {}
702 kwargs['form'] = form
702 kwargs['form'] = form
703 kwargs['title'] = 'Experiment'
703 kwargs['title'] = 'Experiment'
704 kwargs['suptitle'] = 'Edit'
704 kwargs['suptitle'] = 'Edit'
705 kwargs['button'] = 'Update'
705 kwargs['button'] = 'Update'
706 kwargs['menu_experiments'] = 'active'
706 kwargs['menu_experiments'] = 'active'
707
707
708 return render(request, 'experiment_edit.html', kwargs)
708 return render(request, 'experiment_edit.html', kwargs)
709
709
710
710
711 @login_required
711 @login_required
712 def experiment_delete(request, id_exp):
712 def experiment_delete(request, id_exp):
713
713
714 experiment = get_object_or_404(Experiment, pk=id_exp)
714 experiment = get_object_or_404(Experiment, pk=id_exp)
715
715
716 if request.method == 'POST':
716 if request.method == 'POST':
717 if is_developer(request.user):
717 if is_developer(request.user):
718 for conf in Configuration.objects.filter(experiment=experiment):
718 for conf in Configuration.objects.filter(experiment=experiment):
719 conf.delete()
719 conf.delete()
720 experiment.delete()
720 experiment.delete()
721 return redirect('url_experiments')
721 return redirect('url_experiments')
722
722
723 messages.error(request, 'Not enough permission to delete this object')
723 messages.error(request, 'Not enough permission to delete this object')
724 return redirect(experiment.get_absolute_url())
724 return redirect(experiment.get_absolute_url())
725
725
726 kwargs = {
726 kwargs = {
727 'title': 'Delete',
727 'title': 'Delete',
728 'suptitle': 'Experiment',
728 'suptitle': 'Experiment',
729 'object': experiment,
729 'object': experiment,
730 'delete': True
730 'delete': True
731 }
731 }
732
732
733 return render(request, 'confirm.html', kwargs)
733 return render(request, 'confirm.html', kwargs)
734
734
735
735
736 @login_required
736 @login_required
737 def experiment_export(request, id_exp):
737 def experiment_export(request, id_exp):
738
738
739 experiment = get_object_or_404(Experiment, pk=id_exp)
739 experiment = get_object_or_404(Experiment, pk=id_exp)
740 content = experiment.parms_to_dict()
740 content = experiment.parms_to_dict()
741 content_type = 'application/json'
741 content_type = 'application/json'
742 filename = '%s_%s.json' % (experiment.name, experiment.id)
742 filename = '%s_%s.json' % (experiment.name, experiment.id)
743
743
744 response = HttpResponse(content_type=content_type)
744 response = HttpResponse(content_type=content_type)
745 response['Content-Disposition'] = 'attachment; filename="%s"' % filename
745 response['Content-Disposition'] = 'attachment; filename="%s"' % filename
746 response.write(json.dumps(content, indent=2))
746 response.write(json.dumps(content, indent=2))
747
747
748 return response
748 return response
749
749
750
750
751 @login_required
751 @login_required
752 def experiment_import(request, id_exp):
752 def experiment_import(request, id_exp):
753
753
754 experiment = get_object_or_404(Experiment, pk=id_exp)
754 experiment = get_object_or_404(Experiment, pk=id_exp)
755 configurations = Configuration.objects.filter(experiment=experiment)
755 configurations = Configuration.objects.filter(experiment=experiment)
756
756
757 if request.method == 'GET':
757 if request.method == 'GET':
758 file_form = UploadFileForm()
758 file_form = UploadFileForm()
759
759
760 if request.method == 'POST':
760 if request.method == 'POST':
761 file_form = UploadFileForm(request.POST, request.FILES)
761 file_form = UploadFileForm(request.POST, request.FILES)
762
762
763 if file_form.is_valid():
763 if file_form.is_valid():
764 new_exp = experiment.dict_to_parms(
764 new_exp = experiment.dict_to_parms(
765 json.load(request.FILES['file']), CONF_MODELS)
765 json.load(request.FILES['file']), CONF_MODELS)
766 messages.success(
766 messages.success(
767 request, "Parameters imported from: '%s'." % request.FILES['file'].name)
767 request, "Parameters imported from: '%s'." % request.FILES['file'].name)
768 return redirect(new_exp.get_absolute_url_edit())
768 return redirect(new_exp.get_absolute_url_edit())
769
769
770 messages.error(request, "Could not import parameters from file")
770 messages.error(request, "Could not import parameters from file")
771
771
772 kwargs = {}
772 kwargs = {}
773 kwargs['title'] = 'Experiment'
773 kwargs['title'] = 'Experiment'
774 kwargs['form'] = file_form
774 kwargs['form'] = file_form
775 kwargs['suptitle'] = 'Importing file'
775 kwargs['suptitle'] = 'Importing file'
776 kwargs['button'] = 'Import'
776 kwargs['button'] = 'Import'
777 kwargs['menu_experiments'] = 'active'
777 kwargs['menu_experiments'] = 'active'
778
778
779 kwargs.update(sidebar(experiment=experiment))
779 kwargs.update(sidebar(experiment=experiment))
780
780
781 return render(request, 'experiment_import.html', kwargs)
781 return render(request, 'experiment_import.html', kwargs)
782
782
783
783
784 @login_required
784 @login_required
785 def experiment_start(request, id_exp):
785 def experiment_start(request, id_exp):
786
786
787 exp = get_object_or_404(Experiment, pk=id_exp)
787 exp = get_object_or_404(Experiment, pk=id_exp)
788
788
789 if exp.status == 2:
789 if exp.status == 2:
790 messages.warning(request, 'Experiment {} already runnnig'.format(exp))
790 messages.warning(request, 'Experiment {} already runnnig'.format(exp))
791 else:
791 else:
792 exp.status = exp.start()
792 exp.status = exp.start()
793 if exp.status == 0:
793 if exp.status == 0:
794 messages.error(request, 'Experiment {} not start'.format(exp))
794 messages.error(request, 'Experiment {} not start'.format(exp))
795 if exp.status == 2:
795 if exp.status == 2:
796 messages.success(request, 'Experiment {} started'.format(exp))
796 messages.success(request, 'Experiment {} started'.format(exp))
797
797
798 exp.save()
798 exp.save()
799
799
800 return redirect(exp.get_absolute_url())
800 return redirect(exp.get_absolute_url())
801
801
802
802
803 @login_required
803 @login_required
804 def experiment_stop(request, id_exp):
804 def experiment_stop(request, id_exp):
805
805
806 exp = get_object_or_404(Experiment, pk=id_exp)
806 exp = get_object_or_404(Experiment, pk=id_exp)
807
807
808 if exp.status == 2:
808 if exp.status == 2:
809 exp.status = exp.stop()
809 exp.status = exp.stop()
810 exp.save()
810 exp.save()
811 messages.success(request, 'Experiment {} stopped'.format(exp))
811 messages.success(request, 'Experiment {} stopped'.format(exp))
812 else:
812 else:
813 messages.error(request, 'Experiment {} not running'.format(exp))
813 messages.error(request, 'Experiment {} not running'.format(exp))
814
814
815 return redirect(exp.get_absolute_url())
815 return redirect(exp.get_absolute_url())
816
816
817
817
818 def experiment_status(request, id_exp):
818 def experiment_status(request, id_exp):
819
819
820 exp = get_object_or_404(Experiment, pk=id_exp)
820 exp = get_object_or_404(Experiment, pk=id_exp)
821
821
822 exp.get_status()
822 exp.get_status()
823
823
824 return redirect(exp.get_absolute_url())
824 return redirect(exp.get_absolute_url())
825
825
826
826
827 @login_required
827 @login_required
828 def experiment_mix(request, id_exp):
828 def experiment_mix(request, id_exp):
829
829
830 experiment = get_object_or_404(Experiment, pk=id_exp)
830 experiment = get_object_or_404(Experiment, pk=id_exp)
831 rc_confs = [conf for conf in RCConfiguration.objects.filter(
831 rc_confs = [conf for conf in RCConfiguration.objects.filter(
832 experiment=id_exp,
832 experiment=id_exp,
833 type=0,
833 type=0,
834 mix=False)]
834 mix=False)]
835
835
836 if len(rc_confs) < 2:
836 if len(rc_confs) < 2:
837 messages.warning(
837 messages.warning(
838 request, 'You need at least two RC Configurations to make a mix')
838 request, 'You need at least two RC Configurations to make a mix')
839 return redirect(experiment.get_absolute_url())
839 return redirect(experiment.get_absolute_url())
840
840
841 mix_confs = RCConfiguration.objects.filter(experiment=id_exp, mix=True, type=0)
841 mix_confs = RCConfiguration.objects.filter(experiment=id_exp, mix=True, type=0)
842
842
843 if mix_confs:
843 if mix_confs:
844 mix = mix_confs[0]
844 mix = mix_confs[0]
845 else:
845 else:
846 mix = RCConfiguration(experiment=experiment,
846 mix = RCConfiguration(experiment=experiment,
847 device=rc_confs[0].device,
847 device=rc_confs[0].device,
848 ipp=rc_confs[0].ipp,
848 ipp=rc_confs[0].ipp,
849 clock_in=rc_confs[0].clock_in,
849 clock_in=rc_confs[0].clock_in,
850 clock_divider=rc_confs[0].clock_divider,
850 clock_divider=rc_confs[0].clock_divider,
851 mix=True,
851 mix=True,
852 parameters='')
852 parameters='')
853 mix.save()
853 mix.save()
854
854
855 line_type = RCLineType.objects.get(name='mix')
855 line_type = RCLineType.objects.get(name='mix')
856 print("VIew obteniendo len getlines")
856 print("VIew obteniendo len getlines")
857 print(len(rc_confs[0].get_lines()))
857 print(len(rc_confs[0].get_lines()))
858 for i in range(len(rc_confs[0].get_lines())):
858 for i in range(len(rc_confs[0].get_lines())):
859 line = RCLine(rc_configuration=mix, line_type=line_type, channel=i)
859 line = RCLine(rc_configuration=mix, line_type=line_type, channel=i)
860 line.save()
860 line.save()
861
861
862 initial = {'name': mix.name,
862 initial = {'name': mix.name,
863 'result': parse_mix_result(mix.parameters),
863 'result': parse_mix_result(mix.parameters),
864 'delay': 0,
864 'delay': 0,
865 'mask': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
865 'mask': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
866 }
866 }
867
867
868 if request.method == 'GET':
868 if request.method == 'GET':
869 form = RCMixConfigurationForm(confs=rc_confs, initial=initial)
869 form = RCMixConfigurationForm(confs=rc_confs, initial=initial)
870
870
871 if request.method == 'POST':
871 if request.method == 'POST':
872 result = mix.parameters
872 result = mix.parameters
873
873
874 if '{}|'.format(request.POST['experiment']) in result:
874 if '{}|'.format(request.POST['experiment']) in result:
875 messages.error(request, 'Configuration already added')
875 messages.error(request, 'Configuration already added')
876 else:
876 else:
877 if 'operation' in request.POST:
877 if 'operation' in request.POST:
878 operation = MIX_OPERATIONS[request.POST['operation']]
878 operation = MIX_OPERATIONS[request.POST['operation']]
879 else:
879 else:
880 operation = ' '
880 operation = ' '
881
881
882 mode = MIX_MODES[request.POST['mode']]
882 mode = MIX_MODES[request.POST['mode']]
883
883
884 if result:
884 if result:
885 result = '{}-{}|{}|{}|{}|{}'.format(mix.parameters,
885 result = '{}-{}|{}|{}|{}|{}'.format(mix.parameters,
886 request.POST['experiment'],
886 request.POST['experiment'],
887 mode,
887 mode,
888 operation,
888 operation,
889 float(
889 float(
890 request.POST['delay']),
890 request.POST['delay']),
891 parse_mask(
891 parse_mask(
892 request.POST.getlist('mask'))
892 request.POST.getlist('mask'))
893 )
893 )
894 else:
894 else:
895 result = '{}|{}|{}|{}|{}'.format(request.POST['experiment'],
895 result = '{}|{}|{}|{}|{}'.format(request.POST['experiment'],
896 mode,
896 mode,
897 operation,
897 operation,
898 float(request.POST['delay']),
898 float(request.POST['delay']),
899 parse_mask(
899 parse_mask(
900 request.POST.getlist('mask'))
900 request.POST.getlist('mask'))
901 )
901 )
902
902
903 mix.parameters = result
903 mix.parameters = result
904 mix.save()
904 mix.save()
905 mix.update_pulses()
905 mix.update_pulses()
906
906
907 initial['result'] = parse_mix_result(result)
907 initial['result'] = parse_mix_result(result)
908 initial['name'] = mix.name
908 initial['name'] = mix.name
909
909
910 form = RCMixConfigurationForm(initial=initial, confs=rc_confs)
910 form = RCMixConfigurationForm(initial=initial, confs=rc_confs)
911
911
912 kwargs = {
912 kwargs = {
913 'title': 'Experiment',
913 'title': 'Experiment',
914 'suptitle': 'Mix Configurations',
914 'suptitle': 'Mix Configurations',
915 'form': form,
915 'form': form,
916 'extra_button': 'Delete',
916 'extra_button': 'Delete',
917 'button': 'Add',
917 'button': 'Add',
918 'cancel': 'Back',
918 'cancel': 'Back',
919 'previous': experiment.get_absolute_url(),
919 'previous': experiment.get_absolute_url(),
920 'id_exp': id_exp,
920 'id_exp': id_exp,
921
921
922 }
922 }
923 kwargs['menu_experiments'] = 'active'
923 kwargs['menu_experiments'] = 'active'
924
924
925 return render(request, 'experiment_mix.html', kwargs)
925 return render(request, 'experiment_mix.html', kwargs)
926
926
927
927
928 @login_required
928 @login_required
929 def experiment_mix_delete(request, id_exp):
929 def experiment_mix_delete(request, id_exp):
930
930
931 conf = RCConfiguration.objects.get(experiment=id_exp, mix=True, type=0)
931 conf = RCConfiguration.objects.get(experiment=id_exp, mix=True, type=0)
932 values = conf.parameters.split('-')
932 values = conf.parameters.split('-')
933 conf.parameters = '-'.join(values[:-1])
933 conf.parameters = '-'.join(values[:-1])
934 conf.save()
934 conf.save()
935
935
936 return redirect('url_mix_experiment', id_exp=id_exp)
936 return redirect('url_mix_experiment', id_exp=id_exp)
937
937
938
938
939 def experiment_summary(request, id_exp):
939 def experiment_summary(request, id_exp):
940
940
941 experiment = get_object_or_404(Experiment, pk=id_exp)
941 experiment = get_object_or_404(Experiment, pk=id_exp)
942 configurations = Configuration.objects.filter(
942 configurations = Configuration.objects.filter(
943 experiment=experiment, type=0)
943 experiment=experiment, type=0)
944
944
945 kwargs = {}
945 kwargs = {}
946 kwargs['experiment_keys'] = ['radar_system',
946 kwargs['experiment_keys'] = ['radar_system',
947 'name', 'freq', 'start_time', 'end_time']
947 'name', 'freq', 'start_time', 'end_time']
948 kwargs['experiment'] = experiment
948 kwargs['experiment'] = experiment
949 kwargs['configurations'] = []
949 kwargs['configurations'] = []
950 kwargs['title'] = 'Experiment Summary'
950 kwargs['title'] = 'Experiment Summary'
951 kwargs['suptitle'] = 'Details'
951 kwargs['suptitle'] = 'Details'
952 kwargs['button'] = 'Verify Parameters'
952 kwargs['button'] = 'Verify Parameters'
953
953
954 c_vel = 3.0*(10**8) # m/s
954 c_vel = 3.0*(10**8) # m/s
955 ope_freq = experiment.freq*(10**6) # 1/s
955 ope_freq = experiment.freq*(10**6) # 1/s
956 radar_lambda = c_vel/ope_freq # m
956 radar_lambda = c_vel/ope_freq # m
957 kwargs['radar_lambda'] = radar_lambda
957 kwargs['radar_lambda'] = radar_lambda
958
958
959 ipp = None
959 ipp = None
960 nsa = 1
960 nsa = 1
961 code_id = 0
961 code_id = 0
962 tx_line = {}
962 tx_line = {}
963
963
964 for configuration in configurations.filter(device__device_type__name = 'rc'):
964 for configuration in configurations.filter(device__device_type__name = 'rc'):
965
965
966 if configuration.mix:
966 if configuration.mix:
967 continue
967 continue
968 conf = {'conf': configuration}
968 conf = {'conf': configuration}
969 conf['keys'] = []
969 conf['keys'] = []
970 conf['NTxs'] = configuration.ntx
970 conf['NTxs'] = configuration.ntx
971 conf['keys'].append('NTxs')
971 conf['keys'].append('NTxs')
972 ipp = configuration.ipp
972 ipp = configuration.ipp
973 conf['IPP'] = ipp
973 conf['IPP'] = ipp
974 conf['keys'].append('IPP')
974 conf['keys'].append('IPP')
975 lines = configuration.get_lines(line_type__name='tx')
975 lines = configuration.get_lines(line_type__name='tx')
976
976
977 for tx_line in lines:
977 for tx_line in lines:
978 tx_params = json.loads(tx_line.params)
978 tx_params = json.loads(tx_line.params)
979 conf[tx_line.get_name()] = '{} Km'.format(tx_params['pulse_width'])
979 conf[tx_line.get_name()] = '{} Km'.format(tx_params['pulse_width'])
980 conf['keys'].append(tx_line.get_name())
980 conf['keys'].append(tx_line.get_name())
981 delays = tx_params['delays']
981 delays = tx_params['delays']
982 if delays not in ('', '0'):
982 if delays not in ('', '0'):
983 n = len(delays.split(','))
983 n = len(delays.split(','))
984 taus = '{} Taus: {}'.format(n, delays)
984 taus = '{} Taus: {}'.format(n, delays)
985 else:
985 else:
986 taus = '-'
986 taus = '-'
987 conf['Taus ({})'.format(tx_line.get_name())] = taus
987 conf['Taus ({})'.format(tx_line.get_name())] = taus
988 conf['keys'].append('Taus ({})'.format(tx_line.get_name()))
988 conf['keys'].append('Taus ({})'.format(tx_line.get_name()))
989 for code_line in configuration.get_lines(line_type__name='codes'):
989 for code_line in configuration.get_lines(line_type__name='codes'):
990 code_params = json.loads(code_line.params)
990 code_params = json.loads(code_line.params)
991 code_id = code_params['code']
991 code_id = code_params['code']
992 if tx_line.pk == int(code_params['TX_ref']):
992 if tx_line.pk == int(code_params['TX_ref']):
993 conf['Code ({})'.format(tx_line.get_name())] = '{}:{}'.format(RCLineCode.objects.get(pk=code_params['code']),
993 conf['Code ({})'.format(tx_line.get_name())] = '{}:{}'.format(RCLineCode.objects.get(pk=code_params['code']),
994 '-'.join(code_params['codes']))
994 '-'.join(code_params['codes']))
995 conf['keys'].append('Code ({})'.format(tx_line.get_name()))
995 conf['keys'].append('Code ({})'.format(tx_line.get_name()))
996
996
997 for windows_line in configuration.get_lines(line_type__name='windows'):
997 for windows_line in configuration.get_lines(line_type__name='windows'):
998 win_params = json.loads(windows_line.params)
998 win_params = json.loads(windows_line.params)
999 if tx_line.pk == int(win_params['TX_ref']):
999 if tx_line.pk == int(win_params['TX_ref']):
1000 windows = ''
1000 windows = ''
1001 nsa = win_params['params'][0]['number_of_samples']
1001 nsa = win_params['params'][0]['number_of_samples']
1002 for i, params in enumerate(win_params['params']):
1002 for i, params in enumerate(win_params['params']):
1003 windows += 'W{}: Ho={first_height} km DH={resolution} km NSA={number_of_samples}<br>'.format(
1003 windows += 'W{}: Ho={first_height} km DH={resolution} km NSA={number_of_samples}<br>'.format(
1004 i, **params)
1004 i, **params)
1005 conf['Window'] = mark_safe(windows)
1005 conf['Window'] = mark_safe(windows)
1006 conf['keys'].append('Window')
1006 conf['keys'].append('Window')
1007
1007
1008 kwargs['configurations'].append(conf)
1008 kwargs['configurations'].append(conf)
1009
1009
1010 for configuration in configurations.filter(device__device_type__name = 'jars'):
1010 for configuration in configurations.filter(device__device_type__name = 'jars'):
1011
1011
1012 conf = {'conf': configuration}
1012 conf = {'conf': configuration}
1013 conf['keys'] = []
1013 conf['keys'] = []
1014 conf['Type of Data'] = EXPERIMENT_TYPE[configuration.exp_type][1]
1014 conf['Type of Data'] = EXPERIMENT_TYPE[configuration.exp_type][1]
1015 conf['keys'].append('Type of Data')
1015 conf['keys'].append('Type of Data')
1016 channels_number = configuration.channels_number
1016 channels_number = configuration.channels_number
1017 exp_type = configuration.exp_type
1017 exp_type = configuration.exp_type
1018 fftpoints = configuration.fftpoints
1018 fftpoints = configuration.fftpoints
1019 filter_parms = json.loads(configuration.filter_parms)
1019 filter_parms = json.loads(configuration.filter_parms)
1020 spectral_number = configuration.spectral_number
1020 spectral_number = configuration.spectral_number
1021 acq_profiles = configuration.acq_profiles
1021 acq_profiles = configuration.acq_profiles
1022 cohe_integr = configuration.cohe_integr
1022 cohe_integr = configuration.cohe_integr
1023 profiles_block = configuration.profiles_block
1023 profiles_block = configuration.profiles_block
1024
1024
1025 conf['Num of Profiles'] = acq_profiles
1025 conf['Num of Profiles'] = acq_profiles
1026 conf['keys'].append('Num of Profiles')
1026 conf['keys'].append('Num of Profiles')
1027
1027
1028 conf['Prof per Block'] = profiles_block
1028 conf['Prof per Block'] = profiles_block
1029 conf['keys'].append('Prof per Block')
1029 conf['keys'].append('Prof per Block')
1030
1030
1031 conf['Blocks per File'] = configuration.raw_data_blocks
1031 conf['Blocks per File'] = configuration.raw_data_blocks
1032 conf['keys'].append('Blocks per File')
1032 conf['keys'].append('Blocks per File')
1033
1033
1034 if exp_type == 0: # Short
1034 if exp_type == 0: # Short
1035 bytes_ = 2
1035 bytes_ = 2
1036 b = nsa*2*bytes_*channels_number
1036 b = nsa*2*bytes_*channels_number
1037 else: # Float
1037 else: # Float
1038 bytes_ = 4
1038 bytes_ = 4
1039 channels = channels_number + spectral_number
1039 channels = channels_number + spectral_number
1040 b = nsa*2*bytes_*fftpoints*channels
1040 b = nsa*2*bytes_*fftpoints*channels
1041
1041
1042 codes_num = 7
1042 codes_num = 7
1043 if code_id == 2:
1043 if code_id == 2:
1044 codes_num = 7
1044 codes_num = 7
1045 elif code_id == 12:
1045 elif code_id == 12:
1046 codes_num = 15
1046 codes_num = 15
1047
1047
1048 #Jars filter values:
1048 #Jars filter values:
1049
1049
1050 clock = float(filter_parms['clock'])
1050 clock = float(filter_parms['clock'])
1051 filter_2 = int(filter_parms['cic_2'])
1051 filter_2 = int(filter_parms['cic_2'])
1052 filter_5 = int(filter_parms['cic_5'])
1052 filter_5 = int(filter_parms['cic_5'])
1053 filter_fir = int(filter_parms['fir'])
1053 filter_fir = int(filter_parms['fir'])
1054 Fs_MHz = clock/(filter_2*filter_5*filter_fir)
1054 Fs_MHz = clock/(filter_2*filter_5*filter_fir)
1055
1055
1056 #Jars values:
1056 #Jars values:
1057 if ipp is not None:
1057 if ipp is not None:
1058 IPP_units = ipp/0.15*Fs_MHz
1058 IPP_units = ipp/0.15*Fs_MHz
1059 IPP_us = IPP_units / Fs_MHz
1059 IPP_us = IPP_units / Fs_MHz
1060 IPP_s = IPP_units / (Fs_MHz * (10**6))
1060 IPP_s = IPP_units / (Fs_MHz * (10**6))
1061 Ts = 1/(Fs_MHz*(10**6))
1061 Ts = 1/(Fs_MHz*(10**6))
1062
1062
1063 Va = radar_lambda/(4*Ts*cohe_integr)
1063 Va = radar_lambda/(4*Ts*cohe_integr)
1064 rate_bh = ((nsa-codes_num)*channels_number*2 *
1064 rate_bh = ((nsa-codes_num)*channels_number*2 *
1065 bytes_/IPP_us)*(36*(10**8)/cohe_integr)
1065 bytes_/IPP_us)*(36*(10**8)/cohe_integr)
1066 rate_gh = rate_bh/(1024*1024*1024)
1066 rate_gh = rate_bh/(1024*1024*1024)
1067
1067
1068 conf['Time per Block'] = IPP_s * profiles_block * cohe_integr
1068 conf['Time per Block'] = IPP_s * profiles_block * cohe_integr
1069 conf['keys'].append('Time per Block')
1069 conf['keys'].append('Time per Block')
1070 conf['Acq time'] = IPP_s * acq_profiles
1070 conf['Acq time'] = IPP_s * acq_profiles
1071 conf['keys'].append('Acq time')
1071 conf['keys'].append('Acq time')
1072 conf['Data rate'] = str(rate_gh)+" (GB/h)"
1072 conf['Data rate'] = str(rate_gh)+" (GB/h)"
1073 conf['keys'].append('Data rate')
1073 conf['keys'].append('Data rate')
1074 conf['Va (m/s)'] = Va
1074 conf['Va (m/s)'] = Va
1075 conf['keys'].append('Va (m/s)')
1075 conf['keys'].append('Va (m/s)')
1076 conf['Vrange (m/s)'] = 3/(2*IPP_s*cohe_integr)
1076 conf['Vrange (m/s)'] = 3/(2*IPP_s*cohe_integr)
1077 conf['keys'].append('Vrange (m/s)')
1077 conf['keys'].append('Vrange (m/s)')
1078
1078
1079 kwargs['configurations'].append(conf)
1079 kwargs['configurations'].append(conf)
1080 kwargs['menu_experiments'] = 'active'
1080 kwargs['menu_experiments'] = 'active'
1081
1081
1082 ###### SIDEBAR ######
1082 ###### SIDEBAR ######
1083 kwargs.update(sidebar(experiment=experiment))
1083 kwargs.update(sidebar(experiment=experiment))
1084
1084
1085 return render(request, 'experiment_summary.html', kwargs)
1085 return render(request, 'experiment_summary.html', kwargs)
1086
1086
1087
1087
1088 @login_required
1088 @login_required
1089 def experiment_verify(request, id_exp):
1089 def experiment_verify(request, id_exp):
1090
1090
1091 experiment = get_object_or_404(Experiment, pk=id_exp)
1091 experiment = get_object_or_404(Experiment, pk=id_exp)
1092 experiment_data = experiment.parms_to_dict()
1092 experiment_data = experiment.parms_to_dict()
1093 configurations = Configuration.objects.filter(
1093 configurations = Configuration.objects.filter(
1094 experiment=experiment, type=0)
1094 experiment=experiment, type=0)
1095
1095
1096 kwargs = {}
1096 kwargs = {}
1097
1097
1098 kwargs['experiment_keys'] = ['template',
1098 kwargs['experiment_keys'] = ['template',
1099 'radar_system', 'name', 'start_time', 'end_time']
1099 'radar_system', 'name', 'start_time', 'end_time']
1100 kwargs['experiment'] = experiment
1100 kwargs['experiment'] = experiment
1101
1101
1102 kwargs['configuration_keys'] = ['name', 'device__ip_address',
1102 kwargs['configuration_keys'] = ['name', 'device__ip_address',
1103 'device__port_address', 'device__status']
1103 'device__port_address', 'device__status']
1104 kwargs['configurations'] = configurations
1104 kwargs['configurations'] = configurations
1105 kwargs['experiment_data'] = experiment_data
1105 kwargs['experiment_data'] = experiment_data
1106
1106
1107 kwargs['title'] = 'Verify Experiment'
1107 kwargs['title'] = 'Verify Experiment'
1108 kwargs['suptitle'] = 'Parameters'
1108 kwargs['suptitle'] = 'Parameters'
1109
1109
1110 kwargs['button'] = 'Update'
1110 kwargs['button'] = 'Update'
1111
1111
1112 jars_conf = False
1112 jars_conf = False
1113 rc_conf = False
1113 rc_conf = False
1114 dds_conf = False
1114 dds_conf = False
1115
1115
1116 for configuration in configurations:
1116 for configuration in configurations:
1117 #-------------------- JARS -----------------------:
1117 #-------------------- JARS -----------------------:
1118 if configuration.device.device_type.name == 'jars':
1118 if configuration.device.device_type.name == 'jars':
1119 jars_conf = True
1119 jars_conf = True
1120 jars = configuration
1120 jars = configuration
1121 kwargs['jars_conf'] = jars_conf
1121 kwargs['jars_conf'] = jars_conf
1122 filter_parms = json.loads(jars.filter_parms)
1122 filter_parms = json.loads(jars.filter_parms)
1123 kwargs['filter_parms'] = filter_parms
1123 kwargs['filter_parms'] = filter_parms
1124 #--Sampling Frequency
1124 #--Sampling Frequency
1125 clock = filter_parms['clock']
1125 clock = filter_parms['clock']
1126 filter_2 = filter_parms['cic_2']
1126 filter_2 = filter_parms['cic_2']
1127 filter_5 = filter_parms['cic_5']
1127 filter_5 = filter_parms['cic_5']
1128 filter_fir = filter_parms['fir']
1128 filter_fir = filter_parms['fir']
1129 samp_freq_jars = clock/filter_2/filter_5/filter_fir
1129 samp_freq_jars = clock/filter_2/filter_5/filter_fir
1130
1130
1131 kwargs['samp_freq_jars'] = samp_freq_jars
1131 kwargs['samp_freq_jars'] = samp_freq_jars
1132 kwargs['jars'] = configuration
1132 kwargs['jars'] = configuration
1133
1133
1134 #--------------------- RC ----------------------:
1134 #--------------------- RC ----------------------:
1135 if configuration.device.device_type.name == 'rc' and not configuration.mix:
1135 if configuration.device.device_type.name == 'rc' and not configuration.mix:
1136 rc_conf = True
1136 rc_conf = True
1137 rc = configuration
1137 rc = configuration
1138
1138
1139 rc_parms = configuration.parms_to_dict()
1139 rc_parms = configuration.parms_to_dict()
1140
1140
1141 win_lines = rc.get_lines(line_type__name='windows')
1141 win_lines = rc.get_lines(line_type__name='windows')
1142 if win_lines:
1142 if win_lines:
1143 dh = json.loads(win_lines[0].params)['params'][0]['resolution']
1143 dh = json.loads(win_lines[0].params)['params'][0]['resolution']
1144 #--Sampling Frequency
1144 #--Sampling Frequency
1145 samp_freq_rc = 0.15/dh
1145 samp_freq_rc = 0.15/dh
1146 kwargs['samp_freq_rc'] = samp_freq_rc
1146 kwargs['samp_freq_rc'] = samp_freq_rc
1147
1147
1148 kwargs['rc_conf'] = rc_conf
1148 kwargs['rc_conf'] = rc_conf
1149 kwargs['rc'] = configuration
1149 kwargs['rc'] = configuration
1150
1150
1151 #-------------------- DDS ----------------------:
1151 #-------------------- DDS ----------------------:
1152 if configuration.device.device_type.name == 'dds':
1152 if configuration.device.device_type.name == 'dds':
1153 dds_conf = True
1153 dds_conf = True
1154 dds = configuration
1154 dds = configuration
1155 dds_parms = configuration.parms_to_dict()
1155 dds_parms = configuration.parms_to_dict()
1156
1156
1157 kwargs['dds_conf'] = dds_conf
1157 kwargs['dds_conf'] = dds_conf
1158 kwargs['dds'] = configuration
1158 kwargs['dds'] = configuration
1159
1159
1160 #------------Validation------------:
1160 #------------Validation------------:
1161 #Clock
1161 #Clock
1162 if dds_conf and rc_conf and jars_conf:
1162 if dds_conf and rc_conf and jars_conf:
1163 if float(filter_parms['clock']) != float(rc_parms['configurations']['byId'][str(rc.pk)]['clock_in']) and float(rc_parms['configurations']['byId'][str(rc.pk)]['clock_in']) != float(dds_parms['configurations']['byId'][str(dds.pk)]['clock']):
1163 if float(filter_parms['clock']) != float(rc_parms['configurations']['byId'][str(rc.pk)]['clock_in']) and float(rc_parms['configurations']['byId'][str(rc.pk)]['clock_in']) != float(dds_parms['configurations']['byId'][str(dds.pk)]['clock']):
1164 messages.warning(request, "Devices don't have the same clock.")
1164 messages.warning(request, "Devices don't have the same clock.")
1165 elif rc_conf and jars_conf:
1165 elif rc_conf and jars_conf:
1166 if float(filter_parms['clock']) != float(rc_parms['configurations']['byId'][str(rc.pk)]['clock_in']):
1166 if float(filter_parms['clock']) != float(rc_parms['configurations']['byId'][str(rc.pk)]['clock_in']):
1167 messages.warning(request, "Devices don't have the same clock.")
1167 messages.warning(request, "Devices don't have the same clock.")
1168 elif rc_conf and dds_conf:
1168 elif rc_conf and dds_conf:
1169 if float(rc_parms['configurations']['byId'][str(rc.pk)]['clock_in']) != float(dds_parms['configurations']['byId'][str(dds.pk)]['clock']):
1169 if float(rc_parms['configurations']['byId'][str(rc.pk)]['clock_in']) != float(dds_parms['configurations']['byId'][str(dds.pk)]['clock']):
1170 messages.warning(request, "Devices don't have the same clock.")
1170 messages.warning(request, "Devices don't have the same clock.")
1171 if float(samp_freq_rc) != float(dds_parms['configurations']['byId'][str(dds.pk)]['frequencyA']):
1171 if float(samp_freq_rc) != float(dds_parms['configurations']['byId'][str(dds.pk)]['frequencyA']):
1172 messages.warning(
1172 messages.warning(
1173 request, "Devices don't have the same Frequency A.")
1173 request, "Devices don't have the same Frequency A.")
1174
1174
1175 #------------POST METHOD------------:
1175 #------------POST METHOD------------:
1176 if request.method == 'POST':
1176 if request.method == 'POST':
1177 if request.POST['suggest_clock']:
1177 if request.POST['suggest_clock']:
1178 try:
1178 try:
1179 suggest_clock = float(request.POST['suggest_clock'])
1179 suggest_clock = float(request.POST['suggest_clock'])
1180 except:
1180 except:
1181 messages.warning(request, "Invalid value in CLOCK IN.")
1181 messages.warning(request, "Invalid value in CLOCK IN.")
1182 return redirect('url_verify_experiment', id_exp=experiment.id)
1182 return redirect('url_verify_experiment', id_exp=experiment.id)
1183 else:
1183 else:
1184 suggest_clock = ""
1184 suggest_clock = ""
1185 if suggest_clock:
1185 if suggest_clock:
1186 if rc_conf:
1186 if rc_conf:
1187 rc.clock_in = suggest_clock
1187 rc.clock_in = suggest_clock
1188 rc.save()
1188 rc.save()
1189 if jars_conf:
1189 if jars_conf:
1190 filter_parms = jars.filter_parms
1190 filter_parms = jars.filter_parms
1191 filter_parms = ast.literal_eval(filter_parms)
1191 filter_parms = ast.literal_eval(filter_parms)
1192 filter_parms['clock'] = suggest_clock
1192 filter_parms['clock'] = suggest_clock
1193 jars.filter_parms = json.dumps(filter_parms)
1193 jars.filter_parms = json.dumps(filter_parms)
1194 jars.save()
1194 jars.save()
1195 kwargs['filter_parms'] = filter_parms
1195 kwargs['filter_parms'] = filter_parms
1196 if dds_conf:
1196 if dds_conf:
1197 dds.clock = suggest_clock
1197 dds.clock = suggest_clock
1198 dds.save()
1198 dds.save()
1199
1199
1200 if request.POST['suggest_frequencyA']:
1200 if request.POST['suggest_frequencyA']:
1201 try:
1201 try:
1202 suggest_frequencyA = float(request.POST['suggest_frequencyA'])
1202 suggest_frequencyA = float(request.POST['suggest_frequencyA'])
1203 except:
1203 except:
1204 messages.warning(request, "Invalid value in FREQUENCY A.")
1204 messages.warning(request, "Invalid value in FREQUENCY A.")
1205 return redirect('url_verify_experiment', id_exp=experiment.id)
1205 return redirect('url_verify_experiment', id_exp=experiment.id)
1206 else:
1206 else:
1207 suggest_frequencyA = ""
1207 suggest_frequencyA = ""
1208 if suggest_frequencyA:
1208 if suggest_frequencyA:
1209 if jars_conf:
1209 if jars_conf:
1210 filter_parms = jars.filter_parms
1210 filter_parms = jars.filter_parms
1211 filter_parms = ast.literal_eval(filter_parms)
1211 filter_parms = ast.literal_eval(filter_parms)
1212 filter_parms['fch'] = suggest_frequencyA
1212 filter_parms['fch'] = suggest_frequencyA
1213 jars.filter_parms = json.dumps(filter_parms)
1213 jars.filter_parms = json.dumps(filter_parms)
1214 jars.save()
1214 jars.save()
1215 kwargs['filter_parms'] = filter_parms
1215 kwargs['filter_parms'] = filter_parms
1216 if dds_conf:
1216 if dds_conf:
1217 dds.frequencyA_Mhz = request.POST['suggest_frequencyA']
1217 dds.frequencyA_Mhz = request.POST['suggest_frequencyA']
1218 dds.save()
1218 dds.save()
1219
1219
1220 kwargs['menu_experiments'] = 'active'
1220 kwargs['menu_experiments'] = 'active'
1221 kwargs.update(sidebar(experiment=experiment))
1221 kwargs.update(sidebar(experiment=experiment))
1222 return render(request, 'experiment_verify.html', kwargs)
1222 return render(request, 'experiment_verify.html', kwargs)
1223
1223
1224
1224
1225 def parse_mix_result(s):
1225 def parse_mix_result(s):
1226
1226
1227 values = s.split('-')
1227 values = s.split('-')
1228 html = 'EXP MOD OPE DELAY MASK\r\n'
1228 html = 'EXP MOD OPE DELAY MASK\r\n'
1229
1229
1230 if not values or values[0] in ('', ' '):
1230 if not values or values[0] in ('', ' '):
1231 return mark_safe(html)
1231 return mark_safe(html)
1232
1232
1233 for i, value in enumerate(values):
1233 for i, value in enumerate(values):
1234 if not value:
1234 if not value:
1235 continue
1235 continue
1236 pk, mode, operation, delay, mask = value.split('|')
1236 pk, mode, operation, delay, mask = value.split('|')
1237 conf = RCConfiguration.objects.get(pk=pk)
1237 conf = RCConfiguration.objects.get(pk=pk)
1238 if i == 0:
1238 if i == 0:
1239 html += '{:20.18}{:3}{:4}{:9}km{:>6}\r\n'.format(
1239 html += '{:20.18}{:3}{:4}{:9}km{:>6}\r\n'.format(
1240 conf.name,
1240 conf.name,
1241 mode,
1241 mode,
1242 ' ',
1242 ' ',
1243 delay,
1243 delay,
1244 mask)
1244 mask)
1245 else:
1245 else:
1246 html += '{:20.18}{:3}{:4}{:9}km{:>6}\r\n'.format(
1246 html += '{:20.18}{:3}{:4}{:9}km{:>6}\r\n'.format(
1247 conf.name,
1247 conf.name,
1248 mode,
1248 mode,
1249 operation,
1249 operation,
1250 delay,
1250 delay,
1251 mask)
1251 mask)
1252
1252
1253 return mark_safe(html)
1253 return mark_safe(html)
1254
1254
1255
1255
1256 def parse_mask(l):
1256 def parse_mask(l):
1257
1257
1258 values = []
1258 values = []
1259
1259
1260 for x in range(16):
1260 for x in range(16):
1261 if '{}'.format(x) in l:
1261 if '{}'.format(x) in l:
1262 values.append(1)
1262 values.append(1)
1263 else:
1263 else:
1264 values.append(0)
1264 values.append(0)
1265
1265
1266 values.reverse()
1266 values.reverse()
1267
1267
1268 return int(''.join([str(x) for x in values]), 2)
1268 return int(''.join([str(x) for x in values]), 2)
1269
1269
1270
1270
1271 def dev_confs(request):
1271 def dev_confs(request):
1272
1272
1273 page = request.GET.get('page')
1273 page = request.GET.get('page')
1274 order = ('-programmed_date', )
1274 order = ('-programmed_date', )
1275 filters = request.GET.copy()
1275 filters = request.GET.copy()
1276 if 'my configurations' in filters:
1276 if 'my configurations' in filters:
1277 filters.pop('my configurations', None)
1277 filters.pop('my configurations', None)
1278 filters['mine'] = request.user.id
1278 filters['mine'] = request.user.id
1279 kwargs = get_paginator(Configuration, page, order, filters)
1279 kwargs = get_paginator(Configuration, page, order, filters)
1280 fields = ['tags', 'template', 'historical']
1280 fields = ['tags', 'template', 'historical']
1281 if request.user.is_authenticated:
1281 if request.user.is_authenticated:
1282 fields.append('my configurations')
1282 fields.append('my configurations')
1283 form = FilterForm(initial=request.GET, extra_fields=fields)
1283 form = FilterForm(initial=request.GET, extra_fields=fields)
1284 kwargs['keys'] = ['name', 'experiment',
1284 kwargs['keys'] = ['name', 'experiment',
1285 'type', 'programmed_date', 'actions']
1285 'type', 'programmed_date', 'actions']
1286 kwargs['title'] = 'Configuration'
1286 kwargs['title'] = 'Configuration'
1287 kwargs['suptitle'] = 'List'
1287 kwargs['suptitle'] = 'List'
1288 kwargs['no_sidebar'] = True
1288 kwargs['no_sidebar'] = True
1289 kwargs['form'] = form
1289 kwargs['form'] = form
1290 kwargs['add_url'] = reverse('url_add_dev_conf', args=[0])
1290 kwargs['add_url'] = reverse('url_add_dev_conf', args=[0])
1291 filters = request.GET.copy()
1291 filters = request.GET.copy()
1292 filters.pop('page', None)
1292 filters.pop('page', None)
1293 kwargs['q'] = urlencode(filters)
1293 kwargs['q'] = urlencode(filters)
1294 kwargs['menu_configurations'] = 'active'
1294 kwargs['menu_configurations'] = 'active'
1295
1295
1296 return render(request, 'base_list.html', kwargs)
1296 return render(request, 'base_list.html', kwargs)
1297
1297
1298
1298
1299 def dev_conf(request, id_conf):
1299 def dev_conf(request, id_conf):
1300
1300
1301 conf = get_object_or_404(Configuration, pk=id_conf)
1301 conf = get_object_or_404(Configuration, pk=id_conf)
1302
1302
1303 return redirect(conf.get_absolute_url())
1303 return redirect(conf.get_absolute_url())
1304
1304
1305
1305
1306 @login_required
1306 @login_required
1307 def dev_conf_new(request, id_exp=0, id_dev=0):
1307 def dev_conf_new(request, id_exp=0, id_dev=0):
1308
1308
1309 if not is_developer(request.user):
1309 if not is_developer(request.user):
1310 messages.error(
1310 messages.error(
1311 request, 'Developer required, to create new configurations')
1311 request, 'Developer required, to create new configurations')
1312 return redirect('index')
1312 return redirect('index')
1313
1313
1314 initial = {}
1314 initial = {}
1315 kwargs = {}
1315 kwargs = {}
1316
1316
1317 if id_exp != 0:
1317 if id_exp != 0:
1318 initial['experiment'] = id_exp
1318 initial['experiment'] = id_exp
1319
1319
1320 if id_dev != 0:
1320 if id_dev != 0:
1321 initial['device'] = id_dev
1321 initial['device'] = id_dev
1322
1322
1323 if request.method == 'GET':
1323 if request.method == 'GET':
1324
1324
1325 if id_dev:
1325 if id_dev:
1326 kwargs['button'] = 'Create'
1326 kwargs['button'] = 'Create'
1327 device = Device.objects.get(pk=id_dev)
1327 device = Device.objects.get(pk=id_dev)
1328 DevConfForm = CONF_FORMS[device.device_type.name]
1328 DevConfForm = CONF_FORMS[device.device_type.name]
1329 initial['name'] = request.GET['name']
1329 initial['name'] = request.GET['name']
1330 form = DevConfForm(initial=initial)
1330 form = DevConfForm(initial=initial)
1331 else:
1331 else:
1332 if 'template' in request.GET:
1332 if 'template' in request.GET:
1333 if request.GET['template'] == '0':
1333 if request.GET['template'] == '0':
1334 choices = [(conf.pk, '{}'.format(conf))
1334 choices = [(conf.pk, '{}'.format(conf))
1335 for conf in Configuration.objects.filter(template=True)]
1335 for conf in Configuration.objects.filter(template=True)]
1336 form = NewForm(initial={'create_from': 2},
1336 form = NewForm(initial={'create_from': 2},
1337 template_choices=choices)
1337 template_choices=choices)
1338 else:
1338 else:
1339 kwargs['button'] = 'Create'
1339 kwargs['button'] = 'Create'
1340 conf = Configuration.objects.get(
1340 conf = Configuration.objects.get(
1341 pk=request.GET['template'])
1341 pk=request.GET['template'])
1342 id_dev = conf.device.pk
1342 id_dev = conf.device.pk
1343 DevConfForm = CONF_FORMS[conf.device.device_type.name]
1343 DevConfForm = CONF_FORMS[conf.device.device_type.name]
1344 form = DevConfForm(instance=conf,
1344 form = DevConfForm(instance=conf,
1345 initial={'name': '{}_{:%y%m%d}'.format(conf.name, datetime.now()),
1345 initial={'name': '{}_{:%y%m%d}'.format(conf.name, datetime.now()),
1346 'template': False,
1346 'template': False,
1347 'experiment': id_exp})
1347 'experiment': id_exp})
1348 elif 'blank' in request.GET:
1348 elif 'blank' in request.GET:
1349 kwargs['button'] = 'Create'
1349 kwargs['button'] = 'Create'
1350 form = ConfigurationForm(initial=initial)
1350 form = ConfigurationForm(initial=initial)
1351 else:
1351 else:
1352 form = NewForm()
1352 form = NewForm()
1353
1353
1354 if request.method == 'POST':
1354 if request.method == 'POST':
1355
1355
1356 device = Device.objects.get(pk=request.POST['device'])
1356 device = Device.objects.get(pk=request.POST['device'])
1357 DevConfForm = CONF_FORMS[device.device_type.name]
1357 DevConfForm = CONF_FORMS[device.device_type.name]
1358
1358
1359 form = DevConfForm(request.POST)
1359 form = DevConfForm(request.POST)
1360 kwargs['button'] = 'Create'
1360 kwargs['button'] = 'Create'
1361 if form.is_valid():
1361 if form.is_valid():
1362 conf = form.save(commit=False)
1362 conf = form.save(commit=False)
1363 conf.author = request.user
1363 conf.author = request.user
1364 conf.save()
1364 conf.save()
1365
1365
1366 if 'template' in request.GET and conf.device.device_type.name == 'rc':
1366 if 'template' in request.GET and conf.device.device_type.name == 'rc':
1367 lines = RCLine.objects.filter(
1367 lines = RCLine.objects.filter(
1368 rc_configuration=request.GET['template'])
1368 rc_configuration=request.GET['template'])
1369 for line in lines:
1369 for line in lines:
1370 line.clone(rc_configuration=conf)
1370 line.clone(rc_configuration=conf)
1371
1371
1372 new_lines = conf.get_lines()
1372 new_lines = conf.get_lines()
1373 for line in new_lines:
1373 for line in new_lines:
1374 line_params = json.loads(line.params)
1374 line_params = json.loads(line.params)
1375 if 'TX_ref' in line_params:
1375 if 'TX_ref' in line_params:
1376 ref_line = RCLine.objects.get(pk=line_params['TX_ref'])
1376 ref_line = RCLine.objects.get(pk=line_params['TX_ref'])
1377 line_params['TX_ref'] = ['{}'.format(
1377 line_params['TX_ref'] = ['{}'.format(
1378 l.pk) for l in new_lines if l.get_name() == ref_line.get_name()][0]
1378 l.pk) for l in new_lines if l.get_name() == ref_line.get_name()][0]
1379 line.params = json.dumps(line_params)
1379 line.params = json.dumps(line_params)
1380 line.save()
1380 line.save()
1381 elif conf.device.device_type.name == 'rc':
1381 elif conf.device.device_type.name == 'rc':
1382 clk = RCClock(rc_configuration=conf)
1382 clk = RCClock(rc_configuration=conf)
1383 clk.save()
1383 clk.save()
1384
1384
1385 return redirect('url_dev_conf', id_conf=conf.pk)
1385 return redirect('url_dev_conf', id_conf=conf.pk)
1386
1386
1387 kwargs['id_exp'] = id_exp
1387 kwargs['id_exp'] = id_exp
1388 kwargs['form'] = form
1388 kwargs['form'] = form
1389 kwargs['title'] = 'Configuration'
1389 kwargs['title'] = 'Configuration'
1390 kwargs['suptitle'] = 'New'
1390 kwargs['suptitle'] = 'New'
1391 kwargs['menu_configurations'] = 'active'
1391 kwargs['menu_configurations'] = 'active'
1392
1392
1393 if id_dev != 0:
1393 if id_dev != 0:
1394 device = Device.objects.get(pk=id_dev)
1394 device = Device.objects.get(pk=id_dev)
1395 kwargs['device'] = device.device_type.name
1395 kwargs['device'] = device.device_type.name
1396 print(id_exp)
1396 print(id_exp)
1397 return render(request, 'dev_conf_edit.html', kwargs)
1397 return render(request, 'dev_conf_edit.html', kwargs)
1398
1398
1399
1399
1400 @login_required
1400 @login_required
1401 def dev_conf_edit(request, id_conf):
1401 def dev_conf_edit(request, id_conf):
1402
1402
1403 conf = get_object_or_404(Configuration, pk=id_conf)
1403 conf = get_object_or_404(Configuration, pk=id_conf)
1404
1404
1405 DevConfForm = CONF_FORMS[conf.device.device_type.name]
1405 DevConfForm = CONF_FORMS[conf.device.device_type.name]
1406
1406
1407 if request.method == 'GET':
1407 if request.method == 'GET':
1408 form = DevConfForm(instance=conf)
1408 form = DevConfForm(instance=conf)
1409
1409
1410 if request.method == 'POST':
1410 if request.method == 'POST':
1411 form = DevConfForm(request.POST, instance=conf)
1411 form = DevConfForm(request.POST, instance=conf)
1412
1412
1413 if form.is_valid():
1413 if form.is_valid():
1414 form.save()
1414 form.save()
1415 return redirect('url_dev_conf', id_conf=id_conf)
1415 return redirect('url_dev_conf', id_conf=id_conf)
1416
1416
1417 kwargs = {}
1417 kwargs = {}
1418 kwargs['form'] = form
1418 kwargs['form'] = form
1419 kwargs['title'] = 'Device Configuration'
1419 kwargs['title'] = 'Device Configuration'
1420 kwargs['suptitle'] = 'Edit'
1420 kwargs['suptitle'] = 'Edit'
1421 kwargs['button'] = 'Update'
1421 kwargs['button'] = 'Update'
1422 kwargs['menu_configurations'] = 'active'
1422 kwargs['menu_configurations'] = 'active'
1423
1423
1424 ###### SIDEBAR ######
1424 ###### SIDEBAR ######
1425 kwargs.update(sidebar(conf=conf))
1425 kwargs.update(sidebar(conf=conf))
1426
1426
1427 return render(request, '%s_conf_edit.html' % conf.device.device_type.name, kwargs)
1427 return render(request, '%s_conf_edit.html' % conf.device.device_type.name, kwargs)
1428
1428
1429
1429
1430 @login_required
1430 @login_required
1431 def dev_conf_start(request, id_conf):
1431 def dev_conf_start(request, id_conf):
1432
1432
1433 conf = get_object_or_404(Configuration, pk=id_conf)
1433 conf = get_object_or_404(Configuration, pk=id_conf)
1434
1434
1435 if conf.start_device():
1435 if conf.start_device():
1436 messages.success(request, conf.message)
1436 messages.success(request, conf.message)
1437 else:
1437 else:
1438 messages.error(request, conf.message)
1438 messages.error(request, conf.message)
1439
1439
1440 #conf.status_device()
1440 #conf.status_device()
1441
1441
1442 return redirect(conf.get_absolute_url())
1442 return redirect(conf.get_absolute_url())
1443
1443
1444
1444
1445 @login_required
1445 @login_required
1446 def dev_conf_stop(request, id_conf):
1446 def dev_conf_stop(request, id_conf):
1447
1447
1448 conf = get_object_or_404(Configuration, pk=id_conf)
1448 conf = get_object_or_404(Configuration, pk=id_conf)
1449
1449
1450 if conf.stop_device():
1450 if conf.stop_device():
1451 messages.success(request, conf.message)
1451 messages.success(request, conf.message)
1452 else:
1452 else:
1453 messages.error(request, conf.message)
1453 messages.error(request, conf.message)
1454
1454
1455 #conf.status_device()
1455 #conf.status_device()
1456
1456
1457 return redirect(conf.get_absolute_url())
1457 return redirect(conf.get_absolute_url())
1458
1458
1459
1459
1460 @login_required
1460 @login_required
1461 def dev_conf_status(request, id_conf):
1461 def dev_conf_status(request, id_conf):
1462
1462
1463 conf = get_object_or_404(Configuration, pk=id_conf)
1463 conf = get_object_or_404(Configuration, pk=id_conf)
1464
1464
1465 conf_active = Configuration.objects.filter(pk=conf.device.conf_active).first()
1465 conf_active = Configuration.objects.filter(pk=conf.device.conf_active).first()
1466 if conf_active!=conf:
1466 if conf_active!=conf:
1467 url = '#' if conf_active is None else conf_active.get_absolute_url()
1467 url = '#' if conf_active is None else conf_active.get_absolute_url()
1468 label = 'None' if conf_active is None else conf_active.label
1468 label = 'None' if conf_active is None else conf_active.label
1469 messages.warning(
1469 messages.warning(
1470 request,
1470 request,
1471 mark_safe('The current configuration has not been written to device, the active configuration is <a href="{}">{}</a>'.format(
1471 mark_safe('The current configuration has not been written to device, the active configuration is <a href="{}">{}</a>'.format(
1472 url,
1472 url,
1473 label
1473 label
1474 ))
1474 ))
1475 )
1475 )
1476
1476
1477 return redirect(conf.get_absolute_url())
1477 return redirect(conf.get_absolute_url())
1478
1478
1479 if conf.status_device():
1479 if conf.status_device():
1480 messages.success(request, conf.message)
1480 messages.success(request, conf.message)
1481 else:
1481 else:
1482 messages.error(request, conf.message)
1482 messages.error(request, conf.message)
1483
1483
1484 return redirect(conf.get_absolute_url())
1484 return redirect(conf.get_absolute_url())
1485
1485
1486
1486
1487 @login_required
1487 @login_required
1488 def dev_conf_reset(request, id_conf):
1488 def dev_conf_reset(request, id_conf):
1489
1489
1490 conf = get_object_or_404(Configuration, pk=id_conf)
1490 conf = get_object_or_404(Configuration, pk=id_conf)
1491
1491
1492 if conf.reset_device():
1492 if conf.reset_device():
1493 messages.success(request, conf.message)
1493 messages.success(request, conf.message)
1494 else:
1494 else:
1495 messages.error(request, conf.message)
1495 messages.error(request, conf.message)
1496
1496
1497 return redirect(conf.get_absolute_url())
1497 return redirect(conf.get_absolute_url())
1498
1498
1499
1499
1500 @login_required
1500 @login_required
1501 def dev_conf_write(request, id_conf):
1501 def dev_conf_write(request, id_conf):
1502
1502
1503 conf = get_object_or_404(Configuration, pk=id_conf)
1503 conf = get_object_or_404(Configuration, pk=id_conf)
1504
1504
1505 if request.method == 'POST':
1505 if request.method == 'POST':
1506 if conf.write_device():
1506 if conf.write_device():
1507 conf.device.conf_active = conf.pk
1507 conf.device.conf_active = conf.pk
1508 conf.device.save()
1508 conf.device.save()
1509 messages.success(request, conf.message)
1509 messages.success(request, conf.message)
1510 if has_been_modified(conf):
1510 if has_been_modified(conf):
1511 conf.clone(type=1, template=False)
1511 conf.clone(type=1, template=False)
1512 else:
1512 else:
1513 messages.error(request, conf.message)
1513 messages.error(request, conf.message)
1514
1514
1515 return redirect(get_object_or_404(Configuration, pk=id_conf).get_absolute_url())
1515 return redirect(get_object_or_404(Configuration, pk=id_conf).get_absolute_url())
1516
1516
1517 kwargs = {
1517 kwargs = {
1518 'title': 'Write Configuration',
1518 'title': 'Write Configuration',
1519 'suptitle': conf.label,
1519 'suptitle': conf.label,
1520 'message': 'Are you sure yo want to write this {} configuration?'.format(conf.device),
1520 'message': 'Are you sure yo want to write this {} configuration?'.format(conf.device),
1521 'delete': False
1521 'delete': False
1522 }
1522 }
1523 kwargs['menu_configurations'] = 'active'
1523 kwargs['menu_configurations'] = 'active'
1524
1524
1525 return render(request, 'confirm.html', kwargs)
1525 return render(request, 'confirm.html', kwargs)
1526
1526
1527
1527
1528 @login_required
1528 @login_required
1529 def dev_conf_read(request, id_conf):
1529 def dev_conf_read(request, id_conf):
1530
1530
1531 conf = get_object_or_404(Configuration, pk=id_conf)
1531 conf = get_object_or_404(Configuration, pk=id_conf)
1532
1532
1533 DevConfForm = CONF_FORMS[conf.device.device_type.name]
1533 DevConfForm = CONF_FORMS[conf.device.device_type.name]
1534
1534
1535 if request.method == 'GET':
1535 if request.method == 'GET':
1536
1536
1537 parms = conf.read_device()
1537 parms = conf.read_device()
1538 #conf.status_device()
1538 #conf.status_device()
1539
1539
1540 if not parms:
1540 if not parms:
1541 messages.error(request, conf.message)
1541 messages.error(request, conf.message)
1542 return redirect(conf.get_absolute_url())
1542 return redirect(conf.get_absolute_url())
1543
1543
1544 form = DevConfForm(initial=parms, instance=conf)
1544 form = DevConfForm(initial=parms, instance=conf)
1545
1545
1546 if request.method == 'POST':
1546 if request.method == 'POST':
1547 form = DevConfForm(request.POST, instance=conf)
1547 form = DevConfForm(request.POST, instance=conf)
1548
1548
1549 if form.is_valid():
1549 if form.is_valid():
1550 form.save()
1550 form.save()
1551 return redirect(conf.get_absolute_url())
1551 return redirect(conf.get_absolute_url())
1552
1552
1553 messages.error(request, "Parameters could not be saved")
1553 messages.error(request, "Parameters could not be saved")
1554
1554
1555 kwargs = {}
1555 kwargs = {}
1556 kwargs['id_dev'] = conf.id
1556 kwargs['id_dev'] = conf.id
1557 kwargs['form'] = form
1557 kwargs['form'] = form
1558 kwargs['title'] = 'Device Configuration'
1558 kwargs['title'] = 'Device Configuration'
1559 kwargs['suptitle'] = 'Parameters read from device'
1559 kwargs['suptitle'] = 'Parameters read from device'
1560 kwargs['button'] = 'Save'
1560 kwargs['button'] = 'Save'
1561
1561
1562 ###### SIDEBAR ######
1562 ###### SIDEBAR ######
1563 kwargs.update(sidebar(conf=conf))
1563 kwargs.update(sidebar(conf=conf))
1564
1564
1565 return render(request, '%s_conf_edit.html' % conf.device.device_type.name, kwargs)
1565 return render(request, '%s_conf_edit.html' % conf.device.device_type.name, kwargs)
1566
1566
1567
1567
1568 @login_required
1568 @login_required
1569 def dev_conf_import(request, id_conf):
1569 def dev_conf_import(request, id_conf):
1570
1570
1571 conf = get_object_or_404(Configuration, pk=id_conf)
1571 conf = get_object_or_404(Configuration, pk=id_conf)
1572 DevConfForm = CONF_FORMS[conf.device.device_type.name]
1572 DevConfForm = CONF_FORMS[conf.device.device_type.name]
1573
1573
1574 if request.method == 'GET':
1574 if request.method == 'GET':
1575 file_form = UploadFileForm()
1575 file_form = UploadFileForm()
1576
1576
1577 if request.method == 'POST':
1577 if request.method == 'POST':
1578 file_form = UploadFileForm(request.POST, request.FILES)
1578 file_form = UploadFileForm(request.POST, request.FILES)
1579
1579
1580 if file_form.is_valid():
1580 if file_form.is_valid():
1581
1581
1582 data = conf.import_from_file(request.FILES['file'])
1582 data = conf.import_from_file(request.FILES['file'])
1583 parms = Params(data=data).get_conf(
1583 parms = Params(data=data).get_conf(
1584 dtype=conf.device.device_type.name)
1584 dtype=conf.device.device_type.name)
1585
1585
1586 if parms:
1586 if parms:
1587
1587
1588 form = DevConfForm(initial=parms, instance=conf)
1588 form = DevConfForm(initial=parms, instance=conf)
1589
1589
1590 kwargs = {}
1590 kwargs = {}
1591 kwargs['id_dev'] = conf.id
1591 kwargs['id_dev'] = conf.id
1592 kwargs['form'] = form
1592 kwargs['form'] = form
1593 kwargs['title'] = 'Device Configuration'
1593 kwargs['title'] = 'Device Configuration'
1594 kwargs['suptitle'] = 'Parameters imported'
1594 kwargs['suptitle'] = 'Parameters imported'
1595 kwargs['button'] = 'Save'
1595 kwargs['button'] = 'Save'
1596 kwargs['action'] = conf.get_absolute_url_edit()
1596 kwargs['action'] = conf.get_absolute_url_edit()
1597 kwargs['previous'] = conf.get_absolute_url()
1597 kwargs['previous'] = conf.get_absolute_url()
1598
1598
1599 ###### SIDEBAR ######
1599 ###### SIDEBAR ######
1600 kwargs.update(sidebar(conf=conf))
1600 kwargs.update(sidebar(conf=conf))
1601
1601
1602 messages.success(
1602 messages.success(
1603 request, "Parameters imported from: '%s'." % request.FILES['file'].name)
1603 request, "Parameters imported from: '%s'." % request.FILES['file'].name)
1604
1604
1605 return render(request, '%s_conf_edit.html' % conf.device.device_type.name, kwargs)
1605 return render(request, '%s_conf_edit.html' % conf.device.device_type.name, kwargs)
1606
1606
1607 messages.error(request, "Could not import parameters from file")
1607 messages.error(request, "Could not import parameters from file")
1608
1608
1609 kwargs = {}
1609 kwargs = {}
1610 kwargs['id_dev'] = conf.id
1610 kwargs['id_dev'] = conf.id
1611 kwargs['title'] = 'Device Configuration'
1611 kwargs['title'] = 'Device Configuration'
1612 kwargs['form'] = file_form
1612 kwargs['form'] = file_form
1613 kwargs['suptitle'] = 'Importing file'
1613 kwargs['suptitle'] = 'Importing file'
1614 kwargs['button'] = 'Import'
1614 kwargs['button'] = 'Import'
1615 kwargs['menu_configurations'] = 'active'
1615 kwargs['menu_configurations'] = 'active'
1616
1616
1617 kwargs.update(sidebar(conf=conf))
1617 kwargs.update(sidebar(conf=conf))
1618
1618
1619 return render(request, 'dev_conf_import.html', kwargs)
1619 return render(request, 'dev_conf_import.html', kwargs)
1620
1620
1621
1621
1622 @login_required
1622 @login_required
1623 def dev_conf_export(request, id_conf):
1623 def dev_conf_export(request, id_conf):
1624
1624
1625 conf = get_object_or_404(Configuration, pk=id_conf)
1625 conf = get_object_or_404(Configuration, pk=id_conf)
1626
1626
1627 if request.method == 'GET':
1627 if request.method == 'GET':
1628 file_form = DownloadFileForm(conf.device.device_type.name)
1628 file_form = DownloadFileForm(conf.device.device_type.name)
1629
1629
1630 if request.method == 'POST':
1630 if request.method == 'POST':
1631 file_form = DownloadFileForm(
1631 file_form = DownloadFileForm(
1632 conf.device.device_type.name, request.POST)
1632 conf.device.device_type.name, request.POST)
1633
1633
1634 if file_form.is_valid():
1634 if file_form.is_valid():
1635 fields = conf.export_to_file(
1635 fields = conf.export_to_file(
1636 format=file_form.cleaned_data['format'])
1636 format=file_form.cleaned_data['format'])
1637 if not fields['content']:
1637 if not fields['content']:
1638 messages.error(request, conf.message)
1638 messages.error(request, conf.message)
1639 return redirect(conf.get_absolute_url_export())
1639 return redirect(conf.get_absolute_url_export())
1640 response = HttpResponse(content_type=fields['content_type'])
1640 response = HttpResponse(content_type=fields['content_type'])
1641 response['Content-Disposition'] = 'attachment; filename="%s"' % fields['filename']
1641 response['Content-Disposition'] = 'attachment; filename="%s"' % fields['filename']
1642 response.write(fields['content'])
1642 response.write(fields['content'])
1643
1643
1644 return response
1644 return response
1645
1645
1646 messages.error(request, "Could not export parameters")
1646 messages.error(request, "Could not export parameters")
1647
1647
1648 kwargs = {}
1648 kwargs = {}
1649 kwargs['id_dev'] = conf.id
1649 kwargs['id_dev'] = conf.id
1650 kwargs['title'] = 'Device Configuration'
1650 kwargs['title'] = 'Device Configuration'
1651 kwargs['form'] = file_form
1651 kwargs['form'] = file_form
1652 kwargs['suptitle'] = 'Exporting file'
1652 kwargs['suptitle'] = 'Exporting file'
1653 kwargs['button'] = 'Export'
1653 kwargs['button'] = 'Export'
1654 kwargs['menu_configurations'] = 'active'
1654 kwargs['menu_configurations'] = 'active'
1655
1655
1656 return render(request, 'dev_conf_export.html', kwargs)
1656 return render(request, 'dev_conf_export.html', kwargs)
1657
1657
1658
1658
1659 @login_required
1659 @login_required
1660 def dev_conf_delete(request, id_conf):
1660 def dev_conf_delete(request, id_conf):
1661
1661
1662 conf = get_object_or_404(Configuration, pk=id_conf)
1662 conf = get_object_or_404(Configuration, pk=id_conf)
1663
1663
1664 if request.method == 'POST':
1664 if request.method == 'POST':
1665 if is_developer(request.user):
1665 if is_developer(request.user):
1666 conf.delete()
1666 conf.delete()
1667 return redirect('url_dev_confs')
1667 return redirect('url_dev_confs')
1668
1668
1669 messages.error(request, 'Not enough permission to delete this object')
1669 messages.error(request, 'Not enough permission to delete this object')
1670 return redirect(conf.get_absolute_url())
1670 return redirect(conf.get_absolute_url())
1671
1671
1672 kwargs = {
1672 kwargs = {
1673 'title': 'Delete',
1673 'title': 'Delete',
1674 'suptitle': 'Configuration',
1674 'suptitle': 'Configuration',
1675 'object': conf,
1675 'object': conf,
1676 'delete': True
1676 'delete': True
1677 }
1677 }
1678 kwargs['menu_configurations'] = 'active'
1678 kwargs['menu_configurations'] = 'active'
1679
1679
1680 return render(request, 'confirm.html', kwargs)
1680 return render(request, 'confirm.html', kwargs)
1681
1681
1682
1682
1683 def sidebar(**kwargs):
1683 def sidebar(**kwargs):
1684
1684
1685 side_data = {}
1685 side_data = {}
1686
1686
1687 conf = kwargs.get('conf', None)
1687 conf = kwargs.get('conf', None)
1688 experiment = kwargs.get('experiment', None)
1688 experiment = kwargs.get('experiment', None)
1689
1689
1690 if not experiment:
1690 if not experiment:
1691 experiment = conf.experiment
1691 experiment = conf.experiment
1692
1692
1693 if experiment:
1693 if experiment:
1694 side_data['experiment'] = experiment
1694 side_data['experiment'] = experiment
1695 campaign = experiment.campaign_set.all()
1695 campaign = experiment.campaign_set.all()
1696 if campaign:
1696 if campaign:
1697 side_data['campaign'] = campaign[0]
1697 side_data['campaign'] = campaign[0]
1698 experiments = campaign[0].experiments.all().order_by('name')
1698 experiments = campaign[0].experiments.all().order_by('name')
1699 else:
1699 else:
1700 experiments = [experiment]
1700 experiments = [experiment]
1701 configurations = experiment.configuration_set.filter(type=0)
1701 configurations = experiment.configuration_set.filter(type=0)
1702 side_data['side_experiments'] = experiments
1702 side_data['side_experiments'] = experiments
1703 side_data['side_configurations'] = configurations.order_by(
1703 side_data['side_configurations'] = configurations.order_by(
1704 'device__device_type__name')
1704 'device__device_type__name')
1705
1705
1706 return side_data
1706 return side_data
1707
1707
1708
1709 def get_paginator(model, page, order, filters={}, n=8):
1708 def get_paginator(model, page, order, filters={}, n=8):
1710
1711 kwargs = {}
1709 kwargs = {}
1712 query = Q()
1710 query = Q()
1713 if isinstance(filters, QueryDict):
1711 if isinstance(filters, QueryDict):
1714 filters = filters.dict()
1712 filters = filters.dict()
1715 [filters.pop(key) for key in filters.keys() if filters[key] in ('', ' ')]
1713 copy_filters=filters.copy()
1714 [filters.pop(key) for key in copy_filters.keys() if copy_filters[key] in (' ', ' ')]
1716 filters.pop('page', None)
1715 filters.pop('page', None)
1717
1716
1718 fields = [f.name for f in model._meta.get_fields()]
1717 fields = [f.name for f in model._meta.get_fields()]
1719
1718
1720 if 'template' in filters:
1719 if 'template' in copy_filters:
1721 filters['template'] = True
1720 filters['template'] = True
1722 if 'historical' in filters:
1721 if 'historical' in copy_filters:
1723 filters.pop('historical')
1722 filters.pop('historical')
1724 filters['type'] = 1
1723 filters['type'] = 1
1725 elif 'type' in fields:
1724 elif 'type' in fields:
1726 filters['type'] = 0
1725 filters['type'] = 0
1727 if 'start_date' in filters:
1726 if 'start_date' in copy_filters:
1728 filters['start_date__gte'] = filters.pop('start_date')
1727 filters['start_date__gte'] =filters.pop('start_date')
1729 if 'end_date' in filters:
1728 if 'end_date' in copy_filters:
1730 filters['start_date__lte'] = filters.pop('end_date')
1729 filters['start_date__lte'] =filters.pop('end_date')
1731 if 'tags' in filters:
1730 if 'tags' in copy_filters:
1732 tags = filters.pop('tags')
1731 tags =filters.pop('tags')
1733 if 'tags' in fields:
1732 if 'tags' in fields:
1734 query = query | Q(tags__icontains=tags)
1733 query = query | Q(tags__icontains=tags)
1735 if 'label' in fields:
1734 if 'label' in fields:
1736 query = query | Q(label__icontains=tags)
1735 query = query | Q(label__icontains=tags)
1737 if 'location' in fields:
1736 if 'location' in fields:
1738 query = query | Q(location__name__icontains=tags)
1737 query = query | Q(location__name__icontains=tags)
1739 if 'device' in fields:
1738 if 'device' in fields:
1740 query = query | Q(device__device_type__name__icontains=tags)
1739 query = query | Q(device__device_type__name__icontains=tags)
1741 query = query | Q(device__location__name__icontains=tags)
1740 query = query | Q(device__location__name__icontains=tags)
1742 if 'device_type' in fields:
1741 if 'device_type' in fields:
1743 query = query | Q(device_type__name__icontains=tags)
1742 query = query | Q(device_type__name__icontains=tags)
1744
1743
1745 if 'mine' in filters:
1744 if 'mine' in copy_filters:
1746 filters['author_id'] = filters['mine']
1745 filters['author_id'] =filters['mine']
1747 filters.pop('mine')
1746 filters.pop('mine')
1748 object_list = model.objects.filter(query, **filters).order_by(*order)
1747 object_list = model.objects.filter(query, **filters).order_by(*order)
1749 paginator = Paginator(object_list, n)
1748 paginator = Paginator(object_list, n)
1750
1749
1751 try:
1750 try:
1752 objects = paginator.page(page)
1751 objects = paginator.page(page)
1753 except PageNotAnInteger:
1752 except PageNotAnInteger:
1754 objects = paginator.page(1)
1753 objects = paginator.page(1)
1755 except EmptyPage:
1754 except EmptyPage:
1756 objects = paginator.page(paginator.num_pages)
1755 objects = paginator.page(paginator.num_pages)
1757
1756
1758 kwargs['objects'] = objects
1757 kwargs['objects'] = objects
1759 kwargs['offset'] = (int(page)-1)*n if page else 0
1758 kwargs['offset'] = (int(page)-1)*n if page else 0
1760
1759
1761 return kwargs
1760 return kwargs
1762
1761
1762 # def get_paginator(model, page, order, filters={}, n=8):
1763 # kwargs = {}
1764 # query = Q()
1765 # if isinstance(filters, QueryDict):
1766 # filters = filters.dict()
1767 # [filters.pop(key) for key in filters.keys() if filters[key] in ('', ' ')]
1768 # filters.pop('page', None)
1769
1770 # fields = [f.name for f in model._meta.get_fields()]
1771
1772 # if 'template' in filters:
1773 # filters['template'] = True
1774 # if 'historical' in filters:
1775 # filters.pop('historical')
1776 # filters['type'] = 1
1777 # elif 'type' in fields:
1778 # filters['type'] = 0
1779 # if 'start_date' in filters:
1780 # filters['start_date__gte'] = filters.pop('start_date')
1781 # if 'end_date' in filters:
1782 # filters['start_date__lte'] = filters.pop('end_date')
1783 # if 'tags' in filters:
1784 # tags = filters.pop('tags')
1785 # if 'tags' in fields:
1786 # query = query | Q(tags__icontains=tags)
1787 # if 'label' in fields:
1788 # query = query | Q(label__icontains=tags)
1789 # if 'location' in fields:
1790 # query = query | Q(location__name__icontains=tags)
1791 # if 'device' in fields:
1792 # query = query | Q(device__device_type__name__icontains=tags)
1793 # query = query | Q(device__location__name__icontains=tags)
1794 # if 'device_type' in fields:
1795 # query = query | Q(device_type__name__icontains=tags)
1796
1797 # if 'mine' in filters:
1798 # filters['author_id'] = filters['mine']
1799 # filters.pop('mine')
1800 # object_list = model.objects.filter(query, **filters).order_by(*order)
1801 # paginator = Paginator(object_list, n)
1802
1803 # try:
1804 # objects = paginator.page(page)
1805 # except PageNotAnInteger:
1806 # objects = paginator.page(1)
1807 # except EmptyPage:
1808 # objects = paginator.page(paginator.num_pages)
1809
1810 # kwargs['objects'] = objects
1811 # kwargs['offset'] = (int(page)-1)*n if page else 0
1812
1813 # return kwargs
1814
1763
1815
1764 def operation(request, id_camp=None):
1816 def operation(request, id_camp=None):
1765
1817
1766 kwargs = {}
1818 kwargs = {}
1767 kwargs['title'] = 'Radars Operation'
1819 kwargs['title'] = 'Radars Operation'
1768 kwargs['no_sidebar'] = True
1820 kwargs['no_sidebar'] = True
1769 kwargs['menu_operation'] = 'active'
1821 kwargs['menu_operation'] = 'active'
1770 campaigns = Campaign.objects.filter(start_date__lte=datetime.now(),
1822 campaigns = Campaign.objects.filter(start_date__lte=datetime.now(),
1771 end_date__gte=datetime.now()).order_by('-start_date')
1823 end_date__gte=datetime.now()).order_by('-start_date')
1772
1824
1773 if id_camp:
1825 if id_camp:
1774 campaign = get_object_or_404(Campaign, pk=id_camp)
1826 campaign = get_object_or_404(Campaign, pk=id_camp)
1775 form = OperationForm(
1827 form = OperationForm(
1776 initial={'campaign': campaign.id}, campaigns=campaigns)
1828 initial={'campaign': campaign.id}, campaigns=campaigns)
1777 kwargs['campaign'] = campaign
1829 kwargs['campaign'] = campaign
1778 else:
1830 else:
1779 # form = OperationForm(campaigns=campaigns)
1831 # form = OperationForm(campaigns=campaigns)
1780 kwargs['campaigns'] = campaigns
1832 kwargs['campaigns'] = campaigns
1781 return render(request, 'operation.html', kwargs)
1833 return render(request, 'operation.html', kwargs)
1782
1834
1783 #---Experiment
1835 #---Experiment
1784 keys = ['id', 'name', 'start_time', 'end_time', 'status']
1836 keys = ['id', 'name', 'start_time', 'end_time', 'status']
1785 kwargs['experiment_keys'] = keys[1:]
1837 kwargs['experiment_keys'] = keys[1:]
1786 kwargs['experiments'] = experiments
1838 kwargs['experiments'] = experiments
1787 #---Radar
1839 #---Radar
1788 kwargs['locations'] = campaign.get_experiments_by_radar()
1840 kwargs['locations'] = campaign.get_experiments_by_radar()
1789 kwargs['form'] = form
1841 kwargs['form'] = form
1790
1842
1791 return render(request, 'operation.html', kwargs)
1843 return render(request, 'operation.html', kwargs)
1792
1844
1793
1845
1794 @login_required
1846 @login_required
1795 def radar_start(request, id_camp, id_radar):
1847 def radar_start(request, id_camp, id_radar):
1796
1848
1797 campaign = get_object_or_404(Campaign, pk=id_camp)
1849 campaign = get_object_or_404(Campaign, pk=id_camp)
1798 experiments = campaign.get_experiments_by_radar(id_radar)[0]['experiments']
1850 experiments = campaign.get_experiments_by_radar(id_radar)[0]['experiments']
1799 now = datetime.now()
1851 now = datetime.now()
1800
1852
1801 for exp in experiments:
1853 for exp in experiments:
1802 #app.control.revoke(exp.task)
1854 #app.control.revoke(exp.task)
1803 print("----------------------")
1855 print("----------------------")
1804 print("status:->", exp.status)
1856 print("status:->", exp.status)
1805 start = datetime.combine(datetime.now().date(), exp.start_time)
1857 start = datetime.combine(datetime.now().date(), exp.start_time)
1806 end = datetime.combine(datetime.now().date(), exp.end_time)
1858 end = datetime.combine(datetime.now().date(), exp.end_time)
1807 print("start exp: ",exp.start_time)
1859 print("start exp: ",exp.start_time)
1808 print("end exp: ",exp.end_time)
1860 print("end exp: ",exp.end_time)
1809
1861
1810 print("start comb: ",start)
1862 print("start comb: ",start)
1811 print("end comb: ",end)
1863 print("end comb: ",end)
1812 print(is_aware(start))
1864 print(is_aware(start))
1813 print("start camp",campaign.start_date)
1865 print("start camp",campaign.start_date)
1814 print("end camp",campaign.end_date)
1866 print("end camp",campaign.end_date)
1815 print(is_aware(campaign.start_date))
1867 print(is_aware(campaign.start_date))
1816 if end < start:
1868 if end < start:
1817 end += timedelta(1)
1869 end += timedelta(1)
1818
1870
1819 if exp.status == 2:
1871 if exp.status == 2:
1820 messages.warning(
1872 messages.warning(
1821 request, 'Experiment {} already running'.format(exp))
1873 request, 'Experiment {} already running'.format(exp))
1822 #continue
1874 #continue
1823
1875
1824 if exp.status == 3:
1876 if exp.status == 3:
1825 messages.warning(
1877 messages.warning(
1826 request, 'Experiment {} already programmed'.format(exp))
1878 request, 'Experiment {} already programmed'.format(exp))
1827 #continue
1879 #continue
1828
1880
1829 if exp.status == 1:
1881 if exp.status == 1:
1830 messages.warning(
1882 messages.warning(
1831 request, 'Experiment {} stopped'.format(exp))
1883 request, 'Experiment {} stopped'.format(exp))
1832 #continue
1884 #continue
1833
1885
1834 if start > campaign.end_date:
1886 if start > campaign.end_date:
1835 messages.warning(
1887 messages.warning(
1836 request, 'Experiment {} out of date'.format(exp))
1888 request, 'Experiment {} out of date'.format(exp))
1837
1889
1838 #app.control.revoke(exp.task)
1890 #app.control.revoke(exp.task)
1839 print("Llego luego del revoke")
1891 print("Llego luego del revoke")
1840 if now >= start and now <= end:
1892 if now >= start and now <= end:
1841
1893
1842 print("Caso now > start and < end -- (1)")
1894 print("Caso now > start and < end -- (1)")
1843
1895
1844 # -------------------------------------------
1896 # -------------------------------------------
1845
1897
1846 # task = task_start.delay(exp.id)
1898 # task = task_start.delay(exp.id)
1847 # exp.task = task.id
1899 # exp.task = task.id
1848 # exp.status = task.get()
1900 # exp.status = task.get()
1849 # -------------------------------------------
1901 # -------------------------------------------
1850
1902
1851 #exp.status = task.wait()
1903 #exp.status = task.wait()
1852
1904
1853 if exp.status == 0:
1905 if exp.status == 0:
1854 messages.error(request, 'Experiment {} not start'.format(exp))
1906 messages.error(request, 'Experiment {} not start'.format(exp))
1855 if exp.status == 2:
1907 if exp.status == 2:
1856 messages.success(request, 'Experiment {} started'.format(exp))
1908 messages.success(request, 'Experiment {} started'.format(exp))
1857 elif now < start:
1909 elif now < start:
1858 print("Caso now <= start -- (2)",exp.pk)
1910 print("Caso now <= start -- (2)",exp.pk)
1859 #task = task_start.apply_async((exp.pk, ), eta=start)#start+timedelta(hours=5))
1911 #task = task_start.apply_async((exp.pk, ), eta=start)#start+timedelta(hours=5))
1860 # task = task_start.apply_async((exp.pk, ), eta=start+timedelta(hours=5))#)
1912 # task = task_start.apply_async((exp.pk, ), eta=start+timedelta(hours=5))#)
1861 # exp.task = task.id
1913 # exp.task = task.id
1862 # exp.status = 3
1914 # exp.status = 3
1863 messages.success(request, 'Experiment {} programmed to start at {}'.format(exp, start))
1915 messages.success(request, 'Experiment {} programmed to start at {}'.format(exp, start))
1864 else:
1916 else:
1865 print("Caso now > end -- (3)")
1917 print("Caso now > end -- (3)")
1866 exp.status = 4
1918 exp.status = 4
1867 messages.warning(
1919 messages.warning(
1868 request, 'Experiment {} out of date'.format(exp))
1920 request, 'Experiment {} out of date'.format(exp))
1869
1921
1870 exp.save()
1922 exp.save()
1871
1923
1872 return HttpResponseRedirect(reverse('url_operation', args=[id_camp]))
1924 return HttpResponseRedirect(reverse('url_operation', args=[id_camp]))
1873
1925
1874
1926
1875 @login_required
1927 @login_required
1876 def radar_stop(request, id_camp, id_radar):
1928 def radar_stop(request, id_camp, id_radar):
1877
1929
1878 campaign = get_object_or_404(Campaign, pk=id_camp)
1930 campaign = get_object_or_404(Campaign, pk=id_camp)
1879 experiments = campaign.get_experiments_by_radar(id_radar)[0]['experiments']
1931 experiments = campaign.get_experiments_by_radar(id_radar)[0]['experiments']
1880 print("Ingreso en stop radar_stop")
1932 print("Ingreso en stop radar_stop")
1881 #for exp in experiments:
1933 #for exp in experiments:
1882
1934
1883 # if exp.task:
1935 # if exp.task:
1884 # print("Ingreso antes de revoke stop")
1936 # print("Ingreso antes de revoke stop")
1885 # app.control.revoke(exp.task)
1937 # app.control.revoke(exp.task)
1886
1938
1887
1939
1888 # if exp.status == 2: #status 2 es started
1940 # if exp.status == 2: #status 2 es started
1889 # print("llama a exp.stop")
1941 # print("llama a exp.stop")
1890 # exp.stop()
1942 # exp.stop()
1891 # messages.warning(request, 'Experiment {} stopped'.format(exp))
1943 # messages.warning(request, 'Experiment {} stopped'.format(exp))
1892 # exp.status = 1
1944 # exp.status = 1
1893 # exp.save()
1945 # exp.save()
1894
1946
1895 #return HttpResponseRedirect(reverse('url_operation', args=[id_camp]))
1947 #return HttpResponseRedirect(reverse('url_operation', args=[id_camp]))
1896
1948
1897
1949
1898 @login_required
1950 @login_required
1899 def radar_refresh(request, id_camp, id_radar):
1951 def radar_refresh(request, id_camp, id_radar):
1900
1952
1901 campaign = get_object_or_404(Campaign, pk=id_camp)
1953 campaign = get_object_or_404(Campaign, pk=id_camp)
1902 experiments = campaign.get_experiments_by_radar(id_radar)[0]['experiments']
1954 experiments = campaign.get_experiments_by_radar(id_radar)[0]['experiments']
1903
1955
1904 i = app.control.inspect()
1956 i = app.control.inspect()
1905 print("inspect",i)
1957 print("inspect",i)
1906 print(i.scheduled())
1958 print(i.scheduled())
1907 print(i.scheduled().values())
1959 print(i.scheduled().values())
1908 scheduled = list(i.scheduled().values())[0]
1960 scheduled = list(i.scheduled().values())[0]
1909 revoked = list(i.revoked().values())[0]
1961 revoked = list(i.revoked().values())[0]
1910
1962
1911 # for exp in experiments:
1963 # for exp in experiments:
1912 # if exp.task in revoked:
1964 # if exp.task in revoked:
1913 # exp.status = 1
1965 # exp.status = 1
1914 # elif exp.task in [t['request']['id'] for t in scheduled if 'task_stop' in t['request']['name']]:
1966 # elif exp.task in [t['request']['id'] for t in scheduled if 'task_stop' in t['request']['name']]:
1915 # exp.status = 2
1967 # exp.status = 2
1916 # elif exp.task in [t['request']['id'] for t in scheduled if 'task_start' in t['request']['name']]:
1968 # elif exp.task in [t['request']['id'] for t in scheduled if 'task_start' in t['request']['name']]:
1917 # exp.status = 3
1969 # exp.status = 3
1918 # else:
1970 # else:
1919 # exp.status = 4
1971 # exp.status = 4
1920 # exp.save()
1972 # exp.save()
1921 # return HttpResponseRedirect(reverse('url_operation', args=[id_camp]))
1973 # return HttpResponseRedirect(reverse('url_operation', args=[id_camp]))
1922
1974
1923 #@login_required
1975 #@login_required
1924 # def revoke_tasks(request, id_camp):
1976 # def revoke_tasks(request, id_camp):
1925
1977
1926 # i = app.control.inspect()
1978 # i = app.control.inspect()
1927 # scheduled = list(i.scheduled().values())[0]
1979 # scheduled = list(i.scheduled().values())[0]
1928 # revoked = list(i.revoked().values())[0]
1980 # revoked = list(i.revoked().values())[0]
1929
1981
1930 # for t in scheduled:
1982 # for t in scheduled:
1931 # if t['request']['id'] in revoked:
1983 # if t['request']['id'] in revoked:
1932 # continue
1984 # continue
1933 # app.control.revoke(t['request']['id'])
1985 # app.control.revoke(t['request']['id'])
1934 # exp = Experiment.objects.get(pk=eval(str(t['request']['args']))[0])
1986 # exp = Experiment.objects.get(pk=eval(str(t['request']['args']))[0])
1935 # eta = t['eta']
1987 # eta = t['eta']
1936 # #task = t['request']['name'].split('.')[-1]
1988 # #task = t['request']['name'].split('.')[-1]
1937 # messages.warning(request, 'Scheduled {} at {} for experiment {} revoked'.format(task, eta, exp.name))
1989 # messages.warning(request, 'Scheduled {} at {} for experiment {} revoked'.format(task, eta, exp.name))
1938
1990
1939 # return HttpResponseRedirect(reverse('url_operation', args=[id_camp]))
1991 # return HttpResponseRedirect(reverse('url_operation', args=[id_camp]))
1940
1992
1941 # @login_required
1993 # @login_required
1942 # def show_tasks(request, id_camp):
1994 # def show_tasks(request, id_camp):
1943
1995
1944 # i = app.control.inspect()
1996 # i = app.control.inspect()
1945 # scheduled = list(i.scheduled().values())[0]
1997 # scheduled = list(i.scheduled().values())[0]
1946 # revoked = list(i.revoked().values())[0]
1998 # revoked = list(i.revoked().values())[0]
1947
1999
1948 # for t in scheduled:
2000 # for t in scheduled:
1949 # if t['request']['id'] in revoked:
2001 # if t['request']['id'] in revoked:
1950 # continue
2002 # continue
1951 # exp = Experiment.objects.get(pk=eval(str(t['request']['args']))[0])
2003 # exp = Experiment.objects.get(pk=eval(str(t['request']['args']))[0])
1952 # eta = t['eta']
2004 # eta = t['eta']
1953 # #task = t['request']['name'].split('.')[-1]
2005 # #task = t['request']['name'].split('.')[-1]
1954 # #messages.success(request, 'Task {} scheduled at {} for experiment {}'.format(task, eta, exp.name))
2006 # #messages.success(request, 'Task {} scheduled at {} for experiment {}'.format(task, eta, exp.name))
1955
2007
1956 # return HttpResponseRedirect(reverse('url_operation', args=[id_camp]))
2008 # return HttpResponseRedirect(reverse('url_operation', args=[id_camp]))
1957
2009
1958 def real_time(request):
2010 def real_time(request):
1959
2011
1960 graphic_path = "/home/fiorella/Pictures/catwbeanie.jpg"
2012 graphic_path = "/home/fiorella/Pictures/catwbeanie.jpg"
1961
2013
1962 kwargs = {}
2014 kwargs = {}
1963 kwargs['title'] = 'CLAIRE'
2015 kwargs['title'] = 'CLAIRE'
1964 kwargs['suptitle'] = 'Real Time'
2016 kwargs['suptitle'] = 'Real Time'
1965 kwargs['no_sidebar'] = True
2017 kwargs['no_sidebar'] = True
1966 kwargs['graphic_path'] = graphic_path
2018 kwargs['graphic_path'] = graphic_path
1967 kwargs['graphic1_path'] = 'http://www.bluemaize.net/im/girls-accessories/shark-beanie-11.jpg'
2019 kwargs['graphic1_path'] = 'http://www.bluemaize.net/im/girls-accessories/shark-beanie-11.jpg'
1968
2020
1969 return render(request, 'real_time.html', kwargs)
2021 return render(request, 'real_time.html', kwargs)
1970
2022
1971 def theme(request, theme):
2023 def theme(request, theme):
1972
2024
1973 user = request.user
2025 user = request.user
1974 user.profile.theme = theme
2026 user.profile.theme = theme
1975 user.save()
2027 user.save()
1976 return redirect('index')
2028 return redirect('index')
@@ -1,150 +1,150
1 """
1 """
2 Django settings for radarsys project.
2 Django settings for radarsys project.
3
3
4 Generated by 'django-admin startproject' using Django 1.8.6.
4 Generated by 'django-admin startproject' using Django 1.8.6.
5
5
6 For more information on this file, see
6 For more information on this file, see
7 https://docs.djangoproject.com/en/1.8/topics/settings/
7 https://docs.djangoproject.com/en/1.8/topics/settings/
8
8
9 For the full list of settings and their values, see
9 For the full list of settings and their values, see
10 https://docs.djangoproject.com/en/1.8/ref/settings/
10 https://docs.djangoproject.com/en/1.8/ref/settings/
11 """
11 """
12
12
13 # Build paths inside the project like this: os.path.join(BASE_DIR, ...)
13 # Build paths inside the project like this: os.path.join(BASE_DIR, ...)
14 import os
14 import os
15
15
16 BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
16 BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
17
17
18 # Quick-start development settings - unsuitable for production
18 # Quick-start development settings - unsuitable for production
19 # See https://docs.djangoproject.com/en/1.8/howto/deployment/checklist/
19 # See https://docs.djangoproject.com/en/1.8/howto/deployment/checklist/
20
20
21 # SECURITY WARNING: keep the secret key used in production secret!
21 # SECURITY WARNING: keep the secret key used in production secret!
22 SECRET_KEY = 'xshb$k5fc-+j16)cvyffj&9u__0q3$l!hieh#+tbzqg)*f^km0'
22 SECRET_KEY = 'xshb$k5fc-+j16)cvyffj&9u__0q3$l!hieh#+tbzqg)*f^km0'
23
23
24 # SECURITY WARNING: don't run with debug turned on in production!
24 # SECURITY WARNING: don't run with debug turned on in production!
25 DEBUG = True
25 DEBUG = True
26
26
27 ALLOWED_HOSTS = ['*']
27 ALLOWED_HOSTS = ['*']
28
28
29 # Application definition
29 # Application definition
30
30
31 INSTALLED_APPS = [
31 INSTALLED_APPS = [
32 'django.contrib.admin',
32 'django.contrib.admin',
33 'django.contrib.auth',
33 'django.contrib.auth',
34 'django.contrib.contenttypes',
34 'django.contrib.contenttypes',
35 'django.contrib.sessions',
35 'django.contrib.sessions',
36 'django.contrib.messages',
36 'django.contrib.messages',
37 'django.contrib.staticfiles',
37 'django.contrib.staticfiles',
38 'django_bootstrap5',
39 'polymorphic',
40 'apps.accounts',
38 'apps.accounts',
41 'apps.main',
39 'apps.main',
42 'apps.misc',
40 'apps.misc',
43 'apps.rc',
41 'apps.rc',
44 'apps.dds',
42 'apps.dds',
45 'apps.jars',
43 'apps.jars',
46 'apps.usrp',
44 'apps.usrp',
47 'apps.abs',
45 'apps.abs',
48 'apps.cgs',
46 'apps.cgs',
49 'apps.dds_rest',
47 'apps.dds_rest',
48 "django_bootstrap5",
49 'polymorphic',
50 ]
50 ]
51
51
52 MIDDLEWARE = [
52 MIDDLEWARE = [
53 'django.middleware.security.SecurityMiddleware',
53 'django.middleware.security.SecurityMiddleware',
54 'django.contrib.sessions.middleware.SessionMiddleware',
54 'django.contrib.sessions.middleware.SessionMiddleware',
55 'django.middleware.common.CommonMiddleware',
55 'django.middleware.common.CommonMiddleware',
56 'django.middleware.csrf.CsrfViewMiddleware',
56 'django.middleware.csrf.CsrfViewMiddleware',
57 'django.contrib.auth.middleware.AuthenticationMiddleware',
57 'django.contrib.auth.middleware.AuthenticationMiddleware',
58 'django.contrib.messages.middleware.MessageMiddleware',
58 'django.contrib.messages.middleware.MessageMiddleware',
59 'django.middleware.clickjacking.XFrameOptionsMiddleware',
59 'django.middleware.clickjacking.XFrameOptionsMiddleware',
60
60
61 ]
61 ]
62
62
63 ROOT_URLCONF = 'radarsys.urls'
63 ROOT_URLCONF = 'radarsys.urls'
64
64
65 TEMPLATES = [
65 TEMPLATES = [
66 {
66 {
67 'BACKEND': 'django.template.backends.django.DjangoTemplates',
67 'BACKEND': 'django.template.backends.django.DjangoTemplates',
68 'DIRS': [os.path.join(BASE_DIR, "templates")],
68 'DIRS': [os.path.join(BASE_DIR, "templates")],
69 'APP_DIRS': True,
69 'APP_DIRS': True,
70 'OPTIONS': {
70 'OPTIONS': {
71 'context_processors': [
71 'context_processors': [
72 'django.template.context_processors.debug',
72 'django.template.context_processors.debug',
73 'django.template.context_processors.request',
73 'django.template.context_processors.request',
74 'django.contrib.auth.context_processors.auth',
74 'django.contrib.auth.context_processors.auth',
75 'django.contrib.messages.context_processors.messages',
75 'django.contrib.messages.context_processors.messages',
76 'apps.main.processors.radarsys_globals',
76 'apps.main.processors.radarsys_globals',
77 ],
77 ],
78 },
78 },
79 },
79 },
80 ]
80 ]
81
81
82 WSGI_APPLICATION = 'radarsys.wsgi.application'
82 WSGI_APPLICATION = 'radarsys.wsgi.application'
83
83
84
84
85 # Database
85 # Database
86 # https://docs.djangoproject.com/en/1.8/ref/settings/#databases
86 # https://docs.djangoproject.com/en/1.8/ref/settings/#databases
87
87
88 DATABASES = {
88 DATABASES = {
89 'default': {
89 'default': {
90 'ENGINE': 'django.db.backends.sqlite3',
90 'ENGINE': 'django.db.backends.sqlite3',
91 'NAME': 'radarsys.sqlite',
91 'NAME': 'radarsys.sqlite',
92 }
92 }
93 # 'default': {
93 # 'default': {
94 # 'ENGINE': 'django.db.backends.postgresql_psycopg2',
94 # 'ENGINE': 'django.db.backends.postgresql_psycopg2',
95 # 'NAME': os.environ.get('DB_NAME', 'radarsys'),
95 # 'NAME': os.environ.get('DB_NAME', 'radarsys'),
96 # 'USER': os.environ.get('DB_USER', 'docker'),
96 # 'USER': os.environ.get('DB_USER', 'docker'),
97 # 'PASSWORD': os.environ.get('DB_PASSWORD', 'docker'),
97 # 'PASSWORD': os.environ.get('DB_PASSWORD', 'docker'),
98 # 'HOST': os.environ.get('POSTGRES_PORT_5432_TCP_ADDR', 'localhost'),
98 # 'HOST': os.environ.get('POSTGRES_PORT_5432_TCP_ADDR', 'localhost'),
99 # 'PORT': os.environ.get('POSTGRES_PORT_5432_TCP_PORT', '5400'),
99 # 'PORT': os.environ.get('POSTGRES_PORT_5432_TCP_PORT', '5400'),
100 #}
100 #}
101 }
101 }
102
102
103 # Internationalization
103 # Internationalization
104 # https://docs.djangoproject.com/en/1.8/topics/i18n/
104 # https://docs.djangoproject.com/en/1.8/topics/i18n/
105
105
106 LANGUAGE_CODE = 'en-us'
106 LANGUAGE_CODE = 'en-us'
107
107
108 USE_TZ = False #True
108 USE_TZ = False #True
109
109
110 TIME_ZONE = os.environ.get('TZ', 'America/Lima')
110 TIME_ZONE = os.environ.get('TZ', 'America/Lima')
111
111
112 USE_I18N = True
112 USE_I18N = True
113
113
114 USE_L10N = True
114 USE_L10N = True
115
115
116 # Static files (CSS, JavaScript, Images)
116 # Static files (CSS, JavaScript, Images)
117 # https://docs.djangoproject.com/en/1.8/howto/static-files/
117 # https://docs.djangoproject.com/en/1.8/howto/static-files/
118
118
119 MEDIA_URL = '/media/'
119 MEDIA_URL = '/media/'
120 MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
120 MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
121
121
122 STATIC_URL = '/static/'
122 STATIC_URL = '/static/'
123 STATIC_ROOT = os.path.join(BASE_DIR, 'static')
123 STATIC_ROOT = os.path.join(BASE_DIR, 'static')
124
124
125 STATICFILES_FINDERS = (
125 STATICFILES_FINDERS = (
126 'django.contrib.staticfiles.finders.FileSystemFinder',
126 'django.contrib.staticfiles.finders.FileSystemFinder',
127 'django.contrib.staticfiles.finders.AppDirectoriesFinder',
127 'django.contrib.staticfiles.finders.AppDirectoriesFinder',
128 )
128 )
129
129
130 # Celery stuff
130 # Celery stuff
131
131
132 REDIS_HOST = os.environ.get('REDIS_HOST', 'localhost')
132 REDIS_HOST = os.environ.get('REDIS_HOST', 'localhost')
133 #REDIS_HOST = os.environ.get('REDIS_HOST', '127.0.0.1')
133 #REDIS_HOST = os.environ.get('REDIS_HOST', '127.0.0.1')
134 REDIS_PORT = os.environ.get('REDIS_PORT', 6379)
134 REDIS_PORT = os.environ.get('REDIS_PORT', 6379)
135
135
136 BROKER_TRANSPORT = 'redis'
136 BROKER_TRANSPORT = 'redis'
137 #BROKER_URL = 'redis://{}:{}/0'.format(REDIS_HOST, REDIS_PORT)
137 #BROKER_URL = 'redis://{}:{}/0'.format(REDIS_HOST, REDIS_PORT)
138 BROKER_URL = 'redis://{}:{}'.format(REDIS_HOST, REDIS_PORT)
138 BROKER_URL = 'redis://{}:{}'.format(REDIS_HOST, REDIS_PORT)
139
139
140 CELERY_RESULT_BACKEND = 'redis://{}:{}/0'.format(REDIS_HOST, REDIS_PORT)
140 CELERY_RESULT_BACKEND = 'redis://{}:{}/0'.format(REDIS_HOST, REDIS_PORT)
141 CELERY_BROKER_TRANSPORT = BROKER_URL
141 CELERY_BROKER_TRANSPORT = BROKER_URL
142 CELERY_ACCEPT_CONTENT = ['application/json']
142 CELERY_ACCEPT_CONTENT = ['application/json']
143 CELERY_TASK_SERIALIZER = 'json'
143 CELERY_TASK_SERIALIZER = 'json'
144 CELERY_RESULT_SERIALIZER = 'json'
144 CELERY_RESULT_SERIALIZER = 'json'
145 CELERY_ENABLE_UTC = False
145 CELERY_ENABLE_UTC = False
146 CELERY_TIMEZONE = 'America/Lima'
146 CELERY_TIMEZONE = 'America/Lima'
147
147
148 import django
148 import django
149 from django.utils.encoding import force_str
149 from django.utils.encoding import force_str
150 django.utils.encoding.force_text = force_str
150 django.utils.encoding.force_text = force_str
1 NO CONTENT: file was removed
NO CONTENT: file was removed
General Comments 0
You need to be logged in to leave comments. Login now