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