tasp tasks¶
tasp.tasks
¶
logger = get_task_logger(__name__)
module-attribute
¶
CASE_LOCK_TTL = 120
module-attribute
¶
fetch_emails(self)
¶
sync_cortex(self)
¶
update_ongoing_cases(self)
¶
check_challengeable(self)
¶
sync_monthly_kpi(self)
¶
sync_user_profiles(self)
¶
delete_old_reports(self)
¶
purge_old_mail_previews(self, older_than_days=90)
¶
Age-only bucket sweep; see mail_feeder.utils.email_preview.retention
for why this never touches Mail.preview_object_key. Oversized-but-recent
outliers (the actual disk-usage incident) are a manual
purge_mail_previews --min-size-mb call, not part of the automated
sweep: an automatic size cutoff could delete a legitimately long
email's preview the same day it was rendered.
materialise_dashboard_snapshots(self)
¶
fail_stale_jobs(self)
¶
Auto-fail CaseAnalyzerJob rows pending beyond STALE_JOB_TIMEOUT.
Mirrors the existing AnalyzerReport stale-rescue but operates on the ledger so per-case visibility is preserved even when AnalyzerReport rows have been GC'd by delete_old_reports.
render_mail_preview(self, mail_id)
¶
Render + store one mail's .eml->PNG preview from its MinIO archive.
Sourced from the durable MinIO archive (not the ingestion workdir), so it runs on the worker pool independent of the request that created the mail. No-op when the mail or its fetchable archive is gone; retries on transient MinIO / render errors.
A mail that ends "skipped" (no fetchable .eml) or exhausts its retries gets a cooldown key: its preview_object_key stays empty, so without it the sweeper would re-pick the same rows every run and re-render them (wkhtmltoimage, hundreds of MB each) indefinitely.
sweep_missing_mail_previews(self, limit=200)
¶
Self-healing backfill of missing mail previews.
Replaces the manual regenerate_mail_previews command for the steady
state: each run enqueues render_mail_preview for rows that (a) have
no preview yet and (b) own a MinIO archive with a non-empty bucket
(i.e. are fetchable). Bucket-less submissions are excluded so they are
not re-enqueued every run. Rows in render cooldown (see
render_mail_preview) are skipped, so permanently unrenderable mails
cannot occupy the head of the pk-ordered queue and starve newer ones.
dispatch_case_analysis(self, case_id, intents)
¶
Launch Cortex analyzers for a just-submitted case in the background.
Moved off the request/response path: the synchronous Cortex round-trips
(analyzer lookup + run_by_name per matched analyzer) used to run inline
in the submit view, so users waited on Cortex for every submission.
intents is a JSON-safe list of (app_label.model, pk, data_type) triples
(model instances aren't JSON-serializable, so callers resolve+serialize
them before enqueueing); we re-fetch the objects here.
reconcile_case(self, case_id)
¶
Single finalise entrypoint: sync ledger + advance the state machine.