diff --git a/app/itam/migrations/0018_remove_devicesoftware_is_global_and_more.py b/app/itam/migrations/0018_remove_devicesoftware_is_global_and_more.py new file mode 100644 index 00000000..92098554 --- /dev/null +++ b/app/itam/migrations/0018_remove_devicesoftware_is_global_and_more.py @@ -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", + ), + ), + ] diff --git a/app/itam/models/device.py b/app/itam/models/device.py index 6cfa1c88..00be12ae 100644 --- a/app/itam/models/device.py +++ b/app/itam/models/device.py @@ -14,11 +14,8 @@ from access.fields import AutoLastModifiedField from centurion.helpers.merge_software import merge_software 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 itam.models.device_common import DeviceCommonFields from itam.models.device_models import DeviceModel from itam.models.software import Software, SoftwareVersion 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 """ + _audit_enabled = False + + _notes_enabled = False + + class Meta: ordering = [ '-action', @@ -559,37 +563,35 @@ class DeviceSoftware(DeviceCommonFields, SaveHistory): device = models.ForeignKey( Device, - blank= False, + blank = False, help_text = 'Device this software is on', - on_delete=models.CASCADE, + on_delete = models.CASCADE, null = False, verbose_name = 'Device' ) software = models.ForeignKey( Software, - blank= False, + blank = False, help_text = 'Software Name', null = False, - on_delete=models.CASCADE, + on_delete = models.PROTECT, verbose_name = 'Software' ) action = models.IntegerField( blank = True, - choices=Actions, - default=None, + choices = Actions, help_text = 'Action to perform', - null=True, + null = True, verbose_name = 'Action', ) version = models.ForeignKey( SoftwareVersion, - blank= True, - default = None, + blank = True, help_text = 'Version to install', - on_delete=models.CASCADE, + on_delete = models.PROTECT, null = True, verbose_name = 'Desired Version' ) @@ -597,11 +599,10 @@ class DeviceSoftware(DeviceCommonFields, SaveHistory): installedversion = models.ForeignKey( SoftwareVersion, - blank= True, - default = None, + blank = True, help_text = 'Version that is installed', null = True, - on_delete=models.CASCADE, + on_delete = models.PROTECT, related_name = 'installedversion', 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, - 'pk': self.id - } + }) - - def get_url_kwargs_notes(self): - - return FeatureNotUsed + return kwargs @property def parent_object(self): """ Fetch the parent object """ - + 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( CenturionModel, diff --git a/app/itam/models/device_common.py b/app/itam/models/device_common.py deleted file mode 100644 index bdc6826f..00000000 --- a/app/itam/models/device_common.py +++ /dev/null @@ -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()