117 lines
3.7 KiB
Python
117 lines
3.7 KiB
Python
import graphene
|
|
from django.http import Http404
|
|
from django.utils.translation import gettext_lazy as _
|
|
from rest_framework.exceptions import PermissionDenied
|
|
|
|
from core.graphene import BaseMutation
|
|
from core.utils.messages import permission_denied_message
|
|
from geo.graphene.object_types import AddressType
|
|
from geo.models import Address, City, PostalCode
|
|
from geo.utils import PointScalar
|
|
|
|
|
|
class CreateAddress(BaseMutation):
|
|
class Arguments:
|
|
location = PointScalar()
|
|
street = graphene.String()
|
|
city_uuid = graphene.UUID()
|
|
postal_code_uuid = graphene.UUID()
|
|
|
|
address = graphene.Field(AddressType)
|
|
|
|
@staticmethod
|
|
def mutate(_parent, info, street, city_uuid, postal_code_uuid):
|
|
if info.context.user.is_authenticated:
|
|
try:
|
|
city = City.objects.get(uuid=city_uuid)
|
|
postal_code = PostalCode.objects.get(uuid=postal_code_uuid)
|
|
except City.DoesNotExist:
|
|
name = "City"
|
|
raise Http404(_(f"{name} does not exist: {city_uuid}"))
|
|
except PostalCode.DoesNotExist:
|
|
name = "PostalCode"
|
|
raise Http404(_(f"{name} does not exist: {postal_code_uuid}"))
|
|
|
|
address = Address.objects.create(
|
|
street=street,
|
|
city=city,
|
|
postal_code=postal_code,
|
|
region=city.region,
|
|
country=city.country,
|
|
user=info.context.user,
|
|
)
|
|
|
|
return CreateAddress(address=address)
|
|
|
|
else:
|
|
raise PermissionDenied(permission_denied_message)
|
|
|
|
|
|
class UpdateAddress(BaseMutation):
|
|
class Arguments:
|
|
uuid = graphene.UUID(required=True)
|
|
location = PointScalar()
|
|
street = graphene.String()
|
|
city_uuid = graphene.UUID()
|
|
postal_code_uuid = graphene.UUID()
|
|
|
|
address = graphene.Field(AddressType)
|
|
|
|
@staticmethod
|
|
def mutate(_parent, info, uuid, location=None, street=None, city_uuid=None, postal_code_uuid=None):
|
|
try:
|
|
address = Address.objects.get(uuid=uuid)
|
|
|
|
if (
|
|
info.context.user.is_superuser
|
|
or info.context.user.has_perm("geo.change_address")
|
|
or info.context.user == address.user
|
|
):
|
|
address = Address.objects.get(uuid=uuid)
|
|
|
|
if location is not None:
|
|
address.location = location
|
|
|
|
if street is not None:
|
|
address.street = street
|
|
|
|
if city_uuid is not None:
|
|
address.city = City.objects.get(uuid=city_uuid)
|
|
|
|
if postal_code_uuid is not None:
|
|
address.postal_code = PostalCode.objects.get(uuid=postal_code_uuid)
|
|
|
|
address.save()
|
|
|
|
return UpdateAddress(address=address)
|
|
|
|
raise PermissionDenied(permission_denied_message)
|
|
|
|
except Address.DoesNotExist:
|
|
name = "Address"
|
|
raise Http404(_(f"{name} does not exist: {uuid}"))
|
|
|
|
|
|
class DeleteAddress(BaseMutation):
|
|
class Arguments:
|
|
uuid = graphene.UUID(required=True)
|
|
|
|
success = graphene.Boolean()
|
|
|
|
@staticmethod
|
|
def mutate(_parent, info, uuid):
|
|
try:
|
|
address = Address.objects.get(uuid=uuid)
|
|
if (
|
|
info.context.user.is_superuser
|
|
or info.context.user.has_perm("geo.delete_address")
|
|
or info.context.user == address.user
|
|
):
|
|
address.delete()
|
|
return DeleteAddress(success=True)
|
|
|
|
raise PermissionDenied(permission_denied_message)
|
|
|
|
except Address.DoesNotExist:
|
|
name = "Address"
|
|
raise Http404(_(f"{name} does not exist: {uuid}"))
|