Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feat/remove result from list endpoint #1577

Merged
merged 12 commits into from
Feb 6, 2025
50 changes: 50 additions & 0 deletions gateway/api/repositories/jobs.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@
Repository implementation for Job model
"""
import logging
from typing import List
from django.db.models import Q
from api.models import Job

logger = logging.getLogger("gateway")
Expand Down Expand Up @@ -29,3 +31,51 @@ def get_job_by_id(self, job_id: str) -> Job:
logger.info("Job [%s] was not found", id)

return result_queryset

def get_user_jobs(self, user, ordering="-created") -> List[Job]:
"""
Retrieves jobs created by a specific user.

Args:
user (User): The user whose jobs are to be retrieved.
ordering (str, optional): The field to order the results by. Defaults to "-created".

Returns:
List[Jobs]: a list of Jobs
"""
user_criteria = Q(author=user)
return Job.objects.filter(user_criteria).order_by(ordering)

def get_user_jobs_with_provider(self, user, ordering="-created") -> List[Job]:
"""
Retrieves jobs created by a specific user that have an associated provider.

Args:
user (User): The user whose jobs are to be retrieved.
ordering (str, optional): The field to order the results by. Defaults to "-created".

Returns:
List[Jobs]: a list of Jobs
"""
user_criteria = Q(author=user)
provider_exists_criteria = ~Q(program__provider=None)
return Job.objects.filter(user_criteria & provider_exists_criteria).order_by(
ordering
)

def get_user_jobs_without_provider(self, user, ordering="-created") -> List[Job]:
"""
Retrieves jobs created by a specific user that do not have an associated provider.

Args:
user (User): The user whose jobs are to be retrieved.
ordering (str, optional): The field to order the results by. Defaults to "-created".

Returns:
List[Job]: A queryset of Job objects without a provider.
"""
user_criteria = Q(author=user)
provider_not_exists_criteria = Q(program__provider=None)
return Job.objects.filter(
user_criteria & provider_not_exists_criteria
).order_by(ordering)
26 changes: 10 additions & 16 deletions gateway/api/views/jobs.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,6 @@
import logging
import os

from django.db.models import Q

# pylint: disable=duplicate-code
from opentelemetry import trace
from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter
Expand Down Expand Up @@ -89,18 +87,14 @@ def get_queryset(self):
type_filter = self.request.query_params.get("filter")
if type_filter:
if type_filter == TypeFilter.CATALOG:
user_criteria = Q(author=self.request.user)
provider_exists_criteria = ~Q(program__provider=None)
return Job.objects.filter(
user_criteria & provider_exists_criteria
).order_by("-created")
return self.jobs_repository.get_user_jobs_with_provider(
self.request.user
)
if type_filter == TypeFilter.SERVERLESS:
user_criteria = Q(author=self.request.user)
provider_not_exists_criteria = Q(program__provider=None)
return Job.objects.filter(
user_criteria & provider_not_exists_criteria
).order_by("-created")
return Job.objects.filter(author=self.request.user).order_by("-created")
return self.jobs_repository.get_user_jobs_without_provider(
self.request.user
)
return self.jobs_repository.get_user_jobs(self.request.user)

def retrieve(self, request, pk=None): # pylint: disable=unused-argument
"""Get job:"""
Expand Down Expand Up @@ -141,14 +135,14 @@ def list(self, request):
tracer = trace.get_tracer("gateway.tracer")
ctx = TraceContextTextMapPropagator().extract(carrier=request.headers)
with tracer.start_as_current_span("gateway.job.list", context=ctx):
queryset = self.filter_queryset(self.get_queryset())
queryset = self.get_queryset()

page = self.paginate_queryset(queryset)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@paaragon let's use this opportunity to migrate the queryset too. The idea as we commented is to put all the logic related with the ORM in the Repositories. In this case the philosophy would be similar to what we did in the list for functions: https://github.ibm.com/IBM-Q-Software/qiskit-serverless/blob/main/gateway/api/views/programs.py#L104

if page is not None:
serializer = self.get_serializer(page, many=True)
serializer = self.get_serializer_job_without_result(page, many=True)
return self.get_paginated_response(serializer.data)

serializer = self.get_serializer(queryset, many=True)
serializer = self.get_serializer_job_without_result(queryset, many=True)
return Response(serializer.data)

@action(methods=["POST"], detail=True)
Expand Down
17 changes: 2 additions & 15 deletions gateway/tests/api/test_job.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,9 +36,7 @@ def test_job_list(self):
self.assertEqual(
jobs_response.data.get("results")[0].get("status"), "SUCCEEDED"
)
self.assertEqual(
jobs_response.data.get("results")[0].get("result"), '{"somekey":1}'
)
self.assertEqual(jobs_response.data.get("results")[0].get("result"), None)

def test_job_catalog_list(self):
"""Tests job list authorized."""
Expand All @@ -50,9 +48,7 @@ def test_job_catalog_list(self):
self.assertEqual(jobs_response.status_code, status.HTTP_200_OK)
self.assertEqual(jobs_response.data.get("count"), 1)
self.assertEqual(jobs_response.data.get("results")[0].get("status"), "QUEUED")
self.assertEqual(
jobs_response.data.get("results")[0].get("result"), '{"somekey":1}'
)
self.assertEqual(jobs_response.data.get("results")[0].get("result"), None)

def test_job_serverless_list(self):
"""Tests job list authorized."""
Expand All @@ -63,15 +59,6 @@ def test_job_serverless_list(self):
)
self.assertEqual(jobs_response.status_code, status.HTTP_200_OK)
self.assertEqual(jobs_response.data.get("count"), 2)
job_status = jobs_response.data.get("results")[0].get("status")
if job_status == "SUCCEEDED":
self.assertEqual(
jobs_response.data.get("results")[0].get("result"), '{"somekey":1}'
)
elif job_status == "QUEUED":
self.assertEqual(
jobs_response.data.get("results")[0].get("result"), '{"somekey":2}'
)

def test_job_detail(self):
"""Tests job detail authorized."""
Expand Down