From 0f9ba57fefab86ef6cbed1453b661f1d16a1e114 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sascha=20I=C3=9Fbr=C3=BCcker?= Date: Fri, 10 May 2024 09:50:19 +0200 Subject: [PATCH] Load missing thumbnails after enabling the feature (#725) --- bookmarks/services/tasks.py | 2 +- bookmarks/templates/settings/general.html | 2 + bookmarks/tests/test_bookmarks_tasks.py | 13 +++++++ bookmarks/tests/test_settings_general_view.py | 38 +++++++++++++++++++ bookmarks/views/settings.py | 5 +++ 5 files changed, 59 insertions(+), 1 deletion(-) 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 @@
Automatically loads favicons for bookmarked websites and displays them next to each bookmark. + Enabling this feature automatically downloads all missing favicons. By default, this feature uses a Google service to download favicons. If you don't want to use this service, check the
Automatically loads preview images for bookmarked websites and displays them next to each bookmark. + Enabling this feature automatically downloads all missing preview images.
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