import json from django.db import models from access.fields import * from access.models import TenancyObject from app.helpers.merge_software import merge_software from core.mixin.history_save import SaveHistory from itam.models.device_common import DeviceCommonFields, DeviceCommonFieldsName from itam.models.device_models import DeviceModel from itam.models.software import Software, SoftwareVersion from itam.models.operating_system import OperatingSystemVersion from settings.models.app_settings import AppSettings class DeviceType(DeviceCommonFieldsName, SaveHistory): def clean(self): app_settings = AppSettings.objects.get(owner_organization=None) if app_settings.device_type_is_global: self.organization = app_settings.global_organization self.is_global = app_settings.device_type_is_global def __str__(self): return self.name class Device(DeviceCommonFieldsName, SaveHistory): serial_number = models.CharField( verbose_name = 'Serial Number', max_length = 50, default = None, null = True, blank = True, unique = True, ) uuid = models.CharField( verbose_name = 'UUID', max_length = 50, default = None, null = True, blank = True, unique = True, ) device_model = models.ForeignKey( DeviceModel, on_delete=models.CASCADE, default = None, null = True, blank= True ) device_type = models.ForeignKey( DeviceType, on_delete=models.CASCADE, default = None, null = True, blank= True ) inventorydate = models.DateTimeField( verbose_name = 'Last Inventory Date', null = True, blank = True ) def __str__(self): return self.name def get_configuration(self, id): softwares = DeviceSoftware.objects.filter(device=id) config = { "software": [] } host_software = [] group_software = [] for software in softwares: if software.action: if int(software.action) == 1: state = 'present' elif int(software.action) == 0: state = 'absent' software_action = { "name": software.software.slug, "state": state } if software.version: software_action['version'] = software.version.name host_software += [ software_action ] config: dict = config from config_management.models.groups import ConfigGroupHosts if self.id: config_groups = ConfigGroupHosts.objects.filter(host=self.id).order_by('group') for group in config_groups: rendered_config = group.group.render_config() if rendered_config: config.update(json.loads(rendered_config)) rendered_config: dict = json.loads(rendered_config) if 'software' in rendered_config.keys(): group_software = group_software + rendered_config['software'] config['software'] = merge_software(group_software, host_software) return config class DeviceSoftware(DeviceCommonFields, SaveHistory): """ A way for the device owner to configure software to install/remove """ class Meta: ordering = [ '-action', 'software' ] class Actions(models.TextChoices): INSTALL = '1', 'Install' REMOVE = '0', 'Remove' device = models.ForeignKey( Device, on_delete=models.CASCADE, default = None, null = False, blank= False ) software = models.ForeignKey( Software, on_delete=models.CASCADE, default = None, null = False, blank= False ) action = models.CharField( max_length=1, choices=Actions, default=None, null=True, blank = True, ) version = models.ForeignKey( SoftwareVersion, on_delete=models.CASCADE, default = None, null = True, blank= True ) installedversion = models.ForeignKey( SoftwareVersion, related_name = 'installedversion', on_delete=models.CASCADE, default = None, null = True, blank= True ) installed = models.DateTimeField( verbose_name = 'Install Date', null = True, blank = True ) @property def parent_object(self): """ Fetch the parent object """ return self.device class DeviceOperatingSystem(DeviceCommonFields, SaveHistory): device = models.ForeignKey( Device, on_delete = models.CASCADE, default = None, null = False, blank = False, ) operating_system_version = models.ForeignKey( OperatingSystemVersion, verbose_name = 'Operating System/Version', on_delete = models.CASCADE, default = None, null = False, blank = False ) version = models.CharField( verbose_name = 'Installed Version', max_length = 15, null = False, blank = False, ) installdate = models.DateTimeField( verbose_name = 'Install Date', null = True, blank = True, default = None, ) @property def parent_object(self): """ Fetch the parent object """ return self.device