diff --git a/apps/main/models.py b/apps/main/models.py index 0465cab..52fdd35 100644 --- a/apps/main/models.py +++ b/apps/main/models.py @@ -62,7 +62,7 @@ RADAR_STATES = ( (4, 'Scheduled'), ) # Create your models here. - + class Location(models.Model): name = models.CharField(max_length = 30) @@ -70,7 +70,7 @@ class Location(models.Model): class Meta: db_table = 'db_location' - + def __unicode__(self): return u'%s' % self.name @@ -85,15 +85,15 @@ class DeviceType(models.Model): class Meta: db_table = 'db_device_types' - + def __unicode__(self): return u'%s' % self.get_name_display() - + class Device(models.Model): device_type = models.ForeignKey(DeviceType, on_delete=models.CASCADE) location = models.ForeignKey(Location, on_delete=models.CASCADE) - + name = models.CharField(max_length=40, default='') ip_address = models.GenericIPAddressField(protocol='IPv4', default='0.0.0.0') port_address = models.PositiveSmallIntegerField(default=2000) @@ -102,14 +102,14 @@ class Device(models.Model): class Meta: db_table = 'db_devices' - + def __unicode__(self): - return u'[{}]: {}'.format(self.device_type.name.upper(), + return u'[{}]: {}'.format(self.device_type.name.upper(), self.name) - - def get_status(self): + + def get_status(self): return self.status - + @property def status_color(self): color = 'muted' @@ -121,16 +121,16 @@ class Device(models.Model): color = "info" elif self.status == 3: color = "success" - + return color - + def get_absolute_url(self): return reverse('url_device', args=[str(self.id)]) - + class Campaign(models.Model): - template = models.BooleanField(default=False) + template = models.BooleanField(default=False) name = models.CharField(max_length=60, unique=True) start_date = models.DateTimeField(blank=True, null=True) end_date = models.DateTimeField(blank=True, null=True) @@ -141,64 +141,64 @@ class Campaign(models.Model): class Meta: db_table = 'db_campaigns' ordering = ('name',) - + def __unicode__(self): if self.template: return u'{} (template)'.format(self.name) else: return u'{}'.format(self.name) - + def parms_to_dict(self): - + import json - + parameters = {} exp_parameters = {} experiments = Experiment.objects.filter(campaign = self) - + i=1 for experiment in experiments: exp_parameters['experiment-'+str(i)] = json.loads(experiment.parms_to_dict()) i += 1 - - + + parameters['experiments'] = exp_parameters parameters['end_date'] = self.end_date.strftime("%Y-%m-%d") parameters['start_date'] = self.start_date.strftime("%Y-%m-%d") parameters['campaign'] = self.__unicode__() parameters['tags'] =self.tags - + parameters = json.dumps(parameters, indent=2, sort_keys=False) - + return parameters - + def import_from_file(self, fp): - + import os, json - + parms = {} - + path, ext = os.path.splitext(fp.name) - + if ext == '.json': parms = json.load(fp) - + return parms - + def dict_to_parms(self, parms, CONF_MODELS): - + experiments = Experiment.objects.filter(campaign = self) configurations = Configuration.objects.filter(experiment = experiments) - + if configurations: for configuration in configurations: configuration.delete() - + if experiments: for experiment in experiments: experiment.delete() - + for parms_exp in parms['experiments']: location = Location.objects.get(name = parms['experiments'][parms_exp]['radar']) new_exp = Experiment( @@ -210,39 +210,39 @@ class Campaign(models.Model): new_exp.save() new_exp.dict_to_parms(parms['experiments'][parms_exp],CONF_MODELS) new_exp.save() - + self.name = parms['campaign'] self.start_date = parms['start_date'] self.end_date = parms['end_date'] self.tags = parms['tags'] self.experiments.add(new_exp) self.save() - - return self - + + return self + def get_absolute_url(self): return reverse('url_campaign', args=[str(self.id)]) - + def get_absolute_url_edit(self): return reverse('url_edit_campaign', args=[str(self.id)]) - + def get_absolute_url_export(self): return reverse('url_export_campaign', args=[str(self.id)]) - + def get_absolute_url_import(self): return reverse('url_import_campaign', args=[str(self.id)]) - - - + + + class RunningExperiment(models.Model): radar = models.OneToOneField('Location', on_delete=models.CASCADE) running_experiment = models.ManyToManyField('Experiment', blank = True) status = models.PositiveSmallIntegerField(default=0, choices=RADAR_STATES) - - + + class Experiment(models.Model): - template = models.BooleanField(default=False) + template = models.BooleanField(default=False) name = models.CharField(max_length=40, default='', unique=True) location = models.ForeignKey('Location', null=True, blank=True, on_delete=models.CASCADE) start_time = models.TimeField(default='00:00:00') @@ -252,58 +252,58 @@ class Experiment(models.Model): class Meta: db_table = 'db_experiments' ordering = ('template', 'name') - + def __unicode__(self): if self.template: return u'%s (template)' % (self.name) else: return u'%s' % (self.name) - + @property def radar_system(self): return self.location - + def clone(self, **kwargs): - + confs = Configuration.objects.filter(experiment=self, type=0) self.pk = None self.name = '{} [{:%Y/%m/%d}]'.format(self.name, datetime.now()) for attr, value in kwargs.items(): setattr(self, attr, value) - + self.save() - + for conf in confs: conf.clone(experiment=self, template=False) - - return self - + + return self + def get_status(self): configurations = Configuration.objects.filter(experiment=self) exp_status=[] for conf in configurations: print conf.status_device() exp_status.append(conf.status_device()) - + if not exp_status: #No Configuration self.status = 4 self.save() - return - + return + total = 1 for e_s in exp_status: total = total*e_s - + if total == 0: #Error status = 0 elif total == (3**len(exp_status)): #Running status = 2 else: status = 1 #Configurated - + self.status = status self.save() - + def status_color(self): color = 'muted' if self.status == 0: @@ -314,20 +314,20 @@ class Experiment(models.Model): color = "success" elif self.status == 3: color = "warning" - + return color - + def get_absolute_url(self): return reverse('url_experiment', args=[str(self.id)]) - + def parms_to_dict(self): - + import json - + configurations = Configuration.objects.filter(experiment=self) conf_parameters = {} parameters={} - + for configuration in configurations: if 'cgs' in configuration.device.device_type.name: conf_parameters['cgs'] = configuration.parms_to_dict() @@ -341,37 +341,37 @@ class Experiment(models.Model): conf_parameters['usrp'] = configuration.parms_to_dict() if 'abs' in configuration.device.device_type.name: conf_parameters['abs'] = configuration.parms_to_dict() - + parameters['configurations'] = conf_parameters parameters['end_time'] = self.end_time.strftime("%H:%M:%S") parameters['start_time'] = self.start_time.strftime("%H:%M:%S") parameters['radar'] = self.radar_system.name parameters['experiment'] = self.name parameters = json.dumps(parameters, indent=2) - + return parameters - + def import_from_file(self, fp): - + import os, json - + parms = {} - + path, ext = os.path.splitext(fp.name) - + if ext == '.json': parms = json.load(fp) - + return parms - + def dict_to_parms(self, parms, CONF_MODELS): - + configurations = Configuration.objects.filter(experiment=self) - + if configurations: for configuration in configurations: configuration.delete() - + for conf_type in parms['configurations']: #--For ABS Device: #--For USRP Device: @@ -419,194 +419,194 @@ class Experiment(models.Model): ) confcgs_form.dict_to_parms(parms['configurations']['cgs']) confcgs_form.save() - - location = Location.objects.get(name = parms['radar']) + + location = Location.objects.get(name = parms['radar']) self.name = parms['experiment'] self.location = location self.start_time = parms['start_time'] self.end_time = parms['end_time'] self.save() - + return self - + def get_absolute_url_edit(self): return reverse('url_edit_experiment', args=[str(self.id)]) - + def get_absolute_url_import(self): return reverse('url_import_experiment', args=[str(self.id)]) - + def get_absolute_url_export(self): return reverse('url_export_experiment', args=[str(self.id)]) - - + + class Configuration(PolymorphicModel): template = models.BooleanField(default=False) - + name = models.CharField(verbose_name="Configuration Name", max_length=40, default='') - + experiment = models.ForeignKey('Experiment', verbose_name='Experiment', null=True, blank=True, on_delete=models.CASCADE) device = models.ForeignKey('Device', verbose_name='Device', null=True, on_delete=models.CASCADE) - + type = models.PositiveSmallIntegerField(default=0, choices=CONF_TYPES) - + created_date = models.DateTimeField(auto_now_add=True) programmed_date = models.DateTimeField(auto_now=True) - + parameters = models.TextField(default='{}') - + message = "" - + class Meta: db_table = 'db_configurations' - + def __unicode__(self): - + device = '{}:'.format(self.device.device_type.name.upper()) - + if 'mix' in self._meta.get_all_field_names(): if self.mix: - device = '{} MIXED:'.format(self.device.device_type.name.upper()) - + device = '{} MIXED:'.format(self.device.device_type.name.upper()) + if self.template: return u'{} {} (template)'.format(device, self.name) else: return u'{} {}'.format(device, self.name) def clone(self, **kwargs): - + self.pk = None self.id = None for attr, value in kwargs.items(): setattr(self, attr, value) - - self.save() + + self.save() return self - + def parms_to_dict(self): - + parameters = {} - + for key in self.__dict__.keys(): parameters[key] = getattr(self, key) - + return parameters - + def parms_to_text(self): - + raise NotImplementedError, "This method should be implemented in %s Configuration model" %str(self.device.device_type.name).upper() - + return '' - + def parms_to_binary(self): - + raise NotImplementedError, "This method should be implemented in %s Configuration model" %str(self.device.device_type.name).upper() - + return '' - + def dict_to_parms(self, parameters): - + if type(parameters) != type({}): return - + for key in parameters.keys(): setattr(self, key, parameters[key]) - + def export_to_file(self, format="json"): - + import json - + content_type = '' - + if format == 'text': content_type = 'text/plain' filename = '%s_%s.%s' %(self.device.device_type.name, self.name, self.device.device_type.name) content = self.parms_to_text() - + if format == 'binary': content_type = 'application/octet-stream' filename = '%s_%s.bin' %(self.device.device_type.name, self.name) content = self.parms_to_binary() - + if not content_type: content_type = 'application/json' filename = '%s_%s.json' %(self.device.device_type.name, self.name) content = json.dumps(self.parms_to_dict(), indent=2) - + fields = {'content_type':content_type, 'filename':filename, 'content':content } - + return fields - + def import_from_file(self, fp): - + import os, json - + parms = {} - + path, ext = os.path.splitext(fp.name) - + if ext == '.json': parms = json.load(fp) - + return parms - + def status_device(self): - + raise NotImplementedError, "This method should be implemented in %s Configuration model" %str(self.device.device_type.name).upper() - + return None - + def stop_device(self): - + raise NotImplementedError, "This method should be implemented in %s Configuration model" %str(self.device.device_type.name).upper() - + return None - + def start_device(self): - + raise NotImplementedError, "This method should be implemented in %s Configuration model" %str(self.device.device_type.name).upper() - + return None - + def write_device(self, parms): - + raise NotImplementedError, "This method should be implemented in %s Configuration model" %str(self.device.device_type.name).upper() - + return None - + def read_device(self): - + raise NotImplementedError, "This method should be implemented in %s Configuration model" %str(self.device.device_type.name).upper() - + return None - + def get_absolute_url(self): return reverse('url_%s_conf' % self.device.device_type.name, args=[str(self.id)]) - + def get_absolute_url_edit(self): return reverse('url_edit_%s_conf' % self.device.device_type.name, args=[str(self.id)]) - + def get_absolute_url_import(self): return reverse('url_import_dev_conf', args=[str(self.id)]) - + def get_absolute_url_export(self): return reverse('url_export_dev_conf', args=[str(self.id)]) - + def get_absolute_url_write(self): return reverse('url_write_dev_conf', args=[str(self.id)]) - + def get_absolute_url_read(self): return reverse('url_read_dev_conf', args=[str(self.id)]) - + def get_absolute_url_start(self): return reverse('url_start_dev_conf', args=[str(self.id)]) - + def get_absolute_url_stop(self): return reverse('url_stop_dev_conf', args=[str(self.id)]) - + def get_absolute_url_status(self): - return reverse('url_status_dev_conf', args=[str(self.id)]) \ No newline at end of file + return reverse('url_status_dev_conf', args=[str(self.id)]) diff --git a/apps/main/templates/base.html b/apps/main/templates/base.html index 57752b0..2c87e2e 100644 --- a/apps/main/templates/base.html +++ b/apps/main/templates/base.html @@ -21,7 +21,7 @@ + {% block extra-head %} {% endblock %} @@ -39,32 +39,32 @@ - + @@ -89,15 +89,24 @@
-