Exemplo n.º 1
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 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)
Exemplo n.º 2
0
    def test_get_with_serve_action(self):
        signature = generate_signature(self.image.id, 'fill-800x600')
        response = self.client.get(reverse('wagtailimages_serve_action_serve', args=(signature, self.image.id, 'fill-800x600')))

        self.assertEqual(response.status_code, 200)
        self.assertTrue(response.streaming)
        self.assertEqual(response['Content-Type'], 'image/png')
Exemplo n.º 3
0
def image_url(image, filter_spec):
    signature = generate_signature(image.id, filter_spec)
    url = reverse(
        'wagtailimages_serve',
        args=(signature, image.id, filter_spec)
    )
    url += image.file.name[len('original_images/'):]
    return url
Exemplo n.º 4
0
    def test_sendfile_dummy_backend(self):
        signature = generate_signature(self.image.id, 'fill-800x600')
        response = self.client.get(reverse('wagtailimages_sendfile_dummy',
                                           args=(signature, self.image.id,
                                                 'fill-800x600')))

        self.assertEqual(response.status_code, 200)
        self.assertTrue(response.content, 'Dummy backend response')
Exemplo n.º 5
0
    def test_sendfile_nobackend(self):
        signature = generate_signature(self.image.id, 'fill-800x600')
        response = self.client.get(reverse('wagtailimages_sendfile',
                                           args=(signature, self.image.id,
                                                 'fill-800x600')))

        self.assertEqual(response.status_code, 200)
        self.assertEqual(response['Content-Type'], 'image/png')
Exemplo n.º 6
0
    def test_unknown_spec(self):
        signature = generate_signature(self.image.id, 'foo')
        url = reverse('wagtailimages_serve', args=(
            signature, self.image.id, 'foo'))

        self.client.page_login()
        response = self.client.get(url)
        self.assertEqual(response.status_code, 400)
Exemplo n.º 7
0
    def test_unknown_image(self):
        image_id = 9999999999
        signature = generate_signature(image_id, self.filter_spec)
        url = reverse('wagtailimages_serve', args=(
            signature, image_id, self.filter_spec))
        self.client.page_login()

        response = self.client.get(url)
        self.assertEqual(response.status_code, 404)
Exemplo n.º 8
0
    def setUpTestData(cls):
        super(SendFilePrivateViewTestCase, cls).setUpTestData()

        cls.image = ImageFactory()
        cls.filter_spec = 'max-200x150'
        cls.signature = generate_signature(cls.image.id, cls.filter_spec)

        cls.url = reverse('wagtailimages_serve', args=(
            cls.signature, cls.image.id, cls.filter_spec))
Exemplo n.º 9
0
    def test_get_with_redirect_action(self):
        signature = generate_signature(self.image.id, 'fill-800x600')
        response = self.client.get(reverse('wagtailimages_serve_action_redirect', args=(signature, self.image.id, 'fill-800x600')))

        expected_redirect_url = 'http://testserver/media/images/{filename[0]}.2e16d0ba.fill-800x600{filename[1]}'.format(
            filename=os.path.splitext(os.path.basename(self.image.file.path))
        )

        self.assertRedirects(response, expected_redirect_url, status_code=301, fetch_redirect_response=False)
Exemplo n.º 10
0
def get_image_url(image, filter_spec):
    from wagtail.wagtailimages.views.serve import generate_signature

    signature = generate_signature(image.id, filter_spec)
    url = reverse('wagtailimages_serve', args=(signature, image.id, filter_spec))

    # Append image's original filename to the URL (optional)
    url += image.file.name[len('original_images/'):]

    return url
Exemplo n.º 11
0
def image_url(image, filter_spec):
    """
    Return an url for the given image -- shortcut function for
    wagtailimages' serve.
    """
    from wagtail.wagtailimages.views.serve import generate_signature
    signature = generate_signature(image.id, filter_spec)
    url = reverse('wagtailimages_serve', args=(signature, image.id, filter_spec))
    url += image.file.name[len('original_images/'):]
    return url
Exemplo n.º 12
0
    def test_get_with_custom_key(self):
        """
        Test that that the key can be changed on the view
        """
        # Generate signature
        signature = generate_signature(self.image.id, 'fill-800x600', key='custom')

        # Get the image
        response = self.client.get(reverse('wagtailimages_serve_custom_key', args=(signature, self.image.id, 'fill-800x600')) + 'test.png')

        # Check response
        self.assertEqual(response.status_code, 200)
Exemplo n.º 13
0
    def test_get_invalid_signature(self):
        """
        Test that an invalid signature returns a 403 response
        """
        # Generate a signature for the incorrect image id
        signature = generate_signature(self.image.id + 1, 'fill-800x600')

        # Get the image
        response = self.client.get(reverse('wagtailimages_serve', args=(signature, self.image.id, 'fill-800x600')))

        # Check response
        self.assertEqual(response.status_code, 403)
