Skip to content

Commit 9445159

Browse files
authored
Merge pull request #824 from nofusscomputing/model-inheritance
2 parents 0aad84f + 3c13232 commit 9445159

88 files changed

Lines changed: 2569 additions & 642 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

app/api/serializers/auth_token.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ def get_display_name(self, item) -> str:
2121
return str( item )
2222

2323
url = serializers.HyperlinkedIdentityField(
24-
view_name="v2:_api_v2_cluster-detail",
24+
view_name="v2:_api_cluster-detail",
2525
)
2626

2727
class Meta:

app/core/serializers/ticket.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ def get_url(self, item) -> dict:
8080
if item.project:
8181

8282
url_dict.update({
83-
'project': reverse("v2:_api_v2_project-list", request=self._context['view'].request, kwargs={}),
83+
'project': reverse("v2:_api_project-list", request=self._context['view'].request, kwargs={}),
8484
})
8585

8686
if item.category:

app/core/serializers/ticket_depreciated.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ def get_url(self, item) -> dict:
7979
if item.project:
8080

8181
url_dict.update({
82-
'project': reverse("v2:_api_v2_project-list", request=self._context['view'].request, kwargs={}),
82+
'project': reverse("v2:_api_project-list", request=self._context['view'].request, kwargs={}),
8383
})
8484

8585
if item.category:

app/core/signal/centurion_model_migrate.py

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,36 @@ def centurion_model_migrate(sender, **kwargs):
154154
'model_name': 'SoftwareVersion',
155155
'history_model_name': 'SoftwareVersionHistory',
156156
'notes_model_name': 'SoftwareVersionNotes'
157+
},
158+
{
159+
'app_label': 'itim',
160+
'model_name': 'Cluster',
161+
'history_model_name': 'ClusterHistory',
162+
'notes_model_name': 'ClusterNotes'
163+
},
164+
{
165+
'app_label': 'itim',
166+
'model_name': 'ClusterType',
167+
'history_model_name': 'ClusterTypeHistory',
168+
'notes_model_name': 'ClusterTypeNotes'
169+
},
170+
{
171+
'app_label': 'itim',
172+
'model_name': 'Port',
173+
'history_model_name': 'PortHistory',
174+
'notes_model_name': 'PortNotes'
175+
},
176+
{
177+
'app_label': 'itim',
178+
'model_name': 'Service',
179+
'history_model_name': 'ServiceHistory',
180+
'notes_model_name': 'ServiceNotes'
181+
},
182+
{
183+
'app_label': 'project_management',
184+
'model_name': 'Project',
185+
'history_model_name': 'ProjectHistory',
186+
'notes_model_name': 'ProjectNotes'
157187
}
158188
]
159189

@@ -201,7 +231,7 @@ def centurion_model_migrate(sender, **kwargs):
201231
model_name = model.get_history_model_name( model )
202232
)
203233

204-
history = original_history.objects.all()
234+
history = original_history.objects.filter().exclude( user = None )
205235

206236
print(f' Found {len(history)} history entries to migrate.')
207237

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
from django import template
2+
from django.conf import settings
3+
4+
register = template.Library()
5+
6+
@register.simple_tag
7+
def settings_value(name):
8+
9+
return getattr(settings, name, "")

