Unverified Commit 103c39f1 authored by Nicola Soranzo's avatar Nicola Soranzo Committed by GitHub
Browse files

Merge pull request #14315 from nsoranzo/release_22.05_fix_job_date_range

[22.05] Fix jobs API not allowing dates for ``date_range_min`` and ``date_range_max``
parents decc3cb0 50d339e2
Loading
Loading
Loading
Loading
+5 −2
Original line number Diff line number Diff line
import json
import logging
import typing
from datetime import datetime
from datetime import (
    date,
    datetime,
)

from boltons.iterutils import remap
from pydantic import (
@@ -108,7 +111,7 @@ class JobManager:

        def build_and_apply_filters(query, objects, filter_func):
            if objects is not None:
                if isinstance(objects, str) or isinstance(objects, datetime):
                if isinstance(objects, (str, date, datetime)):
                    query = query.filter(filter_func(objects))
                elif isinstance(objects, list):
                    t = []
+6 −3
Original line number Diff line number Diff line
@@ -2,7 +2,10 @@

import json
import re
from datetime import datetime
from datetime import (
    date,
    datetime,
)
from enum import Enum
from typing import (
    Any,
@@ -1109,8 +1112,8 @@ class JobIndexQueryPayload(Model):
    user_id: Optional[DecodedDatabaseIdField] = None
    tool_ids: Optional[List[str]] = None
    tool_ids_like: Optional[List[str]] = None
    date_range_min: Optional[datetime] = None
    date_range_max: Optional[datetime] = None
    date_range_min: Optional[Union[datetime, date]] = None
    date_range_max: Optional[Union[datetime, date]] = None
    history_id: Optional[DecodedDatabaseIdField] = None
    workflow_id: Optional[DecodedDatabaseIdField] = None
    invocation_id: Optional[DecodedDatabaseIdField] = None
+9 −5
Original line number Diff line number Diff line
@@ -5,12 +5,16 @@ API operations on a jobs.
"""

import logging
from datetime import datetime
from datetime import (
    date,
    datetime,
)
from typing import (
    Any,
    Dict,
    List,
    Optional,
    Union,
)

from fastapi import Query
@@ -99,13 +103,13 @@ ToolIdLikeQueryParam: Optional[str] = Query(
    description="Limit listing of jobs to those that match one of the included tool ID sql-like patterns. If none, all are returned",
)

DateRangeMinQueryParam: Optional[datetime] = Query(
DateRangeMinQueryParam: Optional[Union[datetime, date]] = Query(
    default=None,
    title="Date Range Minimum",
    description="Limit listing of jobs to those that are updated after specified date (e.g. '2014-01-01')",
)

DateRangeMaxQueryParam: Optional[datetime] = Query(
DateRangeMaxQueryParam: Optional[Union[datetime, date]] = Query(
    default=None,
    title="Date Range Maximum",
    description="Limit listing of jobs to those that are updated before specified date (e.g. '2014-01-01')",
@@ -187,8 +191,8 @@ class FastAPIJobs:
        view: JobIndexViewEnum = ViewQueryParam,
        tool_id: Optional[str] = ToolIdQueryParam,
        tool_id_like: Optional[str] = ToolIdLikeQueryParam,
        date_range_min: Optional[datetime] = DateRangeMinQueryParam,
        date_range_max: Optional[datetime] = DateRangeMaxQueryParam,
        date_range_min: Optional[Union[datetime, date]] = DateRangeMinQueryParam,
        date_range_max: Optional[Union[datetime, date]] = DateRangeMaxQueryParam,
        history_id: Optional[EncodedDatabaseIdField] = HistoryIdQueryParam,
        workflow_id: Optional[EncodedDatabaseIdField] = WorkflowIdQueryParam,
        invocation_id: Optional[EncodedDatabaseIdField] = InvocationIdQueryParam,
+11 −7
Original line number Diff line number Diff line
@@ -84,21 +84,25 @@ class JobsApiTestCase(ApiTestCase, TestsTools):
    def test_index_date_filter(self, history_id):
        two_weeks_ago = (datetime.datetime.utcnow() - datetime.timedelta(14)).isoformat()
        last_week = (datetime.datetime.utcnow() - datetime.timedelta(7)).isoformat()
        next_week = (datetime.datetime.utcnow() + datetime.timedelta(7)).isoformat()
        today = datetime.datetime.utcnow().isoformat()
        tomorrow = (datetime.datetime.utcnow() + datetime.timedelta(1)).isoformat()
        before = datetime.datetime.utcnow().isoformat()
        today = before[:10]
        tomorrow = (datetime.datetime.utcnow() + datetime.timedelta(1)).isoformat()[:10]
        self.__history_with_new_dataset(history_id)
        after = datetime.datetime.utcnow().isoformat()

        # Test using dates
        jobs = self.__jobs_index(data={"date_range_min": today, "date_range_max": tomorrow})
        assert len(jobs) > 0
        today_job_id = jobs[0]["id"]
        today_job = jobs[0]
        today_job_id = today_job["id"]

        # Test using datetimes
        jobs = self.__jobs_index(data={"date_range_min": before, "date_range_max": after})
        assert today_job_id in map(itemgetter("id"), jobs), f"before: {before}, after: {after}, job: {today_job}"

        jobs = self.__jobs_index(data={"date_range_min": two_weeks_ago, "date_range_max": last_week})
        assert today_job_id not in map(itemgetter("id"), jobs)

        jobs = self.__jobs_index(data={"date_range_min": last_week, "date_range_max": next_week})
        assert today_job_id in map(itemgetter("id"), jobs)

    @uses_test_history(require_new=True)
    def test_index_history(self, history_id):
        self.__history_with_new_dataset(history_id)