示例#1
0
 def test_direct_access(self):
     self.assertEqual(0, get_media_for_record(
         self.record, user=self.user).count())
     AccessControl.objects.create(
         user=self.user, content_object=self.collection, read=True)
     self.assertEqual(1, get_media_for_record(
         self.record, user=self.user).count())
     AccessControl.objects.filter(user=self.user).delete()
示例#2
0
 def test_standalone_record_access(self):
     self.assertEqual(0, get_media_for_record(
         self.record_standalone, user=self.user).count())
     AccessControl.objects.create(
         user=self.user,
         content_object=self.presentation_standalone_record,
         read=True
     )
     self.assertEqual(1, get_media_for_record(
         self.record_standalone, user=self.user).count())
示例#3
0
 def test_presentation_must_contain_record(self):
     self.assertEqual(0, get_media_for_record(
         self.record, user=self.user).count())
     AccessControl.objects.create(
         user=self.user,
         content_object=self.presentation_no_record,
         read=True
     )
     self.assertEqual(0, get_media_for_record(
         self.record, user=self.user).count())
     AccessControl.objects.filter(user=self.user).delete()
示例#4
0
 def test_simple_presentation_access(self):
     self.assertEqual(0, get_media_for_record(
         self.record, user=self.user).count())
     AccessControl.objects.create(
         user=self.user, content_object=self.presentation_broken, read=True)
     self.assertEqual(0, get_media_for_record(
         self.record, user=self.user).count())
     AccessControl.objects.create(
         user=self.user, content_object=self.presentation_ok, read=True)
     self.assertEqual(1, get_media_for_record(
         self.record, user=self.user).count())
     AccessControl.objects.filter(user=self.user).delete()
示例#5
0
 def test_hidden_presentation_access(self):
     self.assertEqual(0, get_media_for_record(
         self.record, user=self.user).count())
     AccessControl.objects.create(
         user=self.user, content_object=self.presentation_hidden, read=True)
     self.assertEqual(0, get_media_for_record(
         self.record, user=self.user).count())
     self.presentation_hidden.hidden = False
     self.presentation_hidden.save()
     self.assertEqual(1, get_media_for_record(
         self.record, user=self.user).count())
     AccessControl.objects.filter(user=self.user).delete()
     self.presentation_hidden.hidden = True
     self.presentation_hidden.save()
示例#6
0
 def test_password_access(self):
     self.assertEqual(0, get_media_for_record(
         self.record, user=self.user).count())
     AccessControl.objects.create(
         user=self.user,
         content_object=self.presentation_password,
         read=True
     )
     self.assertEqual(0, get_media_for_record(
         self.record, user=self.user).count())
     passwords = dict(((self.presentation_password.id, 'test'),))
     self.assertEqual(1, get_media_for_record(
         self.record, user=self.user, passwords=passwords).count())
     AccessControl.objects.filter(user=self.user).delete()
示例#7
0
def retrieve_pseudostream(request, recordid, record, mediaid, media):

    mediaobj = get_media_for_record(recordid, request.user).get(id=mediaid)

    q = dict()
    start = request.GET.get('start', '')
    if start.isdigit():
        q['start'] = start
    end = request.GET.get('end', '')
    if end.isdigit():
        q['end'] = end
    client = request.GET.get('client')
    if client:
        q['client'] = client

    url = mediaobj.storage.urlbase
    url = url + ('/' if not url.endswith('/') else '') + \
        mediaobj.url.replace('\\', '/')
    if q:
        url = url + '?' + urlencode(q)

    try:
        result = urlopen(url)
        response = HttpResponse(FileWrapper(result),
                                content_type=result.info().get('Content-Type'))
        response['Content-Length'] = result.info().get('Content-Length')
        return response
    except HTTPError as e:
        return HttpResponse(status=e.errno)
示例#8
0
def retrieve(request, recordid, record, mediaid, media):
    # check if media exists
    mediaobj = get_media_for_record(recordid, request.user).filter(id=mediaid)

    # check download status
    if not mediaobj or not mediaobj[0].is_downloadable_by(request.user):
        return HttpResponseForbidden()
    mediaobj = mediaobj[0]

    # Allow passing in an argument to prevent setting "attachment" content
    # disposition, which keeps e.g. the PDF viewer built into Google Chrome
    # from working
    inline = 'inline' in request.GET
    name = smart_str(mediaobj.url)

    if mediaobj.is_local():  # support byte range requests

        try:
            content_file = mediaobj.get_absolute_file_path()
        except IOError:
            logging.error(
                "mediaobj.get_absolute_file_path() failed for media.id %s" %
                mediaid)
            raise Http404()

        retval = RangedFileResponse(request,
                                    open(content_file, 'rb'),
                                    content_type=mediaobj.mimetype)

    else:

        try:
            content = mediaobj.load_file()
        except IOError:
            logging.error("mediaobj.load_file() failed for media.id %s" %
                          mediaid)
            raise Http404()

        if content:
            retval = HttpResponse(content=content,
                                  content_type=str(mediaobj.mimetype))
        else:
            inline = True
            retval = HttpResponseRedirect(mediaobj.get_absolute_url())

    if not inline:
        retval["Content-Disposition"] = \
            'attachment; filename="%s"' % name

    Activity.objects.create(event='media-download',
                            request=request,
                            content_object=mediaobj)
    return retval
示例#9
0
def slide_manifest(request, slide, owner, offline=False):

    fieldvalues = slide.get_fieldvalues(owner=owner)
    title = slide.title_from_fieldvalues(fieldvalues) or 'Untitled',
    id = get_id(request, 'slide', 'canvas', 'slide%d' % slide.id)
    image = slide.record.get_image_url(
        force_reprocess=False,
        handler='storage-retrieve-iiif-image',
    )

    metadata = get_metadata(fieldvalues)
    if slide.annotation:
        metadata.insert(0, dict(label='Annotation', value=slide.annotation))

    passwords = request.session.get('passwords', dict())
    media = get_media_for_record(slide.record, request.user, passwords)
    if len(media):
        media = media[0]
        media.identify(lazy=True)
        canvas_width = width = media.width or 1600
        canvas_height = height = media.height or 1200
    else:
        width = height = None
        canvas_width = 1200
        canvas_height = 1200

    while canvas_height < 1200 or canvas_width < 1200:
        canvas_height *= 2
        canvas_width *= 2

    if width and height:

        resource = {
            '@id': image,
            '@type': 'dctypes:Image',
            'format': 'image/jpeg',
            "height": height,
            "width": width
        }

        if not offline:
            resource['service'] = {
                '@context': 'http://iiif.io/api/image/2/context.json',
                '@id': image,
                'profile': 'http://iiif.io/api/image/2/level1.json'
            }

        images = [{
            '@type': 'oa:Annotation',
            'motivation': 'sc:painting',
            'resource': resource,
            'on': id,
        }]

    else:

        return special_slide(
            request,
            kind='missing',
            label='Missing image',
            index=slide.id,
            offline=offline,
        )

    result = {
        '@id': id,
        '@type': 'sc:Canvas',
        'label': title,
        "height": canvas_height,
        "width": canvas_width,
        'images': images,
        'metadata': metadata,
    }

    if offline:
        result['thumbnail'] = {
            '@id': '/thumbs' + image ,
        }

    return result