Skip to content

Commit 2b21fd2

Browse files
author
Wesley Lima
committed
fix: FIT-786: Making DM filters support multiple projects (optionally)
1 parent 480f40d commit 2b21fd2

File tree

2 files changed

+30
-3
lines changed

2 files changed

+30
-3
lines changed

label_studio/data_manager/managers.py

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -494,6 +494,10 @@ def prepared(self, prepare_params=None):
494494
495495
:param prepare_params: prepare params with project, filters, orderings, etc
496496
:return: ordered and filtered queryset
497+
498+
Note: For multi-project queries, filters and ordering will use the first project's
499+
configuration (label config, custom fields, etc.). This is backwards compatible
500+
with single-project queries.
497501
"""
498502
from projects.models import Project
499503

@@ -502,7 +506,14 @@ def prepared(self, prepare_params=None):
502506
if prepare_params is None:
503507
return queryset
504508

505-
project = Project.objects.get(pk=prepare_params.project)
509+
# Get the project for filter/ordering configuration
510+
# For multi-project queries, use the first project's configuration
511+
if prepare_params.is_multi_project:
512+
project = Project.objects.get(pk=prepare_params.projects[0])
513+
else:
514+
# Backwards compatible: prepare_params.project is an int
515+
project = Project.objects.get(pk=prepare_params.project)
516+
506517
request = prepare_params.request
507518
queryset = apply_filters(queryset, prepare_params.filters, project, request)
508519
queryset = apply_ordering(queryset, prepare_params.ordering, project, request, view_data=prepare_params.data)
@@ -774,7 +785,11 @@ def get_queryset(
774785

775786
def only_filtered(self, prepare_params=None):
776787
request = prepare_params.request
777-
queryset = TaskQuerySet(self.model).filter(project=prepare_params.project)
788+
# Support both single and multiple projects
789+
if prepare_params.is_multi_project:
790+
queryset = TaskQuerySet(self.model).filter(project__in=prepare_params.projects)
791+
else:
792+
queryset = TaskQuerySet(self.model).filter(project=prepare_params.project)
778793
fields_for_filter_ordering = get_fields_for_filter_ordering(prepare_params)
779794
queryset = self.annotate_queryset(queryset, fields_for_evaluation=fields_for_filter_ordering, request=request)
780795
return queryset.prepared(prepare_params=prepare_params)

label_studio/data_manager/prepare_params.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,13 +37,25 @@ class SelectedItems(BaseModel):
3737

3838

3939
class PrepareParams(BaseModel):
40-
project: int
40+
project: Union[int, List[int]] # Support both single project and multiple projects
4141
ordering: List[str] = []
4242
selectedItems: Optional[SelectedItems] = None
4343
filters: Optional[Filters] = None
4444
data: Optional[dict] = None
4545
request: Optional[Any] = None
4646

47+
@property
48+
def projects(self) -> List[int]:
49+
"""Get project IDs as a list, whether single or multiple were provided."""
50+
if isinstance(self.project, list):
51+
return self.project
52+
return [self.project]
53+
54+
@property
55+
def is_multi_project(self) -> bool:
56+
"""Check if this PrepareParams includes multiple projects."""
57+
return isinstance(self.project, list) and len(self.project) > 1
58+
4759

4860
class CustomEnum(Enum):
4961
def __init__(self, value, description):

0 commit comments

Comments
 (0)