Skip to content

Commit 266115d

Browse files
committed
Add img_url template tag for legacy use-cases like email
1 parent 0612394 commit 266115d

File tree

2 files changed

+52
-1
lines changed

2 files changed

+52
-1
lines changed

pictures/templatetags/pictures.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,3 +36,29 @@ def picture(field_file, alt=None, ratio=None, container=None, **kwargs):
3636
"use_placeholders": settings.USE_PLACEHOLDERS,
3737
}
3838
)
39+
40+
41+
@register.simple_tag()
42+
def img_url(field_file, file_type, width, ratio=None) -> str:
43+
"""
44+
Return the URL for a specific image file.
45+
46+
This may be useful for use-cases like emails, where you can't use a picture tag.
47+
"""
48+
try:
49+
file_types = field_file.aspect_ratios[ratio]
50+
except KeyError as e:
51+
raise ValueError(
52+
f"Invalid ratio: {ratio}. Choices are: {', '.join(filter(None, field_file.aspect_ratios.keys()))}"
53+
) from e
54+
try:
55+
sizes = file_types[file_type.upper()]
56+
except KeyError as e:
57+
raise ValueError(
58+
f"Invalid file type: {file_type}. Choices are: {', '.join(file_types.keys())}"
59+
) from e
60+
for w, img in sorted(sizes.items()):
61+
url = img.url
62+
if w >= width:
63+
break
64+
return url

tests/test_templatetags.py

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import pytest
22

3-
from pictures.templatetags.pictures import picture
3+
from pictures.templatetags.pictures import img_url, picture
44
from tests.testapp.models import Profile
55

66
picture_html = b"""
@@ -61,3 +61,28 @@ def test_picture__additional_attrs(image_upload_file):
6161
profile = Profile.objects.create(name="Spiderman", picture=image_upload_file)
6262
html = picture(profile.picture, ratio="3/2", loading="lazy")
6363
assert ' loading="lazy"' in html
64+
65+
66+
@pytest.mark.django_db
67+
def test_img_url(image_upload_file):
68+
profile = Profile.objects.create(name="Spiderman", picture=image_upload_file)
69+
assert (
70+
img_url(profile.picture, ratio="3/2", file_type="webp", width=800)
71+
== "/_pictures/image/3x2/800w.WEBP"
72+
)
73+
74+
75+
@pytest.mark.django_db
76+
def test_img_url__raise_wrong_ratio(image_upload_file):
77+
profile = Profile.objects.create(name="Spiderman", picture=image_upload_file)
78+
with pytest.raises(ValueError) as e:
79+
img_url(profile.picture, ratio="2/3", file_type="webp", width=800)
80+
assert "Invalid ratio: 2/3. Choices are: 1/1, 3/2, 16/9" in str(e.value)
81+
82+
83+
@pytest.mark.django_db
84+
def test_img_url__raise_wrong_file_type(image_upload_file):
85+
profile = Profile.objects.create(name="Spiderman", picture=image_upload_file)
86+
with pytest.raises(ValueError) as e:
87+
img_url(profile.picture, ratio="3/2", file_type="gif", width=800)
88+
assert "Invalid file type: gif. Choices are: WEBP" in str(e.value)

0 commit comments

Comments
 (0)