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')
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
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')