mirror of
https://github.com/sissbruecker/linkding
synced 2025-02-16 12:28:23 +00:00
Preview auto tags in bookmark form (#737)
This commit is contained in:
parent
469883a674
commit
44b49a4cfe
5 changed files with 81 additions and 9 deletions
|
@ -11,6 +11,7 @@ from bookmarks.api.serializers import (
|
||||||
UserProfileSerializer,
|
UserProfileSerializer,
|
||||||
)
|
)
|
||||||
from bookmarks.models import Bookmark, BookmarkSearch, Tag, User
|
from bookmarks.models import Bookmark, BookmarkSearch, Tag, User
|
||||||
|
from bookmarks.services import auto_tagging
|
||||||
from bookmarks.services.bookmarks import (
|
from bookmarks.services.bookmarks import (
|
||||||
archive_bookmark,
|
archive_bookmark,
|
||||||
unarchive_bookmark,
|
unarchive_bookmark,
|
||||||
|
@ -107,8 +108,18 @@ class BookmarkViewSet(
|
||||||
else:
|
else:
|
||||||
metadata = website_loader.load_website_metadata(url)
|
metadata = website_loader.load_website_metadata(url)
|
||||||
|
|
||||||
|
# Return tags that would be automatically applied to the bookmark
|
||||||
|
profile = request.user.profile
|
||||||
|
auto_tags = []
|
||||||
|
if profile.auto_tagging_rules:
|
||||||
|
auto_tags = auto_tagging.get_tags(profile.auto_tagging_rules, url)
|
||||||
|
|
||||||
return Response(
|
return Response(
|
||||||
{"bookmark": existing_bookmark_data, "metadata": metadata.to_dict()},
|
{
|
||||||
|
"bookmark": existing_bookmark_data,
|
||||||
|
"metadata": metadata.to_dict(),
|
||||||
|
"auto_tags": auto_tags,
|
||||||
|
},
|
||||||
status=status.HTTP_200_OK,
|
status=status.HTTP_200_OK,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -85,3 +85,25 @@ class BookmarkFormE2ETestCase(LinkdingE2ETestCase):
|
||||||
|
|
||||||
page.get_by_label("URL").fill(bookmark.url)
|
page.get_by_label("URL").fill(bookmark.url)
|
||||||
expect(details).to_have_attribute("open", value="")
|
expect(details).to_have_attribute("open", value="")
|
||||||
|
|
||||||
|
def test_create_should_preview_auto_tags(self):
|
||||||
|
profile = self.get_or_create_test_user().profile
|
||||||
|
profile.auto_tagging_rules = "github.com dev github"
|
||||||
|
profile.save()
|
||||||
|
|
||||||
|
with sync_playwright() as p:
|
||||||
|
# Open page with URL that should have auto tags
|
||||||
|
browser = self.setup_browser(p)
|
||||||
|
page = browser.new_page()
|
||||||
|
url = self.live_server_url + reverse("bookmarks:new")
|
||||||
|
url += f"?url=https%3A%2F%2Fgithub.com%2Fsissbruecker%2Flinkding"
|
||||||
|
page.goto(url)
|
||||||
|
|
||||||
|
auto_tags_hint = page.locator(".form-input-hint.auto-tags")
|
||||||
|
expect(auto_tags_hint).to_be_visible()
|
||||||
|
expect(auto_tags_hint).to_have_text("Auto tags: dev github")
|
||||||
|
|
||||||
|
# Change to URL without auto tags
|
||||||
|
page.get_by_label("URL").fill("https://example.com")
|
||||||
|
|
||||||
|
expect(auto_tags_hint).to_be_hidden()
|
||||||
|
|
|
@ -36,12 +36,11 @@
|
||||||
.form-input-hint.bookmark-exists {
|
.form-input-hint.bookmark-exists {
|
||||||
display: none;
|
display: none;
|
||||||
color: $warning-color;
|
color: $warning-color;
|
||||||
|
}
|
||||||
|
|
||||||
a {
|
.form-input-hint.auto-tags {
|
||||||
color: $warning-color;
|
display: none;
|
||||||
text-decoration: underline;
|
color: $success-color;
|
||||||
font-weight: bold;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
details.notes textarea {
|
details.notes textarea {
|
||||||
|
|
|
@ -23,10 +23,10 @@
|
||||||
<label for="{{ form.tag_string.id_for_label }}" class="form-label">Tags</label>
|
<label for="{{ form.tag_string.id_for_label }}" class="form-label">Tags</label>
|
||||||
{{ form.tag_string|add_class:"form-input"|attr:"ld-tag-autocomplete"|attr:"autocomplete:off"|attr:"autocapitalize:off" }}
|
{{ form.tag_string|add_class:"form-input"|attr:"ld-tag-autocomplete"|attr:"autocomplete:off"|attr:"autocapitalize:off" }}
|
||||||
<div class="form-input-hint">
|
<div class="form-input-hint">
|
||||||
Enter any number of tags separated by space and <strong>without</strong> the hash (#). If a tag does not
|
Enter any number of tags separated by space and <strong>without</strong> the hash (#).
|
||||||
exist it will be
|
If a tag does not exist it will be automatically created.
|
||||||
automatically created.
|
|
||||||
</div>
|
</div>
|
||||||
|
<div class="form-input-hint auto-tags"></div>
|
||||||
{{ form.tag_string.errors }}
|
{{ form.tag_string.errors }}
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group has-icon-right">
|
<div class="form-group has-icon-right">
|
||||||
|
@ -197,6 +197,18 @@
|
||||||
} else {
|
} else {
|
||||||
bookmarkExistsHint.style['display'] = 'none';
|
bookmarkExistsHint.style['display'] = 'none';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Preview auto tags
|
||||||
|
const autoTags = data.auto_tags;
|
||||||
|
const autoTagsHint = document.querySelector('.form-input-hint.auto-tags');
|
||||||
|
|
||||||
|
if (autoTags.length > 0) {
|
||||||
|
autoTags.sort();
|
||||||
|
autoTagsHint.style['display'] = 'block';
|
||||||
|
autoTagsHint.innerHTML = `Auto tags: ${autoTags.join(" ")}`;
|
||||||
|
} else {
|
||||||
|
autoTagsHint.style['display'] = 'none';
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -742,6 +742,34 @@ class BookmarksApiTestCase(LinkdingApiTestCase, BookmarkFactoryMixin):
|
||||||
self.assertEqual(bookmark.website_description, metadata["description"])
|
self.assertEqual(bookmark.website_description, metadata["description"])
|
||||||
self.assertIsNone(metadata["preview_image"])
|
self.assertIsNone(metadata["preview_image"])
|
||||||
|
|
||||||
|
def test_check_returns_no_auto_tags_if_none_configured(self):
|
||||||
|
self.authenticate()
|
||||||
|
|
||||||
|
url = reverse("bookmarks:bookmark-check")
|
||||||
|
check_url = urllib.parse.quote_plus("https://example.com")
|
||||||
|
response = self.get(
|
||||||
|
f"{url}?url={check_url}", expected_status_code=status.HTTP_200_OK
|
||||||
|
)
|
||||||
|
auto_tags = response.data["auto_tags"]
|
||||||
|
|
||||||
|
self.assertCountEqual(auto_tags, [])
|
||||||
|
|
||||||
|
def test_check_returns_matching_auto_tags(self):
|
||||||
|
self.authenticate()
|
||||||
|
|
||||||
|
profile = self.get_or_create_test_user().profile
|
||||||
|
profile.auto_tagging_rules = "example.com tag1 tag2"
|
||||||
|
profile.save()
|
||||||
|
|
||||||
|
url = reverse("bookmarks:bookmark-check")
|
||||||
|
check_url = urllib.parse.quote_plus("https://example.com")
|
||||||
|
response = self.get(
|
||||||
|
f"{url}?url={check_url}", expected_status_code=status.HTTP_200_OK
|
||||||
|
)
|
||||||
|
auto_tags = response.data["auto_tags"]
|
||||||
|
|
||||||
|
self.assertCountEqual(auto_tags, ["tag1", "tag2"])
|
||||||
|
|
||||||
def test_can_only_access_own_bookmarks(self):
|
def test_can_only_access_own_bookmarks(self):
|
||||||
self.authenticate()
|
self.authenticate()
|
||||||
self.setup_bookmark()
|
self.setup_bookmark()
|
||||||
|
|
Loading…
Add table
Reference in a new issue