예제 #1
0
 def view_all(self, request, format=None):
     try:
         query = process_search_query(request.GET)
         serializer = ActivityEmbeddedSerializer(
             Activity.objects(**query).order_by('-id'),
             context={'request': request},
             many=True)
         return Response(status=status.HTTP_200_OK, data=serializer.data)
     except Exception as e:  # pragma: no cover
         return Response(status=status.HTTP_400_BAD_REQUEST,
                         data={'error': str(e.message)})
예제 #2
0
    def discovery(self, request, page=None, format=None, date_range=None):
        try:
            if date_range:
                try:
                    data_range_query_text = "/?from=" + \
                        date_range[0] + "&to=" + date_range[1]
                    from_date = datetime.strptime(date_range[0], '%Y-%m-%d')
                    to_date = datetime.strptime(date_range[1],
                                                '%Y-%m-%d') + timedelta(days=1)
                    activities = Activity.objects(
                        endTime__lte=to_date,
                        endTime__gte=from_date,
                        responseCode__lt=300).order_by('-id')
                except Exception:
                    return Response(
                        status=status.HTTP_422_UNPROCESSABLE_ENTITY,
                        data={
                            'error': "The date range query format is invalid."
                        })
            else:
                activities = Activity.objects(
                    responseCode__lt=300).order_by('-id')
            context = [
                "http://iiif.io/api/presentation/3/context.json",
                "https://www.w3.org/ns/activitystreams"
            ]
            total = activities.count()
            last_page = (total + 20 - 1) // 20
            if page:
                # Construct a specific Collection Page
                if int(page[1:]) == 0:  # Page number must be grater than 0
                    return Response(
                        status=status.HTTP_404_NOT_FOUND,
                        data={
                            'error': "Discovery with page '0' does not exist."
                        })
                if int(page[1:]) > last_page:  # Requested page is out of range
                    return Response(status=status.HTTP_404_NOT_FOUND,
                                    data={
                                        'error':
                                        "Discovery with page '" + page[1:] +
                                        "' does not exist."
                                    })
                type = "CollectionPage"
                if date_range:
                    id = settings.IIIF_BASE_URL + "/discovery" + page + data_range_query_text
                    part_of = {
                        "id": settings.IIIF_BASE_URL + "/discovery" +
                        data_range_query_text,
                        "type": "Collection"
                    }
                else:
                    id = settings.IIIF_BASE_URL + "/discovery" + page
                    part_of = {
                        "id": settings.IIIF_BASE_URL + "/discovery",
                        "type": "Collection"
                    }
                label = "{0} IIIF Discovery Collection: Page{1}".format(
                    settings.TOP_LEVEL_COLLECTION_LABEL, page)
                first = None
                last = None
                if date_range:
                    next = {
                        "id":
                        settings.IIIF_BASE_URL + "/discovery-" +
                        str(int(page[1:]) + 1) + data_range_query_text,
                        "type":
                        "CollectionPage"
                    } if int(page[1:]) + 1 <= last_page else None
                else:
                    next = {
                        "id":
                        settings.IIIF_BASE_URL + "/discovery-" +
                        str(int(page[1:]) + 1),
                        "type":
                        "CollectionPage"
                    } if int(page[1:]) + 1 <= last_page else None

                items = []
                method_mapping = {
                    "POST": "Create",
                    "PUT": "Update",
                    "DELETE": "Delete"
                }
                # Get only the required (20 or less) activities that belong to this page sorted by endTime.
                start_index = (int(page[1:]) - 1) * 20
                end_index = start_index + 20
                if activities:
                    activities = activities[start_index:end_index]
                else:
                    activities = Activity.objects(responseCode__lt=300)[
                        start_index:end_index]  # pragma: no cover
                for activity in activities:
                    items.append({
                        "id":
                        settings.IIIF_BASE_URL + "/activity/" +
                        str(activity.id),
                        "type":
                        method_mapping[activity.requestMethod],
                        "object": {
                            "id": activity.responseBody["@id"],
                            "type": activity.responseBody["@type"]
                        },
                        "actor":
                        activity.username,
                        "startTime":
                        activity.startTime,
                        "endTime":
                        activity.endTime
                    })
                count = len(items)
            else:
                # Construct the Top Level Discovery Collection
                type = "Collection"
                if date_range:
                    id = settings.IIIF_BASE_URL + "/discovery" + data_range_query_text
                else:
                    id = settings.IIIF_BASE_URL + "/discovery"
                part_of = None
                label = "{0} IIIF Discovery Collection".format(
                    settings.TOP_LEVEL_COLLECTION_LABEL)
                count = None
                if date_range:
                    first = {
                        "id": settings.IIIF_BASE_URL + "/discovery-1" +
                        data_range_query_text,
                        "type": "CollectionPage"
                    }
                    last = {
                        "id":
                        settings.IIIF_BASE_URL + "/discovery-" +
                        str(last_page) + data_range_query_text,
                        "type":
                        "CollectionPage"
                    }
                else:
                    first = {
                        "id": settings.IIIF_BASE_URL + "/discovery-1",
                        "type": "CollectionPage"
                    }
                    last = {
                        "id":
                        settings.IIIF_BASE_URL + "/discovery-" +
                        str(last_page),
                        "type":
                        "CollectionPage"
                    }
                next = None
                items = None
                if last_page == 0:
                    last = first
                if (first["id"] == last["id"]):
                    last = {}
                if (total == 0):
                    first = {}
            # Render the response
            discovery = {
                "@context": context,
                "id": id,
                "type": type,
                "partOf": part_of,
                "label": label,
                "total": total,
                "count": count,
                "first": first,
                "last": last,
                "next": next,
                "items": items
            }
            return Response(status=status.HTTP_200_OK, data=discovery)
        except Exception as e:  # pragma: no cover
            return Response(status=status.HTTP_500_INTERNAL_SERVER_ERROR,
                            data={'error': e.message})