mirror of https://github.com/jumpserver/jumpserver
				
				
				
			
		
			
				
	
	
		
			77 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Python
		
	
	
			
		
		
	
	
			77 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Python
		
	
	
| # -*- coding: utf-8 -*-
 | |
| #
 | |
| import json
 | |
| 
 | |
| from django.db import models
 | |
| from django import forms
 | |
| from django.utils import six
 | |
| from django.core.exceptions import ValidationError
 | |
| from django.utils.translation import ugettext as _
 | |
| from rest_framework import serializers
 | |
| from .utils import get_signer
 | |
| 
 | |
| signer = get_signer()
 | |
| 
 | |
| 
 | |
| class DictField(forms.Field):
 | |
|     widget = forms.Textarea
 | |
| 
 | |
|     def to_python(self, value):
 | |
|         """Returns a Python boolean object."""
 | |
|         # Explicitly check for the string 'False', which is what a hidden field
 | |
|         # will submit for False. Also check for '0', since this is what
 | |
|         # RadioSelect will provide. Because bool("True") == bool('1') == True,
 | |
|         # we don't need to handle that explicitly.
 | |
|         if isinstance(value, six.string_types):
 | |
|             try:
 | |
|                 value = json.loads(value)
 | |
|                 return value
 | |
|             except json.JSONDecodeError:
 | |
|                 return ValidationError(_("Not a valid json"))
 | |
|         else:
 | |
|             return ValidationError(_("Not a string type"))
 | |
| 
 | |
|     def validate(self, value):
 | |
|         if isinstance(value, ValidationError):
 | |
|             raise value
 | |
|         if not value and self.required:
 | |
|             raise ValidationError(self.error_messages['required'], code='required')
 | |
| 
 | |
|     def has_changed(self, initial, data):
 | |
|         # Sometimes data or initial may be a string equivalent of a boolean
 | |
|         # so we should run it through to_python first to get a boolean value
 | |
|         return self.to_python(initial) != self.to_python(data)
 | |
| 
 | |
| 
 | |
| class StringIDField(serializers.Field):
 | |
|     def to_representation(self, value):
 | |
|         return {"pk": value.pk, "name": value.__str__()}
 | |
| 
 | |
| 
 | |
| class StringManyToManyField(serializers.RelatedField):
 | |
|     def to_representation(self, value):
 | |
|         return value.__str__()
 | |
| 
 | |
| 
 | |
| class EncryptMixin:
 | |
|     def from_db_value(self, value, expression, connection, context):
 | |
|         if value is not None:
 | |
|             return signer.unsign(value)
 | |
|         return super().from_db_value(self, value, expression, connection, context)
 | |
| 
 | |
|     def get_prep_value(self, value):
 | |
|         if value is None:
 | |
|             return value
 | |
|         return signer.sign(value).decode('utf-8')
 | |
| 
 | |
| 
 | |
| class EncryptTextField(EncryptMixin, models.TextField):
 | |
|     description = _("Encrypt field using Secret Key")
 | |
| 
 | |
| 
 | |
| class EncryptCharField(EncryptMixin, models.CharField):
 | |
|     def __init__(self, *args, **kwargs):
 | |
|         kwargs['max_length'] = 2048
 | |
|         super().__init__(*args, **kwargs)
 | |
| 
 |