refactor(accounting): Switch to inherit from Centurion model for model AssetBase

ref: #862 #857
This commit is contained in:
2025-07-10 19:25:42 +09:30
parent 2c1c769988
commit 2482148466
2 changed files with 147 additions and 97 deletions

View File

@ -0,0 +1,118 @@
# Generated by Django 5.1.10 on 2025-07-10 09:10
import access.models.tenancy_abstract
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("access", "0019_companyaudithistory_companycenturionmodelnote"),
("accounting", "0001_initial"),
("core", "0033_alter_ticketcommentcategory_parent_and_more"),
]
operations = [
migrations.AlterField(
model_name="assetbase",
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="assetbase",
name="model_notes",
field=models.TextField(
blank=True,
help_text="Tid bits of information",
null=True,
verbose_name="Notes",
),
),
migrations.AlterField(
model_name="assetbase",
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.CreateModel(
name="AssetBaseAuditHistory",
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="accounting.assetbase",
verbose_name="Model",
),
),
],
options={
"verbose_name": "Asset History",
"verbose_name_plural": "Asset Histories",
"db_table": "accounting_assetbase_audithistory",
"managed": True,
},
bases=("core.centurionaudit",),
),
migrations.CreateModel(
name="AssetBaseCenturionModelNote",
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="accounting.assetbase",
verbose_name="Model",
),
),
],
options={
"verbose_name": "Asset Note",
"verbose_name_plural": "Asset Notes",
"db_table": "accounting_assetbase_centurionmodelnote",
"managed": True,
},
bases=("core.centurionmodelnote",),
),
]

View File

@ -1,15 +1,14 @@
from django.apps import apps
from django.db import models
from rest_framework.reverse import reverse
from access.fields import AutoLastModifiedField
from access.fields import AutoCreatedField, AutoLastModifiedField
from access.models.tenancy import TenancyObject
from core.models.centurion import CenturionModel
class AssetBase(
TenancyObject,
CenturionModel,
):
"""Asset Base Model
@ -21,6 +20,10 @@ class AssetBase(
app_namespace = 'accounting'
model_tag = 'asset'
url_model_name = 'asset'
@property
def _base_model(self):
@ -50,18 +53,6 @@ class AssetBase(
return True
is_global = None
id = models.AutoField(
blank = False,
help_text = 'Ticket ID Number',
primary_key = True,
unique = True,
verbose_name = 'Number',
)
asset_number = models.CharField(
blank = True,
help_text = 'Number or tag to use to track this asset',
@ -96,14 +87,11 @@ class AssetBase(
"""
# Status
# model (manufacturer / model)
@property
def get_model_type(self):
"""Fetch the Ticket Type
@ -137,7 +125,7 @@ class AssetBase(
if(
( isinstance(model, AssetBase) or issubclass(model, AssetBase) )
and AssetBase._meta.sub_model_type != 'asset'
# and AssetBase._meta.sub_model_type != 'asset'
):
@ -159,12 +147,6 @@ class AssetBase(
verbose_name = 'Asset Type',
)
created = AutoCreatedField(
editable = True,
)
modified = AutoLastModifiedField()
@ -237,6 +219,26 @@ class AssetBase(
def clean_fields(self, exclude = None):
related_model = self.get_related_model()
if related_model is None:
related_model = self
if (
self.asset_type != str(related_model._meta.sub_model_type).lower().replace(' ', '_')
and str(related_model._meta.sub_model_type).lower().replace(' ', '_') != 'asset'
):
self.asset_type = str(related_model._meta.sub_model_type).lower().replace(' ', '_')
super().clean_fields(exclude = exclude)
def get_related_field_name(self) -> str:
meta = getattr(self, '_meta')
@ -260,6 +262,7 @@ class AssetBase(
return ''
def get_related_model(self):
"""Recursive model Fetch
@ -292,74 +295,3 @@ class AssetBase(
return related_model
def get_url( self, request = None ) -> str:
kwargs = self.get_url_kwargs()
url_path_name = '_api_v2_asset_sub'
if self._meta.sub_model_type == 'asset':
url_path_name = '_api_v2_asset'
if request:
return reverse(f"v2:accounting:{url_path_name}-detail", request=request, kwargs = kwargs )
return reverse(f"v2:accounting:{url_path_name}-detail", kwargs = kwargs )
def get_url_kwargs(self) -> dict:
kwargs = {
'asset_model': self.asset_type,
}
if self._meta.sub_model_type == 'asset':
kwargs = {}
if self.id:
kwargs.update({
'pk': self.id
})
return kwargs
def save(self, force_insert=False, force_update=False, using=None, update_fields=None):
related_model = self.get_related_model()
if related_model is None:
related_model = self
if self.asset_type != str(related_model._meta.sub_model_type).lower().replace(' ', '_'):
self.asset_type = str(related_model._meta.sub_model_type).lower().replace(' ', '_')
super().save(force_insert=force_insert, force_update=force_update, using=using, update_fields=update_fields)
def save_history(self, before: dict, after: dict) -> bool:
from accounting.models.asset_base_history import AssetBaseHistory
history = super().save_history(
before = before,
after = after,
history_model = AssetBaseHistory
)
return history