コード例 #1
0
    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)
コード例 #2
0
    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)
コード例 #3
0
    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")
コード例 #4
0
    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)
コード例 #5
0
    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')
コード例 #6
0
    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')
コード例 #7
0
    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)
コード例 #8
0
    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)
コード例 #9
0
    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')
コード例 #10
0
    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')
コード例 #11
0
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)
コード例 #12
0
    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)
コード例 #13
0
 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())
コード例 #14
0
ファイル: images.py プロジェクト: nsdont/wagtail
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)
コード例 #15
0
ファイル: images.py プロジェクト: zachurban/cfgov-refresh
    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)
コード例 #16
0
 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())
コード例 #17
0
    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)
コード例 #18
0
ファイル: views.py プロジェクト: trumpet2012/wagtail
 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)
コード例 #19
0
ファイル: images.py プロジェクト: wuchengjiang/wagtail
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)
コード例 #20
0
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)
コード例 #21
0
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)
コード例 #22
0
    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)
コード例 #23
0
ファイル: images.py プロジェクト: zhanght0311/awd-platform
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)
コード例 #24
0
ファイル: options.py プロジェクト: trumpet2012/wagtail
    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 ''
コード例 #25
0
 def filter(self):
     return Filter(spec=self.filter_spec)
コード例 #26
0
    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, '')
コード例 #27
0
    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")
コード例 #28
0
    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, "")
コード例 #29
0
 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)
コード例 #30
0
 def resolve_url(self, args, context, info):
     filter = Filter()
     filter.spec = 'width-{}'.format(args.get('width'))
     return self.get_rendition(filter).url
コード例 #31
0
    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')
コード例 #32
0
    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, '')
コード例 #33
0
    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')