353 lines
16 KiB
Python
353 lines
16 KiB
Python
from django.db.models import Sum, Count, Q
|
|
from django.views.decorators.csrf import csrf_exempt
|
|
from oauth2_provider.contrib.rest_framework import TokenHasReadWriteScope
|
|
from rest_framework import viewsets
|
|
from rest_framework import status
|
|
from rest_framework.decorators import api_view, permission_classes
|
|
from rest_framework.permissions import AllowAny
|
|
from rest_framework.response import Response
|
|
|
|
from LiveStock.Rancher.filterset import RancherFilterSet
|
|
from LiveStock.Rancher.serializers import RancherSerializer, RancherForBazrasiSerializer
|
|
from LiveStock.helpers import CustomPagination, build_query
|
|
from LiveStock.models import Rancher, Cooperative, LiveStock
|
|
from authentication.models import SystemUserProfile, City, Province
|
|
from LiveStock.Rancher.helpers import update_rancher, update_one_rancher
|
|
from django.contrib.auth.models import User, Group
|
|
|
|
from authentication.views import ARTA_URL_REGISTER, ARTA_URL_CHANGE_MOBILE_NUMBER
|
|
from panel.admin import PROJECT_API_KEY
|
|
import requests
|
|
|
|
|
|
class RancherViewSet(viewsets.ModelViewSet):
|
|
queryset = Rancher.objects.filter(trash=False).only('herd_code', 'epidemiological_code', 'postal_code', 'unit_id',
|
|
'herd_name', 'national_id',
|
|
'fullname', 'mobile', 'contractor_code', 'city',
|
|
'registering_user', 'light_livestock', 'heavy_livestock', 'cow',
|
|
'goat', 'sheep', 'horse', 'camel', 'lot', 'lng',
|
|
'allow_buy').order_by('id')
|
|
permission_classes = [TokenHasReadWriteScope]
|
|
serializer_class = RancherSerializer
|
|
pagination_class = CustomPagination
|
|
filterset_class = RancherFilterSet
|
|
|
|
def retrieve(self, request, pk=None, *args, **kwargs):
|
|
if 'profile' in request.GET:
|
|
user = SystemUserProfile.objects.get(user=request.user, trash=False)
|
|
|
|
rancher = user.rancher_user.all()
|
|
|
|
serializer = self.serializer_class(rancher[0])
|
|
return Response(serializer.data, status=status.HTTP_200_OK)
|
|
|
|
def list(self, request, *args, **kwargs):
|
|
user = SystemUserProfile.objects.get(user=request.user, trash=False)
|
|
if request.GET['role'] == 'Cooperative':
|
|
cooperative = Cooperative.objects.get(user=user, trash=False)
|
|
ranchers = Rancher.objects.filter(trash=False, city=cooperative.address.city.name).only('herd_code',
|
|
'epidemiological_code',
|
|
'postal_code',
|
|
'unit_id',
|
|
'herd_name',
|
|
'national_id',
|
|
'fullname',
|
|
'mobile',
|
|
'contractor_code',
|
|
'city',
|
|
'registering_user',
|
|
'light_livestock',
|
|
'heavy_livestock',
|
|
'cow',
|
|
'goat', 'sheep',
|
|
'horse', 'camel',
|
|
'lot', 'lng',
|
|
'allow_buy').order_by(
|
|
'id')
|
|
|
|
else:
|
|
ranchers = Rancher.objects.filter(trash=False).only('herd_code', 'epidemiological_code', 'postal_code',
|
|
'unit_id', 'herd_name', 'national_id',
|
|
'fullname', 'mobile', 'contractor_code', 'city',
|
|
'registering_user', 'light_livestock',
|
|
'heavy_livestock', 'cow',
|
|
'goat', 'sheep', 'horse', 'camel', 'lot', 'lng',
|
|
'allow_buy').order_by('id')
|
|
|
|
value = request.GET.get('value')
|
|
search = request.GET.get('search')
|
|
if value and search == 'filter':
|
|
if search != 'undefined' and search.strip():
|
|
ranchers = ranchers.filter(
|
|
build_query(self.filterset_class.Meta.fields, value)
|
|
)
|
|
|
|
page_size = request.query_params.get('page_size', None)
|
|
if page_size:
|
|
self.pagination_class.page_size = int(page_size)
|
|
|
|
page = self.paginate_queryset(ranchers)
|
|
if page is not None:
|
|
serializer = self.serializer_class(page, many=True)
|
|
return self.get_paginated_response(serializer.data)
|
|
|
|
serializer = self.serializer_class(ranchers.first())
|
|
# serializer = self.serializer_class(ranchers, many=True)
|
|
return Response(serializer.data, status=status.HTTP_200_OK)
|
|
|
|
def create(self, request, *args, **kwargs):
|
|
group = Group.objects.get(name__exact="Rancher")
|
|
city = City.objects.get(name=request.data['city'])
|
|
request.data.pop('city')
|
|
province = Province.objects.get(key=city.province.key)
|
|
system_profile = SystemUserProfile.objects.filter(mobile=request.data['mobile'], trash=False).last()
|
|
if system_profile:
|
|
if Rancher.objects.filter(user=system_profile, trash=False).exists():
|
|
return Response({"result": "این اتحادیه قبلا ثبت شده است"}, status=status.HTTP_403_FORBIDDEN)
|
|
|
|
else:
|
|
password = "123456"
|
|
data = {
|
|
"username": request.data['mobile'],
|
|
"password": password,
|
|
"api_key": PROJECT_API_KEY
|
|
}
|
|
req = requests.post(
|
|
url=ARTA_URL_REGISTER,
|
|
data=data,
|
|
verify=False
|
|
)
|
|
|
|
if req.status_code == 200:
|
|
user = User(username=request.data['mobile'], first_name=request.data['first_name'],
|
|
last_name=request.data['last_name'])
|
|
user.save()
|
|
base_id = SystemUserProfile.objects.all()
|
|
if base_id.count() > 0:
|
|
base_id = int(base_id.last().base_order) + 1
|
|
else:
|
|
base_id = 1000
|
|
system_profile = SystemUserProfile(
|
|
mobile=request.data['mobile'],
|
|
first_name=request.data['first_name'],
|
|
last_name=request.data['last_name'],
|
|
fullname=request.data['first_name'] + " " + request.data['last_name'],
|
|
user=user,
|
|
base_order=base_id,
|
|
password=password,
|
|
national_id=request.data['national_id'],
|
|
city=city,
|
|
province=province
|
|
)
|
|
system_profile.save()
|
|
else:
|
|
return Response({"result": "در ثبت کاربر مشکلی بوجود آمده است "}, status=status.HTTP_403_FORBIDDEN)
|
|
system_profile.role.add(group)
|
|
request.data.pop('first_name')
|
|
request.data.pop('last_name')
|
|
serializer = self.serializer_class(data=request.data)
|
|
if serializer.is_valid():
|
|
rancher = serializer.create(validated_data=request.data)
|
|
rancher.user = system_profile
|
|
rancher.save()
|
|
return Response({"result": "با موفقیت ثبت شد"}, status=status.HTTP_201_CREATED)
|
|
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
|
|
|
|
def update(self, request, pk=None, *args, **kwargs):
|
|
rancher = Rancher.objects.get(key=request.data['key'], trash=False)
|
|
if 'first_name' in request.data.keys():
|
|
# system_user_profile = SystemUserProfile.objects.get(key=rancher.user.key, trash=False)
|
|
# system_user_profile.first_name = request.data['first_name']
|
|
# system_user_profile.last_name = request.data['last_name']
|
|
# system_user_profile.fullname = request.data['first_name'] + " " + request.data['last_name']
|
|
# system_user_profile.save()
|
|
# first_mobile_number = system_user_profile.mobile
|
|
# second_mobile_number = request.data['mobile']
|
|
# if first_mobile_number != second_mobile_number:
|
|
# if SystemUserProfile.objects.filter(mobile=second_mobile_number).exists():
|
|
# return Response({"result": "این شماره در سامانه به نام شخص دیگری است"},
|
|
# status=status.HTTP_403_FORBIDDEN)
|
|
# data = {
|
|
# "first_mobile_number": first_mobile_number,
|
|
# "second_mobile_number": second_mobile_number,
|
|
# }
|
|
# req = requests.post(
|
|
# url=ARTA_URL_CHANGE_MOBILE_NUMBER,
|
|
# data=data,
|
|
# verify=False
|
|
# )
|
|
# if req.status_code == 200:
|
|
# second_mobile_number = second_mobile_number
|
|
# user = User.objects.get(id=system_user_profile.user.id)
|
|
# user.username = second_mobile_number
|
|
# user.save()
|
|
# system_user_profile.mobile = second_mobile_number
|
|
# system_user_profile.save()
|
|
request.data.pop('first_name')
|
|
request.data.pop('last_name')
|
|
|
|
serializer = self.serializer_class(rancher)
|
|
serializer.update(instance=rancher, validated_data=request.data)
|
|
return Response(serializer.data, status=status.HTTP_200_OK)
|
|
|
|
|
|
def destroy(self, request, pk=None, *args, **kwargs):
|
|
rancher = Rancher.objects.get(key=request.GET["rancher_key"])
|
|
rancher.trash = True
|
|
rancher.save()
|
|
return Response({"result": "با موفقیت حذف شد"}, status=status.HTTP_200_OK)
|
|
|
|
|
|
# def update(self, request, *args, **kwargs):
|
|
# rancher = self.queryset.get(key=request.data['key'], trash=False)
|
|
# request.data.pop('key')
|
|
#
|
|
# serializer = self.serializer_class(rancher)
|
|
# serializer.update(instance=rancher, validated_data=request.data)
|
|
# return Response(serializer.data, status=status.HTTP_200_OK)
|
|
|
|
|
|
@api_view(["GET"])
|
|
@csrf_exempt
|
|
@permission_classes([TokenHasReadWriteScope])
|
|
def get_detail_rancher(request):
|
|
ranchers = Rancher.objects.filter(herd_code=request.GET['herd_code']).first()
|
|
while True:
|
|
update_ranchers = update_one_rancher(ranchers)
|
|
if update_ranchers:
|
|
break
|
|
dict1 = {
|
|
"light_livestock": ranchers.light_livestock,
|
|
"heavy_livestock": ranchers.heavy_livestock,
|
|
"sheep": ranchers.sheep,
|
|
"goat": ranchers.goat,
|
|
"cow": ranchers.cow,
|
|
"camel": ranchers.camel,
|
|
"horse": ranchers.horse
|
|
}
|
|
return Response(dict1, status=status.HTTP_200_OK)
|
|
|
|
|
|
class RancherForBazrasiViewSet(viewsets.ModelViewSet):
|
|
queryset = Rancher.objects.filter(trash=False, type='industrial').only(
|
|
'herd_code',
|
|
'fullname',
|
|
'mobile',
|
|
'lot',
|
|
'lng',
|
|
'industrial',
|
|
'heavy_livestock',
|
|
'light_livestock'
|
|
).order_by('-industrial', 'id')
|
|
permission_classes = [AllowAny]
|
|
serializer_class = RancherForBazrasiSerializer
|
|
|
|
def list(self, request, *args, **kwargs):
|
|
type_filter = request.GET.get('type')
|
|
queryset = Rancher.objects.filter(trash=False).only(
|
|
'herd_code',
|
|
'fullname',
|
|
'mobile',
|
|
'lot',
|
|
'lng',
|
|
'industrial',
|
|
'heavy_livestock',
|
|
'light_livestock',
|
|
'type'
|
|
).order_by('-industrial', 'id')
|
|
|
|
if type_filter in ('industrial', 'rural'):
|
|
queryset = queryset.filter(type=type_filter)
|
|
|
|
herd_codes = list(queryset.values_list('herd_code', flat=True))
|
|
|
|
heavy_counts = {}
|
|
light_counts = {}
|
|
valid_herd_codes = set()
|
|
if herd_codes:
|
|
heavy_types = ('گاو', 'اسب', 'شتر')
|
|
light_types = ('بز', 'گوسفند')
|
|
livestock_counts = (
|
|
LiveStock.objects.filter(
|
|
trash=False,
|
|
herd_code__in=herd_codes,
|
|
type__in=heavy_types + light_types
|
|
)
|
|
.values('herd_code', 'type')
|
|
.annotate(total=Count('id'))
|
|
)
|
|
for item in livestock_counts:
|
|
herd_code = item['herd_code']
|
|
livestock_type = item['type']
|
|
total = item['total']
|
|
if livestock_type in heavy_types:
|
|
heavy_counts[herd_code] = heavy_counts.get(herd_code, 0) + total
|
|
elif livestock_type in light_types:
|
|
light_counts[herd_code] = light_counts.get(herd_code, 0) + total
|
|
|
|
valid_herd_codes = set(heavy_counts.keys()) | set(light_counts.keys())
|
|
|
|
if valid_herd_codes:
|
|
queryset = queryset.filter(herd_code__in=valid_herd_codes)
|
|
else:
|
|
queryset = queryset.none()
|
|
|
|
serializer = self.get_serializer(
|
|
queryset,
|
|
many=True,
|
|
context={
|
|
'heavy_counts': heavy_counts,
|
|
'light_counts': light_counts
|
|
}
|
|
)
|
|
|
|
return Response(serializer.data, status=status.HTTP_200_OK)
|
|
|
|
|
|
@api_view(["GET"])
|
|
@csrf_exempt
|
|
@permission_classes([TokenHasReadWriteScope])
|
|
def dashboard_rancher(request):
|
|
user = SystemUserProfile.objects.get(user=request.user, trash=False)
|
|
role = request.GET.get('role')
|
|
|
|
ranchers = Rancher.objects.filter(trash=False).values_list('herd_code', flat=True).distinct()
|
|
|
|
live_stocks = LiveStock.objects.filter(trash=False, herd_code__in=ranchers).only('type')
|
|
|
|
if role == 'Cooperative':
|
|
cooperative = Cooperative.objects.get(user=user, trash=False)
|
|
ranchers = Rancher.objects.filter(trash=False, city=cooperative.address.city.name).values_list('herd_code',
|
|
flat=True).distinct()
|
|
live_stocks = live_stocks.filter(herd_code__in=ranchers)
|
|
|
|
value = request.GET.get('value')
|
|
search = request.GET.get('search')
|
|
if value and search == 'filter':
|
|
if search != 'undefined' and search.strip():
|
|
ranchers = ranchers.filter(build_query(RancherFilterSet.Meta.fields, value))
|
|
|
|
counts = live_stocks.values('type').annotate(total=Count('id'))
|
|
count_dict = {item['type']: item['total'] for item in counts}
|
|
|
|
light_livestock = count_dict.get('بز', 0) + count_dict.get('گوسفند', 0)
|
|
heavy_livestock = count_dict.get('گاو', 0) + count_dict.get('اسب', 0) + count_dict.get('شتر', 0)
|
|
total_ranchers = len(ranchers)
|
|
dhi_amount = ranchers.filter(dhi_amount__gt=1,trash=False).aggregate(total=Sum('dhi_amount'))['total'] or 0
|
|
|
|
result = {
|
|
'rancher_count': total_ranchers,
|
|
'live_stocks_count': sum(count_dict.values()),
|
|
"sheep": count_dict.get('گوسفند', 0),
|
|
"goat": count_dict.get('بز', 0),
|
|
"cow": count_dict.get('گاو', 0),
|
|
"horse": count_dict.get('اسب', 0),
|
|
"camel": count_dict.get('شتر', 0),
|
|
"light_livestock": light_livestock,
|
|
"heavy_livestock": heavy_livestock,
|
|
"dhi_amount": dhi_amount,
|
|
|
|
}
|
|
|
|
return Response(result, status=status.HTTP_200_OK)
|