contacts.py 3.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. from django.contrib.auth.models import ContentType
  2. from drf_spectacular.types import OpenApiTypes
  3. from drf_spectacular.utils import extend_schema_field
  4. from rest_framework import serializers
  5. from netbox.api.fields import ChoiceField, ContentTypeField, SerializedPKRelatedField
  6. from netbox.api.serializers import NestedGroupModelSerializer, NetBoxModelSerializer
  7. from tenancy.choices import ContactPriorityChoices
  8. from tenancy.models import ContactAssignment, Contact, ContactGroup, ContactRole
  9. from utilities.api import get_serializer_for_model
  10. from .nested import NestedContactGroupSerializer
  11. __all__ = (
  12. 'ContactAssignmentSerializer',
  13. 'ContactGroupSerializer',
  14. 'ContactRoleSerializer',
  15. 'ContactSerializer',
  16. )
  17. class ContactGroupSerializer(NestedGroupModelSerializer):
  18. parent = NestedContactGroupSerializer(required=False, allow_null=True, default=None)
  19. contact_count = serializers.IntegerField(read_only=True, default=0)
  20. class Meta:
  21. model = ContactGroup
  22. fields = [
  23. 'id', 'url', 'display_url', 'display', 'name', 'slug', 'parent', 'description', 'tags', 'custom_fields',
  24. 'created', 'last_updated', 'contact_count', '_depth',
  25. ]
  26. brief_fields = ('id', 'url', 'display', 'name', 'slug', 'description', 'contact_count', '_depth')
  27. class ContactRoleSerializer(NetBoxModelSerializer):
  28. class Meta:
  29. model = ContactRole
  30. fields = [
  31. 'id', 'url', 'display_url', 'display', 'name', 'slug', 'description', 'tags', 'custom_fields',
  32. 'created', 'last_updated',
  33. ]
  34. brief_fields = ('id', 'url', 'display', 'name', 'slug', 'description')
  35. class ContactSerializer(NetBoxModelSerializer):
  36. groups = SerializedPKRelatedField(
  37. queryset=ContactGroup.objects.all(),
  38. serializer=ContactGroupSerializer,
  39. required=False,
  40. many=True
  41. )
  42. class Meta:
  43. model = Contact
  44. fields = [
  45. 'id', 'url', 'display_url', 'display', 'groups', 'name', 'title', 'phone', 'email', 'address', 'link',
  46. 'description', 'comments', 'tags', 'custom_fields', 'created', 'last_updated',
  47. ]
  48. brief_fields = ('id', 'url', 'display', 'name', 'description')
  49. class ContactAssignmentSerializer(NetBoxModelSerializer):
  50. object_type = ContentTypeField(
  51. queryset=ContentType.objects.all()
  52. )
  53. object = serializers.SerializerMethodField(read_only=True)
  54. contact = ContactSerializer(nested=True)
  55. role = ContactRoleSerializer(nested=True, required=False, allow_null=True)
  56. priority = ChoiceField(choices=ContactPriorityChoices, allow_blank=True, required=False, default=lambda: '')
  57. class Meta:
  58. model = ContactAssignment
  59. fields = [
  60. 'id', 'url', 'display', 'object_type', 'object_id', 'object', 'contact', 'role', 'priority',
  61. 'tags', 'custom_fields', 'created', 'last_updated',
  62. ]
  63. brief_fields = ('id', 'url', 'display', 'contact', 'role', 'priority')
  64. @extend_schema_field(OpenApiTypes.OBJECT)
  65. def get_object(self, instance):
  66. serializer = get_serializer_for_model(instance.object_type.model_class())
  67. context = {'request': self.context['request']}
  68. return serializer(instance.object, nested=True, context=context).data