256 lines
6.9 KiB
Python
256 lines
6.9 KiB
Python
"""Location app views."""
|
|
from django.contrib.postgres.fields.jsonb import KeyTextTransform
|
|
from rest_framework import generics, status
|
|
from rest_framework.response import Response
|
|
from rest_framework.views import APIView
|
|
|
|
from location import filters
|
|
from location import models, serializers
|
|
from location.filters import RegionFilter
|
|
from location.views import common
|
|
from utils.methods import get_permission_classes
|
|
from utils.models import get_current_locale
|
|
from utils.permissions import (
|
|
IsGuest, IsEstablishmentManager, IsEstablishmentAdministrator
|
|
)
|
|
|
|
|
|
# Address
|
|
class AddressListCreateView(common.AddressViewMixin, generics.ListCreateAPIView):
|
|
"""
|
|
## List/Create view
|
|
### *GET*
|
|
#### Description
|
|
Get paginated list of addresses
|
|
##### Response
|
|
E.g.:
|
|
```
|
|
{
|
|
"count": 58,
|
|
"next": 2,
|
|
"previous": null,
|
|
"results": [
|
|
{
|
|
"id": 1,
|
|
...
|
|
}
|
|
]
|
|
}
|
|
```
|
|
### *POST*
|
|
#### Description
|
|
Create a new address
|
|
##### Request
|
|
Required
|
|
* latitude (`float`) - latitude
|
|
* longitude (`float`) - longitude
|
|
* city_id (`int`) - identifier of city
|
|
|
|
Available
|
|
* district_name (`str`) - city district name
|
|
* street_name_1 (`str`) - street name
|
|
* street_name_2 (`str`) - street name (additional)
|
|
* number (`int`) - city name
|
|
* postal_code (`str`) - city postal code
|
|
##### Response
|
|
E.g.:
|
|
```
|
|
{
|
|
"id": 1,
|
|
...
|
|
}
|
|
```
|
|
"""
|
|
serializer_class = serializers.AddressDetailSerializer
|
|
queryset = models.Address.objects.all()
|
|
permission_classes = get_permission_classes(
|
|
IsEstablishmentManager,
|
|
IsEstablishmentAdministrator,
|
|
IsGuest,
|
|
)
|
|
|
|
|
|
class AddressRUDView(common.AddressViewMixin, generics.RetrieveUpdateDestroyAPIView):
|
|
"""
|
|
## Retrieve/Update/Destroy view
|
|
### *GET*
|
|
#### Description
|
|
Return serialized object of an address by an identifier.
|
|
##### Response
|
|
E.g.:
|
|
```
|
|
{
|
|
"id": 1,
|
|
...
|
|
}
|
|
```
|
|
### *PUT*/*PATCH*
|
|
#### Description
|
|
Completely/Partially update an address object by an identifier.
|
|
##### Request
|
|
Available
|
|
* latitude (`float`) - latitude
|
|
* longitude (`float`) - longitude
|
|
* city_id (`int`) - identifier of city
|
|
* district_name (`str`) - city district name
|
|
* street_name_1 (`str`) - street name
|
|
* street_name_2 (`str`) - street name (additional)
|
|
* number (`int`) - city name
|
|
* postal_code (`str`) - city postal code
|
|
##### Response
|
|
E.g.
|
|
```
|
|
{
|
|
"id": 1,
|
|
...
|
|
}
|
|
```
|
|
### *DELETE*
|
|
#### Description
|
|
Delete an address object by an identifier.
|
|
##### Response
|
|
```
|
|
No content
|
|
```
|
|
"""
|
|
serializer_class = serializers.AddressDetailSerializer
|
|
queryset = models.Address.objects.all()
|
|
permission_classes = get_permission_classes(
|
|
IsEstablishmentManager,
|
|
IsEstablishmentAdministrator,
|
|
IsGuest,
|
|
)
|
|
|
|
|
|
# City
|
|
class CityListCreateView(common.CityViewMixin, generics.ListCreateAPIView):
|
|
"""Create view for model City."""
|
|
serializer_class = serializers.CityBaseSerializer
|
|
queryset = models.City.objects.all()
|
|
filter_class = filters.CityBackFilter
|
|
permission_classes = get_permission_classes(
|
|
IsEstablishmentManager,
|
|
IsEstablishmentAdministrator,
|
|
IsGuest,
|
|
)
|
|
|
|
def get_queryset(self):
|
|
"""Overridden method 'get_queryset'."""
|
|
qs = models.City.objects.all().annotate(locale_name=KeyTextTransform(get_current_locale(), 'name'))\
|
|
.order_by('locale_name').with_base_related()
|
|
if self.request.country_code and self.request.query_params.get('country_code') is None:
|
|
qs = qs.by_country_code(self.request.country_code)
|
|
return qs
|
|
|
|
|
|
class CityListSearchView(common.CityViewMixin, generics.ListCreateAPIView):
|
|
"""Create view for model City."""
|
|
serializer_class = serializers.CityBaseSerializer
|
|
queryset = models.City.objects.all()\
|
|
.annotate(locale_name=KeyTextTransform(get_current_locale(), 'name'))\
|
|
.order_by('locale_name')
|
|
filter_class = filters.CityBackFilter
|
|
pagination_class = None
|
|
permission_classes = get_permission_classes(
|
|
IsEstablishmentManager,
|
|
IsEstablishmentAdministrator,
|
|
IsGuest,
|
|
)
|
|
|
|
|
|
class CityRUDView(common.CityViewMixin, generics.RetrieveUpdateDestroyAPIView):
|
|
"""RUD view for model City."""
|
|
serializer_class = serializers.CityDetailSerializer
|
|
permission_classes = get_permission_classes(
|
|
IsEstablishmentManager,
|
|
IsEstablishmentAdministrator,
|
|
IsGuest,
|
|
)
|
|
|
|
|
|
# Region
|
|
class RegionListCreateView(common.RegionViewMixin, generics.ListCreateAPIView):
|
|
"""Create view for model Region"""
|
|
pagination_class = None
|
|
serializer_class = serializers.RegionSerializer
|
|
# ordering_fields = 'name'
|
|
filter_class = RegionFilter
|
|
permission_classes = get_permission_classes(
|
|
IsEstablishmentManager,
|
|
IsEstablishmentAdministrator,
|
|
IsGuest,
|
|
)
|
|
|
|
|
|
class RegionRUDView(common.RegionViewMixin, generics.RetrieveUpdateDestroyAPIView):
|
|
"""Retrieve view for model Region"""
|
|
serializer_class = serializers.RegionSerializer
|
|
permission_classes = get_permission_classes(
|
|
IsEstablishmentManager,
|
|
IsEstablishmentAdministrator,
|
|
IsGuest,
|
|
)
|
|
|
|
|
|
# Country
|
|
class CountryBaseViewMixin:
|
|
"""Mixin for Country views."""
|
|
queryset = models.Country.objects.all()
|
|
permission_classes = get_permission_classes(
|
|
IsEstablishmentManager,
|
|
IsEstablishmentAdministrator,
|
|
IsGuest,
|
|
)
|
|
|
|
|
|
class CountryListCreateView(CountryBaseViewMixin, generics.ListCreateAPIView):
|
|
"""List/Create view for model Country."""
|
|
queryset = (models.Country.objects.annotate(
|
|
locale_name=KeyTextTransform(get_current_locale(), 'name')).order_by('locale_name'))
|
|
serializer_class = serializers.CountryBackSerializer
|
|
pagination_class = None
|
|
|
|
|
|
class CountryRUDView(CountryBaseViewMixin, generics.RetrieveUpdateDestroyAPIView):
|
|
"""RUD view for model Country."""
|
|
serializer_class = serializers.CountryBackSerializer
|
|
|
|
|
|
class CountryCallingCodeListView(APIView):
|
|
"""
|
|
## Country codes view.
|
|
### Response
|
|
```
|
|
[
|
|
"+7",
|
|
"+386",
|
|
"+352"
|
|
]
|
|
```
|
|
### Description
|
|
Return an array of unique country code for all countries in a database.
|
|
"""
|
|
pagination_class = None
|
|
permission_classes = get_permission_classes(
|
|
IsEstablishmentManager,
|
|
IsEstablishmentAdministrator,
|
|
IsGuest,
|
|
)
|
|
|
|
def get(self, request, *args, **kwargs):
|
|
"""
|
|
## Country codes view.
|
|
### Response
|
|
```
|
|
[
|
|
"+7",
|
|
"+386",
|
|
"+352"
|
|
]
|
|
```
|
|
### Description
|
|
Return an array of unique country code for all countries in a database.
|
|
"""
|
|
return Response(data=models.Country.objects.aggregate_country_codes(),
|
|
status=status.HTTP_200_OK)
|