version 0.0.8: added CRUD endpoints for models Address, Region, Country and City; also refactored custom permission class
This commit is contained in:
parent
f3b17bf1d0
commit
7fe903b01b
|
|
@ -6,4 +6,27 @@ from location import views
|
||||||
app_name = 'location'
|
app_name = 'location'
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
|
path('country/list/', views.CountryListView.as_view(), name='country-list'),
|
||||||
|
path('country/create/', views.CountryCreateView.as_view(), name='country-create'),
|
||||||
|
path('country/<int:pk>/detail/', views.CountryRetrieveView.as_view(), name='country-retrieve'),
|
||||||
|
path('country/<int:pk>/delete/', views.CountryDestroyView.as_view(), name='country-destroy'),
|
||||||
|
path('country/<int:pk>/update/', views.CountryUpdateView.as_view(), name='country-update'),
|
||||||
|
|
||||||
|
path('region/list/', views.RegionListView.as_view(), name='region-list'),
|
||||||
|
path('region/create/', views.RegionCreateView.as_view(), name='region-create'),
|
||||||
|
path('region/<int:pk>/detail/', views.RegionRetrieveView.as_view(), name='region-retrieve'),
|
||||||
|
path('region/<int:pk>/delete/', views.RegionDestroyView.as_view(), name='region-destroy'),
|
||||||
|
path('region/<int:pk>/update/', views.RegionUpdateView.as_view(), name='region-update'),
|
||||||
|
|
||||||
|
path('city/list/', views.CityListView.as_view(), name='city-list'),
|
||||||
|
path('city/create/', views.CityCreateView.as_view(), name='city-create'),
|
||||||
|
path('city/<int:pk>/detail/', views.CityRetrieveView.as_view(), name='city-retrieve'),
|
||||||
|
path('city/<int:pk>/delete/', views.CityDestroyView.as_view(), name='city-destroy'),
|
||||||
|
path('city/<int:pk>/update/', views.CityUpdateView.as_view(), name='city-update'),
|
||||||
|
|
||||||
|
path('address/list/', views.AddressListView.as_view(), name='address-list'),
|
||||||
|
path('address/create/', views.AddressCreateView.as_view(), name='address-create'),
|
||||||
|
path('address/<int:pk>/detail/', views.AddressRetrieveView.as_view(), name='address-retrieve'),
|
||||||
|
path('address/<int:pk>/delete/', views.AddressDestroyView.as_view(), name='address-destroy'),
|
||||||
|
path('address/<int:pk>/update/', views.AddressUpdateView.as_view(), name='address-update'),
|
||||||
]
|
]
|
||||||
|
|
@ -1,3 +1,139 @@
|
||||||
from rest_framework import generics, permissions
|
from rest_framework import generics
|
||||||
|
from rest_framework import permissions
|
||||||
|
|
||||||
from location import models, serializers
|
from location import models, serializers
|
||||||
|
|
||||||
|
|
||||||
|
# Mixins
|
||||||
|
class CountryViewMixin(generics.GenericAPIView):
|
||||||
|
"""View Mixin for model Country"""
|
||||||
|
model = models.Country
|
||||||
|
queryset = models.Country.objects.all()
|
||||||
|
|
||||||
|
|
||||||
|
class RegionViewMixin(generics.GenericAPIView):
|
||||||
|
"""View Mixin for model Region"""
|
||||||
|
model = models.Region
|
||||||
|
queryset = models.Region.objects.all()
|
||||||
|
|
||||||
|
|
||||||
|
class CityViewMixin(generics.GenericAPIView):
|
||||||
|
"""View Mixin for model City"""
|
||||||
|
model = models.City
|
||||||
|
queryset = models.City.objects.all()
|
||||||
|
|
||||||
|
|
||||||
|
class AddressViewMixin(generics.GenericAPIView):
|
||||||
|
"""View Mixin for model Address"""
|
||||||
|
model = models.Address
|
||||||
|
queryset = models.Address.objects.all()
|
||||||
|
|
||||||
|
|
||||||
|
# Country
|
||||||
|
class CountryCreateView(CountryViewMixin, generics.CreateAPIView):
|
||||||
|
"""Create view for model Country"""
|
||||||
|
serializer_class = serializers.CountrySerializer
|
||||||
|
|
||||||
|
|
||||||
|
class CountryRetrieveView(CountryViewMixin, generics.RetrieveAPIView):
|
||||||
|
"""Retrieve view for model Country"""
|
||||||
|
serializer_class = serializers.CountrySerializer
|
||||||
|
|
||||||
|
|
||||||
|
class CountryListView(CountryViewMixin, generics.ListAPIView):
|
||||||
|
"""List view for model Country"""
|
||||||
|
permission_classes = (permissions.AllowAny, )
|
||||||
|
serializer_class = serializers.CountrySerializer
|
||||||
|
|
||||||
|
|
||||||
|
class CountryDestroyView(CountryViewMixin, generics.DestroyAPIView):
|
||||||
|
"""Destroy view for model Country"""
|
||||||
|
serializer_class = serializers.CountrySerializer
|
||||||
|
|
||||||
|
|
||||||
|
class CountryUpdateView(CountryViewMixin, generics.UpdateAPIView):
|
||||||
|
"""Update view for model Country"""
|
||||||
|
serializer_class = serializers.CountrySerializer
|
||||||
|
|
||||||
|
|
||||||
|
# Region
|
||||||
|
class RegionCreateView(RegionViewMixin, generics.CreateAPIView):
|
||||||
|
"""Create view for model Region"""
|
||||||
|
serializer_class = serializers.RegionSerializer
|
||||||
|
|
||||||
|
|
||||||
|
class RegionRetrieveView(RegionViewMixin, generics.RetrieveAPIView):
|
||||||
|
"""Retrieve view for model Region"""
|
||||||
|
serializer_class = serializers.RegionSerializer
|
||||||
|
|
||||||
|
|
||||||
|
class RegionListView(RegionViewMixin, generics.ListAPIView):
|
||||||
|
"""List view for model Country"""
|
||||||
|
permission_classes = (permissions.AllowAny, )
|
||||||
|
serializer_class = serializers.CountrySerializer
|
||||||
|
|
||||||
|
|
||||||
|
class RegionDestroyView(RegionViewMixin, generics.DestroyAPIView):
|
||||||
|
"""Destroy view for model Country"""
|
||||||
|
serializer_class = serializers.CountrySerializer
|
||||||
|
|
||||||
|
|
||||||
|
class RegionUpdateView(RegionViewMixin, generics.UpdateAPIView):
|
||||||
|
"""Update view for model Country"""
|
||||||
|
serializer_class = serializers.CountrySerializer
|
||||||
|
|
||||||
|
|
||||||
|
# City
|
||||||
|
class CityCreateView(CityViewMixin, generics.CreateAPIView):
|
||||||
|
"""Create view for model City"""
|
||||||
|
serializer_class = serializers.CitySerializer
|
||||||
|
|
||||||
|
|
||||||
|
class CityRetrieveView(CityViewMixin, generics.RetrieveAPIView):
|
||||||
|
"""Retrieve view for model City"""
|
||||||
|
serializer_class = serializers.CitySerializer
|
||||||
|
|
||||||
|
|
||||||
|
class CityListView(CityViewMixin, generics.ListAPIView):
|
||||||
|
"""List view for model City"""
|
||||||
|
permission_classes = (permissions.AllowAny, )
|
||||||
|
serializer_class = serializers.CitySerializer
|
||||||
|
|
||||||
|
|
||||||
|
class CityDestroyView(CityViewMixin, generics.DestroyAPIView):
|
||||||
|
"""Destroy view for model City"""
|
||||||
|
serializer_class = serializers.CitySerializer
|
||||||
|
|
||||||
|
|
||||||
|
class CityUpdateView(CityViewMixin, generics.UpdateAPIView):
|
||||||
|
"""Update view for model City"""
|
||||||
|
serializer_class = serializers.CitySerializer
|
||||||
|
|
||||||
|
|
||||||
|
# Address
|
||||||
|
class AddressCreateView(AddressViewMixin, generics.CreateAPIView):
|
||||||
|
"""Create view for model Address"""
|
||||||
|
serializer_class = serializers.AddressSerializer
|
||||||
|
|
||||||
|
|
||||||
|
class AddressRetrieveView(AddressViewMixin, generics.RetrieveAPIView):
|
||||||
|
"""Retrieve view for model Address"""
|
||||||
|
serializer_class = serializers.AddressSerializer
|
||||||
|
|
||||||
|
|
||||||
|
class AddressListView(AddressViewMixin, generics.ListAPIView):
|
||||||
|
"""List view for model Address"""
|
||||||
|
permission_classes = (permissions.AllowAny, )
|
||||||
|
serializer_class = serializers.AddressSerializer
|
||||||
|
|
||||||
|
|
||||||
|
class AddressDestroyView(AddressViewMixin, generics.DestroyAPIView):
|
||||||
|
"""Destroy view for model Address"""
|
||||||
|
serializer_class = serializers.AddressSerializer
|
||||||
|
|
||||||
|
|
||||||
|
class AddressUpdateView(AddressViewMixin, generics.UpdateAPIView):
|
||||||
|
"""Update view for model Address"""
|
||||||
|
serializer_class = serializers.AddressSerializer
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -14,7 +14,7 @@ def generate_code(digits=6, string_output=True):
|
||||||
|
|
||||||
def get_token_from_request(request):
|
def get_token_from_request(request):
|
||||||
"""Get access token from request"""
|
"""Get access token from request"""
|
||||||
assert isinstance(request, (HttpRequest, Request))
|
if 'Authorization' in request.headers:
|
||||||
if isinstance(request, HttpRequest):
|
if isinstance(request, HttpRequest):
|
||||||
return request.headers.get('Authorization').split(' ')[::-1][0]
|
return request.headers.get('Authorization').split(' ')[::-1][0]
|
||||||
elif isinstance(request, Request):
|
elif isinstance(request, Request):
|
||||||
|
|
|
||||||
|
|
@ -10,12 +10,14 @@ class IsAuthenticatedAndTokenIsValid(BasePermission):
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def has_permission(self, request, view):
|
def has_permission(self, request, view):
|
||||||
"""Check permissions by access token and default rest permission IsAuthenticated"""
|
"""Check permissions by access token and default REST permission IsAuthenticated"""
|
||||||
user = request.user
|
user = request.user
|
||||||
|
if user and user.is_authenticated:
|
||||||
token = get_token_from_request(request)
|
token = get_token_from_request(request)
|
||||||
blacklisted = BlacklistedAccessToken.objects.by_user(user)\
|
# Check if user access token not expired
|
||||||
.by_token(token)\
|
expired = BlacklistedAccessToken.objects.by_token(token)\
|
||||||
|
.by_user(user)\
|
||||||
.exists()
|
.exists()
|
||||||
return bool(user and
|
return not expired
|
||||||
user.is_authenticated and
|
else:
|
||||||
not blacklisted)
|
return False
|
||||||
|
|
|
||||||
|
|
@ -23,6 +23,7 @@ from rest_framework import permissions
|
||||||
|
|
||||||
# URL platform patterns
|
# URL platform patterns
|
||||||
from project.urls import web as web_urlpatterns
|
from project.urls import web as web_urlpatterns
|
||||||
|
from location import urls as location_urls
|
||||||
|
|
||||||
|
|
||||||
schema_view = get_schema_view(
|
schema_view = get_schema_view(
|
||||||
|
|
@ -58,6 +59,7 @@ urlpatterns_auth = [
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
path('admin/', admin.site.urls),
|
path('admin/', admin.site.urls),
|
||||||
path('api/web/', include(web_urlpatterns)),
|
path('api/web/', include(web_urlpatterns)),
|
||||||
|
path('api/location/', include(location_urls.urlpatterns)),
|
||||||
]
|
]
|
||||||
|
|
||||||
urlpatterns = urlpatterns + \
|
urlpatterns = urlpatterns + \
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user