##// END OF EJS Templates
Export Campaign. parms_to_dict() (mmain.models)...
Fiorella Quino -
r103:d7a9dc407c1e
parent child
Show More
@@ -1,450 +1,453
1 1 from django.shortcuts import render, redirect, get_object_or_404, HttpResponse
2 2 from datetime import datetime
3 3
4 4 from django.db import models
5 5 from polymorphic import PolymorphicModel
6 6
7 7 from django.core.urlresolvers import reverse
8 8
9 9 CONF_STATES = (
10 10 (0, 'Disconnected'),
11 11 (1, 'Connected'),
12 12 (2, 'Running'),
13 13 )
14 14
15 15 EXP_STATES = (
16 16 (0,'Error'), #RED
17 17 (1,'Configurated'), #BLUE
18 18 (2,'Running'), #GREEN
19 19 (3,'Waiting'), #YELLOW
20 20 (4,'Not Configured'), #WHITE
21 21 )
22 22
23 23 CONF_TYPES = (
24 24 (0, 'Active'),
25 25 (1, 'Historical'),
26 26 )
27 27
28 28 DEV_STATES = (
29 29 (0, 'No connected'),
30 30 (1, 'Connected'),
31 31 (2, 'Configured'),
32 32 (3, 'Running'),
33 33 )
34 34
35 35 DEV_TYPES = (
36 36 ('', 'Select a device type'),
37 37 ('rc', 'Radar Controller'),
38 38 ('dds', 'Direct Digital Synthesizer'),
39 39 ('jars', 'Jicamarca Radar Acquisition System'),
40 40 ('usrp', 'Universal Software Radio Peripheral'),
41 41 ('cgs', 'Clock Generator System'),
42 42 ('abs', 'Automatic Beam Switching'),
43 43 )
44 44
45 45 DEV_PORTS = {
46 46 'rc' : 2000,
47 47 'dds' : 2000,
48 48 'jars' : 2000,
49 49 'usrp' : 2000,
50 50 'cgs' : 8080,
51 51 'abs' : 8080
52 52 }
53 53
54 54 RADAR_STATES = (
55 55 (0, 'No connected'),
56 56 (1, 'Connected'),
57 57 (2, 'Configured'),
58 58 (3, 'Running'),
59 59 (4, 'Scheduled'),
60 60 )
61 61 # Create your models here.
62 62
63 63 class Location(models.Model):
64 64
65 65 name = models.CharField(max_length = 30)
66 66 description = models.TextField(blank=True, null=True)
67 67
68 68 class Meta:
69 69 db_table = 'db_location'
70 70
71 71 def __unicode__(self):
72 72 return u'%s' % self.name
73 73
74 74 def get_absolute_url(self):
75 75 return reverse('url_device', args=[str(self.id)])
76 76
77 77
78 78 class DeviceType(models.Model):
79 79
80 80 name = models.CharField(max_length = 10, choices = DEV_TYPES, default = 'rc')
81 81 description = models.TextField(blank=True, null=True)
82 82
83 83 class Meta:
84 84 db_table = 'db_device_types'
85 85
86 86 def __unicode__(self):
87 87 return u'%s' % self.get_name_display()
88 88
89 89 class Device(models.Model):
90 90
91 91 device_type = models.ForeignKey(DeviceType, on_delete=models.CASCADE)
92 92 location = models.ForeignKey(Location, on_delete=models.CASCADE)
93 93
94 94 name = models.CharField(max_length=40, default='')
95 95 ip_address = models.GenericIPAddressField(protocol='IPv4', default='0.0.0.0')
96 96 port_address = models.PositiveSmallIntegerField(default=2000)
97 97 description = models.TextField(blank=True, null=True)
98 98 status = models.PositiveSmallIntegerField(default=0, choices=DEV_STATES)
99 99
100 100 class Meta:
101 101 db_table = 'db_devices'
102 102
103 103 def __unicode__(self):
104 104 return u'%s | %s' % (self.name, self.ip_address)
105 105
106 106 def get_status(self):
107 107 return self.status
108 108
109 109 def get_absolute_url(self):
110 110 return reverse('url_device', args=[str(self.id)])
111 111
112 112
113 113 class Campaign(models.Model):
114 114
115 115 template = models.BooleanField(default=False)
116 116 name = models.CharField(max_length=60, unique=True)
117 117 start_date = models.DateTimeField(blank=True, null=True)
118 118 end_date = models.DateTimeField(blank=True, null=True)
119 119 tags = models.CharField(max_length=40)
120 120 description = models.TextField(blank=True, null=True)
121 121 experiments = models.ManyToManyField('Experiment', blank=True)
122 122
123 123 class Meta:
124 124 db_table = 'db_campaigns'
125 125 ordering = ('name',)
126 126
127 127 def __unicode__(self):
128 128 return u'%s' % (self.name)
129 129
130 130 def get_absolute_url(self):
131 131 return reverse('url_campaign', args=[str(self.id)])
132 132
133 133 def parms_to_dict(self):
134 134
135 135 import json
136 from collections import OrderedDict
136 137
137 138 parameters = {}
138 139 exp_parameters = {}
139 140 experiments = Experiment.objects.filter(campaign = self)
140 141
141 142 i=1
142 143 for experiment in experiments:
143 144 exp_parameters['experiment-'+str(i)] = json.loads(experiment.parms_to_dict())
144 145 i += 1
145 146
146 parameters['campaign'] = self.__unicode__()
147 parameters['start_date'] = self.start_date.strftime("%Y-%m-%d")
148 parameters['end_date'] = self.end_date.strftime("%Y-%m-%d")
147
149 148 parameters['experimets'] =exp_parameters
150 parameters = json.dumps(parameters, indent=2)
149 parameters['end_date'] = self.end_date.strftime("%Y-%m-%d")
150 parameters['start_date'] = self.start_date.strftime("%Y-%m-%d")
151 parameters['campaign'] = self.__unicode__()
152
153 parameters = json.dumps(parameters, indent=2, sort_keys=False)
151 154
152 155 return parameters
153 156
154 157 def get_absolute_url_export(self):
155 158 return reverse('url_export_campaign', args=[str(self.id)])
156 159
157 160
158 161
159 162 class RunningExperiment(models.Model):
160 163 radar = models.OneToOneField('Location', on_delete=models.CASCADE)
161 164 running_experiment = models.ManyToManyField('Experiment', blank = True)
162 165 status = models.PositiveSmallIntegerField(default=0, choices=RADAR_STATES)
163 166
164 167
165 168 class Experiment(models.Model):
166 169
167 170 template = models.BooleanField(default=False)
168 171 location = models.ForeignKey('Location', null=True, blank=True, on_delete=models.CASCADE)
169 172 name = models.CharField(max_length=40, default='', unique=True)
170 173 location = models.ForeignKey('Location', null=True, blank=True, on_delete=models.CASCADE)
171 174 start_time = models.TimeField(default='00:00:00')
172 175 end_time = models.TimeField(default='23:59:59')
173 176 status = models.PositiveSmallIntegerField(default=0, choices=EXP_STATES)
174 177
175 178 class Meta:
176 179 db_table = 'db_experiments'
177 180 ordering = ('template', 'name')
178 181
179 182 def __unicode__(self):
180 183 if self.template:
181 184 return u'%s (template)' % (self.name)
182 185 else:
183 186 return u'%s' % (self.name)
184 187
185 188 @property
186 189 def radar(self):
187 190 return self.location
188 191
189 192 def clone(self, **kwargs):
190 193
191 194 confs = Configuration.objects.filter(experiment=self, type=0)
192 195 self.pk = None
193 196 self.name = '{} [{:%Y/%m/%d}]'.format(self.name, datetime.now())
194 197 for attr, value in kwargs.items():
195 198 setattr(self, attr, value)
196 199
197 200 self.save()
198 201
199 202 for conf in confs:
200 203 conf.clone(experiment=self, template=False)
201 204
202 205 return self
203 206
204 207 def get_status(self):
205 208 configurations = Configuration.objects.filter(experiment=self)
206 209 exp_status=[]
207 210 for conf in configurations:
208 211 print conf.status_device()
209 212 exp_status.append(conf.status_device())
210 213
211 214 if not exp_status: #No Configuration
212 215 self.status = 4
213 216 self.save()
214 217 return
215 218
216 219 total = 1
217 220 for e_s in exp_status:
218 221 total = total*e_s
219 222
220 223 if total == 0: #Error
221 224 status = 0
222 225 elif total == (3**len(exp_status)): #Running
223 226 status = 2
224 227 else:
225 228 status = 1 #Configurated
226 229
227 230 self.status = status
228 231 self.save()
229 232
230 233 def status_color(self):
231 234 color = 'danger'
232 235 if self.status == 0:
233 236 color = "danger"
234 237 elif self.status == 1:
235 238 color = "info"
236 239 elif self.status == 2:
237 240 color = "success"
238 241 elif self.status == 3:
239 242 color = "warning"
240 243 else:
241 244 color = "muted"
242 245
243 246 return color
244 247
245 248 def get_absolute_url(self):
246 249 return reverse('url_experiment', args=[str(self.id)])
247 250
248 251 def parms_to_dict(self):
249 252
250 253 import json
251 254
252 255 configurations = Configuration.objects.filter(experiment=self)
253 256 conf_parameters = {}
254 257 parameters={}
255 258
256 259 for configuration in configurations:
257 260 if 'cgs' in configuration.device.device_type.name:
258 261 conf_parameters['cgs'] = configuration.parms_to_dict()
259 262 if 'dds' in configuration.device.device_type.name:
260 263 conf_parameters['dds'] = configuration.parms_to_dict()
261 264 if 'rc' in configuration.device.device_type.name:
262 265 conf_parameters['rc'] = configuration.parms_to_dict()
263 266 if 'jars' in configuration.device.device_type.name:
264 267 conf_parameters['jars'] = configuration.parms_to_dict()
265 268 if 'usrp' in configuration.device.device_type.name:
266 269 conf_parameters['usrp'] = configuration.parms_to_dict()
267 270 if 'abs' in configuration.device.device_type.name:
268 271 conf_parameters['abs'] = configuration.parms_to_dict()
269 272
270 273 parameters['configurations'] = conf_parameters
271 274 parameters['end_time'] = self.end_time.strftime("%Y-%m-%d")
272 275 parameters['start_time'] = self.start_time.strftime("%Y-%m-%d")
273 276 parameters['radar'] = self.radar.name
274 277 parameters['experiment'] = self.name
275 278 parameters = json.dumps(parameters, indent=2)
276 279 #parameters = json.dumps(parameters)
277 280
278 281 return parameters
279 282
280 283 def get_absolute_url_export(self):
281 284 return reverse('url_export_experiment', args=[str(self.id)])
282 285
283 286
284 287 class Configuration(PolymorphicModel):
285 288
286 289 template = models.BooleanField(default=False)
287 290
288 291 name = models.CharField(verbose_name="Configuration Name", max_length=40, default='')
289 292
290 293 experiment = models.ForeignKey('Experiment', null=True, blank=True, on_delete=models.CASCADE)
291 294 device = models.ForeignKey(Device, on_delete=models.CASCADE)
292 295
293 296 type = models.PositiveSmallIntegerField(default=0, choices=CONF_TYPES)
294 297
295 298 created_date = models.DateTimeField(auto_now_add=True)
296 299 programmed_date = models.DateTimeField(auto_now=True)
297 300
298 301 parameters = models.TextField(default='{}')
299 302
300 303 message = ""
301 304
302 305 class Meta:
303 306 db_table = 'db_configurations'
304 307
305 308 def __unicode__(self):
306 309
307 310 if self.experiment:
308 311 return u'[%s, %s]: %s' % (self.experiment.name,
309 312 self.device.name,
310 313 self.name)
311 314 else:
312 315 return u'%s' % self.device.name
313 316
314 317 def clone(self, **kwargs):
315 318
316 319 self.pk = None
317 320 self.id = None
318 321 for attr, value in kwargs.items():
319 322 setattr(self, attr, value)
320 323
321 324 self.save()
322 325
323 326 return self
324 327
325 328 def parms_to_dict(self):
326 329
327 330 parameters = {}
328 331
329 332 for key in self.__dict__.keys():
330 333 parameters[key] = getattr(self, key)
331 334
332 335 return parameters
333 336
334 337 def parms_to_text(self):
335 338
336 339 raise NotImplementedError, "This method should be implemented in %s Configuration model" %str(self.device.device_type.name).upper()
337 340
338 341 return ''
339 342
340 343 def parms_to_binary(self):
341 344
342 345 raise NotImplementedError, "This method should be implemented in %s Configuration model" %str(self.device.device_type.name).upper()
343 346
344 347 return ''
345 348
346 349 def dict_to_parms(self, parameters):
347 350
348 351 if type(parameters) != type({}):
349 352 return
350 353
351 354 for key in parameters.keys():
352 355 setattr(self, key, parameters[key])
353 356
354 357 def export_to_file(self, format="json"):
355 358
356 359 import json
357 360
358 361 content_type = ''
359 362
360 363 if format == 'text':
361 364 content_type = 'text/plain'
362 365 filename = '%s_%s.%s' %(self.device.device_type.name, self.name, self.device.device_type.name)
363 366 content = self.parms_to_text()
364 367
365 368 if format == 'binary':
366 369 content_type = 'application/octet-stream'
367 370 filename = '%s_%s.bin' %(self.device.device_type.name, self.name)
368 371 content = self.parms_to_binary()
369 372
370 373 if not content_type:
371 374 content_type = 'application/json'
372 375 filename = '%s_%s.json' %(self.device.device_type.name, self.name)
373 376 content = json.dumps(self.parms_to_dict(), indent=2)
374 377
375 378 fields = {'content_type':content_type,
376 379 'filename':filename,
377 380 'content':content
378 381 }
379 382
380 383 return fields
381 384
382 385 def import_from_file(self, fp):
383 386
384 387 import os, json
385 388
386 389 parms = {}
387 390
388 391 path, ext = os.path.splitext(fp.name)
389 392
390 393 if ext == '.json':
391 394 parms = json.load(fp)
392 395
393 396 return parms
394 397
395 398 def status_device(self):
396 399
397 400 raise NotImplementedError, "This method should be implemented in %s Configuration model" %str(self.device.device_type.name).upper()
398 401
399 402 return None
400 403
401 404 def stop_device(self):
402 405
403 406 raise NotImplementedError, "This method should be implemented in %s Configuration model" %str(self.device.device_type.name).upper()
404 407
405 408 return None
406 409
407 410 def start_device(self):
408 411
409 412 raise NotImplementedError, "This method should be implemented in %s Configuration model" %str(self.device.device_type.name).upper()
410 413
411 414 return None
412 415
413 416 def write_device(self, parms):
414 417
415 418 raise NotImplementedError, "This method should be implemented in %s Configuration model" %str(self.device.device_type.name).upper()
416 419
417 420 return None
418 421
419 422 def read_device(self):
420 423
421 424 raise NotImplementedError, "This method should be implemented in %s Configuration model" %str(self.device.device_type.name).upper()
422 425
423 426 return None
424 427
425 428 def get_absolute_url(self):
426 429 return reverse('url_%s_conf' % self.device.device_type.name, args=[str(self.id)])
427 430
428 431 def get_absolute_url_edit(self):
429 432 return reverse('url_edit_%s_conf' % self.device.device_type.name, args=[str(self.id)])
430 433
431 434 def get_absolute_url_import(self):
432 435 return reverse('url_import_dev_conf', args=[str(self.id)])
433 436
434 437 def get_absolute_url_export(self):
435 438 return reverse('url_export_dev_conf', args=[str(self.id)])
436 439
437 440 def get_absolute_url_write(self):
438 441 return reverse('url_write_dev_conf', args=[str(self.id)])
439 442
440 443 def get_absolute_url_read(self):
441 444 return reverse('url_read_dev_conf', args=[str(self.id)])
442 445
443 446 def get_absolute_url_start(self):
444 447 return reverse('url_start_dev_conf', args=[str(self.id)])
445 448
446 449 def get_absolute_url_stop(self):
447 450 return reverse('url_stop_dev_conf', args=[str(self.id)])
448 451
449 452 def get_absolute_url_status(self):
450 453 return reverse('url_status_dev_conf', args=[str(self.id)]) No newline at end of file
General Comments 0
You need to be logged in to leave comments. Login now