Skip to content

Commit 4171bec

Browse files
authored
[PLT-1412] Vb/add task filters plt 1412 (#1773)
1 parent cb8fa5a commit 4171bec

File tree

4 files changed

+104
-56
lines changed

4 files changed

+104
-56
lines changed

libs/labelbox/src/labelbox/client.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2435,7 +2435,7 @@ def get_labeling_service_dashboards(
24352435
>>> seven_days_ago = (datetime.now() - timedelta(days=7)).strftime("%Y-%m-%d")
24362436
>>> workforce_requested_filter_before = WorkforceRequestedDateFilter(
24372437
>>> operation=OperationType.WorforceRequestedDate,
2438-
>>> value=DateValue(operator=DateOperator.GreaterThanOrEqual,
2438+
>>> value=DateValue(operator=RangeOperatorWithSingleValue.GreaterThanOrEqual,
24392439
>>> value=seven_days_ago))
24402440
>>> labeling_service_dashboard = [ld for ld in project.client.get_labeling_service_dashboards(search_query=[workforce_requested_filter_before])]
24412441

libs/labelbox/src/labelbox/schema/search_filters.py

Lines changed: 47 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ class OperationType(Enum):
3636
Stage = 'stage'
3737
WorforceRequestedDate = 'workforce_requested_at'
3838
WorkforceStageUpdatedDate = 'workforce_stage_updated_at'
39+
TaskCompletedCount = 'task_completed_count'
40+
TaskRemainingCount = 'task_remaining_count'
3941

4042

4143
class IdOperator(Enum):
@@ -45,7 +47,7 @@ class IdOperator(Enum):
4547
Is = 'is'
4648

4749

48-
class DateOperator(Enum):
50+
class RangeOperatorWithSingleValue(Enum):
4951
"""
5052
Supported operators for dates
5153
"""
@@ -54,7 +56,7 @@ class DateOperator(Enum):
5456
LessThanOrEqual = 'LESS_THAN_OR_EQUAL'
5557

5658

57-
class DateRangeOperator(Enum):
59+
class RangeOperatorWithValue(Enum):
5860
"""
5961
Supported operators for date ranges
6062
"""
@@ -65,7 +67,7 @@ class OrganizationFilter(BaseSearchFilter):
6567
"""
6668
Filter for organization
6769
"""
68-
operation: Literal[OperationType.Organization]
70+
operation: Literal[OperationType.Organization] = OperationType.Organization
6971
operator: IdOperator
7072
values: List[str]
7173

@@ -74,7 +76,7 @@ class WorkspaceFilter(BaseSearchFilter):
7476
"""
7577
Filter for workspace
7678
"""
77-
operation: Literal[OperationType.Workspace]
79+
operation: Literal[OperationType.Workspace] = OperationType.Workspace
7880
operator: IdOperator
7981
values: List[str]
8082

@@ -83,7 +85,7 @@ class TagFilter(BaseSearchFilter):
8385
"""
8486
Filter for project tags
8587
"""
86-
operation: Literal[OperationType.Tag]
88+
operation: Literal[OperationType.Tag] = OperationType.Tag
8789
operator: IdOperator
8890
values: List[str]
8991

@@ -92,7 +94,7 @@ class ProjectStageFilter(BaseSearchFilter):
9294
"""
9395
Filter labelbox service / aka project stages
9496
"""
95-
operation: Literal[OperationType.Stage]
97+
operation: Literal[OperationType.Stage] = OperationType.Stage
9698
operator: IdOperator
9799
values: List[str]
98100

@@ -109,23 +111,32 @@ class DateValue(BaseSearchFilter):
109111
so for a string '2024-01-01' that is run on a computer in PST, we would convert it to '2024-01-01T08:00:00Z'
110112
while the same string in EST will get converted to '2024-01-01T05:00:00Z'
111113
"""
112-
operator: DateOperator
114+
operator: RangeOperatorWithSingleValue
113115
value: datetime.datetime
114116

115117

118+
class IntegerValue(BaseSearchFilter):
119+
operator: RangeOperatorWithSingleValue
120+
value: int
121+
122+
116123
class WorkforceStageUpdatedFilter(BaseSearchFilter):
117124
"""
118125
Filter for workforce stage updated date
119126
"""
120-
operation: Literal[OperationType.WorkforceStageUpdatedDate]
127+
operation: Literal[
128+
OperationType.
129+
WorkforceStageUpdatedDate] = OperationType.WorkforceStageUpdatedDate
121130
value: DateValue
122131

123132

124133
class WorkforceRequestedDateFilter(BaseSearchFilter):
125134
"""
126135
Filter for workforce requested date
127136
"""
128-
operation: Literal[OperationType.WorforceRequestedDate]
137+
operation: Literal[
138+
OperationType.
139+
WorforceRequestedDate] = OperationType.WorforceRequestedDate
129140
value: DateValue
130141

131142

@@ -141,31 +152,54 @@ class DateRangeValue(BaseSearchFilter):
141152
"""
142153
Date range value for a search filter
143154
"""
144-
operator: DateRangeOperator
155+
operator: RangeOperatorWithValue
145156
value: DateRange
146157

147158

148159
class WorkforceRequestedDateRangeFilter(BaseSearchFilter):
149160
"""
150161
Filter for workforce requested date range
151162
"""
152-
operation: Literal[OperationType.WorforceRequestedDate]
163+
operation: Literal[
164+
OperationType.
165+
WorforceRequestedDate] = OperationType.WorforceRequestedDate
153166
value: DateRangeValue
154167

155168

156169
class WorkforceStageUpdatedRangeFilter(BaseSearchFilter):
157170
"""
158171
Filter for workforce stage updated date range
159172
"""
160-
operation: Literal[OperationType.WorkforceStageUpdatedDate]
173+
operation: Literal[
174+
OperationType.
175+
WorkforceStageUpdatedDate] = OperationType.WorkforceStageUpdatedDate
161176
value: DateRangeValue
162177

163178

179+
class TaskCompletedCountFilter(BaseSearchFilter):
180+
"""
181+
Filter for completed tasks count
182+
"""
183+
operation: Literal[
184+
OperationType.TaskCompletedCount] = OperationType.TaskCompletedCount
185+
value: IntegerValue
186+
187+
188+
class TaskRemainingCountFilter(BaseSearchFilter):
189+
"""
190+
Filter for remaining tasks count
191+
"""
192+
operation: Literal[
193+
OperationType.TaskRemainingCount] = OperationType.TaskRemainingCount
194+
value: IntegerValue
195+
196+
164197
SearchFilter = Union[OrganizationFilter, WorkspaceFilter, TagFilter,
165198
ProjectStageFilter, WorkforceRequestedDateFilter,
166199
WorkforceStageUpdatedFilter,
167200
WorkforceRequestedDateRangeFilter,
168-
WorkforceStageUpdatedRangeFilter]
201+
WorkforceStageUpdatedRangeFilter, TaskCompletedCountFilter,
202+
TaskRemainingCountFilter]
169203

170204

171205
def _dict_to_graphql_string(d: Union[dict, list, str, int]) -> str:

libs/labelbox/tests/integration/test_labeling_dashboard.py

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
from datetime import datetime, timedelta
22
from labelbox.schema.labeling_service import LabelingServiceStatus
3-
from labelbox.schema.search_filters import DateOperator, DateRange, DateRangeOperator, DateRangeValue, DateValue, IdOperator, OperationType, OrganizationFilter, WorkforceRequestedDateFilter, WorkforceRequestedDateRangeFilter, WorkspaceFilter
43
from labelbox.schema.ontology_kind import EditorTaskType
54
from labelbox.schema.media_type import MediaType
5+
from labelbox.schema.search_filters import IntegerValue, RangeOperatorWithSingleValue, DateRange, RangeOperatorWithValue, DateRangeValue, DateValue, IdOperator, OperationType, OrganizationFilter, TaskCompletedCountFilter, WorkforceRequestedDateFilter, WorkforceRequestedDateRangeFilter, WorkspaceFilter, TaskRemainingCountFilter
66

77

88
def test_request_labeling_service_dashboard(rand_gen,
@@ -48,12 +48,13 @@ def test_request_labeling_service_dashboard_filters(requested_labeling_service):
4848

4949
workforce_requested_filter_before = WorkforceRequestedDateFilter(
5050
operation=OperationType.WorforceRequestedDate,
51-
value=DateValue(operator=DateOperator.GreaterThanOrEqual,
52-
value=datetime.strptime("2024-01-01", "%Y-%m-%d")))
51+
value=DateValue(
52+
operator=RangeOperatorWithSingleValue.GreaterThanOrEqual,
53+
value=datetime.strptime("2024-01-01", "%Y-%m-%d")))
5354
year_from_now = (datetime.now() + timedelta(days=365))
5455
workforce_requested_filter_after = WorkforceRequestedDateFilter(
5556
operation=OperationType.WorforceRequestedDate,
56-
value=DateValue(operator=DateOperator.LessThanOrEqual,
57+
value=DateValue(operator=RangeOperatorWithSingleValue.LessThanOrEqual,
5758
value=year_from_now))
5859

5960
labeling_service_dashboard = [
@@ -66,7 +67,7 @@ def test_request_labeling_service_dashboard_filters(requested_labeling_service):
6667

6768
workforce_date_range_filter = WorkforceRequestedDateRangeFilter(
6869
operation=OperationType.WorforceRequestedDate,
69-
value=DateRangeValue(operator=DateRangeOperator.Between,
70+
value=DateRangeValue(operator=RangeOperatorWithValue.Between,
7071
value=DateRange(min="2024-01-01T00:00:00-0800",
7172
max=year_from_now)))
7273

@@ -90,3 +91,18 @@ def test_request_labeling_service_dashboard_filters(requested_labeling_service):
9091
labeling_service_dashboard = project.client.get_labeling_service_dashboards(
9192
).get_one()
9293
assert labeling_service_dashboard
94+
95+
task_done_count_filter = TaskCompletedCountFilter(
96+
operation=OperationType.TaskCompletedCount,
97+
value=IntegerValue(
98+
operator=RangeOperatorWithSingleValue.GreaterThanOrEqual, value=0))
99+
task_remaining_count_filter = TaskRemainingCountFilter(
100+
operation=OperationType.TaskRemainingCount,
101+
value=IntegerValue(
102+
operator=RangeOperatorWithSingleValue.GreaterThanOrEqual, value=0))
103+
104+
labeling_service_dashboard = [
105+
ld for ld in project.client.get_labeling_service_dashboards(
106+
search_query=[task_done_count_filter, task_remaining_count_filter])
107+
][0]
108+
assert labeling_service_dashboard is not None
Lines changed: 35 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,16 @@
11
from datetime import datetime
2-
from labelbox.schema.search_filters import DateOperator, DateRange, DateRangeOperator, DateRangeValue, DateValue, IdOperator, OperationType, OrganizationFilter, ProjectStageFilter, TagFilter, WorkforceRequestedDateFilter, WorkforceRequestedDateRangeFilter, WorkforceStageUpdatedFilter, WorkforceStageUpdatedRangeFilter, WorkspaceFilter, build_search_filter
2+
from labelbox.schema.search_filters import IntegerValue, RangeOperatorWithSingleValue, DateRange, RangeOperatorWithValue, DateRangeValue, DateValue, IdOperator, OperationType, OrganizationFilter, ProjectStageFilter, TagFilter, TaskCompletedCountFilter, TaskRemainingCountFilter, WorkforceRequestedDateFilter, WorkforceRequestedDateRangeFilter, WorkforceStageUpdatedFilter, WorkforceStageUpdatedRangeFilter, WorkspaceFilter, build_search_filter
33
from labelbox.utils import format_iso_datetime
44

55

66
def test_id_filters():
77
filters = [
8-
OrganizationFilter(operation=OperationType.Organization,
9-
operator=IdOperator.Is,
8+
OrganizationFilter(operator=IdOperator.Is,
109
values=["clphb4vd7000cd2wv1ktu5cwa"]),
11-
WorkspaceFilter(operation=OperationType.Workspace,
12-
operator=IdOperator.Is,
10+
WorkspaceFilter(operator=IdOperator.Is,
1311
values=["clphb4vd7000cd2wv1ktu5cwa"]),
14-
TagFilter(operation=OperationType.Tag,
15-
operator=IdOperator.Is,
16-
values=["tag"]),
17-
ProjectStageFilter(operation=OperationType.Stage,
18-
operator=IdOperator.Is,
19-
values=["requested"]),
12+
TagFilter(operator=IdOperator.Is, values=["tag"]),
13+
ProjectStageFilter(operator=IdOperator.Is, values=["requested"]),
2014
]
2115

2216
assert build_search_filter(
@@ -29,14 +23,12 @@ def test_date_filters():
2923
local_time_end = datetime.strptime("2025-01-01", "%Y-%m-%d")
3024

3125
filters = [
32-
WorkforceRequestedDateFilter(
33-
operation=OperationType.WorforceRequestedDate,
34-
value=DateValue(operator=DateOperator.GreaterThanOrEqual,
35-
value=local_time_start)),
36-
WorkforceStageUpdatedFilter(
37-
operation=OperationType.WorkforceStageUpdatedDate,
38-
value=DateValue(operator=DateOperator.LessThanOrEqual,
39-
value=local_time_end)),
26+
WorkforceRequestedDateFilter(value=DateValue(
27+
operator=RangeOperatorWithSingleValue.GreaterThanOrEqual,
28+
value=local_time_start)),
29+
WorkforceStageUpdatedFilter(value=DateValue(
30+
operator=RangeOperatorWithSingleValue.LessThanOrEqual,
31+
value=local_time_end)),
4032
]
4133
expected_start = format_iso_datetime(local_time_start)
4234
expected_end = format_iso_datetime(local_time_end)
@@ -47,25 +39,31 @@ def test_date_filters():
4739

4840
def test_date_range_filters():
4941
filters = [
50-
WorkforceRequestedDateRangeFilter(
51-
operation=OperationType.WorforceRequestedDate,
52-
value=DateRangeValue(operator=DateRangeOperator.Between,
53-
value=DateRange(min=datetime.strptime(
54-
"2024-01-01T00:00:00-0800",
55-
"%Y-%m-%dT%H:%M:%S%z"),
56-
max=datetime.strptime(
57-
"2025-01-01T00:00:00-0800",
58-
"%Y-%m-%dT%H:%M:%S%z")))),
59-
WorkforceStageUpdatedRangeFilter(
60-
operation=OperationType.WorkforceStageUpdatedDate,
61-
value=DateRangeValue(operator=DateRangeOperator.Between,
62-
value=DateRange(min=datetime.strptime(
63-
"2024-01-01T00:00:00-0800",
64-
"%Y-%m-%dT%H:%M:%S%z"),
65-
max=datetime.strptime(
66-
"2025-01-01T00:00:00-0800",
67-
"%Y-%m-%dT%H:%M:%S%z")))),
42+
WorkforceRequestedDateRangeFilter(value=DateRangeValue(
43+
operator=RangeOperatorWithValue.Between,
44+
value=DateRange(min=datetime.strptime("2024-01-01T00:00:00-0800",
45+
"%Y-%m-%dT%H:%M:%S%z"),
46+
max=datetime.strptime("2025-01-01T00:00:00-0800",
47+
"%Y-%m-%dT%H:%M:%S%z")))),
48+
WorkforceStageUpdatedRangeFilter(value=DateRangeValue(
49+
operator=RangeOperatorWithValue.Between,
50+
value=DateRange(min=datetime.strptime("2024-01-01T00:00:00-0800",
51+
"%Y-%m-%dT%H:%M:%S%z"),
52+
max=datetime.strptime("2025-01-01T00:00:00-0800",
53+
"%Y-%m-%dT%H:%M:%S%z")))),
6854
]
6955
assert build_search_filter(
7056
filters
7157
) == '[{value: {operator: "BETWEEN", value: {min: "2024-01-01T08:00:00Z", max: "2025-01-01T08:00:00Z"}}, type: "workforce_requested_at"}, {value: {operator: "BETWEEN", value: {min: "2024-01-01T08:00:00Z", max: "2025-01-01T08:00:00Z"}}, type: "workforce_stage_updated_at"}]'
58+
59+
60+
def test_task_count_filters():
61+
filters = [
62+
TaskCompletedCountFilter(value=IntegerValue(
63+
operator=RangeOperatorWithSingleValue.GreaterThanOrEqual, value=1)),
64+
TaskRemainingCountFilter(value=IntegerValue(
65+
operator=RangeOperatorWithSingleValue.LessThanOrEqual, value=10)),
66+
]
67+
68+
expected = '[{value: {operator: "GREATER_THAN_OR_EQUAL", value: 1}, type: "task_completed_count"}, {value: {operator: "LESS_THAN_OR_EQUAL", value: 10}, type: "task_remaining_count"}]'
69+
assert build_search_filter(filters) == expected

0 commit comments

Comments
 (0)