def test_runs_operations_without_env_argument(self): # The "env" argument was added in Wagtail 1.5. This tests that # image operations written for 1.4 will still work run_mock = Mock() def run(willow, image): run_mock(willow, image) self.operation_instance.run = run fil = Filter(spec='operation1|operation2') image = Image.objects.create( title="Test image", file=get_test_image_file(), ) with warnings.catch_warnings(record=True) as ws: warnings.simplefilter('always') fil.run(image, BytesIO()) self.assertEqual(len(ws), 2) self.assertIs(ws[0].category, RemovedInWagtail19Warning) self.assertEqual(run_mock.call_count, 2)
def test_cache_key_fill_filter_with_focal_point(self): image = Image( width=1000, height=1000, focal_point_width=100, focal_point_height=100, focal_point_x=500, focal_point_y=500 ) fil = Filter(spec="fill-100x100") cache_key = fil.get_cache_key(image) self.assertEqual(cache_key, "0bbe3b2f")
def test_runs_operations(self): self.operation_instance.run = Mock() fil = Filter(spec="operation1|operation2") image = Image.objects.create(title="Test image", file=get_test_image_file()) fil.run(image, BytesIO()) self.assertEqual(self.operation_instance.run.call_count, 2)
def test_gif(self): fil = Filter(spec='width-400|format-gif') image = Image.objects.create( title="Test image", file=get_test_image_file(), ) out = fil.run(image, BytesIO()) self.assertEqual(out.format_name, 'gif')
def test_runs_operations(self): self.operation_instance.run = Mock() fil = Filter(spec='operation1|operation2') image = Image.objects.create( title="Test image", file=get_test_image_file(), ) fil.run(image, BytesIO()) self.assertEqual(self.operation_instance.run.call_count, 2)
def test_jpeg_quality_filter_overrides_setting(self): fil = Filter(spec='width-400|jpegquality-40') image = Image.objects.create( title="Test image", file=get_test_image_file_jpeg(), ) f = BytesIO() with patch('PIL.Image.Image.save') as save: fil.run(image, f) save.assert_called_with(f, 'JPEG', quality=40, optimize=True, progressive=True)
def test_vary_key_fill_filter_with_focal_point(self): image = Image( width=1000, height=1000, focal_point_width=100, focal_point_height=100, focal_point_x=500, focal_point_y=500, ) fil = Filter(spec='fill-100x100') vary_key = fil.get_vary_key(image) self.assertEqual(vary_key, '0bbe3b2f')
def test_cache_key_fill_filter_with_focal_point(self): image = Image( width=1000, height=1000, focal_point_width=100, focal_point_height=100, focal_point_x=500, focal_point_y=500, ) fil = Filter(spec='fill-100x100') cache_key = fil.get_cache_key(image) self.assertEqual(cache_key, '0bbe3b2f')
def generate_url(request, image_id, filter_spec): # Get the image Image = get_image_model() try: image = Image.objects.get(id=image_id) except Image.DoesNotExist: return json_response({ 'error': "Cannot find image." }, status=404) # Check if this user has edit permission on this image if not image.is_editable_by_user(request.user): return json_response({ 'error': "You do not have permission to generate a URL for this image." }, status=403) # Parse the filter spec to make sure its valid if not Filter(spec=filter_spec).is_valid(): return json_response({ 'error': "Invalid filter spec." }, status=400) # Generate url signature = generate_signature(image_id, filter_spec) url = reverse('wagtailimages_serve', args=(signature, image_id, filter_spec)) # Get site root url try: site_root_url = Site.objects.get(is_default_site=True).root_url except Site.DoesNotExist: site_root_url = Site.objects.first().root_url return json_response({'url': site_root_url + url, 'local_url': url}, status=200)
def test_invalid(self): fil = Filter(spec='width-400|format-foo') image = Image.objects.create( title="Test image", file=get_test_image_file(), ) self.assertRaises(InvalidFilterSpecError, fil.run, image, BytesIO())
def preview(request, image_id, filter_spec): image = get_object_or_404(get_image_model(), id=image_id) try: return Filter(spec=filter_spec).run(image, HttpResponse(content_type='image/jpeg')) except InvalidFilterSpecError: return HttpResponse("Invalid filter spec: " + filter_spec, content_type='text/plain', status=400)
def get_mock_rendition(self, rendition_filter): """Create a mock rendition object that wraps the original image. Using the template tag {% image image 'original' %} will return an <img> tag linking to the original file (instead of a file copy, as is default Wagtail behavior). Template tags with Wagtail size-related filters (width, height, max, and min), e.g. {% image image 'max-165x165' %}, will generate an <img> tag with appropriate size parameters, following logic from wagtail.wagtailimages.image_operations. """ if isinstance(rendition_filter, string_types): rendition_filter = Filter(spec=rendition_filter) width = self.width height = self.height for operation in rendition_filter.operations: if isinstance(operation, DoNothingOperation): continue if not any([ isinstance(operation, WidthHeightOperation), isinstance(operation, MinMaxOperation), ]): raise RuntimeError('non-size operations not supported on GIFs') width, height = self.apply_size_operation(operation, width, height) return CFGOVRendition(image=self, file=self.file, width=width, height=height)
def test_jpeg_quality_filter_too_big(self): fil = Filter(spec='width-400|jpegquality-101') image = Image.objects.create( title="Test image", file=get_test_image_file_jpeg(), ) self.assertRaises(InvalidFilterSpecError, fil.run, image, BytesIO())
def test_runs_operations(self): run_mock = Mock() def run(willow, image, env): run_mock(willow, image, env) self.operation_instance.run = run fil = Filter(spec='operation1|operation2') image = Image.objects.create( title="Test image", file=get_test_image_file(), ) fil.run(image, BytesIO()) self.assertEqual(run_mock.call_count, 2)
def get_image_field_display(self, field_name, field): """ Render an image """ image = getattr(self.instance, field_name) if image: fltr = Filter(spec='max-400x400') rendition = image.get_rendition(fltr) return rendition.img_tag return self.model_admin.get_empty_value_display(field_name)
def preview(request, image_id, filter_spec): image = get_object_or_404(get_image_model(), id=image_id) try: response, image_format = Filter(spec=filter_spec).run(image, HttpResponse()) response['Content-Type'] = 'image/' + image_format return response except InvalidFilterSpecError: return HttpResponse("Invalid filter spec: " + filter_spec, content_type='text/plain', status=400)
def serve(request, signature, image_id, filter_spec): image = get_object_or_404(get_image_model(), id=image_id) if not verify_signature(signature.encode(), image_id, filter_spec): raise PermissionDenied try: return Filter(spec=filter_spec).process_image(image.file.file, HttpResponse(content_type='image/jpeg'), focal_point=image.focal_point) except Filter.InvalidFilterSpecError: return HttpResponse("Invalid filter spec: " + filter_spec, content_type='text/plain', status=400)
def preview(request, image_id, filter_spec): image = get_object_or_404(get_image_model(), id=image_id) try: return Filter(spec=filter_spec).process_image( image.file.file, HttpResponse(content_type='image/jpeg'), focal_point=image.get_focal_point()) except Filter.InvalidFilterSpecError: return HttpResponse("Invalid filter spec: " + filter_spec, content_type='text/plain', status=400)
def test_uniqueness_constraint(self): image = CFGOVImage.objects.create(title='test', file=get_test_image_file()) filt = Filter(spec='original') def create_rendition(image, filt): return CFGOVRendition.objects.create( filter_spec=filt.spec, image=image, file=image.file, width=100, height=100, focal_point_key=filt.get_cache_key(image)) create_rendition(image=image, filt=filt) with self.assertRaises(IntegrityError): create_rendition(image=image, filt=filt)
def generate_url(request, image_id, filter_spec): # Get the image Image = get_image_model() try: image = Image.objects.get(id=image_id) except Image.DoesNotExist: return JsonResponse({'error': "Cannot find image."}, status=404) # Check if this user has edit permission on this image if not permission_policy.user_has_permission_for_instance( request.user, 'change', image): return JsonResponse( { 'error': "You do not have permission to generate a URL for this image." }, status=403) # Parse the filter spec to make sure its valid try: Filter(spec=filter_spec).operations except InvalidFilterSpecError: return JsonResponse({'error': "Invalid filter spec."}, status=400) # Generate url signature = generate_signature(image_id, filter_spec) url = reverse('wagtailimages_serve', args=(signature, image_id, filter_spec)) # Get site root url try: site_root_url = Site.objects.get(is_default_site=True).root_url except Site.DoesNotExist: site_root_url = Site.objects.first().root_url # Generate preview url preview_url = reverse('wagtailimages:preview', args=(image_id, filter_spec)) return JsonResponse( { 'url': site_root_url + url, 'preview_url': preview_url }, status=200)
def admin_thumb(self, obj): try: image = getattr(obj, self.thumb_image_field_name, None) except AttributeError: raise ImproperlyConfigured( u"The `thumb_image_field_name` attribute on your `%s` class " "must name a field on your model." % self.__class__.__name__) img_attrs = { 'src': self.thumb_default, 'width': self.thumb_image_width, 'class': self.thumb_classname, } if image: fltr = Filter(spec=self.thumb_image_filter_spec) img_attrs.update({'src': image.get_rendition(fltr).url}) return mark_safe('<img{}>'.format(flatatt(img_attrs))) elif self.thumb_default: return mark_safe('<img{}>'.format(flatatt(img_attrs))) return ''
def filter(self): return Filter(spec=self.filter_spec)
def test_vary_key(self): image = Image(width=1000, height=1000) fil = Filter(spec='max-100x100') vary_key = fil.get_vary_key(image) self.assertEqual(vary_key, '')
def test_cache_key_fill_filter(self): image = Image(width=1000, height=1000) fil = Filter(spec="fill-100x100") cache_key = fil.get_cache_key(image) self.assertEqual(cache_key, "2e16d0ba")
def test_cache_key(self): image = Image(width=1000, height=1000) fil = Filter(spec="max-100x100") cache_key = fil.get_cache_key(image) self.assertEqual(cache_key, "")
def test_image_original_filter_class(self): image = CFGOVImage(file=self.mock_gif, width=100, height=100) rendition_filter = Filter(spec='original') rendition = image.get_rendition(rendition_filter) self.assertEqual(rendition.file, image.file)
def resolve_url(self, args, context, info): filter = Filter() filter.spec = 'width-{}'.format(args.get('width')) return self.get_rendition(filter).url
def test_cache_key_fill_filter(self): image = Image(width=1000, height=1000) fil = Filter(spec='fill-100x100') cache_key = fil.get_cache_key(image) self.assertEqual(cache_key, '2e16d0ba')
def test_cache_key(self): image = Image(width=1000, height=1000) fil = Filter(spec='max-100x100') cache_key = fil.get_cache_key(image) self.assertEqual(cache_key, '')
def test_vary_key_fill_filter(self): image = Image(width=1000, height=1000) fil = Filter(spec='fill-100x100') vary_key = fil.get_vary_key(image) self.assertEqual(vary_key, '2e16d0ba')