diff --git a/app/itim/migrations/0011_remove_cluster_is_global_remove_cluster_slug_and_more.py b/app/itim/migrations/0011_remove_cluster_is_global_remove_cluster_slug_and_more.py new file mode 100644 index 00000000..9abede19 --- /dev/null +++ b/app/itim/migrations/0011_remove_cluster_is_global_remove_cluster_slug_and_more.py @@ -0,0 +1,183 @@ +# Generated by Django 5.1.9 on 2025-06-13 02:25 + +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", "0023_remove_softwareversion_is_global_and_more"), + ("itim", "0010_alter_cluster_organization_and_more"), + ] + + operations = [ + migrations.RemoveField( + model_name="cluster", + name="is_global", + ), + migrations.RemoveField( + model_name="cluster", + name="slug", + ), + migrations.AlterField( + model_name="cluster", + name="cluster_type", + field=models.ForeignKey( + blank=True, + help_text="Type of Cluster", + null=True, + on_delete=django.db.models.deletion.PROTECT, + to="itim.clustertype", + verbose_name="Cluster Type", + ), + ), + migrations.AlterField( + model_name="cluster", + name="config", + field=models.JSONField( + blank=True, + help_text="Cluster Configuration", + null=True, + verbose_name="Configuration", + ), + ), + migrations.AlterField( + model_name="cluster", + name="devices", + field=models.ManyToManyField( + blank=True, + help_text="Devices that are deployed upon the cluster.", + related_name="cluster_device", + to="itam.device", + verbose_name="Devices", + ), + ), + migrations.AlterField( + model_name="cluster", + 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="cluster", + name="model_notes", + field=models.TextField( + blank=True, + help_text="Tid bits of information", + null=True, + verbose_name="Notes", + ), + ), + migrations.AlterField( + model_name="cluster", + name="nodes", + field=models.ManyToManyField( + blank=True, + help_text="Hosts for resource consumption that the cluster is deployed upon", + related_name="cluster_node", + to="itam.device", + verbose_name="Nodes", + ), + ), + migrations.AlterField( + model_name="cluster", + 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="cluster", + name="parent_cluster", + field=models.ForeignKey( + blank=True, + help_text="Parent Cluster for this cluster", + null=True, + on_delete=django.db.models.deletion.PROTECT, + to="itim.cluster", + verbose_name="Parent Cluster", + ), + ), + migrations.CreateModel( + name="ClusterAuditHistory", + 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="itim.cluster", + verbose_name="Model", + ), + ), + ], + options={ + "verbose_name": "Cluster History", + "verbose_name_plural": "Cluster Histories", + "db_table": "itim_cluster_audithistory", + "managed": True, + }, + bases=("core.centurionaudit",), + ), + migrations.CreateModel( + name="ClusterCenturionModelNote", + 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="itim.cluster", + verbose_name="Model", + ), + ), + ], + options={ + "verbose_name": "Cluster Note", + "verbose_name_plural": "Cluster Notes", + "db_table": "itim_cluster_centurionmodelnote", + "managed": True, + }, + bases=("core.centurionmodelnote",), + ), + ] diff --git a/app/itim/models/clusters.py b/app/itim/models/clusters.py index 5c4fe5d7..57184ac7 100644 --- a/app/itim/models/clusters.py +++ b/app/itim/models/clusters.py @@ -1,15 +1,11 @@ import json 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.models.tenancy import TenancyObject -from core.signal.ticket_linked_item_delete import TicketLinkedItem, deleted_model +from core.models.centurion import CenturionModel from itam.models.device import Device @@ -142,7 +138,11 @@ class ClusterType(TenancyObject): -class Cluster(TenancyObject): +class Cluster( + CenturionModel +): + + model_tag = 'cluster' class Meta: @@ -156,31 +156,21 @@ class Cluster(TenancyObject): verbose_name_plural = "Clusters" - id = models.AutoField( - blank=False, - help_text = 'ID for this cluster', - primary_key=True, - unique=True, - verbose_name = 'ID' - ) - parent_cluster = models.ForeignKey( 'self', blank = True, - default = None, help_text = 'Parent Cluster for this cluster', null = True, - on_delete = models.SET_DEFAULT, + on_delete = models.PROTECT, verbose_name = 'Parent Cluster', ) cluster_type = models.ForeignKey( ClusterType, blank = True, - default = None, help_text = 'Type of Cluster', null = True, - on_delete = models.SET_DEFAULT, + on_delete = models.PROTECT, verbose_name = 'Cluster Type', ) @@ -192,11 +182,8 @@ class Cluster(TenancyObject): verbose_name = 'Name', ) - slug = AutoSlugField() - config = models.JSONField( blank = True, - default = None, help_text = 'Cluster Configuration', null = True, verbose_name = 'Configuration', @@ -205,7 +192,6 @@ class Cluster(TenancyObject): nodes = models.ManyToManyField( Device, blank = True, - default = None, help_text = 'Hosts for resource consumption that the cluster is deployed upon', related_name = 'cluster_node', verbose_name = 'Nodes', @@ -214,14 +200,11 @@ class Cluster(TenancyObject): devices = models.ManyToManyField( Device, blank = True, - default = None, help_text = 'Devices that are deployed upon the cluster.', related_name = 'cluster_device', verbose_name = 'Devices', ) - created = AutoCreatedField() - modified = AutoLastModifiedField() @@ -318,13 +301,8 @@ class Cluster(TenancyObject): ] - def get_url( self, request = None ) -> str: - - if request: - - return reverse("v2:_api_v2_cluster-detail", request=request, kwargs={'pk': self.id}) - - return reverse("v2:_api_v2_cluster-detail", kwargs={'pk': self.id}) + def get_organization(self): + return self.organization @property @@ -368,24 +346,3 @@ class Cluster(TenancyObject): def __str__(self): return self.name - - - def save_history(self, before: dict, after: dict) -> bool: - - from itim.models.cluster_history import ClusterHistory - - history = super().save_history( - before = before, - after = after, - history_model = ClusterHistory, - ) - - - return history - - - -@receiver(post_delete, sender=Cluster, dispatch_uid='cluster_delete_signal') -def signal_deleted_model(sender, instance, using, **kwargs): - - deleted_model.send(sender='cluster_deleted', item_id=instance.id, item_type = TicketLinkedItem.Modules.CLUSTER)