schon/geo/viewsets.py
Egor fureunoir Gorbunov 564ce0706b Features: Full Geo rework.
Fixes: 1) Address redundant migration logic by dropping stale migrations; 2) Cleanup swapper-based dependencies in Geo models;

Extra: Streamlined database initialization by resetting all previous migrations.
2025-05-19 14:45:53 +03:00

44 lines
1.7 KiB
Python

from django.utils.translation import gettext_lazy as _
from drf_spectacular.utils import extend_schema_view
from rest_framework import status, viewsets
from rest_framework.decorators import action
from rest_framework.permissions import IsAdminUser
from rest_framework.response import Response
from core.permissions import IsOwner
from geo.docs.drf.viewsets import ADDRESS_SCHEMA
from geo.models import Address
from geo.serializers import AddressAutocompleteInputSerializer, AddressCreateSerializer, AddressSerializer
from geo.utils.nominatim import fetch_address_suggestions
@extend_schema_view(**ADDRESS_SCHEMA)
class AddressViewSet(viewsets.ModelViewSet):
queryset = Address.objects.all()
serializer_class = AddressSerializer
permission_classes = [IsOwner, IsAdminUser]
def get_serializer_class(self):
if self.action == 'create':
return AddressCreateSerializer
if self.action == 'autocomplete':
return AddressAutocompleteInputSerializer
return AddressSerializer
@action(detail=False, methods=["get"], url_path="autocomplete")
def autocomplete(self, request):
serializer = AddressAutocompleteInputSerializer(data=request.query_params)
serializer.is_valid(raise_exception=True)
q = serializer.validated_data["q"]
limit = serializer.validated_data["limit"]
try:
suggestions = fetch_address_suggestions(query=q, limit=limit)
except Exception as e:
return Response(
{"detail": _(f"Geocoding error: {e}")},
status=status.HTTP_502_BAD_GATEWAY,
)
return Response(suggestions, status=status.HTTP_200_OK)