Example #1
0
def get_cache_key(instance, serializer, protocol):
    """Get cache key of instance"""
    _id = "|".join([
        "{0}:{1}".format(key, repr(value))
        for (key, value) in get_primary_keys_values(
            instance, instance).items()])

    params = {"id": _id,
              "app_label": instance._meta.app_label,
              "model_name": instance._meta.object_name,
              "serializer_name": serializer.__name__,
              "protocol": protocol}

    return api_settings.SERIALIZER_CACHE_KEY_FORMAT.format(**params)
Example #2
0
    def get_paginated_response(self, data):

        if data and len(data):
            has_distance = False
            loaded_objects = []
            for instance in data.serializer.instance:
                model = instance.model

                try:
                    distance = getattr(instance, "distance", None)
                    if not has_distance and isinstance(distance, Distance):
                        has_distance = True
                except SpatialError as ex:
                    pass

                loaded_objects.append(
                    model.objects.all().
                    filter(**get_primary_keys_values(
                                instance, instance.model)).
                    first())

            # Get the results serializer from the original View that originated
            # the current response
            results_serializer = \
                data.serializer.context['view'].results_serializer_class

            serializer = results_serializer(loaded_objects, many=True)
            detail_data = serializer.data

            # Copy the relevance score into the model object
            for i_obj, obj in enumerate(detail_data):
                obj["score"] = data[i_obj].get("score", None)

            # Copy the distance field if it exists in the results
            if has_distance:
                for i_obj, obj in enumerate(detail_data):
                    obj["distance"] = data[i_obj].get("distance", None)

            data = detail_data

        return Response(OrderedDict([
            ('total', self.page.paginator.count),
            ('page', len(data)),
            ('next', self.get_next_link()),
            ('previous', self.get_previous_link()),
            ('results', data)
        ]))
    def get_paginated_response(self, data):

        if data and len(data):
            has_distance = False
            loaded_objects = []
            for instance in data.serializer.instance:
                model = instance.model

                try:
                    distance = getattr(instance, "distance", None)
                    if not has_distance and isinstance(distance, Distance):
                        has_distance = True
                except SpatialError as ex:
                    pass

                if hasattr(instance, "already_loaded") and instance.already_loaded:
                    loaded_objects.append(instance.model(**instance.__dict__))
                elif "request" in data.serializer.context and ("fields" in data.serializer.context["request"].GET):
                    filter_fields = list(model._primary_keys.keys())
                    selected_fields = data.serializer.context["request"].GET["fields"].split(",")
                    filter_fields.extend(list(selected_fields))
                    instance = model(
                        **dict(
                            zip(
                                filter_fields,
                                model.objects.all()
                                .filter(**get_primary_keys_values(instance, instance.model))
                                .values_list(*filter_fields, flat=False)
                                .first(),
                            )
                        )
                    )

                    # Used by the caching process
                    instance._caravaggio_fields = selected_fields
                    loaded_objects.append(instance)
                else:
                    loaded_objects.append(
                        model.objects.all().filter(**get_primary_keys_values(instance, instance.model)).first()
                    )

            # Get the results serializer from the original View that originated
            # the current response
            results_serializer = data.serializer.context["view"].results_serializer_class

            extra_args = {"context": data.serializer.context}

            if "request" in data.serializer.context and ("fields" in data.serializer.context["request"].GET):
                extra_args["fields"] = data.serializer.context["request"].GET["fields"].split(",")

            serializer = results_serializer(loaded_objects, many=True, **extra_args)
            detail_data = serializer.data

            # Copy the relevance score into the model object
            for i_obj, obj in enumerate(detail_data):
                obj["score"] = data[i_obj].get("score", None)

            # Copy the distance field if it exists in the results
            if has_distance:
                for i_obj, obj in enumerate(detail_data):
                    obj["distance"] = data[i_obj].get("distance", None)

            data = detail_data

        return Response(
            OrderedDict(
                [
                    ("total", self.page.paginator.count),
                    ("page", len(data)),
                    ("next", self.get_next_link()),
                    ("previous", self.get_previous_link()),
                    ("results", data),
                ]
            )
        )