feat(tasks): extend and harden the task system redesign

- TaskType: add EMPTY_TRASH, CHECK_WORKFLOWS, CLEANUP_SHARE_LINKS;
  remove INDEX_REBUILD (no backing task — beat schedule uses index_optimize)
- TRACKED_TASKS: wire up all nine task types including the three new ones
  and llmindex_index / process_mail_accounts
- Add task_revoked_handler so cancelled/expired tasks are marked REVOKED
- Fix double-write: task_postrun_handler no longer overwrites result_data
  when status is already FAILURE (task_failure_handler owns that write)
- v9 serialiser: map EMAIL_CONSUME and FOLDER_CONSUME to AUTO_TASK
- views: scope task list to owner for regular users, admins see all;
  validate ?days= query param and return 400 on bad input
- tests: add test_list_admin_sees_all_tasks; rename/fix
  test_parses_duplicate_string (duplicates produce SUCCESS, not FAILURE);
  use PaperlessTaskFactory in modified tests

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
stumpylog
2026-04-15 18:34:34 -07:00
co-authored by Claude Sonnet 4.6
parent 979d8a67f0
commit e86c37f717
7 changed files with 106 additions and 31 deletions
+22 -8
View File
@@ -163,12 +163,12 @@ class TestGetTasksV10:
ids = [t["task_id"] for t in response.data]
assert ids == [t3.task_id, t2.task_id, t1.task_id]
def test_list_is_owner_aware(
def test_list_scoped_to_own_tasks_for_regular_user(
self,
admin_user: User,
regular_user: User,
) -> None:
"""The task list only shows tasks the user owns or that are unowned."""
"""Regular users see only tasks they own; tasks owned by others or unowned are hidden."""
regular_user.user_permissions.add(
Permission.objects.get(codename="view_paperlesstask"),
)
@@ -177,17 +177,31 @@ class TestGetTasksV10:
client.force_authenticate(user=regular_user)
client.credentials(HTTP_ACCEPT=ACCEPT_V10)
PaperlessTaskFactory(owner=admin_user)
shared_task = PaperlessTaskFactory()
PaperlessTaskFactory(owner=admin_user) # other user — not visible
PaperlessTaskFactory() # unowned (system task) — not visible
own_task = PaperlessTaskFactory(owner=regular_user)
response = client.get(ENDPOINT)
assert response.status_code == status.HTTP_200_OK
assert len(response.data) == 2
returned_task_ids = {t["task_id"] for t in response.data}
assert shared_task.task_id in returned_task_ids
assert own_task.task_id in returned_task_ids
assert len(response.data) == 1
assert response.data[0]["task_id"] == own_task.task_id
def test_list_admin_sees_all_tasks(
self,
admin_client: APIClient,
admin_user: User,
regular_user: User,
) -> None:
"""Admin users see all tasks regardless of owner."""
PaperlessTaskFactory(owner=admin_user)
PaperlessTaskFactory() # unowned system task
PaperlessTaskFactory(owner=regular_user)
response = admin_client.get(ENDPOINT)
assert response.status_code == status.HTTP_200_OK
assert len(response.data) == 3
@pytest.mark.django_db()