##// END OF EJS Templates
Export Campaign. parms_to_dict() (mmain.models)...
Fiorella Quino -
r102:dc4b6d89bb97
parent child
Show More
@@ -1,443 +1,450
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 136
137 137 parameters = {}
138 #experiments = Experiment.objects.filter(campaign = self)
139
140
141 parameters['campaign'] = self.name
138 exp_parameters = {}
139 experiments = Experiment.objects.filter(campaign = self)
140
141 i=1
142 for experiment in experiments:
143 exp_parameters['experiment-'+str(i)] = json.loads(experiment.parms_to_dict())
144 i += 1
145
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")
149 parameters['experimets'] =exp_parameters
150 parameters = json.dumps(parameters, indent=2)
142 151
143 #parameters = json.dumps(parameters, indent=2)
144 parameters = json.dumps(parameters)
145 152 return parameters
146 153
147 154 def get_absolute_url_export(self):
148 155 return reverse('url_export_campaign', args=[str(self.id)])
149 156
150 157
151 158
152 159 class RunningExperiment(models.Model):
153 160 radar = models.OneToOneField('Location', on_delete=models.CASCADE)
154 161 running_experiment = models.ManyToManyField('Experiment', blank = True)
155 162 status = models.PositiveSmallIntegerField(default=0, choices=RADAR_STATES)
156 163
157 164
158 165 class Experiment(models.Model):
159 166
160 167 template = models.BooleanField(default=False)
161 168 location = models.ForeignKey('Location', null=True, blank=True, on_delete=models.CASCADE)
162 169 name = models.CharField(max_length=40, default='', unique=True)
163 170 location = models.ForeignKey('Location', null=True, blank=True, on_delete=models.CASCADE)
164 171 start_time = models.TimeField(default='00:00:00')
165 172 end_time = models.TimeField(default='23:59:59')
166 173 status = models.PositiveSmallIntegerField(default=0, choices=EXP_STATES)
167 174
168 175 class Meta:
169 176 db_table = 'db_experiments'
170 177 ordering = ('template', 'name')
171 178
172 179 def __unicode__(self):
173 180 if self.template:
174 181 return u'%s (template)' % (self.name)
175 182 else:
176 183 return u'%s' % (self.name)
177 184
178 185 @property
179 186 def radar(self):
180 187 return self.location
181 188
182 189 def clone(self, **kwargs):
183 190
184 191 confs = Configuration.objects.filter(experiment=self, type=0)
185 192 self.pk = None
186 193 self.name = '{} [{:%Y/%m/%d}]'.format(self.name, datetime.now())
187 194 for attr, value in kwargs.items():
188 195 setattr(self, attr, value)
189 196
190 197 self.save()
191 198
192 199 for conf in confs:
193 200 conf.clone(experiment=self, template=False)
194 201
195 202 return self
196 203
197 204 def get_status(self):
198 205 configurations = Configuration.objects.filter(experiment=self)
199 206 exp_status=[]
200 207 for conf in configurations:
201 208 print conf.status_device()
202 209 exp_status.append(conf.status_device())
203 210
204 211 if not exp_status: #No Configuration
205 212 self.status = 4
206 213 self.save()
207 214 return
208 215
209 216 total = 1
210 217 for e_s in exp_status:
211 218 total = total*e_s
212 219
213 220 if total == 0: #Error
214 221 status = 0
215 222 elif total == (3**len(exp_status)): #Running
216 223 status = 2
217 224 else:
218 225 status = 1 #Configurated
219 226
220 227 self.status = status
221 228 self.save()
222 229
223 230 def status_color(self):
224 231 color = 'danger'
225 232 if self.status == 0:
226 233 color = "danger"
227 234 elif self.status == 1:
228 235 color = "info"
229 236 elif self.status == 2:
230 237 color = "success"
231 238 elif self.status == 3:
232 239 color = "warning"
233 240 else:
234 241 color = "muted"
235 242
236 243 return color
237 244
238 245 def get_absolute_url(self):
239 246 return reverse('url_experiment', args=[str(self.id)])
240 247
241 248 def parms_to_dict(self):
242 249
243 250 import json
244 251
245 252 configurations = Configuration.objects.filter(experiment=self)
246 253 conf_parameters = {}
247 254 parameters={}
248 255
249 256 for configuration in configurations:
250 257 if 'cgs' in configuration.device.device_type.name:
251 258 conf_parameters['cgs'] = configuration.parms_to_dict()
252 259 if 'dds' in configuration.device.device_type.name:
253 260 conf_parameters['dds'] = configuration.parms_to_dict()
254 261 if 'rc' in configuration.device.device_type.name:
255 262 conf_parameters['rc'] = configuration.parms_to_dict()
256 263 if 'jars' in configuration.device.device_type.name:
257 264 conf_parameters['jars'] = configuration.parms_to_dict()
258 265 if 'usrp' in configuration.device.device_type.name:
259 266 conf_parameters['usrp'] = configuration.parms_to_dict()
260 267 if 'abs' in configuration.device.device_type.name:
261 268 conf_parameters['abs'] = configuration.parms_to_dict()
262 269
263 270 parameters['configurations'] = conf_parameters
264 271 parameters['end_time'] = self.end_time.strftime("%Y-%m-%d")
265 272 parameters['start_time'] = self.start_time.strftime("%Y-%m-%d")
266 273 parameters['radar'] = self.radar.name
267 274 parameters['experiment'] = self.name
268 275 parameters = json.dumps(parameters, indent=2)
269 276 #parameters = json.dumps(parameters)
270 277
271 278 return parameters
272 279
273 280 def get_absolute_url_export(self):
274 281 return reverse('url_export_experiment', args=[str(self.id)])
275 282
276 283
277 284 class Configuration(PolymorphicModel):
278 285
279 286 template = models.BooleanField(default=False)
280 287
281 288 name = models.CharField(verbose_name="Configuration Name", max_length=40, default='')
282 289
283 290 experiment = models.ForeignKey('Experiment', null=True, blank=True, on_delete=models.CASCADE)
284 291 device = models.ForeignKey(Device, on_delete=models.CASCADE)
285 292
286 293 type = models.PositiveSmallIntegerField(default=0, choices=CONF_TYPES)
287 294
288 295 created_date = models.DateTimeField(auto_now_add=True)
289 296 programmed_date = models.DateTimeField(auto_now=True)
290 297
291 298 parameters = models.TextField(default='{}')
292 299
293 300 message = ""
294 301
295 302 class Meta:
296 303 db_table = 'db_configurations'
297 304
298 305 def __unicode__(self):
299 306
300 307 if self.experiment:
301 308 return u'[%s, %s]: %s' % (self.experiment.name,
302 309 self.device.name,
303 310 self.name)
304 311 else:
305 312 return u'%s' % self.device.name
306 313
307 314 def clone(self, **kwargs):
308 315
309 316 self.pk = None
310 317 self.id = None
311 318 for attr, value in kwargs.items():
312 319 setattr(self, attr, value)
313 320
314 321 self.save()
315 322
316 323 return self
317 324
318 325 def parms_to_dict(self):
319 326
320 327 parameters = {}
321 328
322 329 for key in self.__dict__.keys():
323 330 parameters[key] = getattr(self, key)
324 331
325 332 return parameters
326 333
327 334 def parms_to_text(self):
328 335
329 336 raise NotImplementedError, "This method should be implemented in %s Configuration model" %str(self.device.device_type.name).upper()
330 337
331 338 return ''
332 339
333 340 def parms_to_binary(self):
334 341
335 342 raise NotImplementedError, "This method should be implemented in %s Configuration model" %str(self.device.device_type.name).upper()
336 343
337 344 return ''
338 345
339 346 def dict_to_parms(self, parameters):
340 347
341 348 if type(parameters) != type({}):
342 349 return
343 350
344 351 for key in parameters.keys():
345 352 setattr(self, key, parameters[key])
346 353
347 354 def export_to_file(self, format="json"):
348 355
349 356 import json
350 357
351 358 content_type = ''
352 359
353 360 if format == 'text':
354 361 content_type = 'text/plain'
355 362 filename = '%s_%s.%s' %(self.device.device_type.name, self.name, self.device.device_type.name)
356 363 content = self.parms_to_text()
357 364
358 365 if format == 'binary':
359 366 content_type = 'application/octet-stream'
360 367 filename = '%s_%s.bin' %(self.device.device_type.name, self.name)
361 368 content = self.parms_to_binary()
362 369
363 370 if not content_type:
364 371 content_type = 'application/json'
365 372 filename = '%s_%s.json' %(self.device.device_type.name, self.name)
366 373 content = json.dumps(self.parms_to_dict(), indent=2)
367 374
368 375 fields = {'content_type':content_type,
369 376 'filename':filename,
370 377 'content':content
371 378 }
372 379
373 380 return fields
374 381
375 382 def import_from_file(self, fp):
376 383
377 384 import os, json
378 385
379 386 parms = {}
380 387
381 388 path, ext = os.path.splitext(fp.name)
382 389
383 390 if ext == '.json':
384 391 parms = json.load(fp)
385 392
386 393 return parms
387 394
388 395 def status_device(self):
389 396
390 397 raise NotImplementedError, "This method should be implemented in %s Configuration model" %str(self.device.device_type.name).upper()
391 398
392 399 return None
393 400
394 401 def stop_device(self):
395 402
396 403 raise NotImplementedError, "This method should be implemented in %s Configuration model" %str(self.device.device_type.name).upper()
397 404
398 405 return None
399 406
400 407 def start_device(self):
401 408
402 409 raise NotImplementedError, "This method should be implemented in %s Configuration model" %str(self.device.device_type.name).upper()
403 410
404 411 return None
405 412
406 413 def write_device(self, parms):
407 414
408 415 raise NotImplementedError, "This method should be implemented in %s Configuration model" %str(self.device.device_type.name).upper()
409 416
410 417 return None
411 418
412 419 def read_device(self):
413 420
414 421 raise NotImplementedError, "This method should be implemented in %s Configuration model" %str(self.device.device_type.name).upper()
415 422
416 423 return None
417 424
418 425 def get_absolute_url(self):
419 426 return reverse('url_%s_conf' % self.device.device_type.name, args=[str(self.id)])
420 427
421 428 def get_absolute_url_edit(self):
422 429 return reverse('url_edit_%s_conf' % self.device.device_type.name, args=[str(self.id)])
423 430
424 431 def get_absolute_url_import(self):
425 432 return reverse('url_import_dev_conf', args=[str(self.id)])
426 433
427 434 def get_absolute_url_export(self):
428 435 return reverse('url_export_dev_conf', args=[str(self.id)])
429 436
430 437 def get_absolute_url_write(self):
431 438 return reverse('url_write_dev_conf', args=[str(self.id)])
432 439
433 440 def get_absolute_url_read(self):
434 441 return reverse('url_read_dev_conf', args=[str(self.id)])
435 442
436 443 def get_absolute_url_start(self):
437 444 return reverse('url_start_dev_conf', args=[str(self.id)])
438 445
439 446 def get_absolute_url_stop(self):
440 447 return reverse('url_stop_dev_conf', args=[str(self.id)])
441 448
442 449 def get_absolute_url_status(self):
443 450 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