events.py 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. from rest_framework import serializers
  2. from core.models import ObjectType
  3. from extras.choices import *
  4. from extras.models import EventRule, Webhook
  5. from netbox.api.fields import ChoiceField, ContentTypeField
  6. from netbox.api.gfk_fields import GFKSerializerField
  7. from netbox.api.serializers import NetBoxModelSerializer
  8. from netbox.event_rules import get_event_rule_action_choices
  9. from users.api.serializers_.mixins import OwnerMixin
  10. __all__ = (
  11. 'EventRuleSerializer',
  12. 'WebhookSerializer',
  13. )
  14. #
  15. # Event Rules
  16. #
  17. class EventRuleSerializer(OwnerMixin, NetBoxModelSerializer):
  18. object_types = ContentTypeField(
  19. queryset=ObjectType.objects.with_feature('event_rules'),
  20. many=True
  21. )
  22. action_type = ChoiceField(choices=[]) # Choices are set by get_fields()
  23. action_object_type = ContentTypeField(
  24. queryset=ObjectType.objects.all(),
  25. required=False,
  26. allow_null=True,
  27. )
  28. # A plugin action can target a model without a REST API serializer
  29. action_object = GFKSerializerField(read_only=True, allow_missing_serializer=True)
  30. action_is_available = serializers.BooleanField(read_only=True)
  31. class Meta:
  32. model = EventRule
  33. fields = [
  34. 'id', 'url', 'display_url', 'display', 'object_types', 'name', 'enabled', 'event_types', 'conditions',
  35. 'action_type', 'action_object_type', 'action_object_id', 'action_object', 'action_is_available',
  36. 'description', 'custom_fields', 'owner', 'tags', 'created', 'last_updated',
  37. ]
  38. brief_fields = ('id', 'url', 'display', 'name', 'description')
  39. def get_fields(self):
  40. fields = super().get_fields()
  41. # Rebuild action_type from the live registry on each instantiation to ensure all registered
  42. # actions are captured as choices.
  43. if 'action_type' in fields:
  44. fields['action_type'] = ChoiceField(choices=get_event_rule_action_choices())
  45. return fields
  46. #
  47. # Webhooks
  48. #
  49. class WebhookSerializer(OwnerMixin, NetBoxModelSerializer):
  50. class Meta:
  51. model = Webhook
  52. fields = [
  53. 'id', 'url', 'display_url', 'display', 'name', 'description', 'payload_url', 'http_method',
  54. 'http_content_type', 'additional_headers', 'body_template', 'secret', 'ssl_verification', 'ca_file_path',
  55. 'timeout', 'custom_fields', 'owner', 'tags', 'created', 'last_updated',
  56. ]
  57. brief_fields = ('id', 'url', 'display', 'name', 'description')