Skip to content

Commit f64cba0

Browse files
author
Wesley Lima
committed
fix: FIT-786: Making DM filters support multiple projects (optionally)
1 parent d731b74 commit f64cba0

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
@@ -498,6 +498,10 @@ def prepared(self, prepare_params=None):
498498
499499
:param prepare_params: prepare params with project, filters, orderings, etc
500500
:return: ordered and filtered queryset
501+
502+
Note: For multi-project queries, filters and ordering will use the first project's
503+
configuration (label config, custom fields, etc.). This is backwards compatible
504+
with single-project queries.
501505
"""
502506
from projects.models import Project
503507

@@ -506,7 +510,14 @@ def prepared(self, prepare_params=None):
506510
if prepare_params is None:
507511
return queryset
508512

509-
project = Project.objects.get(pk=prepare_params.project)
513+
# Get the project for filter/ordering configuration
514+
# For multi-project queries, use the first project's configuration
515+
if prepare_params.is_multi_project:
516+
project = Project.objects.get(pk=prepare_params.projects[0])
517+
else:
518+
# Backwards compatible: prepare_params.project is an int
519+
project = Project.objects.get(pk=prepare_params.project)
520+
510521
request = prepare_params.request
511522
queryset = apply_filters(queryset, prepare_params.filters, project, request)
512523
queryset = apply_ordering(queryset, prepare_params.ordering, project, request, view_data=prepare_params.data)
@@ -825,7 +836,11 @@ def get_queryset(
825836

826837
def only_filtered(self, prepare_params=None):
827838
request = prepare_params.request
828-
queryset = TaskQuerySet(self.model).filter(project=prepare_params.project)
839+
# Support both single and multiple projects
840+
if prepare_params.is_multi_project:
841+
queryset = TaskQuerySet(self.model).filter(project__in=prepare_params.projects)
842+
else:
843+
queryset = TaskQuerySet(self.model).filter(project=prepare_params.project)
829844
fields_for_filter_ordering = get_fields_for_filter_ordering(prepare_params)
830845
queryset = self.annotate_queryset(queryset, fields_for_evaluation=fields_for_filter_ordering, request=request)
831846
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)