refactor(itam): Switch to inherit from Centurion model for model ITAMAssetBase

ref: #862 #858
This commit is contained in:
2025-07-10 19:50:04 +09:30
parent de7c52d733
commit e4e7ad915b
4 changed files with 142 additions and 23 deletions

View File

@ -0,0 +1,81 @@
# Generated by Django 5.1.10 on 2025-07-10 09:10
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("core", "0033_alter_ticketcommentcategory_parent_and_more"),
("itam", "0024_alter_software_organization"),
]
operations = [
migrations.CreateModel(
name="ITAMAssetBaseAuditHistory",
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="+",
to="itam.itamassetbase",
verbose_name="Model",
),
),
],
options={
"verbose_name": "IT Asset History",
"verbose_name_plural": "IT Asset Histories",
"db_table": "itam_itamassetbase_audithistory",
"managed": True,
},
bases=("core.centurionaudit",),
),
migrations.CreateModel(
name="ITAMAssetBaseCenturionModelNote",
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.itamassetbase",
verbose_name="Model",
),
),
],
options={
"verbose_name": "IT Asset Note",
"verbose_name_plural": "IT Asset Notes",
"db_table": "itam_itamassetbase_centurionmodelnote",
"managed": True,
},
bases=("core.centurionmodelnote",),
),
]

View File

@ -1,4 +1,5 @@
from django.apps import apps
from django.conf import settings
from django.db import models
from rest_framework.reverse import reverse
@ -18,9 +19,13 @@ class ITAMAssetBase(
**Don't** use this model directly, it should be used via a sub-model.
"""
_is_submodel = True
app_namespace = None
note_basename = 'accounting:_api_v2_asset_note'
model_tag = 'it_asset'
url_model_name = 'itamassetbase'
class Meta:
@ -69,7 +74,7 @@ class ITAMAssetBase(
if(
( isinstance(model, ITAMAssetBase) or issubclass(model, ITAMAssetBase) )
and ITAMAssetBase._meta.itam_sub_model_type != 'itam_base'
# and ITAMAssetBase._meta.itam_sub_model_type != 'itam_base'
):
@ -89,7 +94,7 @@ class ITAMAssetBase(
)
page_layout: list = [
{
"name": "Details",
@ -159,24 +164,9 @@ class ITAMAssetBase(
return self._meta.verbose_name + ' - ' + self.asset_number
def get_url( self, request = None ) -> str:
kwargs = self.get_url_kwargs()
url_path_name = '_api_v2_itam_asset'
if request:
return reverse(f"v2:{url_path_name}-detail", request=request, kwargs = kwargs )
return reverse(f"v2:{url_path_name}-detail", kwargs = kwargs )
def save(self, force_insert=False, force_update=False, using=None, update_fields=None):
def clean_fields(self, exclude = None):
related_model = self.get_related_model()
@ -184,8 +174,56 @@ class ITAMAssetBase(
related_model = self
if self.itam_type != str(related_model._meta.itam_sub_model_type).lower().replace(' ', '_'):
if(
self.itam_type != str(related_model._meta.itam_sub_model_type).lower().replace(' ', '_')
and str(related_model._meta.sub_model_type).lower().replace(' ', '_') != 'itam_base'
):
self.itam_type = str(related_model._meta.itam_sub_model_type).lower().replace(' ', '_')
super().save(force_insert=force_insert, force_update=force_update, using=using, update_fields=update_fields)
super().clean_fields(exclude = exclude)
def get_url(
self, relative: bool = False, api_version: int = 2, many = False, request: any = None
) -> str:
namespace = f'v{api_version}'
if self.get_app_namespace():
namespace = namespace + ':' + self.get_app_namespace()
url_basename = f'{namespace}:_api_{self._meta.model_name}'
if self.url_model_name:
url_basename = f'{namespace}:_api_{self.url_model_name}'
if (
self._is_submodel
and self._meta.sub_model_type != 'it_asset'
):
url_basename += '_sub'
if many:
url_basename += '-list'
else:
url_basename += '-detail'
url = reverse( viewname = url_basename, kwargs = self.get_url_kwargs( many = many ) )
if not relative:
url = settings.SITE_URL + url
return url

View File

@ -4,7 +4,7 @@ from drf_spectacular.utils import extend_schema_serializer
from access.serializers.organization import TenantBaseSerializer
from accounting.serializers.asset import (
from accounting.serializers.assetbase import (
BaseSerializer,
ModelSerializer as AssetBaseModelSerializer,
ViewSerializer as AssetBaseViewSerializer,

View File

@ -87,7 +87,7 @@ A Model link is a reference to an item within the database. Supported model link
| gitrepository| `$git_repository-<id>` |
| gitgroup| `$git_group-<id>` |
| group| `$-<id>` |
| it_asset | `$it_asset-<id>` |
| it_asset | `$asset-<id>` or `$it_asset-<id>` |
| knowledgebase| `$kb-<id>` |
| knowledgebasecategory| `$kb_category-<id>` |
| manufacturer| `$manufacturer-<id>` |