Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions netbox_lifecycle/choices/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
from .contract import ContractStatusChoices

__all__ = ('ContractStatusChoices',)
22 changes: 22 additions & 0 deletions netbox_lifecycle/choices/contract.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
from django.utils.translation import gettext as _
from utilities.choices import ChoiceSet

from netbox_lifecycle import constants


class ContractStatusChoices(ChoiceSet):
"""
Support contract status choices.
"""

ACTIVE = constants.CONTRACT_STATUS_ACTIVE
EXPIRED = constants.CONTRACT_STATUS_EXPIRED
FUTURE = constants.CONTRACT_STATUS_FUTURE
UNSPECIFIED = constants.CONTRACT_STATUS_UNSPECIFIED

CHOICES = (
(ACTIVE, _('Active')),
(FUTURE, _('Future')),
(UNSPECIFIED, _('Unspecified')),
(EXPIRED, _('Expired')),
)
53 changes: 52 additions & 1 deletion netbox_lifecycle/filtersets/contract.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,15 @@
import django_filters
from dcim.models import Device, Manufacturer, Module
from django.utils import timezone

from dcim.models import Device, Manufacturer, Module, DeviceType
from django.db.models import Q
from django.utils.translation import gettext as _
from netbox.filtersets import NetBoxModelFilterSet
from utilities.filtersets import register_filterset
from virtualization.models import VirtualMachine

from netbox_lifecycle import constants
from netbox_lifecycle.choices import ContractStatusChoices
from netbox_lifecycle.models import (
License,
SupportContract,
Expand All @@ -21,6 +26,7 @@
)


@register_filterset
class VendorFilterSet(NetBoxModelFilterSet):

class Meta:
Expand All @@ -38,6 +44,7 @@ def search(self, queryset, name, value):
return queryset.filter(qs_filter).distinct()


@register_filterset
class SupportSKUFilterSet(NetBoxModelFilterSet):
manufacturer_id = django_filters.ModelMultipleChoiceFilter(
field_name='manufacturer',
Expand All @@ -56,6 +63,7 @@ class Meta:
fields = (
'id',
'q',
'manufacturer_id',
'sku',
)

Expand All @@ -66,6 +74,7 @@ def search(self, queryset, name, value):
return queryset.filter(qs_filter).distinct()


@register_filterset
class SupportContractFilterSet(NetBoxModelFilterSet):
vendor_id = django_filters.ModelMultipleChoiceFilter(
field_name='vendor',
Expand All @@ -85,6 +94,7 @@ class Meta:
'id',
'q',
'contract_id',
'vendor_id',
)

def search(self, queryset, name, value):
Expand All @@ -94,6 +104,7 @@ def search(self, queryset, name, value):
return queryset.filter(qs_filter).distinct()


@register_filterset
class SupportContractAssignmentFilterSet(NetBoxModelFilterSet):
contract_id = django_filters.ModelMultipleChoiceFilter(
field_name='contract',
Expand All @@ -117,6 +128,17 @@ class SupportContractAssignmentFilterSet(NetBoxModelFilterSet):
to_field_name='sku',
label=_('SKU'),
)
device_type_id = django_filters.ModelMultipleChoiceFilter(
field_name='device__device_type',
queryset=DeviceType.objects.all(),
label=_('Device Type (ID)'),
)
device_type = django_filters.ModelMultipleChoiceFilter(
field_name='device__device_type__model',
queryset=DeviceType.objects.all(),
to_field_name='model',
label=_('Device Type (model)'),
)
device_id = django_filters.ModelMultipleChoiceFilter(
field_name='device',
queryset=Device.objects.all(),
Expand Down Expand Up @@ -167,12 +189,26 @@ class SupportContractAssignmentFilterSet(NetBoxModelFilterSet):
to_field_name='status',
label=_('Device Status'),
)
status = django_filters.ChoiceFilter(
choices=ContractStatusChoices.CHOICES,
method='filter_status',
label=_('Status'),
)

class Meta:
model = SupportContractAssignment
fields = (
'id',
'q',
'contract_id',
'sku_id',
'device_type_id',
'device_id',
'module_id',
'virtual_machine_id',
'license_id',
'device_status',
'status',
)

def search(self, queryset, name, value):
Expand All @@ -191,3 +227,18 @@ def search(self, queryset, name, value):
| Q(license__license__name__icontains=value)
)
return queryset.filter(qs_filter).distinct()

