from typing import TYPE_CHECKING, Mapping, Optional from core.redis import start_job_async_or_sync from django.db.models import QuerySet from django.utils.functional import cached_property from projects.functions.utils import get_unique_ids_list if TYPE_CHECKING: from users.models import User class ProjectMixin: def rearrange_overlap_cohort(self): """ Async start rearrange overlap depending on annotation count in tasks """ start_job_async_or_sync(self._rearrange_overlap_cohort) def update_tasks_counters_and_is_labeled(self, tasks_queryset, from_scratch=True): """ Async start updating tasks counters and than is_labeled :param tasks_queryset: Tasks to update queryset :param from_scratch: Skip calculated tasks """ # get only id from queryset to decrease data size in job task_ids = get_unique_ids_list(tasks_queryset) start_job_async_or_sync(self._update_tasks_counters_and_is_labeled, task_ids, from_scratch=from_scratch) def update_tasks_counters_and_task_states( self, tasks_queryset, maximum_annotations_changed, overlap_cohort_percentage_changed, tasks_number_changed, from_scratch=True, recalculate_stats_counts: Optional[Mapping[str, int]] = None, ): """ Async start updating tasks counters and than rearrange :param tasks_queryset: Tasks to update queryset :param maximum_annotations_changed: If maximum_annotations param changed :param overlap_cohort_percentage_changed: If cohort_percentage param changed :param tasks_number_changed: If tasks number changed in project :param from_scratch: Skip calculated tasks """ # get only id from queryset to decrease data size in job task_ids = get_unique_ids_list(tasks_queryset) start_job_async_or_sync( self._update_tasks_counters_and_task_states, task_ids, maximum_annotations_changed, overlap_cohort_percentage_changed, tasks_number_changed, from_scratch=from_scratch, recalculate_stats_counts=recalculate_stats_counts, ) def update_tasks_states( self, maximum_annotations_changed, overlap_cohort_percentage_changed, tasks_number_changed ): """ Async start updating tasks states after settings change :param maximum_annotations_changed: If maximum_annotations param changed :param overlap_cohort_percentage_changed: If cohort_percentage param changed :param tasks_number_changed: If tasks number changed in project """ start_job_async_or_sync( self._update_tasks_states, maximum_annotations_changed, overlap_cohort_percentage_changed, tasks_number_changed, ) def has_permission(self, user): """ Dummy stub for has_permission """ user.project = self # link for activity log return True def _can_use_overlap(self): """ Returns if we can use overlap for is_labeled calculation :return: """ return True @cached_property def all_members(self) -> QuerySet['User']: """ Returns all users of project :return: QuerySet[User] """ from users.models import User return User.objects.filter(id__in=self.organization.members.values_list('user__id'))