@@ -1,11 +1,12 @@ from uuid import UUID +from django.db.models import Prefetch from django.utils.translation import gettext_lazy as _ from authentication.models.choices import InvitationStatus from authentication.models.user import CustomUserModel from authentication.selectors.user_selector import UserSelector -from ml_model.models import NeuronModel +from ml_model.models import NeuronModel, ModelParameter from ml_model.serializers import NeuronModelSerializer, NeuronModelsSerializer @@ -13,24 +14,31 @@ class NeuronModelSelector: def __init__(self, user: CustomUserModel): self.user = user - def get_models_by_input_content_type(self, serialize: bool = False): - models = NeuronModel.objects.all() + def get_models_by_input_content_type(self, serialize: bool = False, hidden_parameter: bool = False): + models = NeuronModel.objects.prefetch_related( + Prefetch('model_modelparameters', queryset=ModelParameter.objects.filter(hidden=hidden_parameter)) + ).all() if serialize: return NeuronModelSerializer(models, many=True) return models - def get_models_by_output_content_type(self, serialize: bool = False): - models = NeuronModel.objects.all() + def get_models_by_output_content_type(self, serialize: bool = False, hidden_parameter: bool = False): + models = NeuronModel.objects.prefetch_related( + Prefetch('model_modelparameters', queryset=ModelParameter.objects.filter(hidden=hidden_parameter)) + ).all() if serialize: return NeuronModelSerializer(models, many=True) return models def get_models( - self, - category: str | None = None, - serialize: bool = True, + self, + category: str | None = None, + serialize: bool = True, + hidden_parameter: bool = False ): - models = NeuronModel.objects.all() + models = NeuronModel.objects.prefetch_related( + Prefetch('model_modelparameters', queryset=ModelParameter.objects.filter(hidden=hidden_parameter)) + ).all() if category: models = models.filter(category__slug=category) if self.user.is_anonymous: @@ -49,16 +57,20 @@ class NeuronModelSelector: return NeuronModelsSerializer(models, many=True) return models - def get_model_by_id(self, id: UUID, **kwargs) -> NeuronModel: - model = NeuronModel.objects.filter(uid=id) + def get_model_by_id(self, id: UUID, hidden_parameter: bool = False, **kwargs) -> NeuronModel: + model = NeuronModel.objects.prefetch_related( + Prefetch('model_modelparameters', queryset=ModelParameter.objects.filter(hidden=hidden_parameter)) + ).filter(uid=id) if not model.exists(): raise Exception(_('no model by this id')) return model.first() - def get_model_by_slug(self, slug: str, serialize: bool = False): - model = NeuronModel.objects.get(slug=slug) + def get_model_by_slug(self, slug: str, serialize: bool = False, hidden_parameter: bool = False): + model = NeuronModel.objects.prefetch_related( + Prefetch('model_modelparameters', queryset=ModelParameter.objects.filter(hidden=hidden_parameter)) + ).get(slug=slug) if serialize: return NeuronModelSerializer(instance=model) return model @@ -54,9 +54,8 @@ class NeuronModelAPIView(APIView): ) def get(self, request, slug: str, *args, **kwargs): """Retrieve model by slug""" - return Response( NeuronModelSerializer( - NeuronModelSelector(request.user).get_model_by_slug(slug=slug) + NeuronModelSelector(request.user).get_model_by_slug(slug=slug, hidden_parameter=False) ).data )