diff --git a/bookmarks/services/tasks.py b/bookmarks/services/tasks.py
index ab164f4..a6de13f 100644
--- a/bookmarks/services/tasks.py
+++ b/bookmarks/services/tasks.py
@@ -245,7 +245,7 @@ def _load_preview_image_task(bookmark_id: int):
new_preview_image_file = preview_image_loader.load_preview_image(bookmark.url)
if new_preview_image_file != bookmark.preview_image_file:
- bookmark.preview_image_file = new_preview_image_file
+ bookmark.preview_image_file = new_preview_image_file or ""
bookmark.save(update_fields=["preview_image_file"])
logger.info(
f"Successfully updated preview image for bookmark. url={bookmark.url} preview_image_file={new_preview_image_file}"
diff --git a/bookmarks/templates/settings/general.html b/bookmarks/templates/settings/general.html
index d021c31..acafeb0 100644
--- a/bookmarks/templates/settings/general.html
+++ b/bookmarks/templates/settings/general.html
@@ -117,6 +117,7 @@
diff --git a/bookmarks/tests/test_bookmarks_tasks.py b/bookmarks/tests/test_bookmarks_tasks.py
index 0ac497d..ade2532 100644
--- a/bookmarks/tests/test_bookmarks_tasks.py
+++ b/bookmarks/tests/test_bookmarks_tasks.py
@@ -537,6 +537,19 @@ class BookmarkTasksTestCase(TestCase, BookmarkFactoryMixin):
self.mock_load_preview_image.assert_called_once()
self.assertEqual(bookmark.preview_image_file, "preview_image_upd.png")
+ def test_load_preview_image_should_set_blank_when_none_is_returned(self):
+ bookmark = self.setup_bookmark(
+ preview_image_file="preview_image.png",
+ )
+
+ self.mock_load_preview_image.return_value = None
+
+ tasks.load_preview_image(self.get_or_create_test_user(), bookmark)
+
+ bookmark.refresh_from_db()
+ self.mock_load_preview_image.assert_called_once()
+ self.assertEqual(bookmark.preview_image_file, "")
+
def test_load_preview_image_should_handle_missing_bookmark(self):
tasks._load_preview_image_task(123)
diff --git a/bookmarks/tests/test_settings_general_view.py b/bookmarks/tests/test_settings_general_view.py
index 2598ae7..5bbba40 100644
--- a/bookmarks/tests/test_settings_general_view.py
+++ b/bookmarks/tests/test_settings_general_view.py
@@ -31,6 +31,7 @@ class SettingsGeneralViewTestCase(TestCase, BookmarkFactoryMixin):
"enable_sharing": False,
"enable_public_sharing": False,
"enable_favicons": False,
+ "enable_preview_images": False,
"enable_automatic_html_snapshots": True,
"tag_search": UserProfile.TAG_SEARCH_STRICT,
"display_url": False,
@@ -88,6 +89,7 @@ class SettingsGeneralViewTestCase(TestCase, BookmarkFactoryMixin):
"enable_sharing": True,
"enable_public_sharing": True,
"enable_favicons": True,
+ "enable_preview_images": True,
"enable_automatic_html_snapshots": False,
"tag_search": UserProfile.TAG_SEARCH_LAX,
"display_url": True,
@@ -131,6 +133,9 @@ class SettingsGeneralViewTestCase(TestCase, BookmarkFactoryMixin):
self.assertEqual(
self.user.profile.enable_favicons, form_data["enable_favicons"]
)
+ self.assertEqual(
+ self.user.profile.enable_preview_images, form_data["enable_preview_images"]
+ )
self.assertEqual(
self.user.profile.enable_automatic_html_snapshots,
form_data["enable_automatic_html_snapshots"],
@@ -291,6 +296,39 @@ class SettingsGeneralViewTestCase(TestCase, BookmarkFactoryMixin):
count=0,
)
+ def test_enable_preview_image_should_schedule_preview_update(self):
+ with patch.object(
+ tasks, "schedule_bookmarks_without_previews"
+ ) as mock_schedule_bookmarks_without_previews:
+ # Enabling favicons schedules update
+ form_data = self.create_profile_form_data(
+ {
+ "update_profile": "",
+ "enable_preview_images": True,
+ }
+ )
+ self.client.post(reverse("bookmarks:settings.general"), form_data)
+
+ mock_schedule_bookmarks_without_previews.assert_called_once_with(self.user)
+
+ # No update scheduled if favicons are already enabled
+ mock_schedule_bookmarks_without_previews.reset_mock()
+
+ self.client.post(reverse("bookmarks:settings.general"), form_data)
+
+ mock_schedule_bookmarks_without_previews.assert_not_called()
+
+ # No update scheduled when disabling favicons
+ form_data = self.create_profile_form_data(
+ {
+ "enable_preview_images": False,
+ }
+ )
+
+ self.client.post(reverse("bookmarks:settings.general"), form_data)
+
+ mock_schedule_bookmarks_without_previews.assert_not_called()
+
def test_automatic_html_snapshots_should_be_hidden_when_snapshots_not_supported(
self,
):
diff --git a/bookmarks/views/settings.py b/bookmarks/views/settings.py
index 9e46112..582c2a2 100644
--- a/bookmarks/views/settings.py
+++ b/bookmarks/views/settings.py
@@ -70,11 +70,16 @@ def update_profile(request):
user = request.user
profile = user.profile
favicons_were_enabled = profile.enable_favicons
+ previews_were_enabled = profile.enable_preview_images
form = UserProfileForm(request.POST, instance=profile)
if form.is_valid():
form.save()
+ # Load missing favicons if the feature was just enabled
if profile.enable_favicons and not favicons_were_enabled:
tasks.schedule_bookmarks_without_favicons(request.user)
+ # Load missing preview images if the feature was just enabled
+ if profile.enable_preview_images and not previews_were_enabled:
+ tasks.schedule_bookmarks_without_previews(request.user)
return form