class GroupSerializer(GroupCreateSerializer, serializers.DynamicReadonlyFieldsModelSerializer):
    user_roles = UserRolesSerializer(source='roles', many=True, allow_add_remove=True)
    allow_nodes = serializers.BooleanField()
    allow_slices = serializers.BooleanField()
    slices = serializers.RelHyperlinkedRelatedField(many=True, source='slices',
        read_only=True, view_name='slice-detail')
    nodes = serializers.RelHyperlinkedRelatedField(many=True, source='nodes',
        read_only=True, view_name='node-detail')
    
    class Meta:
        model = Group
    
    def validate_user_roles(self, attrs, name):
        """ checks at least one admin per group """
        for role in attrs.get(name, []):
            if role.is_group_admin:
                return attrs
        raise serializers.ValidationError('The group must have at least one admin')
Beispiel #2
0
class SliceCreateSerializer(serializers.UriHyperlinkedModelSerializer):
    id = serializers.Field()
    expires_on = serializers.DateTimeField(read_only=True)
    instance_sn = serializers.IntegerField(read_only=True)
    properties = serializers.PropertyField()
    isolated_vlan_tag = serializers.IntegerField(read_only=True)
    sliver_defaults = SliverDefaultsSerializer()
    slivers = serializers.RelHyperlinkedRelatedField(many=True, read_only=True,
        view_name='sliver-detail')
    
    class Meta:
        model = Slice
        exclude = ('set_state',)
class GroupRolesSerializer(serializers.ModelSerializer):
    group = serializers.RelHyperlinkedRelatedField(view_name='group-detail')
    
    class Meta:
        model = Roles
        exclude = ['id', 'user']
    
    def get_identity(self, data):
        try:
            group = data.get('group', {})
            return group.get('uri')
        except AttributeError:
            return None
Beispiel #4
0
class SliverDefaultsSerializer(serializers.ModelSerializer):
    instance_sn = serializers.IntegerField(read_only=True)
    data_uri = FakeFileField(field='data', required=False)
    template = serializers.RelHyperlinkedRelatedField(view_name='template-detail')
    # FIXME refactor move to resources app when api.aggregate supports nested serializers
    if is_installed('resources'):
        from resources.serializers import ResourceReqSerializer
        resources = ResourceReqSerializer(source='slice_resources', many=True, required=False)

    class Meta:
        model = SliverDefaults
        exclude = ('id', 'slice', 'data')
    
    def to_native(self, obj):
        """ hack for implementing dynamic file_uri's on FakeFile """
        self.__object__ = obj
        return super(SliverDefaultsSerializer, self).to_native(obj)
class NodeCreateSerializer(serializers.UriHyperlinkedModelSerializer):
    id = serializers.Field()
    properties = serializers.PropertyField()
    arch = serializers.ChoiceField(choices=settings.NODES_NODE_ARCHS, required=True)
    slivers = serializers.RelHyperlinkedRelatedField(many=True, read_only=True,
        view_name='sliver-detail')
    direct_ifaces = DirectIfaceSerializer(required=False, many=True, allow_add_remove=True)
    cert = serializers.Field(source='api.cert')
    boot_sn = serializers.IntegerField(read_only=True)
    api = NodeApiSerializer(required=False)
    
    class Meta:
        model = Node
        exclude = ('set_state',) + FW_CONFIG_FIELDS

    def get_fields(self, *args, **kwargs):
        """
        Filter groups: the user creating this node must be a
        group or node administrator of this group, and the group
        must have node creation allowed (/allow_nodes=true).
        
        """
        fields = super(NodeCreateSerializer, self).get_fields(*args, **kwargs)
        try:
            user = self.context['view'].request.user
        except KeyError: # avoid error when used out of Rest API
            return fields
        queryset = fields['group'].queryset
        if not user.is_superuser:
            msg = " Check if you have group or node administrator roles at the provided group."
            fields['group'].error_messages['does_not_exist'] += msg
            # bug #321: filter by user.id (None for Anonymous users)
            fields['group'].queryset = queryset.filter(
                Q(roles__is_group_admin=True) | Q(roles__is_node_admin=True),
                allow_nodes=True, roles__user=user.id)
        return fields
    
    def validate_tinc(self, attrs, source):
        from tinc.serializers import validate_tinc
        return validate_tinc(self, attrs, source)
class TincAddressSerializer(serializers.ModelSerializer):
    island = serializers.RelHyperlinkedRelatedField(view_name='island-detail')

    class Meta:
        model = TincAddress
        exclude = ('id', 'host')