app/core/tests/unit/centurion_audit_meta/test_unit_meta_audit_history_model.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,9 @@ def model_kwargs(self, django_db_blocker,
102102

103103
for field, value in audit_model_kwargs.items():
104104

105+
if not hasattr(getattr(audit_model, field), 'field'):
106+
continue
107+
105108
if isinstance(getattr(audit_model, field).field, models.ManyToManyField):
106109

107110
if field in many_field:

app/core/tests/unit/centurion_model_note_meta/test_unit_meta_model_note_model.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,9 @@ def model_kwargs(self, django_db_blocker,
102102

103103
for field, value in note_model_kwargs.items():
104104

105+
if not hasattr(getattr(note_model, field), 'field'):
106+
continue
107+
105108
if isinstance(getattr(note_model, field).field, models.ManyToManyField):
106109

107110
if field in many_field:

app/fixtures/fresh_db.sql

Lines changed: 32 additions & 19 deletions
Large diffs are not rendered by default.

app/itam/tests/unit/software_version/test_unit_software_version_model.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,4 +66,12 @@ class SoftwareVersionModelInheritedCases(
6666
class SoftwareVersionModelPyTest(
6767
SoftwareVersionModelTestCases,
6868
):
69-
pass
69+
70+
def test_method_get_url_kwargs(self, mocker, model_instance, settings):
71+
"""Test Class Method
72+
73+
Ensure method `get_url_kwargs` returns the correct value.
74+
"""
75+
76+
assert model_instance.get_url_kwargs() == { 'pk': model_instance.id, 'software_id': model_instance.software.id }
77+
Lines changed: 183 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,183 @@
1+
# Generated by Django 5.1.9 on 2025-06-13 02:25
2+
3+
import access.models.tenancy_abstract
4+
import django.db.models.deletion
5+
from django.db import migrations, models
6+
7+
8+
class Migration(migrations.Migration):
9+
10+
dependencies = [
11+
("access", "0016_remove_tenant_slug_alter_tenant_manager_and_more"),
12+
("core", "0033_alter_ticketcommentcategory_parent_and_more"),
13+
("itam", "0023_remove_softwareversion_is_global_and_more"),
14+
("itim", "0010_alter_cluster_organization_and_more"),
15+
]
16+
17+
operations = [
18+
migrations.RemoveField(
19+
model_name="cluster",
20+
name="is_global",
21+
),
22+
migrations.RemoveField(
23+
model_name="cluster",
24+
name="slug",
25+
),
26+
migrations.AlterField(
27+
model_name="cluster",
28+
name="cluster_type",
29+
field=models.ForeignKey(
30+
blank=True,
31+
help_text="Type of Cluster",
32+
null=True,
33+
on_delete=django.db.models.deletion.PROTECT,
34+
to="itim.clustertype",
35+
verbose_name="Cluster Type",
36+
),
37+
),
38+
migrations.AlterField(
39+
model_name="cluster",
40+
name="config",
41+
field=models.JSONField(
42+
blank=True,
43+
help_text="Cluster Configuration",
44+
null=True,
45+
verbose_name="Configuration",
46+
),
47+
),
48+
migrations.AlterField(
49+
model_name="cluster",
50+
name="devices",
51+
field=models.ManyToManyField(
52+
blank=True,
53+
help_text="Devices that are deployed upon the cluster.",
54+
related_name="cluster_device",
55+
to="itam.device",
56+
verbose_name="Devices",
57+
),
58+
),
59+
migrations.AlterField(
60+
model_name="cluster",
61+
name="id",
62+
field=models.AutoField(
63+
help_text="ID of the item",
64+
primary_key=True,
65+
serialize=False,
66+
unique=True,
67+
verbose_name="ID",
68+
),
69+
),
70+
migrations.AlterField(
71+
model_name="cluster",
72+
name="model_notes",
73+
field=models.TextField(
74+
blank=True,
75+
help_text="Tid bits of information",
76+
null=True,
77+
verbose_name="Notes",
78+
),
79+
),
80+
migrations.AlterField(
81+
model_name="cluster",
82+
name="nodes",
83+
field=models.ManyToManyField(
84+
blank=True,
85+
help_text="Hosts for resource consumption that the cluster is deployed upon",
86+
related_name="cluster_node",
87+
to="itam.device",
88+
verbose_name="Nodes",
89+
),
90+
),
91+
migrations.AlterField(
92+
model_name="cluster",
93+
name="organization",
94+
field=models.ForeignKey(
95+
help_text="Tenant this belongs to",
96+
on_delete=django.db.models.deletion.CASCADE,
97+
related_name="+",
98+
to="access.tenant",
99+
validators=[
100+
access.models.tenancy_abstract.TenancyAbstractModel.validatate_organization_exists
101+
],
102+
verbose_name="Tenant",
103+
),
104+
),
105+
migrations.AlterField(
106+
model_name="cluster",
107+
name="parent_cluster",
108+
field=models.ForeignKey(
109+
blank=True,
110+
help_text="Parent Cluster for this cluster",
111+
null=True,
112+
on_delete=django.db.models.deletion.PROTECT,
113+
to="itim.cluster",
114+
verbose_name="Parent Cluster",
115+
),
116+
),
117+
migrations.CreateModel(
118+
name="ClusterAuditHistory",
119+
fields=[
120+
(
121+
"centurionaudit_ptr",
122+
models.OneToOneField(
123+
auto_created=True,
124+
on_delete=django.db.models.deletion.CASCADE,
125+
parent_link=True,
126+
primary_key=True,
127+
serialize=False,
128+
to="core.centurionaudit",
129+
),
130+
),
131+
(
132+
"model",
133+
models.ForeignKey(
134+
help_text="Model this history belongs to",
135+
on_delete=django.db.models.deletion.CASCADE,
136+
related_name="audit_history",
137+
to="itim.cluster",
138+
verbose_name="Model",
139+
),
140+
),
141+
],
142+
options={
143+
"verbose_name": "Cluster History",
144+
"verbose_name_plural": "Cluster Histories",
145+
"db_table": "itim_cluster_audithistory",
146+
"managed": True,
147+
},
148+
bases=("core.centurionaudit",),
149+
),
150+
migrations.CreateModel(
151+
name="ClusterCenturionModelNote",
152+
fields=[
153+
(
154+
"centurionmodelnote_ptr",
155+
models.OneToOneField(
156+
auto_created=True,
157+
on_delete=django.db.models.deletion.CASCADE,
158+
parent_link=True,
159+
primary_key=True,
160+
serialize=False,
161+
to="core.centurionmodelnote",
162+
),
163+
),
164+
(
165+
"model",
166+
models.ForeignKey(
167+
help_text="Model this note belongs to",
168+
on_delete=django.db.models.deletion.CASCADE,
169+
related_name="+",
170+
to="itim.cluster",
171+
verbose_name="Model",
172+
),
173+
),
174+
],
175+
options={
176+
"verbose_name": "Cluster Note",
177+
"verbose_name_plural": "Cluster Notes",
178+
"db_table": "itim_cluster_centurionmodelnote",
179+
"managed": True,
180+
},
181+
bases=("core.centurionmodelnote",),
182+
),
183+
]

0 commit comments

Comments
 (0)