feat(itam): Change model to inherit from Centurion for DeviceSoftware model

ref:#817 #802
This commit is contained in:
2025-06-11 19:10:26 +09:30
parent fbc2bf081e
commit 48cf7b56c4
3 changed files with 126 additions and 78 deletions

View File

@ -0,0 +1,101 @@
# Generated by Django 5.1.9 on 2025-06-11 09:15
import access.models.tenancy_abstract
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("access", "0016_remove_tenant_slug_alter_tenant_manager_and_more"),
("itam", "0017_remove_deviceoperatingsystem_is_global_and_more"),
]
operations = [
migrations.RemoveField(
model_name="devicesoftware",
name="is_global",
),
migrations.AlterField(
model_name="devicesoftware",
name="action",
field=models.IntegerField(
blank=True,
choices=[(1, "Install"), (0, "Remove")],
help_text="Action to perform",
null=True,
verbose_name="Action",
),
),
migrations.AlterField(
model_name="devicesoftware",
name="id",
field=models.AutoField(
help_text="ID of the item",
primary_key=True,
serialize=False,
unique=True,
verbose_name="ID",
),
),
migrations.AlterField(
model_name="devicesoftware",
name="installedversion",
field=models.ForeignKey(
blank=True,
help_text="Version that is installed",
null=True,
on_delete=django.db.models.deletion.PROTECT,
related_name="installedversion",
to="itam.softwareversion",
verbose_name="Installed Version",
),
),
migrations.AlterField(
model_name="devicesoftware",
name="model_notes",
field=models.TextField(
blank=True,
help_text="Tid bits of information",
null=True,
verbose_name="Notes",
),
),
migrations.AlterField(
model_name="devicesoftware",
name="organization",
field=models.ForeignKey(
help_text="Tenant this belongs to",
on_delete=django.db.models.deletion.CASCADE,
related_name="+",
to="access.tenant",
validators=[
access.models.tenancy_abstract.TenancyAbstractModel.validatate_organization_exists
],
verbose_name="Tenant",
),
),
migrations.AlterField(
model_name="devicesoftware",
name="software",
field=models.ForeignKey(
help_text="Software Name",
on_delete=django.db.models.deletion.PROTECT,
to="itam.software",
verbose_name="Software",
),
),
migrations.AlterField(
model_name="devicesoftware",
name="version",
field=models.ForeignKey(
blank=True,
help_text="Version to install",
null=True,
on_delete=django.db.models.deletion.PROTECT,
to="itam.softwareversion",
verbose_name="Desired Version",
),
),
]

View File

@ -14,11 +14,8 @@ from access.fields import AutoLastModifiedField
from centurion.helpers.merge_software import merge_software from centurion.helpers.merge_software import merge_software
from core.classes.icon import Icon from core.classes.icon import Icon
from core.lib.feature_not_used import FeatureNotUsed
from core.mixins.history_save import SaveHistory
from core.models.centurion import CenturionModel from core.models.centurion import CenturionModel
from itam.models.device_common import DeviceCommonFields
from itam.models.device_models import DeviceModel from itam.models.device_models import DeviceModel
from itam.models.software import Software, SoftwareVersion from itam.models.software import Software, SoftwareVersion
from itam.models.operating_system import OperatingSystemVersion from itam.models.operating_system import OperatingSystemVersion
@ -537,9 +534,16 @@ class Device(
class DeviceSoftware(DeviceCommonFields, SaveHistory): class DeviceSoftware(
CenturionModel,
):
""" A way for the device owner to configure software to install/remove """ """ A way for the device owner to configure software to install/remove """
_audit_enabled = False
_notes_enabled = False
class Meta: class Meta:
ordering = [ ordering = [
'-action', '-action',
@ -559,37 +563,35 @@ class DeviceSoftware(DeviceCommonFields, SaveHistory):
device = models.ForeignKey( device = models.ForeignKey(
Device, Device,
blank= False, blank = False,
help_text = 'Device this software is on', help_text = 'Device this software is on',
on_delete=models.CASCADE, on_delete = models.CASCADE,
null = False, null = False,
verbose_name = 'Device' verbose_name = 'Device'
) )
software = models.ForeignKey( software = models.ForeignKey(
Software, Software,
blank= False, blank = False,
help_text = 'Software Name', help_text = 'Software Name',
null = False, null = False,
on_delete=models.CASCADE, on_delete = models.PROTECT,
verbose_name = 'Software' verbose_name = 'Software'
) )
action = models.IntegerField( action = models.IntegerField(
blank = True, blank = True,
choices=Actions, choices = Actions,
default=None,
help_text = 'Action to perform', help_text = 'Action to perform',
null=True, null = True,
verbose_name = 'Action', verbose_name = 'Action',
) )
version = models.ForeignKey( version = models.ForeignKey(
SoftwareVersion, SoftwareVersion,
blank= True, blank = True,
default = None,
help_text = 'Version to install', help_text = 'Version to install',
on_delete=models.CASCADE, on_delete = models.PROTECT,
null = True, null = True,
verbose_name = 'Desired Version' verbose_name = 'Desired Version'
) )
@ -597,11 +599,10 @@ class DeviceSoftware(DeviceCommonFields, SaveHistory):
installedversion = models.ForeignKey( installedversion = models.ForeignKey(
SoftwareVersion, SoftwareVersion,
blank= True, blank = True,
default = None,
help_text = 'Version that is installed', help_text = 'Version that is installed',
null = True, null = True,
on_delete=models.CASCADE, on_delete = models.PROTECT,
related_name = 'installedversion', related_name = 'installedversion',
verbose_name = 'Installed Version' verbose_name = 'Installed Version'
) )
@ -651,39 +652,24 @@ class DeviceSoftware(DeviceCommonFields, SaveHistory):
) )
def get_url_kwargs(self) -> dict: def get_url_kwargs(self, many = False) -> dict:
return { kwargs = super().get_url_kwargs( many = many )
kwargs.update({
'device_id': self.device.id, 'device_id': self.device.id,
'pk': self.id })
}
return kwargs
def get_url_kwargs_notes(self):
return FeatureNotUsed
@property @property
def parent_object(self): def parent_object(self):
""" Fetch the parent object """ """ Fetch the parent object """
return self.device return self.device
def save_history(self, before: dict, after: dict) -> bool:
from itam.models.device_software_history import DeviceSoftwareHistory
history = super().save_history(
before = before,
after = after,
history_model = DeviceSoftwareHistory,
)
return history
class DeviceOperatingSystem( class DeviceOperatingSystem(
CenturionModel, CenturionModel,

View File

@ -1,39 +0,0 @@
from django.db import models
from access.fields import *
from access.models.tenancy import TenancyObject
class DeviceCommonFields(TenancyObject, models.Model):
class Meta:
abstract = True
id = models.AutoField(
blank=False,
help_text = 'ID of this item',
primary_key=True,
unique=True,
verbose_name = 'ID'
)
created = AutoCreatedField()
modified = AutoLastModifiedField()
class DeviceCommonFieldsName(DeviceCommonFields):
class Meta:
abstract = True
name = models.CharField(
blank = False,
help_text = 'The items name',
max_length = 50,
unique = True,
verbose_name = 'Name'
)
slug = AutoSlugField()