class ServiceSettings(quotas_models.ExtendableQuotaModelMixin, core_models.UuidMixin, core_models.NameMixin, core_models.StateMixin, TagMixin, LoggableMixin): class Meta: verbose_name = "Service settings" verbose_name_plural = "Service settings" class Permissions(object): customer_path = 'customer' extra_query = dict(shared=True) customer = models.ForeignKey(Customer, verbose_name=_('organization'), related_name='service_settings', blank=True, null=True) backend_url = core_fields.BackendURLField(max_length=200, blank=True, null=True) username = models.CharField(max_length=100, blank=True, null=True) password = models.CharField(max_length=100, blank=True, null=True) domain = models.CharField(max_length=200, blank=True, null=True) token = models.CharField(max_length=255, blank=True, null=True) certificate = models.FileField(upload_to='certs', blank=True, null=True, validators=[FileTypeValidator( allowed_types=[ 'application/x-pem-file', 'application/x-x509-ca-cert', 'text/plain'], allowed_extensions=['pem'])]) type = models.CharField(max_length=255, db_index=True, validators=[validate_service_type]) options = JSONField(default={}, help_text=_('Extra options'), blank=True) geolocations = JSONField(default=[], blank=True, help_text=_('List of latitudes and longitudes. For example: ' '[{"latitude": 123, "longitude": 345}, {"latitude": 456, "longitude": 678}]')) shared = models.BooleanField(default=False, help_text=_('Anybody can use it')) homepage = models.URLField(max_length=255, blank=True) terms_of_services = models.URLField(max_length=255, blank=True) certifications = models.ManyToManyField(to='ServiceCertification', related_name='service_settings', blank=True) tracker = FieldTracker() # service settings scope - VM that contains service content_type = models.ForeignKey(ContentType, null=True) object_id = models.PositiveIntegerField(null=True) scope = GenericForeignKey('content_type', 'object_id') objects = ServiceSettingsManager('scope') def get_backend(self, **kwargs): return SupportedServices.get_service_backend(self.type)(self, **kwargs) def get_option(self, name): options = self.options or {} if name in options: return options.get(name) else: defaults = self.get_backend().DEFAULTS return defaults.get(name) def __str__(self): return '%s (%s)' % (self.name, self.get_type_display()) def get_log_fields(self): return ('uuid', 'name', 'customer') def _get_log_context(self, entity_name): context = super(ServiceSettings, self)._get_log_context(entity_name) context['service_settings_type'] = self.get_type_display() return context def get_type_display(self): return SupportedServices.get_name_for_type(self.type) def get_services(self): service_model = SupportedServices.get_service_models()[self.type]['service'] return service_model.objects.filter(settings=self) def unlink_descendants(self): for service in self.get_services(): service.unlink_descendants() service.delete()
class ServiceSettings( quotas_models.ExtendableQuotaModelMixin, core_models.UuidMixin, core_models.NameMixin, core_models.StateMixin, TagMixin, StructureLoggableMixin, ): class Meta: verbose_name = "Service settings" verbose_name_plural = "Service settings" ordering = ('name', ) class Permissions: customer_path = 'customer' build_query = build_service_settings_query customer = models.ForeignKey( on_delete=models.CASCADE, to=Customer, verbose_name=_('organization'), related_name='service_settings', blank=True, null=True, ) backend_url = core_fields.BackendURLField(max_length=200, blank=True, null=True) username = models.CharField(max_length=100, blank=True, null=True) password = models.CharField(max_length=100, blank=True, null=True) domain = models.CharField(max_length=200, blank=True, null=True) token = models.CharField(max_length=255, blank=True, null=True) certificate = models.FileField(upload_to='certs', blank=True, null=True, validators=[CertificateValidator]) type = models.CharField(max_length=255, db_index=True, validators=[validate_service_type]) options = JSONField(default=dict, help_text=_('Extra options'), blank=True) shared = models.BooleanField(default=False, help_text=_('Anybody can use it')) terms_of_services = models.URLField(max_length=255, blank=True) tracker = FieldTracker() # service settings scope - VM that contains service content_type = models.ForeignKey(on_delete=models.CASCADE, to=ContentType, null=True) object_id = models.PositiveIntegerField(null=True) scope = GenericForeignKey('content_type', 'object_id') objects = ServiceSettingsManager('scope') is_active = models.BooleanField( default=True, help_text= 'Information about inactive service settings will not be updated in the background', ) def get_backend(self, **kwargs): return SupportedServices.get_service_backend(self.type)(self, **kwargs) def get_option(self, name): options = self.options or {} if name in options: return options.get(name) else: defaults = self.get_backend().DEFAULTS return defaults.get(name) def __str__(self): return '%s (%s)' % (self.name, self.type) def get_log_fields(self): return ('uuid', 'name', 'customer') def _get_log_context(self, entity_name): context = super(ServiceSettings, self)._get_log_context(entity_name) context['service_settings_type'] = self.type return context def get_type_display(self): return self.type