# pylint: disable=C0115
"""
Serializer classes for the Provider app.
"""
from rest_framework import serializers
from smarter.apps.account.serializers import (
AccountMiniSerializer,
MetaDataWithOwnershipModelSerializer,
UserMiniSerializer,
UserProfileSerializer,
)
from smarter.apps.secret.serializers import SecretMiniSerializer
from smarter.common.exceptions import SmarterException
from smarter.lib.drf.serializers import SmarterCamelCaseSerializer
from .models import (
Provider,
ProviderModel,
ProviderModelVerification,
ProviderVerification,
get_model_for_provider,
get_models_for_provider,
get_provider,
get_providers,
)
[docs]
class ProviderSerializer(MetaDataWithOwnershipModelSerializer):
"""PluginMeta model serializer."""
user_profile = UserProfileSerializer()
api_key = SecretMiniSerializer(read_only=True)
is_official_provider = serializers.BooleanField(read_only=True)
tos_accepted = serializers.BooleanField(read_only=True)
rfc1034_compliant_name = serializers.CharField(read_only=True)
tos_accepted_by = UserMiniSerializer(read_only=True)
class Meta:
model = Provider
fields = [
"id",
"created_at",
"updated_at",
"name",
"user_profile",
"status",
"description",
"version",
"annotations",
"tags",
"manifest_url",
"ready",
"is_default",
"is_active",
"is_verified",
"is_featured",
"is_deprecated",
"is_flagged",
"is_suspended",
"base_url",
"api_key",
"default_model",
"connectivity_test_path",
"logo",
"website_url",
"ownership_requested",
"contact_email",
"contact_email_verified",
"support_email",
"support_email_verified",
"docs_url",
"terms_of_service_url",
"privacy_policy_url",
"is_official_provider",
"tos_accepted",
"tos_accepted_at",
"tos_accepted_by",
"rfc1034_compliant_name",
]
read_only_fields = ["created_at", "updated_at", "manifest_url", "ready"]
[docs]
def get_queryset(self):
name = self.request.GET.get("name") # type: ignore
if name:
provider = get_provider(provider_name=name)
return Provider.objects.filter(pk=provider.pk)
try:
providers = get_providers()
except SmarterException:
return Provider.objects.none()
pks = [p.pk for p in providers]
queryset = Provider.objects.filter(pk__in=pks)
return queryset
[docs]
class ProviderModelSerializer(MetaDataWithOwnershipModelSerializer):
"""ProviderModel model serializer."""
provider = ProviderSerializer(read_only=True)
class Meta:
model = ProviderModel
fields = "__all__"
read_only_fields = ["created_at", "updated_at", "provider"]
[docs]
def get_queryset(self):
name = self.request.GET.get("name") # type: ignore
model_name = self.request.GET.get("model_name") # type: ignore
if name and model_name:
try:
provider_model = get_model_for_provider(provider_name=name, model_name=model_name)
except SmarterException:
return ProviderModel.objects.none()
return ProviderModel.objects.filter(pk=provider_model.pk)
if name:
try:
provider_models = get_models_for_provider(provider_name=name)
except SmarterException:
return ProviderModel.objects.none()
pks = [p.pk for p in provider_models]
queryset = ProviderModel.objects.filter(pk__in=pks)
return queryset
queryset = ProviderModel.objects.filter(is_active=True)
return queryset
[docs]
class ProviderVerificationSerializer(SmarterCamelCaseSerializer):
"""ProviderVerification model serializer."""
provider = ProviderSerializer(read_only=True)
class Meta:
model = ProviderVerification
fields = "__all__"
read_only_fields = ["created_at", "updated_at", "provider"]
[docs]
def get_queryset(self):
name = self.request.GET.get("name") # type: ignore
verification_type = self.request.GET.get("verification_type") # type: ignore
if name:
try:
provider = get_provider(provider_name=name)
queryset = ProviderVerification.objects.filter(provider=provider)
except SmarterException:
return ProviderVerification.objects.none()
if verification_type:
queryset = queryset.filter(verification_type__iexact=verification_type)
return queryset
queryset = ProviderVerification.objects.filter(is_active=True)
return queryset
[docs]
class ProviderModelVerificationSerializer(SmarterCamelCaseSerializer):
"""ProviderModelVerification model serializer."""
provider_model = ProviderModelSerializer(read_only=True)
class Meta:
model = ProviderModelVerification
fields = "__all__"
read_only_fields = ["created_at", "updated_at", "provider_model"]
[docs]
def get_queryset(self):
try:
provider_model = get_model_for_provider(
provider_name=self.request.GET.get("name"), model_name=self.request.GET.get("model_name") # type: ignore
)
except SmarterException:
return ProviderModelVerification.objects.none()
queryset = ProviderModelVerification.objects.filter(provider_model=provider_model)
verification_type = self.request.GET.get("verification_type") # type: ignore
if verification_type:
queryset = queryset.filter(verification_type__iexact=verification_type)
return queryset