scripts.py 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. from django.utils.translation import gettext as _
  2. from drf_spectacular.utils import extend_schema_field
  3. from rest_framework import serializers
  4. from core.api.serializers_.jobs import JobSerializer
  5. from extras.models import Script
  6. from netbox.api.serializers import ValidatedModelSerializer
  7. __all__ = (
  8. 'ScriptDetailSerializer',
  9. 'ScriptInputSerializer',
  10. 'ScriptSerializer',
  11. )
  12. class ScriptSerializer(ValidatedModelSerializer):
  13. url = serializers.HyperlinkedIdentityField(view_name='extras-api:script-detail')
  14. description = serializers.SerializerMethodField(read_only=True)
  15. vars = serializers.SerializerMethodField(read_only=True)
  16. result = JobSerializer(nested=True, read_only=True)
  17. class Meta:
  18. model = Script
  19. fields = [
  20. 'id', 'url', 'module', 'name', 'description', 'vars', 'result', 'display', 'is_executable',
  21. ]
  22. brief_fields = ('id', 'url', 'display', 'name', 'description')
  23. @extend_schema_field(serializers.JSONField(allow_null=True))
  24. def get_vars(self, obj):
  25. if obj.python_class:
  26. return {
  27. k: v.__class__.__name__ for k, v in obj.python_class()._get_vars().items()
  28. }
  29. else:
  30. return {}
  31. @extend_schema_field(serializers.CharField())
  32. def get_display(self, obj):
  33. return f'{obj.name} ({obj.module})'
  34. @extend_schema_field(serializers.CharField())
  35. def get_description(self, obj):
  36. if obj.python_class:
  37. return obj.python_class().description
  38. else:
  39. return None
  40. class ScriptDetailSerializer(ScriptSerializer):
  41. result = serializers.SerializerMethodField(read_only=True)
  42. @extend_schema_field(JobSerializer())
  43. def get_result(self, obj):
  44. job = obj.jobs.all().order_by('-created').first()
  45. context = {
  46. 'request': self.context['request']
  47. }
  48. data = JobSerializer(job, context=context).data
  49. return data
  50. class ScriptInputSerializer(serializers.Serializer):
  51. data = serializers.JSONField()
  52. commit = serializers.BooleanField()
  53. schedule_at = serializers.DateTimeField(required=False, allow_null=True)
  54. interval = serializers.IntegerField(required=False, allow_null=True)
  55. def validate_schedule_at(self, value):
  56. if value and not self.context['script'].scheduling_enabled:
  57. raise serializers.ValidationError(_("Scheduling is not enabled for this script."))
  58. return value
  59. def validate_interval(self, value):
  60. if value and not self.context['script'].scheduling_enabled:
  61. raise serializers.ValidationError(_("Scheduling is not enabled for this script."))
  62. return value