serializers.py 1.9 KB

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