##// END OF EJS Templates
main updated...
Fiorella Quino -
r162:100e11c0e8bf
parent child
Show More
@@ -1,612 +1,612
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,'Configured'), #BLUE
18 (1,'Configured'), #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_location', args=[str(self.id)])
78 return reverse('url_location', 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'[{}]: {}'.format(self.device_type.name.upper(),
107 return u'[{}]: {}'.format(self.device_type.name.upper(),
108 self.name)
108 self.name)
109
109
110 def get_status(self):
110 def get_status(self):
111 return self.status
111 return self.status
112
112
113 @property
113 @property
114 def status_color(self):
114 def status_color(self):
115 color = 'muted'
115 color = 'muted'
116 if self.status == 0:
116 if self.status == 0:
117 color = "danger"
117 color = "danger"
118 elif self.status == 1:
118 elif self.status == 1:
119 color = "warning"
119 color = "warning"
120 elif self.status == 2:
120 elif self.status == 2:
121 color = "info"
121 color = "info"
122 elif self.status == 3:
122 elif self.status == 3:
123 color = "success"
123 color = "success"
124
124
125 return color
125 return color
126
126
127 def get_absolute_url(self):
127 def get_absolute_url(self):
128 return reverse('url_device', args=[str(self.id)])
128 return reverse('url_device', args=[str(self.id)])
129
129
130
130
131 class Campaign(models.Model):
131 class Campaign(models.Model):
132
132
133 template = models.BooleanField(default=False)
133 template = models.BooleanField(default=False)
134 name = models.CharField(max_length=60, unique=True)
134 name = models.CharField(max_length=60, unique=True)
135 start_date = models.DateTimeField(blank=True, null=True)
135 start_date = models.DateTimeField(blank=True, null=True)
136 end_date = models.DateTimeField(blank=True, null=True)
136 end_date = models.DateTimeField(blank=True, null=True)
137 tags = models.CharField(max_length=40)
137 tags = models.CharField(max_length=40)
138 description = models.TextField(blank=True, null=True)
138 description = models.TextField(blank=True, null=True)
139 experiments = models.ManyToManyField('Experiment', blank=True)
139 experiments = models.ManyToManyField('Experiment', blank=True)
140
140
141 class Meta:
141 class Meta:
142 db_table = 'db_campaigns'
142 db_table = 'db_campaigns'
143 ordering = ('name',)
143 ordering = ('name',)
144
144
145 def __unicode__(self):
145 def __unicode__(self):
146 if self.template:
146 if self.template:
147 return u'{} (template)'.format(self.name)
147 return u'{} (template)'.format(self.name)
148 else:
148 else:
149 return u'{}'.format(self.name)
149 return u'{}'.format(self.name)
150
150
151
151
152 def parms_to_dict(self):
152 def parms_to_dict(self):
153
153
154 import json
154 import json
155
155
156 parameters = {}
156 parameters = {}
157 exp_parameters = {}
157 exp_parameters = {}
158 experiments = Experiment.objects.filter(campaign = self)
158 experiments = Experiment.objects.filter(campaign = self)
159
159
160 i=1
160 i=1
161 for experiment in experiments:
161 for experiment in experiments:
162 exp_parameters['experiment-'+str(i)] = json.loads(experiment.parms_to_dict())
162 exp_parameters['experiment-'+str(i)] = json.loads(experiment.parms_to_dict())
163 i += 1
163 i += 1
164
164
165
165
166 parameters['experiments'] = exp_parameters
166 parameters['experiments'] = exp_parameters
167 parameters['end_date'] = self.end_date.strftime("%Y-%m-%d")
167 parameters['end_date'] = self.end_date.strftime("%Y-%m-%d")
168 parameters['start_date'] = self.start_date.strftime("%Y-%m-%d")
168 parameters['start_date'] = self.start_date.strftime("%Y-%m-%d")
169 parameters['campaign'] = self.__unicode__()
169 parameters['campaign'] = self.__unicode__()
170 parameters['tags'] =self.tags
170 parameters['tags'] =self.tags
171
171
172 parameters = json.dumps(parameters, indent=2, sort_keys=False)
172 parameters = json.dumps(parameters, indent=2, sort_keys=False)
173
173
174 return parameters
174 return parameters
175
175
176 def import_from_file(self, fp):
176 def import_from_file(self, fp):
177
177
178 import os, json
178 import os, json
179
179
180 parms = {}
180 parms = {}
181
181
182 path, ext = os.path.splitext(fp.name)
182 path, ext = os.path.splitext(fp.name)
183
183
184 if ext == '.json':
184 if ext == '.json':
185 parms = json.load(fp)
185 parms = json.load(fp)
186
186
187 return parms
187 return parms
188
188
189 def dict_to_parms(self, parms, CONF_MODELS):
189 def dict_to_parms(self, parms, CONF_MODELS):
190
190
191 experiments = Experiment.objects.filter(campaign = self)
191 experiments = Experiment.objects.filter(campaign = self)
192 configurations = Configuration.objects.filter(experiment = experiments)
192 configurations = Configuration.objects.filter(experiment = experiments)
193
193
194 if configurations:
194 if configurations:
195 for configuration in configurations:
195 for configuration in configurations:
196 configuration.delete()
196 configuration.delete()
197
197
198 if experiments:
198 if experiments:
199 for experiment in experiments:
199 for experiment in experiments:
200 experiment.delete()
200 experiment.delete()
201
201
202 for parms_exp in parms['experiments']:
202 for parms_exp in parms['experiments']:
203 location = Location.objects.get(name = parms['experiments'][parms_exp]['radar'])
203 location = Location.objects.get(name = parms['experiments'][parms_exp]['radar'])
204 new_exp = Experiment(
204 new_exp = Experiment(
205 name = parms['experiments'][parms_exp]['experiment'],
205 name = parms['experiments'][parms_exp]['experiment'],
206 location = location,
206 location = location,
207 start_time = parms['experiments'][parms_exp]['start_time'],
207 start_time = parms['experiments'][parms_exp]['start_time'],
208 end_time = parms['experiments'][parms_exp]['end_time'],
208 end_time = parms['experiments'][parms_exp]['end_time'],
209 )
209 )
210 new_exp.save()
210 new_exp.save()
211 new_exp.dict_to_parms(parms['experiments'][parms_exp],CONF_MODELS)
211 new_exp.dict_to_parms(parms['experiments'][parms_exp],CONF_MODELS)
212 new_exp.save()
212 new_exp.save()
213
213
214 self.name = parms['campaign']
214 self.name = parms['campaign']
215 self.start_date = parms['start_date']
215 self.start_date = parms['start_date']
216 self.end_date = parms['end_date']
216 self.end_date = parms['end_date']
217 self.tags = parms['tags']
217 self.tags = parms['tags']
218 self.experiments.add(new_exp)
218 self.experiments.add(new_exp)
219 self.save()
219 self.save()
220
220
221 return self
221 return self
222
222
223 def get_absolute_url(self):
223 def get_absolute_url(self):
224 return reverse('url_campaign', args=[str(self.id)])
224 return reverse('url_campaign', args=[str(self.id)])
225
225
226 def get_absolute_url_edit(self):
226 def get_absolute_url_edit(self):
227 return reverse('url_edit_campaign', args=[str(self.id)])
227 return reverse('url_edit_campaign', args=[str(self.id)])
228
228
229 def get_absolute_url_export(self):
229 def get_absolute_url_export(self):
230 return reverse('url_export_campaign', args=[str(self.id)])
230 return reverse('url_export_campaign', args=[str(self.id)])
231
231
232 def get_absolute_url_import(self):
232 def get_absolute_url_import(self):
233 return reverse('url_import_campaign', args=[str(self.id)])
233 return reverse('url_import_campaign', args=[str(self.id)])
234
234
235
235
236
236
237 class RunningExperiment(models.Model):
237 class RunningExperiment(models.Model):
238 radar = models.OneToOneField('Location', on_delete=models.CASCADE)
238 radar = models.OneToOneField('Location', on_delete=models.CASCADE)
239 running_experiment = models.ManyToManyField('Experiment', blank = True)
239 running_experiment = models.ManyToManyField('Experiment', blank = True)
240 status = models.PositiveSmallIntegerField(default=0, choices=RADAR_STATES)
240 status = models.PositiveSmallIntegerField(default=0, choices=RADAR_STATES)
241
241
242
242
243 class Experiment(models.Model):
243 class Experiment(models.Model):
244
244
245 template = models.BooleanField(default=False)
245 template = models.BooleanField(default=False)
246 name = models.CharField(max_length=40, default='', unique=True)
246 name = models.CharField(max_length=40, default='', unique=True)
247 location = models.ForeignKey('Location', null=True, blank=True, on_delete=models.CASCADE)
247 location = models.ForeignKey('Location', null=True, blank=True, on_delete=models.CASCADE)
248 start_time = models.TimeField(default='00:00:00')
248 start_time = models.TimeField(default='00:00:00')
249 end_time = models.TimeField(default='23:59:59')
249 end_time = models.TimeField(default='23:59:59')
250 status = models.PositiveSmallIntegerField(default=0, choices=EXP_STATES)
250 status = models.PositiveSmallIntegerField(default=0, choices=EXP_STATES)
251
251
252 class Meta:
252 class Meta:
253 db_table = 'db_experiments'
253 db_table = 'db_experiments'
254 ordering = ('template', 'name')
254 ordering = ('template', 'name')
255
255
256 def __unicode__(self):
256 def __unicode__(self):
257 if self.template:
257 if self.template:
258 return u'%s (template)' % (self.name)
258 return u'%s (template)' % (self.name)
259 else:
259 else:
260 return u'%s' % (self.name)
260 return u'%s' % (self.name)
261
261
262 @property
262 @property
263 def radar_system(self):
263 def radar_system(self):
264 return self.location
264 return self.location
265
265
266 def clone(self, **kwargs):
266 def clone(self, **kwargs):
267
267
268 confs = Configuration.objects.filter(experiment=self, type=0)
268 confs = Configuration.objects.filter(experiment=self, type=0)
269 self.pk = None
269 self.pk = None
270 self.name = '{} [{:%Y/%m/%d}]'.format(self.name, datetime.now())
270 self.name = '{} [{:%Y/%m/%d}]'.format(self.name, datetime.now())
271 for attr, value in kwargs.items():
271 for attr, value in kwargs.items():
272 setattr(self, attr, value)
272 setattr(self, attr, value)
273
273
274 self.save()
274 self.save()
275
275
276 for conf in confs:
276 for conf in confs:
277 conf.clone(experiment=self, template=False)
277 conf.clone(experiment=self, template=False)
278
278
279 return self
279 return self
280
280
281 def get_status(self):
281 def get_status(self):
282 configurations = Configuration.objects.filter(experiment=self)
282 configurations = Configuration.objects.filter(experiment=self)
283 exp_status=[]
283 exp_status=[]
284 for conf in configurations:
284 for conf in configurations:
285 print conf.status_device()
285 print conf.status_device()
286 exp_status.append(conf.status_device())
286 exp_status.append(conf.status_device())
287
287
288 if not exp_status: #No Configuration
288 if not exp_status: #No Configuration
289 self.status = 4
289 self.status = 4
290 self.save()
290 self.save()
291 return
291 return
292
292
293 total = 1
293 total = 1
294 for e_s in exp_status:
294 for e_s in exp_status:
295 total = total*e_s
295 total = total*e_s
296
296
297 if total == 0: #Error
297 if total == 0: #Error
298 status = 0
298 status = 0
299 elif total == (3**len(exp_status)): #Running
299 elif total == (3**len(exp_status)): #Running
300 status = 2
300 status = 2
301 else:
301 else:
302 status = 1 #Configurated
302 status = 1 #Configurated
303
303
304 self.status = status
304 self.status = status
305 self.save()
305 self.save()
306
306
307 def status_color(self):
307 def status_color(self):
308 color = 'muted'
308 color = 'muted'
309 if self.status == 0:
309 if self.status == 0:
310 color = "danger"
310 color = "danger"
311 elif self.status == 1:
311 elif self.status == 1:
312 color = "info"
312 color = "info"
313 elif self.status == 2:
313 elif self.status == 2:
314 color = "success"
314 color = "success"
315 elif self.status == 3:
315 elif self.status == 3:
316 color = "warning"
316 color = "warning"
317
317
318 return color
318 return color
319
319
320 def get_absolute_url(self):
320 def get_absolute_url(self):
321 return reverse('url_experiment', args=[str(self.id)])
321 return reverse('url_experiment', args=[str(self.id)])
322
322
323 def parms_to_dict(self):
323 def parms_to_dict(self):
324
324
325 import json
325 import json
326
326
327 configurations = Configuration.objects.filter(experiment=self)
327 configurations = Configuration.objects.filter(experiment=self)
328 conf_parameters = {}
328 conf_parameters = {}
329 parameters={}
329 parameters={}
330
330
331 for configuration in configurations:
331 for configuration in configurations:
332 if 'cgs' in configuration.device.device_type.name:
332 if 'cgs' in configuration.device.device_type.name:
333 conf_parameters['cgs'] = configuration.parms_to_dict()
333 conf_parameters['cgs'] = configuration.parms_to_dict()
334 if 'dds' in configuration.device.device_type.name:
334 if 'dds' in configuration.device.device_type.name:
335 conf_parameters['dds'] = configuration.parms_to_dict()
335 conf_parameters['dds'] = configuration.parms_to_dict()
336 if 'rc' in configuration.device.device_type.name:
336 if 'rc' in configuration.device.device_type.name:
337 conf_parameters['rc'] = configuration.parms_to_dict()
337 conf_parameters['rc'] = configuration.parms_to_dict()
338 if 'jars' in configuration.device.device_type.name:
338 if 'jars' in configuration.device.device_type.name:
339 conf_parameters['jars'] = configuration.parms_to_dict()
339 conf_parameters['jars'] = configuration.parms_to_dict()
340 if 'usrp' in configuration.device.device_type.name:
340 if 'usrp' in configuration.device.device_type.name:
341 conf_parameters['usrp'] = configuration.parms_to_dict()
341 conf_parameters['usrp'] = configuration.parms_to_dict()
342 if 'abs' in configuration.device.device_type.name:
342 if 'abs' in configuration.device.device_type.name:
343 conf_parameters['abs'] = configuration.parms_to_dict()
343 conf_parameters['abs'] = configuration.parms_to_dict()
344
344
345 parameters['configurations'] = conf_parameters
345 parameters['configurations'] = conf_parameters
346 parameters['end_time'] = self.end_time.strftime("%H:%M:%S")
346 parameters['end_time'] = self.end_time.strftime("%H:%M:%S")
347 parameters['start_time'] = self.start_time.strftime("%H:%M:%S")
347 parameters['start_time'] = self.start_time.strftime("%H:%M:%S")
348 parameters['radar'] = self.radar_system.name
348 parameters['radar'] = self.radar_system.name
349 parameters['experiment'] = self.name
349 parameters['experiment'] = self.name
350 parameters = json.dumps(parameters, indent=2)
350 parameters = json.dumps(parameters, indent=2)
351
351
352 return parameters
352 return parameters
353
353
354 def import_from_file(self, fp):
354 def import_from_file(self, fp):
355
355
356 import os, json
356 import os, json
357
357
358 parms = {}
358 parms = {}
359
359
360 path, ext = os.path.splitext(fp.name)
360 path, ext = os.path.splitext(fp.name)
361
361
362 if ext == '.json':
362 if ext == '.json':
363 parms = json.load(fp)
363 parms = json.load(fp)
364
364
365 return parms
365 return parms
366
366
367 def dict_to_parms(self, parms, CONF_MODELS):
367 def dict_to_parms(self, parms, CONF_MODELS):
368
368
369 configurations = Configuration.objects.filter(experiment=self)
369 configurations = Configuration.objects.filter(experiment=self)
370
370
371 if configurations:
371 if configurations:
372 for configuration in configurations:
372 for configuration in configurations:
373 configuration.delete()
373 configuration.delete()
374
374
375 for conf_type in parms['configurations']:
375 for conf_type in parms['configurations']:
376 #--For ABS Device:
376 #--For ABS Device:
377 #--For USRP Device:
377 #--For USRP Device:
378 #--For JARS Device:
378 #--For JARS Device:
379 if conf_type == 'jars':
379 if conf_type == 'jars':
380 device = get_object_or_404(Device, pk=parms['configurations']['jars']['device_id'])
380 device = get_object_or_404(Device, pk=parms['configurations']['jars']['device_id'])
381 DevConfModel = CONF_MODELS[conf_type]
381 DevConfModel = CONF_MODELS[conf_type]
382 confjars_form = DevConfModel(
382 confjars_form = DevConfModel(
383 experiment = self,
383 experiment = self,
384 name = 'JARS',
384 name = 'JARS',
385 device=device,
385 device=device,
386 )
386 )
387 confjars_form.dict_to_parms(parms['configurations']['jars'])
387 confjars_form.dict_to_parms(parms['configurations']['jars'])
388 confjars_form.save()
388 confjars_form.save()
389 #--For RC Device:
389 #--For RC Device:
390 if conf_type == 'rc':
390 if conf_type == 'rc':
391 device = get_object_or_404(Device, pk=parms['configurations']['rc']['device_id'])
391 device = get_object_or_404(Device, pk=parms['configurations']['rc']['device_id'])
392 DevConfModel = CONF_MODELS[conf_type]
392 DevConfModel = CONF_MODELS[conf_type]
393 confrc_form = DevConfModel(
393 confrc_form = DevConfModel(
394 experiment = self,
394 experiment = self,
395 name = 'RC',
395 name = 'RC',
396 device=device,
396 device=device,
397 )
397 )
398 confrc_form.dict_to_parms(parms['configurations']['rc'])
398 confrc_form.dict_to_parms(parms['configurations']['rc'])
399 confrc_form.save()
399 confrc_form.save()
400 #--For DDS Device:
400 #--For DDS Device:
401 if conf_type == 'dds':
401 if conf_type == 'dds':
402 device = get_object_or_404(Device, pk=parms['configurations']['dds']['device_id'])
402 device = get_object_or_404(Device, pk=parms['configurations']['dds']['device_id'])
403 DevConfModel = CONF_MODELS[conf_type]
403 DevConfModel = CONF_MODELS[conf_type]
404 confdds_form = DevConfModel(
404 confdds_form = DevConfModel(
405 experiment = self,
405 experiment = self,
406 name = 'DDS',
406 name = 'DDS',
407 device=device,
407 device=device,
408 )
408 )
409 confdds_form.dict_to_parms(parms['configurations']['dds'])
409 confdds_form.dict_to_parms(parms['configurations']['dds'])
410 confdds_form.save()
410 confdds_form.save()
411 #--For CGS Device:
411 #--For CGS Device:
412 if conf_type == 'cgs':
412 if conf_type == 'cgs':
413 device = get_object_or_404(Device, pk=parms['configurations']['cgs']['device_id'])
413 device = get_object_or_404(Device, pk=parms['configurations']['cgs']['device_id'])
414 DevConfModel = CONF_MODELS[conf_type]
414 DevConfModel = CONF_MODELS[conf_type]
415 confcgs_form = DevConfModel(
415 confcgs_form = DevConfModel(
416 experiment = self,
416 experiment = self,
417 name = 'CGS',
417 name = 'CGS',
418 device=device,
418 device=device,
419 )
419 )
420 confcgs_form.dict_to_parms(parms['configurations']['cgs'])
420 confcgs_form.dict_to_parms(parms['configurations']['cgs'])
421 confcgs_form.save()
421 confcgs_form.save()
422
422
423 location = Location.objects.get(name = parms['radar'])
423 location = Location.objects.get(name = parms['radar'])
424 self.name = parms['experiment']
424 self.name = parms['experiment']
425 self.location = location
425 self.location = location
426 self.start_time = parms['start_time']
426 self.start_time = parms['start_time']
427 self.end_time = parms['end_time']
427 self.end_time = parms['end_time']
428 self.save()
428 self.save()
429
429
430 return self
430 return self
431
431
432 def get_absolute_url_edit(self):
432 def get_absolute_url_edit(self):
433 return reverse('url_edit_experiment', args=[str(self.id)])
433 return reverse('url_edit_experiment', args=[str(self.id)])
434
434
435 def get_absolute_url_import(self):
435 def get_absolute_url_import(self):
436 return reverse('url_import_experiment', args=[str(self.id)])
436 return reverse('url_import_experiment', args=[str(self.id)])
437
437
438 def get_absolute_url_export(self):
438 def get_absolute_url_export(self):
439 return reverse('url_export_experiment', args=[str(self.id)])
439 return reverse('url_export_experiment', args=[str(self.id)])
440
440
441
441
442 class Configuration(PolymorphicModel):
442 class Configuration(PolymorphicModel):
443
443
444 template = models.BooleanField(default=False)
444 template = models.BooleanField(default=False)
445
445
446 name = models.CharField(verbose_name="Configuration Name", max_length=40, default='')
446 name = models.CharField(verbose_name="Configuration Name", max_length=40, default='')
447
447
448 experiment = models.ForeignKey('Experiment', verbose_name='Experiment', null=True, blank=True, on_delete=models.CASCADE)
448 experiment = models.ForeignKey('Experiment', verbose_name='Experiment', null=True, blank=True, on_delete=models.CASCADE)
449 device = models.ForeignKey('Device', verbose_name='Device', null=True, on_delete=models.CASCADE)
449 device = models.ForeignKey('Device', verbose_name='Device', null=True, on_delete=models.CASCADE)
450
450
451 type = models.PositiveSmallIntegerField(default=0, choices=CONF_TYPES)
451 type = models.PositiveSmallIntegerField(default=0, choices=CONF_TYPES)
452
452
453 created_date = models.DateTimeField(auto_now_add=True)
453 created_date = models.DateTimeField(auto_now_add=True)
454 programmed_date = models.DateTimeField(auto_now=True)
454 programmed_date = models.DateTimeField(auto_now=True)
455
455
456 parameters = models.TextField(default='{}')
456 parameters = models.TextField(default='{}')
457
457
458 message = ""
458 message = ""
459
459
460 class Meta:
460 class Meta:
461 db_table = 'db_configurations'
461 db_table = 'db_configurations'
462
462
463 def __unicode__(self):
463 def __unicode__(self):
464
464
465 device = '{}:'.format(self.device.device_type.name.upper())
465 device = '{}:'.format(self.device.device_type.name.upper())
466
466
467 if 'mix' in self._meta.get_all_field_names():
467 if 'mix' in self._meta.get_all_field_names():
468 if self.mix:
468 if self.mix:
469 device = '{} MIXED:'.format(self.device.device_type.name.upper())
469 device = '{} MIXED:'.format(self.device.device_type.name.upper())
470
470
471 if self.template:
471 if self.template:
472 return u'{} {} (template)'.format(device, self.name)
472 return u'{} {} (template)'.format(device, self.name)
473 else:
473 else:
474 return u'{} {}'.format(device, self.name)
474 return u'{} {}'.format(device, self.name)
475
475
476 def clone(self, **kwargs):
476 def clone(self, **kwargs):
477
477
478 self.pk = None
478 self.pk = None
479 self.id = None
479 self.id = None
480 for attr, value in kwargs.items():
480 for attr, value in kwargs.items():
481 setattr(self, attr, value)
481 setattr(self, attr, value)
482
482
483 self.save()
483 self.save()
484
484
485 return self
485 return self
486
486
487 def parms_to_dict(self):
487 def parms_to_dict(self):
488
488
489 parameters = {}
489 parameters = {}
490
490
491 for key in self.__dict__.keys():
491 for key in self.__dict__.keys():
492 parameters[key] = getattr(self, key)
492 parameters[key] = getattr(self, key)
493
493
494 return parameters
494 return parameters
495
495
496 def parms_to_text(self):
496 def parms_to_text(self):
497
497
498 raise NotImplementedError, "This method should be implemented in %s Configuration model" %str(self.device.device_type.name).upper()
498 raise NotImplementedError, "This method should be implemented in %s Configuration model" %str(self.device.device_type.name).upper()
499
499
500 return ''
500 return ''
501
501
502 def parms_to_binary(self):
502 def parms_to_binary(self):
503
503
504 raise NotImplementedError, "This method should be implemented in %s Configuration model" %str(self.device.device_type.name).upper()
504 raise NotImplementedError, "This method should be implemented in %s Configuration model" %str(self.device.device_type.name).upper()
505
505
506 return ''
506 return ''
507
507
508 def dict_to_parms(self, parameters):
508 def dict_to_parms(self, parameters):
509
509
510 if type(parameters) != type({}):
510 if type(parameters) != type({}):
511 return
511 return
512
512
513 for key in parameters.keys():
513 for key in parameters.keys():
514 setattr(self, key, parameters[key])
514 setattr(self, key, parameters[key])
515
515
516 def export_to_file(self, format="json"):
516 def export_to_file(self, format="json"):
517
517
518 import json
518 import json
519
519
520 content_type = ''
520 content_type = ''
521
521
522 if format == 'text':
522 if format == 'text':
523 content_type = 'text/plain'
523 content_type = 'text/plain'
524 filename = '%s_%s.%s' %(self.device.device_type.name, self.name, self.device.device_type.name)
524 filename = '%s_%s.%s' %(self.device.device_type.name, self.name, self.device.device_type.name)
525 content = self.parms_to_text()
525 content = self.parms_to_text()
526
526
527 if format == 'binary':
527 if format == 'binary':
528 content_type = 'application/octet-stream'
528 content_type = 'application/octet-stream'
529 filename = '%s_%s.bin' %(self.device.device_type.name, self.name)
529 filename = '%s_%s.bin' %(self.device.device_type.name, self.name)
530 content = self.parms_to_binary()
530 content = self.parms_to_binary()
531
531
532 if not content_type:
532 if not content_type:
533 content_type = 'application/json'
533 content_type = 'application/json'
534 filename = '%s_%s.json' %(self.device.device_type.name, self.name)
534 filename = '%s_%s.json' %(self.device.device_type.name, self.name)
535 content = json.dumps(self.parms_to_dict(), indent=2)
535 content = json.dumps(self.parms_to_dict(), indent=2)
536
536
537 fields = {'content_type':content_type,
537 fields = {'content_type':content_type,
538 'filename':filename,
538 'filename':filename,
539 'content':content
539 'content':content
540 }
540 }
541
541
542 return fields
542 return fields
543
543
544 def import_from_file(self, fp):
544 def import_from_file(self, fp):
545
545
546 import os, json
546 import os, json
547
547
548 parms = {}
548 parms = {}
549
549
550 path, ext = os.path.splitext(fp.name)
550 path, ext = os.path.splitext(fp.name)
551
551
552 if ext == '.json':
552 if ext == '.json':
553 parms = json.load(fp)
553 parms = json.load(fp)
554
554
555 return parms
555 return parms
556
556
557 def status_device(self):
557 def status_device(self):
558
558
559 raise NotImplementedError, "This method should be implemented in %s Configuration model" %str(self.device.device_type.name).upper()
559 raise NotImplementedError, "This method should be implemented in %s Configuration model" %str(self.device.device_type.name).upper()
560
560
561 return None
561 return None
562
562
563 def stop_device(self):
563 def stop_device(self):
564
564
565 raise NotImplementedError, "This method should be implemented in %s Configuration model" %str(self.device.device_type.name).upper()
565 raise NotImplementedError, "This method should be implemented in %s Configuration model" %str(self.device.device_type.name).upper()
566
566
567 return None
567 return None
568
568
569 def start_device(self):
569 def start_device(self):
570
570
571 raise NotImplementedError, "This method should be implemented in %s Configuration model" %str(self.device.device_type.name).upper()
571 raise NotImplementedError, "This method should be implemented in %s Configuration model" %str(self.device.device_type.name).upper()
572
572
573 return None
573 return None
574
574
575 def write_device(self, parms):
575 def write_device(self, parms):
576
576
577 raise NotImplementedError, "This method should be implemented in %s Configuration model" %str(self.device.device_type.name).upper()
577 raise NotImplementedError, "This method should be implemented in %s Configuration model" %str(self.device.device_type.name).upper()
578
578
579 return None
579 return None
580
580
581 def read_device(self):
581 def read_device(self):
582
582
583 raise NotImplementedError, "This method should be implemented in %s Configuration model" %str(self.device.device_type.name).upper()
583 raise NotImplementedError, "This method should be implemented in %s Configuration model" %str(self.device.device_type.name).upper()
584
584
585 return None
585 return None
586
586
587 def get_absolute_url(self):
587 def get_absolute_url(self):
588 return reverse('url_%s_conf' % self.device.device_type.name, args=[str(self.id)])
588 return reverse('url_%s_conf' % self.device.device_type.name, args=[str(self.id)])
589
589
590 def get_absolute_url_edit(self):
590 def get_absolute_url_edit(self):
591 return reverse('url_edit_%s_conf' % self.device.device_type.name, args=[str(self.id)])
591 return reverse('url_edit_%s_conf' % self.device.device_type.name, args=[str(self.id)])
592
592
593 def get_absolute_url_import(self):
593 def get_absolute_url_import(self):
594 return reverse('url_import_dev_conf', args=[str(self.id)])
594 return reverse('url_import_dev_conf', args=[str(self.id)])
595
595
596 def get_absolute_url_export(self):
596 def get_absolute_url_export(self):
597 return reverse('url_export_dev_conf', args=[str(self.id)])
597 return reverse('url_export_dev_conf', args=[str(self.id)])
598
598
599 def get_absolute_url_write(self):
599 def get_absolute_url_write(self):
600 return reverse('url_write_dev_conf', args=[str(self.id)])
600 return reverse('url_write_dev_conf', args=[str(self.id)])
601
601
602 def get_absolute_url_read(self):
602 def get_absolute_url_read(self):
603 return reverse('url_read_dev_conf', args=[str(self.id)])
603 return reverse('url_read_dev_conf', args=[str(self.id)])
604
604
605 def get_absolute_url_start(self):
605 def get_absolute_url_start(self):
606 return reverse('url_start_dev_conf', args=[str(self.id)])
606 return reverse('url_start_dev_conf', args=[str(self.id)])
607
607
608 def get_absolute_url_stop(self):
608 def get_absolute_url_stop(self):
609 return reverse('url_stop_dev_conf', args=[str(self.id)])
609 return reverse('url_stop_dev_conf', args=[str(self.id)])
610
610
611 def get_absolute_url_status(self):
611 def get_absolute_url_status(self):
612 return reverse('url_status_dev_conf', args=[str(self.id)]) No newline at end of file
612 return reverse('url_status_dev_conf', args=[str(self.id)])
@@ -1,143 +1,152
1 <!DOCTYPE html>
1 <!DOCTYPE html>
2 {% load static %}
2 {% load static %}
3 <html lang="en">
3 <html lang="en">
4 <head>
4 <head>
5 <meta charset="utf-8">
5 <meta charset="utf-8">
6 <title>{% block title %}Jicamarca Integrated Radar System:::::{% endblock %}</title>
6 <title>{% block title %}Jicamarca Integrated Radar System:::::{% endblock %}</title>
7 <meta name="description" content="">
7 <meta name="description" content="">
8 <meta name="author" content="">
8 <meta name="author" content="">
9 <meta name="viewport" content="width=device-width, initial-scale=1">
9 <meta name="viewport" content="width=device-width, initial-scale=1">
10 {# bootstrap_css #}
10 {# bootstrap_css #}
11 <link href="{% static 'css/bootstrap-flatly.min.css' %}" media="all" rel="stylesheet">
11 <link href="{% static 'css/bootstrap-flatly.min.css' %}" media="all" rel="stylesheet">
12 <style type="text/css">
12 <style type="text/css">
13 body {padding-top: 60px}
13 body {padding-top: 60px}
14 .logo {padding-top: 5px; height: 50px}
14 .logo {padding-top: 5px; height: 50px}
15 .clickable-row {cursor: pointer;}
15 .clickable-row {cursor: pointer;}
16 .col-no-padding { padding-left:0;}
16 .col-no-padding { padding-left:0;}
17 .gi-2x{font-size: 2em;}
17 .gi-2x{font-size: 2em;}
18 .gi-3x{font-size: 3em;}
18 .gi-3x{font-size: 3em;}
19 .gi-4x{font-size: 4em;}
19 .gi-4x{font-size: 4em;}
20 .gi-5x{font-size: 5em;}
20 .gi-5x{font-size: 5em;}
21 </style>
21 </style>
22 <!--[if lt IE 9]>
22 <!--[if lt IE 9]>
23 <script src="//html5shim.googlecode.com/svn/trunk/html5.js"></script>
23 <script src="//html5shim.googlecode.com/svn/trunk/html5.js"></script>
24 <![endif]-->
24 <![endif]-->
25 <script src="{% static 'js/jquery.min.js' %}"></script>
25 <script src="{% static 'js/jquery.min.js' %}"></script>
26 {% block extra-head %}
26 {% block extra-head %}
27 {% endblock %}
27 {% endblock %}
28 </head>
28 </head>
29
29
30 <body>
30 <body>
31
31
32 {% block main_menu %}
32 {% block main_menu %}
33 <nav class="navbar navbar-default navbar-fixed-top" role="banner">
33 <nav class="navbar navbar-default navbar-fixed-top" role="banner">
34 <div class="container-fluid">
34 <div class="container-fluid">
35 <div class="navbar-header">
35 <div class="navbar-header">
36 <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#navigationbar">
36 <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#navigationbar">
37 <span class="sr-only">Toggle navigation</span>
37 <span class="sr-only">Toggle navigation</span>
38 <span class="icon-bar"></span>
38 <span class="icon-bar"></span>
39 <span class="icon-bar"></span>
39 <span class="icon-bar"></span>
40 <span class="icon-bar"></span>
40 <span class="icon-bar"></span>
41 </button>
41 </button>
42 <a class="navbar-brand" href="{% url 'index' %}" style="padding-top:1px"><img class="logo" alt="JRO" src="{% static "images/logo-jro-white-trans.png" %}"></a>
42 <a class="navbar-brand" href="{% url 'index' %}" style="padding-top:1px"><img class="logo" alt="JRO" src="{% static "images/logo-jro-color-trans.png" %}"></a>
43 </div>
43 </div>
44 <div class="collapse navbar-collapse" id="navigationbar">
44 <div class="collapse navbar-collapse" id="navigationbar">
45 <ul class="nav navbar-nav">
45 <ul class="nav navbar-nav">
46 <li class=" dropdown {% block operation-active %}{% endblock %}"><a href="{% url 'url_operation'%}">Operation</a>
46 <li class=" dropdown {% block operation-active %}{% endblock %}"><a href="{% url 'url_operation'%}">Operation</a>
47 </li>
47 </li>
48 <li class=" dropdown {% block new-active %}{% endblock %}">
48 <li class=" dropdown {% block new-active %}{% endblock %}">
49 <a href="#" class="dropdown-toggle" data-toggle="dropdown">New<span class="caret"></span></a>
49 <a href="#" class="dropdown-toggle" data-toggle="dropdown">New<span class="caret"></span></a>
50 <ul class="dropdown-menu" role="menu">
50 <ul class="dropdown-menu" role="menu">
51 <li><a href="{% url 'url_add_campaign' %}">Campaign</a></li>
51 <li><a href="{% url 'url_add_campaign' %}">Campaign</a></li>
52 <li><a href="{% url 'url_add_experiment' %}">Experiment</a></li>
52 <li><a href="{% url 'url_add_experiment' %}">Experiment</a></li>
53 <li><a href="{% url 'url_add_dev_conf' 0%}">Device Configuration</a></li>
53 <li><a href="{% url 'url_add_dev_conf' 0%}">Device Configuration</a></li>
54 <li><a href="{% url 'url_add_device'%}">Device</a></li>
54 <li><a href="{% url 'url_add_device'%}">Device</a></li>
55 <li><a href="{% url 'url_add_location'%}">Radar System</a></li>
55 <li><a href="{% url 'url_add_location'%}">Radar System</a></li>
56 </ul>
56 </ul>
57 </li>
57 </li>
58 <li class=" dropdown {% block search-active %}{% endblock %}">
58 <li class=" dropdown {% block search-active %}{% endblock %}">
59 <a href="#" class="dropdown-toggle" data-toggle="dropdown">Search<span class="caret"></span></a>
59 <a href="#" class="dropdown-toggle" data-toggle="dropdown">Search<span class="caret"></span></a>
60 <ul class="dropdown-menu" role="menu">
60 <ul class="dropdown-menu" role="menu">
61 <li><a href="{% url 'url_campaigns' %}">Campaigns</a></li>
61 <li><a href="{% url 'url_campaigns' %}">Campaigns</a></li>
62 <li><a href="{% url 'url_experiments' %}">Experiments</a></li>
62 <li><a href="{% url 'url_experiments' %}">Experiments</a></li>
63 <li><a href="{% url 'url_dev_confs' %}">Configurations</a></li>
63 <li><a href="{% url 'url_dev_confs' %}">Configurations</a></li>
64 <li><a href="{% url 'url_devices' %}">Devices</a></li>
64 <li><a href="{% url 'url_devices' %}">Devices</a></li>
65 <li><a href="{% url 'url_locations' %}">Radar Systems</a></li>
65 <li><a href="{% url 'url_locations' %}">Radar Systems</a></li>
66 </ul>
66 </ul>
67 </li>
67 </li>
68 </ul>
68 </ul>
69 <ul class="nav navbar-nav navbar-right">
69 <ul class="nav navbar-nav navbar-right">
70 <li class="nav-divider"></li>
70 <li class="nav-divider"></li>
71 {% if user.is_authenticated %}
71 {% if user.is_authenticated %}
72 <li class="dropdown">
72 <li class="dropdown">
73 <a href="#" class="dropdown-toggle" data-toggle="dropdown">Hi {{ user.username }}<span class="caret"></span></a>
73 <a href="#" class="dropdown-toggle" data-toggle="dropdown">Hi {{ user.username }}<span class="caret"></span></a>
74 <ul class="dropdown-menu" role="menu">
74 <ul class="dropdown-menu" role="menu">
75 <li><a href="#">Control Panel</a></li>
75 <li><a href="#">Control Panel</a></li>
76 <li><a href="{% url 'django.contrib.auth.views.logout' %}">Logout</a></li>
76 <li><a href="{% url 'django.contrib.auth.views.logout' %}">Logout</a></li>
77 </ul>
77 </ul>
78 </li>
78 </li>
79 {% else %}
79 {% else %}
80 <li><a href="{% url 'django.contrib.auth.views.login' %}?next={{request.get_full_path}}">Login</a></li>
80 <li><a href="{% url 'django.contrib.auth.views.login' %}?next={{request.get_full_path}}">Login</a></li>
81 {% endif %}
81 {% endif %}
82 </ul>
82 </ul>
83 </div>
83 </div>
84 </div>
84 </div>
85 </nav>
85 </nav>
86 <div style="clear: both;"></div>
86 <div style="clear: both;"></div>
87 {% endblock %}
87 {% endblock %}
88
88
89 <div class="container">
89 <div class="container">
90 <div id="page" class="row" style="min-height:600px">
90 <div id="page" class="row" style="min-height:600px">
91
91
92 <div class="col-md-3 hidden-xs hidden-sm" role="complementary">
92 {% if no_sidebar %}
93 <div class="col-md-0 hidden-xs hidden-sm" role="complementary">
94
95 {% else %}
96 <div class="col-md-3 hidden-xs hidden-sm" role="complementary">
97 {% endif %}
93 <br><br>
98 <br><br>
94 <div id="sidebar">
99 <div id="sidebar">
95 {% block sidebar%}
100 {% block sidebar%}
96 {% endblock %}
101 {% endblock %}
97 </div>
102 </div>
98 </div>
103 </div>
99
104
100 <div class="col-md-9 col-xs-12" role="main">
105 {% if no_sidebar %}
106 <div class="col-md-12 col-xs-12" role="main">
107 {% else %}
108 <div class="col-md-9 col-xs-12" role="main">
109 {% endif %}
101 <div class="page-header">
110 <div class="page-header">
102 <h1>{% block content-title %}{% endblock %} <small>{% block content-suptitle %}{% endblock %}</small></h1>
111 <h1>{% block content-title %}{% endblock %} <small>{% block content-suptitle %}{% endblock %}</small></h1>
103 </div>
112 </div>
104 {% block messages %}
113 {% block messages %}
105 {% if messages %}
114 {% if messages %}
106 {% for message in messages %}
115 {% for message in messages %}
107 <div class="alert alert-{% if message.tags %}{% if 'error' in message.tags %}danger{% else %}{{ message.tags }}{% endif %}{% else %}info{% endif %} alert-dismissible" role="alert">
116 <div class="alert alert-{% if message.tags %}{% if 'error' in message.tags %}danger{% else %}{{ message.tags }}{% endif %}{% else %}info{% endif %} alert-dismissible" role="alert">
108 <button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">&times;</span></button>
117 <button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">&times;</span></button>
109 <strong>{{message.tags|title}}!</strong> {{ message }}
118 <strong>{{message.tags|title}}!</strong> {{ message }}
110 </div>
119 </div>
111 {% endfor %}
120 {% endfor %}
112 {% endif %}
121 {% endif %}
113 {% endblock %}
122 {% endblock %}
114
123
115 {% block content %}
124 {% block content %}
116 {% endblock %}
125 {% endblock %}
117
126
118 </div>
127 </div>
119
128
120 </div><!--/row-->
129
130 </div><!--/row-->
121 </div> <!-- container -->
131 </div> <!-- container -->
122
132
123 <div id="debug">{{debug}}</div>
133 <div id="debug">{{debug}}</div>
124
134
125 {% block footer %}
135 {% block footer %}
126 <footer class="footer">
136 <footer class="footer">
127 <div class="container">
137 <div class="container">
128 <p><hr></p>
138 <p><hr></p>
129 <p>
139 <p>
130 &copy; <a href="http://jro.igp.gob.pe">Jicamarca Radio Observatory</a> - {% now "Y" %}
140 &copy; <a href="http://jro.igp.gob.pe">Jicamarca Radio Observatory</a> - {% now "Y" %}
131 </p>
141 </p>
132 </div>
142 </div>
133 </footer>
143 </footer>
134 {% endblock %}
144 {% endblock %}
135
145
136 {# bootstrap_javascript jquery=True #}
146 {# bootstrap_javascript jquery=True #}
137
147
138 <script src="{% static 'js/bootstrap.min.js' %}"></script>
148 <script src="{% static 'js/bootstrap.min.js' %}"></script>
139 {% block extra-js %}
149 {% block extra-js %}
140 {% endblock%}
150 {% endblock%}
141 </body>
151 </body>
142 </html>
152 </html>
143
General Comments 0
You need to be logged in to leave comments. Login now