Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add option for marking bookmarks as unread by default #706

Merged
merged 3 commits into from
Apr 17, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions bookmarks/migrations/0033_userprofile_default_mark_unread.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# Generated by Django 5.0.3 on 2024-04-17 19:27

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
("bookmarks", "0032_html_snapshots_hint_toast"),
]

operations = [
migrations.AddField(
model_name="userprofile",
name="default_mark_unread",
field=models.BooleanField(default=False),
),
]
2 changes: 2 additions & 0 deletions bookmarks/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -399,6 +399,7 @@ class UserProfile(models.Model):
custom_css = models.TextField(blank=True, null=False)
search_preferences = models.JSONField(default=dict, null=False)
enable_automatic_html_snapshots = models.BooleanField(default=True, null=False)
default_mark_unread = models.BooleanField(default=False, null=False)


class UserProfileForm(forms.ModelForm):
Expand All @@ -422,6 +423,7 @@ class Meta:
"display_archive_bookmark_action",
"display_remove_bookmark_action",
"permanent_notes",
"default_mark_unread",
"custom_css",
]

Expand Down
11 changes: 11 additions & 0 deletions bookmarks/templates/settings/general.html
Original file line number Diff line number Diff line change
Expand Up @@ -175,6 +175,17 @@ <h2>Profile</h2>
<button class="btn mt-2" name="create_missing_html_snapshots">Create missing HTML snapshots</button>
</div>
{% endif %}
<div class="form-group">
<label for="{{ form.default_mark_unread.id_for_label }}" class="form-checkbox">
{{ form.default_mark_unread }}
<i class="form-icon"></i> Create bookmarks as unread by default
</label>
<div class="form-input-hint">
Sets the default state for the "Mark as unread" option when creating a new bookmark.
Setting this option will make all new bookmarks default to unread.
This can be overridden when creating each new bookmark.
</div>
</div>
<div class="form-group">
<details {% if form.custom_css.value %}open{% endif %}>
<summary>Custom CSS</summary>
Expand Down
22 changes: 22 additions & 0 deletions bookmarks/tests/test_bookmark_new_view.py
Original file line number Diff line number Diff line change
Expand Up @@ -210,3 +210,25 @@ def test_should_hide_notes_if_there_are_no_notes(self):
response = self.client.get(reverse("bookmarks:edit", args=[bookmark.id]))

self.assertContains(response, '<details class="notes">', count=1)

def test_should_not_check_unread_by_default(self):
response = self.client.get(reverse("bookmarks:new"))
html = response.content.decode()

self.assertInHTML(
'<input type="checkbox" name="unread" id="id_unread">',
html,
)

def test_should_check_unread_when_configured_in_profile(self):
self.user.profile.default_mark_unread = True
self.user.profile.save()

response = self.client.get(reverse("bookmarks:new"))
html = response.content.decode()

self.assertInHTML(
'<input type="checkbox" name="unread" value="true" '
'id="id_unread" checked="">',
html,
)
4 changes: 4 additions & 0 deletions bookmarks/tests/test_settings_general_view.py
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,7 @@ def test_update_profile(self):
"display_archive_bookmark_action": False,
"display_remove_bookmark_action": False,
"permanent_notes": True,
"default_mark_unread": True,
"custom_css": "body { background-color: #000; }",
}
response = self.client.post(reverse("bookmarks:settings.general"), form_data)
Expand Down Expand Up @@ -155,6 +156,9 @@ def test_update_profile(self):
self.assertEqual(
self.user.profile.permanent_notes, form_data["permanent_notes"]
)
self.assertEqual(
self.user.profile.default_mark_unread, form_data["default_mark_unread"]
)
self.assertEqual(self.user.profile.custom_css, form_data["custom_css"])
self.assertSuccessMessage(html, "Profile updated")

Expand Down
3 changes: 3 additions & 0 deletions bookmarks/views/bookmarks.py
Original file line number Diff line number Diff line change
Expand Up @@ -188,6 +188,7 @@ def new(request):
initial_title = request.GET.get("title")
initial_description = request.GET.get("description")
initial_auto_close = "auto_close" in request.GET
initial_mark_unread = request.user.profile.default_mark_unread

if request.method == "POST":
form = BookmarkForm(request.POST)
Expand All @@ -210,6 +211,8 @@ def new(request):
form.initial["description"] = initial_description
if initial_auto_close:
form.initial["auto_close"] = "true"
if initial_mark_unread:
form.initial["unread"] = "true"

context = {
"form": form,
Expand Down