diff --git a/core/serializers.py b/core/serializers.py new file mode 100644 index 0000000..7201092 --- /dev/null +++ b/core/serializers.py @@ -0,0 +1,23 @@ +from rest_framework import serializers + +from core.models import GlobalSettings +from poizonstore.utils import PriceField + + +class GlobalSettingsSerializer(serializers.ModelSerializer): + yuan_rate = PriceField(source='full_yuan_rate', read_only=True) + yuan_rate_commission = PriceField() + chinadelivery = PriceField(source='delivery_price_CN') + commission = PriceField(source='commission_rub') + pickup = serializers.CharField(source='pickup_address') + + class Meta: + model = GlobalSettings + fields = ('yuan_rate', 'yuan_rate_last_updated', 'yuan_rate_commission', 'commission', 'chinadelivery', 'pickup', 'time_to_buy') + read_only_fields = ('yuan_rate_last_updated',) + + +class AnonymousGlobalSettingsSerializer(GlobalSettingsSerializer): + class Meta: + model = GlobalSettingsSerializer.Meta.model + fields = tuple(set(GlobalSettingsSerializer.Meta.fields) - {'yuan_rate_commission', 'yuan_rate_last_updated'}) diff --git a/core/urls.py b/core/urls.py new file mode 100644 index 0000000..970e272 --- /dev/null +++ b/core/urls.py @@ -0,0 +1,11 @@ +from django.urls import path +from rest_framework.routers import DefaultRouter + +from . import views + +router = DefaultRouter() + + +urlpatterns = [ + path("settings/", views.GlobalSettingsAPI.as_view()), +] + router.urls diff --git a/core/views.py b/core/views.py index 91ea44a..e67ac6c 100644 --- a/core/views.py +++ b/core/views.py @@ -1,3 +1,20 @@ -from django.shortcuts import render +from rest_framework import generics -# Create your views here. +from account.permissions import IsManager, ReadOnly +from core.models import GlobalSettings +from core.serializers import GlobalSettingsSerializer, AnonymousGlobalSettingsSerializer + + +class GlobalSettingsAPI(generics.RetrieveUpdateAPIView): + serializer_class = GlobalSettingsSerializer + permission_classes = [IsManager | ReadOnly] + + def get_serializer_class(self): + if getattr(self.request.user, 'is_manager', False): + return GlobalSettingsSerializer + + # Anonymous users can view only a certain set of fields + return AnonymousGlobalSettingsSerializer + + def get_object(self): + return GlobalSettings.load() diff --git a/poizonstore/urls.py b/poizonstore/urls.py index b4d5f95..5d28fae 100644 --- a/poizonstore/urls.py +++ b/poizonstore/urls.py @@ -26,6 +26,7 @@ urlpatterns = [ path('__debug__/', include('debug_toolbar.urls')), path('', include('store.urls')), path('', include('account.urls')), + path('', include('core.urls')), ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) \ + static(settings.STATIC_URL) diff --git a/store/serializers.py b/store/serializers.py index b646124..cda4997 100644 --- a/store/serializers.py +++ b/store/serializers.py @@ -6,7 +6,6 @@ from account.models.bonus import BonusProgram from account.serializers import UserSerializer from utils.exceptions import CRMException from store.models import Checklist, Category, PaymentMethod, Promocode, Image, Gift -from core.models import GlobalSettings from store.utils import get_primary_key_related_model from poizonstore.utils import PriceField @@ -240,25 +239,6 @@ class ClientUpdateChecklistSerializer(ClientChecklistSerializerMixin, ChecklistS read_only_fields = tuple(set(ChecklistSerializer.Meta.fields) - writable_fields) -class GlobalSettingsSerializer(serializers.ModelSerializer): - yuan_rate = PriceField(source='full_yuan_rate', read_only=True) - yuan_rate_commission = PriceField() - chinadelivery = PriceField(source='delivery_price_CN') - commission = PriceField(source='commission_rub') - pickup = serializers.CharField(source='pickup_address') - - class Meta: - model = GlobalSettings - fields = ('yuan_rate', 'yuan_rate_last_updated', 'yuan_rate_commission', 'commission', 'chinadelivery', 'pickup', 'time_to_buy') - read_only_fields = ('yuan_rate_last_updated',) - - -class AnonymousGlobalSettingsSerializer(GlobalSettingsSerializer): - class Meta: - model = GlobalSettingsSerializer.Meta.model - fields = tuple(set(GlobalSettingsSerializer.Meta.fields) - {'yuan_rate_commission', 'yuan_rate_last_updated'}) - - class PaymentMethodSerializer(serializers.ModelSerializer): class Meta: model = PaymentMethod diff --git a/store/urls.py b/store/urls.py index 605b8ba..09d9e59 100644 --- a/store/urls.py +++ b/store/urls.py @@ -16,6 +16,5 @@ router.register(r'category', views.CategoryAPI, basename='category') router.register(r'settings/payment', views.PaymentMethodsAPI, basename='payment') urlpatterns = [ - path("settings/", views.GlobalSettingsAPI.as_view()), ] + router.urls diff --git a/store/views.py b/store/views.py index 4630eda..f26d653 100644 --- a/store/views.py +++ b/store/views.py @@ -5,7 +5,7 @@ import requests from django.conf import settings from django.db.models import F, Count, Sum from django_filters.rest_framework import DjangoFilterBackend -from rest_framework import generics, permissions, mixins, status, viewsets +from rest_framework import permissions, mixins, status, viewsets from rest_framework.decorators import action from rest_framework.exceptions import NotFound from rest_framework.filters import SearchFilter @@ -19,9 +19,8 @@ from store.filters import GiftFilter, ChecklistFilter from store.models import Checklist, Category, PaymentMethod, Promocode, Gift from core.models import GlobalSettings from store.serializers import (ChecklistSerializer, CategorySerializer, CategoryFullSerializer, - PaymentMethodSerializer, AnonymousGlobalSettingsSerializer, GlobalSettingsSerializer, - PromocodeSerializer, ClientUpdateChecklistSerializer, GiftSerializer, - ClientCreateChecklistSerializer) + PaymentMethodSerializer, PromocodeSerializer, ClientUpdateChecklistSerializer, + GiftSerializer, ClientCreateChecklistSerializer) from account.permissions import ReadOnly, IsManager, IsAdmin @@ -125,21 +124,6 @@ class CategoryAPI(mixins.ListModelMixin, mixins.RetrieveModelMixin, mixins.Updat return Response(CategoryFullSerializer(categories_qs, many=True).data) -class GlobalSettingsAPI(generics.RetrieveUpdateAPIView): - serializer_class = GlobalSettingsSerializer - permission_classes = [IsManager | ReadOnly] - - def get_serializer_class(self): - if getattr(self.request.user, 'is_manager', False): - return GlobalSettingsSerializer - - # Anonymous users can view only a certain set of fields - return AnonymousGlobalSettingsSerializer - - def get_object(self): - return GlobalSettings.load() - - class PaymentMethodsAPI(mixins.ListModelMixin, mixins.UpdateModelMixin, viewsets.GenericViewSet): serializer_class = PaymentMethodSerializer permission_classes = [IsManager | ReadOnly]