diff --git a/ami/jobs/serializers.py b/ami/jobs/serializers.py index f53199e73..206d3a5a5 100644 --- a/ami/jobs/serializers.py +++ b/ami/jobs/serializers.py @@ -192,6 +192,23 @@ class Meta: fields = ["id", "pipeline_slug"] +class JobChoiceSerializer(DefaultSerializer): + """What a job dropdown needs to name a job. + + The job counterpart of ``SourceImageCollectionNestedSerializer``, which serves the capture + set choices: no counts or nested objects, so the choices query stays cheap. + """ + + def get_permissions(self, instance, instance_data): + # A picker needs no per-job permissions, and resolving them costs several queries per row. + instance_data["user_permissions"] = [] + return instance_data + + class Meta: + model = Job + fields = ["id", "name", "details", "job_type_key", "created_at"] + + class MLJobTasksRequestSerializer(serializers.Serializer): """POST /jobs/{id}/tasks/ — request body sent by a processing service to fetch work. diff --git a/ami/jobs/tests/test_jobs.py b/ami/jobs/tests/test_jobs.py index 00b7934a7..fbed09b8f 100644 --- a/ami/jobs/tests/test_jobs.py +++ b/ami/jobs/tests/test_jobs.py @@ -9,6 +9,7 @@ from ami.base.serializers import reverse_with_params from ami.jobs.models import ( + DataExportJob, DataStorageSyncJob, Job, JobDispatchMode, @@ -16,6 +17,7 @@ JobProgress, JobState, MLJob, + PostProcessingJob, RegroupEventsJob, SourceImageCollectionPopulateJob, ) @@ -1744,3 +1746,91 @@ def test_browsable_page_renders_number_input(self): html = response.content.decode() self.assertNotIn('