def labeler_performance(self): """ Returns the labeler performances for this Project. Returns: A PaginatedCollection of LabelerPerformance objects. """ id_param = "projectId" query_str = """query LabelerPerformancePyApi($%s: ID!) { project(where: {id: $%s}) { labelerPerformance(skip: %%d first: %%d) { count user {%s} secondsPerLabel totalTimeLabeling consensus averageBenchmarkAgreement lastActivityTime} }}""" % (id_param, id_param, query.results_query_part(Entity.User)) def create_labeler_performance(client, result): result["user"] = Entity.User(client, result["user"]) # python isoformat doesn't accept Z as utc timezone result["lastActivityTime"] = datetime.fromisoformat( result["lastActivityTime"].replace('Z', '+00:00')) return LabelerPerformance(**{ utils.snake_case(key): value for key, value in result.items() }) return PaginatedCollection(self.client, query_str, {id_param: self.uid}, ["project", "labelerPerformance"], create_labeler_performance)
def labels(self, datasets=None, order_by=None): """ Custom relationship expansion method to support limited filtering. Args: datasets (iterable of Dataset): Optional collection of Datasets whose Labels are sought. If not provided, all Labels in this Project are returned. order_by (None or (Field, Field.Order)): Ordering clause. """ Label = Entity.Label if datasets is not None: where = " where:{dataRow: {dataset: {id_in: [%s]}}}" % ", ".join( '"%s"' % dataset.uid for dataset in datasets) else: where = "" if order_by is not None: query.check_order_by_clause(Label, order_by) order_by_str = "orderBy: %s_%s" % (order_by[0].graphql_name, order_by[1].name.upper()) else: order_by_str = "" id_param = "projectId" query_str = """query GetProjectLabelsPyApi($%s: ID!) {project (where: {id: $%s}) {labels (skip: %%d first: %%d %s %s) {%s}}}""" % ( id_param, id_param, where, order_by_str, query.results_query_part(Label)) return PaginatedCollection(self.client, query_str, {id_param: self.uid}, ["project", "labels"], Label)
def _to_many(self, where=None, order_by=None): """ Returns an iterable over the destination relationship objects. Args: where (None, Comparison or LogicalExpression): Filtering clause. order_by (None or (Field, Field.Order)): Ordering clause. Return: iterable over destination DbObject instances. """ rel = self.relationship if where is not None and not self.supports_filtering: raise InvalidQueryError( "Relationship %s.%s doesn't support filtering" % (self.source.type_name(), rel.name)) if order_by is not None and not self.supports_sorting: raise InvalidQueryError( "Relationship %s.%s doesn't support sorting" % (self.source.type_name(), rel.name)) if rel.filter_deleted: not_deleted = rel.destination_type.deleted == False where = not_deleted if where is None else where & not_deleted query_string, params = query.relationship( self.source if self.filter_on_id else type(self.source), rel, where, order_by) return PaginatedCollection( self.source.client, query_string, params, [utils.camel_case(self.source.type_name()), rel.graphql_name], rel.destination_type)
def get_invites(client): """ Do not use. Only for testing. """ query_str = """query GetOrgInvitationsPyApi($from: ID, $first: PageSize) { organization { id invites(from: $from, first: $first) { nodes { id createdAt organizationRoleName inviteeEmail } nextCursor }}}""" invites = PaginatedCollection( client, query_str, {}, ['organization', 'invites', 'nodes'], Invite, cursor_path=['organization', 'invites', 'nextCursor'], experimental=True) return invites
def members(self): """ Fetch all current members for this project Returns: A `PaginatedCollection of `ProjectMember`s """ id_param = "projectId" query_str = """query ProjectMemberOverviewPyApi($%s: ID!) { project(where: {id : $%s}) { id members(skip: %%d first: %%d){ id user { %s } role { id name } } } }""" % (id_param, id_param, query.results_query_part(Entity.User)) return PaginatedCollection(self.client, query_str, {id_param: str(self.uid)}, ["project", "members"], ProjectMember)
def get_project_invites(client, project_id): """ Do not use. Only for testing. """ id_param = "projectId" query_str = """query GetProjectInvitationsPyApi($from: ID, $first: PageSize, $%s: ID!) { project(where: {id: $%s}) {id invites(from: $from, first: $first) { nodes { %s projectInvites { projectId projectRoleName } } nextCursor}}} """ % (id_param, id_param, results_query_part(Invite)) return PaginatedCollection( client, query_str, {id_param: project_id}, ['project', 'invites', 'nodes'], Invite, cursor_path=['project', 'invites', 'nextCursor'], experimental=True)
def _get_all(self, db_object_type, where): """ Fetches all the objects of the given type the user has access to. Args: db_object_type (type): DbObject subclass. where (Comparison, LogicalOperation or None): The `where` clause for filtering. Return: An iterable of `db_object_type` instances. """ not_deleted = db_object_type.deleted == False where = not_deleted if where is None else where & not_deleted query_str, params = query.get_all(db_object_type, where) return PaginatedCollection( self, query_str, params, [utils.camel_case(db_object_type.type_name()) + "s"], db_object_type)