def to_internal_value(self, data): if not isinstance(data, dict): raise serializers.ValidationError( {'detail': "Input [%s] must be a dict." % data}) if data.keys() != ['id']: raise serializers.ValidationError( {'detail': 'Only accepts {"id":"int"}'}) repo_id = convert_str_to_int(data['id']) try: rc = models.Repo.objects.get(id=repo_id) except models.Repo.DoesNotExist: raise serializers.ValidationError( {'detail': "Repo with id %s doesn't exist" % repo_id}) return rc
def to_internal_value(self, data): if not isinstance(data, dict): raise serializers.ValidationError({'detail': "Input [%s] for ReleaseComponent must be a dict." % data}) if set(data.keys()) not in [set(['id']), set(['release', 'name'])]: raise serializers.ValidationError( {'detail': "Only accept ['id'] or ['release', 'name']"}) kwargs = dict() if 'id' in data: kwargs['id'] = convert_str_to_int(data.get('id')) else: kwargs['release__release_id'] = data.get('release') kwargs['name'] = data.get('name') try: rc = ReleaseComponent.objects.get(**kwargs) except ReleaseComponent.DoesNotExist: raise serializers.ValidationError({'detail': "ReleaseComponent [%s] doesn't exist" % data}) return rc
def to_internal_value(self, data): if not isinstance(data, dict): raise serializers.ValidationError({"detail": "Input [%s] for ReleaseComponent must be a dict." % data}) if set(data.keys()) not in [set(["id"]), set(["release", "global_component", "name"])]: raise serializers.ValidationError( {"detail": "Only accept ['id'] or ['release', 'global_component', 'name']"} ) kwargs = dict() if "id" in data: kwargs["id"] = convert_str_to_int(data.get("id")) else: kwargs["release__release_id"] = data.get("release") kwargs["global_component__name"] = data.get("global_component") kwargs["name"] = data.get("name") try: rc = ReleaseComponent.objects.get(**kwargs) except ReleaseComponent.DoesNotExist: raise serializers.ValidationError({"detail": "ReleaseComponent [%s] doesn't exist" % data}) return rc
def bulk_destroy(self, request): """ This API call allows deleting repositories. It is an almost exact mirror of `create` call. The same data must be fed into it. __Method__: `DELETE` __URL__: `/repos/` __Data__: { "release_id": string, "variant_uid": string, "arch": string, "service": string, "repo_family": string, "content_format": string, "content_category": string, "name": string, "shadow": bool, "product_id": <int|null> } It is possible to send a list of these objects so that multiple repositories can be deleted at the same time atomically. __Response__: Nothing """ data = request.data in_bulk = True if not isinstance(data, list): data = [data] in_bulk = False for idx, input in enumerate(data): input_id = (' in input %d' % idx) if in_bulk else '' allowed_keys = set(['release_id', 'variant_uid', 'arch', 'service', 'repo_family', 'content_format', 'content_category', 'name', 'shadow', 'product_id']) missing_keys = allowed_keys - set(input.keys()) additional_keys = set(input.keys()) - allowed_keys if missing_keys: resp = Response(status=status.HTTP_400_BAD_REQUEST, data={'detail': 'Missing arguments: %s%s' % (', '.join(missing_keys), input_id)}) resp.exception = True return resp if additional_keys: resp = Response(status=status.HTTP_400_BAD_REQUEST, data={'detail': 'Unknown data fields: %s%s' % (', '.join(additional_keys), input_id)}) resp.exception = True return resp kwargs = {'variant_arch__arch__name': input['arch'], 'variant_arch__variant__variant_uid': input['variant_uid'], 'variant_arch__variant__release__release_id': input['release_id'], 'service__name': input['service'], 'repo_family__name': input['repo_family'], 'content_format__name': input['content_format'], 'content_category__name': input['content_category'], 'name': input['name'], 'shadow': hacks.convert_str_to_bool(input['shadow'], name='shadow'), 'product_id': (hacks.convert_str_to_int(input['product_id'], name='product_id') if input['product_id'] is not None else None)} obj = models.Repo.objects.get(**kwargs) request.changeset.add('Repo', obj.pk, json.dumps(obj.export()), 'null') obj.delete() return Response(status=status.HTTP_204_NO_CONTENT)