mirror of https://github.com/jumpserver/jumpserver
				
				
				
			
		
			
				
	
	
		
			78 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Python
		
	
	
			
		
		
	
	
			78 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Python
		
	
	
from django.db.models import Count
 | 
						|
from django.utils.translation import gettext_lazy as _
 | 
						|
from rest_framework import serializers
 | 
						|
 | 
						|
from common.serializers.fields import ObjectRelatedField, LabeledChoiceField
 | 
						|
from orgs.mixins.serializers import BulkOrgResourceModelSerializer
 | 
						|
from .const import label_resource_types
 | 
						|
from .models import Label, LabeledResource
 | 
						|
 | 
						|
__all__ = ['LabelSerializer', 'LabeledResourceSerializer', 'ContentTypeResourceSerializer']
 | 
						|
 | 
						|
 | 
						|
class LabelSerializer(BulkOrgResourceModelSerializer):
 | 
						|
    class Meta:
 | 
						|
        model = Label
 | 
						|
        fields = [
 | 
						|
            'id', 'name', 'value', 'color', 'res_count',
 | 
						|
            'comment', 'date_created', 'date_updated'
 | 
						|
        ]
 | 
						|
        read_only_fields = ('date_created', 'date_updated', 'res_count')
 | 
						|
        extra_kwargs = {
 | 
						|
            'res_count': {'label': _('Resource count')},
 | 
						|
        }
 | 
						|
 | 
						|
    @staticmethod
 | 
						|
    def validate_name(value):
 | 
						|
        if ':' in value or ',' in value:
 | 
						|
            raise serializers.ValidationError(_('Cannot contain ":,"'))
 | 
						|
        return value
 | 
						|
 | 
						|
    def validate_value(self, value):
 | 
						|
        return self.validate_name(value)
 | 
						|
 | 
						|
    @classmethod
 | 
						|
    def setup_eager_loading(cls, queryset):
 | 
						|
        """ Perform necessary eager loading of data. """
 | 
						|
        queryset = queryset.annotate(res_count=Count('labeled_resources', distinct=True))
 | 
						|
        return queryset
 | 
						|
 | 
						|
 | 
						|
class LabeledResourceSerializer(serializers.ModelSerializer):
 | 
						|
    res_type = LabeledChoiceField(
 | 
						|
        choices=[], label=_("Resource type"), source='res_type_id', required=False
 | 
						|
    )
 | 
						|
    label = ObjectRelatedField(queryset=Label.objects, attrs=('id', 'display_name'), label=_("Label"))
 | 
						|
    resource = serializers.CharField(label=_("Resource"))
 | 
						|
 | 
						|
    class Meta:
 | 
						|
        model = LabeledResource
 | 
						|
        fields = ('id', 'label', 'res_type', 'res_id', 'date_created', 'resource', 'date_updated')
 | 
						|
        read_only_fields = ('date_created', 'date_updated', 'resource')
 | 
						|
 | 
						|
    @classmethod
 | 
						|
    def setup_eager_loading(cls, queryset):
 | 
						|
        """ Perform necessary eager loading of data. """
 | 
						|
        queryset = queryset.select_related('label', 'res_type')
 | 
						|
        return queryset
 | 
						|
 | 
						|
    def __init__(self, *args, **kwargs):
 | 
						|
        super().__init__(*args, **kwargs)
 | 
						|
        self.set_res_type_choices()
 | 
						|
 | 
						|
    def set_res_type_choices(self):
 | 
						|
        res_type_field = self.fields.get('res_type')
 | 
						|
        if not res_type_field:
 | 
						|
            return
 | 
						|
 | 
						|
        res_type_field.choices = [(ct.id, ct.name) for ct in label_resource_types]
 | 
						|
 | 
						|
 | 
						|
class ContentTypeResourceSerializer(serializers.Serializer):
 | 
						|
    id = serializers.CharField()
 | 
						|
    name = serializers.SerializerMethodField()
 | 
						|
 | 
						|
    @staticmethod
 | 
						|
    def get_name(obj):
 | 
						|
        return str(obj)
 |