gault-millau/apps/location/views/back.py
2020-02-10 14:25:33 +03:00

264 lines
7.3 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""Location app views."""
from django.contrib.postgres.fields.jsonb import KeyTextTransform
from django.db.models.deletion import ProtectedError
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('-modified').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,
)
def delete(self, request, *args, **kwargs):
try:
return self.destroy(request, *args, **kwargs)
except ProtectedError:
from rest_framework.serializers import ValidationError
raise ValidationError({'detail': 'City couldnt be deleted. Some objects has this city'})
# 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)