Support not returning hidden sub-projects when include_stats is specified without search_hidden

This commit is contained in:
allegroai 2022-04-18 16:36:14 +03:00
parent 5f21c3a56d
commit 5131b17901
3 changed files with 27 additions and 3 deletions

View File

@ -6,6 +6,7 @@ from redis import Redis
from apiserver.config_repo import config from apiserver.config_repo import config
from apiserver.bll.project import project_ids_with_children from apiserver.bll.project import project_ids_with_children
from apiserver.database.model import EntityVisibility
from apiserver.database.model.base import GetMixin from apiserver.database.model.base import GetMixin
from apiserver.database.model.model import Model from apiserver.database.model.model import Model
from apiserver.database.model.task.task import Task from apiserver.database.model.task.task import Task
@ -42,6 +43,8 @@ class _TagsCache:
query &= GetMixin.get_list_field_query(name, vals) query &= GetMixin.get_list_field_query(name, vals)
if project: if project:
query &= Q(project__in=project_ids_with_children([project])) query &= Q(project__in=project_ids_with_children([project]))
else:
query &= Q(system_tags__nin=[EntityVisibility.hidden.value])
return self.db_cls.objects(query).distinct(field) return self.db_cls.objects(query).distinct(field)

View File

@ -511,13 +511,14 @@ class ProjectBLL:
project_ids: Sequence[str], project_ids: Sequence[str],
specific_state: Optional[EntityVisibility] = None, specific_state: Optional[EntityVisibility] = None,
include_children: bool = True, include_children: bool = True,
return_hidden_children: bool = False,
filter_: Mapping[str, Any] = None, filter_: Mapping[str, Any] = None,
) -> Tuple[Dict[str, dict], Dict[str, dict]]: ) -> Tuple[Dict[str, dict], Dict[str, dict]]:
if not project_ids: if not project_ids:
return {}, {} return {}, {}
child_projects = ( child_projects = (
_get_sub_projects(project_ids, _only=("id", "name")) _get_sub_projects(project_ids, _only=("id", "name", "system_tags"))
if include_children if include_children
else {} else {}
) )
@ -626,9 +627,24 @@ class ProjectBLL:
for project in project_ids for project in project_ids
} }
def filter_child_projects(project: str) -> Sequence[Project]:
non_filtered_children = child_projects.get(project, [])
if not non_filtered_children or return_hidden_children:
return non_filtered_children
return [
c
for c in non_filtered_children
if not c.system_tags
or EntityVisibility.hidden.value not in c.system_tags
]
children = { children = {
project: sorted( project: sorted(
[{"id": c.id, "name": c.name} for c in child_projects.get(project, [])], [
{"id": c.id, "name": c.name}
for c in filter_child_projects(project)
],
key=itemgetter("name"), key=itemgetter("name"),
) )
for project in project_ids for project in project_ids
@ -740,10 +756,13 @@ class ProjectBLL:
If projects is None or empty then get parents for all the company tasks If projects is None or empty then get parents for all the company tasks
""" """
query = Q(company=company_id) query = Q(company=company_id)
if projects: if projects:
if include_subprojects: if include_subprojects:
projects = _ids_with_children(projects) projects = _ids_with_children(projects)
query &= Q(project__in=projects) query &= Q(project__in=projects)
else:
query &= Q(system_tags__nin=[EntityVisibility.hidden.value])
if state == EntityVisibility.archived: if state == EntityVisibility.archived:
query &= Q(system_tags__in=[EntityVisibility.archived.value]) query &= Q(system_tags__in=[EntityVisibility.archived.value])
@ -772,7 +791,8 @@ class ProjectBLL:
if project_ids: if project_ids:
project_ids = _ids_with_children(project_ids) project_ids = _ids_with_children(project_ids)
query &= Q(project__in=project_ids) query &= Q(project__in=project_ids)
else:
query &= Q(system_tags__nin=[EntityVisibility.hidden.value])
res = Task.objects(query).distinct(field="type") res = Task.objects(query).distinct(field="type")
return set(res).intersection(external_task_types) return set(res).intersection(external_task_types)

View File

@ -60,3 +60,4 @@ def validate_id(cls, company, **kwargs):
class EntityVisibility(Enum): class EntityVisibility(Enum):
active = "active" active = "active"
archived = "archived" archived = "archived"
hidden = "hidden"