jobs.py 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. from drf_spectacular.utils import extend_schema_field
  2. from rest_framework import serializers
  3. from core.choices import *
  4. from core.models import Job
  5. from netbox.api.exceptions import SerializerNotFound
  6. from netbox.api.fields import ChoiceField, ContentTypeField
  7. from netbox.api.serializers import BaseModelSerializer
  8. from users.api.serializers_.users import UserSerializer
  9. from utilities.api import get_serializer_for_model
  10. __all__ = (
  11. 'JobSerializer',
  12. )
  13. class JobSerializer(BaseModelSerializer):
  14. user = UserSerializer(
  15. nested=True,
  16. read_only=True
  17. )
  18. status = ChoiceField(choices=JobStatusChoices, read_only=True)
  19. object_type = ContentTypeField(
  20. read_only=True
  21. )
  22. object = serializers.SerializerMethodField(
  23. read_only=True
  24. )
  25. notifications = ChoiceField(choices=JobNotificationChoices, read_only=True)
  26. class Meta:
  27. model = Job
  28. fields = [
  29. 'id', 'url', 'display_url', 'display', 'object_type', 'object_id', 'object', 'name', 'status', 'created',
  30. 'scheduled', 'interval', 'started', 'completed', 'user', 'data', 'error', 'job_id', 'queue_name',
  31. 'notifications', 'log_entries',
  32. ]
  33. brief_fields = ('url', 'created', 'completed', 'user', 'status')
  34. @extend_schema_field(serializers.JSONField(allow_null=True))
  35. def get_object(self, obj):
  36. """
  37. Serialize a nested representation of the object.
  38. """
  39. if obj.object is None:
  40. return None
  41. try:
  42. serializer = get_serializer_for_model(obj.object)
  43. except SerializerNotFound:
  44. return obj.object_repr
  45. context = {'request': self.context['request']}
  46. return serializer(obj.object, nested=True, context=context).data