Skip to content

Commit dc355ba

Browse files
authored
Merge pull request #509 from PavelPancocha/fix/warning_logger_when_imagefield_is_empty
Properly handle empty file field
2 parents 78824ee + 11ca70e commit dc355ba

File tree

2 files changed

+40
-8
lines changed

2 files changed

+40
-8
lines changed

jazzmin/templatetags/jazzmin.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -190,15 +190,17 @@ def get_user_avatar(user: AbstractUser) -> str:
190190

191191
# If we find the property directly on the user model (imagefield or URLfield)
192192
avatar_field = getattr(user, avatar_field_name, None)
193-
if avatar_field:
193+
if avatar_field is not None:
194+
if not avatar_field:
195+
return no_avatar
194196
if isinstance(avatar_field, str):
195197
return avatar_field
196198
elif hasattr(avatar_field, "url"):
197199
return avatar_field.url
198200
elif callable(avatar_field):
199201
return avatar_field()
200202

201-
logger.warning("avatar field must be an ImageField/URLField on the user model, or a callable")
203+
logger.warning("Avatar field must be an ImageField/URLField on the user model, or a callable")
202204

203205
return no_avatar
204206

tests/test_templatetags.py

Lines changed: 36 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import json
2-
from unittest.mock import MagicMock
2+
from unittest.mock import MagicMock, NonCallableMock
33

44
import pytest
55
from django.contrib.admin.models import CHANGE, LogEntry
@@ -50,16 +50,46 @@ def test_style_bold_first_word():
5050

5151
@pytest.mark.django_db
5252
@pytest.mark.parametrize(
53-
"case,test_input,field,expected",
53+
"case,test_input,field,expected,log",
5454
[
55-
(1, MagicMock(avatar="image.jpg"), "avatar", "image.jpg"),
56-
(2, MagicMock(avatar="image.jpg"), lambda u: u.avatar, "image.jpg"),
57-
(3, MagicMock(avatar=MagicMock(url="image.jpg")), "avatar", "image.jpg"),
55+
(1, MagicMock(avatar="image.jpg"), "avatar", "image.jpg", None),
56+
(2, MagicMock(avatar="image.jpg"), lambda u: u.avatar, "image.jpg", None),
57+
(3, MagicMock(avatar=MagicMock(url="image.jpg")), "avatar", "image.jpg", None),
58+
# Properly set file field but empty (no image uploaded)
59+
(
60+
4,
61+
MagicMock(avatar=MagicMock(__bool__=lambda x: False)),
62+
"avatar",
63+
"/static/vendor/adminlte/img/user2-160x160.jpg",
64+
None,
65+
),
66+
# No avatar field set
67+
(
68+
5,
69+
MagicMock(
70+
avatar="image.jpg",
71+
),
72+
None,
73+
"/static/vendor/adminlte/img/user2-160x160.jpg",
74+
None,
75+
),
76+
# No proper avatar field set
77+
(
78+
6,
79+
MagicMock(avatar=NonCallableMock(spec_set=["__bool__"], __bool__=lambda x: True)),
80+
"avatar",
81+
"/static/vendor/adminlte/img/user2-160x160.jpg",
82+
"Avatar field must be",
83+
),
5884
],
5985
)
60-
def test_get_user_avatar(case, test_input, field, expected, custom_jazzmin_settings):
86+
def test_get_user_avatar(case, test_input, field, expected, log, custom_jazzmin_settings, caplog):
6187
"""
6288
We can specify the name of a charfield or imagefield on our user model, or a callable that receives our user
6389
"""
6490
custom_jazzmin_settings["user_avatar"] = field
6591
assert jazzmin.get_user_avatar(test_input) == expected
92+
if log:
93+
assert log in caplog.text
94+
else:
95+
assert not caplog.text

0 commit comments

Comments
 (0)