Exemple #1
0
    def get(self, request, format=None):
        # Parse and validate query parameters
        params = ImageSearchQueryStringSerializer(data=request.query_params)
        if not params.is_valid():
            return input_error_response(params.errors)

        hashed_ip = hash(_get_user_ip(request))
        page_param = params.data[PAGE]
        page_size = params.data[PAGESIZE]
        qa = params.data[QA]
        filter_dead = params.data[FILTER_DEAD]

        search_index = 'search-qa' if qa else 'image'
        try:
            results, page_count, result_count = search_controller.search(
                params,
                search_index,
                page_size,
                hashed_ip,
                request,
                filter_dead,
                page=page_param
            )
        except ValueError as value_error:
            return input_error_response(str(value_error))

        context = {'request': request}
        serialized_results = ImageSerializer(
            results, many=True, context=context
        ).data

        if len(results) < page_size and page_count == 0:
            result_count = len(results)
        response_data = {
            RESULT_COUNT: result_count,
            PAGE_COUNT: page_count,
            PAGE_SIZE: len(results),
            RESULTS: serialized_results
        }
        serialized_response = ImageSearchResultsSerializer(data=response_data)
        return Response(status=200, data=serialized_response.initial_data)
Exemple #2
0
 def get(self, request, identifier, format=None):
     params = WatermarkQueryStringSerializer(data=request.query_params)
     if not params.is_valid():
         return input_error_response()
     try:
         image_record = Image.objects.get(identifier=identifier)
     except Image.DoesNotExist:
         return Response(status=404, data='Not Found')
     image_url = str(image_record.url)
     image_info = {
         'title': image_record.title,
         'creator': image_record.creator,
         'license': image_record.license,
         'license_version': image_record.license_version
     }
     # Create the actual watermarked image.
     watermarked, exif = watermark(
         image_url, image_info, params.data['watermark']
     )
     # Re-insert EXIF metadata.
     if exif:
         exif_bytes = piexif.dump(exif)
     else:
         exif_bytes = None
     img_bytes = io.BytesIO()
     _save_wrapper(watermarked, exif_bytes, img_bytes)
     if params.data['embed_metadata']:
         # Embed ccREL metadata with XMP.
         work_properties = {
             'creator': image_record.creator,
             'license_url': image_record.license_url,
             'attribution': image_record.attribution,
             'work_landing_page': image_record.foreign_landing_url,
             'identifier': str(image_record.identifier)
         }
         try:
             with_xmp = ccrel.embed_xmp_bytes(img_bytes, work_properties)
             return FileResponse(with_xmp, content_type='image/jpeg')
         except (libxmp.XMPError, AttributeError) as e:
             # Just send the EXIF-ified file if libxmp fails to add metadata.
             log.error(
                 'Failed to add XMP metadata to {}'
                 .format(image_record.identifier)
             )
             log.error(e)
             response = HttpResponse(content_type='image/jpeg')
             _save_wrapper(watermarked, exif_bytes, response)
             return response
     else:
         response = HttpResponse(img_bytes, content_type='image/jpeg')
         _save_wrapper(watermarked, exif_bytes, response)
         return response