<ng-template #classifierStatus>
<h6><ng-container i18n>Last Trained</ng-container>:</h6> <span class="font-monospace small">{{status.tasks.classifier_last_trained | customDate:'medium'}}</span>
</ng-template>
+ <dt i18n>Sanity Checker</dt>
+ <dd class="d-flex align-items-center">
+ {{status.tasks.sanity_check_status}}
+ @if (status.tasks.sanity_check_status === 'OK') {
+ @if (isStale(status.tasks.sanity_check_last_run)) {
+ <i-bs name="exclamation-triangle-fill" class="text-warning ms-2 lh-1" [ngbPopover]="sanityCheckerStatus" triggers="mouseenter:mouseleave"></i-bs>
+ } @else {
+ <i-bs name="check-circle-fill" class="text-primary ms-2 lh-1" [ngbPopover]="sanityCheckerStatus" triggers="mouseenter:mouseleave"></i-bs>
+ }
+ } @else {
+ <i-bs name="exclamation-triangle-fill" class="text-danger ms-2 lh-1" ngbPopover="{{status.tasks.sanity_check_error}}" triggers="mouseenter:mouseleave"></i-bs>
+ }
+ </dd>
+ <ng-template #sanityCheckerStatus>
+ <h6><ng-container i18n>Last Run</ng-container>:</h6> <span class="font-monospace small">{{status.tasks.sanity_check_last_run | customDate:'medium'}}</span>
+ </ng-template>
</dl>
</div>
</div>
classifier_status: SystemStatusItemStatus.OK,
classifier_last_trained: new Date().toISOString(),
classifier_error: null,
+ sanity_check_status: SystemStatusItemStatus.OK,
+ sanity_check_last_run: new Date().toISOString(),
+ sanity_check_error: null,
},
}
classifier_status: SystemStatusItemStatus
classifier_last_trained: string // ISO date string
classifier_error: string
+ sanity_check_status: SystemStatusItemStatus
+ sanity_check_last_run: string // ISO date string
+ sanity_check_error: string
}
}
def check_sanity(*, progress=False, scheduled=True) -> SanityCheckMessages:
- task = PaperlessTask.objects.create(
+ paperless_task = PaperlessTask.objects.create(
task_id=uuid.uuid4(),
type=PaperlessTask.TaskType.SCHEDULED_TASK
if scheduled
else PaperlessTask.TaskType.MANUAL_TASK,
task_name="check_sanity",
- status=PaperlessTask.TASK_STATE_CHOICES.STARTED,
+ status=states.STARTED,
date_created=timezone.now(),
date_started=timezone.now(),
)
for extra_file in present_files:
messages.warning(None, f"Orphaned file in media dir: {extra_file}")
- task.status = states.SUCCESS if not messages.has_error else states.FAILED
+ paperless_task.status = states.SUCCESS if not messages.has_error else states.FAILURE
# result is concatenated messages
- task.result = str(messages)
- task.date_done = timezone.now()
+ paperless_task.result = f"{len(messages)} issues found."
+ if messages.has_error:
+ paperless_task.result += " Check logs for details."
+ paperless_task.date_done = timezone.now()
+ paperless_task.save(update_fields=["status", "result", "date_done"])
return messages
"last_trained": serializers.DateTimeField(),
},
),
+ "sanity_check": inline_serializer(
+ name="SanityCheck",
+ fields={
+ "status": serializers.CharField(),
+ "error": serializers.CharField(),
+ "last_run": serializers.DateTimeField(),
+ },
+ ),
},
),
},
last_trained_task.date_done if last_trained_task else None
)
+ last_sanity_check = (
+ PaperlessTask.objects.filter(
+ task_name__icontains="check_sanity",
+ )
+ .order_by("-date_done")
+ .first()
+ )
+
+ sanity_check_status = (
+ "OK"
+ if last_sanity_check is not None
+ and last_sanity_check.status == states.SUCCESS
+ else "ERROR"
+ )
+ sanity_check_error = None
+ if last_sanity_check.status == states.FAILURE:
+ sanity_check_error = last_sanity_check.result
+ sanity_check_last_run = (
+ last_sanity_check.date_done if last_sanity_check else None
+ )
+
return Response(
{
"pngx_version": current_version,
"classifier_status": classifier_status,
"classifier_last_trained": classifier_last_trained,
"classifier_error": classifier_error,
+ "sanity_check_status": sanity_check_status,
+ "sanity_check_last_run": sanity_check_last_run,
+ "sanity_check_error": sanity_check_error,
},
},
)