serializers.py 2.0 KB

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