Skip to content

Commit 33457ae

Browse files
author
Val Brodsky
committed
Cleanup LabelingDashboard
1 parent fd7c426 commit 33457ae

File tree

3 files changed

+59
-44
lines changed

3 files changed

+59
-44
lines changed

libs/labelbox/src/labelbox/__init__.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,4 +43,6 @@
4343
from labelbox.schema.identifiable import UniqueId, GlobalKey
4444
from labelbox.schema.ontology_kind import OntologyKind
4545
from labelbox.schema.project_overview import ProjectOverview, ProjectOverviewDetailed
46-
from labelbox.schema.labeling_service import LabelingService, LabelingServiceStatus
46+
from labelbox.schema.labeling_service import LabelingService
47+
from labelbox.schema.labeling_service_dashboard import LabelingServiceDashboard
48+
from labelbox.schema.labeling_service_status import LabelingServiceStatus

libs/labelbox/src/labelbox/client.py

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020
from labelbox import utils
2121
from labelbox.adv_client import AdvClient
2222
from labelbox.orm import query
23-
from labelbox.orm.comparison import Comparison
2423
from labelbox.orm.db_object import DbObject
2524
from labelbox.orm.model import Entity, Field
2625
from labelbox.pagination import PaginatedCollection
@@ -2395,6 +2394,17 @@ def upsert_label_feedback(self, label_id: str, feedback: str,
23952394
def get_labeling_service_dashboards(
23962395
self,
23972396
after: Optional[str] = None,
2398-
where: Optional[Comparison] = None,
2397+
search_query: Optional[List[Dict]] = None,
23992398
) -> PaginatedCollection:
2400-
return LabelingServiceDashboard.get_all(self, after, where)
2399+
"""
2400+
Get all labeling service dashboards for a given org.
2401+
2402+
Optional parameters:
2403+
after: The cursor to use for pagination.
2404+
where: A filter to apply to the query.
2405+
2406+
NOTE: support for after and search_query are not yet implemented.
2407+
"""
2408+
return LabelingServiceDashboard.get_all(self,
2409+
after,
2410+
search_query=search_query)

libs/labelbox/src/labelbox/schema/labeling_service_dashboard.py

Lines changed: 43 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,10 @@
1-
from datetime import datetime
21
from string import Template
2+
from datetime import datetime
33
from typing import Any, Dict, List, Optional
44

55
from labelbox.exceptions import ResourceNotFoundError
6-
from labelbox.orm.comparison import Comparison
7-
from labelbox.orm import query
8-
from ..orm.model import Field
96
from labelbox.pagination import PaginatedCollection
10-
from labelbox.pydantic_compat import BaseModel, root_validator
11-
from .organization import Organization
7+
from labelbox.pydantic_compat import BaseModel, root_validator, Field
128
from labelbox.utils import _CamelCaseMixin
139
from labelbox.schema.labeling_service_status import LabelingServiceStatus
1410

@@ -28,15 +24,29 @@
2824

2925

3026
class LabelingServiceDashboard(BaseModel):
31-
id: str
32-
name: str
33-
# service_type: str
34-
# created_at: datetime
35-
# updated_at: datetime
36-
# created_by_id: str
37-
status: LabelingServiceStatus
38-
tasks_completed: int
39-
tasks_remaining: int
27+
"""
28+
Represent labeling service data for a project
29+
30+
Attributes:
31+
id (str): project id
32+
name (str): project name
33+
status (LabelingServiceStatus): status of the labeling service
34+
tasks_completed (int): number of data rows completed
35+
tasks_remaining (int): number of data rows that have not started
36+
client (Any): labelbox client
37+
"""
38+
id: str = Field(frozen=True)
39+
name: str = Field(frozen=True)
40+
service_type: Optional[str] = Field(frozen=True, default=None)
41+
created_at: Optional[datetime] = Field(frozen=True, default=None)
42+
updated_at: Optional[datetime] = Field(frozen=True, default=None)
43+
created_by_id: Optional[str] = Field(frozen=True, default=None)
44+
status: LabelingServiceStatus = Field(frozen=True,
45+
default=LabelingServiceStatus.Missing)
46+
data_rows_count: int = Field(frozen=True)
47+
data_rows_in_review_count: int = Field(frozen=True)
48+
data_rows_in_rework_count: int = Field(frozen=True)
49+
data_rows_done_count: int = Field(frozen=True)
4050

4151
client: Any # type Any to avoid circular import from client
4252

@@ -46,6 +56,14 @@ def __init__(self, **kwargs):
4656
raise RuntimeError(
4757
"Please enable experimental in client to use LabelingService")
4858

59+
@property
60+
def tasks_completed(self):
61+
return self.data_rows_done_count
62+
63+
@property
64+
def tasks_remaining(self):
65+
return self.data_rows_count - self.data_rows_done_count
66+
4967
class Config(_CamelCaseMixin.Config):
5068
...
5169

@@ -57,24 +75,14 @@ def get(cls, client, project_id: str) -> 'LabelingServiceDashboard':
5775
Raises:
5876
ResourceNotFoundError: If the project does not have a labeling service.
5977
"""
60-
query = """
61-
query GetProjectByIdPyApi($id: ID!) {
62-
getProjectById(input: {id: $id}) {
63-
id
64-
name
65-
# serviceType
66-
# createdAt
67-
# updatedAt
68-
# createdById
69-
boostStatus
70-
dataRowsCount
71-
dataRowsInReviewCount
72-
dataRowsInReworkCount
73-
dataRowsDoneCount
74-
}
75-
}
76-
"""
77-
result = client.execute(query, {"id": project_id})
78+
query = f"""
79+
query GetProjectByIdPyApi($id: ID!) {{
80+
getProjectById(input: {{id: $id}}) {{
81+
{GRAPHQL_QUERY_SELECTIONS}
82+
}}
83+
}}
84+
"""
85+
result = client.execute(query, {"id": project_id}, experimental=True)
7886
if result["getProjectById"] is None:
7987
raise ResourceNotFoundError(
8088
message="The project does not have a labeling service.")
@@ -87,7 +95,6 @@ def get_all(
8795
cls,
8896
client,
8997
after: Optional[str] = None,
90-
# where: Optional[Comparison] = None,
9198
search_query: Optional[List[Dict]] = None,
9299
) -> PaginatedCollection:
93100
template = Template(
@@ -121,16 +128,12 @@ def convert_to_labeling_service_dashboard(client, data):
121128
dereferencing=['searchProjects', 'nodes'],
122129
obj_class=convert_to_labeling_service_dashboard,
123130
cursor_path=['searchProjects', 'pageInfo', 'endCursor'],
131+
experimental=True,
124132
)
125133

126134
@root_validator(pre=True)
127-
def convert_graphql_to_attrs(cls, data):
135+
def convert_boost_status_to_enum(cls, data):
128136
if 'boostStatus' in data:
129137
data['status'] = LabelingServiceStatus(data.pop('boostStatus'))
130-
if 'dataRowsDoneCount' in data:
131-
data['tasksCompleted'] = data.pop('dataRowsDoneCount')
132-
if 'dataRowsCount' in data and 'dataRowsInReviewCount' in data and 'dataRowsInReworkCount' in data:
133-
data['tasksRemaining'] = data['dataRowsCount'] - (
134-
data['dataRowsInReviewCount'] + data['dataRowsInReworkCount'])
135138

136139
return data

0 commit comments

Comments
 (0)