Exemplo n.º 14
0
    def test_get_with_too_many_extra_components(self):
        """
        A filename can be appended to the end of the URL, but it must not contain a '/'
        """
        # Generate signature
        signature = generate_signature(self.image.id, 'fill-800x600')

        # Get the image
        response = self.client.get(reverse('wagtailimages_serve', args=(signature, self.image.id, 'fill-800x600')) + 'test/test.png')

        # URL pattern should not match
        self.assertEqual(response.status_code, 404)
Exemplo n.º 15
0
    def test_get_with_extra_component(self):
        """
        Test that a filename can be optionally added to the end of the URL.
        """
        # Generate signature
        signature = generate_signature(self.image.id, 'fill-800x600')

        # Get the image
        response = self.client.get(reverse('wagtailimages_serve', args=(signature, self.image.id, 'fill-800x600')) + 'test.png')

        # Check response
        self.assertEqual(response.status_code, 200)
        self.assertTrue(response.streaming)
        self.assertEqual(response['Content-Type'], 'image/png')
Exemplo n.º 16
0
    def test_get(self):
        """
        Test a valid GET request to the view
        """
        # Generate signature
        signature = generate_signature(self.image.id, 'fill-800x600')

        # Get the image
        response = self.client.get(reverse('wagtailimages_serve', args=(signature, self.image.id, 'fill-800x600')))

        # Check response
        self.assertEqual(response.status_code, 200)
        self.assertTrue(response.streaming)
        self.assertEqual(response['Content-Type'], 'image/png')
Exemplo n.º 17
0
    def test_get_with_custom_key_using_default_key(self):
        """
        Test that that the key can be changed on the view

        This tests that the default key no longer works when the key is changed on the view
        """
        # Generate signature
        signature = generate_signature(self.image.id, 'fill-800x600')

        # Get the image
        response = self.client.get(reverse('wagtailimages_serve_custom_key', args=(signature, self.image.id, 'fill-800x600')) + 'test.png')

        # Check response
        self.assertEqual(response.status_code, 403)
Exemplo n.º 18
0
    def test_get_missing_source_image_file(self):
        """
        Test that a missing image file gives a 410 response

        When the source image file is missing, it is presumed deleted so we
        return a 410 "Gone" response.
        """
        # Delete the image file
        os.remove(self.image.file.path)

        # Get the image
        signature = generate_signature(self.image.id, 'fill-800x600')
        response = self.client.get(reverse('wagtailimages_serve', args=(signature, self.image.id, 'fill-800x600')))

        # Check response
        self.assertEqual(response.status_code, 410)
Exemplo n.º 19
0
    def test_get_invalid_filter_spec(self):
        """
        Test that an invalid filter spec returns a 400 response

        This is very unlikely to happen in reality. A user would have
        to create signature for the invalid filter spec which can't be
        done with Wagtails built in URL generator. We should test it
        anyway though.
        """
        # Generate a signature with the invalid filterspec
        signature = generate_signature(self.image.id, 'bad-filter-spec')

        # Get the image
        response = self.client.get(reverse('wagtailimages_serve', args=(signature, self.image.id, 'bad-filter-spec')))

        # Check response
        self.assertEqual(response.status_code, 400)
Exemplo n.º 20
0
    def test_get_with_custom_key(self):
        """
        Test that that the key can be changed on the view
        """
        # Generate signature
        signature = generate_signature(self.image.id,
                                       'fill-800x600',
                                       key='custom')

        # Get the image
        response = self.client.get(
            reverse('wagtailimages_serve_custom_key',
                    args=(signature, self.image.id, 'fill-800x600')) +
            'test.png')

        # Check response
        self.assertEqual(response.status_code, 200)
Exemplo n.º 21
0
    def test_get_invalid_filter_spec(self):
        """
        Test that an invalid filter spec returns a 400 response

        This is very unlikely to happen in reality. A user would have
        to create signature for the invalid filter spec which can't be
        done with Wagtails built in URL generator. We should test it
        anyway though.
        """
        # Generate a signature with the invalid filterspec
        signature = generate_signature(self.image.id, 'bad-filter-spec')

        # Get the image
        response = self.client.get(reverse('wagtailimages_serve', args=(signature, self.image.id, 'bad-filter-spec')))

        # Check response
        self.assertEqual(response.status_code, 400)
Exemplo n.º 22
0
    def test_get_with_extra_component(self):
        """
        Test that a filename can be optionally added to the end of the URL.
        """
        # Generate signature
        signature = generate_signature(self.image.id, 'fill-800x600')

        # Get the image
        response = self.client.get(
            reverse('wagtailimages_serve',
                    args=(signature, self.image.id, 'fill-800x600')) +
            'test.png')

        # Check response
        self.assertEqual(response.status_code, 200)
        self.assertTrue(response.streaming)
        self.assertEqual(response['Content-Type'], 'image/png')
