Improve task filters and tag collections

This commit is contained in:
rucki
2026-09-04 11:44:49 +02:00
parent e04385c23d
commit c6309cabd8
12 changed files with 342 additions and 13 deletions
+78
View File
@@ -151,6 +151,31 @@ class MarkdownHeadingTests(TestCase):
self.assertEqual(markdown_title('## Ziel von my2dos\n\nText'), 'Ziel von my2dos')
class QuickCreateFilterTests(TestCase):
def setUp(self):
self.user = get_user_model().objects.create_user(username='quick-filter', password='secret')
self.client.force_login(self.user)
def test_active_tag_is_added_only_when_content_has_no_tags(self):
self.client.post(f'{reverse("index")}?tag=work', {'content': 'Task without tag'})
first = Item.objects.get(content='Task without tag #work')
self.assertEqual(list(first.tags.values_list('name', flat=True)), ['work'])
self.client.post(f'{reverse("index")}?tag=work', {'content': 'Task with own #other'})
second = Item.objects.get(content='Task with own #other')
self.assertEqual(list(second.tags.values_list('name', flat=True)), ['other'])
def test_hx_create_response_keeps_active_tag_marked(self):
response = self.client.post(
f'{reverse("index")}?tag=work', {'content': 'Task without tag'}, HTTP_HX_REQUEST='true',
)
self.assertEqual(response.status_code, 200)
self.assertContains(response, 'hx-swap-oob="true"')
self.assertContains(response, '#work ×')
self.assertContains(response, 'text-bg-dark')
class FormattingToolbarTests(TestCase):
def test_toolbar_and_shortcuts_are_available(self):
user = get_user_model().objects.create_user(username='formatting', password='secret')
@@ -189,6 +214,31 @@ class NavigationAndLayoutTests(TestCase):
self.assertLess(menu_position, toolbar_position)
self.assertLess(toolbar_position, file_position)
def test_quick_create_is_disabled_while_inline_editor_is_open(self):
response = self.client.get(reverse('index'))
self.assertContains(response, ':disabled="editingItem"')
self.assertContains(response, 'inline-edit-form')
item = Item.objects.create(owner=self.user, content='Editable')
response = self.client.get(reverse('edit_item', args=[item.id]))
self.assertContains(response, 'inline-edit-form')
def test_tag_filter_list_depends_on_current_filters(self):
open_todo = Item.objects.create(owner=self.user, kind=Item.Kind.TODO, content='Open #openonly')
open_todo.sync_metadata()
done_todo = Item.objects.create(owner=self.user, kind=Item.Kind.TODO, content='Done #archiveonly', is_done=True)
done_todo.sync_metadata()
note = Item.objects.create(owner=self.user, kind=Item.Kind.NOTE, content='Note #noteonly')
note.sync_metadata()
response = self.client.get(f'{reverse("index")}?status=archive')
self.assertContains(response, '#archiveonly')
self.assertNotContains(response, '#openonly')
self.assertNotContains(response, '#noteonly')
response = self.client.get(f'{reverse("tag_list")}?status=archive')
self.assertContains(response, '#archiveonly')
self.assertNotContains(response, '#openonly')
class AttachmentEditTests(TestCase):
def setUp(self):
@@ -500,6 +550,34 @@ class CollectionTests(TestCase):
manage_response = self.client.get(reverse('collection_manage', args=[collection.id]))
self.assertRedirects(manage_response, reverse('collection_edit', args=[collection.id]))
def test_tag_collection_can_filter_included_item_types(self):
note = Item.objects.create(owner=self.user, kind=Item.Kind.NOTE, content='Matching note #project')
note.sync_metadata()
todo = Item.objects.create(owner=self.user, kind=Item.Kind.TODO, content='Matching todo #project')
todo.sync_metadata()
link = Item.objects.create(owner=self.user, kind=Item.Kind.LINK, content='Matching link #project')
link.sync_metadata()
collection = Collection.objects.create(
owner=self.user, title='Typed tags', mode=Collection.Mode.TAGS,
include_notes=False, include_todos=True, include_links=False, include_journal=False,
)
collection.filter_tags.add(Tag.objects.get(name='project'))
response = self.client.get(collection.get_absolute_url())
self.assertContains(response, 'Matching todo')
self.assertNotContains(response, 'Matching note')
self.assertNotContains(response, 'Matching link')
def test_tag_collection_form_offers_item_type_selection(self):
response = self.client.get(reverse('collection_create'))
self.assertContains(response, 'Entry types')
self.assertContains(response, 'name="include_notes"')
self.assertContains(response, 'name="include_todos"')
self.assertContains(response, 'name="include_links"')
self.assertContains(response, 'name="include_journal"')
def test_collection_opens_as_continuous_reading_view(self):
collection = Collection.objects.create(owner=self.user, title='Reading view')
first = Item.objects.create(owner=self.user, kind=Item.Kind.NOTE, content='First paragraph')