serializers.py 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. from __future__ import unicode_literals
  2. from rest_framework import serializers
  3. from rest_framework.validators import UniqueTogetherValidator
  4. from dcim.api.serializers import NestedDeviceSerializer
  5. from secrets.models import Secret, SecretRole
  6. from utilities.api import ValidatedModelSerializer
  7. #
  8. # SecretRoles
  9. #
  10. class SecretRoleSerializer(ValidatedModelSerializer):
  11. class Meta:
  12. model = SecretRole
  13. fields = ['id', 'name', 'slug']
  14. class NestedSecretRoleSerializer(serializers.ModelSerializer):
  15. url = serializers.HyperlinkedIdentityField(view_name='secrets-api:secretrole-detail')
  16. class Meta:
  17. model = SecretRole
  18. fields = ['id', 'url', 'name', 'slug']
  19. #
  20. # Secrets
  21. #
  22. class SecretSerializer(serializers.ModelSerializer):
  23. device = NestedDeviceSerializer()
  24. role = NestedSecretRoleSerializer()
  25. class Meta:
  26. model = Secret
  27. fields = ['id', 'device', 'role', 'name', 'plaintext', 'hash', 'created', 'last_updated']
  28. class WritableSecretSerializer(serializers.ModelSerializer):
  29. plaintext = serializers.CharField()
  30. class Meta:
  31. model = Secret
  32. fields = ['id', 'device', 'role', 'name', 'plaintext', 'hash', 'created', 'last_updated']
  33. validators = []
  34. def validate(self, data):
  35. # Encrypt plaintext data using the master key provided from the view context
  36. if data.get('plaintext'):
  37. s = Secret(plaintext=data['plaintext'])
  38. s.encrypt(self.context['master_key'])
  39. data['ciphertext'] = s.ciphertext
  40. data['hash'] = s.hash
  41. # Validate uniqueness of name if one has been provided.
  42. if data.get('name'):
  43. validator = UniqueTogetherValidator(queryset=Secret.objects.all(), fields=('device', 'role', 'name'))
  44. validator.set_context(self)
  45. validator(data)
  46. # Enforce model validation
  47. super(WritableSecretSerializer, self).validate(data)
  48. return data