def filter_status(self, queryset, name, value):
Comment thread
jsenecal marked this conversation as resolved.
today = timezone.now().date()
expired = Q(end__lt=today) | Q(end__isnull=True, contract__end__lt=today)
future = Q(contract__start__gt=today)
unspecified = Q(end__isnull=True, contract__end__isnull=True)
if value == constants.CONTRACT_STATUS_ACTIVE:
return queryset.exclude(expired).exclude(future)
elif value == constants.CONTRACT_STATUS_FUTURE:
return queryset.filter(future)
elif value == constants.CONTRACT_STATUS_EXPIRED:
return queryset.filter(expired)
elif value == constants.CONTRACT_STATUS_UNSPECIFIED:
return queryset.filter(unspecified).exclude(future)
return queryset
3 changes: 3 additions & 0 deletions netbox_lifecycle/filtersets/hardware.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,10 @@

__all__ = ('HardwareLifecycleFilterSet',)

from utilities.filtersets import register_filterset


@register_filterset
class HardwareLifecycleFilterSet(NetBoxModelFilterSet):
assigned_object_type_id = django_filters.ModelMultipleChoiceFilter(
queryset=ContentType.objects.all()
Expand Down
8 changes: 8 additions & 0 deletions netbox_lifecycle/filtersets/license.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
from django.db.models import Q
from django.utils.translation import gettext as _
from netbox.filtersets import NetBoxModelFilterSet
from utilities.filtersets import register_filterset
from virtualization.models import VirtualMachine

from netbox_lifecycle.models import License, LicenseAssignment, Vendor
Expand All @@ -13,6 +14,7 @@
)


@register_filterset
class LicenseFilterSet(NetBoxModelFilterSet):
manufacturer_id = django_filters.ModelMultipleChoiceFilter(
field_name='manufacturer',
Expand All @@ -32,6 +34,7 @@ class Meta:
'id',
'q',
'name',
'manufacturer_id',
)

def search(self, queryset, name, value):
Expand All @@ -41,6 +44,7 @@ def search(self, queryset, name, value):
return queryset.filter(qs_filter).distinct()


@register_filterset
class LicenseAssignmentFilterSet(NetBoxModelFilterSet):
license_id = django_filters.ModelMultipleChoiceFilter(
field_name='license',
Expand Down Expand Up @@ -92,6 +96,10 @@ class Meta:
fields = (
'id',
'q',
'license_id',
'vendor_id',
'device_id',
'virtual_machine_id',
)

def search(self, queryset, name, value):
Expand Down
7 changes: 7 additions & 0 deletions netbox_lifecycle/forms/model_forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ class SupportSKUForm(NetBoxModelForm):
manufacturer = DynamicModelChoiceField(
queryset=Manufacturer.objects.all(),
selector=False,
quick_add=True,
)

class Meta:
Expand All @@ -63,6 +64,7 @@ class SupportContractForm(NetBoxModelForm):
vendor = DynamicModelChoiceField(
queryset=Vendor.objects.all(),
selector=True,
quick_add=True,
)

class Meta:
Expand All @@ -88,11 +90,13 @@ class SupportContractAssignmentForm(NetBoxModelForm):
contract = DynamicModelChoiceField(
queryset=SupportContract.objects.all(),
selector=True,
quick_add=True,
)
sku = DynamicModelChoiceField(
queryset=SupportSKU.objects.all(),
required=False,
selector=True,
quick_add=True,
label=_('SKU'),
)
device = DynamicModelChoiceField(
Expand Down Expand Up @@ -238,6 +242,7 @@ class LicenseForm(NetBoxModelForm):
manufacturer = DynamicModelChoiceField(
queryset=Manufacturer.objects.all(),
selector=False,
quick_add=True,
)

class Meta:
Expand All @@ -255,10 +260,12 @@ class LicenseAssignmentForm(NetBoxModelForm):
vendor = DynamicModelChoiceField(
queryset=Vendor.objects.all(),
selector=True,
quick_add=True,
)
license = DynamicModelChoiceField(
queryset=License.objects.all(),
selector=True,
quick_add=True,
)
device = DynamicModelChoiceField(
queryset=Device.objects.all(),
Expand Down
4 changes: 3 additions & 1 deletion netbox_lifecycle/models/contract.py
Original file line number Diff line number Diff line change
Expand Up @@ -51,13 +51,15 @@ class SupportSKU(PrimaryModel):
on_delete=models.CASCADE,
related_name='skus',
)
sku = models.CharField(max_length=100)
sku = models.CharField(verbose_name=_('SKU'), max_length=100)

clone_fields = ('manufacturer',)
prerequisite_models = ('dcim.Manufacturer',)

class Meta:
ordering = ['manufacturer', 'sku']
verbose_name = 'Support SKU'
verbose_name_plural = 'Support SKUs'
constraints = (
models.UniqueConstraint(
'manufacturer',
Expand Down
Loading
Loading