Source code for smarter.apps.account.api.v1.views.account_contact
# pylint: disable=W0707,W0718
"""AccountContact views for smarter api."""
from http import HTTPStatus
from typing import Optional
from django.db import transaction
from django.http import (
HttpResponseBadRequest,
HttpResponseRedirect,
JsonResponse,
)
from django.shortcuts import get_object_or_404
from rest_framework.request import Request
from smarter.apps.account.contract.models import AccountApiContact
from smarter.apps.account.models import AccountContact
from smarter.apps.account.serializers import AccountContactSerializer
from smarter.lib import logging
from smarter.lib.django.waffle import SmarterWaffleSwitches
from smarter.lib.drf.views.contract import ContractListMixin
from .base import AccountListViewBase, AccountViewBase
logger = logging.getSmarterLogger(__name__, any_switches=[SmarterWaffleSwitches.ACCOUNT_LOGGING])
# pylint: disable=W0613
[docs]
class AccountContactView(AccountViewBase):
"""AccountContact view for smarter api.
Its ``GET`` returns an :class:`AccountApiContact`.
"""
serializer_class = AccountContactSerializer
account_contact: AccountContact
[docs]
def get(self, request: Request, account_contact_id: int):
self.account_contact = get_object_or_404(
AccountContact.objects.select_related("account"), pk=account_contact_id
)
return JsonResponse(AccountApiContact.from_model(self.account_contact).model_dump(mode="json"))
[docs]
def patch(self, request: Request, account_contact_id: Optional[int] = None):
return HttpResponseBadRequest()
[docs]
def delete(self, request, account_contact_id: int):
self.account_contact = get_object_or_404(AccountContact, pk=account_contact_id)
try:
with transaction.atomic():
if not isinstance(self.account_contact, AccountContact):
return JsonResponse({"error": "AccountContact not found"}, status=HTTPStatus.NOT_FOUND)
self.account_contact.delete()
AccountContact.objects.get(user=request.user).delete()
except Exception as e:
return JsonResponse(
{"error": "Internal error", "exception": str(e)}, status=HTTPStatus.INTERNAL_SERVER_ERROR
)
plugins_path = request.path_info.rsplit("/", 2)[0]
return HttpResponseRedirect(plugins_path)
[docs]
class AccountContactListView(ContractListMixin, AccountListViewBase):
"""AccountContact list view for smarter api: :class:`AccountApiContact` models."""
serializer_class = AccountContactSerializer
contract_model = AccountApiContact
[docs]
def get_queryset(self):
if not self.request:
return AccountContact.objects.none()
if not self.request.user.is_authenticated: # type: ignore
return AccountContact.objects.none()
contacts = AccountContact.objects.select_related("account").order_by("pk")
if self.request.user.is_superuser: # type: ignore
return contacts
return contacts.filter(account=self.user_profile.account) # type: ignore