コード例 #1
0
    def retrieve(self, cseid, ft):
        if cseid not in self._db.list_collection_names():
            raise KeyError

        result = self._db[cseid].find_one(ft)

        if result is None:
            return None

        elif 'ty' in result:
            resource = ResourcesFactory().create(ty=result['ty'])
            resource.load(pc={resource.get_rtn(): result})

            rtn = None
            if 'rtn' in result:
                rtn = result['rtn']
                result.pop('rtn')
            else:
                raise KeyError

            _id = None
            if '_id' in result:
                _id = result['_id']
                result.pop('_id')
            else:
                raise KeyError

            resource.load({rtn: result})
            resource.set_id(str(_id))

            return resource

        else:
            raise TypeError
コード例 #2
0
ファイル: views.py プロジェクト: franjial/ghostm2m
def m2mrequest(request, cseid, resourceid=None, attrib=None):
    data = json.loads(request.body)
    primitive = None

    # parse URL
    try:
        http_to = dict()
        http_to['cse-id'] = cseid

        if resourceid is not None:
            http_to['unstructured-resource-id'] = resourceid

        if attrib is not None:
            http_to['attr'] = attrib

    except:
        resp = ResponsePrimitive(
            0, ResponseStatusCode.INTERNAL_SERVER_ERROR.value)
        return JsonResponse(resp.toDict())

    try:
        if 'm2m:rqp' in data:
            primitive = data['m2m:rqp']
    except KeyError:
        resp = ResponsePrimitive(0, ResponseStatusCode.BAD_REQUEST.value)
        return JsonResponse(resp.toDict())

    try:
        if 'fr' in primitive:
            fr = primitive['fr']
            username, pwd = fr.split(':', maxsplit=2)
            user = User(username, pwd)
            if not user.valid():
                resp = ResponsePrimitive(
                    0, ResponseStatusCode.OPERATION_NOT_ALLOWED.value)
                return JsonResponse(resp.toDict())

    except Exception:
        resp = ResponsePrimitive(0, ResponseStatusCode.BAD_REQUEST.value)
        return JsonResponse(resp.toDict())

    # CREATE or NOTIFY
    if request.method == "POST":

        try:
            if 'op' in primitive:
                op = primitive['op']
        except KeyError:
            return JsonResponse({
                'status': 0,
                'info': 'no operation in primitive'
            })

        try:
            if 'ty' in primitive:
                ty = primitive['ty']
        except KeyError:
            return JsonResponse({
                'status': 0,
                'info': 'no resourceType in request primitive'
            })

        if op == Operation.Create.value:
            resource = None
            try:
                if primitive['ty'] == ResourceType.AE.value:
                    target_resource = http_to['cse-id']
                else:
                    target_resource = http_to['unstructured-resource-id']

                if target_resource is None:
                    resp = ResponsePrimitive(
                        rsc=ResponseStatusCode.BAD_REQUEST.value)
                    return JsonResponse(resp.toDict())

                pc = None
                if 'pc' in primitive:
                    pc = primitive['pc']
                resource = ResourcesFactory().create(ty=primitive['ty'],
                                                     pc=pc,
                                                     pi=target_resource)
                mapper = MappersFactory().get(resource)
                ri = mapper.store(http_to['cse-id'], resource)
                resource.set_id(ri)
                resp = ResponsePrimitive(rsc=ResponseStatusCode.CREATED.value)
                resp.set_pc(resource.toDict())
                return JsonResponse(resp.toDict())

            except:
                resp = ResponsePrimitive(
                    rsc=ResponseStatusCode.BAD_REQUEST.value)
                return JsonResponse(resp.toDict())

        else:
            resp = ResponsePrimitive(
                rsc=ResponseStatusCode.NOT_IMPLEMENTED.value)
            return JsonResponse(resp.toDict())

    # RETRIEVE or DISCOVERY
    elif request.method == "GET":
        try:
            try:
                if 'op' in primitive:
                    op = primitive['op']
            except KeyError:
                rsp = ResponsePrimitive(
                    rsc=ResponseStatusCode.BAD_REQUEST.value)
                return JsonResponse(rsp.toDict())

            if op == Operation.Retrieve.value:
                if 'unstructured-resource-id' in http_to:
                    resource = ResourceMapper().retrieve(
                        http_to["cse-id"],
                        {'_id': ObjectId(http_to['unstructured-resource-id'])})
                else:
                    resource = ResourceMapper().retrieve(
                        http_to["cse-id"], {'csi': http_to['cse-id']})

                filter_criteria = request.GET.dict()

                if filter_criteria:
                    # DISCOVERY
                    results = ResourceMapper().discovery(
                        http_to["cse-id"], http_to['unstructured-resource-id'],
                        filter_criteria)
                    rsp = {
                        "m2m:rsp": {
                            "pc": {
                                "m2m:uril": results
                            },
                            "rsc": ResponseStatusCode.OK.value,
                            "ri": resource.get_id()
                        }
                    }
                    return JsonResponse(rsp)

                if 'attr' in http_to:
                    if hasattr(resource, http_to['attr']):
                        target_attr = getattr(resource, http_to['attr'])
                        rsp = ResponsePrimitive(
                            rsc=ResponseStatusCode.OK.value)
                        rsp.set_pc(target_attr)
                        return JsonResponse(rsp.toDict())
                    else:
                        rsp = ResponsePrimitive(
                            rsc=ResponseStatusCode.NOT_FOUND.value)
                        return JsonResponse(rsp.toDict())

                else:
                    if resource is None:
                        rsp = ResponsePrimitive(
                            rsc=ResponseStatusCode.NOT_FOUND.value)
                        return JsonResponse(rsp.toDict())

                    rsp = ResponsePrimitive(rsc=ResponseStatusCode.OK.value)
                    rsp.set_pc(resource.toDict())
                    return JsonResponse(rsp.toDict())

            else:
                rsp = ResponsePrimitive(
                    rsc=ResponseStatusCode.NOT_IMPLEMENTED.value)
                return JsonResponse(rsp.toDict())

        except Exception:
            rsp = ResponsePrimitive(
                rsc=ResponseStatusCode.INTERNAL_SERVER_ERROR.value)
            return JsonResponse(rsp.toDict())

    else:
        rsp = ResponsePrimitive(rsc=ResponseStatusCode.NOT_IMPLEMENTED.value)
        return JsonResponse(rsp.toDict())