Exemplo n.º 23
0
    def test_get_with_custom_key_using_default_key(self):
        """
        Test that that the key can be changed on the view

        This tests that the default key no longer works when the key is changed on the view
        """
        # Generate signature
        signature = generate_signature(self.image.id, 'fill-800x600')

        # Get the image
        response = self.client.get(
            reverse('wagtailimages_serve_custom_key',
                    args=(signature, self.image.id, 'fill-800x600')) +
            'test.png')

        # Check response
        self.assertEqual(response.status_code, 403)
Exemplo n.º 24
0
    def test_get_missing_source_image_file(self):
        """
        Test that a missing image file gives a 410 response

        When the source image file is missing, it is presumed deleted so we
        return a 410 "Gone" response.
        """
        # Delete the image file
        os.remove(self.image.file.path)

        # Get the image
        signature = generate_signature(self.image.id, 'fill-800x600')
        response = self.client.get(
            reverse('wagtailimages_serve',
                    args=(signature, self.image.id, 'fill-800x600')))

        # Check response
        self.assertEqual(response.status_code, 410)
Exemplo n.º 25
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 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)
Exemplo n.º 26
0
    def test_get(self):
        """
        This tests that the view responds correctly for a user with edit permissions on this image
        """
        # Get
        response = self.client.get(reverse('wagtailimages:generate_url', args=(self.image.id, 'fill-800x600')))

        # Check response
        self.assertEqual(response.status_code, 200)
        self.assertEqual(response['Content-Type'], 'application/json')

        # Check JSON
        content_json = json.loads(response.content.decode())

        self.assertEqual(set(content_json.keys()), set(['url', 'preview_url']))

        expected_url = 'http://localhost/images/%(signature)s/%(image_id)d/fill-800x600/' % {
            'signature': urlquote(generate_signature(self.image.id, 'fill-800x600').decode(), safe=urlquote_safechars),
            'image_id': self.image.id,
        }
        self.assertEqual(content_json['url'], expected_url)

        expected_preview_url = reverse('wagtailimages:preview', args=(self.image.id, 'fill-800x600'))
        self.assertEqual(content_json['preview_url'], expected_preview_url)
Exemplo n.º 27
0
    def test_get(self):
        """
        This tests that the view responds correctly for a user with edit permissions on this image
        """
        # Get
        response = self.client.get(reverse("wagtailimages:generate_url", args=(self.image.id, "fill-800x600")))

        # Check response
        self.assertEqual(response.status_code, 200)
        self.assertEqual(response["Content-Type"], "application/json")

        # Check JSON
        content_json = json.loads(response.content.decode())

        self.assertEqual(set(content_json.keys()), set(["url", "preview_url"]))

        expected_url = "http://localhost/images/%(signature)s/%(image_id)d/fill-800x600/" % {
            "signature": urlquote(generate_signature(self.image.id, "fill-800x600").decode(), safe=urlquote_safechars),
            "image_id": self.image.id,
        }
        self.assertEqual(content_json["url"], expected_url)

        expected_preview_url = reverse("wagtailimages:preview", args=(self.image.id, "fill-800x600"))
        self.assertEqual(content_json["preview_url"], expected_preview_url)
Exemplo n.º 28
0
    def test_get(self):
        """
        This tests that the view responds correctly for a user with edit permissions on this image
        """
        # Get
        response = self.client.get(reverse('wagtailimages:generate_url', args=(self.image.id, 'fill-800x600')))

        # Check response
        self.assertEqual(response.status_code, 200)
        self.assertEqual(response['Content-Type'], 'application/json')

        # Check JSON
        content_json = json.loads(response.content.decode())

        self.assertEqual(set(content_json.keys()), set(['url', 'preview_url']))

        expected_url = 'http://localhost/images/%(signature)s/%(image_id)d/fill-800x600/' % {
            'signature': urlquote(generate_signature(self.image.id, 'fill-800x600').decode(), safe=urlquote_safechars),
            'image_id': self.image.id,
        }
        self.assertEqual(content_json['url'], expected_url)

        expected_preview_url = reverse('wagtailimages:preview', args=(self.image.id, 'fill-800x600'))
        self.assertEqual(content_json['preview_url'], expected_preview_url)
Exemplo n.º 29
0
def image_url(image, filter_spec):
    signature = generate_signature(image.id, filter_spec)
    url = reverse('wagtailimages_serve',
                  args=(signature, image.id, filter_spec))
    url += image.file.name[len('original_images/'):]
    return url
Exemplo n.º 30
0
 def test_signature_generation(self):
     self.assertEqual(generate_signature(100, 'fill-800x600'), b'xnZOzQyUg6pkfciqcfRJRosOrGg=')
Exemplo n.º 31
0
 def test_signature_generation(self):
     self.assertEqual(generate_signature(100, 'fill-800x600'),
                      b'xnZOzQyUg6pkfciqcfRJRosOrGg=')