mirror of
https://github.com/paperless-ngx/paperless-ngx.git
synced 2026-07-17 17:34:55 +00:00
fix(tasks): fix MAIL_FETCH null input_data and postrun double-query
- _extract_input_data: return {} instead of {"account_ids": None} when
process_mail_accounts is called without an explicit account list (the
normal beat-scheduled path); add test to cover this path
- task_postrun_handler: replace filter().first() + filter().update() with
get() + save(update_fields=[...]) — single fetch, single write,
consistent with task_prerun_handler
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 4.6
parent
e86c37f717
commit
8bba782ad9
@@ -1075,7 +1075,9 @@ def _extract_input_data(
|
||||
|
||||
if task_type == PaperlessTask.TaskType.MAIL_FETCH:
|
||||
account_ids = args[0] if args else task_kwargs.get("account_ids")
|
||||
return {"account_ids": account_ids}
|
||||
if account_ids is not None:
|
||||
return {"account_ids": account_ids}
|
||||
return {}
|
||||
|
||||
return {}
|
||||
|
||||
@@ -1237,36 +1239,38 @@ def task_postrun_handler(
|
||||
new_status = _CELERY_STATE_TO_STATUS.get(state, PaperlessTask.Status.FAILURE)
|
||||
|
||||
now = timezone.now()
|
||||
task_instance = PaperlessTask.objects.filter(task_id=task_id).first()
|
||||
if task_instance is None:
|
||||
try:
|
||||
task_instance = PaperlessTask.objects.get(task_id=task_id)
|
||||
except PaperlessTask.DoesNotExist:
|
||||
return
|
||||
|
||||
duration_seconds: float | None = None
|
||||
wait_time_seconds: float | None = None
|
||||
task_instance.status = new_status
|
||||
task_instance.date_done = now
|
||||
changed_fields = ["status", "date_done"]
|
||||
|
||||
if task_instance.date_started:
|
||||
duration_seconds = (now - task_instance.date_started).total_seconds()
|
||||
task_instance.duration_seconds = (
|
||||
now - task_instance.date_started
|
||||
).total_seconds()
|
||||
changed_fields.append("duration_seconds")
|
||||
if task_instance.date_started and task_instance.date_created:
|
||||
wait_time_seconds = (
|
||||
task_instance.wait_time_seconds = (
|
||||
task_instance.date_started - task_instance.date_created
|
||||
).total_seconds()
|
||||
|
||||
update_fields: dict = {
|
||||
"status": new_status,
|
||||
"date_done": now,
|
||||
"duration_seconds": duration_seconds,
|
||||
"wait_time_seconds": wait_time_seconds,
|
||||
}
|
||||
changed_fields.append("wait_time_seconds")
|
||||
|
||||
# Only write result data for non-failure outcomes; task_failure_handler
|
||||
# owns result_data/result_message for FAILURE states.
|
||||
if new_status != PaperlessTask.Status.FAILURE:
|
||||
if isinstance(retval, dict):
|
||||
update_fields["result_data"] = retval
|
||||
task_instance.result_data = retval
|
||||
changed_fields.append("result_data")
|
||||
elif isinstance(retval, str):
|
||||
update_fields["result_message"] = retval
|
||||
update_fields["result_data"] = _parse_consume_result(retval)
|
||||
task_instance.result_message = retval
|
||||
task_instance.result_data = _parse_consume_result(retval)
|
||||
changed_fields.extend(["result_message", "result_data"])
|
||||
|
||||
PaperlessTask.objects.filter(task_id=task_id).update(**update_fields)
|
||||
task_instance.save(update_fields=changed_fields)
|
||||
except Exception:
|
||||
logger.exception("Updating PaperlessTask failed")
|
||||
|
||||
|
||||
@@ -80,6 +80,12 @@ class TestBeforeTaskPublishHandler:
|
||||
assert task.task_type == PaperlessTask.TaskType.MAIL_FETCH
|
||||
assert task.input_data["account_ids"] == [1, 2]
|
||||
|
||||
def test_mail_fetch_no_account_ids_stores_empty_input(self):
|
||||
"""Beat-scheduled mail checks pass no account_ids; input_data should be {} not {"account_ids": None}."""
|
||||
task_id = send_publish("paperless_mail.tasks.process_mail_accounts", (), {})
|
||||
task = PaperlessTask.objects.get(task_id=task_id)
|
||||
assert task.input_data == {}
|
||||
|
||||
def test_scheduled_header_sets_trigger_source(self):
|
||||
task_id = send_publish(
|
||||
"documents.tasks.train_classifier",
|
||||
|
||||
Reference in New Issue
Block a user