188 lines
6.4 KiB
Python
188 lines
6.4 KiB
Python
from rest_framework import serializers
|
|
from rest_framework.serializers import SerializerMethodField, HyperlinkedIdentityField
|
|
from django.utils.translation import gettext_lazy as _
|
|
|
|
from netbox.api.serializers import NetBoxModelSerializer
|
|
from netbox_slm.models import SoftwareProduct, SoftwareProductVersion, SoftwareProductInstallation, SoftwareLicense
|
|
|
|
|
|
class SoftwareLicenseSerializer(NetBoxModelSerializer):
|
|
display = SerializerMethodField()
|
|
url = HyperlinkedIdentityField(view_name="plugins-api:netbox_slm-api:softwarelicense-detail")
|
|
|
|
class Meta:
|
|
model = SoftwareLicense
|
|
fields = (
|
|
"id",
|
|
"display",
|
|
"url",
|
|
"name",
|
|
"description",
|
|
"type",
|
|
"spdx_expression",
|
|
"stored_location",
|
|
"stored_location_url",
|
|
"start_date",
|
|
"expiration_date",
|
|
"lifetime",
|
|
"renewal_interval",
|
|
"renewal_interval_unit",
|
|
"support",
|
|
"license_amount",
|
|
"license_file",
|
|
"license_key",
|
|
"provider_portal_url",
|
|
"expiration_notifications_enabled",
|
|
"default_notification_intervals",
|
|
"custom_notification_interval",
|
|
"custom_notification_interval_unit",
|
|
"email_notifications",
|
|
"software_product",
|
|
"version",
|
|
"installation",
|
|
"tenant_group",
|
|
"tenant",
|
|
"tags",
|
|
"comments",
|
|
"custom_field_data",
|
|
"created",
|
|
"last_updated",
|
|
)
|
|
brief_fields = ("id", "display", "url", "name", "description")
|
|
|
|
def get_display(self, obj):
|
|
return f"{obj}"
|
|
|
|
def validate(self, attrs):
|
|
request = self.context.get("request")
|
|
if (
|
|
"email_notifications" in attrs
|
|
and request is not None
|
|
and not request.user.has_perm("netbox_slm.manage_softwarelicense_email_notifications")
|
|
):
|
|
raise serializers.ValidationError(
|
|
{"email_notifications": _("You do not have permission to change email notifications.")}
|
|
)
|
|
|
|
tenant_group = attrs.get("tenant_group", getattr(self.instance, "tenant_group", None))
|
|
tenant = attrs.get("tenant", getattr(self.instance, "tenant", None))
|
|
if tenant_group and tenant and tenant.group_id != tenant_group.pk:
|
|
raise serializers.ValidationError(
|
|
{"tenant": _("The selected tenant does not belong to the selected tenant group.")}
|
|
)
|
|
lifetime = attrs.get("lifetime", getattr(self.instance, "lifetime", False))
|
|
renewal_interval = attrs.get("renewal_interval", getattr(self.instance, "renewal_interval", None))
|
|
renewal_interval_unit = attrs.get(
|
|
"renewal_interval_unit", getattr(self.instance, "renewal_interval_unit", "")
|
|
)
|
|
expiration_date = attrs.get("expiration_date", getattr(self.instance, "expiration_date", None))
|
|
if bool(renewal_interval) != bool(renewal_interval_unit):
|
|
raise serializers.ValidationError(
|
|
{"renewal_interval": _("Renewal interval and unit must be specified together.")}
|
|
)
|
|
if lifetime and (renewal_interval or renewal_interval_unit or expiration_date):
|
|
raise serializers.ValidationError(
|
|
{"lifetime": _("A lifetime license cannot have a renewal interval or expiration date.")}
|
|
)
|
|
custom_interval = attrs.get(
|
|
"custom_notification_interval", getattr(self.instance, "custom_notification_interval", None)
|
|
)
|
|
custom_interval_unit = attrs.get(
|
|
"custom_notification_interval_unit",
|
|
getattr(self.instance, "custom_notification_interval_unit", ""),
|
|
)
|
|
if bool(custom_interval) != bool(custom_interval_unit):
|
|
raise serializers.ValidationError(
|
|
{
|
|
"custom_notification_interval": _(
|
|
"Custom notification interval and unit must be specified together."
|
|
)
|
|
}
|
|
)
|
|
return attrs
|
|
|
|
|
|
class SoftwareProductSerializer(NetBoxModelSerializer):
|
|
display = SerializerMethodField()
|
|
url = HyperlinkedIdentityField(view_name="plugins-api:netbox_slm-api:softwareproduct-detail")
|
|
|
|
class Meta:
|
|
model = SoftwareProduct
|
|
fields = (
|
|
"id",
|
|
"display",
|
|
"url",
|
|
"name",
|
|
"description",
|
|
"manufacturer",
|
|
"description",
|
|
"tags",
|
|
"comments",
|
|
"custom_field_data",
|
|
"created",
|
|
"last_updated",
|
|
)
|
|
brief_fields = ("id", "display", "url", "name", "description")
|
|
|
|
def get_display(self, obj):
|
|
return f"{obj}"
|
|
|
|
|
|
class SoftwareProductInstallationSerializer(NetBoxModelSerializer):
|
|
display = SerializerMethodField()
|
|
url = HyperlinkedIdentityField(view_name="plugins-api:netbox_slm-api:softwareproductinstallation-detail")
|
|
|
|
class Meta:
|
|
model = SoftwareProductInstallation
|
|
fields = (
|
|
"id",
|
|
"display",
|
|
"url",
|
|
"device",
|
|
"virtualmachine",
|
|
"cluster",
|
|
"software_product",
|
|
"version",
|
|
"tags",
|
|
"comments",
|
|
"custom_field_data",
|
|
"created",
|
|
"last_updated",
|
|
)
|
|
brief_fields = ("id", "display", "url")
|
|
|
|
def get_display(self, obj):
|
|
return f"{obj}"
|
|
|
|
|
|
class SoftwareProductVersionSerializer(NetBoxModelSerializer):
|
|
display = SerializerMethodField()
|
|
url = HyperlinkedIdentityField(view_name="plugins-api:netbox_slm-api:softwareproductversion-detail")
|
|
|
|
class Meta:
|
|
model = SoftwareProductVersion
|
|
fields = (
|
|
"id",
|
|
"display",
|
|
"url",
|
|
"name",
|
|
"description",
|
|
"release_date",
|
|
"documentation_url",
|
|
"end_of_support",
|
|
"filename",
|
|
"file_checksum",
|
|
"file_link",
|
|
"release_type",
|
|
"software_product",
|
|
"tags",
|
|
"comments",
|
|
"custom_field_data",
|
|
"created",
|
|
"last_updated",
|
|
)
|
|
brief_fields = ("id", "display", "url", "name", "description")
|
|
|
|
def get_display(self, obj):
|
|
return f"{obj}"
|