mirror of
https://github.com/sissbruecker/linkding.git
synced 2025-08-14 05:59:29 +02:00
Add date filters for REST API (#1080)
* Add modified_since query parameter * Add added_since parameter * update date_modified when assets change
This commit is contained in:
@@ -55,7 +55,12 @@ class AssetServiceTestCase(TestCase, BookmarkFactoryMixin):
|
||||
self.assertIsNone(asset.id)
|
||||
|
||||
def test_create_snapshot(self):
|
||||
bookmark = self.setup_bookmark(url="https://example.com")
|
||||
initial_modified = timezone.datetime(
|
||||
2025, 1, 1, 0, 0, 0, tzinfo=datetime.timezone.utc
|
||||
)
|
||||
bookmark = self.setup_bookmark(
|
||||
url="https://example.com", modified=initial_modified
|
||||
)
|
||||
asset = assets.create_snapshot_asset(bookmark)
|
||||
asset.save()
|
||||
asset.date_created = timezone.datetime(
|
||||
@@ -91,6 +96,9 @@ class AssetServiceTestCase(TestCase, BookmarkFactoryMixin):
|
||||
self.assertEqual(asset.file, expected_filename)
|
||||
self.assertTrue(asset.gzip)
|
||||
|
||||
# should update bookmark modified date
|
||||
bookmark.refresh_from_db()
|
||||
|
||||
def test_create_snapshot_failure(self):
|
||||
bookmark = self.setup_bookmark(url="https://example.com")
|
||||
asset = assets.create_snapshot_asset(bookmark)
|
||||
@@ -120,7 +128,12 @@ class AssetServiceTestCase(TestCase, BookmarkFactoryMixin):
|
||||
self.assertTrue(saved_file.endswith("aaaa.html.gz"))
|
||||
|
||||
def test_upload_snapshot(self):
|
||||
bookmark = self.setup_bookmark(url="https://example.com")
|
||||
initial_modified = timezone.datetime(
|
||||
2025, 1, 1, 0, 0, 0, tzinfo=datetime.timezone.utc
|
||||
)
|
||||
bookmark = self.setup_bookmark(
|
||||
url="https://example.com", modified=initial_modified
|
||||
)
|
||||
asset = assets.upload_snapshot(bookmark, self.html_content.encode())
|
||||
|
||||
# should create gzip file in asset folder
|
||||
@@ -145,6 +158,10 @@ class AssetServiceTestCase(TestCase, BookmarkFactoryMixin):
|
||||
self.assertEqual(asset.file, saved_file_name)
|
||||
self.assertTrue(asset.gzip)
|
||||
|
||||
# should update bookmark modified date
|
||||
bookmark.refresh_from_db()
|
||||
self.assertGreater(bookmark.date_modified, initial_modified)
|
||||
|
||||
def test_upload_snapshot_failure(self):
|
||||
bookmark = self.setup_bookmark(url="https://example.com")
|
||||
|
||||
@@ -173,7 +190,10 @@ class AssetServiceTestCase(TestCase, BookmarkFactoryMixin):
|
||||
|
||||
@disable_logging
|
||||
def test_upload_asset(self):
|
||||
bookmark = self.setup_bookmark()
|
||||
initial_modified = timezone.datetime(
|
||||
2025, 1, 1, 0, 0, 0, tzinfo=datetime.timezone.utc
|
||||
)
|
||||
bookmark = self.setup_bookmark(modified=initial_modified)
|
||||
file_content = b"test content"
|
||||
upload_file = SimpleUploadedFile(
|
||||
"test_file.txt", file_content, content_type="text/plain"
|
||||
@@ -204,6 +224,10 @@ class AssetServiceTestCase(TestCase, BookmarkFactoryMixin):
|
||||
self.assertEqual(asset.file_size, len(file_content))
|
||||
self.assertFalse(asset.gzip)
|
||||
|
||||
# should update bookmark modified date
|
||||
bookmark.refresh_from_db()
|
||||
self.assertGreater(bookmark.date_modified, initial_modified)
|
||||
|
||||
@disable_logging
|
||||
def test_upload_asset_truncates_asset_file_name(self):
|
||||
# Create a bookmark with a very long URL
|
||||
@@ -409,3 +433,36 @@ class AssetServiceTestCase(TestCase, BookmarkFactoryMixin):
|
||||
|
||||
# Verify that latest_snapshot hasn't changed
|
||||
self.assertEqual(bookmark.latest_snapshot, latest_asset)
|
||||
|
||||
@disable_logging
|
||||
def test_remove_asset(self):
|
||||
initial_modified = timezone.datetime(
|
||||
2025, 1, 1, 0, 0, 0, tzinfo=datetime.timezone.utc
|
||||
)
|
||||
bookmark = self.setup_bookmark(modified=initial_modified)
|
||||
file_content = b"test content for removal"
|
||||
upload_file = SimpleUploadedFile(
|
||||
"test_remove_file.txt", file_content, content_type="text/plain"
|
||||
)
|
||||
|
||||
asset = assets.upload_asset(bookmark, upload_file)
|
||||
asset_filepath = os.path.join(self.assets_dir, asset.file)
|
||||
|
||||
# Verify asset and file exist
|
||||
self.assertTrue(BookmarkAsset.objects.filter(id=asset.id).exists())
|
||||
self.assertTrue(os.path.exists(asset_filepath))
|
||||
|
||||
bookmark.date_modified = initial_modified
|
||||
bookmark.save()
|
||||
|
||||
# Remove the asset
|
||||
assets.remove_asset(asset)
|
||||
|
||||
# Verify asset is removed from DB
|
||||
self.assertFalse(BookmarkAsset.objects.filter(id=asset.id).exists())
|
||||
# Verify file is removed from disk
|
||||
self.assertFalse(os.path.exists(asset_filepath))
|
||||
|
||||
# Verify bookmark modified date is updated
|
||||
bookmark.refresh_from_db()
|
||||
self.assertGreater(bookmark.date_modified, initial_modified)
|
||||
|
@@ -1211,3 +1211,79 @@ class QueriesTestCase(TestCase, BookmarkFactoryMixin):
|
||||
|
||||
query = queries.query_bookmarks(self.user, self.profile, search)
|
||||
self.assertEqual(list(query), sorted_bookmarks)
|
||||
|
||||
def test_query_bookmarks_filter_modified_since(self):
|
||||
# Create bookmarks with different modification dates
|
||||
older_bookmark = self.setup_bookmark(title="old bookmark")
|
||||
recent_bookmark = self.setup_bookmark(title="recent bookmark")
|
||||
|
||||
# Modify date field on bookmark directly to test modified_since
|
||||
older_bookmark.date_modified = timezone.datetime(
|
||||
2025, 1, 1, tzinfo=datetime.timezone.utc
|
||||
)
|
||||
older_bookmark.save()
|
||||
recent_bookmark.date_modified = timezone.datetime(
|
||||
2025, 5, 15, tzinfo=datetime.timezone.utc
|
||||
)
|
||||
recent_bookmark.save()
|
||||
|
||||
# Test with date between the two bookmarks
|
||||
search = BookmarkSearch(modified_since="2025-03-01T00:00:00Z")
|
||||
query = queries.query_bookmarks(self.user, self.profile, search)
|
||||
self.assertCountEqual(list(query), [recent_bookmark])
|
||||
|
||||
# Test with date before both bookmarks
|
||||
search = BookmarkSearch(modified_since="2024-12-31T00:00:00Z")
|
||||
query = queries.query_bookmarks(self.user, self.profile, search)
|
||||
self.assertCountEqual(list(query), [older_bookmark, recent_bookmark])
|
||||
|
||||
# Test with date after both bookmarks
|
||||
search = BookmarkSearch(modified_since="2025-05-16T00:00:00Z")
|
||||
query = queries.query_bookmarks(self.user, self.profile, search)
|
||||
self.assertCountEqual(list(query), [])
|
||||
|
||||
# Test with no modified_since - should return all bookmarks
|
||||
search = BookmarkSearch()
|
||||
query = queries.query_bookmarks(self.user, self.profile, search)
|
||||
self.assertCountEqual(list(query), [older_bookmark, recent_bookmark])
|
||||
|
||||
# Test with invalid date format - should be ignored
|
||||
search = BookmarkSearch(modified_since="invalid-date")
|
||||
query = queries.query_bookmarks(self.user, self.profile, search)
|
||||
self.assertCountEqual(list(query), [older_bookmark, recent_bookmark])
|
||||
|
||||
def test_query_bookmarks_filter_added_since(self):
|
||||
# Create bookmarks with different dates
|
||||
older_bookmark = self.setup_bookmark(
|
||||
title="old bookmark",
|
||||
added=timezone.datetime(2025, 1, 1, tzinfo=datetime.timezone.utc),
|
||||
)
|
||||
recent_bookmark = self.setup_bookmark(
|
||||
title="recent bookmark",
|
||||
added=timezone.datetime(2025, 5, 15, tzinfo=datetime.timezone.utc),
|
||||
)
|
||||
|
||||
# Test with date between the two bookmarks
|
||||
search = BookmarkSearch(added_since="2025-03-01T00:00:00Z")
|
||||
query = queries.query_bookmarks(self.user, self.profile, search)
|
||||
self.assertCountEqual(list(query), [recent_bookmark])
|
||||
|
||||
# Test with date before both bookmarks
|
||||
search = BookmarkSearch(added_since="2024-12-31T00:00:00Z")
|
||||
query = queries.query_bookmarks(self.user, self.profile, search)
|
||||
self.assertCountEqual(list(query), [older_bookmark, recent_bookmark])
|
||||
|
||||
# Test with date after both bookmarks
|
||||
search = BookmarkSearch(added_since="2025-05-16T00:00:00Z")
|
||||
query = queries.query_bookmarks(self.user, self.profile, search)
|
||||
self.assertCountEqual(list(query), [])
|
||||
|
||||
# Test with no added_since - should return all bookmarks
|
||||
search = BookmarkSearch()
|
||||
query = queries.query_bookmarks(self.user, self.profile, search)
|
||||
self.assertCountEqual(list(query), [older_bookmark, recent_bookmark])
|
||||
|
||||
# Test with invalid date format - should be ignored
|
||||
search = BookmarkSearch(added_since="invalid-date")
|
||||
query = queries.query_bookmarks(self.user, self.profile, search)
|
||||
self.assertCountEqual(list(query), [older_bookmark, recent_bookmark])
|
||||
|
Reference in New Issue
Block a user