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