##// END OF EJS Templates
Import Campaign: dict_to_parms(self, parms, CONF_MODELS)(models.py), campaign_import (views.py)...
Fiorella Quino -
r109:9087e8309131
parent child
Show More
@@ -1,541 +1,564
1 from django.shortcuts import render, redirect, get_object_or_404, HttpResponse
1 from django.shortcuts import render, redirect, get_object_or_404, HttpResponse
2 from datetime import datetime
2 from datetime import datetime
3
3
4 from django.db import models
4 from django.db import models
5 from polymorphic import PolymorphicModel
5 from polymorphic import PolymorphicModel
6
6
7 from django.core.urlresolvers import reverse
7 from django.core.urlresolvers import reverse
8
8
9
9
10 CONF_STATES = (
10 CONF_STATES = (
11 (0, 'Disconnected'),
11 (0, 'Disconnected'),
12 (1, 'Connected'),
12 (1, 'Connected'),
13 (2, 'Running'),
13 (2, 'Running'),
14 )
14 )
15
15
16 EXP_STATES = (
16 EXP_STATES = (
17 (0,'Error'), #RED
17 (0,'Error'), #RED
18 (1,'Configurated'), #BLUE
18 (1,'Configurated'), #BLUE
19 (2,'Running'), #GREEN
19 (2,'Running'), #GREEN
20 (3,'Waiting'), #YELLOW
20 (3,'Waiting'), #YELLOW
21 (4,'Not Configured'), #WHITE
21 (4,'Not Configured'), #WHITE
22 )
22 )
23
23
24 CONF_TYPES = (
24 CONF_TYPES = (
25 (0, 'Active'),
25 (0, 'Active'),
26 (1, 'Historical'),
26 (1, 'Historical'),
27 )
27 )
28
28
29 DEV_STATES = (
29 DEV_STATES = (
30 (0, 'No connected'),
30 (0, 'No connected'),
31 (1, 'Connected'),
31 (1, 'Connected'),
32 (2, 'Configured'),
32 (2, 'Configured'),
33 (3, 'Running'),
33 (3, 'Running'),
34 )
34 )
35
35
36 DEV_TYPES = (
36 DEV_TYPES = (
37 ('', 'Select a device type'),
37 ('', 'Select a device type'),
38 ('rc', 'Radar Controller'),
38 ('rc', 'Radar Controller'),
39 ('rc_mix', 'Radar Controller (Mix)'),
39 ('rc_mix', 'Radar Controller (Mix)'),
40 ('dds', 'Direct Digital Synthesizer'),
40 ('dds', 'Direct Digital Synthesizer'),
41 ('jars', 'Jicamarca Radar Acquisition System'),
41 ('jars', 'Jicamarca Radar Acquisition System'),
42 ('usrp', 'Universal Software Radio Peripheral'),
42 ('usrp', 'Universal Software Radio Peripheral'),
43 ('cgs', 'Clock Generator System'),
43 ('cgs', 'Clock Generator System'),
44 ('abs', 'Automatic Beam Switching'),
44 ('abs', 'Automatic Beam Switching'),
45 )
45 )
46
46
47 DEV_PORTS = {
47 DEV_PORTS = {
48 'rc' : 2000,
48 'rc' : 2000,
49 'rc_mix': 2000,
49 'rc_mix': 2000,
50 'dds' : 2000,
50 'dds' : 2000,
51 'jars' : 2000,
51 'jars' : 2000,
52 'usrp' : 2000,
52 'usrp' : 2000,
53 'cgs' : 8080,
53 'cgs' : 8080,
54 'abs' : 8080
54 'abs' : 8080
55 }
55 }
56
56
57 RADAR_STATES = (
57 RADAR_STATES = (
58 (0, 'No connected'),
58 (0, 'No connected'),
59 (1, 'Connected'),
59 (1, 'Connected'),
60 (2, 'Configured'),
60 (2, 'Configured'),
61 (3, 'Running'),
61 (3, 'Running'),
62 (4, 'Scheduled'),
62 (4, 'Scheduled'),
63 )
63 )
64 # Create your models here.
64 # Create your models here.
65
65
66 class Location(models.Model):
66 class Location(models.Model):
67
67
68 name = models.CharField(max_length = 30)
68 name = models.CharField(max_length = 30)
69 description = models.TextField(blank=True, null=True)
69 description = models.TextField(blank=True, null=True)
70
70
71 class Meta:
71 class Meta:
72 db_table = 'db_location'
72 db_table = 'db_location'
73
73
74 def __unicode__(self):
74 def __unicode__(self):
75 return u'%s' % self.name
75 return u'%s' % self.name
76
76
77 def get_absolute_url(self):
77 def get_absolute_url(self):
78 return reverse('url_device', args=[str(self.id)])
78 return reverse('url_device', args=[str(self.id)])
79
79
80
80
81 class DeviceType(models.Model):
81 class DeviceType(models.Model):
82
82
83 name = models.CharField(max_length = 10, choices = DEV_TYPES, default = 'rc')
83 name = models.CharField(max_length = 10, choices = DEV_TYPES, default = 'rc')
84 description = models.TextField(blank=True, null=True)
84 description = models.TextField(blank=True, null=True)
85
85
86 class Meta:
86 class Meta:
87 db_table = 'db_device_types'
87 db_table = 'db_device_types'
88
88
89 def __unicode__(self):
89 def __unicode__(self):
90 return u'%s' % self.get_name_display()
90 return u'%s' % self.get_name_display()
91
91
92 class Device(models.Model):
92 class Device(models.Model):
93
93
94 device_type = models.ForeignKey(DeviceType, on_delete=models.CASCADE)
94 device_type = models.ForeignKey(DeviceType, on_delete=models.CASCADE)
95 location = models.ForeignKey(Location, on_delete=models.CASCADE)
95 location = models.ForeignKey(Location, on_delete=models.CASCADE)
96
96
97 name = models.CharField(max_length=40, default='')
97 name = models.CharField(max_length=40, default='')
98 ip_address = models.GenericIPAddressField(protocol='IPv4', default='0.0.0.0')
98 ip_address = models.GenericIPAddressField(protocol='IPv4', default='0.0.0.0')
99 port_address = models.PositiveSmallIntegerField(default=2000)
99 port_address = models.PositiveSmallIntegerField(default=2000)
100 description = models.TextField(blank=True, null=True)
100 description = models.TextField(blank=True, null=True)
101 status = models.PositiveSmallIntegerField(default=0, choices=DEV_STATES)
101 status = models.PositiveSmallIntegerField(default=0, choices=DEV_STATES)
102
102
103 class Meta:
103 class Meta:
104 db_table = 'db_devices'
104 db_table = 'db_devices'
105
105
106 def __unicode__(self):
106 def __unicode__(self):
107 return u'%s | %s' % (self.name, self.ip_address)
107 return u'%s | %s' % (self.name, self.ip_address)
108
108
109 def get_status(self):
109 def get_status(self):
110 return self.status
110 return self.status
111
111
112 def get_absolute_url(self):
112 def get_absolute_url(self):
113 return reverse('url_device', args=[str(self.id)])
113 return reverse('url_device', args=[str(self.id)])
114
114
115
115
116 class Campaign(models.Model):
116 class Campaign(models.Model):
117
117
118 template = models.BooleanField(default=False)
118 template = models.BooleanField(default=False)
119 name = models.CharField(max_length=60, unique=True)
119 name = models.CharField(max_length=60, unique=True)
120 start_date = models.DateTimeField(blank=True, null=True)
120 start_date = models.DateTimeField(blank=True, null=True)
121 end_date = models.DateTimeField(blank=True, null=True)
121 end_date = models.DateTimeField(blank=True, null=True)
122 tags = models.CharField(max_length=40)
122 tags = models.CharField(max_length=40)
123 description = models.TextField(blank=True, null=True)
123 description = models.TextField(blank=True, null=True)
124 experiments = models.ManyToManyField('Experiment', blank=True)
124 experiments = models.ManyToManyField('Experiment', blank=True)
125
125
126 class Meta:
126 class Meta:
127 db_table = 'db_campaigns'
127 db_table = 'db_campaigns'
128 ordering = ('name',)
128 ordering = ('name',)
129
129
130 def __unicode__(self):
130 def __unicode__(self):
131 return u'%s' % (self.name)
131 return u'%s' % (self.name)
132
132
133 def get_absolute_url(self):
133 def get_absolute_url(self):
134 return reverse('url_campaign', args=[str(self.id)])
134 return reverse('url_campaign', args=[str(self.id)])
135
135
136 def parms_to_dict(self):
136 def parms_to_dict(self):
137
137
138 import json
138 import json
139
139
140 parameters = {}
140 parameters = {}
141 exp_parameters = {}
141 exp_parameters = {}
142 experiments = Experiment.objects.filter(campaign = self)
142 experiments = Experiment.objects.filter(campaign = self)
143
143
144 i=1
144 i=1
145 for experiment in experiments:
145 for experiment in experiments:
146 exp_parameters['experiment-'+str(i)] = json.loads(experiment.parms_to_dict())
146 exp_parameters['experiment-'+str(i)] = json.loads(experiment.parms_to_dict())
147 i += 1
147 i += 1
148
148
149
149
150 parameters['experiments'] = exp_parameters
150 parameters['experiments'] = exp_parameters
151 parameters['end_date'] = self.end_date.strftime("%Y-%m-%d")
151 parameters['end_date'] = self.end_date.strftime("%Y-%m-%d")
152 parameters['start_date'] = self.start_date.strftime("%Y-%m-%d")
152 parameters['start_date'] = self.start_date.strftime("%Y-%m-%d")
153 parameters['campaign'] = self.__unicode__()
153 parameters['campaign'] = self.__unicode__()
154 parameters['tags'] =self.tags
154 parameters['tags'] =self.tags
155
155
156 parameters = json.dumps(parameters, indent=2, sort_keys=False)
156 parameters = json.dumps(parameters, indent=2, sort_keys=False)
157
157
158 return parameters
158 return parameters
159
159
160 def import_from_file(self, fp):
160 def import_from_file(self, fp):
161
161
162 import os, json
162 import os, json
163
163
164 parms = {}
164 parms = {}
165
165
166 path, ext = os.path.splitext(fp.name)
166 path, ext = os.path.splitext(fp.name)
167
167
168 if ext == '.json':
168 if ext == '.json':
169 parms = json.load(fp)
169 parms = json.load(fp)
170
170
171 return parms
171 return parms
172
172
173 def dict_to_parms(self, parms, CONF_MODELS):
174
175 experiments = Experiment.objects.filter(campaign = self)
176 configurations = Configuration.objects.filter(experiment = experiments)
177
178 if configurations:
179 for configuration in configurations:
180 configuration.delete()
181
182 if experiments:
183 for experiment in experiments:
184 experiment.delete()
185
186 for parms_exp in parms['experiments']:
187 location = Location.objects.get(name = parms['experiments'][parms_exp]['radar'])
188 new_exp = Experiment(
189 name = parms['experiments'][parms_exp]['experiment'],
190 location = location,
191 start_time = parms['experiments'][parms_exp]['start_time'],
192 end_time = parms['experiments'][parms_exp]['end_time'],
193 )
194 new_exp.save()
195 new_exp.dict_to_parms(parms['experiments'][parms_exp],CONF_MODELS)
196 new_exp.save()
197
198 self.experiments.add(new_exp)
199 self.save()
200
173 def get_absolute_url(self):
201 def get_absolute_url(self):
174 return reverse('url_campaign', args=[str(self.id)])
202 return reverse('url_campaign', args=[str(self.id)])
175
203
176 def get_absolute_url_edit(self):
204 def get_absolute_url_edit(self):
177 return reverse('url_edit_campaign', args=[str(self.id)])
205 return reverse('url_edit_campaign', args=[str(self.id)])
178
206
179 def get_absolute_url_export(self):
207 def get_absolute_url_export(self):
180 return reverse('url_export_campaign', args=[str(self.id)])
208 return reverse('url_export_campaign', args=[str(self.id)])
181
209
182 def get_absolute_url_import(self):
210 def get_absolute_url_import(self):
183 return reverse('url_import_campaign', args=[str(self.id)])
211 return reverse('url_import_campaign', args=[str(self.id)])
184
212
185
213
186
214
187 class RunningExperiment(models.Model):
215 class RunningExperiment(models.Model):
188 radar = models.OneToOneField('Location', on_delete=models.CASCADE)
216 radar = models.OneToOneField('Location', on_delete=models.CASCADE)
189 running_experiment = models.ManyToManyField('Experiment', blank = True)
217 running_experiment = models.ManyToManyField('Experiment', blank = True)
190 status = models.PositiveSmallIntegerField(default=0, choices=RADAR_STATES)
218 status = models.PositiveSmallIntegerField(default=0, choices=RADAR_STATES)
191
219
192
220
193 class Experiment(models.Model):
221 class Experiment(models.Model):
194
222
195 template = models.BooleanField(default=False)
223 template = models.BooleanField(default=False)
196 name = models.CharField(max_length=40, default='', unique=True)
224 name = models.CharField(max_length=40, default='', unique=True)
197 location = models.ForeignKey('Location', null=True, blank=True, on_delete=models.CASCADE)
225 location = models.ForeignKey('Location', null=True, blank=True, on_delete=models.CASCADE)
198 start_time = models.TimeField(default='00:00:00')
226 start_time = models.TimeField(default='00:00:00')
199 end_time = models.TimeField(default='23:59:59')
227 end_time = models.TimeField(default='23:59:59')
200 status = models.PositiveSmallIntegerField(default=0, choices=EXP_STATES)
228 status = models.PositiveSmallIntegerField(default=0, choices=EXP_STATES)
201
229
202 class Meta:
230 class Meta:
203 db_table = 'db_experiments'
231 db_table = 'db_experiments'
204 ordering = ('template', 'name')
232 ordering = ('template', 'name')
205
233
206 def __unicode__(self):
234 def __unicode__(self):
207 if self.template:
235 if self.template:
208 return u'%s (template)' % (self.name)
236 return u'%s (template)' % (self.name)
209 else:
237 else:
210 return u'%s' % (self.name)
238 return u'%s' % (self.name)
211
239
212 @property
240 @property
213 def radar(self):
241 def radar(self):
214 return self.location
242 return self.location
215
243
216 def clone(self, **kwargs):
244 def clone(self, **kwargs):
217
245
218 confs = Configuration.objects.filter(experiment=self, type=0)
246 confs = Configuration.objects.filter(experiment=self, type=0)
219 self.pk = None
247 self.pk = None
220 self.name = '{} [{:%Y/%m/%d}]'.format(self.name, datetime.now())
248 self.name = '{} [{:%Y/%m/%d}]'.format(self.name, datetime.now())
221 for attr, value in kwargs.items():
249 for attr, value in kwargs.items():
222 setattr(self, attr, value)
250 setattr(self, attr, value)
223
251
224 self.save()
252 self.save()
225
253
226 for conf in confs:
254 for conf in confs:
227 conf.clone(experiment=self, template=False)
255 conf.clone(experiment=self, template=False)
228
256
229 return self
257 return self
230
258
231 def get_status(self):
259 def get_status(self):
232 configurations = Configuration.objects.filter(experiment=self)
260 configurations = Configuration.objects.filter(experiment=self)
233 exp_status=[]
261 exp_status=[]
234 for conf in configurations:
262 for conf in configurations:
235 print conf.status_device()
263 print conf.status_device()
236 exp_status.append(conf.status_device())
264 exp_status.append(conf.status_device())
237
265
238 if not exp_status: #No Configuration
266 if not exp_status: #No Configuration
239 self.status = 4
267 self.status = 4
240 self.save()
268 self.save()
241 return
269 return
242
270
243 total = 1
271 total = 1
244 for e_s in exp_status:
272 for e_s in exp_status:
245 total = total*e_s
273 total = total*e_s
246
274
247 if total == 0: #Error
275 if total == 0: #Error
248 status = 0
276 status = 0
249 elif total == (3**len(exp_status)): #Running
277 elif total == (3**len(exp_status)): #Running
250 status = 2
278 status = 2
251 else:
279 else:
252 status = 1 #Configurated
280 status = 1 #Configurated
253
281
254 self.status = status
282 self.status = status
255 self.save()
283 self.save()
256
284
257 def status_color(self):
285 def status_color(self):
258 color = 'danger'
286 color = 'danger'
259 if self.status == 0:
287 if self.status == 0:
260 color = "danger"
288 color = "danger"
261 elif self.status == 1:
289 elif self.status == 1:
262 color = "info"
290 color = "info"
263 elif self.status == 2:
291 elif self.status == 2:
264 color = "success"
292 color = "success"
265 elif self.status == 3:
293 elif self.status == 3:
266 color = "warning"
294 color = "warning"
267 else:
295 else:
268 color = "muted"
296 color = "muted"
269
297
270 return color
298 return color
271
299
272 def get_absolute_url(self):
300 def get_absolute_url(self):
273 return reverse('url_experiment', args=[str(self.id)])
301 return reverse('url_experiment', args=[str(self.id)])
274
302
275 def parms_to_dict(self):
303 def parms_to_dict(self):
276
304
277 import json
305 import json
278
306
279 configurations = Configuration.objects.filter(experiment=self)
307 configurations = Configuration.objects.filter(experiment=self)
280 conf_parameters = {}
308 conf_parameters = {}
281 parameters={}
309 parameters={}
282
310
283 for configuration in configurations:
311 for configuration in configurations:
284 if 'cgs' in configuration.device.device_type.name:
312 if 'cgs' in configuration.device.device_type.name:
285 conf_parameters['cgs'] = configuration.parms_to_dict()
313 conf_parameters['cgs'] = configuration.parms_to_dict()
286 if 'dds' in configuration.device.device_type.name:
314 if 'dds' in configuration.device.device_type.name:
287 conf_parameters['dds'] = configuration.parms_to_dict()
315 conf_parameters['dds'] = configuration.parms_to_dict()
288 if 'rc' in configuration.device.device_type.name:
316 if 'rc' in configuration.device.device_type.name:
289 conf_parameters['rc'] = configuration.parms_to_dict()
317 conf_parameters['rc'] = configuration.parms_to_dict()
290 if 'jars' in configuration.device.device_type.name:
318 if 'jars' in configuration.device.device_type.name:
291 conf_parameters['jars'] = configuration.parms_to_dict()
319 conf_parameters['jars'] = configuration.parms_to_dict()
292 if 'usrp' in configuration.device.device_type.name:
320 if 'usrp' in configuration.device.device_type.name:
293 conf_parameters['usrp'] = configuration.parms_to_dict()
321 conf_parameters['usrp'] = configuration.parms_to_dict()
294 if 'abs' in configuration.device.device_type.name:
322 if 'abs' in configuration.device.device_type.name:
295 conf_parameters['abs'] = configuration.parms_to_dict()
323 conf_parameters['abs'] = configuration.parms_to_dict()
296
324
297 parameters['configurations'] = conf_parameters
325 parameters['configurations'] = conf_parameters
298 parameters['end_time'] = self.end_time.strftime("%H:%M:%S")
326 parameters['end_time'] = self.end_time.strftime("%H:%M:%S")
299 parameters['start_time'] = self.start_time.strftime("%H:%M:%S")
327 parameters['start_time'] = self.start_time.strftime("%H:%M:%S")
300 parameters['radar'] = self.radar.name
328 parameters['radar'] = self.radar.name
301 parameters['experiment'] = self.name
329 parameters['experiment'] = self.name
302 parameters = json.dumps(parameters, indent=2)
330 parameters = json.dumps(parameters, indent=2)
303
331
304 return parameters
332 return parameters
305
333
306 def import_from_file(self, fp):
334 def import_from_file(self, fp):
307
335
308 import os, json
336 import os, json
309
337
310 parms = {}
338 parms = {}
311
339
312 path, ext = os.path.splitext(fp.name)
340 path, ext = os.path.splitext(fp.name)
313
341
314 if ext == '.json':
342 if ext == '.json':
315 parms = json.load(fp)
343 parms = json.load(fp)
316
344
317 return parms
345 return parms
318
346
319 def dict_to_parms(self, parms, CONF_MODELS):
347 def dict_to_parms(self, parms, CONF_MODELS):
320
348
321 #self.name = parameters['experiment']
322 #self.location = parameters['radar']
323 #self.start_time = parameters['start_time']
324 #self.end_time = parameters['end_time']
325
326 configurations = Configuration.objects.filter(experiment=self)
349 configurations = Configuration.objects.filter(experiment=self)
327
350
328 if configurations:
351 if configurations:
329 for configuration in configurations:
352 for configuration in configurations:
330 configuration.delete()
353 configuration.delete()
331
354
332 for conf_type in parms['configurations']:
355 for conf_type in parms['configurations']:
333 #--For ABS Device:
356 #--For ABS Device:
334 #--For USRP Device:
357 #--For USRP Device:
335 #--For JARS Device:
358 #--For JARS Device:
336 #--For RC Device:
359 #--For RC Device:
337 if conf_type == 'rc':
360 if conf_type == 'rc':
338 device = get_object_or_404(Device, pk=parms['configurations']['rc']['device_id'])
361 device = get_object_or_404(Device, pk=parms['configurations']['rc']['device_id'])
339 DevConfModel = CONF_MODELS[conf_type]
362 DevConfModel = CONF_MODELS[conf_type]
340 confrc_form = DevConfModel(
363 confrc_form = DevConfModel(
341 experiment = self,
364 experiment = self,
342 name = 'RC',
365 name = 'RC',
343 device=device,
366 device=device,
344 )
367 )
345 confrc_form.dict_to_parms(parms['configurations']['rc'])
368 confrc_form.dict_to_parms(parms['configurations']['rc'])
346 confrc_form.save()
369 confrc_form.save()
347 #--For DDS Device:
370 #--For DDS Device:
348 if conf_type == 'dds':
371 if conf_type == 'dds':
349 device = get_object_or_404(Device, pk=parms['configurations']['dds']['device_id'])
372 device = get_object_or_404(Device, pk=parms['configurations']['dds']['device_id'])
350 DevConfModel = CONF_MODELS[conf_type]
373 DevConfModel = CONF_MODELS[conf_type]
351 confdds_form = DevConfModel(
374 confdds_form = DevConfModel(
352 experiment = self,
375 experiment = self,
353 name = 'DDS',
376 name = 'DDS',
354 device=device,
377 device=device,
355 )
378 )
356 confdds_form.dict_to_parms(parms['configurations']['dds'])
379 confdds_form.dict_to_parms(parms['configurations']['dds'])
357 confdds_form.save()
380 confdds_form.save()
358 #--For CGS Device:
381 #--For CGS Device:
359 if conf_type == 'cgs':
382 if conf_type == 'cgs':
360 device = get_object_or_404(Device, pk=parms['configurations']['cgs']['device_id'])
383 device = get_object_or_404(Device, pk=parms['configurations']['cgs']['device_id'])
361 DevConfModel = CONF_MODELS[conf_type]
384 DevConfModel = CONF_MODELS[conf_type]
362 confcgs_form = DevConfModel(
385 confcgs_form = DevConfModel(
363 experiment = self,
386 experiment = self,
364 name = 'CGS',
387 name = 'CGS',
365 device=device,
388 device=device,
366 )
389 )
367 confcgs_form.dict_to_parms(parms['configurations']['cgs'])
390 confcgs_form.dict_to_parms(parms['configurations']['cgs'])
368 confcgs_form.save()
391 confcgs_form.save()
369
392
370 def get_absolute_url_edit(self):
393 def get_absolute_url_edit(self):
371 return reverse('url_edit_experiment', args=[str(self.id)])
394 return reverse('url_edit_experiment', args=[str(self.id)])
372
395
373 def get_absolute_url_import(self):
396 def get_absolute_url_import(self):
374 return reverse('url_import_experiment', args=[str(self.id)])
397 return reverse('url_import_experiment', args=[str(self.id)])
375
398
376 def get_absolute_url_export(self):
399 def get_absolute_url_export(self):
377 return reverse('url_export_experiment', args=[str(self.id)])
400 return reverse('url_export_experiment', args=[str(self.id)])
378
401
379
402
380 class Configuration(PolymorphicModel):
403 class Configuration(PolymorphicModel):
381
404
382 template = models.BooleanField(default=False)
405 template = models.BooleanField(default=False)
383
406
384 name = models.CharField(verbose_name="Configuration Name", max_length=40, default='')
407 name = models.CharField(verbose_name="Configuration Name", max_length=40, default='')
385
408
386 experiment = models.ForeignKey('Experiment', null=True, blank=True, on_delete=models.CASCADE)
409 experiment = models.ForeignKey('Experiment', null=True, blank=True, on_delete=models.CASCADE)
387 device = models.ForeignKey(Device, null=True, on_delete=models.CASCADE)
410 device = models.ForeignKey(Device, null=True, on_delete=models.CASCADE)
388
411
389 type = models.PositiveSmallIntegerField(default=0, choices=CONF_TYPES)
412 type = models.PositiveSmallIntegerField(default=0, choices=CONF_TYPES)
390
413
391 created_date = models.DateTimeField(auto_now_add=True)
414 created_date = models.DateTimeField(auto_now_add=True)
392 programmed_date = models.DateTimeField(auto_now=True)
415 programmed_date = models.DateTimeField(auto_now=True)
393
416
394 parameters = models.TextField(default='{}')
417 parameters = models.TextField(default='{}')
395
418
396 message = ""
419 message = ""
397
420
398 class Meta:
421 class Meta:
399 db_table = 'db_configurations'
422 db_table = 'db_configurations'
400
423
401 def __unicode__(self):
424 def __unicode__(self):
402
425
403 return u'[%s]: %s' % (self.device.name, self.name)
426 return u'[%s]: %s' % (self.device.name, self.name)
404
427
405 def clone(self, **kwargs):
428 def clone(self, **kwargs):
406
429
407 self.pk = None
430 self.pk = None
408 self.id = None
431 self.id = None
409 for attr, value in kwargs.items():
432 for attr, value in kwargs.items():
410 setattr(self, attr, value)
433 setattr(self, attr, value)
411
434
412 self.save()
435 self.save()
413
436
414 return self
437 return self
415
438
416 def parms_to_dict(self):
439 def parms_to_dict(self):
417
440
418 parameters = {}
441 parameters = {}
419
442
420 for key in self.__dict__.keys():
443 for key in self.__dict__.keys():
421 parameters[key] = getattr(self, key)
444 parameters[key] = getattr(self, key)
422
445
423 return parameters
446 return parameters
424
447
425 def parms_to_text(self):
448 def parms_to_text(self):
426
449
427 raise NotImplementedError, "This method should be implemented in %s Configuration model" %str(self.device.device_type.name).upper()
450 raise NotImplementedError, "This method should be implemented in %s Configuration model" %str(self.device.device_type.name).upper()
428
451
429 return ''
452 return ''
430
453
431 def parms_to_binary(self):
454 def parms_to_binary(self):
432
455
433 raise NotImplementedError, "This method should be implemented in %s Configuration model" %str(self.device.device_type.name).upper()
456 raise NotImplementedError, "This method should be implemented in %s Configuration model" %str(self.device.device_type.name).upper()
434
457
435 return ''
458 return ''
436
459
437 def dict_to_parms(self, parameters):
460 def dict_to_parms(self, parameters):
438
461
439 if type(parameters) != type({}):
462 if type(parameters) != type({}):
440 return
463 return
441
464
442 for key in parameters.keys():
465 for key in parameters.keys():
443 setattr(self, key, parameters[key])
466 setattr(self, key, parameters[key])
444
467
445 def export_to_file(self, format="json"):
468 def export_to_file(self, format="json"):
446
469
447 import json
470 import json
448
471
449 content_type = ''
472 content_type = ''
450
473
451 if format == 'text':
474 if format == 'text':
452 content_type = 'text/plain'
475 content_type = 'text/plain'
453 filename = '%s_%s.%s' %(self.device.device_type.name, self.name, self.device.device_type.name)
476 filename = '%s_%s.%s' %(self.device.device_type.name, self.name, self.device.device_type.name)
454 content = self.parms_to_text()
477 content = self.parms_to_text()
455
478
456 if format == 'binary':
479 if format == 'binary':
457 content_type = 'application/octet-stream'
480 content_type = 'application/octet-stream'
458 filename = '%s_%s.bin' %(self.device.device_type.name, self.name)
481 filename = '%s_%s.bin' %(self.device.device_type.name, self.name)
459 content = self.parms_to_binary()
482 content = self.parms_to_binary()
460
483
461 if not content_type:
484 if not content_type:
462 content_type = 'application/json'
485 content_type = 'application/json'
463 filename = '%s_%s.json' %(self.device.device_type.name, self.name)
486 filename = '%s_%s.json' %(self.device.device_type.name, self.name)
464 content = json.dumps(self.parms_to_dict(), indent=2)
487 content = json.dumps(self.parms_to_dict(), indent=2)
465
488
466 fields = {'content_type':content_type,
489 fields = {'content_type':content_type,
467 'filename':filename,
490 'filename':filename,
468 'content':content
491 'content':content
469 }
492 }
470
493
471 return fields
494 return fields
472
495
473 def import_from_file(self, fp):
496 def import_from_file(self, fp):
474
497
475 import os, json
498 import os, json
476
499
477 parms = {}
500 parms = {}
478
501
479 path, ext = os.path.splitext(fp.name)
502 path, ext = os.path.splitext(fp.name)
480
503
481 if ext == '.json':
504 if ext == '.json':
482 parms = json.load(fp)
505 parms = json.load(fp)
483
506
484 return parms
507 return parms
485
508
486 def status_device(self):
509 def status_device(self):
487
510
488 raise NotImplementedError, "This method should be implemented in %s Configuration model" %str(self.device.device_type.name).upper()
511 raise NotImplementedError, "This method should be implemented in %s Configuration model" %str(self.device.device_type.name).upper()
489
512
490 return None
513 return None
491
514
492 def stop_device(self):
515 def stop_device(self):
493
516
494 raise NotImplementedError, "This method should be implemented in %s Configuration model" %str(self.device.device_type.name).upper()
517 raise NotImplementedError, "This method should be implemented in %s Configuration model" %str(self.device.device_type.name).upper()
495
518
496 return None
519 return None
497
520
498 def start_device(self):
521 def start_device(self):
499
522
500 raise NotImplementedError, "This method should be implemented in %s Configuration model" %str(self.device.device_type.name).upper()
523 raise NotImplementedError, "This method should be implemented in %s Configuration model" %str(self.device.device_type.name).upper()
501
524
502 return None
525 return None
503
526
504 def write_device(self, parms):
527 def write_device(self, parms):
505
528
506 raise NotImplementedError, "This method should be implemented in %s Configuration model" %str(self.device.device_type.name).upper()
529 raise NotImplementedError, "This method should be implemented in %s Configuration model" %str(self.device.device_type.name).upper()
507
530
508 return None
531 return None
509
532
510 def read_device(self):
533 def read_device(self):
511
534
512 raise NotImplementedError, "This method should be implemented in %s Configuration model" %str(self.device.device_type.name).upper()
535 raise NotImplementedError, "This method should be implemented in %s Configuration model" %str(self.device.device_type.name).upper()
513
536
514 return None
537 return None
515
538
516 def get_absolute_url(self):
539 def get_absolute_url(self):
517 return reverse('url_%s_conf' % self.device.device_type.name, args=[str(self.id)])
540 return reverse('url_%s_conf' % self.device.device_type.name, args=[str(self.id)])
518
541
519 def get_absolute_url_edit(self):
542 def get_absolute_url_edit(self):
520 return reverse('url_edit_%s_conf' % self.device.device_type.name, args=[str(self.id)])
543 return reverse('url_edit_%s_conf' % self.device.device_type.name, args=[str(self.id)])
521
544
522 def get_absolute_url_import(self):
545 def get_absolute_url_import(self):
523 return reverse('url_import_dev_conf', args=[str(self.id)])
546 return reverse('url_import_dev_conf', args=[str(self.id)])
524
547
525 def get_absolute_url_export(self):
548 def get_absolute_url_export(self):
526 return reverse('url_export_dev_conf', args=[str(self.id)])
549 return reverse('url_export_dev_conf', args=[str(self.id)])
527
550
528 def get_absolute_url_write(self):
551 def get_absolute_url_write(self):
529 return reverse('url_write_dev_conf', args=[str(self.id)])
552 return reverse('url_write_dev_conf', args=[str(self.id)])
530
553
531 def get_absolute_url_read(self):
554 def get_absolute_url_read(self):
532 return reverse('url_read_dev_conf', args=[str(self.id)])
555 return reverse('url_read_dev_conf', args=[str(self.id)])
533
556
534 def get_absolute_url_start(self):
557 def get_absolute_url_start(self):
535 return reverse('url_start_dev_conf', args=[str(self.id)])
558 return reverse('url_start_dev_conf', args=[str(self.id)])
536
559
537 def get_absolute_url_stop(self):
560 def get_absolute_url_stop(self):
538 return reverse('url_stop_dev_conf', args=[str(self.id)])
561 return reverse('url_stop_dev_conf', args=[str(self.id)])
539
562
540 def get_absolute_url_status(self):
563 def get_absolute_url_status(self):
541 return reverse('url_status_dev_conf', args=[str(self.id)]) No newline at end of file
564 return reverse('url_status_dev_conf', args=[str(self.id)])
@@ -1,1405 +1,1393
1 from django.shortcuts import render, redirect, get_object_or_404, HttpResponse
1 from django.shortcuts import render, redirect, get_object_or_404, HttpResponse
2 from django.utils.safestring import mark_safe
2 from django.utils.safestring import mark_safe
3 from django.http import HttpResponseRedirect
3 from django.http import HttpResponseRedirect
4 from django.core.urlresolvers import reverse
4 from django.core.urlresolvers import reverse
5 from django.contrib import messages
5 from django.contrib import messages
6 from datetime import datetime
6 from datetime import datetime
7
7
8 from .forms import CampaignForm, ExperimentForm, DeviceForm, ConfigurationForm, LocationForm, UploadFileForm, DownloadFileForm, OperationForm, NewForm
8 from .forms import CampaignForm, ExperimentForm, DeviceForm, ConfigurationForm, LocationForm, UploadFileForm, DownloadFileForm, OperationForm, NewForm
9 from .forms import OperationSearchForm
9 from .forms import OperationSearchForm
10 from apps.cgs.forms import CGSConfigurationForm
10 from apps.cgs.forms import CGSConfigurationForm
11 from apps.jars.forms import JARSConfigurationForm
11 from apps.jars.forms import JARSConfigurationForm
12 from apps.usrp.forms import USRPConfigurationForm
12 from apps.usrp.forms import USRPConfigurationForm
13 from apps.abs.forms import ABSConfigurationForm
13 from apps.abs.forms import ABSConfigurationForm
14 from apps.rc.forms import RCConfigurationForm, RCMixConfigurationForm
14 from apps.rc.forms import RCConfigurationForm, RCMixConfigurationForm
15 from apps.dds.forms import DDSConfigurationForm
15 from apps.dds.forms import DDSConfigurationForm
16
16
17 from .models import Campaign, Experiment, Device, Configuration, Location, RunningExperiment
17 from .models import Campaign, Experiment, Device, Configuration, Location, RunningExperiment
18 from apps.cgs.models import CGSConfiguration
18 from apps.cgs.models import CGSConfiguration
19 from apps.jars.models import JARSConfiguration
19 from apps.jars.models import JARSConfiguration
20 from apps.usrp.models import USRPConfiguration
20 from apps.usrp.models import USRPConfiguration
21 from apps.abs.models import ABSConfiguration
21 from apps.abs.models import ABSConfiguration
22 from apps.rc.models import RCConfiguration, RCLine, RCLineType
22 from apps.rc.models import RCConfiguration, RCLine, RCLineType
23 from apps.dds.models import DDSConfiguration
23 from apps.dds.models import DDSConfiguration
24
24
25 # Create your views here.
25 # Create your views here.
26
26
27 CONF_FORMS = {
27 CONF_FORMS = {
28 'rc': RCConfigurationForm,
28 'rc': RCConfigurationForm,
29 'rc_mix': RCMixConfigurationForm,
29 'rc_mix': RCMixConfigurationForm,
30 'dds': DDSConfigurationForm,
30 'dds': DDSConfigurationForm,
31 'jars': JARSConfigurationForm,
31 'jars': JARSConfigurationForm,
32 'cgs': CGSConfigurationForm,
32 'cgs': CGSConfigurationForm,
33 'abs': ABSConfigurationForm,
33 'abs': ABSConfigurationForm,
34 'usrp': USRPConfigurationForm,
34 'usrp': USRPConfigurationForm,
35 }
35 }
36
36
37 CONF_MODELS = {
37 CONF_MODELS = {
38 'rc': RCConfiguration,
38 'rc': RCConfiguration,
39 'dds': DDSConfiguration,
39 'dds': DDSConfiguration,
40 'jars': JARSConfiguration,
40 'jars': JARSConfiguration,
41 'cgs': CGSConfiguration,
41 'cgs': CGSConfiguration,
42 'abs': ABSConfiguration,
42 'abs': ABSConfiguration,
43 'usrp': USRPConfiguration,
43 'usrp': USRPConfiguration,
44 }
44 }
45
45
46 MIX_MODES = {
46 MIX_MODES = {
47 '0': 'OR',
47 '0': 'OR',
48 '1': 'XOR',
48 '1': 'XOR',
49 '2': 'AND',
49 '2': 'AND',
50 '3': 'NAND'
50 '3': 'NAND'
51 }
51 }
52
52
53
53
54 def index(request):
54 def index(request):
55 kwargs = {}
55 kwargs = {}
56
56
57 return render(request, 'index.html', kwargs)
57 return render(request, 'index.html', kwargs)
58
58
59
59
60 def locations(request):
60 def locations(request):
61
61
62 locations = Location.objects.all().order_by('name')
62 locations = Location.objects.all().order_by('name')
63
63
64 keys = ['id', 'name', 'description']
64 keys = ['id', 'name', 'description']
65
65
66 kwargs = {}
66 kwargs = {}
67 kwargs['location_keys'] = keys[1:]
67 kwargs['location_keys'] = keys[1:]
68 kwargs['locations'] = locations
68 kwargs['locations'] = locations
69 kwargs['title'] = 'Location'
69 kwargs['title'] = 'Location'
70 kwargs['suptitle'] = 'List'
70 kwargs['suptitle'] = 'List'
71 kwargs['button'] = 'New Location'
71 kwargs['button'] = 'New Location'
72
72
73 return render(request, 'locations.html', kwargs)
73 return render(request, 'locations.html', kwargs)
74
74
75
75
76 def location(request, id_loc):
76 def location(request, id_loc):
77
77
78 location = get_object_or_404(Location, pk=id_loc)
78 location = get_object_or_404(Location, pk=id_loc)
79
79
80 kwargs = {}
80 kwargs = {}
81 kwargs['location'] = location
81 kwargs['location'] = location
82 kwargs['location_keys'] = ['name', 'description']
82 kwargs['location_keys'] = ['name', 'description']
83
83
84 kwargs['title'] = 'Location'
84 kwargs['title'] = 'Location'
85 kwargs['suptitle'] = 'Details'
85 kwargs['suptitle'] = 'Details'
86
86
87 return render(request, 'location.html', kwargs)
87 return render(request, 'location.html', kwargs)
88
88
89
89
90 def location_new(request):
90 def location_new(request):
91
91
92 if request.method == 'GET':
92 if request.method == 'GET':
93 form = LocationForm()
93 form = LocationForm()
94
94
95 if request.method == 'POST':
95 if request.method == 'POST':
96 form = LocationForm(request.POST)
96 form = LocationForm(request.POST)
97
97
98 if form.is_valid():
98 if form.is_valid():
99 form.save()
99 form.save()
100 return redirect('url_locations')
100 return redirect('url_locations')
101
101
102 kwargs = {}
102 kwargs = {}
103 kwargs['form'] = form
103 kwargs['form'] = form
104 kwargs['title'] = 'Location'
104 kwargs['title'] = 'Location'
105 kwargs['suptitle'] = 'New'
105 kwargs['suptitle'] = 'New'
106 kwargs['button'] = 'Create'
106 kwargs['button'] = 'Create'
107
107
108 return render(request, 'location_edit.html', kwargs)
108 return render(request, 'location_edit.html', kwargs)
109
109
110
110
111 def location_edit(request, id_loc):
111 def location_edit(request, id_loc):
112
112
113 location = get_object_or_404(Location, pk=id_loc)
113 location = get_object_or_404(Location, pk=id_loc)
114
114
115 if request.method=='GET':
115 if request.method=='GET':
116 form = LocationForm(instance=location)
116 form = LocationForm(instance=location)
117
117
118 if request.method=='POST':
118 if request.method=='POST':
119 form = LocationForm(request.POST, instance=location)
119 form = LocationForm(request.POST, instance=location)
120
120
121 if form.is_valid():
121 if form.is_valid():
122 form.save()
122 form.save()
123 return redirect('url_locations')
123 return redirect('url_locations')
124
124
125 kwargs = {}
125 kwargs = {}
126 kwargs['form'] = form
126 kwargs['form'] = form
127 kwargs['title'] = 'Location'
127 kwargs['title'] = 'Location'
128 kwargs['suptitle'] = 'Edit'
128 kwargs['suptitle'] = 'Edit'
129 kwargs['button'] = 'Update'
129 kwargs['button'] = 'Update'
130
130
131 return render(request, 'location_edit.html', kwargs)
131 return render(request, 'location_edit.html', kwargs)
132
132
133
133
134 def location_delete(request, id_loc):
134 def location_delete(request, id_loc):
135
135
136 location = get_object_or_404(Location, pk=id_loc)
136 location = get_object_or_404(Location, pk=id_loc)
137
137
138 if request.method=='POST':
138 if request.method=='POST':
139
139
140 if request.user.is_staff:
140 if request.user.is_staff:
141 location.delete()
141 location.delete()
142 return redirect('url_locations')
142 return redirect('url_locations')
143
143
144 messages.error(request, 'Not enough permission to delete this object')
144 messages.error(request, 'Not enough permission to delete this object')
145 return redirect(location.get_absolute_url())
145 return redirect(location.get_absolute_url())
146
146
147 kwargs = {
147 kwargs = {
148 'title': 'Delete',
148 'title': 'Delete',
149 'suptitle': 'Location',
149 'suptitle': 'Location',
150 'object': location,
150 'object': location,
151 'previous': location.get_absolute_url(),
151 'previous': location.get_absolute_url(),
152 'delete': True
152 'delete': True
153 }
153 }
154
154
155 return render(request, 'confirm.html', kwargs)
155 return render(request, 'confirm.html', kwargs)
156
156
157
157
158 def devices(request):
158 def devices(request):
159
159
160 devices = Device.objects.all().order_by('device_type__name')
160 devices = Device.objects.all().order_by('device_type__name')
161
161
162 # keys = ['id', 'device_type__name', 'name', 'ip_address']
162 # keys = ['id', 'device_type__name', 'name', 'ip_address']
163 keys = ['id', 'name', 'ip_address', 'port_address', 'device_type']
163 keys = ['id', 'name', 'ip_address', 'port_address', 'device_type']
164
164
165 kwargs = {}
165 kwargs = {}
166 kwargs['device_keys'] = keys[1:]
166 kwargs['device_keys'] = keys[1:]
167 kwargs['devices'] = devices#.values(*keys)
167 kwargs['devices'] = devices#.values(*keys)
168 kwargs['title'] = 'Device'
168 kwargs['title'] = 'Device'
169 kwargs['suptitle'] = 'List'
169 kwargs['suptitle'] = 'List'
170 kwargs['button'] = 'New Device'
170 kwargs['button'] = 'New Device'
171
171
172 return render(request, 'devices.html', kwargs)
172 return render(request, 'devices.html', kwargs)
173
173
174
174
175 def device(request, id_dev):
175 def device(request, id_dev):
176
176
177 device = get_object_or_404(Device, pk=id_dev)
177 device = get_object_or_404(Device, pk=id_dev)
178
178
179 kwargs = {}
179 kwargs = {}
180 kwargs['device'] = device
180 kwargs['device'] = device
181 kwargs['device_keys'] = ['device_type', 'name', 'ip_address', 'port_address', 'description']
181 kwargs['device_keys'] = ['device_type', 'name', 'ip_address', 'port_address', 'description']
182
182
183 kwargs['title'] = 'Device'
183 kwargs['title'] = 'Device'
184 kwargs['suptitle'] = 'Details'
184 kwargs['suptitle'] = 'Details'
185
185
186 return render(request, 'device.html', kwargs)
186 return render(request, 'device.html', kwargs)
187
187
188
188
189 def device_new(request):
189 def device_new(request):
190
190
191 if request.method == 'GET':
191 if request.method == 'GET':
192 form = DeviceForm()
192 form = DeviceForm()
193
193
194 if request.method == 'POST':
194 if request.method == 'POST':
195 form = DeviceForm(request.POST)
195 form = DeviceForm(request.POST)
196
196
197 if form.is_valid():
197 if form.is_valid():
198 form.save()
198 form.save()
199 return redirect('url_devices')
199 return redirect('url_devices')
200
200
201 kwargs = {}
201 kwargs = {}
202 kwargs['form'] = form
202 kwargs['form'] = form
203 kwargs['title'] = 'Device'
203 kwargs['title'] = 'Device'
204 kwargs['suptitle'] = 'New'
204 kwargs['suptitle'] = 'New'
205 kwargs['button'] = 'Create'
205 kwargs['button'] = 'Create'
206
206
207 return render(request, 'device_edit.html', kwargs)
207 return render(request, 'device_edit.html', kwargs)
208
208
209
209
210 def device_edit(request, id_dev):
210 def device_edit(request, id_dev):
211
211
212 device = get_object_or_404(Device, pk=id_dev)
212 device = get_object_or_404(Device, pk=id_dev)
213
213
214 if request.method=='GET':
214 if request.method=='GET':
215 form = DeviceForm(instance=device)
215 form = DeviceForm(instance=device)
216
216
217 if request.method=='POST':
217 if request.method=='POST':
218 form = DeviceForm(request.POST, instance=device)
218 form = DeviceForm(request.POST, instance=device)
219
219
220 if form.is_valid():
220 if form.is_valid():
221 form.save()
221 form.save()
222 return redirect(device.get_absolute_url())
222 return redirect(device.get_absolute_url())
223
223
224 kwargs = {}
224 kwargs = {}
225 kwargs['form'] = form
225 kwargs['form'] = form
226 kwargs['title'] = 'Device'
226 kwargs['title'] = 'Device'
227 kwargs['suptitle'] = 'Edit'
227 kwargs['suptitle'] = 'Edit'
228 kwargs['button'] = 'Update'
228 kwargs['button'] = 'Update'
229
229
230 return render(request, 'device_edit.html', kwargs)
230 return render(request, 'device_edit.html', kwargs)
231
231
232
232
233 def device_delete(request, id_dev):
233 def device_delete(request, id_dev):
234
234
235 device = get_object_or_404(Device, pk=id_dev)
235 device = get_object_or_404(Device, pk=id_dev)
236
236
237 if request.method=='POST':
237 if request.method=='POST':
238
238
239 if request.user.is_staff:
239 if request.user.is_staff:
240 device.delete()
240 device.delete()
241 return redirect('url_devices')
241 return redirect('url_devices')
242
242
243 messages.error(request, 'Not enough permission to delete this object')
243 messages.error(request, 'Not enough permission to delete this object')
244 return redirect(device.get_absolute_url())
244 return redirect(device.get_absolute_url())
245
245
246 kwargs = {
246 kwargs = {
247 'title': 'Delete',
247 'title': 'Delete',
248 'suptitle': 'Device',
248 'suptitle': 'Device',
249 'object': device,
249 'object': device,
250 'previous': device.get_absolute_url(),
250 'previous': device.get_absolute_url(),
251 'delete': True
251 'delete': True
252 }
252 }
253
253
254 return render(request, 'confirm.html', kwargs)
254 return render(request, 'confirm.html', kwargs)
255
255
256
256
257 def campaigns(request):
257 def campaigns(request):
258
258
259 campaigns = Campaign.objects.all().order_by('start_date')
259 campaigns = Campaign.objects.all().order_by('start_date')
260
260
261 keys = ['id', 'name', 'start_date', 'end_date']
261 keys = ['id', 'name', 'start_date', 'end_date']
262
262
263 kwargs = {}
263 kwargs = {}
264 kwargs['campaign_keys'] = keys[1:]
264 kwargs['campaign_keys'] = keys[1:]
265 kwargs['campaigns'] = campaigns#.values(*keys)
265 kwargs['campaigns'] = campaigns#.values(*keys)
266 kwargs['title'] = 'Campaign'
266 kwargs['title'] = 'Campaign'
267 kwargs['suptitle'] = 'List'
267 kwargs['suptitle'] = 'List'
268 kwargs['button'] = 'New Campaign'
268 kwargs['button'] = 'New Campaign'
269
269
270 return render(request, 'campaigns.html', kwargs)
270 return render(request, 'campaigns.html', kwargs)
271
271
272
272
273 def campaign(request, id_camp):
273 def campaign(request, id_camp):
274
274
275 campaign = get_object_or_404(Campaign, pk=id_camp)
275 campaign = get_object_or_404(Campaign, pk=id_camp)
276 experiments = Experiment.objects.filter(campaign=campaign)
276 experiments = Experiment.objects.filter(campaign=campaign)
277
277
278 form = CampaignForm(instance=campaign)
278 form = CampaignForm(instance=campaign)
279
279
280 kwargs = {}
280 kwargs = {}
281 kwargs['campaign'] = campaign
281 kwargs['campaign'] = campaign
282 kwargs['campaign_keys'] = ['template', 'name', 'start_date', 'end_date', 'tags', 'description']
282 kwargs['campaign_keys'] = ['template', 'name', 'start_date', 'end_date', 'tags', 'description']
283
283
284 kwargs['experiments'] = experiments
284 kwargs['experiments'] = experiments
285 kwargs['experiment_keys'] = ['name', 'radar', 'start_time', 'end_time']
285 kwargs['experiment_keys'] = ['name', 'radar', 'start_time', 'end_time']
286
286
287 kwargs['title'] = 'Campaign'
287 kwargs['title'] = 'Campaign'
288 kwargs['suptitle'] = 'Details'
288 kwargs['suptitle'] = 'Details'
289
289
290 kwargs['form'] = form
290 kwargs['form'] = form
291 kwargs['button'] = 'Add Experiment'
291 kwargs['button'] = 'Add Experiment'
292
292
293 return render(request, 'campaign.html', kwargs)
293 return render(request, 'campaign.html', kwargs)
294
294
295
295
296 def campaign_new(request):
296 def campaign_new(request):
297
297
298 kwargs = {}
298 kwargs = {}
299
299
300 if request.method == 'GET':
300 if request.method == 'GET':
301
301
302 if 'template' in request.GET:
302 if 'template' in request.GET:
303 if request.GET['template']=='0':
303 if request.GET['template']=='0':
304 form = NewForm(initial={'create_from':2},
304 form = NewForm(initial={'create_from':2},
305 template_choices=Campaign.objects.filter(template=True).values_list('id', 'name'))
305 template_choices=Campaign.objects.filter(template=True).values_list('id', 'name'))
306 else:
306 else:
307 kwargs['button'] = 'Create'
307 kwargs['button'] = 'Create'
308 kwargs['experiments'] = Configuration.objects.filter(experiment=request.GET['template'])
308 kwargs['experiments'] = Configuration.objects.filter(experiment=request.GET['template'])
309 kwargs['experiment_keys'] = ['name', 'start_time', 'end_time']
309 kwargs['experiment_keys'] = ['name', 'start_time', 'end_time']
310 camp = Campaign.objects.get(pk=request.GET['template'])
310 camp = Campaign.objects.get(pk=request.GET['template'])
311 form = CampaignForm(instance=camp,
311 form = CampaignForm(instance=camp,
312 initial={'name':'{} [{:%Y/%m/%d}]'.format(camp.name, datetime.now()),
312 initial={'name':'{} [{:%Y/%m/%d}]'.format(camp.name, datetime.now()),
313 'template':False})
313 'template':False})
314 elif 'blank' in request.GET:
314 elif 'blank' in request.GET:
315 kwargs['button'] = 'Create'
315 kwargs['button'] = 'Create'
316 form = CampaignForm()
316 form = CampaignForm()
317 else:
317 else:
318 form = NewForm()
318 form = NewForm()
319
319
320 if request.method == 'POST':
320 if request.method == 'POST':
321 kwargs['button'] = 'Create'
321 kwargs['button'] = 'Create'
322 post = request.POST.copy()
322 post = request.POST.copy()
323 experiments = []
323 experiments = []
324
324
325 for id_exp in post.getlist('experiments'):
325 for id_exp in post.getlist('experiments'):
326 exp = Experiment.objects.get(pk=id_exp)
326 exp = Experiment.objects.get(pk=id_exp)
327 new_exp = exp.clone(template=False)
327 new_exp = exp.clone(template=False)
328 experiments.append(new_exp)
328 experiments.append(new_exp)
329
329
330 post.setlist('experiments', [])
330 post.setlist('experiments', [])
331
331
332 form = CampaignForm(post)
332 form = CampaignForm(post)
333
333
334 if form.is_valid():
334 if form.is_valid():
335 campaign = form.save()
335 campaign = form.save()
336 for exp in experiments:
336 for exp in experiments:
337 campaign.experiments.add(exp)
337 campaign.experiments.add(exp)
338 campaign.save()
338 campaign.save()
339 return redirect('url_campaign', id_camp=campaign.id)
339 return redirect('url_campaign', id_camp=campaign.id)
340
340
341 kwargs['form'] = form
341 kwargs['form'] = form
342 kwargs['title'] = 'Campaign'
342 kwargs['title'] = 'Campaign'
343 kwargs['suptitle'] = 'New'
343 kwargs['suptitle'] = 'New'
344
344
345 return render(request, 'campaign_edit.html', kwargs)
345 return render(request, 'campaign_edit.html', kwargs)
346
346
347
347
348 def campaign_edit(request, id_camp):
348 def campaign_edit(request, id_camp):
349
349
350 campaign = get_object_or_404(Campaign, pk=id_camp)
350 campaign = get_object_or_404(Campaign, pk=id_camp)
351
351
352 if request.method=='GET':
352 if request.method=='GET':
353 form = CampaignForm(instance=campaign)
353 form = CampaignForm(instance=campaign)
354
354
355 if request.method=='POST':
355 if request.method=='POST':
356 exps = campaign.experiments.all().values_list('pk', flat=True)
356 exps = campaign.experiments.all().values_list('pk', flat=True)
357 post = request.POST.copy()
357 post = request.POST.copy()
358 new_exps = post.getlist('experiments')
358 new_exps = post.getlist('experiments')
359 post.setlist('experiments', [])
359 post.setlist('experiments', [])
360 form = CampaignForm(post, instance=campaign)
360 form = CampaignForm(post, instance=campaign)
361
361
362 if form.is_valid():
362 if form.is_valid():
363 camp = form.save()
363 camp = form.save()
364 for id_exp in new_exps:
364 for id_exp in new_exps:
365 if int(id_exp) in exps:
365 if int(id_exp) in exps:
366 exps.pop(id_exp)
366 exps.pop(id_exp)
367 else:
367 else:
368 exp = Experiment.objects.get(pk=id_exp)
368 exp = Experiment.objects.get(pk=id_exp)
369 if exp.template:
369 if exp.template:
370 camp.experiments.add(exp.clone(template=False))
370 camp.experiments.add(exp.clone(template=False))
371 else:
371 else:
372 camp.experiments.add(exp)
372 camp.experiments.add(exp)
373
373
374 for id_exp in exps:
374 for id_exp in exps:
375 camp.experiments.remove(Experiment.objects.get(pk=id_exp))
375 camp.experiments.remove(Experiment.objects.get(pk=id_exp))
376
376
377 return redirect('url_campaign', id_camp=id_camp)
377 return redirect('url_campaign', id_camp=id_camp)
378
378
379 kwargs = {}
379 kwargs = {}
380 kwargs['form'] = form
380 kwargs['form'] = form
381 kwargs['title'] = 'Campaign'
381 kwargs['title'] = 'Campaign'
382 kwargs['suptitle'] = 'Edit'
382 kwargs['suptitle'] = 'Edit'
383 kwargs['button'] = 'Update'
383 kwargs['button'] = 'Update'
384
384
385 return render(request, 'campaign_edit.html', kwargs)
385 return render(request, 'campaign_edit.html', kwargs)
386
386
387
387
388 def campaign_delete(request, id_camp):
388 def campaign_delete(request, id_camp):
389
389
390 campaign = get_object_or_404(Campaign, pk=id_camp)
390 campaign = get_object_or_404(Campaign, pk=id_camp)
391
391
392 if request.method=='POST':
392 if request.method=='POST':
393 if request.user.is_staff:
393 if request.user.is_staff:
394
394
395 for exp in campaign.experiments.all():
395 for exp in campaign.experiments.all():
396 for conf in Configuration.objects.filter(experiment=exp):
396 for conf in Configuration.objects.filter(experiment=exp):
397 conf.delete()
397 conf.delete()
398 exp.delete()
398 exp.delete()
399 campaign.delete()
399 campaign.delete()
400
400
401 return redirect('url_campaigns')
401 return redirect('url_campaigns')
402
402
403 messages.error(request, 'Not enough permission to delete this object')
403 messages.error(request, 'Not enough permission to delete this object')
404 return redirect(campaign.get_absolute_url())
404 return redirect(campaign.get_absolute_url())
405
405
406 kwargs = {
406 kwargs = {
407 'title': 'Delete',
407 'title': 'Delete',
408 'suptitle': 'Campaign',
408 'suptitle': 'Campaign',
409 'object': campaign,
409 'object': campaign,
410 'previous': campaign.get_absolute_url(),
410 'previous': campaign.get_absolute_url(),
411 'delete': True
411 'delete': True
412 }
412 }
413
413
414 return render(request, 'confirm.html', kwargs)
414 return render(request, 'confirm.html', kwargs)
415
415
416 def campaign_export(request, id_camp):
416 def campaign_export(request, id_camp):
417
417
418 campaign = get_object_or_404(Campaign, pk=id_camp)
418 campaign = get_object_or_404(Campaign, pk=id_camp)
419 content = campaign.parms_to_dict()
419 content = campaign.parms_to_dict()
420 content_type = 'application/json'
420 content_type = 'application/json'
421 filename = '%s_%s.json' %(campaign.name, campaign.id)
421 filename = '%s_%s.json' %(campaign.name, campaign.id)
422
422
423 response = HttpResponse(content_type=content_type)
423 response = HttpResponse(content_type=content_type)
424 response['Content-Disposition'] = 'attachment; filename="%s"' %filename
424 response['Content-Disposition'] = 'attachment; filename="%s"' %filename
425 response.write(content)
425 response.write(content)
426
426
427 return response
427 return response
428
428
429
429
430 def campaign_import(request, id_camp):
430 def campaign_import(request, id_camp):
431 ###------FALTA CORREGIR!!!!!-----###
431
432 campaign = get_object_or_404(Campaign, pk=id_camp)
432 campaign = get_object_or_404(Campaign, pk=id_camp)
433 experiments = Experiment.objects.filter(campaign=campaign)
434 configurations = Configuration.objects.filter(experiment=experiments)
435
433
436 if request.method == 'GET':
434 if request.method == 'GET':
437 file_form = UploadFileForm()
435 file_form = UploadFileForm()
438
436
439 if request.method == 'POST':
437 if request.method == 'POST':
440 file_form = UploadFileForm(request.POST, request.FILES)
438 file_form = UploadFileForm(request.POST, request.FILES)
441
439
442 if file_form.is_valid():
440 if file_form.is_valid():
443
441
444 parms = campaign.import_from_file(request.FILES['file'])
442 parms = campaign.import_from_file(request.FILES['file'])
445
443
446 if parms:
444 if parms:
447 location = Location.objects.get(name = parms['radar'])
445 parms['name'] = parms['campaign']
448 parms['location'] = location.id
449 parms['name'] = parms['experiment']
450
446
451 campaign.dict_to_parms(parms, CONF_MODELS)
447 campaign.dict_to_parms(parms, CONF_MODELS)
452
448
453 messages.success(request, "Parameters imported from: '%s'." %request.FILES['file'].name)
449 messages.success(request, "Parameters imported from: '%s'." %request.FILES['file'].name)
454
450
455 form = CampaignForm(initial=parms, instance=campaign)
451 form = CampaignForm(initial=parms, instance=campaign)
456
452
457 kwargs = {}
453 kwargs = {}
458 #kwargs['id_dev'] = conf.id
459 kwargs['form'] = form
454 kwargs['form'] = form
460 kwargs['title'] = 'Campaign'
455 kwargs['title'] = 'Campaign'
461 kwargs['suptitle'] = 'Parameters imported'
456 kwargs['suptitle'] = 'Parameters imported'
462 kwargs['button'] = 'Save'
457 kwargs['button'] = 'Save'
463 kwargs['action'] = campaign.get_absolute_url_edit()
458 kwargs['action'] = campaign.get_absolute_url_edit()
464 kwargs['previous'] = campaign.get_absolute_url()
459 kwargs['previous'] = campaign.get_absolute_url()
465
466
467 ###### SIDEBAR ######
468 #kwargs.update(sidebar(conf=conf))
469 #kwargs.update(sidebar(campaign=campaign))
470
460
471 return render(request, 'campaign_edit.html', kwargs)
461 return render(request, 'campaign_edit.html', kwargs)
462
472
463
473 messages.error(request, "Could not import parameters from file")
464 messages.error(request, "Could not import parameters from file")
474
465
475 kwargs = {}
466 kwargs = {}
476 #kwargs['id_dev'] = conf.id
477 kwargs['title'] = 'Campaign'
467 kwargs['title'] = 'Campaign'
478 kwargs['form'] = file_form
468 kwargs['form'] = file_form
479 kwargs['suptitle'] = 'Importing file'
469 kwargs['suptitle'] = 'Importing file'
480 kwargs['button'] = 'Import'
470 kwargs['button'] = 'Import'
481
471
482 #kwargs.update(sidebar(campaign=campaign))
483
484 return render(request, 'campaign_import.html', kwargs)
472 return render(request, 'campaign_import.html', kwargs)
485
473
486
474
487 def experiments(request):
475 def experiments(request):
488
476
489 experiment_list = Experiment.objects.all()
477 experiment_list = Experiment.objects.all()
490
478
491 keys = ['id', 'name', 'start_time', 'end_time']
479 keys = ['id', 'name', 'start_time', 'end_time']
492
480
493 kwargs = {}
481 kwargs = {}
494
482
495 kwargs['experiment_keys'] = keys[1:]
483 kwargs['experiment_keys'] = keys[1:]
496 kwargs['experiments'] = experiment_list
484 kwargs['experiments'] = experiment_list
497
485
498 kwargs['title'] = 'Experiment'
486 kwargs['title'] = 'Experiment'
499 kwargs['suptitle'] = 'List'
487 kwargs['suptitle'] = 'List'
500 kwargs['button'] = 'New Experiment'
488 kwargs['button'] = 'New Experiment'
501
489
502 return render(request, 'experiments.html', kwargs)
490 return render(request, 'experiments.html', kwargs)
503
491
504
492
505 def experiment(request, id_exp):
493 def experiment(request, id_exp):
506
494
507 experiment = get_object_or_404(Experiment, pk=id_exp)
495 experiment = get_object_or_404(Experiment, pk=id_exp)
508
496
509 configurations = Configuration.objects.filter(experiment=experiment, type=0)
497 configurations = Configuration.objects.filter(experiment=experiment, type=0)
510
498
511 kwargs = {}
499 kwargs = {}
512
500
513 kwargs['experiment_keys'] = ['template', 'radar', 'name', 'start_time', 'end_time']
501 kwargs['experiment_keys'] = ['template', 'radar', 'name', 'start_time', 'end_time']
514 kwargs['experiment'] = experiment
502 kwargs['experiment'] = experiment
515
503
516 kwargs['configuration_keys'] = ['name', 'device__device_type', 'device__ip_address', 'device__port_address']
504 kwargs['configuration_keys'] = ['name', 'device__device_type', 'device__ip_address', 'device__port_address']
517 kwargs['configurations'] = configurations
505 kwargs['configurations'] = configurations
518
506
519 kwargs['title'] = 'Experiment'
507 kwargs['title'] = 'Experiment'
520 kwargs['suptitle'] = 'Details'
508 kwargs['suptitle'] = 'Details'
521
509
522 kwargs['button'] = 'Add Configuration'
510 kwargs['button'] = 'Add Configuration'
523
511
524 ###### SIDEBAR ######
512 ###### SIDEBAR ######
525 kwargs.update(sidebar(experiment=experiment))
513 kwargs.update(sidebar(experiment=experiment))
526
514
527 return render(request, 'experiment.html', kwargs)
515 return render(request, 'experiment.html', kwargs)
528
516
529
517
530 def experiment_new(request, id_camp=None):
518 def experiment_new(request, id_camp=None):
531
519
532 kwargs = {}
520 kwargs = {}
533
521
534 if request.method == 'GET':
522 if request.method == 'GET':
535 if 'template' in request.GET:
523 if 'template' in request.GET:
536 if request.GET['template']=='0':
524 if request.GET['template']=='0':
537 form = NewForm(initial={'create_from':2},
525 form = NewForm(initial={'create_from':2},
538 template_choices=Experiment.objects.filter(template=True).values_list('id', 'name'))
526 template_choices=Experiment.objects.filter(template=True).values_list('id', 'name'))
539 else:
527 else:
540 kwargs['button'] = 'Create'
528 kwargs['button'] = 'Create'
541 kwargs['configurations'] = Configuration.objects.filter(experiment=request.GET['template'])
529 kwargs['configurations'] = Configuration.objects.filter(experiment=request.GET['template'])
542 kwargs['configuration_keys'] = ['name', 'device__name', 'device__ip_address', 'device__port_address']
530 kwargs['configuration_keys'] = ['name', 'device__name', 'device__ip_address', 'device__port_address']
543 exp=Experiment.objects.get(pk=request.GET['template'])
531 exp=Experiment.objects.get(pk=request.GET['template'])
544 form = ExperimentForm(instance=exp,
532 form = ExperimentForm(instance=exp,
545 initial={'name': '{} [{:%Y/%m/%d}]'.format(exp.name, datetime.now()),
533 initial={'name': '{} [{:%Y/%m/%d}]'.format(exp.name, datetime.now()),
546 'template': False})
534 'template': False})
547 elif 'blank' in request.GET:
535 elif 'blank' in request.GET:
548 kwargs['button'] = 'Create'
536 kwargs['button'] = 'Create'
549 form = ExperimentForm()
537 form = ExperimentForm()
550 else:
538 else:
551 form = NewForm()
539 form = NewForm()
552
540
553 if request.method == 'POST':
541 if request.method == 'POST':
554 form = ExperimentForm(request.POST)
542 form = ExperimentForm(request.POST)
555 if form.is_valid():
543 if form.is_valid():
556 experiment = form.save()
544 experiment = form.save()
557
545
558 if 'template' in request.GET:
546 if 'template' in request.GET:
559 configurations = Configuration.objects.filter(experiment=request.GET['template'], type=0)
547 configurations = Configuration.objects.filter(experiment=request.GET['template'], type=0)
560 for conf in configurations:
548 for conf in configurations:
561 conf.clone(experiment=experiment, template=False)
549 conf.clone(experiment=experiment, template=False)
562
550
563 return redirect('url_experiment', id_exp=experiment.id)
551 return redirect('url_experiment', id_exp=experiment.id)
564
552
565 kwargs['form'] = form
553 kwargs['form'] = form
566 kwargs['title'] = 'Experiment'
554 kwargs['title'] = 'Experiment'
567 kwargs['suptitle'] = 'New'
555 kwargs['suptitle'] = 'New'
568
556
569 return render(request, 'experiment_edit.html', kwargs)
557 return render(request, 'experiment_edit.html', kwargs)
570
558
571
559
572 def experiment_edit(request, id_exp):
560 def experiment_edit(request, id_exp):
573
561
574 experiment = get_object_or_404(Experiment, pk=id_exp)
562 experiment = get_object_or_404(Experiment, pk=id_exp)
575
563
576 if request.method == 'GET':
564 if request.method == 'GET':
577 form = ExperimentForm(instance=experiment)
565 form = ExperimentForm(instance=experiment)
578
566
579 if request.method=='POST':
567 if request.method=='POST':
580 form = ExperimentForm(request.POST, instance=experiment)
568 form = ExperimentForm(request.POST, instance=experiment)
581
569
582 if form.is_valid():
570 if form.is_valid():
583 experiment = form.save()
571 experiment = form.save()
584 return redirect('url_experiment', id_exp=experiment.id)
572 return redirect('url_experiment', id_exp=experiment.id)
585
573
586 kwargs = {}
574 kwargs = {}
587 kwargs['form'] = form
575 kwargs['form'] = form
588 kwargs['title'] = 'Experiment'
576 kwargs['title'] = 'Experiment'
589 kwargs['suptitle'] = 'Edit'
577 kwargs['suptitle'] = 'Edit'
590 kwargs['button'] = 'Update'
578 kwargs['button'] = 'Update'
591
579
592 return render(request, 'experiment_edit.html', kwargs)
580 return render(request, 'experiment_edit.html', kwargs)
593
581
594
582
595 def experiment_delete(request, id_exp):
583 def experiment_delete(request, id_exp):
596
584
597 experiment = get_object_or_404(Experiment, pk=id_exp)
585 experiment = get_object_or_404(Experiment, pk=id_exp)
598
586
599 if request.method=='POST':
587 if request.method=='POST':
600 if request.user.is_staff:
588 if request.user.is_staff:
601 for conf in Configuration.objects.filter(experiment=experiment):
589 for conf in Configuration.objects.filter(experiment=experiment):
602 conf.delete()
590 conf.delete()
603 experiment.delete()
591 experiment.delete()
604 return redirect('url_experiments')
592 return redirect('url_experiments')
605
593
606 messages.error(request, 'Not enough permission to delete this object')
594 messages.error(request, 'Not enough permission to delete this object')
607 return redirect(experiment.get_absolute_url())
595 return redirect(experiment.get_absolute_url())
608
596
609 kwargs = {
597 kwargs = {
610 'title': 'Delete',
598 'title': 'Delete',
611 'suptitle': 'Experiment',
599 'suptitle': 'Experiment',
612 'object': experiment,
600 'object': experiment,
613 'previous': experiment.get_absolute_url(),
601 'previous': experiment.get_absolute_url(),
614 'delete': True
602 'delete': True
615 }
603 }
616
604
617 return render(request, 'confirm.html', kwargs)
605 return render(request, 'confirm.html', kwargs)
618
606
619
607
620 def experiment_export(request, id_exp):
608 def experiment_export(request, id_exp):
621
609
622 experiment = get_object_or_404(Experiment, pk=id_exp)
610 experiment = get_object_or_404(Experiment, pk=id_exp)
623 content = experiment.parms_to_dict()
611 content = experiment.parms_to_dict()
624 content_type = 'application/json'
612 content_type = 'application/json'
625 filename = '%s_%s.json' %(experiment.name, experiment.id)
613 filename = '%s_%s.json' %(experiment.name, experiment.id)
626
614
627 response = HttpResponse(content_type=content_type)
615 response = HttpResponse(content_type=content_type)
628 response['Content-Disposition'] = 'attachment; filename="%s"' %filename
616 response['Content-Disposition'] = 'attachment; filename="%s"' %filename
629 response.write(content)
617 response.write(content)
630
618
631 return response
619 return response
632
620
633 def experiment_import(request, id_exp):
621 def experiment_import(request, id_exp):
634
622
635 experiment = get_object_or_404(Experiment, pk=id_exp)
623 experiment = get_object_or_404(Experiment, pk=id_exp)
636 configurations = Configuration.objects.filter(experiment=experiment)
624 configurations = Configuration.objects.filter(experiment=experiment)
637
625
638 if request.method == 'GET':
626 if request.method == 'GET':
639 file_form = UploadFileForm()
627 file_form = UploadFileForm()
640
628
641 if request.method == 'POST':
629 if request.method == 'POST':
642 file_form = UploadFileForm(request.POST, request.FILES)
630 file_form = UploadFileForm(request.POST, request.FILES)
643
631
644 if file_form.is_valid():
632 if file_form.is_valid():
645
633
646 parms = experiment.import_from_file(request.FILES['file'])
634 parms = experiment.import_from_file(request.FILES['file'])
647
635
648 if parms:
636 if parms:
649 location = Location.objects.get(name = parms['radar'])
637 location = Location.objects.get(name = parms['radar'])
650 parms['location'] = location.id
638 parms['location'] = location.id
651 parms['name'] = parms['experiment']
639 parms['name'] = parms['experiment']
652
640
653 experiment.dict_to_parms(parms, CONF_MODELS)
641 experiment.dict_to_parms(parms, CONF_MODELS)
654
642
655 messages.success(request, "Parameters imported from: '%s'." %request.FILES['file'].name)
643 messages.success(request, "Parameters imported from: '%s'." %request.FILES['file'].name)
656
644
657 form = ExperimentForm(initial=parms, instance=experiment)
645 form = ExperimentForm(initial=parms, instance=experiment)
658
646
659 kwargs = {}
647 kwargs = {}
660 #kwargs['id_dev'] = conf.id
648 #kwargs['id_dev'] = conf.id
661 kwargs['form'] = form
649 kwargs['form'] = form
662 kwargs['title'] = 'Experiment'
650 kwargs['title'] = 'Experiment'
663 kwargs['suptitle'] = 'Parameters imported'
651 kwargs['suptitle'] = 'Parameters imported'
664 kwargs['button'] = 'Save'
652 kwargs['button'] = 'Save'
665 kwargs['action'] = experiment.get_absolute_url_edit()
653 kwargs['action'] = experiment.get_absolute_url_edit()
666 kwargs['previous'] = experiment.get_absolute_url()
654 kwargs['previous'] = experiment.get_absolute_url()
667
655
668 ###### SIDEBAR ######
656 ###### SIDEBAR ######
669 #kwargs.update(sidebar(conf=conf))
657 #kwargs.update(sidebar(conf=conf))
670 kwargs.update(sidebar(experiment=experiment))
658 kwargs.update(sidebar(experiment=experiment))
671
659
672 return render(request, 'experiment_edit.html', kwargs)
660 return render(request, 'experiment_edit.html', kwargs)
673
661
674 messages.error(request, "Could not import parameters from file")
662 messages.error(request, "Could not import parameters from file")
675
663
676 kwargs = {}
664 kwargs = {}
677 #kwargs['id_dev'] = conf.id
665 #kwargs['id_dev'] = conf.id
678 kwargs['title'] = 'Experiment'
666 kwargs['title'] = 'Experiment'
679 kwargs['form'] = file_form
667 kwargs['form'] = file_form
680 kwargs['suptitle'] = 'Importing file'
668 kwargs['suptitle'] = 'Importing file'
681 kwargs['button'] = 'Import'
669 kwargs['button'] = 'Import'
682
670
683 kwargs.update(sidebar(experiment=experiment))
671 kwargs.update(sidebar(experiment=experiment))
684
672
685 return render(request, 'experiment_import.html', kwargs)
673 return render(request, 'experiment_import.html', kwargs)
686
674
687 def experiment_mix(request, id_exp):
675 def experiment_mix(request, id_exp):
688
676
689 experiment = get_object_or_404(Experiment, pk=id_exp)
677 experiment = get_object_or_404(Experiment, pk=id_exp)
690 rc_confs = [conf for conf in RCConfiguration.objects.filter(experiment=id_exp,
678 rc_confs = [conf for conf in RCConfiguration.objects.filter(experiment=id_exp,
691 mix=False)]
679 mix=False)]
692
680
693 if len(rc_confs)<2:
681 if len(rc_confs)<2:
694 messages.warning(request, 'You need at least two RC Configurations to make a mix')
682 messages.warning(request, 'You need at least two RC Configurations to make a mix')
695 return redirect(experiment.get_absolute_url())
683 return redirect(experiment.get_absolute_url())
696
684
697 mix_confs = RCConfiguration.objects.filter(experiment=id_exp, mix=True)
685 mix_confs = RCConfiguration.objects.filter(experiment=id_exp, mix=True)
698
686
699 if mix_confs:
687 if mix_confs:
700 mix = mix_confs[0]
688 mix = mix_confs[0]
701 else:
689 else:
702 mix = RCConfiguration(experiment=experiment,
690 mix = RCConfiguration(experiment=experiment,
703 device=rc_confs[0].device,
691 device=rc_confs[0].device,
704 ipp=rc_confs[0].ipp,
692 ipp=rc_confs[0].ipp,
705 clock_in=rc_confs[0].clock_in,
693 clock_in=rc_confs[0].clock_in,
706 clock_divider=rc_confs[0].clock_divider,
694 clock_divider=rc_confs[0].clock_divider,
707 mix=True,
695 mix=True,
708 parameters='')
696 parameters='')
709 mix.save()
697 mix.save()
710
698
711 line_type = RCLineType.objects.get(name='mix')
699 line_type = RCLineType.objects.get(name='mix')
712 for i in range(len(rc_confs[0].get_lines())):
700 for i in range(len(rc_confs[0].get_lines())):
713 line = RCLine(rc_configuration=mix, line_type=line_type, channel=i)
701 line = RCLine(rc_configuration=mix, line_type=line_type, channel=i)
714 line.save()
702 line.save()
715
703
716 initial = {'name': mix.name,
704 initial = {'name': mix.name,
717 'result': parse_mix_result(mix.parameters),
705 'result': parse_mix_result(mix.parameters),
718 'delay': 0,
706 'delay': 0,
719 'mask': [0,1,2,3,4,5,6,7]
707 'mask': [0,1,2,3,4,5,6,7]
720 }
708 }
721
709
722 if request.method=='GET':
710 if request.method=='GET':
723 form = RCMixConfigurationForm(confs=rc_confs, initial=initial)
711 form = RCMixConfigurationForm(confs=rc_confs, initial=initial)
724
712
725 if request.method=='POST':
713 if request.method=='POST':
726
714
727 result = mix.parameters
715 result = mix.parameters
728
716
729 if '{}|'.format(request.POST['experiment']) in result:
717 if '{}|'.format(request.POST['experiment']) in result:
730 messages.error(request, 'Configuration already added')
718 messages.error(request, 'Configuration already added')
731 else:
719 else:
732 if result:
720 if result:
733 result = '{}-{}|{}|{}|{}'.format(mix.parameters,
721 result = '{}-{}|{}|{}|{}'.format(mix.parameters,
734 request.POST['experiment'],
722 request.POST['experiment'],
735 MIX_MODES[request.POST['operation']],
723 MIX_MODES[request.POST['operation']],
736 float(request.POST['delay']),
724 float(request.POST['delay']),
737 parse_mask(request.POST.getlist('mask'))
725 parse_mask(request.POST.getlist('mask'))
738 )
726 )
739 else:
727 else:
740 result = '{}|{}|{}|{}'.format(request.POST['experiment'],
728 result = '{}|{}|{}|{}'.format(request.POST['experiment'],
741 MIX_MODES[request.POST['operation']],
729 MIX_MODES[request.POST['operation']],
742 float(request.POST['delay']),
730 float(request.POST['delay']),
743 parse_mask(request.POST.getlist('mask'))
731 parse_mask(request.POST.getlist('mask'))
744 )
732 )
745
733
746 mix.parameters = result
734 mix.parameters = result
747 mix.name = request.POST['name']
735 mix.name = request.POST['name']
748 mix.save()
736 mix.save()
749 mix.update_pulses()
737 mix.update_pulses()
750
738
751
739
752 initial['result'] = parse_mix_result(result)
740 initial['result'] = parse_mix_result(result)
753 initial['name'] = mix.name
741 initial['name'] = mix.name
754
742
755 form = RCMixConfigurationForm(initial=initial, confs=rc_confs)
743 form = RCMixConfigurationForm(initial=initial, confs=rc_confs)
756
744
757
745
758 kwargs = {
746 kwargs = {
759 'title': 'Experiment',
747 'title': 'Experiment',
760 'suptitle': 'Mix Configurations',
748 'suptitle': 'Mix Configurations',
761 'form' : form,
749 'form' : form,
762 'extra_button': 'Delete',
750 'extra_button': 'Delete',
763 'button': 'Add',
751 'button': 'Add',
764 'cancel': 'Back',
752 'cancel': 'Back',
765 'previous': experiment.get_absolute_url(),
753 'previous': experiment.get_absolute_url(),
766 'id_exp':id_exp,
754 'id_exp':id_exp,
767
755
768 }
756 }
769
757
770 return render(request, 'experiment_mix.html', kwargs)
758 return render(request, 'experiment_mix.html', kwargs)
771
759
772
760
773 def experiment_mix_delete(request, id_exp):
761 def experiment_mix_delete(request, id_exp):
774
762
775 conf = RCConfiguration.objects.get(experiment=id_exp, mix=True)
763 conf = RCConfiguration.objects.get(experiment=id_exp, mix=True)
776 values = conf.parameters.split('-')
764 values = conf.parameters.split('-')
777 conf.parameters = '-'.join(values[:-1])
765 conf.parameters = '-'.join(values[:-1])
778 conf.save()
766 conf.save()
779
767
780 return redirect('url_mix_experiment', id_exp=id_exp)
768 return redirect('url_mix_experiment', id_exp=id_exp)
781
769
782
770
783 def parse_mix_result(s):
771 def parse_mix_result(s):
784
772
785 values = s.split('-')
773 values = s.split('-')
786 html = ''
774 html = ''
787
775
788
776
789 for i, value in enumerate(values):
777 for i, value in enumerate(values):
790 if not value:
778 if not value:
791 continue
779 continue
792 pk, mode, delay, mask = value.split('|')
780 pk, mode, delay, mask = value.split('|')
793 conf = RCConfiguration.objects.get(pk=pk)
781 conf = RCConfiguration.objects.get(pk=pk)
794 if i==0:
782 if i==0:
795 html += '{:20.18}{:4}{:9}km{:>6}\r\n'.format(
783 html += '{:20.18}{:4}{:9}km{:>6}\r\n'.format(
796 conf.name[:18],
784 conf.name[:18],
797 '---',
785 '---',
798 delay,
786 delay,
799 mask)
787 mask)
800 else:
788 else:
801 html += '{:20.18}{:4}{:9}km{:>6}\r\n'.format(
789 html += '{:20.18}{:4}{:9}km{:>6}\r\n'.format(
802 conf.name[:18],
790 conf.name[:18],
803 mode,
791 mode,
804 delay,
792 delay,
805 mask)
793 mask)
806
794
807 return mark_safe(html)
795 return mark_safe(html)
808
796
809 def parse_mask(l):
797 def parse_mask(l):
810
798
811 values = []
799 values = []
812
800
813 for x in range(8):
801 for x in range(8):
814 if '{}'.format(x) in l:
802 if '{}'.format(x) in l:
815 values.append(1)
803 values.append(1)
816 else:
804 else:
817 values.append(0)
805 values.append(0)
818
806
819 values.reverse()
807 values.reverse()
820
808
821 return int(''.join([str(x) for x in values]), 2)
809 return int(''.join([str(x) for x in values]), 2)
822
810
823
811
824 def dev_confs(request):
812 def dev_confs(request):
825
813
826 configurations = Configuration.objects.all().order_by('type', 'device__device_type', 'experiment')
814 configurations = Configuration.objects.all().order_by('type', 'device__device_type', 'experiment')
827
815
828 kwargs = {}
816 kwargs = {}
829
817
830 kwargs['configuration_keys'] = ['device', 'name', 'experiment', 'type', 'programmed_date']
818 kwargs['configuration_keys'] = ['device', 'name', 'experiment', 'type', 'programmed_date']
831 kwargs['configurations'] = configurations
819 kwargs['configurations'] = configurations
832
820
833 kwargs['title'] = 'Configuration'
821 kwargs['title'] = 'Configuration'
834 kwargs['suptitle'] = 'List'
822 kwargs['suptitle'] = 'List'
835
823
836 return render(request, 'dev_confs.html', kwargs)
824 return render(request, 'dev_confs.html', kwargs)
837
825
838
826
839 def dev_conf(request, id_conf):
827 def dev_conf(request, id_conf):
840
828
841 conf = get_object_or_404(Configuration, pk=id_conf)
829 conf = get_object_or_404(Configuration, pk=id_conf)
842
830
843 return redirect(conf.get_absolute_url())
831 return redirect(conf.get_absolute_url())
844
832
845
833
846 def dev_conf_new(request, id_exp=0, id_dev=0):
834 def dev_conf_new(request, id_exp=0, id_dev=0):
847
835
848 initial = {}
836 initial = {}
849 kwargs = {}
837 kwargs = {}
850
838
851 if id_exp<>0:
839 if id_exp<>0:
852 initial['experiment'] = id_exp
840 initial['experiment'] = id_exp
853
841
854 if id_dev<>0:
842 if id_dev<>0:
855 initial['device'] = id_dev
843 initial['device'] = id_dev
856
844
857 if request.method == 'GET':
845 if request.method == 'GET':
858
846
859 if id_dev:
847 if id_dev:
860 kwargs['button'] = 'Create'
848 kwargs['button'] = 'Create'
861 device = Device.objects.get(pk=id_dev)
849 device = Device.objects.get(pk=id_dev)
862 DevConfForm = CONF_FORMS[device.device_type.name]
850 DevConfForm = CONF_FORMS[device.device_type.name]
863 initial['name'] = request.GET['name']
851 initial['name'] = request.GET['name']
864 form = DevConfForm(initial=initial)
852 form = DevConfForm(initial=initial)
865 else:
853 else:
866 if 'template' in request.GET:
854 if 'template' in request.GET:
867 if request.GET['template']=='0':
855 if request.GET['template']=='0':
868 form = NewForm(initial={'create_from':2},
856 form = NewForm(initial={'create_from':2},
869 template_choices=Configuration.objects.filter(template=True).values_list('id', 'name'))
857 template_choices=Configuration.objects.filter(template=True).values_list('id', 'name'))
870 else:
858 else:
871 kwargs['button'] = 'Create'
859 kwargs['button'] = 'Create'
872 conf = Configuration.objects.get(pk=request.GET['template'])
860 conf = Configuration.objects.get(pk=request.GET['template'])
873 DevConfForm = CONF_FORMS[conf.device.device_type.name]
861 DevConfForm = CONF_FORMS[conf.device.device_type.name]
874 form = DevConfForm(instance=conf,
862 form = DevConfForm(instance=conf,
875 initial={'name': '{} [{:%Y/%m/%d}]'.format(conf.name, datetime.now()),
863 initial={'name': '{} [{:%Y/%m/%d}]'.format(conf.name, datetime.now()),
876 'template': False})
864 'template': False})
877 elif 'blank' in request.GET:
865 elif 'blank' in request.GET:
878 kwargs['button'] = 'Create'
866 kwargs['button'] = 'Create'
879 form = ConfigurationForm(initial=initial)
867 form = ConfigurationForm(initial=initial)
880 else:
868 else:
881 form = NewForm()
869 form = NewForm()
882
870
883 if request.method == 'POST':
871 if request.method == 'POST':
884
872
885 device = Device.objects.get(pk=request.POST['device'])
873 device = Device.objects.get(pk=request.POST['device'])
886 DevConfForm = CONF_FORMS[device.device_type.name]
874 DevConfForm = CONF_FORMS[device.device_type.name]
887
875
888 form = DevConfForm(request.POST)
876 form = DevConfForm(request.POST)
889
877
890 if form.is_valid():
878 if form.is_valid():
891 conf = form.save()
879 conf = form.save()
892
880
893 if 'template' in request.GET and conf.device.device_type.name=='rc':
881 if 'template' in request.GET and conf.device.device_type.name=='rc':
894 lines = RCLine.objects.filter(rc_configuration=request.GET['template'])
882 lines = RCLine.objects.filter(rc_configuration=request.GET['template'])
895 for line in lines:
883 for line in lines:
896 line.clone(rc_configuration=conf)
884 line.clone(rc_configuration=conf)
897
885
898 return redirect('url_dev_conf', id_conf=conf.pk)
886 return redirect('url_dev_conf', id_conf=conf.pk)
899
887
900
888
901 kwargs['id_exp'] = id_exp
889 kwargs['id_exp'] = id_exp
902 kwargs['form'] = form
890 kwargs['form'] = form
903 kwargs['title'] = 'Configuration'
891 kwargs['title'] = 'Configuration'
904 kwargs['suptitle'] = 'New'
892 kwargs['suptitle'] = 'New'
905
893
906
894
907 if id_dev != 0:
895 if id_dev != 0:
908 device = Device.objects.get(pk=id_dev)
896 device = Device.objects.get(pk=id_dev)
909 if 'dds' in device.device_type.name:
897 if 'dds' in device.device_type.name:
910 kwargs['dds_device'] = True
898 kwargs['dds_device'] = True
911
899
912 return render(request, 'dev_conf_edit.html', kwargs)
900 return render(request, 'dev_conf_edit.html', kwargs)
913
901
914
902
915 def dev_conf_edit(request, id_conf):
903 def dev_conf_edit(request, id_conf):
916
904
917 conf = get_object_or_404(Configuration, pk=id_conf)
905 conf = get_object_or_404(Configuration, pk=id_conf)
918
906
919 DevConfModel = CONF_MODELS[conf.device.device_type.name]
907 DevConfModel = CONF_MODELS[conf.device.device_type.name]
920 DevConfForm = CONF_FORMS[conf.device.device_type.name]
908 DevConfForm = CONF_FORMS[conf.device.device_type.name]
921
909
922 dev_conf = DevConfModel.objects.get(pk=id_conf)
910 dev_conf = DevConfModel.objects.get(pk=id_conf)
923
911
924 if request.method=='GET':
912 if request.method=='GET':
925 form = DevConfForm(instance=dev_conf)
913 form = DevConfForm(instance=dev_conf)
926
914
927 if request.method=='POST':
915 if request.method=='POST':
928 form = DevConfForm(request.POST, instance=dev_conf)
916 form = DevConfForm(request.POST, instance=dev_conf)
929
917
930 if form.is_valid():
918 if form.is_valid():
931 form.save()
919 form.save()
932 return redirect('url_dev_conf', id_conf=id_conf)
920 return redirect('url_dev_conf', id_conf=id_conf)
933
921
934 kwargs = {}
922 kwargs = {}
935 kwargs['form'] = form
923 kwargs['form'] = form
936 kwargs['title'] = 'Device Configuration'
924 kwargs['title'] = 'Device Configuration'
937 kwargs['suptitle'] = 'Edit'
925 kwargs['suptitle'] = 'Edit'
938 kwargs['button'] = 'Update'
926 kwargs['button'] = 'Update'
939
927
940 ###### SIDEBAR ######
928 ###### SIDEBAR ######
941 kwargs.update(sidebar(conf=conf))
929 kwargs.update(sidebar(conf=conf))
942
930
943 return render(request, '%s_conf_edit.html' % conf.device.device_type.name, kwargs)
931 return render(request, '%s_conf_edit.html' % conf.device.device_type.name, kwargs)
944
932
945
933
946 def dev_conf_start(request, id_conf):
934 def dev_conf_start(request, id_conf):
947
935
948 conf = get_object_or_404(Configuration, pk=id_conf)
936 conf = get_object_or_404(Configuration, pk=id_conf)
949
937
950 DevConfModel = CONF_MODELS[conf.device.device_type.name]
938 DevConfModel = CONF_MODELS[conf.device.device_type.name]
951
939
952 conf = DevConfModel.objects.get(pk=id_conf)
940 conf = DevConfModel.objects.get(pk=id_conf)
953
941
954 if conf.start_device():
942 if conf.start_device():
955 messages.success(request, conf.message)
943 messages.success(request, conf.message)
956 else:
944 else:
957 messages.error(request, conf.message)
945 messages.error(request, conf.message)
958
946
959 conf.status_device()
947 conf.status_device()
960
948
961 return redirect(conf.get_absolute_url())
949 return redirect(conf.get_absolute_url())
962
950
963
951
964 def dev_conf_stop(request, id_conf):
952 def dev_conf_stop(request, id_conf):
965
953
966 conf = get_object_or_404(Configuration, pk=id_conf)
954 conf = get_object_or_404(Configuration, pk=id_conf)
967
955
968 DevConfModel = CONF_MODELS[conf.device.device_type.name]
956 DevConfModel = CONF_MODELS[conf.device.device_type.name]
969
957
970 conf = DevConfModel.objects.get(pk=id_conf)
958 conf = DevConfModel.objects.get(pk=id_conf)
971
959
972 if conf.stop_device():
960 if conf.stop_device():
973 messages.success(request, conf.message)
961 messages.success(request, conf.message)
974 else:
962 else:
975 messages.error(request, conf.message)
963 messages.error(request, conf.message)
976
964
977 conf.status_device()
965 conf.status_device()
978
966
979 return redirect(conf.get_absolute_url())
967 return redirect(conf.get_absolute_url())
980
968
981
969
982 def dev_conf_status(request, id_conf):
970 def dev_conf_status(request, id_conf):
983
971
984 conf = get_object_or_404(Configuration, pk=id_conf)
972 conf = get_object_or_404(Configuration, pk=id_conf)
985
973
986 DevConfModel = CONF_MODELS[conf.device.device_type.name]
974 DevConfModel = CONF_MODELS[conf.device.device_type.name]
987
975
988 conf = DevConfModel.objects.get(pk=id_conf)
976 conf = DevConfModel.objects.get(pk=id_conf)
989
977
990 if conf.status_device():
978 if conf.status_device():
991 messages.success(request, conf.message)
979 messages.success(request, conf.message)
992 else:
980 else:
993 messages.error(request, conf.message)
981 messages.error(request, conf.message)
994
982
995 return redirect(conf.get_absolute_url())
983 return redirect(conf.get_absolute_url())
996
984
997
985
998 def dev_conf_write(request, id_conf):
986 def dev_conf_write(request, id_conf):
999
987
1000 conf = get_object_or_404(Configuration, pk=id_conf)
988 conf = get_object_or_404(Configuration, pk=id_conf)
1001
989
1002 DevConfModel = CONF_MODELS[conf.device.device_type.name]
990 DevConfModel = CONF_MODELS[conf.device.device_type.name]
1003
991
1004 conf = DevConfModel.objects.get(pk=id_conf)
992 conf = DevConfModel.objects.get(pk=id_conf)
1005
993
1006 answer = conf.write_device()
994 answer = conf.write_device()
1007 conf.status_device()
995 conf.status_device()
1008
996
1009 if answer:
997 if answer:
1010 messages.success(request, conf.message)
998 messages.success(request, conf.message)
1011
999
1012 #Creating a historical configuration
1000 #Creating a historical configuration
1013 conf.clone(type=0, template=False)
1001 conf.clone(type=0, template=False)
1014
1002
1015 #Original configuration
1003 #Original configuration
1016 conf = DevConfModel.objects.get(pk=id_conf)
1004 conf = DevConfModel.objects.get(pk=id_conf)
1017 else:
1005 else:
1018 messages.error(request, conf.message)
1006 messages.error(request, conf.message)
1019
1007
1020 return redirect(conf.get_absolute_url())
1008 return redirect(conf.get_absolute_url())
1021
1009
1022
1010
1023 def dev_conf_read(request, id_conf):
1011 def dev_conf_read(request, id_conf):
1024
1012
1025 conf = get_object_or_404(Configuration, pk=id_conf)
1013 conf = get_object_or_404(Configuration, pk=id_conf)
1026
1014
1027 DevConfModel = CONF_MODELS[conf.device.device_type.name]
1015 DevConfModel = CONF_MODELS[conf.device.device_type.name]
1028 DevConfForm = CONF_FORMS[conf.device.device_type.name]
1016 DevConfForm = CONF_FORMS[conf.device.device_type.name]
1029
1017
1030 conf = DevConfModel.objects.get(pk=id_conf)
1018 conf = DevConfModel.objects.get(pk=id_conf)
1031
1019
1032 if request.method=='GET':
1020 if request.method=='GET':
1033
1021
1034 parms = conf.read_device()
1022 parms = conf.read_device()
1035 conf.status_device()
1023 conf.status_device()
1036
1024
1037 if not parms:
1025 if not parms:
1038 messages.error(request, conf.message)
1026 messages.error(request, conf.message)
1039 return redirect(conf.get_absolute_url())
1027 return redirect(conf.get_absolute_url())
1040
1028
1041 form = DevConfForm(initial=parms, instance=conf)
1029 form = DevConfForm(initial=parms, instance=conf)
1042
1030
1043 if request.method=='POST':
1031 if request.method=='POST':
1044 form = DevConfForm(request.POST, instance=conf)
1032 form = DevConfForm(request.POST, instance=conf)
1045
1033
1046 if form.is_valid():
1034 if form.is_valid():
1047 form.save()
1035 form.save()
1048 return redirect(conf.get_absolute_url())
1036 return redirect(conf.get_absolute_url())
1049
1037
1050 messages.error(request, "Parameters could not be saved")
1038 messages.error(request, "Parameters could not be saved")
1051
1039
1052 kwargs = {}
1040 kwargs = {}
1053 kwargs['id_dev'] = conf.id
1041 kwargs['id_dev'] = conf.id
1054 kwargs['form'] = form
1042 kwargs['form'] = form
1055 kwargs['title'] = 'Device Configuration'
1043 kwargs['title'] = 'Device Configuration'
1056 kwargs['suptitle'] = 'Parameters read from device'
1044 kwargs['suptitle'] = 'Parameters read from device'
1057 kwargs['button'] = 'Save'
1045 kwargs['button'] = 'Save'
1058
1046
1059 ###### SIDEBAR ######
1047 ###### SIDEBAR ######
1060 kwargs.update(sidebar(conf=conf))
1048 kwargs.update(sidebar(conf=conf))
1061
1049
1062 return render(request, '%s_conf_edit.html' %conf.device.device_type.name, kwargs)
1050 return render(request, '%s_conf_edit.html' %conf.device.device_type.name, kwargs)
1063
1051
1064
1052
1065 def dev_conf_import(request, id_conf):
1053 def dev_conf_import(request, id_conf):
1066
1054
1067 conf = get_object_or_404(Configuration, pk=id_conf)
1055 conf = get_object_or_404(Configuration, pk=id_conf)
1068
1056
1069 DevConfModel = CONF_MODELS[conf.device.device_type.name]
1057 DevConfModel = CONF_MODELS[conf.device.device_type.name]
1070 DevConfForm = CONF_FORMS[conf.device.device_type.name]
1058 DevConfForm = CONF_FORMS[conf.device.device_type.name]
1071 conf = DevConfModel.objects.get(pk=id_conf)
1059 conf = DevConfModel.objects.get(pk=id_conf)
1072
1060
1073 if request.method == 'GET':
1061 if request.method == 'GET':
1074 file_form = UploadFileForm()
1062 file_form = UploadFileForm()
1075
1063
1076 if request.method == 'POST':
1064 if request.method == 'POST':
1077 file_form = UploadFileForm(request.POST, request.FILES)
1065 file_form = UploadFileForm(request.POST, request.FILES)
1078
1066
1079 if file_form.is_valid():
1067 if file_form.is_valid():
1080
1068
1081 parms = conf.import_from_file(request.FILES['file'])
1069 parms = conf.import_from_file(request.FILES['file'])
1082
1070
1083 if parms:
1071 if parms:
1084 messages.success(request, "Parameters imported from: '%s'." %request.FILES['file'].name)
1072 messages.success(request, "Parameters imported from: '%s'." %request.FILES['file'].name)
1085 form = DevConfForm(initial=parms, instance=conf)
1073 form = DevConfForm(initial=parms, instance=conf)
1086
1074
1087 kwargs = {}
1075 kwargs = {}
1088 kwargs['id_dev'] = conf.id
1076 kwargs['id_dev'] = conf.id
1089 kwargs['form'] = form
1077 kwargs['form'] = form
1090 kwargs['title'] = 'Device Configuration'
1078 kwargs['title'] = 'Device Configuration'
1091 kwargs['suptitle'] = 'Parameters imported'
1079 kwargs['suptitle'] = 'Parameters imported'
1092 kwargs['button'] = 'Save'
1080 kwargs['button'] = 'Save'
1093 kwargs['action'] = conf.get_absolute_url_edit()
1081 kwargs['action'] = conf.get_absolute_url_edit()
1094 kwargs['previous'] = conf.get_absolute_url()
1082 kwargs['previous'] = conf.get_absolute_url()
1095
1083
1096 ###### SIDEBAR ######
1084 ###### SIDEBAR ######
1097 kwargs.update(sidebar(conf=conf))
1085 kwargs.update(sidebar(conf=conf))
1098
1086
1099 return render(request, '%s_conf_edit.html' % conf.device.device_type.name, kwargs)
1087 return render(request, '%s_conf_edit.html' % conf.device.device_type.name, kwargs)
1100
1088
1101 messages.error(request, "Could not import parameters from file")
1089 messages.error(request, "Could not import parameters from file")
1102
1090
1103 kwargs = {}
1091 kwargs = {}
1104 kwargs['id_dev'] = conf.id
1092 kwargs['id_dev'] = conf.id
1105 kwargs['title'] = 'Device Configuration'
1093 kwargs['title'] = 'Device Configuration'
1106 kwargs['form'] = file_form
1094 kwargs['form'] = file_form
1107 kwargs['suptitle'] = 'Importing file'
1095 kwargs['suptitle'] = 'Importing file'
1108 kwargs['button'] = 'Import'
1096 kwargs['button'] = 'Import'
1109
1097
1110 kwargs.update(sidebar(conf=conf))
1098 kwargs.update(sidebar(conf=conf))
1111
1099
1112 return render(request, 'dev_conf_import.html', kwargs)
1100 return render(request, 'dev_conf_import.html', kwargs)
1113
1101
1114
1102
1115 def dev_conf_export(request, id_conf):
1103 def dev_conf_export(request, id_conf):
1116
1104
1117 conf = get_object_or_404(Configuration, pk=id_conf)
1105 conf = get_object_or_404(Configuration, pk=id_conf)
1118
1106
1119 DevConfModel = CONF_MODELS[conf.device.device_type.name]
1107 DevConfModel = CONF_MODELS[conf.device.device_type.name]
1120
1108
1121 conf = DevConfModel.objects.get(pk=id_conf)
1109 conf = DevConfModel.objects.get(pk=id_conf)
1122
1110
1123 if request.method == 'GET':
1111 if request.method == 'GET':
1124 file_form = DownloadFileForm(conf.device.device_type.name)
1112 file_form = DownloadFileForm(conf.device.device_type.name)
1125
1113
1126 if request.method == 'POST':
1114 if request.method == 'POST':
1127 file_form = DownloadFileForm(conf.device.device_type.name, request.POST)
1115 file_form = DownloadFileForm(conf.device.device_type.name, request.POST)
1128
1116
1129 if file_form.is_valid():
1117 if file_form.is_valid():
1130 fields = conf.export_to_file(format = file_form.cleaned_data['format'])
1118 fields = conf.export_to_file(format = file_form.cleaned_data['format'])
1131
1119
1132 response = HttpResponse(content_type=fields['content_type'])
1120 response = HttpResponse(content_type=fields['content_type'])
1133 response['Content-Disposition'] = 'attachment; filename="%s"' %fields['filename']
1121 response['Content-Disposition'] = 'attachment; filename="%s"' %fields['filename']
1134 response.write(fields['content'])
1122 response.write(fields['content'])
1135
1123
1136 return response
1124 return response
1137
1125
1138 messages.error(request, "Could not export parameters")
1126 messages.error(request, "Could not export parameters")
1139
1127
1140 kwargs = {}
1128 kwargs = {}
1141 kwargs['id_dev'] = conf.id
1129 kwargs['id_dev'] = conf.id
1142 kwargs['title'] = 'Device Configuration'
1130 kwargs['title'] = 'Device Configuration'
1143 kwargs['form'] = file_form
1131 kwargs['form'] = file_form
1144 kwargs['suptitle'] = 'Exporting file'
1132 kwargs['suptitle'] = 'Exporting file'
1145 kwargs['button'] = 'Export'
1133 kwargs['button'] = 'Export'
1146
1134
1147 return render(request, 'dev_conf_export.html', kwargs)
1135 return render(request, 'dev_conf_export.html', kwargs)
1148
1136
1149
1137
1150 def dev_conf_delete(request, id_conf):
1138 def dev_conf_delete(request, id_conf):
1151
1139
1152 conf = get_object_or_404(Configuration, pk=id_conf)
1140 conf = get_object_or_404(Configuration, pk=id_conf)
1153
1141
1154 if request.method=='POST':
1142 if request.method=='POST':
1155 if request.user.is_staff:
1143 if request.user.is_staff:
1156 conf.delete()
1144 conf.delete()
1157 return redirect('url_dev_confs')
1145 return redirect('url_dev_confs')
1158
1146
1159 messages.error(request, 'Not enough permission to delete this object')
1147 messages.error(request, 'Not enough permission to delete this object')
1160 return redirect(conf.get_absolute_url())
1148 return redirect(conf.get_absolute_url())
1161
1149
1162 kwargs = {
1150 kwargs = {
1163 'title': 'Delete',
1151 'title': 'Delete',
1164 'suptitle': 'Experiment',
1152 'suptitle': 'Experiment',
1165 'object': conf,
1153 'object': conf,
1166 'previous': conf.get_absolute_url(),
1154 'previous': conf.get_absolute_url(),
1167 'delete': True
1155 'delete': True
1168 }
1156 }
1169
1157
1170 return render(request, 'confirm.html', kwargs)
1158 return render(request, 'confirm.html', kwargs)
1171
1159
1172
1160
1173 def sidebar(**kwargs):
1161 def sidebar(**kwargs):
1174
1162
1175 side_data = {}
1163 side_data = {}
1176
1164
1177 conf = kwargs.get('conf', None)
1165 conf = kwargs.get('conf', None)
1178 experiment = kwargs.get('experiment', None)
1166 experiment = kwargs.get('experiment', None)
1179
1167
1180 if not experiment:
1168 if not experiment:
1181 experiment = conf.experiment
1169 experiment = conf.experiment
1182
1170
1183 if experiment:
1171 if experiment:
1184 side_data['experiment'] = experiment
1172 side_data['experiment'] = experiment
1185 campaign = experiment.campaign_set.all()
1173 campaign = experiment.campaign_set.all()
1186 if campaign:
1174 if campaign:
1187 side_data['campaign'] = campaign[0]
1175 side_data['campaign'] = campaign[0]
1188 experiments = campaign[0].experiments.all()
1176 experiments = campaign[0].experiments.all()
1189 else:
1177 else:
1190 experiments = [experiment]
1178 experiments = [experiment]
1191 configurations = experiment.configuration_set.filter(type=0)
1179 configurations = experiment.configuration_set.filter(type=0)
1192 side_data['side_experiments'] = experiments
1180 side_data['side_experiments'] = experiments
1193 side_data['side_configurations'] = configurations
1181 side_data['side_configurations'] = configurations
1194
1182
1195 return side_data
1183 return side_data
1196
1184
1197
1185
1198 def operation(request, id_camp=None):
1186 def operation(request, id_camp=None):
1199
1187
1200 if not id_camp:
1188 if not id_camp:
1201 campaigns = Campaign.objects.all().order_by('-start_date')
1189 campaigns = Campaign.objects.all().order_by('-start_date')
1202
1190
1203 if not campaigns:
1191 if not campaigns:
1204 kwargs = {}
1192 kwargs = {}
1205 kwargs['title'] = 'No Campaigns'
1193 kwargs['title'] = 'No Campaigns'
1206 kwargs['suptitle'] = 'Empty'
1194 kwargs['suptitle'] = 'Empty'
1207 return render(request, 'operation.html', kwargs)
1195 return render(request, 'operation.html', kwargs)
1208
1196
1209 id_camp = campaigns[0].id
1197 id_camp = campaigns[0].id
1210
1198
1211 campaign = get_object_or_404(Campaign, pk = id_camp)
1199 campaign = get_object_or_404(Campaign, pk = id_camp)
1212
1200
1213 if request.method=='GET':
1201 if request.method=='GET':
1214 form = OperationForm(initial={'campaign': campaign.id}, length = 5)
1202 form = OperationForm(initial={'campaign': campaign.id}, length = 5)
1215
1203
1216 if request.method=='POST':
1204 if request.method=='POST':
1217 form = OperationForm(request.POST, initial={'campaign':campaign.id}, length = 5)
1205 form = OperationForm(request.POST, initial={'campaign':campaign.id}, length = 5)
1218
1206
1219 if form.is_valid():
1207 if form.is_valid():
1220 return redirect('url_operation', id_camp=campaign.id)
1208 return redirect('url_operation', id_camp=campaign.id)
1221 #locations = Location.objects.filter(experiment__campaign__pk = campaign.id).distinct()
1209 #locations = Location.objects.filter(experiment__campaign__pk = campaign.id).distinct()
1222 experiments = Experiment.objects.filter(campaign__pk=campaign.id)
1210 experiments = Experiment.objects.filter(campaign__pk=campaign.id)
1223 #for exs in experiments:
1211 #for exs in experiments:
1224 # exs.get_status()
1212 # exs.get_status()
1225 locations= Location.objects.filter(experiment=experiments).distinct()
1213 locations= Location.objects.filter(experiment=experiments).distinct()
1226 #experiments = [Experiment.objects.filter(location__pk=location.id).filter(campaign__pk=campaign.id) for location in locations]
1214 #experiments = [Experiment.objects.filter(location__pk=location.id).filter(campaign__pk=campaign.id) for location in locations]
1227 kwargs = {}
1215 kwargs = {}
1228 #---Campaign
1216 #---Campaign
1229 kwargs['campaign'] = campaign
1217 kwargs['campaign'] = campaign
1230 kwargs['campaign_keys'] = ['name', 'start_date', 'end_date', 'tags', 'description']
1218 kwargs['campaign_keys'] = ['name', 'start_date', 'end_date', 'tags', 'description']
1231 #---Experiment
1219 #---Experiment
1232 keys = ['id', 'name', 'start_time', 'end_time', 'status']
1220 keys = ['id', 'name', 'start_time', 'end_time', 'status']
1233 kwargs['experiment_keys'] = keys[1:]
1221 kwargs['experiment_keys'] = keys[1:]
1234 kwargs['experiments'] = experiments
1222 kwargs['experiments'] = experiments
1235 #---Radar
1223 #---Radar
1236 kwargs['locations'] = locations
1224 kwargs['locations'] = locations
1237 #---Else
1225 #---Else
1238 kwargs['title'] = 'Campaign'
1226 kwargs['title'] = 'Campaign'
1239 kwargs['suptitle'] = campaign.name
1227 kwargs['suptitle'] = campaign.name
1240 kwargs['form'] = form
1228 kwargs['form'] = form
1241 kwargs['button'] = 'Search'
1229 kwargs['button'] = 'Search'
1242 kwargs['details'] = True
1230 kwargs['details'] = True
1243 kwargs['search_button'] = True
1231 kwargs['search_button'] = True
1244
1232
1245 return render(request, 'operation.html', kwargs)
1233 return render(request, 'operation.html', kwargs)
1246
1234
1247
1235
1248 def operation_search(request, id_camp=None):
1236 def operation_search(request, id_camp=None):
1249
1237
1250
1238
1251 if not id_camp:
1239 if not id_camp:
1252 campaigns = Campaign.objects.all().order_by('-start_date')
1240 campaigns = Campaign.objects.all().order_by('-start_date')
1253
1241
1254 if not campaigns:
1242 if not campaigns:
1255 return render(request, 'operation.html', {})
1243 return render(request, 'operation.html', {})
1256
1244
1257 id_camp = campaigns[0].id
1245 id_camp = campaigns[0].id
1258 campaign = get_object_or_404(Campaign, pk = id_camp)
1246 campaign = get_object_or_404(Campaign, pk = id_camp)
1259
1247
1260 if request.method=='GET':
1248 if request.method=='GET':
1261 form = OperationSearchForm(initial={'campaign': campaign.id})
1249 form = OperationSearchForm(initial={'campaign': campaign.id})
1262
1250
1263 if request.method=='POST':
1251 if request.method=='POST':
1264 form = OperationSearchForm(request.POST, initial={'campaign':campaign.id})
1252 form = OperationSearchForm(request.POST, initial={'campaign':campaign.id})
1265
1253
1266 if form.is_valid():
1254 if form.is_valid():
1267 return redirect('url_operation', id_camp=campaign.id)
1255 return redirect('url_operation', id_camp=campaign.id)
1268
1256
1269 #locations = Location.objects.filter(experiment__campaign__pk = campaign.id).distinct()
1257 #locations = Location.objects.filter(experiment__campaign__pk = campaign.id).distinct()
1270 experiments = Experiment.objects.filter(campaign__pk=campaign.id)
1258 experiments = Experiment.objects.filter(campaign__pk=campaign.id)
1271 #for exs in experiments:
1259 #for exs in experiments:
1272 # exs.get_status()
1260 # exs.get_status()
1273 locations= Location.objects.filter(experiment=experiments).distinct()
1261 locations= Location.objects.filter(experiment=experiments).distinct()
1274 form = OperationSearchForm(initial={'campaign': campaign.id})
1262 form = OperationSearchForm(initial={'campaign': campaign.id})
1275
1263
1276 kwargs = {}
1264 kwargs = {}
1277 #---Campaign
1265 #---Campaign
1278 kwargs['campaign'] = campaign
1266 kwargs['campaign'] = campaign
1279 kwargs['campaign_keys'] = ['name', 'start_date', 'end_date', 'tags', 'description']
1267 kwargs['campaign_keys'] = ['name', 'start_date', 'end_date', 'tags', 'description']
1280 #---Experiment
1268 #---Experiment
1281 keys = ['id', 'name', 'start_time', 'end_time', 'status']
1269 keys = ['id', 'name', 'start_time', 'end_time', 'status']
1282 kwargs['experiment_keys'] = keys[1:]
1270 kwargs['experiment_keys'] = keys[1:]
1283 kwargs['experiments'] = experiments
1271 kwargs['experiments'] = experiments
1284 #---Radar
1272 #---Radar
1285 kwargs['locations'] = locations
1273 kwargs['locations'] = locations
1286 #---Else
1274 #---Else
1287 kwargs['title'] = 'Campaign'
1275 kwargs['title'] = 'Campaign'
1288 kwargs['suptitle'] = campaign.name
1276 kwargs['suptitle'] = campaign.name
1289 kwargs['form'] = form
1277 kwargs['form'] = form
1290 kwargs['button'] = 'Select'
1278 kwargs['button'] = 'Select'
1291 kwargs['details'] = True
1279 kwargs['details'] = True
1292 kwargs['search_button'] = False
1280 kwargs['search_button'] = False
1293
1281
1294 return render(request, 'operation.html', kwargs)
1282 return render(request, 'operation.html', kwargs)
1295
1283
1296
1284
1297 def radar_play(request, id_camp, id_radar):
1285 def radar_play(request, id_camp, id_radar):
1298 campaign = get_object_or_404(Campaign, pk = id_camp)
1286 campaign = get_object_or_404(Campaign, pk = id_camp)
1299 radar = get_object_or_404(Location, pk = id_radar)
1287 radar = get_object_or_404(Location, pk = id_radar)
1300 today = datetime.today()
1288 today = datetime.today()
1301 now = today.time()
1289 now = today.time()
1302
1290
1303 #--Clear Old Experiments From RunningExperiment Object
1291 #--Clear Old Experiments From RunningExperiment Object
1304 running_experiment = RunningExperiment.objects.filter(radar=radar)
1292 running_experiment = RunningExperiment.objects.filter(radar=radar)
1305 if running_experiment:
1293 if running_experiment:
1306 running_experiment = running_experiment[0]
1294 running_experiment = running_experiment[0]
1307 running_experiment.running_experiment.clear()
1295 running_experiment.running_experiment.clear()
1308 running_experiment.save()
1296 running_experiment.save()
1309
1297
1310 #--If campaign datetime is ok:
1298 #--If campaign datetime is ok:
1311 if today >= campaign.start_date and today <= campaign.end_date:
1299 if today >= campaign.start_date and today <= campaign.end_date:
1312 experiments = Experiment.objects.filter(campaign=campaign).filter(location=radar)
1300 experiments = Experiment.objects.filter(campaign=campaign).filter(location=radar)
1313 for exp in experiments:
1301 for exp in experiments:
1314 #--If experiment time is ok:
1302 #--If experiment time is ok:
1315 if now >= exp.start_time and now <= exp.end_time:
1303 if now >= exp.start_time and now <= exp.end_time:
1316 configurations = Configuration.objects.filter(experiment = exp)
1304 configurations = Configuration.objects.filter(experiment = exp)
1317 for conf in configurations:
1305 for conf in configurations:
1318 if 'cgs' in conf.device.device_type.name:
1306 if 'cgs' in conf.device.device_type.name:
1319 conf.status_device()
1307 conf.status_device()
1320 else:
1308 else:
1321 answer = conf.start_device()
1309 answer = conf.start_device()
1322 conf.status_device()
1310 conf.status_device()
1323 #--Running Experiment
1311 #--Running Experiment
1324 old_running_experiment = RunningExperiment.objects.filter(radar=radar)
1312 old_running_experiment = RunningExperiment.objects.filter(radar=radar)
1325 #--If RunningExperiment element exists
1313 #--If RunningExperiment element exists
1326 if old_running_experiment:
1314 if old_running_experiment:
1327 old_running_experiment = old_running_experiment[0]
1315 old_running_experiment = old_running_experiment[0]
1328 old_running_experiment.running_experiment.add(exp)
1316 old_running_experiment.running_experiment.add(exp)
1329 old_running_experiment.status = 3
1317 old_running_experiment.status = 3
1330 old_running_experiment.save()
1318 old_running_experiment.save()
1331 #--Create a new Running_Experiment Object
1319 #--Create a new Running_Experiment Object
1332 else:
1320 else:
1333 new_running_experiment = RunningExperiment(
1321 new_running_experiment = RunningExperiment(
1334 radar = radar,
1322 radar = radar,
1335 status = 3,
1323 status = 3,
1336 )
1324 )
1337 new_running_experiment.save()
1325 new_running_experiment.save()
1338 new_running_experiment.running_experiment.add(exp)
1326 new_running_experiment.running_experiment.add(exp)
1339 new_running_experiment.save()
1327 new_running_experiment.save()
1340
1328
1341 if answer:
1329 if answer:
1342 messages.success(request, conf.message)
1330 messages.success(request, conf.message)
1343 exp.status=2
1331 exp.status=2
1344 exp.save()
1332 exp.save()
1345 else:
1333 else:
1346 messages.error(request, conf.message)
1334 messages.error(request, conf.message)
1347 else:
1335 else:
1348 if exp.status == 1 or exp.status == 3:
1336 if exp.status == 1 or exp.status == 3:
1349 exp.status=3
1337 exp.status=3
1350 exp.save()
1338 exp.save()
1351
1339
1352
1340
1353 route = request.META['HTTP_REFERER']
1341 route = request.META['HTTP_REFERER']
1354 route = str(route)
1342 route = str(route)
1355 if 'search' in route:
1343 if 'search' in route:
1356 return HttpResponseRedirect(reverse('url_operation_search', args=[id_camp]))
1344 return HttpResponseRedirect(reverse('url_operation_search', args=[id_camp]))
1357 else:
1345 else:
1358 return HttpResponseRedirect(reverse('url_operation', args=[id_camp]))
1346 return HttpResponseRedirect(reverse('url_operation', args=[id_camp]))
1359
1347
1360
1348
1361 def radar_stop(request, id_camp, id_radar):
1349 def radar_stop(request, id_camp, id_radar):
1362 campaign = get_object_or_404(Campaign, pk = id_camp)
1350 campaign = get_object_or_404(Campaign, pk = id_camp)
1363 radar = get_object_or_404(Location, pk = id_radar)
1351 radar = get_object_or_404(Location, pk = id_radar)
1364 experiments = Experiment.objects.filter(campaign=campaign).filter(location=radar)
1352 experiments = Experiment.objects.filter(campaign=campaign).filter(location=radar)
1365
1353
1366 for exp in experiments:
1354 for exp in experiments:
1367 configurations = Configuration.objects.filter(experiment = exp)
1355 configurations = Configuration.objects.filter(experiment = exp)
1368 for conf in configurations:
1356 for conf in configurations:
1369 if 'cgs' in conf.device.device_type.name:
1357 if 'cgs' in conf.device.device_type.name:
1370 conf.status_device()
1358 conf.status_device()
1371 else:
1359 else:
1372 answer = conf.stop_device()
1360 answer = conf.stop_device()
1373 conf.status_device()
1361 conf.status_device()
1374
1362
1375 if answer:
1363 if answer:
1376 messages.success(request, conf.message)
1364 messages.success(request, conf.message)
1377 exp.status=1
1365 exp.status=1
1378 exp.save()
1366 exp.save()
1379 else:
1367 else:
1380 messages.error(request, conf.message)
1368 messages.error(request, conf.message)
1381
1369
1382
1370
1383 route = request.META['HTTP_REFERER']
1371 route = request.META['HTTP_REFERER']
1384 route = str(route)
1372 route = str(route)
1385 if 'search' in route:
1373 if 'search' in route:
1386 return HttpResponseRedirect(reverse('url_operation_search', args=[id_camp]))
1374 return HttpResponseRedirect(reverse('url_operation_search', args=[id_camp]))
1387 else:
1375 else:
1388 return HttpResponseRedirect(reverse('url_operation', args=[id_camp]))
1376 return HttpResponseRedirect(reverse('url_operation', args=[id_camp]))
1389
1377
1390
1378
1391 def radar_refresh(request, id_camp, id_radar):
1379 def radar_refresh(request, id_camp, id_radar):
1392
1380
1393 campaign = get_object_or_404(Campaign, pk = id_camp)
1381 campaign = get_object_or_404(Campaign, pk = id_camp)
1394 radar = get_object_or_404(Location, pk = id_radar)
1382 radar = get_object_or_404(Location, pk = id_radar)
1395 experiments = Experiment.objects.filter(campaign=campaign).filter(location=radar)
1383 experiments = Experiment.objects.filter(campaign=campaign).filter(location=radar)
1396 for exs in experiments:
1384 for exs in experiments:
1397 exs.get_status()
1385 exs.get_status()
1398
1386
1399 route = request.META['HTTP_REFERER']
1387 route = request.META['HTTP_REFERER']
1400 route = str(route)
1388 route = str(route)
1401 if 'search' in route:
1389 if 'search' in route:
1402 return HttpResponseRedirect(reverse('url_operation_search', args=[id_camp]))
1390 return HttpResponseRedirect(reverse('url_operation_search', args=[id_camp]))
1403 else:
1391 else:
1404 return HttpResponseRedirect(reverse('url_operation', args=[id_camp]))
1392 return HttpResponseRedirect(reverse('url_operation', args=[id_camp]))
1405
1393
General Comments 0
You need to be logged in to leave comments. Login now