diff --git a/app/itam/migrations/0019_remove_operatingsystem_is_global_and_more.py b/app/itam/migrations/0019_remove_operatingsystem_is_global_and_more.py new file mode 100644 index 00000000..946171d9 --- /dev/null +++ b/app/itam/migrations/0019_remove_operatingsystem_is_global_and_more.py @@ -0,0 +1,138 @@ +# Generated by Django 5.1.9 on 2025-06-11 10:22 + +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"), + ("core", "0033_alter_ticketcommentcategory_parent_and_more"), + ("itam", "0018_remove_devicesoftware_is_global_and_more"), + ] + + operations = [ + migrations.RemoveField( + model_name="operatingsystem", + name="is_global", + ), + migrations.RemoveField( + model_name="operatingsystem", + name="slug", + ), + migrations.AlterField( + model_name="operatingsystem", + 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="operatingsystem", + name="model_notes", + field=models.TextField( + blank=True, + help_text="Tid bits of information", + null=True, + verbose_name="Notes", + ), + ), + migrations.AlterField( + model_name="operatingsystem", + 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="operatingsystem", + name="publisher", + field=models.ForeignKey( + blank=True, + help_text="Who publishes this Operating System", + null=True, + on_delete=django.db.models.deletion.PROTECT, + to="core.manufacturer", + verbose_name="Publisher", + ), + ), + migrations.CreateModel( + name="OperatingSystemAuditHistory", + fields=[ + ( + "centurionaudit_ptr", + models.OneToOneField( + auto_created=True, + on_delete=django.db.models.deletion.CASCADE, + parent_link=True, + primary_key=True, + serialize=False, + to="core.centurionaudit", + ), + ), + ( + "model", + models.ForeignKey( + help_text="Model this history belongs to", + on_delete=django.db.models.deletion.CASCADE, + related_name="audit_history", + to="itam.operatingsystem", + verbose_name="Model", + ), + ), + ], + options={ + "verbose_name": "Operating System History", + "verbose_name_plural": "Operating System Histories", + "db_table": "itam_operatingsystem_audithistory", + "managed": True, + }, + bases=("core.centurionaudit",), + ), + migrations.CreateModel( + name="OperatingSystemCenturionModelNote", + fields=[ + ( + "centurionmodelnote_ptr", + models.OneToOneField( + auto_created=True, + on_delete=django.db.models.deletion.CASCADE, + parent_link=True, + primary_key=True, + serialize=False, + to="core.centurionmodelnote", + ), + ), + ( + "model", + models.ForeignKey( + help_text="Model this note belongs to", + on_delete=django.db.models.deletion.CASCADE, + related_name="+", + to="itam.operatingsystem", + verbose_name="Model", + ), + ), + ], + options={ + "verbose_name": "Operating System Note", + "verbose_name_plural": "Operating System Notes", + "db_table": "itam_operatingsystem_centurionmodelnote", + "managed": True, + }, + bases=("core.centurionmodelnote",), + ), + ] diff --git a/app/itam/models/operating_system.py b/app/itam/models/operating_system.py index 6c4ede2b..daa48e72 100644 --- a/app/itam/models/operating_system.py +++ b/app/itam/models/operating_system.py @@ -1,15 +1,11 @@ from django.db import models -from django.db.models.signals import post_delete -from django.dispatch import receiver -from rest_framework.reverse import reverse - -from access.fields import * +from access.fields import AutoLastModifiedField, AutoCreatedField, AutoSlugField from access.models.tenancy import TenancyObject from core.mixins.history_save import SaveHistory +from core.models.centurion import CenturionModel from core.models.manufacturer import Manufacturer -from core.signal.ticket_linked_item_delete import TicketLinkedItem, deleted_model @@ -28,7 +24,7 @@ class OperatingSystemCommonFields(TenancyObject, models.Model): created = AutoCreatedField() - modified = AutoLastModifiedField() + # modified = AutoLastModifiedField() @@ -37,20 +33,23 @@ class OperatingSystemFieldsName(OperatingSystemCommonFields): class Meta: abstract = True - name = models.CharField( - blank = False, - help_text = 'Name of this item', - max_length = 50, - unique = True, - verbose_name = 'Name' - ) + # name = models.CharField( + # blank = False, + # help_text = 'Name of this item', + # max_length = 50, + # unique = True, + # verbose_name = 'Name' + # ) slug = AutoSlugField() -class OperatingSystem(OperatingSystemFieldsName, SaveHistory): +class OperatingSystem( + CenturionModel +): + model_tag = 'operating_system' class Meta: @@ -66,13 +65,22 @@ class OperatingSystem(OperatingSystemFieldsName, SaveHistory): publisher = models.ForeignKey( Manufacturer, blank = True, - default = None, help_text = 'Who publishes this Operating System', null = True, - on_delete = models.SET_DEFAULT, + on_delete = models.PROTECT, verbose_name = 'Publisher' ) + name = models.CharField( + blank = False, + help_text = 'Name of this item', + max_length = 50, + unique = True, + verbose_name = 'Name' + ) + + modified = AutoLastModifiedField() + page_layout: dict = [ { @@ -161,42 +169,20 @@ class OperatingSystem(OperatingSystemFieldsName, SaveHistory): ] - def get_url( self, request = None ) -> str: - - if request: - - return reverse("v2:_api_v2_operating_system-detail", request=request, kwargs={'pk': self.id}) - - return reverse("v2:_api_v2_operating_system-detail", kwargs={'pk': self.id}) - - def __str__(self): return self.name - def save_history(self, before: dict, after: dict) -> bool: - from itam.models.operating_system_history import OperatingSystemHistory + def get_organization(self): - history = super().save_history( - before = before, - after = after, - history_model = OperatingSystemHistory, - ) - - - return history + return self.organization -@receiver(post_delete, sender=OperatingSystem, dispatch_uid='operating_system_delete_signal') -def signal_deleted_model(sender, instance, using, **kwargs): - - deleted_model.send(sender='operating_system_deleted', item_id=instance.id, item_type = TicketLinkedItem.Modules.OPERATING_SYSTEM) - - - -class OperatingSystemVersion(OperatingSystemCommonFields, SaveHistory): +class OperatingSystemVersion( + OperatingSystemCommonFields, SaveHistory +): class Meta: @@ -225,6 +211,9 @@ class OperatingSystemVersion(OperatingSystemCommonFields, SaveHistory): verbose_name = 'Major Version', ) + modified = AutoLastModifiedField() + + page_layout: list = [ { "name": "Details",