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