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()
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())
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()
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()
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()
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()
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)
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
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