@@ -1,6 +1,6 @@ from uuid import UUID -from django.db.models import Prefetch, Q +from django.db.models import Prefetch, Q, Exists, OuterRef from django.utils.translation import gettext_lazy as _ from authentication.models.choices import InvitationStatus @@ -9,6 +9,8 @@ from authentication.selectors.user_selector import UserSelector from ml_model.exceptions import NeuronModelNotExist from ml_model.models import ModelParameter, NeuronModel from ml_model.serializers import NeuronModelSerializer, NeuronModelsSerializer +from tools.chats.models import Chat +from tools.media.models import Image, Video class NeuronModelSelector: @@ -52,14 +54,28 @@ class NeuronModelSelector: serialize: bool = True, hidden: bool = False, ): - models = NeuronModel.objects.prefetch_related(Prefetch('model_modelstats')).all() if self.user.is_anonymous: + models = NeuronModel.objects.prefetch_related(Prefetch('model_modelstats')).filter(model_settings__is_active=True) return NeuronModelsSerializer(models, many=True) user_type = UserSelector(self.user).check_account_type() - models = NeuronModel.objects.filter( - Q(private_models_hosts__isnull=True) - | Q(private_models_hosts__accounts__user=self.user) - | Q(private_models_hosts__user=self.user) + models = NeuronModel.objects.annotate( + has_chat_msgs=Exists(Chat.objects.filter(user=self.user, model=OuterRef('uid'), messages__isnull=False)), + has_image_msgs=Exists(Image.objects.filter(user=self.user, model=OuterRef('uid'), messages__isnull=False)), + has_video_msgs=Exists(Video.objects.filter(user=self.user, model=OuterRef('uid'), messages__isnull=False)), + ).filter( + ( + Q(private_models_hosts__isnull=True) + | Q(private_models_hosts__accounts__user=self.user) + | Q(private_models_hosts__user=self.user) + ) + & ( + Q(model_settings__is_active=True) + | ( + Q(has_chat_msgs=True) + | Q(has_image_msgs=True) + | Q(has_video_msgs=True) + ) + ) ) if ( user_type == 'business_account'