Compare commits

..

2 Commits

Author SHA1 Message Date
b31272511c * Moved GlobalSettings to core app 2024-05-25 03:21:59 +04:00
0eaa1c1b86 + User.invited_with_orders_count field 2024-05-25 03:20:08 +04:00
9 changed files with 70 additions and 44 deletions

View File

@ -7,7 +7,7 @@ from django.contrib.auth.models import UserManager as _UserManager, AbstractUser
from django.core.exceptions import ValidationError
from django.db import models
from django.db.models import Q
from django.db.models import Q, Count
from django.utils.translation import gettext_lazy as _
from phonenumber_field.modelfields import PhoneNumberField
from phonenumber_field.phonenumber import PhoneNumber
@ -173,6 +173,12 @@ class User(BonusProgramMixin, AbstractUser):
def invited_users(self):
return User.objects.filter(user_inviter__inviter=self.id)
@property
def invited_users_with_orders(self):
return (self.invited_users
.annotate(_orders_count=Count('customer_orders'))
.filter(_orders_count__gt=0))
@property
def inviter(self):
return User.objects.filter(user_invited__invited=self.id).first()

View File

@ -13,10 +13,15 @@ class UserSerializer(serializers.ModelSerializer):
name = serializers.CharField(source='first_name')
lastname = serializers.CharField(source='middle_name')
surname = serializers.CharField(source='last_name')
invited_with_orders_count = serializers.SerializerMethodField()
class Meta:
model = User
fields = ('id', 'email', 'phone', 'role', 'name', 'lastname', 'surname', 'balance', 'referral_code', 'is_draft_user')
fields = ('id', 'email', 'phone', 'role', 'name', 'lastname', 'surname',
'balance', 'referral_code', 'is_draft_user', 'invited_with_orders_count')
def get_invited_with_orders_count(self, obj):
return obj.invited_users_with_orders.count()
class BonusProgramTransactionSerializer(serializers.ModelSerializer):

23
core/serializers.py Normal file
View File

@ -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'})

11
core/urls.py Normal file
View File

@ -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

View File

@ -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()

View File

@ -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)

View File

@ -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

View File

@ -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

View File

@ -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]