Skip to content

Commit 3c17c00

Browse files
committed
Update for NetBox 4.3
1 parent 3c3350f commit 3c17c00

File tree

4 files changed

+66
-35
lines changed

4 files changed

+66
-35
lines changed

netbox_lifecycle/__init__.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,7 @@ class NetBoxLifeCycle(PluginConfig):
1313
author = metadata.get('Author')
1414
author_email = metadata.get('Author-email')
1515
base_url = 'lifecycle'
16-
min_version = '4.1.0'
17-
max_version = '4.2.99'
16+
min_version = '4.3.0'
1817
required_settings = []
1918
default_settings = {}
2019
queues = []
Lines changed: 41 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
1+
from typing import Annotated, Union
2+
3+
import strawberry
14
import strawberry_django
5+
6+
from core.graphql.filter_mixins import BaseObjectTypeFilterMixin
27
from netbox_lifecycle import filtersets, models
38

4-
from netbox.graphql.filter_mixins import autotype_decorator, BaseFilterMixin
59

610
__all__ = (
711
'VendorFilter',
@@ -15,43 +19,58 @@
1519

1620

1721
@strawberry_django.filter(models.Vendor, lookups=True)
18-
@autotype_decorator(filtersets.VendorFilterSet)
19-
class VendorFilter(BaseFilterMixin):
22+
class VendorFilter(BaseObjectTypeFilterMixin):
2023
pass
2124

2225

2326
@strawberry_django.filter(models.SupportSKU, lookups=True)
24-
@autotype_decorator(filtersets.SupportSKUFilterSet)
25-
class SupportSKUFilter(BaseFilterMixin):
26-
pass
27+
class SupportSKUFilter(BaseObjectTypeFilterMixin):
28+
manufacturer: Annotated['ManufacturerFilter', strawberry.lazy('dcim.graphql.filters')] | None = strawberry_django.filter_field()
29+
manufacturer_id: strawberry.ID | None = strawberry_django.filter_field()
2730

2831

2932
@strawberry_django.filter(models.SupportContract, lookups=True)
30-
@autotype_decorator(filtersets.SupportContractFilterSet)
31-
class SupportContractFilter(BaseFilterMixin):
32-
pass
33+
class SupportContractFilter(BaseObjectTypeFilterMixin):
34+
vendor: Annotated['ManufacturerFilter', strawberry.lazy('dcim.graphql.filters')] | None = strawberry_django.filter_field()
35+
vendor_id: strawberry.ID | None = strawberry_django.filter_field()
3336

3437

3538
@strawberry_django.filter(models.SupportContractAssignment, lookups=True)
36-
@autotype_decorator(filtersets.SupportContractAssignmentFilterSet)
37-
class SupportContractAssignmentFilter(BaseFilterMixin):
38-
pass
39+
class SupportContractAssignmentFilter(BaseObjectTypeFilterMixin):
40+
contract: Annotated['SupportContractFilter', strawberry.lazy('netbox_lifecycle.graphql.filters')] | None = strawberry_django.filter_field()
41+
contract_id: strawberry.ID | None = strawberry_django.filter_field()
42+
sku: Annotated['SupportSKUFilter', strawberry.lazy('netbox_lifecycle.graphql.filters')] | None = strawberry_django.filter_field()
43+
sku_id: strawberry.ID | None = strawberry_django.filter_field()
44+
device: Annotated['DeviceFilter', strawberry.lazy('dcim.graphql.filters')] | None = strawberry_django.filter_field()
45+
device_id: strawberry.ID | None = strawberry_django.filter_field()
46+
license: Annotated['LicenseFilter', strawberry.lazy('netbox_lifecycle.graphql.filters')] | None = strawberry_django.filter_field()
47+
license_id: strawberry.ID | None = strawberry_django.filter_field()
3948

4049

4150
@strawberry_django.filter(models.License, lookups=True)
42-
@autotype_decorator(filtersets.LicenseFilterSet)
43-
class LicenseFilter(BaseFilterMixin):
44-
pass
45-
pass
51+
class LicenseFilter(BaseObjectTypeFilterMixin):
52+
manufacturer: Annotated['ManufacturerFilter', strawberry.lazy('dcim.graphql.filters')] | None = strawberry_django.filter_field()
53+
manufacturer_id: strawberry.ID | None = strawberry_django.filter_field()
4654

4755

4856
@strawberry_django.filter(models.LicenseAssignment, lookups=True)
49-
@autotype_decorator(filtersets.LicenseAssignmentFilterSet)
50-
class LicenseAssignmentFilter(BaseFilterMixin):
51-
pass
57+
class LicenseAssignmentFilter(BaseObjectTypeFilterMixin):
58+
vendor: Annotated['VendorFilter', strawberry.lazy('netbox_lifecycle.graphql.filters')] | None = strawberry_django.filter_field()
59+
vendor_id: strawberry.ID | None = strawberry_django.filter_field()
60+
license: Annotated['LicenseFilter', strawberry.lazy('netbox_lifecycle.graphql.filters')] | None = strawberry_django.filter_field()
61+
license_id: strawberry.ID | None = strawberry_django.filter_field()
62+
device: Annotated['DeviceFilter', strawberry.lazy('dcim.graphql.filters')] | None = strawberry_django.filter_field()
63+
device_id: strawberry.ID | None = strawberry_django.filter_field()
5264

5365

5466
@strawberry_django.filter(models.HardwareLifecycle, lookups=True)
55-
@autotype_decorator(filtersets.HardwareLifecycleFilterSet)
56-
class HardwareLifecycleFilter(BaseFilterMixin):
57-
pass
67+
class HardwareLifecycleFilter(BaseObjectTypeFilterMixin):
68+
device_type: Annotated['DeviceTypeFilter', strawberry.lazy('dcim.graphql.filters')] | None = strawberry_django.filter_field()
69+
device_type_id: strawberry.ID | None = strawberry_django.filter_field()
70+
module_type: Annotated['ModuleTypeFilter', strawberry.lazy('dcim.graphql.filters')] | None = strawberry_django.filter_field()
71+
module_type_id: strawberry.ID | None = strawberry_django.filter_field()
72+
73+
assigned_object_type: Annotated['ContentTypeFilter', strawberry.lazy('core.graphql.filters')] | None = (
74+
strawberry_django.filter_field()
75+
)
76+
assigned_object_id: strawberry.ID | None = strawberry_django.filter_field()

netbox_lifecycle/migrations/0001_initial.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# Generated by Django 4.1.7 on 2023-05-10 14:23
22

33
import dcim.models.devices
4+
import dcim.models.modules
45
from django.db import migrations, models
56
import django.db.models.deletion
67
import taggit.managers
@@ -67,7 +68,7 @@ class Migration(migrations.Migration):
6768
('end_of_support', models.DateField()),
6869
('notice', models.CharField(blank=True, max_length=500, null=True)),
6970
('documentation', models.CharField(blank=True, max_length=500, null=True)),
70-
('assigned_object_type', models.ForeignKey(blank=True, limit_choices_to=(dcim.models.devices.DeviceType, dcim.models.devices.ModuleType), null=True, on_delete=django.db.models.deletion.PROTECT, related_name='+', to='contenttypes.contenttype')),
71+
('assigned_object_type', models.ForeignKey(blank=True, limit_choices_to=(dcim.models.devices.DeviceType, dcim.models.modules.ModuleType), null=True, on_delete=django.db.models.deletion.PROTECT, related_name='+', to='contenttypes.contenttype')),
7172
('tags', taggit.managers.TaggableManager(through='extras.TaggedItem', to='extras.Tag')),
7273
],
7374
options={

netbox_lifecycle/template_content.py

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,23 +6,35 @@
66
from .models import hardware, contract
77

88

9+
def log_info(message: str):
10+
from logging import getLogger
11+
logger = getLogger('netbox_lifecycle.template_content')
12+
logger.info(f'{message}')
13+
914
class DeviceHardwareInfoExtension(PluginTemplateExtension):
1015
def right_page(self):
1116
object = self.context.get('object')
1217
support_contract = contract.SupportContractAssignment.objects.filter(device_id=self.context['object'].id).first()
18+
log_info(f'Kind is: {self.kind}')
1319
match self.kind:
1420
case "device":
1521
content_type = ContentType.objects.get(app_label="dcim", model="devicetype")
16-
lifecycle_info = hardware.HardwareLifecycle.objects.filter(assigned_object_id=self.context['object'].device_type_id,
17-
assigned_object_type_id=content_type.id).first()
22+
lifecycle_info = hardware.HardwareLifecycle.objects.filter(
23+
assigned_object_id=self.context['object'].device_type_id,
24+
assigned_object_type_id=content_type.id
25+
).first()
1826
case "module":
1927
content_type = ContentType.objects.get(app_label="dcim", model="moduletype")
20-
lifecycle_info = hardware.HardwareLifecycle.objects.filter(assigned_object_id=self.context['object'].module_type_id,
21-
assigned_object_type_id=content_type.id).first()
28+
lifecycle_info = hardware.HardwareLifecycle.objects.filter(
29+
assigned_object_id=self.context['object'].module_type_id,
30+
assigned_object_type_id=content_type.id
31+
).first()
2232
case "devicetype" | "moduletype":
2333
content_type = ContentType.objects.get(app_label="dcim", model=self.kind)
24-
lifecycle_info = hardware.HardwareLifecycle.objects.filter(assigned_object_id=self.context['object'].id,
25-
assigned_object_type_id=content_type.id).first()
34+
lifecycle_info = hardware.HardwareLifecycle.objects.filter(
35+
assigned_object_id=self.context['object'].id,
36+
assigned_object_type_id=content_type.id
37+
).first()
2638
context = {'support_contract': support_contract, 'lifecycle_info': lifecycle_info}
2739
return self.render('netbox_lifecycle/inc/support_contract_info.html', extra_context=context)
2840

@@ -49,22 +61,22 @@ def right_page(self):
4961

5062

5163
class DeviceHardwareLifecycleInfo(DeviceHardwareInfoExtension):
52-
model = 'dcim.device'
64+
models = ['dcim.device', ]
5365
kind = 'device'
5466

5567

5668
class ModuleHardwareLifecycleInfo(TypeInfoExtension):
57-
model = 'dcim.module'
69+
models = ['dcim.module', ]
5870
kind = 'module'
5971

6072

6173
class DeviceTypeHardwareLifecycleInfo(TypeInfoExtension):
62-
model = 'dcim.devicetype'
74+
models = ['dcim.devicetype', ]
6375
kind = 'devicetype'
6476

6577

6678
class ModuleTypeHardwareLifecycleInfo(TypeInfoExtension):
67-
model = 'dcim.moduletype'
79+
models = ['dcim.moduletype', ]
6880
kind = 'moduletype'
6981

7082

0 commit comments

Comments
 (0)