Use choices for task name, rework task type

This commit is contained in:
shamoon 2025-02-14 15:23:42 -08:00
parent 0add5aab0e
commit e1b944ce6b
16 changed files with 120 additions and 64 deletions

View File

@ -19,6 +19,7 @@ import { allIcons, NgxBootstrapIconsModule } from 'ngx-bootstrap-icons'
import { routes } from 'src/app/app-routing.module' import { routes } from 'src/app/app-routing.module'
import { import {
PaperlessTask, PaperlessTask,
PaperlessTaskName,
PaperlessTaskStatus, PaperlessTaskStatus,
PaperlessTaskType, PaperlessTaskType,
} from 'src/app/data/paperless-task' } from 'src/app/data/paperless-task'
@ -39,7 +40,8 @@ const tasks: PaperlessTask[] = [
task_file_name: 'test.pdf', task_file_name: 'test.pdf',
date_created: new Date('2023-03-01T10:26:03.093116Z'), date_created: new Date('2023-03-01T10:26:03.093116Z'),
date_done: new Date('2023-03-01T10:26:07.223048Z'), date_done: new Date('2023-03-01T10:26:07.223048Z'),
type: PaperlessTaskType.File, type: PaperlessTaskType.Auto,
task_name: PaperlessTaskName.ConsumeFile,
status: PaperlessTaskStatus.Failed, status: PaperlessTaskStatus.Failed,
result: 'test.pd: Not consuming test.pdf: It is a duplicate of test (#100)', result: 'test.pd: Not consuming test.pdf: It is a duplicate of test (#100)',
acknowledged: false, acknowledged: false,
@ -51,7 +53,8 @@ const tasks: PaperlessTask[] = [
task_file_name: '191092.pdf', task_file_name: '191092.pdf',
date_created: new Date('2023-03-01T09:26:03.093116Z'), date_created: new Date('2023-03-01T09:26:03.093116Z'),
date_done: new Date('2023-03-01T09:26:07.223048Z'), date_done: new Date('2023-03-01T09:26:07.223048Z'),
type: PaperlessTaskType.File, type: PaperlessTaskType.Auto,
task_name: PaperlessTaskName.ConsumeFile,
status: PaperlessTaskStatus.Failed, status: PaperlessTaskStatus.Failed,
result: result:
'191092.pd: Not consuming 191092.pdf: It is a duplicate of 191092 (#311)', '191092.pd: Not consuming 191092.pdf: It is a duplicate of 191092 (#311)',
@ -64,7 +67,8 @@ const tasks: PaperlessTask[] = [
task_file_name: 'Scan Jun 6, 2023 at 3.19 PM.pdf', task_file_name: 'Scan Jun 6, 2023 at 3.19 PM.pdf',
date_created: new Date('2023-06-06T15:22:05.722323-07:00'), date_created: new Date('2023-06-06T15:22:05.722323-07:00'),
date_done: new Date('2023-06-06T15:22:14.564305-07:00'), date_done: new Date('2023-06-06T15:22:14.564305-07:00'),
type: PaperlessTaskType.File, type: PaperlessTaskType.Auto,
task_name: PaperlessTaskName.ConsumeFile,
status: PaperlessTaskStatus.Pending, status: PaperlessTaskStatus.Pending,
result: null, result: null,
acknowledged: false, acknowledged: false,
@ -76,7 +80,8 @@ const tasks: PaperlessTask[] = [
task_file_name: 'paperless-mail-l4dkg8ir', task_file_name: 'paperless-mail-l4dkg8ir',
date_created: new Date('2023-06-04T11:24:32.898089-07:00'), date_created: new Date('2023-06-04T11:24:32.898089-07:00'),
date_done: new Date('2023-06-04T11:24:44.678605-07:00'), date_done: new Date('2023-06-04T11:24:44.678605-07:00'),
type: PaperlessTaskType.File, type: PaperlessTaskType.Auto,
task_name: PaperlessTaskName.ConsumeFile,
status: PaperlessTaskStatus.Complete, status: PaperlessTaskStatus.Complete,
result: 'Success. New document id 422 created', result: 'Success. New document id 422 created',
acknowledged: false, acknowledged: false,
@ -88,7 +93,8 @@ const tasks: PaperlessTask[] = [
task_file_name: 'onlinePaymentSummary.pdf', task_file_name: 'onlinePaymentSummary.pdf',
date_created: new Date('2023-06-01T13:49:51.631305-07:00'), date_created: new Date('2023-06-01T13:49:51.631305-07:00'),
date_done: new Date('2023-06-01T13:49:54.190220-07:00'), date_done: new Date('2023-06-01T13:49:54.190220-07:00'),
type: PaperlessTaskType.File, type: PaperlessTaskType.Auto,
task_name: PaperlessTaskName.ConsumeFile,
status: PaperlessTaskStatus.Complete, status: PaperlessTaskStatus.Complete,
result: 'Success. New document id 421 created', result: 'Success. New document id 421 created',
acknowledged: false, acknowledged: false,
@ -100,7 +106,8 @@ const tasks: PaperlessTask[] = [
task_file_name: 'paperless-mail-_rrpmqk6', task_file_name: 'paperless-mail-_rrpmqk6',
date_created: new Date('2023-06-07T02:54:35.694916Z'), date_created: new Date('2023-06-07T02:54:35.694916Z'),
date_done: null, date_done: null,
type: PaperlessTaskType.File, type: PaperlessTaskType.Auto,
task_name: PaperlessTaskName.ConsumeFile,
status: PaperlessTaskStatus.Started, status: PaperlessTaskStatus.Started,
result: null, result: null,
acknowledged: false, acknowledged: false,
@ -155,7 +162,7 @@ describe('TasksComponent', () => {
jest.useFakeTimers() jest.useFakeTimers()
fixture.detectChanges() fixture.detectChanges()
httpTestingController httpTestingController
.expectOne(`${environment.apiBaseUrl}tasks/?type=file`) .expectOne(`${environment.apiBaseUrl}tasks/?task_name=consume_file`)
.flush(tasks) .flush(tasks)
}) })

View File

@ -1,11 +1,17 @@
import { ObjectWithId } from './object-with-id' import { ObjectWithId } from './object-with-id'
export enum PaperlessTaskType { export enum PaperlessTaskType {
File = 'file', Auto = 'auto_task',
ScheduledTask = 'scheduled_task', ScheduledTask = 'scheduled_task',
ManualTask = 'manual_task', ManualTask = 'manual_task',
} }
export enum PaperlessTaskName {
ConsumeFile = 'consume_file',
TrainClassifier = 'train_classifier',
SanityCheck = 'check_sanity',
}
export enum PaperlessTaskStatus { export enum PaperlessTaskStatus {
Pending = 'PENDING', Pending = 'PENDING',
Started = 'STARTED', Started = 'STARTED',
@ -24,6 +30,8 @@ export interface PaperlessTask extends ObjectWithId {
task_file_name: string task_file_name: string
task_name: PaperlessTaskName
date_created: Date date_created: Date
date_done?: Date date_done?: Date

View File

@ -5,7 +5,11 @@ import {
} from '@angular/common/http/testing' } from '@angular/common/http/testing'
import { TestBed } from '@angular/core/testing' import { TestBed } from '@angular/core/testing'
import { environment } from 'src/environments/environment' import { environment } from 'src/environments/environment'
import { PaperlessTaskStatus, PaperlessTaskType } from '../data/paperless-task' import {
PaperlessTaskName,
PaperlessTaskStatus,
PaperlessTaskType,
} from '../data/paperless-task'
import { TasksService } from './tasks.service' import { TasksService } from './tasks.service'
describe('TasksService', () => { describe('TasksService', () => {
@ -33,7 +37,7 @@ describe('TasksService', () => {
it('calls tasks api endpoint on reload', () => { it('calls tasks api endpoint on reload', () => {
tasksService.reload() tasksService.reload()
const req = httpTestingController.expectOne( const req = httpTestingController.expectOne(
`${environment.apiBaseUrl}tasks/?type=file` `${environment.apiBaseUrl}tasks/?task_name=consume_file`
) )
expect(req.request.method).toEqual('GET') expect(req.request.method).toEqual('GET')
}) })
@ -42,7 +46,7 @@ describe('TasksService', () => {
tasksService.loading = true tasksService.loading = true
tasksService.reload() tasksService.reload()
httpTestingController.expectNone( httpTestingController.expectNone(
`${environment.apiBaseUrl}tasks/?type=file` `${environment.apiBaseUrl}tasks/?task_name=consume_file`
) )
}) })
@ -58,7 +62,7 @@ describe('TasksService', () => {
req.flush([]) req.flush([])
// reload is then called // reload is then called
httpTestingController httpTestingController
.expectOne(`${environment.apiBaseUrl}tasks/?type=file`) .expectOne(`${environment.apiBaseUrl}tasks/?task_name=consume_file`)
.flush([]) .flush([])
}) })
@ -66,7 +70,8 @@ describe('TasksService', () => {
expect(tasksService.total).toEqual(0) expect(tasksService.total).toEqual(0)
const mockTasks = [ const mockTasks = [
{ {
type: PaperlessTaskType.File, type: PaperlessTaskType.Auto,
task_name: PaperlessTaskName.ConsumeFile,
status: PaperlessTaskStatus.Complete, status: PaperlessTaskStatus.Complete,
acknowledged: false, acknowledged: false,
task_id: '1234', task_id: '1234',
@ -74,7 +79,8 @@ describe('TasksService', () => {
date_created: new Date(), date_created: new Date(),
}, },
{ {
type: PaperlessTaskType.File, type: PaperlessTaskType.Auto,
task_name: PaperlessTaskName.ConsumeFile,
status: PaperlessTaskStatus.Failed, status: PaperlessTaskStatus.Failed,
acknowledged: false, acknowledged: false,
task_id: '1235', task_id: '1235',
@ -82,7 +88,8 @@ describe('TasksService', () => {
date_created: new Date(), date_created: new Date(),
}, },
{ {
type: PaperlessTaskType.File, type: PaperlessTaskType.Auto,
task_name: PaperlessTaskName.ConsumeFile,
status: PaperlessTaskStatus.Pending, status: PaperlessTaskStatus.Pending,
acknowledged: false, acknowledged: false,
task_id: '1236', task_id: '1236',
@ -90,7 +97,8 @@ describe('TasksService', () => {
date_created: new Date(), date_created: new Date(),
}, },
{ {
type: PaperlessTaskType.File, type: PaperlessTaskType.Auto,
task_name: PaperlessTaskName.ConsumeFile,
status: PaperlessTaskStatus.Started, status: PaperlessTaskStatus.Started,
acknowledged: false, acknowledged: false,
task_id: '1237', task_id: '1237',
@ -98,7 +106,8 @@ describe('TasksService', () => {
date_created: new Date(), date_created: new Date(),
}, },
{ {
type: PaperlessTaskType.File, type: PaperlessTaskType.Auto,
task_name: PaperlessTaskName.ConsumeFile,
status: PaperlessTaskStatus.Complete, status: PaperlessTaskStatus.Complete,
acknowledged: false, acknowledged: false,
task_id: '1238', task_id: '1238',
@ -110,7 +119,7 @@ describe('TasksService', () => {
tasksService.reload() tasksService.reload()
const req = httpTestingController.expectOne( const req = httpTestingController.expectOne(
`${environment.apiBaseUrl}tasks/?type=file` `${environment.apiBaseUrl}tasks/?task_name=consume_file`
) )
req.flush(mockTasks) req.flush(mockTasks)

View File

@ -54,10 +54,10 @@ export class TasksService {
this.loading = true this.loading = true
this.http this.http
.get<PaperlessTask[]>(`${this.baseUrl}tasks/?type=file`) .get<PaperlessTask[]>(`${this.baseUrl}tasks/?task_name=consume_file`)
.pipe(takeUntil(this.unsubscribeNotifer), first()) .pipe(takeUntil(this.unsubscribeNotifer), first())
.subscribe((r) => { .subscribe((r) => {
this.fileTasks = r.filter((t) => t.type == PaperlessTaskType.File) // they're all File tasks, for now this.fileTasks = r.filter((t) => t.type == PaperlessTaskType.Auto)
this.loading = false this.loading = false
}) })
} }

View File

@ -776,6 +776,7 @@ class PaperlessTaskFilterSet(FilterSet):
model = PaperlessTask model = PaperlessTask
fields = { fields = {
"type": ["exact"], "type": ["exact"],
"task_name": ["exact"],
"status": ["exact"], "status": ["exact"],
} }

View File

@ -1,28 +0,0 @@
# Generated by Django 5.1.6 on 2025-02-14 01:11
from django.db import migrations
from django.db import models
class Migration(migrations.Migration):
dependencies = [
("documents", "1062_alter_savedviewfilterrule_rule_type"),
]
operations = [
migrations.AddField(
model_name="paperlesstask",
name="type",
field=models.CharField(
choices=[
("file", "File Task"),
("scheduled_task", "Scheduled Task"),
("manual_task", "Manual Task"),
],
default="file",
help_text="The type of task that was run",
max_length=30,
verbose_name="Task Type",
),
),
]

View File

@ -0,0 +1,52 @@
# Generated by Django 5.1.6 on 2025-02-14 23:10
from django.db import migrations
from django.db import models
def make_existing_tasks_consume_auto(apps, schema_editor):
PaperlessTask = apps.get_model("documents", "PaperlessTask")
PaperlessTask.objects.all().update(type="auto_task", task_name="consume_file")
class Migration(migrations.Migration):
dependencies = [
("documents", "1062_alter_savedviewfilterrule_rule_type"),
]
operations = [
migrations.AddField(
model_name="paperlesstask",
name="type",
field=models.CharField(
choices=[
("auto_task", "Auto Task"),
("scheduled_task", "Scheduled Task"),
("manual_task", "Manual Task"),
],
default="auto_task",
help_text="The type of task that was run",
max_length=30,
verbose_name="Task Type",
),
),
migrations.AlterField(
model_name="paperlesstask",
name="task_name",
field=models.CharField(
choices=[
("consume_file", "Consume File"),
("train_classifier", "Train Classifier"),
("check_sanity", "Check Sanity"),
],
help_text="Name of the task that was run",
max_length=255,
null=True,
verbose_name="Task Name",
),
),
migrations.RunPython(
make_existing_tasks_consume_auto,
migrations.RunPython.noop,
),
]

View File

@ -651,10 +651,15 @@ class PaperlessTask(ModelWithOwner):
TASK_STATE_CHOICES = sorted(zip(ALL_STATES, ALL_STATES)) TASK_STATE_CHOICES = sorted(zip(ALL_STATES, ALL_STATES))
class TaskType(models.TextChoices): class TaskType(models.TextChoices):
FILE = ("file", _("File Task")) AUTO = ("auto_task", _("Auto Task"))
SCHEDULED_TASK = ("scheduled_task", _("Scheduled Task")) SCHEDULED_TASK = ("scheduled_task", _("Scheduled Task"))
MANUAL_TASK = ("manual_task", _("Manual Task")) MANUAL_TASK = ("manual_task", _("Manual Task"))
class TaskName(models.TextChoices):
CONSUME_FILE = ("consume_file", _("Consume File"))
TRAIN_CLASSIFIER = ("train_classifier", _("Train Classifier"))
CHECK_SANITY = ("check_sanity", _("Check Sanity"))
task_id = models.CharField( task_id = models.CharField(
max_length=255, max_length=255,
unique=True, unique=True,
@ -678,8 +683,9 @@ class PaperlessTask(ModelWithOwner):
task_name = models.CharField( task_name = models.CharField(
null=True, null=True,
max_length=255, max_length=255,
choices=TaskName.choices,
verbose_name=_("Task Name"), verbose_name=_("Task Name"),
help_text=_("Name of the Task which was run"), help_text=_("Name of the task that was run"),
) )
status = models.CharField( status = models.CharField(
@ -723,7 +729,7 @@ class PaperlessTask(ModelWithOwner):
type = models.CharField( type = models.CharField(
max_length=30, max_length=30,
choices=TaskType.choices, choices=TaskType.choices,
default=TaskType.FILE, default=TaskType.AUTO,
verbose_name=_("Task Type"), verbose_name=_("Task Type"),
help_text=_("The type of task that was run"), help_text=_("The type of task that was run"),
) )

View File

@ -67,7 +67,7 @@ def check_sanity(*, progress=False, scheduled=True) -> SanityCheckMessages:
type=PaperlessTask.TaskType.SCHEDULED_TASK type=PaperlessTask.TaskType.SCHEDULED_TASK
if scheduled if scheduled
else PaperlessTask.TaskType.MANUAL_TASK, else PaperlessTask.TaskType.MANUAL_TASK,
task_name="check_sanity", task_name=PaperlessTask.TaskName.CHECK_SANITY,
status=states.STARTED, status=states.STARTED,
date_created=timezone.now(), date_created=timezone.now(),
date_started=timezone.now(), date_started=timezone.now(),

View File

@ -1689,6 +1689,7 @@ class TasksViewSerializer(OwnedObjectSerializer):
fields = ( fields = (
"id", "id",
"task_id", "task_id",
"task_name",
"task_file_name", "task_file_name",
"date_created", "date_created",
"date_done", "date_done",

View File

@ -1221,11 +1221,11 @@ def before_task_publish_handler(sender=None, headers=None, body=None, **kwargs):
user_id = overrides.owner_id if overrides else None user_id = overrides.owner_id if overrides else None
PaperlessTask.objects.create( PaperlessTask.objects.create(
type=PaperlessTask.TaskType.FILE, type=PaperlessTask.TaskType.AUTO,
task_id=headers["id"], task_id=headers["id"],
status=states.PENDING, status=states.PENDING,
task_file_name=task_file_name, task_file_name=task_file_name,
task_name=headers["task"], task_name=PaperlessTask.TaskName.CONSUME_FILE,
result=None, result=None,
date_created=timezone.now(), date_created=timezone.now(),
date_started=None, date_started=None,

View File

@ -82,7 +82,7 @@ def train_classifier(*, scheduled=True):
if scheduled if scheduled
else PaperlessTask.TaskType.MANUAL_TASK, else PaperlessTask.TaskType.MANUAL_TASK,
task_id=uuid.uuid4(), task_id=uuid.uuid4(),
task_name="train_classifier", task_name=PaperlessTask.TaskName.TRAIN_CLASSIFIER,
status=states.STARTED, status=states.STARTED,
date_created=timezone.now(), date_created=timezone.now(),
date_started=timezone.now(), date_started=timezone.now(),

View File

@ -201,7 +201,7 @@ class TestSystemStatus(APITestCase):
PaperlessTask.objects.create( PaperlessTask.objects.create(
type=PaperlessTask.TaskType.SCHEDULED_TASK, type=PaperlessTask.TaskType.SCHEDULED_TASK,
status=states.SUCCESS, status=states.SUCCESS,
task_name="train_classifier", task_name=PaperlessTask.TaskName.TRAIN_CLASSIFIER,
) )
self.client.force_login(self.user) self.client.force_login(self.user)
response = self.client.get(self.ENDPOINT) response = self.client.get(self.ENDPOINT)
@ -238,7 +238,7 @@ class TestSystemStatus(APITestCase):
PaperlessTask.objects.create( PaperlessTask.objects.create(
type=PaperlessTask.TaskType.SCHEDULED_TASK, type=PaperlessTask.TaskType.SCHEDULED_TASK,
status=states.FAILURE, status=states.FAILURE,
task_name="train_classifier", task_name=PaperlessTask.TaskName.TRAIN_CLASSIFIER,
result="Classifier training failed", result="Classifier training failed",
) )
self.client.force_login(self.user) self.client.force_login(self.user)
@ -262,7 +262,7 @@ class TestSystemStatus(APITestCase):
PaperlessTask.objects.create( PaperlessTask.objects.create(
type=PaperlessTask.TaskType.SCHEDULED_TASK, type=PaperlessTask.TaskType.SCHEDULED_TASK,
status=states.SUCCESS, status=states.SUCCESS,
task_name="check_sanity", task_name=PaperlessTask.TaskName.CHECK_SANITY,
) )
self.client.force_login(self.user) self.client.force_login(self.user)
response = self.client.get(self.ENDPOINT) response = self.client.get(self.ENDPOINT)
@ -299,7 +299,7 @@ class TestSystemStatus(APITestCase):
PaperlessTask.objects.create( PaperlessTask.objects.create(
type=PaperlessTask.TaskType.SCHEDULED_TASK, type=PaperlessTask.TaskType.SCHEDULED_TASK,
status=states.FAILURE, status=states.FAILURE,
task_name="check_sanity", task_name=PaperlessTask.TaskName.CHECK_SANITY,
result="5 issues found.", result="5 issues found.",
) )
self.client.force_login(self.user) self.client.force_login(self.user)

View File

@ -246,7 +246,7 @@ class TestTasks(DirectoriesMixin, APITestCase):
PaperlessTask.objects.create( PaperlessTask.objects.create(
task_id=str(uuid.uuid4()), task_id=str(uuid.uuid4()),
task_file_name="test.pdf", task_file_name="test.pdf",
task_name="documents.tasks.some_task", task_name=PaperlessTask.TaskName.CONSUME_FILE,
status=celery.states.SUCCESS, status=celery.states.SUCCESS,
) )
@ -272,7 +272,7 @@ class TestTasks(DirectoriesMixin, APITestCase):
PaperlessTask.objects.create( PaperlessTask.objects.create(
task_id=str(uuid.uuid4()), task_id=str(uuid.uuid4()),
task_file_name="anothertest.pdf", task_file_name="anothertest.pdf",
task_name="documents.tasks.some_task", task_name=PaperlessTask.TaskName.CONSUME_FILE,
status=celery.states.SUCCESS, status=celery.states.SUCCESS,
) )

View File

@ -68,7 +68,7 @@ class TestTaskSignalHandler(DirectoriesMixin, TestCase):
self.assertIsNotNone(task) self.assertIsNotNone(task)
self.assertEqual(headers["id"], task.task_id) self.assertEqual(headers["id"], task.task_id)
self.assertEqual("hello-999.pdf", task.task_file_name) self.assertEqual("hello-999.pdf", task.task_file_name)
self.assertEqual("documents.tasks.consume_file", task.task_name) self.assertEqual(PaperlessTask.TaskName.CONSUME_FILE, task.task_name)
self.assertEqual(1, task.owner_id) self.assertEqual(1, task.owner_id)
self.assertEqual(celery.states.PENDING, task.status) self.assertEqual(celery.states.PENDING, task.status)

View File

@ -2668,7 +2668,7 @@ class SystemStatusView(PassUserMixin):
last_trained_task = ( last_trained_task = (
PaperlessTask.objects.filter( PaperlessTask.objects.filter(
task_name__icontains="train_classifier", task_name=PaperlessTask.TaskName.TRAIN_CLASSIFIER,
) )
.order_by("-date_done") .order_by("-date_done")
.first() .first()
@ -2687,7 +2687,7 @@ class SystemStatusView(PassUserMixin):
last_sanity_check = ( last_sanity_check = (
PaperlessTask.objects.filter( PaperlessTask.objects.filter(
task_name__icontains="check_sanity", task_name=PaperlessTask.TaskName.CHECK_SANITY,
) )
.order_by("-date_done") .order_by("-date_done")
.first() .first()