mirror of
https://github.com/himool/HimoolERP.git
synced 2026-01-13 04:44:37 +08:00
177 lines
6.7 KiB
Python
177 lines
6.7 KiB
Python
from .serializers import RoleSerializer, SubuserSerializer, AccountSerializer, BookkeepingSerializer
|
|
from .paginations import BookkeepingPagination
|
|
from django_filters.rest_framework import DjangoFilterBackend
|
|
from .permissions import RolePermission, SubuserPermission
|
|
from rest_framework import permissions, pagination
|
|
from rest_framework.filters import SearchFilter, OrderingFilter
|
|
from rest_framework import status, exceptions
|
|
from utils.permissions import IsAuthenticated
|
|
from rest_framework.response import Response
|
|
from rest_framework import viewsets, status
|
|
from django.db.models import Sum, Value
|
|
from django.contrib import auth
|
|
from user.models import User
|
|
from .models import Role
|
|
import pendulum
|
|
from django.db.models.functions import Coalesce
|
|
|
|
|
|
class RoleViewSet(viewsets.ModelViewSet):
|
|
"""list, create, update, destroy"""
|
|
serializer_class = RoleSerializer
|
|
permission_classes = [IsAuthenticated, RolePermission]
|
|
|
|
def get_queryset(self):
|
|
return self.request.user.teams.roles.all()
|
|
|
|
def perform_create(self, serializer):
|
|
serializer.save(teams=self.request.user.teams)
|
|
|
|
|
|
class SubusertViewSet(viewsets.ModelViewSet):
|
|
"""list, create, update, destroy"""
|
|
serializer_class = SubuserSerializer
|
|
permission_classes = [IsAuthenticated, SubuserPermission]
|
|
|
|
def get_queryset(self):
|
|
return self.request.user.teams.users.filter(is_manager=False, is_delete=False).order_by('create_date')
|
|
|
|
def perform_create(self, serializer):
|
|
password = self.request.data.get('password')
|
|
username = self.request.data.get('username')
|
|
roles = self.request.data.get('roles', [])
|
|
|
|
if password is None:
|
|
raise exceptions.ValidationError
|
|
|
|
if User.objects.filter(username=username).first():
|
|
raise exceptions.ValidationError({'message': '账号已存在'})
|
|
|
|
serializer.save(teams=self.request.user.teams, is_manager=False, password=password, roles=roles)
|
|
|
|
def perform_update(self, serializer):
|
|
username = self.request.data.get('username')
|
|
roles = self.request.data.get('roles', [])
|
|
|
|
if serializer.instance.username != username and User.objects.filter(username=username).first():
|
|
raise exceptions.ValidationError({'message': '账号已存在'})
|
|
|
|
serializer.instance.roles.set(roles)
|
|
serializer.save()
|
|
|
|
def partial_update(self, request, *args, **kwargs): # 重置密码
|
|
password = self.request.data.get('password')
|
|
if password is None:
|
|
raise exceptions.ValidationError
|
|
|
|
instance = self.get_object()
|
|
instance.set_password(password)
|
|
instance.save()
|
|
return Response(status=status.HTTP_200_OK)
|
|
|
|
def perform_destroy(self, instance):
|
|
instance.is_delete = True
|
|
instance.save()
|
|
|
|
|
|
class AccountViewSet(viewsets.ModelViewSet):
|
|
"""list, create, update, destroy"""
|
|
serializer_class = AccountSerializer
|
|
permission_classes = [IsAuthenticated]
|
|
filter_backends = [OrderingFilter, SearchFilter, DjangoFilterBackend]
|
|
search_fields = ['name']
|
|
ordering_fields = ['name', 'order']
|
|
|
|
def get_queryset(self):
|
|
return self.request.user.teams.accounts.filter(is_delete=False).order_by('order')
|
|
|
|
def perform_create(self, serializer):
|
|
serializer.save(teams=self.request.user.teams)
|
|
|
|
def perform_destroy(self, instance):
|
|
instance.is_delete = True
|
|
instance.save()
|
|
|
|
|
|
class SellerViewSet(viewsets.ModelViewSet):
|
|
"""list"""
|
|
permission_classes = [IsAuthenticated]
|
|
|
|
def list(self, request, *args, **kwargs):
|
|
queryset = request.user.teams.users.filter(is_delete=False)
|
|
roles = request.user.roles.all()
|
|
if not roles: # 没有设置角色默认拥有全部权限
|
|
return Response(queryset.values('id', 'username'))
|
|
|
|
for role in roles:
|
|
if 'CHANGE_SELLER' in role.permissions:
|
|
return Response(queryset.values('id', 'username'))
|
|
|
|
return Response([{'id': request.user.id, 'username': request.user.username}])
|
|
|
|
|
|
class BookkeepingViewSet(viewsets.ModelViewSet):
|
|
"""list, create, destroy"""
|
|
serializer_class = BookkeepingSerializer
|
|
permission_classes = [IsAuthenticated]
|
|
pagination_class = BookkeepingPagination
|
|
|
|
def get_queryset(self):
|
|
return self.request.user.teams.bookkeeping_set.all().order_by('-create_datetime')
|
|
|
|
def perform_create(self, serializer):
|
|
serializer.save(teams=self.request.user.teams, recorder=self.request.user)
|
|
|
|
|
|
class StatisticalAccountViewSet(viewsets.ModelViewSet):
|
|
"""list"""
|
|
permission_classes = [IsAuthenticated]
|
|
|
|
def get_queryset(self):
|
|
accoutns = self.request.query_params.get('accounts')
|
|
accoutns = accoutns.split(',') if accoutns else []
|
|
start_date = self.request.GET.get('start_date')
|
|
end_date = self.request.GET.get('end_date')
|
|
end_date = pendulum.parse(end_date).add(days=1)
|
|
|
|
bookkeeping_queryset = self.request.user.teams.bookkeeping_set.filter(
|
|
account_id__in=accoutns)
|
|
purchase_queryset = self.request.user.teams.purchase_order_set.filter(
|
|
account_id__in=accoutns, is_return=False)
|
|
sales_queryset = self.request.user.teams.sales_order_set.filter(
|
|
account_id__in=accoutns, is_return=False)
|
|
|
|
if start_date:
|
|
bookkeeping_queryset = bookkeeping_queryset.filter(create_datetime__gte=start_date)
|
|
purchase_queryset = purchase_queryset.filter(date__gte=start_date)
|
|
sales_queryset = sales_queryset.filter(date__gte=start_date)
|
|
|
|
if end_date:
|
|
bookkeeping_queryset = bookkeeping_queryset.filter(create_datetime__lte=end_date)
|
|
purchase_queryset = purchase_queryset.filter(date__lte=end_date)
|
|
sales_queryset = sales_queryset.filter(date__lte=end_date)
|
|
|
|
return bookkeeping_queryset, purchase_queryset, sales_queryset
|
|
|
|
def list(self, request, *args, **kwargs):
|
|
bookkeeping_queryset, purchase_queryset, sales_queryset = self.get_queryset()
|
|
|
|
amount_list = bookkeeping_queryset.values_list('amount', flat=True)
|
|
expenditure = purchase_queryset.aggregate(amount=Coalesce(Sum('amount'), Value(0)))['amount']
|
|
revenue = sales_queryset.aggregate(amount=Coalesce(Sum('amount'), Value(0)))['amount']
|
|
|
|
for amount in amount_list:
|
|
if amount > 0:
|
|
revenue += amount
|
|
else:
|
|
expenditure -= amount
|
|
|
|
return Response({'revenue': revenue, 'expenditure': expenditure})
|
|
|
|
|
|
class UserViewSet(viewsets.ModelViewSet):
|
|
permission_classes = [IsAuthenticated]
|
|
|
|
def list(self, request, *args, **kwargs):
|
|
results = request.user.teams.users.filter(is_delete=False).values('id', 'username')
|
|
return Response(data=results)
|