Files
Rasadyar_Kurdestan/authentication/views.py
2026-01-18 11:59:48 +03:30

3164 lines
134 KiB
Python

import datetime
import threading
from datetime import timedelta
from django.shortcuts import get_object_or_404, redirect
import jdatetime
from django.http import HttpResponse
from rest_framework import viewsets
from oauth2_provider.contrib.rest_framework import (
TokenHasReadWriteScope,
OAuth2Authentication,
)
from oauth2_provider.models import AccessToken
from rest_framework.pagination import PageNumberPagination
from general_urls import CLIENT_ID, CLIENT_SECRET, BASE_URL
from panel.ReportingPanel.filterset import ProfileFilterSet
from panel.admin import PROJECT_API_KEY
from panel.filterset import WagePaymentFilterSet
from panel.models import WareHouseFactor, InspectorOperator, KillHouseVet, Itransaction, Wallet, KillHousePercentage, \
Jahad, Admin, VetSupervisor, ProvincialGovernment, CityJahad, ProvinceAllowKillHouseChooseStewardGuilds, \
ProvinceAllowPoultryChooseKillHouse, Pricing, Guilds, POSMachine, PosVersion, PosItem, POSId, UserLoginLog, \
ProvinceAllowKillHouseDirectBuying
from ticket.helper import send_image_to_server
from .filterset import UserProfileFilterSet, SystemUserProfileFilteSet, ExternalTransactionFilterSet
from .helper.refresh import refresh
from .sahandsms.sms import (
send_sms,
send_otp_code,
send_password
)
from .serializer.serializer import (
AddressSerializer,
UserProfileSerializer,
BankCardSerializer,
SystemUserProfileSerializer, SystemUserProfileForAllUsersSerializer, SystemUserProfileBaseInfoSerializer,
ExternalTransactionSerializer,
# SystemUserProfileInfoSerializer
)
from .serializers import SystemAddressSerializer, CityForProductPricingSerializer
from panel.CityOperator.serializers import CityOperatorSerializer, CityOperatorForAllUserSerializer
from panel.ProvinceOperator.serializers import ProvinceOperatorSerializer, InspectorOperatorSerializer, JahadSerializer, \
AdminSerializer, VetSupervisorSerializer, ProvincialGovernmentSerializer, ProvinceOperatorForAllUserSerializer, \
InspectorOperatorForAllUserSerializer, JahadForAllUserSerializer, AdminForAllUserSerializer, \
VetSupervisorForAllUserSerializer, ProvincialGovernmentForAllUserSerializer, CityJahadForAllUserSerializer, \
PricingSerializer, GeneralGuildsSerializer
from panel.poultry.serializers import (
PoultrySerializer,
PoultryTenantSerializer, PoultryForAllUserSerializer
)
from panel.KillHouse.serializers import (
KillHouseOperatorSerializer,
VetSerializer, KillHouseSerializer, KillHouseVetSerializer, KillHouseDriverSerializer,
KillHouseOperatorForAllUserSerializer, VetForAllUserSerializer, KillHouseDriverForAllUserSerializer,
KillHouseVetForAllUserSerializer, KillHouseForAllUserSerializer
)
from rest_framework.permissions import (
AllowAny,
IsAuthenticated,
DjangoModelPermissions
)
from rest_framework.authentication import TokenAuthentication
from rest_framework.decorators import permission_classes, api_view
from django_filters.rest_framework import DjangoFilterBackend
from rest_framework.decorators import authentication_classes
from rest_framework.authentication import get_authorization_header
from django.core.cache.backends.base import DEFAULT_TIMEOUT
from authentication.models import CityUnit, ExternalTransaction
from django.contrib.auth.hashers import make_password
from django.contrib.auth.views import LoginView
from panel.helper import (
create_except_profile,
update_except_profile,
remove_null_fields, operator_update_except_profile
)
from authentication.models import (
UserProfile,
Address,
BankCard,
SystemUserProfile,
SystemAddress,
City,
Province
)
from panel.models import (
Poultry,
ProvinceOperator,
CityOperator,
KillHouseOperator,
Vet,
KillHouseDriver,
KillHouseADDCAR,
PoultryTenant,
KillHouse,
)
from rest_framework.response import Response
from django.contrib.auth.models import User, Group
from django.core.cache import cache
from django.conf import settings
from rest_framework import status
from oauth2_provider.models import AccessToken
from .helper.image_services import (
upload_image,
upload_listed_image
)
from django.http.response import JsonResponse, HttpResponseRedirect
import requests
import json
import random
import uuid
from django.contrib.auth.views import LoginView
from django.contrib.auth.hashers import make_password
import cryptocode
import string
import random
import os
from django_filters.rest_framework import DjangoFilterBackend
from django.http import QueryDict
import xlsxwriter
from io import StringIO, BytesIO
# آدرس پایه برای ارسال در خواست ثبت نام به سیستم پایه شرکت آرتا
from .serializers import SystemAddressSerializer, CityUnitSerializer, CitySerializer, ProvinceSerializer
ARTA_URL_REGISTER = "https://userbackend.rasadyar.com/api/register/"
# آدرس پایه برای ارسال در خواست ورود به سیستم پایه شرکت آرتا
ARTA_URL_LOGIN = "https://userbackend.rasadyar.com/api/login/"
# آدرس پایه برای سیستم ورود و ثبت نام بر اساس توکن
ARTA_URL_CHANGE_MOBILE_NUMBER = "https://userbackend.rasadyar.com/change_mobile_number/"
CACHE_TTL = getattr(settings, "CACHE_TTL", DEFAULT_TIMEOUT)
# آدرس پایه برای ذخیره تصویر کاربر در استوریج آروان
ARVAN_User_Image_URL = 'https://profileimagedefault.s3.ir-thr-at1.arvanstorage.ir/'
# ARVAN_User_Image_URL = 'http://user-image-gallery.s3.ir-thr-at1.arvanstorage.ir/'
ARTA_URL_SEND_OTP = "https://userbackend.rasadyar.com/api/send_otp/"
ARTA_URL_CHECK_OTP = "https://userbackend.rasadyar.com/api/check_otp/"
ARTA_URL_CHANGE_PASSWORD = "https://userbackend.rasadyar.com/api/change_password/"
class CustomPagination(PageNumberPagination):
page_size = 10
class ExternalTransactionViewSet(viewsets.ModelViewSet):
queryset = ExternalTransaction.objects.all()
serializer_class = ExternalTransactionSerializer
permission_classes = [TokenHasReadWriteScope]
filter_backends = [DjangoFilterBackend]
pagination_class = CustomPagination
filterset_class = ExternalTransactionFilterSet
filterset_fields = [
'saleReferenceId',
'refId',
'orderId',
'cardHolderPan',
]
def list(self, request, *args, **kwargs):
user = SystemUserProfile.objects.get(user=request.user)
date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date()
date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date()
transactions_list = []
if request.GET['role'] == 'KillHouse':
if request.GET['state'] == 'failed':
if 'type' in request.GET:
transactions = ExternalTransaction.objects.filter(
date__date__gte=date1,
date__date__lte=date2,
kill_house_user=user,
status='failed',
transaction_type='wallet',
trash=False).order_by('id')
else:
transactions = ExternalTransaction.objects.filter(
date__date__gte=date1,
date__date__lte=date2,
kill_house_user=user,
status='failed',
transaction_type='wage-gateway',
trash=False).order_by('id')
else:
if 'type' in request.GET:
transactions = ExternalTransaction.objects.filter(
date__date__gte=date1,
date__date__lte=date2,
kill_house_user=user,
status='completed',
transaction_type='wallet',
trash=False).order_by('id')
else:
transactions = ExternalTransaction.objects.filter(
date__date__gte=date1,
date__date__lte=date2,
kill_house_user=user,
status='completed',
transaction_type='wage-gateway',
trash=False).order_by('id')
else:
if request.GET['state'] == 'failed':
if 'type' in request.GET:
transactions = ExternalTransaction.objects.filter(
date__date__gte=date1,
date__date__lte=date2,
status='failed',
transaction_type='wallet',
trash=False).order_by('id')
else:
transactions = ExternalTransaction.objects.filter(
date__date__gte=date1,
date__date__lte=date2,
status='failed',
transaction_type='wage-gateway',
trash=False).order_by('id')
else:
if 'type' in request.GET:
transactions = ExternalTransaction.objects.filter(
date__date__gte=date1,
date__date__lte=date2,
status='completed',
transaction_type='wallet',
trash=False).order_by('id')
else:
transactions = ExternalTransaction.objects.filter(
date__date__gte=date1,
date__date__lte=date2,
status='completed',
transaction_type='wage-gateway',
trash=False).order_by('id')
if 'search' in request.GET:
if request.GET['search'] == 'filter':
if request.GET['value'] != "" and request.GET['value'] != 'undefined':
for item in self.filterset_fields:
query = QueryDict('{0}__contains={1}'.format(item, request.GET['value']))
if (self.filterset_class(
data=query,
queryset=transactions
)
).filter():
ps = self.filterset_class(data=query, queryset=transactions)
transactions_list = ps.filter()
transactions = [] if len(transactions_list) == 0 else transactions_list
page_size = request.query_params.get('page_size', None)
if page_size:
self.pagination_class.page_size = int(page_size)
page = self.paginate_queryset(transactions)
if page is not None:
serializer = ExternalTransactionSerializer(page, many=True)
return self.get_paginated_response(serializer.data)
serializer = ExternalTransactionSerializer(transactions, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
# ویوست مربوط به استان
class ProvinceViewSet(viewsets.ModelViewSet):
queryset = Province.objects.all()
serializer_class = ProvinceSerializer
permission_classes = [TokenHasReadWriteScope]
def list(self, request, *args, **kwargs):
# refresh(request.user.id)
user = SystemUserProfile.objects.get(user=request.user)
province = Province.objects.filter(key=user.province.key)
serializer = CitySerializer(province, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
# ویوست مربوط به شهرستان
class CityViewSet(viewsets.ModelViewSet):
queryset = City.objects.all()
serializer_class = CitySerializer
permission_classes = [TokenHasReadWriteScope]
def list(self, request, *args, **kwargs):
refresh(request.user.id)
city = City.objects.filter(
province=Province.objects.get(key=request.GET['province_key'])
# province=Province.objects.get(key='1e364f53-f873-4af9-9e93-7e4816e889ae')
)
serializer = CitySerializer(city, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
class CityForProducctPricingViewSet(viewsets.ModelViewSet):
queryset = City.objects.all()
serializer_class = CityForProductPricingSerializer
permission_classes = [TokenHasReadWriteScope]
def list(self, request, *args, **kwargs):
user = SystemUserProfile.objects.get(user=request.user)
city = City.objects.filter(trash=False, province=user.province).order_by('id')
serializer = self.serializer_class(city, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
def update(self, request, pk=None, *args, **kwargs):
city = City.objects.get(trash=False, key=request.data['city_key'])
request.data.pop('city_key')
serializer = self.serializer_class(city)
serializer.update(instance=city, validated_data=request.data)
return Response(serializer.data, status=status.HTTP_200_OK)
class CityWithOutProvinceKeyViewSet(viewsets.ModelViewSet):
queryset = City.objects.all()
serializer_class = CitySerializer
permission_classes = [TokenHasReadWriteScope]
def list(self, request, *args, **kwargs):
# refresh(request.user.id)
user = SystemUserProfile.objects.get(user=request.user)
city = City.objects.filter(
province=Province.objects.get(key=user.province.key)
)
serializer = CitySerializer(city, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
class CitysViewSet(viewsets.ModelViewSet):
queryset = City.objects.all()
serializer_class = CitySerializer
permission_classes = [TokenHasReadWriteScope]
def list(self, request, *args, **kwargs):
# refresh(request.user.id)
user = SystemUserProfile.objects.get(user=request.user)
city = City.objects.filter(
province=Province.objects.get(key=user.province.key)
).exclude(name='فاقد شهرستان')
serializer = CitySerializer(city, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
# ویوست مربوط به زیربخش شهرستان
class CityUnitViewSet(viewsets.ModelViewSet):
queryset = CityUnit.objects.all()
serializer_class = CityUnitSerializer
permission_classes = [TokenHasReadWriteScope]
# ویوست مربوط به آدرس
class SystemAddressViewSet(viewsets.ModelViewSet):
queryset = SystemAddress.objects.all()
serializer_class = SystemAddressSerializer
permission_classes = [TokenHasReadWriteScope]
# ویوست مربوط به جستجو اطلاعات کاربر یا کاربران
class UserProfileSearchViewSet(viewsets.ModelViewSet):
queryset = UserProfile.objects.all()
serializer_class = UserProfileSerializer
permission_classes = [TokenHasReadWriteScope]
filter_backends = [DjangoFilterBackend]
filterset_class = UserProfileFilterSet
filterset_fields = [
'fullname',
'mobile',
'first_name',
'last_name',
'breeding_unique_id',
'address__city',
'address__province',
'role__name',
]
def list(self, request, *args, **kwargs):
if 'type' in request.GET:
if request.GET['type'] == 'filter':
for item in self.filterset_fields:
query = QueryDict('{0}__contains={1}'.format(item, request.GET['value']))
if (self.filterset_class(
data=query,
queryset=self.queryset
)
).filter():
ps = self.filterset_class(data=query, queryset=self.queryset)
filtered_user = ps.filter()
serializer = self.serializer_class(filtered_user, many=True)
return Response(serializer.data)
return Response({"msg": "Enter 'Type' In Get Parameters"}, status=status.HTTP_403_FORBIDDEN)
else:
queryset = self.queryset.all()
serializer = UserProfileSerializer(queryset, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
# ویوست مربوط به پروفایل کاربری که شامل ساخت و ویرایش و حذف
class UserProfileViewSet(viewsets.ModelViewSet):
queryset = UserProfile.objects.all()
serializer_class = UserProfileSerializer
permission_classes = [TokenHasReadWriteScope]
# تابع مربوط به ثبت پروفایل کاربر
def create(self, request, *args, **kwargs):
role = Group.objects.get(name__exact=request.data['role'])
request.data.pop('role')
city = request.data['city']
province = request.data['province']
address = request.data['address']
try:
image = request.data['image']
request.data.pop('image')
except:
image = ""
request.data.pop('city')
request.data.pop('province')
request.data.pop('address')
mobile = request.data['mobile']
if UserProfile.objects.filter(mobile=mobile):
return Response('user already exist')
index = UserProfile.objects.all().last().base_order
serializer = self.serializer_class(data=request.data)
if serializer.is_valid():
user_profile = serializer.create(validated_data=request.data)
user_profile.image = send_image_to_server(image)
password = str(random.randint(10000, 99000))
user = User(
first_name=user_profile.fullname,
username=user_profile.mobile,
password=cryptocode.encrypt(password, password)
)
user.save()
user_address = Address(
city=city,
province=province,
address=address,
)
user_address.save()
user_profile.user = user
user_profile.role = role
user_profile.address = user_address
user_profile.base_order = index + 1
user_profile.fullname = user_profile.first_name + " " + user_profile.last_name
user_profile.save()
send_password(user_profile.mobile, password)
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors)
# تابع مربوط به نمایش اطلاعات پروفایل کاربر
def list(self, request, *args, **kwargs):
if 'type' in request.GET:
if request.GET['type'] == 'operator':
queryset = self.queryset.filter(role__name__exact="Poultry")
serializer = UserProfileSerializer(queryset, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
if request.GET['type'] == 'user':
queryset = UserProfile.objects.all().filter(user__exact=request.user)
serializer = UserProfileSerializer(queryset, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
return Response({'Msg': 'Enter type parameter in url'})
# تابع مربوط به ویرایش اطلاعات پروفایل کاربر
def update(self, request, pk=None, *args, **kwargs):
try:
if request.data['image'] == "":
user_image = None
else:
user_image = request.data['image']
request.data.pop('image')
except:
user_image = None
try:
role = request.data['role']
request.data.pop('role')
except:
role = None
try:
city = request.data['city']
request.data.pop('city')
except:
city = None
try:
province = request.data['province']
request.data.pop('province')
except:
province = None
try:
address = request.data['address']
request.data.pop('address')
except:
address = None
queryset = UserProfile.objects.get(key=request.data["key"])
user_address = Address.objects.get(id=queryset.address.id)
request.data.pop('key')
if user_image:
queryset.image = send_image_to_server(user_image)
if role:
queryset.role = Group.objects.get(name__exact=role)
if city:
user_address.city = city
if province:
user_address.province = province
if address:
user_address.address = address
user_address.save()
queryset.save()
serializer = self.serializer_class(queryset)
serializer.update(instance=queryset, validated_data=request.data)
return Response(serializer.data, status=status.HTTP_200_OK)
# تابع مربوط به حذف اطلاعات پروفایل کاربر
def destroy(self, request, pk=None, *args, **kwargs):
user_profile = UserProfile.objects.get(key__exact=request.GET["key"])
user = User.objects.get(id=user_profile.user.id)
address = Address.objects.get(id=user_profile.address.id)
user_profile.delete()
user.delete()
address.delete()
return Response('user deleted', status=status.HTTP_200_OK)
class ForceDiagramViewSet(viewsets.ModelViewSet):
queryset = SystemUserProfile.objects.all()
serializer_class = SystemUserProfileSerializer
permission_classes = [TokenHasReadWriteScope]
def list(self, request, *args, **kwargs):
refresh(request.user.id)
user = SystemUserProfile.objects.get(user=request.user)
if 'role' in request.GET:
role = request.GET['role'].split(',')
new_persons = []
persons = SystemUserProfile.objects.filter(role__name__in=role, province=user.province).order_by('id')
if persons.count() > 0:
for person in persons:
if person in new_persons:
pass
else:
new_persons.append(person)
serializer = SystemUserProfileSerializer(new_persons, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
if 'all' in request.GET:
poultry = Poultry.objects.filter(user__province=user.province)
city_operator = CityOperator.objects.filter(user__province=user.province)
province_operator = ProvinceOperator.objects.filter(user__province=user.province,
user__role__name='ProvinceOperator')
financial_operator = Poultry.objects.filter(user__province=user.province,
user__role__name='ProvinceFinancial')
inspector_operator = InspectorOperator.objects.filter(user__province=user.province)
killhouse_operator = KillHouseOperator.objects.filter(user__province=user.province)
driver = KillHouseDriver.objects.filter(user__province=user.province)
vet = Vet.objects.filter(user__province=user.province)
killhouse_vet = KillHouseVet.objects.filter(vet__user__province=user.province)
diageram_dict = {
"poultry": poultry.count(),
"city_operator": city_operator.count(),
"province_operator": province_operator.count(),
"financial_operator": financial_operator.count(),
"inspector_operator": inspector_operator.count(),
"killhouse_operator": killhouse_operator.count(),
"driver": driver.count(),
"vet": vet.count(),
"killhouse_vet": killhouse_vet.count(),
}
return Response(diageram_dict, status=status.HTTP_200_OK)
elif 'Poultry' in request.GET:
poultry = Poultry.objects.filter(address__province=user.province)
serializer = PoultrySerializer(poultry, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
elif 'CityOperator' in request.GET:
cityoperator = CityOperator.objects.filter(address__province=user.province)
serializer = CityOperatorSerializer(cityoperator, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
elif 'ProvinceOperator' in request.GET:
operator = SystemUserProfile.objects.filter(role__name='ProvinceOperator',
province=user.province)
provinceoperator = ProvinceOperator.objects.filter(user=operator.last())
serializer = ProvinceOperatorSerializer(provinceoperator, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
elif 'ProvinceFinancial' in request.GET:
operator = SystemUserProfile.objects.filter(role__name='ProvinceFinancial',
province=user.province)
provincefinancial = ProvinceOperator.objects.filter(user=operator.last())
serializer = ProvinceOperatorSerializer(provincefinancial, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
elif 'ProvinceInspector' in request.GET:
provinceinspector = InspectorOperator.objects.filter(address__province=user.province)
serializer = InspectorOperatorSerializer(provinceinspector, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
elif 'KillHouse' in request.GET:
killhouse = KillHouse.objects.filter(system_address__province=user.province)
serializer = KillHouseSerializer(killhouse, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
elif 'KillHouseVet' in request.GET:
killhousevet = KillHouseVet.objects.filter(kill_house__system_address__province=user.province)
serializer = KillHouseVetSerializer(killhousevet, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
# elif 'VetFarm' in request.GET:
#
# vetfarm = SystemUserProfile.objects.filter(role__name='VetFarm',
# province=user.province)
# serializer = self.serializer_class(vetfarm, many=True)
# return Response(serializer.data, status=status.HTTP_200_OK)
elif 'Driver' in request.GET:
driver = KillHouseDriver.objects.filter(address_province=user.province)
serializer = KillHouseDriverSerializer(driver, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
class TotalSystemUserProfileStatisticsDashboardViewSet(viewsets.ModelViewSet):
queryset = SystemUserProfile.objects.all()
serializer_class = SystemUserProfileSerializer
permission_classes = [AllowAny]
def list(self, request, *args, **kwargs):
users = SystemUserProfile.objects.filter().only('user_id')
guilds = Guilds.objects.filter(trash=False)
poultrys = Poultry.objects.filter(trash=False).only('user_id')
price = Pricing.objects.filter(trash=False).last()
if 'role' in request.GET:
if request.GET['role'] == 'CityOperator':
user = SystemUserProfile.objects.get(user=request.user)
city_operator = CityOperator.objects.get(trash=False, user=user)
poultries = poultrys.filter(city_operator=city_operator.unit_name)
elif request.GET['role'] in ['CityJahad', 'CityPoultry']:
user = SystemUserProfile.objects.get(user=request.user)
poultries = poultrys.filter(address__city=user.city)
else:
poultries = poultrys
else:
poultries = poultrys
return Response({
"users": users.count(),
"poultries": poultries.count(),
"guilds": guilds.count(),
})
class TotalPricingStatisticsDashboardViewSet(viewsets.ModelViewSet):
queryset = Pricing.objects.all()
serializer_class = PricingSerializer
permission_classes = [AllowAny]
def list(self, request, *args, **kwargs):
price = Pricing.objects.filter(trash=False).last()
return Response(
{"last_price": price.live_chicken_price, "last_change": str(price.modify_date.date())}
)
class ShowSystemUserProfileViewSet(viewsets.ModelViewSet):
queryset = SystemUserProfile.objects.all()
serializer_class = SystemUserProfileSerializer
permission_classes = [TokenHasReadWriteScope]
# تابع مربوط به نمایش اطلاعات پروفایل کاربر
def list(self, request, *args, **kwargs):
refresh(request.user.id)
if 'role' in request.GET:
queryset = self.queryset.filter(role__name__exact=request.GET['role'])
if queryset.count() > 0:
serializer = UserProfileSerializer(queryset, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
else:
return Response([], status=status.HTTP_200_OK)
else:
users_info = []
for user in SystemUserProfile.objects.all().exclude(role__isnull=True):
city = user.city.name if user.city != None else None
province = user.province.name if user.province != None else None
for role in user.role.all():
if role.name == 'KillHouse':
oprator = KillHouseOperator.objects.get(user=user)
kill_house_wallet = oprator.wallet
creditor = 0
debtor = 0
penalty = 0
deposit = 0
for i in Itransaction.objects.filter(wallet=kill_house_wallet):
if i.transaction_type == 'creditor':
creditor += i.transfer_amount
elif i.transaction_type == 'debtor':
debtor += i.transfer_amount
elif i.transaction_type == 'penalty':
penalty += i.transfer_amount
elif i.transaction_type == 'deposit':
deposit += i.transfer_amount
internal_dict = {
"base_orde": user.base_order,
"fullname": user.fullname,
"id": user.id,
"role": role.name,
"mobile": user.mobile,
"national_id": user.national_id,
"wallet_key": oprator.wallet.key,
"inventory": oprator.wallet.inventory,
"city": city,
"province": province,
"creditor": creditor,
"debtor": debtor,
"penalty": penalty,
"deposit": deposit,
"depositable": (creditor + deposit) - (debtor + penalty)
}
users_info.append(internal_dict)
elif role.name == 'Poultry':
poultry_wallet = Poultry.objects.get(user=user).wallet
creditor = 0
debtor = 0
penalty = 0
deposit = 0
for i in Itransaction.objects.filter(wallet=poultry_wallet):
if i.transaction_type == 'creditor':
creditor += i.transfer_amount
elif i.transaction_type == 'debtor':
debtor += i.transfer_amount
elif i.transaction_type == 'penalty':
penalty += i.transfer_amount
elif i.transaction_type == 'deposit':
deposit += i.transfer_amount
internal_dict = {
"base_orde": user.base_order,
"fullname": user.fullname,
"id": user.id,
"role": role.name,
"mobile": user.mobile,
"wallet_key": poultry_wallet.key,
"national_id": user.national_id,
"province": province,
"city": city,
"creditor": creditor,
"debtor": debtor,
"penalty": penalty,
"deposit": deposit,
"depositable": (creditor + deposit) - (debtor + penalty)
}
users_info.append(internal_dict)
elif role.name == 'CityOperator':
city_wallet = CityOperator.objects.get(user=user).wallet
creditor = 0
debtor = 0
penalty = 0
deposit = 0
for i in Itransaction.objects.filter(wallet=city_wallet):
if i.transaction_type == 'creditor':
creditor += i.transfer_amount
elif i.transaction_type == 'debtor':
debtor += i.transfer_amount
elif i.transaction_type == 'penalty':
penalty += i.transfer_amount
elif i.transaction_type == 'deposit':
deposit += i.transfer_amount
internal_dict = {
"base_orde": user.base_order,
"fullname": user.fullname,
"id": user.id,
"role": role.name,
"mobile": user.mobile,
"wallet_key": city_wallet.key,
"national_id": user.national_id,
"province": province,
"city": city,
"creditor": creditor,
"debtor": debtor,
"penalty": penalty,
"depositable": (creditor + deposit) - (debtor + penalty)
}
users_info.append(internal_dict)
elif role.name == 'ProvinceOperator':
province_wallet = ProvinceOperator.objects.get(user=user).wallet
creditor = 0
debtor = 0
penalty = 0
deposit = 0
for i in Itransaction.objects.filter(wallet=province_wallet):
if i.transaction_type == 'creditor':
creditor += i.transfer_amount
elif i.transaction_type == 'debtor':
debtor += i.transfer_amount
elif i.transaction_type == 'penalty':
penalty += i.transfer_amount
elif i.transaction_type == 'deposit':
deposit += i.transfer_amount
internal_dict = {
"base_orde": user.base_order,
"fullname": user.fullname,
"id": user.id,
"role": role.name,
"mobile": user.mobile,
"wallet_key": province_wallet.key,
"national_id": user.national_id,
"province": province,
"city": city,
"creditor": creditor,
"debtor": debtor,
"penalty": penalty,
"deposit": deposit,
"depositable": (creditor + deposit) - (debtor + penalty)
}
users_info.append(internal_dict)
elif role.name == 'ProvinceInspector':
inspector_wallet = InspectorOperator.objects.get(user=user).wallet
creditor = 0
debtor = 0
penalty = 0
deposit = 0
for i in Itransaction.objects.filter(wallet=inspector_wallet):
if i.transaction_type == 'creditor':
creditor += i.transfer_amount
elif i.transaction_type == 'debtor':
debtor += i.transfer_amount
elif i.transaction_type == 'penalty':
penalty += i.transfer_amount
elif i.transaction_type == 'deposit':
deposit += i.transfer_amount
internal_dict = {
"base_orde": user.base_order,
"fullname": user.fullname,
"id": user.id,
"role": role.name,
"mobile": user.mobile,
"wallet_key": inspector_wallet.key,
"national_id": user.national_id,
"province": province,
"city": city,
"creditor": creditor,
"debtor": debtor,
"penalty": penalty,
"deposit": deposit,
"depositable": (creditor + deposit) - (debtor + penalty)
}
users_info.append(internal_dict)
elif role.name == 'ProvinceFinancial':
financial_wallet = ProvinceOperator.objects.get(user=user).wallet
creditor = 0
debtor = 0
penalty = 0
deposit = 0
for i in Itransaction.objects.filter(wallet=financial_wallet):
if i.transaction_type == 'creditor':
creditor += i.transfer_amount
elif i.transaction_type == 'debtor':
debtor += i.transfer_amount
elif i.transaction_type == 'penalty':
penalty += i.transfer_amount
elif i.transaction_type == 'deposit':
deposit += i.transfer_amount
internal_dict = {
"base_orde": user.base_order,
"fullname": user.fullname,
"id": user.id,
"role": role.name,
"mobile": user.mobile,
"wallet_key": financial_wallet.key,
"national_id": user.national_id,
"province": province,
"city": city,
"creditor": creditor,
"debtor": debtor,
"penalty": penalty,
"deposit": deposit,
"depositable": (creditor + deposit) - (debtor + penalty)
}
users_info.append(internal_dict)
elif role.name == 'Driver':
driver_wallet = KillHouseDriver.objects.get(user=user).wallet
creditor = 0
debtor = 0
penalty = 0
deposit = 0
for i in Itransaction.objects.filter(wallet=driver_wallet):
if i.transaction_type == 'creditor':
creditor += i.transfer_amount
elif i.transaction_type == 'debtor':
debtor += i.transfer_amount
elif i.transaction_type == 'penalty':
penalty += i.transfer_amount
elif i.transaction_type == 'deposit':
deposit += i.transfer_amount
internal_dict = {
"base_orde": user.base_order,
"fullname": user.fullname,
"id": user.id,
"role": role.name,
"mobile": user.mobile,
"wallet_key": driver_wallet.key,
"national_id": user.national_id,
"province": province,
"city": city,
"creditor": creditor,
"debtor": debtor,
"penalty": penalty,
"deposit": deposit,
"depositable": (creditor + deposit) - (debtor + penalty)
}
users_info.append(internal_dict)
elif role.name == 'KillHouseVet':
kill_house_vet_wallet = Vet.objects.get(user=user).wallet
creditor = 0
debtor = 0
penalty = 0
deposit = 0
for i in Itransaction.objects.filter(wallet=kill_house_vet_wallet):
if i.transaction_type == 'creditor':
creditor += i.transfer_amount
elif i.transaction_type == 'debtor':
debtor += i.transfer_amount
elif i.transaction_type == 'penalty':
penalty += i.transfer_amount
elif i.transaction_type == 'deposit':
deposit += i.transfer_amount
internal_dict = {
"base_orde": user.base_order,
"fullname": user.fullname,
"id": user.id,
"role": role.name,
"mobile": user.mobile,
"wallet_key": kill_house_vet_wallet.key,
"national_id": user.national_id,
"province": province,
"city": city,
"creditor": creditor,
"debtor": debtor,
"penalty": penalty,
"deposit": deposit,
"depositable": (creditor + deposit) - (debtor + penalty)
}
users_info.append(internal_dict)
return Response(users_info, status=status.HTTP_200_OK)
# class StandardResultsSetPagination(PageNumberPagination):
# page_size = 2
# page_size_query_param = 'page_size'
# max_page_size = 1000
object_classes_total = {
'Poultry': Poultry,
'CityOperator': CityOperator,
'ProvinceOperator': ProvinceOperator,
'KillHouse': KillHouse,
'ProvinceInspector': InspectorOperator,
'ProvinceFinancial': ProvinceOperator,
'Vet': Vet,
'Jahad': Jahad,
'CityJahad': CityJahad,
'Driver': KillHouseDriver,
'Admin': Admin,
'VetFarm': Vet,
'KillHouseVet': KillHouseVet,
'VetSupervisor': VetSupervisor,
'ProvincialGovernment': ProvincialGovernment,
}
serializer_object_classes_total = {
'Poultry': PoultryForAllUserSerializer,
'CityOperator': CityOperatorForAllUserSerializer,
'ProvinceOperator': ProvinceOperatorForAllUserSerializer,
'KillHouse': KillHouseForAllUserSerializer,
# 'KillHouse': KillHouseOperatorForAllUserSerializer,
'ProvinceInspector': InspectorOperatorForAllUserSerializer,
'ProvinceFinancial': ProvinceOperatorForAllUserSerializer,
'Vet': VetForAllUserSerializer,
'Jahad': JahadForAllUserSerializer,
'CityJahad': CityJahadForAllUserSerializer,
'Driver': KillHouseDriverForAllUserSerializer,
'Admin': AdminForAllUserSerializer,
'VetFarm': VetForAllUserSerializer,
'KillHouseVet': KillHouseVetForAllUserSerializer,
'VetSupervisor': VetSupervisorForAllUserSerializer,
'ProvincialGovernment': ProvincialGovernmentForAllUserSerializer,
}
def get_data_list(user):
data_list = []
for item in user.role.all():
object_class = object_classes_total.get(item.name)
serializer = serializer_object_classes_total.get(item.name)
if object_class and serializer:
if item.name == 'KillHouseVet':
query = object_class.objects.filter(vet__user=user)
elif item.name == 'KillHouse':
query = object_class.objects.filter(kill_house_operator__user=user)
else:
query = object_class.objects.filter(user=user)
if query.exists():
for queries in query:
data_list.append({
"role_name": item.name,
"details": serializer(queries).data
})
return data_list
class SystemUserProfileViewSet(viewsets.ModelViewSet):
queryset = SystemUserProfile.objects.all()
serializer_class = SystemUserProfileSerializer
permission_classes = [AllowAny]
pagination_class = CustomPagination
filter_backends = [DjangoFilterBackend]
filterset_class = ProfileFilterSet
filterset_fields = [
'base_order',
'mobile',
'fullname',
'first_name',
'last_name',
'city__name',
]
object_classes = {
'Poultry': Poultry,
'CityOperator': CityOperator,
'ProvinceOperator': ProvinceOperator,
'KillHouse': KillHouseOperator,
'ProvinceInspector': InspectorOperator,
'ProvinceFinancial': ProvinceOperator,
'Vet': Vet,
'Jahad': ProvinceOperator,
'Driver': KillHouseDriver,
'PoultryTenant': PoultryTenant,
'VetFarm': Vet,
'Guilds': Guilds,
'Steward': Guilds,
'KillHouseVet': KillHouseVet
}
serializer_object_classes = {
'Poultry': PoultrySerializer,
'CityOperator': CityOperatorSerializer,
'ProvinceOperator': ProvinceOperatorSerializer,
'Guilds': GeneralGuildsSerializer,
'Steward': GeneralGuildsSerializer,
'KillHouse': KillHouseOperatorSerializer,
'ProvinceInspector': InspectorOperatorSerializer,
'ProvinceFinancial': ProvinceOperatorSerializer,
'Vet': VetSerializer,
'Jahad': ProvinceOperatorSerializer,
'Driver': KillHouseDriverSerializer,
# 'PoultryTenant': PoultryTenant,
'VetFarm': VetSerializer,
'KillHouseVet': KillHouseVetSerializer
}
def list(self, request, *args, **kwargs):
user = SystemUserProfile.objects.get(user=request.user, trash=False)
if 'self-profile' in request.GET:
userprofile = SystemUserProfile.objects.get(user=request.user)
serializer = self.serializer_class(userprofile)
return Response(serializer.data, status=status.HTTP_200_OK)
elif 'city_users' in request.GET:
out_list = [] # contains out put list
users = []
city_operator = CityOperator.objects.get(user=SystemUserProfile.objects.get(user=request.user))
city = city_operator.address.city
city_unit_list = []
city_units = CityUnit.objects.filter(city=city)
for city in city_units:
city_unit_list.append(city.name)
for u in SystemUserProfile.objects.filter(role__name='Poultry', city__name__in=city_unit_list):
users.append(u)
for user_without_role in SystemUserProfile.objects.filter(city__name__in=city_unit_list):
if len(user_without_role.role.all()) == 0:
users.append(user_without_role)
for user in users:
out_list.append({'profile': self.serializer_class(user).data})
return Response(out_list, status=status.HTTP_200_OK)
elif 'users_info' in request.GET:
# inspector = InspectorOperator.objects.get(user=SystemUserProfile.objects.get(user=request.user))
user = SystemUserProfile.objects.get(user=request.user, trash=False)
userprofile_list = []
province = user.province
out_put = [] # contains out put list
role = request.GET['roles'].split(',') if request.GET['roles'] != "" else None
if role != None:
userprofile = SystemUserProfile.objects.filter(role__name__in=role, province=province, trash=False)
else:
userprofile = SystemUserProfile.objects.filter(province=province, trash=False).exclude(
role__name='SuperAdmin') # contains userprofile object
if 'search' in request.GET:
if request.GET['search'] == 'filter':
if request.GET['value'] != "":
for item in self.filterset_fields:
query = QueryDict('{0}__contains={1}'.format(item, request.GET['value']))
if (self.filterset_class(
data=query,
queryset=userprofile
)
).filter():
ps = self.filterset_class(data=query, queryset=userprofile)
userprofile_list = ps.filter()
userprofile = [] if len(userprofile_list) == 0 else userprofile_list
# if request.GET['search'] == 'filter':
# if request.GET['value'] != "":
# for item in self.filterset_fields:
# query = QueryDict('{0}__contains={1}'.format(item, request.GET['value']))
# if (self.filterset_class(
# data=query,
# queryset=userprofile
# )
# ).filter():
# ps = self.filterset_class(data=query, queryset=userprofile)
# userprofile_list = ps.filter()
# userprofile = [] if len(userprofile_list) == 0 else userprofile_list
page_size = request.query_params.get('page_size', None)
if page_size:
self.pagination_class.page_size = int(page_size)
page = self.paginate_queryset(userprofile)
if page is not None:
serializer = self.serializer_class(page, many=True)
return self.get_paginated_response(serializer.data)
serializer = self.serializer_class(userprofile, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
# for user in userprofile:
# out_put.append({'profile': self.serializer_class(user).data})
# return Response(out_put, status=status.HTTP_200_OK)
elif 'users_base_info' in request.GET:
users = SystemUserProfile.objects.filter(province=user.province, trash=False)
serializer_base_info = SystemUserProfileBaseInfoSerializer(users, many=True)
return Response(serializer_base_info.data, status=status.HTTP_200_OK)
elif 'all_users' in request.GET:
user = self.queryset.get(key=request.GET['userprofile_key'])
data_list = get_data_list(user)
return Response(data_list, status=status.HTTP_200_OK)
# return super().list(request, *args, **kwargs)
# if 'page' in request.GET:
# end = int(request.GET['page']) * 3
# start = end - 3
def retrieve(self, request, *args, **kwargs):
refresh(request.user.id)
user = self.queryset.get(key=request.GET['userprofile_key']) # contains user profile object
data_list = [] # contains list of roles data
role_list = [] # contains list of roles names
# iterate in user roles
if user.role is not None:
for item in user.role.all():
if item.name == 'Admin':
continue
object_class = self.object_classes[item.name] # contains related class object to role
if item.name == 'KillHouseVet':
if object_class.objects.filter(vet__user=user).exists():
query = object_class.objects.filter(vet__user=user) # contains query objects
for queries in query:
serializer = self.serializer_object_classes[
item.name] # contains related serializer to role
data_list.append({item.name: serializer(queries).data})
role_list.append(item.name)
else:
if object_class.objects.filter(user=user).exists():
query = object_class.objects.filter(user=user) # contains query objects
for queries in query:
serializer = self.serializer_object_classes[
item.name] # contains related serializer to role
data_list.append({item.name: serializer(queries).data})
role_list.append(item.name)
serializer = self.serializer_class(user)
return Response({
'profile': serializer.data,
'roles_data': data_list,
'roles_list': role_list
},
status=status.HTTP_200_OK
)
# if user does not exists
else:
return Response(status=status.HTTP_409_CONFLICT)
def create(self, request, *args, **kwargs):
refresh(request.user.id)
if 'userprofile_key' in request.data.keys():
person = SystemUserProfile.objects.get(key=request.data['userprofile_key'])
else:
person = None
edit_type = request.data['type']
request.data.pop('type')
if edit_type == 'check_user':
# if user exists in system
if self.queryset.filter(
mobile=request.data['value']
).exists() or self.queryset.filter(
national_id=request.data['value']
).exists() or self.queryset.filter(
base_order=request.data['value']
).exists():
if self.queryset.filter(
mobile=request.data['value']
).exists():
# contains user object
user = self.queryset.get(
mobile=request.data['value'],
)
if self.queryset.filter(
national_id=request.data['value']
).exists():
# contains user object
user = self.queryset.get(
national_id=request.data['value'],
)
if self.queryset.filter(
base_order=request.data['value']
).exists():
# contains user object
user = self.queryset.get(
base_order=request.data['value'],
)
data_list = [] # contains list of roles data
role_list = [] # contains list of roles names
# iterate in user roles
if user.role is not None:
for item in user.role.all():
if item.name == 'Admin':
continue
object_class = self.object_classes[item.name] # contains related class object to role
if item.name == 'KillHouseVet':
if object_class.objects.filter(vet__user=user).exists():
query = object_class.objects.filter(vet__user=user) # contains query objects
for queries in query:
serializer = self.serializer_object_classes[
item.name] # contains related serializer to role
data_list.append({item.name: serializer(queries).data})
role_list.append(item.name)
else:
if object_class.objects.filter(user=user).exists():
query = object_class.objects.filter(user=user) # contains query objects
for queries in query:
serializer = self.serializer_object_classes[
item.name] # contains related serializer to role
data_list.append({item.name: serializer(queries).data})
role_list.append(item.name)
serializer = self.serializer_class(user)
return Response({
'profile': serializer.data,
'roles_data': data_list,
'roles_list': role_list
},
status=status.HTTP_200_OK
)
# if user does not exists
else:
url = 'https://userbackend.rasadyar.com/user_identity/'
# url = 'https://artasystemback.sstit.ir/user_identity/'
headers = {
"Authorization": str(request.headers['Authorization']),
"Content-Type": "application/json"
}
request.data['type'] = edit_type
req = requests.post(
url=url,
data=json.dumps(request.data),
headers=headers,
verify=False
)
if req.status_code == 200:
return Response(req.json(), status=status.HTTP_200_OK)
else:
return Response(status=status.HTTP_409_CONFLICT)
if edit_type == 'profile':
# create user object
if not User.objects.filter(username=request.data['mobile']).exists():
user = User(username=request.data['mobile'])
else:
return Response({"result": "کاربر قبلا ثیت شده است !"}, status=status.HTTP_403_FORBIDDEN)
# register user to base system
data = {
"username": request.data['mobile'],
"password": request.data['password'],
"first_name": request.data['first_name'],
"last_name": request.data['last_name'],
"national_code": request.data['national_code'],
"api_key": PROJECT_API_KEY,
}
req = requests.post(
url=ARTA_URL_REGISTER,
data=data,
verify=False
)
if req.status_code == 200:
# set password for user by admin
if request.data['password'] != "":
password = request.data['password']
user.password = cryptocode.encrypt(password, password)
user.save()
# get city object
city = City.objects.get(
key=request.data['city']
)
request.data.pop('city')
# get province object
province = Province.objects.get(
key=request.data['province']
)
request.data.pop('province')
# upload user image
req = upload_image(req=request, field='image')
# send request data to serializer
serializer = self.serializer_class(data=req.data)
base_order = SystemUserProfile.objects.all()
if base_order.count():
base_order = base_order.last().base_order + 1
else:
base_order = 1000
if serializer.is_valid():
userprofile_object = serializer.create(validated_data=req.data)
userprofile_object.city = city
userprofile_object.province = province
userprofile_object.user = user
userprofile_object.password = password
userprofile_object.base_order = base_order
userprofile_object.save()
serializer = self.serializer_class(userprofile_object)
return Response(serializer.data, status=status.HTTP_201_CREATED)
else:
return Response({"result": "کاربر قبلا ثیت شده است !"}, status=status.HTTP_400_BAD_REQUEST)
if edit_type == "Poultry":
# poultry owner object
user = self.queryset.get(key=request.data['owner_key'])
for poultry_items in request.data['poultry_list']:
# if poultry exists show response
if Poultry.objects.filter(breeding_unique_id=poultry_items['breeding_unique_id']).exists():
return Response({"result": "مرغداری قبلا ثبت شده است !"}, status=status.HTTP_403_FORBIDDEN)
if poultry_items['address'] != "" or poultry_items['address'] is not None:
# Create Address Object
city = City.objects.get(key=poultry_items['address']['city_key']) # contain city object
poultry_items['address'].pop('city_key')
# contains province object
province = Province.objects.get(key=poultry_items['address']['province_key'])
poultry_items['address'].pop('province_key')
# object created
address = SystemAddress.objects.create(**poultry_items['address'])
address.city = city
address.province = province
address.save()
poultry_items.pop('address') # remove address key from data
else:
address = None
if poultry_items['user_bank_info'] != "" or poultry_items['user_bank_info'] is not None:
# Create Bank Card Object
bank_info = BankCard.objects.create(**poultry_items['user_bank_info'])
poultry_items.pop('user_bank_info')
else:
bank_info = None
wallet = Wallet()
wallet.save()
# tenant user key
if 'tenant_key' in poultry_items.keys():
tenant_key = poultry_items['tenant_key']
poultry_items.pop('tenant_key')
else:
tenant_key = ""
# send data to serializer to create poultry
serializer = PoultrySerializer(data=poultry_items)
if serializer.is_valid():
poultry_object = serializer.create(validated_data=poultry_items)
poultry_object.user = user
poultry_object.incubation_date = datetime.datetime.now()
poultry_object.address = address
poultry_object.user_bank_info = bank_info
poultry_object.wallet = wallet
poultry_object.save()
create_province_allow_poultry_choose_kill_house = ProvinceAllowPoultryChooseKillHouse(
poultry=poultry_object)
create_province_allow_poultry_choose_kill_house.save()
owner_poultry = Poultry.objects.get(key=poultry_object.key) # contains poultry owner object
else:
return Response({"result": "وارد کردن تمامی مقادیر الزامیست! "}, status=status.HTTP_403_FORBIDDEN)
if tenant_key != "":
# get tenant user object
tenant_user = self.queryset.get(key=tenant_key)
owner_poultry.has_tenant = True
owner_poultry.save()
# Copy Poultry Object and Create New One
poultry_object.pk = None
poultry_object.key = uuid.uuid4()
poultry_object.user = tenant_user
poultry_object.save() # save copied object
poultry_object.owner = owner_poultry
poultry_object.wallet = wallet
poultry_object.save()
user.role.add(Group.objects.get(name='Poultry'))
return Response(status=status.HTTP_201_CREATED)
if edit_type == "CityOperator":
# if person != None:
# city_unit = CityUnit.objects.get(name=person.city.name)
# if CityOperator.objects.filter(address__city__name=city_unit.city.name).exists():
# return Response({"msg": "exist"}, status=status.HTTP_406_NOT_ACCEPTABLE)
serializer = create_except_profile(
request=request,
queryset=CityOperator,
serializer=CityOperatorSerializer,
role=edit_type
)
return Response(serializer[0], status=serializer[1])
if edit_type == "ProvinceOperator":
if person != None:
province_operator = SystemUserProfile.objects.filter(role__name='ProvinceOperator',
province=person.province)
if province_operator.count() > 0:
if ProvinceOperator.objects.filter(user=province_operator.last()).exists():
return Response({"msg": "exist"}, status=status.HTTP_406_NOT_ACCEPTABLE)
if SystemUserProfile.objects.filter(role__name='ProvinceFinancial', province=person.province,
key=person.key).exists():
group = Group.objects.get(name=edit_type)
person.role.add(group)
return Response(status=status.HTTP_201_CREATED)
else:
serializer = create_except_profile(
request=request,
queryset=ProvinceOperator,
serializer=ProvinceOperatorSerializer,
role=edit_type
)
return Response(serializer[0], status=serializer[1])
if edit_type == "ProvinceFinancial":
if person != None:
province_operator = SystemUserProfile.objects.filter(role__name='ProvinceFinancial',
province=person.province)
if province_operator.count() > 0:
if ProvinceOperator.objects.filter(user=province_operator.last()).exists():
return Response({"msg": "exist"}, status=status.HTTP_406_NOT_ACCEPTABLE)
if SystemUserProfile.objects.filter(role__name='ProvinceOperator', province=person.province,
key=person.key).exists():
group = Group.objects.get(name=edit_type)
person.role.add(group)
return Response(status=status.HTTP_201_CREATED)
else:
serializer = create_except_profile(
request=request,
queryset=ProvinceOperator,
serializer=ProvinceOperatorSerializer,
role=edit_type
)
return Response(serializer[0], status=serializer[1])
if edit_type == "KillHouse":
# contains kill house data
kill_house_data = request.data['killhouse_data']
request.data.pop('killhouse_data')
if 'address' in request.data.keys():
if request.data['address'] == "":
request.data.pop('address')
if 'postal_code' in request.data.keys():
if request.data['postal_code'] == "":
request.data.pop('postal_code')
serializer = create_except_profile(
request=request,
queryset=KillHouseOperator,
serializer=KillHouseOperatorSerializer,
role=edit_type
)
for items in kill_house_data:
if items['address'] != "" or items['address'] is not None:
# Create Address Object
city = City.objects.get(key=items['address']['city_key']) # contain city object
items['address'].pop('city_key')
# contains province object
province = Province.objects.get(key=items['address']['province_key'])
items['address'].pop('province_key')
if items['address']['postal_code'] == "":
items['address'].pop('postal_code')
# object created
address = SystemAddress.objects.create(**items['address'])
address.city = city
address.province = province
address.save()
items.pop('address') # remove address key from data
else:
address = None
if 'user_bank_info' in items.keys():
items.pop('user_bank_info')
# send data to serializer to create poultry
if 'capacity' in items.keys():
if items['capacity'] == "":
items.pop('capacity')
if 'name' in items.keys():
if items['name'] == "":
items.pop('name')
if 'phone' in items.keys():
if items['phone'] == "":
items.pop('phone')
kill_house_serializer = KillHouseSerializer(data=items)
if kill_house_serializer.is_valid():
kill_house_object = kill_house_serializer.create(validated_data=items)
kill_house_object.system_address = address
kill_house_object.kill_house_operator = serializer[2]
kill_house_object.save()
create_choose_steward_guilds = ProvinceAllowKillHouseChooseStewardGuilds(
kill_house=kill_house_object)
create_choose_steward_guilds.save()
percentage = KillHousePercentage(kill_house=kill_house_object)
percentage.save()
province_allow_kill_house_choose_steward_guilds = ProvinceAllowKillHouseChooseStewardGuilds(
kill_house=kill_house_object)
province_allow_kill_house_choose_steward_guilds.save()
province_allow_direct_buying = ProvinceAllowKillHouseDirectBuying(kill_house=kill_house_object)
province_allow_direct_buying.save()
return Response(status=status.HTTP_201_CREATED)
if edit_type == "KillHouseVet":
# get kill house object
kill_house_object = KillHouse.objects.get(key=request.data['kill_house_key'])
request.data.pop('kill_house_key')
if 'address' in request.data.keys():
if request.data['address'] == "":
request.data.pop('address')
if 'postal_code' in request.data.keys():
if request.data['postal_code'] == "":
request.data.pop('postal_code')
# Create Kill House Vet Object
kill_house_vet = KillHouseVet()
vet = Vet.objects.filter(user=person)
if vet.count() > 0:
vet = vet.last()
kill_house_vet.vet = vet
else:
serializer = create_except_profile(
request=request,
queryset=Vet,
serializer=VetSerializer,
role=edit_type
)
kill_house_vet.vet = serializer[2]
kill_house_vet.kill_house = kill_house_object
kill_house_vet.save()
# send object to serializer
serializer = KillHouseVetSerializer(kill_house_vet)
return Response(serializer.data, status=status.HTTP_201_CREATED)
if edit_type == "Driver":
# get user profile object
userprofile = self.queryset.get(key=request.data['userprofile_key'])
request.data.pop('userprofile_key')
# Create driver Bank Account Information
bank_info_object = BankCard.objects.create(**request.data['user_bank_info'])
request.data.pop('user_bank_info')
# send data to serializer for create object
serializer = KillHouseDriverSerializer(data=request.data)
if serializer.is_valid():
driver_object = serializer.create(validated_data=request.data)
driver_wallet = Wallet()
driver_wallet.save()
driver_object.user = userprofile
driver_object.user_bank_info = bank_info_object
driver_object.wallet = driver_wallet
driver_object.save()
userprofile.role.add(
Group.objects.get(name='Driver')
)
serializer = KillHouseDriverSerializer(driver_object)
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
if edit_type == "VetFarm":
if Vet.objects.filter(user=person).exists():
group = Group.objects.get(name=edit_type)
person.role.add(group)
return Response(status=status.HTTP_201_CREATED)
else:
serializer = create_except_profile(
request=request,
queryset=Vet,
serializer=VetSerializer,
role=edit_type
)
return Response(serializer[0], status=serializer[1])
if edit_type == "ProvinceInspector":
if person != None:
province_operator = SystemUserProfile.objects.filter(role__name='ProvinceInspector',
province=person.province)
if province_operator.count() > 0:
if InspectorOperator.objects.filter(user=province_operator.last()).exists():
return Response({"msg": "exist"}, status=status.HTTP_406_NOT_ACCEPTABLE)
serializer = create_except_profile(
request=request,
queryset=InspectorOperator,
serializer=InspectorOperatorSerializer,
role=edit_type
)
return Response(serializer[0], status=serializer[1])
return Response({"msg": "error"}, status=status.HTTP_403_FORBIDDEN)
def update(self, request, pk=None, *args, **kwargs):
# refresh(request.user.id)
if 'second_mobile_number' in request.data.keys():
user_profile = SystemUserProfile.objects.get(key=request.data['userprofile_key'])
first_mobile_number = user_profile.mobile
second_mobile_number = request.data['second_mobile_number']
request.data.pop('second_mobile_number')
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
)
# return Response(req.status_code)
if req.status_code == 200:
second_mobile_number = second_mobile_number
# request.data.pop('userprofile_key')
user = User.objects.get(id=user_profile.user.id)
user.username = second_mobile_number
user.save()
user_profile.mobile = second_mobile_number
user_profile.save()
# return Response({"result": "شماره تماس با موفقیت ویرایش شد."}, status=status.HTTP_200_OK)
# else:
# return Response({"result": "مشکلی پیش آمده است !"}, status=status.HTTP_200_OK)
if 'last_name' in request.data:
if request.data['last_name'] == "":
request.data.pop('last_name')
if 'national_code' in request.data:
if request.data['national_code'] == "":
request.data.pop('national_code')
if 'national_id' in request.data:
if request.data['national_id'] == "":
request.data.pop('national_id')
edit_type = request.data['type']
request.data.pop('type')
person_type = request.data['person_type']
request.data.pop('person_type')
# edit profile & roles by user
if person_type == 'self':
if edit_type == 'self_profile':
url = 'https://userbackend.rasadyar.com/user_identity/0/'
headers = {
"Authorization": str(request.headers['Authorization']),
"Content-Type": "application/json"
}
# remove null fields from request
request = remove_null_fields(type='req', request=request)
# get profile object
queryset = self.queryset.get(user=request.user)
payload = {
'userprofile_key': str(queryset.key),
'mobile': queryset.mobile,
'first_name': queryset.first_name,
'last_name': queryset.last_name,
'national_id': queryset.national_id,
'national_code': queryset.national_code
}
req = requests.put(
url=url,
data=json.dumps(payload),
headers=headers,
verify=False
)
if req.status_code == 200:
# upload image
req = upload_image(req=request, field='image')
# send data to serializer
serializer = self.serializer_class(data=req.data)
if serializer.is_valid():
obj = serializer.update(validated_data=req.data, instance=queryset)
serializer = self.serializer_class(obj)
return Response(serializer.data, status=status.HTTP_200_OK)
return Response(serializer.errors)
else:
return Response({'msg': 'Bad Request'}, status=status.HTTP_400_BAD_REQUEST)
if edit_type == 'Poultry':
pass
if edit_type == "CityOperator":
serializer = update_except_profile(
model=CityOperator,
serializer=CityOperatorSerializer,
request=request
)
return Response(serializer, status=status.HTTP_200_OK)
if edit_type == "ProvinceOperator":
serializer = update_except_profile(
model=ProvinceOperator,
serializer=ProvinceOperatorSerializer,
request=request
)
return Response(serializer.data, status=status.HTTP_200_OK)
if edit_type == "ProvinceFinancial":
serializer = update_except_profile(
model=ProvinceOperator,
serializer=ProvinceOperatorSerializer,
request=request
)
return Response(serializer.data, status=status.HTTP_200_OK)
if edit_type == "ProvinceInspector":
serializer = update_except_profile(
model=InspectorOperator,
serializer=InspectorOperatorSerializer,
request=request
)
return Response(serializer.data, status=status.HTTP_200_OK)
if edit_type == "KillHouse":
serializer = update_except_profile(
model=KillHouseOperator,
serializer=KillHouseOperatorSerializer,
request=request
)
return Response(serializer.data, status=status.HTTP_200_OK)
if edit_type == "KillHouseVet":
# get kill house object
kill_house_object = KillHouse.objects.get(key=request.data['kill_house_key'])
# get kill house vet object
kill_house_vet_object = KillHouseVet.objects.get(key=request.data['vet_key'])
kill_house_vet_object.kill_house = kill_house_object
kill_house_vet_object.save()
# send object to serializer
serializer = KillHouseVetSerializer(kill_house_vet_object)
return Response(serializer.data, status=status.HTTP_200_OK)
if edit_type == "VetFarm":
serializer = update_except_profile(
model=Vet,
serializer=VetSerializer,
request=request
)
return Response(serializer.data, status=status.HTTP_200_OK)
if edit_type == "Driver":
# get driver object
driver = KillHouseDriver.objects.get(key=request.data['driver_key'])
request.data.pop('driver_key')
# send data to serializer for update
serializer = KillHouseDriverSerializer(data=request.data)
if serializer.is_valid():
driver_update = serializer.update(instance=driver, validated_data=request.data)
serializer = KillHouseDriverSerializer(driver_update)
return Response(serializer.data, status=status.HTTP_200_OK)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
# edit profile & roles by operator
if person_type == 'operator':
if edit_type == 'self_profile':
# remove null fields from request
request = remove_null_fields(type='req', request=request)
# get profile object
queryset = self.queryset.get(key=request.data['userprofile_key'])
request.data.pop('userprofile_key')
# upload image
req = upload_image(req=request, field='image')
# Change Password By Operator
if req.data['password'] != "":
data = {
'username': queryset.mobile,
'password': req.data['password']
}
req_change_pass = requests.post(
url=ARTA_URL_CHANGE_PASSWORD,
data=data,
verify=False
)
if req_change_pass.status_code == 200:
queryset.password = req.data['password']
queryset.save()
req.data.pop('password')
else:
return Response({"Msg": "Password Not Change"}, status=status.HTTP_400_BAD_REQUEST)
else:
req.data.pop('password')
# send data to serializer
serializer = self.serializer_class(data=req.data)
if serializer.is_valid():
# if 'city' in request.data.keys():
# city = City.objects.get(key=request.data['city'])
# request.data.pop('city')
# queryset.city = city
# queryset.save()
obj = serializer.update(validated_data=req.data, instance=queryset)
serializer = self.serializer_class(queryset)
return Response(serializer.data, status=status.HTTP_200_OK)
return Response(serializer.errors)
if edit_type == "CityOperator":
serializer = operator_update_except_profile(
model=CityOperator,
serializer=CityOperatorSerializer,
request=request
)
return Response(serializer.data, status=status.HTTP_200_OK)
if edit_type == "ProvinceOperator":
serializer = operator_update_except_profile(
model=ProvinceOperator,
serializer=ProvinceOperatorSerializer,
request=request
)
return Response(serializer.data, status=status.HTTP_200_OK)
if edit_type == "ProvinceFinancial":
serializer = operator_update_except_profile(
model=ProvinceOperator,
serializer=ProvinceOperatorSerializer,
request=request
)
return Response(serializer.data, status=status.HTTP_200_OK)
if edit_type == "ProvinceInspector":
serializer = operator_update_except_profile(
model=InspectorOperator,
serializer=InspectorOperatorSerializer,
request=request
)
return Response(serializer.data, status=status.HTTP_200_OK)
if edit_type == "Poultry":
serializer = operator_update_except_profile(
model=Poultry,
serializer=PoultrySerializer,
request=request
)
return Response(serializer.data, status=status.HTTP_200_OK)
if edit_type == "KillHouse":
serializer = operator_update_except_profile(
model=KillHouseOperator,
serializer=KillHouseOperatorSerializer,
request=request
)
return Response(serializer.data, status=status.HTTP_200_OK)
if edit_type == "KillHouseVet":
# get kill house object
kill_house_object = KillHouse.objects.get(key=request.data['kill_house_key'])
# get kill house vet object
kill_house_vet_object = KillHouseVet.objects.get(key=request.data['vet_key'])
kill_house_vet_object.kill_house = kill_house_object
kill_house_vet_object.save()
# send object to serializer
serializer = KillHouseVetSerializer(kill_house_vet_object)
return Response(serializer.data, status=status.HTTP_200_OK)
if edit_type == "VetFarm":
serializer = operator_update_except_profile(
model=Vet,
serializer=VetSerializer,
request=request
)
return Response(serializer.data, status=status.HTTP_200_OK)
if edit_type == "Driver":
# get driver object
driver = KillHouseDriver.objects.get(key=request.data['driver_key'])
request.data.pop('driver_key')
# send data to serializer for update
serializer = KillHouseDriverSerializer(data=request.data)
if serializer.is_valid():
if driver.user_bank_info is not None:
bank_serializer = BankCardSerializer(data=request.data['user_bank_info'])
if bank_serializer.is_valid():
bank_object = bank_serializer.update(
instance=driver.user_bank_info,
validated_data=request.data['user_bank_info']
)
driver.user_bank_info = bank_object
else:
bank_serializer = BankCardSerializer(data=request.data['user_bank_info'])
if bank_serializer.is_valid():
bank_object = bank_serializer.create(
validated_data=request.data['user_bank_info']
)
driver.user_bank_info = bank_object
driver.save()
request.data.pop('user_bank_info')
driver_update = serializer.update(instance=driver, validated_data=request.data)
serializer = KillHouseDriverSerializer(driver_update)
return Response(serializer.data, status=status.HTTP_200_OK)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
def destroy(self, request, *args, **kwargs):
refresh(request.user.id)
# contains role class model
role_class = self.object_classes[request.GET['role']]
# get role class object
role_object = role_class.objects.get(key=request.GET['role_data_key'])
# deactivate role class models
if request.GET['type'] == 'Deactivate':
if request.GET['role'] == 'KillHouseVet':
role_object.vet.trash = True # set trash field to False
role_object.vet.save()
if request.GET['role'] == 'VetFarm':
role_object.vet.trash = True # set trash field to False
role_object.vet.save()
role_object.trash = True # set trash field to False
role_object.save()
return Response({'Msg': 'Deactivated'}, status=status.HTTP_200_OK)
# activate role class models
elif request.GET['type'] == 'Activate':
if request.GET['role'] == 'KillHouseVet':
role_object.vet.trash = False # set trash field to False
role_object.vet.save()
if request.GET['role'] == 'VetFarm':
role_object.vet.trash = False # set trash field to False
role_object.vet.save()
role_object.trash = False # set trash field to False
role_object.save()
return Response({'Msg': 'Activated'}, status=status.HTTP_200_OK)
class SystemUserProfileّForFactorProfileViewSet(viewsets.ModelViewSet):
queryset = SystemUserProfile.objects.all()
serializer_class = SystemUserProfileSerializer
permission_classes = [AllowAny]
def update(self, request, pk=None, *args, **kwargs):
user = SystemUserProfile.objects.get(key=request.data['userprofile_key'], trash=False)
request.data.pop('userprofile_key')
serializer = self.serializer_class(user)
serializer.update(instance=user, validated_data=request.data)
return Response(serializer.data, status=status.HTTP_200_OK)
class AdminSystemUserProfileViewSet(viewsets.ModelViewSet):
queryset = SystemUserProfile.objects.all()
serializer_class = SystemUserProfileSerializer
permission_classes = [AllowAny]
def create(self, request, *args, **kwargs):
refresh(request.user.id)
city = City.objects.get(key=request.data['city'])
province = Province.objects.get(key=request.data['province'])
address = request.data['address']
password = request.data['password']
role = Group.objects.get(name=request.data['role']).name
main_address = SystemAddress(city=city, province=province, address=address)
main_address.save()
data = {
"username": request.data['mobile'],
"password": password,
"role": role,
"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['firstname'],
last_name=request.data['lastname']
)
user.save()
base_id = SystemUserProfile.objects.all().last()
system_profile = SystemUserProfile(
mobile=request.data['mobile'],
fullname=request.data['firstname'] + " " + request.data['lastname'],
user=user,
birthday=request.data['birthday'],
national_id=request.data['national_id'],
city=city,
province=province,
base_order=int(base_id.base_order) + 1,
password=password
)
system_profile.save()
system_profile.role.add(role)
system_profile.save()
if role == 'CityOperator':
city_operator = CityOperator(user=system_profile, address=main_address)
city_operator.save()
elif role == 'ProvinceOperator' or role == 'ProvinceFinancial':
province_operator = ProvinceOperator(user=system_profile, address=main_address)
province_operator.save()
elif role == 'ProvinceInspector':
province_inspector = InspectorOperator(user=system_profile, address=main_address)
province_inspector.save()
elif role == 'KillHouse':
kill_house_operator = KillHouseOperator(user=system_profile, address=main_address)
kill_house_operator.save()
kill_house = KillHouse(
kill_house_operator=kill_house_operator,
system_address=main_address,
name=request.data['name'],
capacity=request.data['capacity'],
phone=request.data['phone'],
)
kill_house.save()
elif role == 'KillHouseVet':
vet = Vet(user=system_profile, address=main_address)
vet.save()
kill_house = KillHouse.objects.get(key=request.data['kill_house_key'])
kill_house_vet = KillHouseVet(vet=vet, kill_house=kill_house)
kill_house_vet.save()
# elif role == 'KillHouseVet':
class CheckChickenQuntityViewSet(viewsets.ModelViewSet):
queryset = UserProfile.objects.all()
serializer_class = UserProfileSerializer
permission_classes = [TokenHasReadWriteScope]
def list(self, request, *args, **kwargs):
refresh(request.user.id)
info_list = []
users = UserProfile.objects.all()
now = datetime.datetime.now() + timedelta(days=6)
for i in range(10, 13):
count = 0
poultry = []
for user in users:
age = (now - user.hatching_date).days
if i == age:
poultry.append({
'full_name': user.fullname,
'quantity': user.number_of_incubators
})
count += user.number_of_incubators
internal_dict_info = {'age': i,
'count': count,
'weight': count * 3}
internal_dict_info.update({'users': poultry})
info_list.append(internal_dict_info)
return Response(info_list)
# ویوست مربوط اطلاعات حساب بانکی کاربر
class BankCardViewSet(viewsets.ModelViewSet):
queryset = BankCard.objects.all()
serializer_class = BankCardSerializer
permission_classes = [TokenHasReadWriteScope]
# تابع مربوط به ثبت اطلاعات حساب بانکی کاربر
def create(self, request, *args, **kwargs):
# refresh(request.user.id)
user = SystemUserProfile.objects.get(user=request.user)
serializer = self.serializer_class(data=request.data)
if serializer.is_valid():
bank_card = serializer.create(validated_data=request.data)
if 'role' in request.GET:
if request.GET['role'] == 'Poultry':
poultry = Poultry.objects.get(key=request.data['key'])
poultry.user_bank_info = bank_card
poultry.save()
elif request.GET['role'] == 'CityOperator':
city_operator = CityOperator.objects.get(user=user)
city_operator.user_bank_info = bank_card
city_operator.save()
elif request.GET['role'] == 'ProvinceFinancial':
province_operator = ProvinceOperator.objects.get(user=user)
province_operator.user_bank_info = bank_card
province_operator.save()
elif request.GET['role'] == 'KillHouse':
kill_house_operator = KillHouseOperator.objects.get(user=user)
kill_house_operator.user_bank_info = bank_card
kill_house_operator.save()
elif request.GET['role'] == 'Vet':
vet = Vet.objects.get(user=user)
vet.user_bank_info = bank_card
vet.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors)
# تابع مربوط به ویرایش اطلاعات حساب بانکی کاربر
def update(self, request, pk=None, *args, **kwargs):
# refresh(request.user.id)
bank_card = BankCard.objects.get(key__exact=request.data["key"])
request.data.pop('key')
bank_card.save()
serializer = self.serializer_class(bank_card)
serializer.update(instance=bank_card, validated_data=request.data)
return Response(serializer.data, status=status.HTTP_200_OK)
class ProvinceChangeBankCardViewSet(viewsets.ModelViewSet):
queryset = BankCard.objects.all()
serializer_class = BankCardSerializer
permission_classes = [TokenHasReadWriteScope]
# تابع مربوط به ثبت اطلاعات حساب بانکی کاربر
def create(self, request, *args, **kwargs):
# refresh(request.user.id)
role = request.data['role']
if role == 'Poultry':
poultry = Poultry.objects.get(key=request.data['poultry_key'], trash=False)
if poultry.user_bank_info != None:
request.data.pop('role')
request.data.pop('poultry_key')
bank_card = BankCard.objects.get(key=poultry.user_bank_info.key)
serializer = self.serializer_class(bank_card)
serializer.update(instance=bank_card, validated_data=request.data)
else:
request.data.pop('role')
request.data.pop('poultry_key')
serializer = self.serializer_class(data=request.data)
if serializer.is_valid():
bank_card = serializer.create(validated_data=request.data)
poultry.user_bank_info = bank_card
poultry.save()
else:
operator = ProvinceOperator.objects.filter(key=request.data['operator_key'], trash=False)
if operator.user_bank_info != None:
request.data.pop('role')
request.data.pop('operator_key')
bank_card = BankCard.objects.get(key=operator.user_bank_info.key)
serializer = self.serializer_class(bank_card)
serializer.update(instance=bank_card, validated_data=request.data)
else:
request.data.pop('role')
request.data.pop('poultry_key')
serializer = self.serializer_class(data=request.data)
if serializer.is_valid():
bank_card = serializer.create(validated_data=request.data)
operator.user_bank_info = bank_card
operator.save()
return Response({"result": "با موفقیت انجام شد"}, status=status.HTTP_200_OK)
# ویوست مربوط آدرس کاربر
class AddressViewSet(viewsets.ModelViewSet):
queryset = Address.objects.all()
serializer_class = AddressSerializer
permission_classes = [TokenHasReadWriteScope]
def list(self, request, *args, **kwargs):
if "key" in request.GET:
add_obj = Address.objects.get(key__exact=request.GET["key"])
serializer = self.serializer_class(add_obj)
return Response(serializer.data, status=status.HTTP_200_OK)
if "title" in request.GET:
add_obj = Address.objects.filter(user_id=request.user.id)
query = [x for x in add_obj]
serializer = self.serializer_class(query, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
else:
queryset = Address.objects.all()
serializer = self.serializer_class(queryset, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
def create(self, request, *args, **kwargs):
serializer = self.serializer_class(data=request.data)
if serializer.is_valid():
address = serializer.create(validated_data=request.data)
address.user = UserProfile.objects.get(user=request.user)
address.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors)
def retrieve(self, request, pk=None, *args, **kwargs):
queryset = Address.objects.get(key__exact=request.GET["key"])
serializer = self.serializer_class(queryset)
return Response(serializer.data, status=status.HTTP_200_OK)
def update(self, request, pk=None, *args, **kwargs):
queryset = Address.objects.get(key__exact=request.GET["key"])
queryset.save()
serializer = self.serializer_class(queryset)
serializer.update(instance=queryset, validated_data=request.data)
return Response(serializer.data, status=status.HTTP_200_OK)
def partial_update(self, request, pk=None, *args, **kwargs):
pass
def destroy(self, request, pk=None, *args, **kwargs):
queryset = Address.objects.get(key__exact=request.GET["wallet_id"])
queryset.trash = True
queryset.save()
return Response(status=status.HTTP_200_OK)
@api_view(['POST'])
@permission_classes([AllowAny])
def new_send_otp(request):
# if request.headers['Origin'] == 'test.sstit.ir':
# return redirect('test.ravandno.ir')
# else:
req = requests.post(
url=ARTA_URL_SEND_OTP,
data=request.data,
verify=False
)
return Response(req.json())
# تابع برای برای بررسی یکسان بودن کد پیامکی استفاده میشود
@api_view(["POST"])
@permission_classes([AllowAny])
def check_otp(request):
req = requests.post(
url=ARTA_URL_CHECK_OTP,
data=request.data,
verify=False
)
return Response(req.json(), status=status.HTTP_200_OK)
@api_view(["POST"])
@permission_classes([TokenHasReadWriteScope])
@authentication_classes([OAuth2Authentication])
def change_password(request):
user = SystemUserProfile.objects.get(user=request.user)
req = requests.post(
url=ARTA_URL_CHANGE_PASSWORD,
data=request.data,
verify=False
)
if req.status_code == 200:
user.password = request.data['password']
user.save()
return Response(req.json(), status=status.HTTP_200_OK)
@api_view(['POST'])
@permission_classes([AllowAny])
def new_register(request):
req = requests.post(
url=ARTA_URL_REGISTER,
data=request.data,
verify=False
)
if req.status_code == 500:
error_message = req.content.decode('utf-8') # Decode response content
return Response(error_message)
if req.status_code == 200:
role = Group.objects.get(name=request.data['role'])
password = request.data['password']
user = User(
username=request.data['username'],
password=cryptocode.encrypt(password, password)
)
user.save()
userprofile = SystemUserProfile(
user=user,
mobile=request.data['username'],
password=password
)
userprofile.base_order = \
1000 if len(SystemUserProfile.objects.all()) == 0 \
else SystemUserProfile.objects.all().order_by('create_date').last().base_order + 1
userprofile.save()
userprofile.role.add(role)
# add tenant for a Poultry
if 'tenant' in request.data.keys():
# Check if has access
if get_authorization_header(request) != "":
# complete UserProfile information
province = Province.objects.get(key=request.data['tenant']['province'])
city = City.objects.get(key=request.data['tenant']['city'])
userprofile.province = province
userprofile.city = city
userprofile.national_code = request.data['tenant']['national_code']
userprofile.first_name = request.data['tenant']['first_name']
userprofile.last_name = request.data['tenant']['last_name']
userprofile.save()
# set the tenant poultry owner
owner_poultry = Poultry.objects.get(key=request.data['tenant']['poultry_key'])
owner_poultry.has_tenant = True
owner_poultry.save()
# create tenant
address = SystemAddress(
city=city,
province=province,
address=request.data['tenant']['address'],
postal_code=request.data['tenant']['postal_code']
)
address.save()
tenant_poultry = Poultry(
user=userprofile,
owner=owner_poultry,
unit_name=owner_poultry.unit_name,
breeding_unique_id=request.data['tenant']['unique_id'],
address=address
)
tenant_poultry.tenant = True
tenant_poultry.save()
serializer = PoultrySerializer(tenant_poultry)
return Response(serializer.data, status=status.HTTP_201_CREATED)
access_token = AccessToken(
token=req.json()['access_token'],
user=user,
expires=req.json()['expire_time'],
scope="read write"
)
access_token.save()
return Response(req.json(), status.HTTP_201_CREATED)
if req.status_code == 400:
return Response({"result": 'کاربر قبلا ثبت شده است !'}, status.HTTP_403_FORBIDDEN)
# @api_view(['POST'])
# @permission_classes([AllowAny])
# def new_login(request):
# if User.objects.filter(username__exact=request.data['username']).exists():
# user = User.objects.get(username__exact=request.data['username'])
# userprofile = SystemUserProfile.objects.get(
# user=user
# )
#
# # for recognize if user role are deactivated can not login
# role_classes = SystemUserProfileViewSet.object_classes
# role_object = role_classes[request.data['role']].objects.filter(user=userprofile)
# for item in role_object:
# if item.trash == False:
# return Response(status=status.HTTP_203_NON_AUTHORITATIVE_INFORMATION)
# # ##########################################################################
#
# roles = []
# for item in userprofile.role.all():
# roles.append(item.name)
# request.data['role'] = roles
# request.data['user_key'] = str(userprofile.key)
# req = requests.post(
# url=ARTA_URL_LOGIN,
# json=request.data,
# verify=False
# )
# if req.status_code == 200:
# access_token = AccessToken(
# user=user,
# token=req.json()['access_token'],
# expires=req.json()['expire_time'],
# scope="read write"
# )
# access_token.save()
# userprofile.token = access_token.token
# userprofile.save()
# for item in req.json()['role']:
# group = Group.objects.get(name=item)
# if not SystemUserProfile.objects.filter(user=user, role=group):
# userprofile.role.add(group)
# internal_login_dict = {
# "access_token": req.json()['access_token'],
# "expires_in": req.json()['token_type'],
# "scope": req.json()['scope'],
# "expire_time": req.json()['expire_time'],
# "mobile": userprofile.mobile,
# "fullname": userprofile.fullname,
# "firstname": userprofile.first_name,
# "lastname": userprofile.last_name,
# "city": userprofile.city.name,
# "province": userprofile.province.name,
# "national_code": userprofile.national_code,
# "national_id": userprofile.national_id,
# "birthday": userprofile.birthday,
# "image": userprofile.image,
# "base_order": userprofile.base_order,
# "role": req.json()['role'],
# }
#
# return Response(internal_login_dict, status.HTTP_200_OK)
# if req.status_code == 401:
# return Response({'msg': 'unauthorized'}, status.HTTP_401_UNAUTHORIZED)
# else:
# return Response({'msg': 'unauthorized'}, status.HTTP_401_UNAUTHORIZED)
def expire_user_access_tokens(token,user):
now = datetime.datetime.now().date()
accesses = AccessToken.objects.filter(user=user,created__date=now).exclude(token=token).order_by('-created')
accesses_to_expire = accesses[1:]
for access in accesses_to_expire:
access.expires = now - timedelta(days=2)
access.save()
def create_login_log(request, user_profile):
headers = dict(request.headers)
UserLoginLog.objects.create(
user_profile=user_profile,
headers=headers,
ip_address=request.META.get('REMOTE_ADDR'),
user_agent=request.META.get('HTTP_USER_AGENT')
)
@api_view(['POST'])
@permission_classes([AllowAny])
def new_login(request):
username = request.data['username']
if User.objects.filter(username__exact=username).exists():
user = User.objects.get(username__exact=username)
userprofile = SystemUserProfile.objects.get(user=user)
roles = list(userprofile.role.all().values_list('name', flat=True))
request.data['role'] = roles
request.data['user_key'] = str(userprofile.key)
req_data = {
"api_key": PROJECT_API_KEY,
"password": request.data['password'],
"username": request.data['username'],
"user_key": str(userprofile.key),
"role": roles,
}
req = requests.post(
url=ARTA_URL_LOGIN,
json=req_data,
verify=False
)
if req.status_code == 200:
expires_datetime = datetime.datetime.strptime(req.json()['expire_time'],
"%Y-%m-%dT%H:%M:%S.%f") + datetime.timedelta(days=1)
access_token = AccessToken(
user=user,
token=req.json()['access_token'],
expires=expires_datetime,
scope="read write"
)
access_token.save()
userprofile.token = access_token.token
userprofile.save()
for item in req.json()['role']:
group = Group.objects.get(name=item)
if not SystemUserProfile.objects.filter(user=user, role=group):
userprofile.role.add(group)
internal_login_dict = {
"access_token": req.json()['access_token'],
"expires_in": req.json()['token_type'],
"scope": req.json()['scope'],
"expire_time": req.json()['expire_time'],
"mobile": userprofile.mobile,
"fullname": userprofile.fullname,
"firstname": userprofile.first_name,
"lastname": userprofile.last_name,
"city": userprofile.city.name,
"province": userprofile.province.name,
"national_code": userprofile.national_code,
"national_id": userprofile.national_id,
"birthday": userprofile.birthday,
"image": userprofile.image,
"base_order": userprofile.base_order,
"role": req.json()['role'],
}
# expire_user_access_tokens_tread = threading.Thread(target=expire_user_access_tokens, args=(req.json()['access_token'],user))
# expire_user_access_tokens_tread.start()
try:
create_login_log(request, userprofile)
except:
pass
return Response(internal_login_dict, status.HTTP_200_OK)
if req.status_code == 401:
return Response({'msg': 'unauthorized'}, status.HTTP_410_GONE)
else:
return Response({'msg': 'unauthorized'}, status.HTTP_410_GONE)
# def new_login(request):
# username = request.data['username']
# password = (request.data['password'],)
#
# if User.objects.filter(username__exact=username).exists():
# user = User.objects.get(username__exact=username)
# userprofile = SystemUserProfile.objects.get(user=user)
# decrypted_password = cryptocode.decrypt(user.password, password[0])
# if decrypted_password != password[0]:
# return Response({'result': 'رمز ورود اشتباه است!'}, status=status.HTTP_401_UNAUTHORIZED)
# roles = list(userprofile.role.all().values_list('name', flat=True))
# data = {
# "username": user.username,
# "password": userprofile.password,
# "client_id": CLIENT_ID,
# "client_secret": CLIENT_SECRET,
# "grant_type": "client_credentials",
# "scope": "read write",
# }
#
# r = requests.post(url=BASE_URL + "token/", data=json.dumps(data), verify=False)
# access_token = AccessToken.objects.get(token=r.json()["access_token"])
# access_token.user = user
# access_token.expires += timedelta(days=3)
# access_token.save()
# userprofile.token = access_token.token
# userprofile.save()
# internal_login_dict = {
# "access_token": access_token.token,
# "expires_in": access_token.expires,
# "scope": "read write",
# "expire_time": access_token.expires,
# "mobile": userprofile.mobile,
# "fullname": userprofile.fullname,
# "firstname": userprofile.first_name,
# "lastname": userprofile.last_name,
# "city": userprofile.city.name,
# "province": userprofile.province.name,
# "national_code": userprofile.national_code,
# "national_id": userprofile.national_id,
# "birthday": userprofile.birthday,
# "image": userprofile.image,
# "base_order": userprofile.base_order,
# "role": roles,
# }
#
# return Response(internal_login_dict, status.HTTP_200_OK)
#
# else:
# return Response({'msg': 'unauthorized'}, status.HTTP_410_GONE)
# تابع مربوط به ازسال کد پیامکی برای چند حالت استفاده می شود
# یرای فراموشی رمز عبور و برای تغییر رمز عبور و تغییر موبایل و ...
# @api_view(["POST"])
# @permission_classes([AllowAny])
# def send_otp(request):
# mobile = request.data["mobile"]
# state = request.data["state"]
# if len(mobile) < 11 or len(mobile) > 11:
# return Response({"pattern": "wrong", }, status=status.HTTP_403_FORBIDDEN, )
# key = str(uuid.uuid4())
# rand = random.randint(10000, 99000)
# cache.set(key, str(rand), timeout=CACHE_TTL)
# userprofile = SystemUserProfile.objects.filter(mobile=mobile)
#
# if userprofile.count() == 0:
# return Response({"is_user": False}, status=status.HTTP_404_NOT_FOUND)
#
# elif state == "forget_password":
# receptor = mobile
# send_otp_code(receptor, rand)
# return Response({"is_user": True, "key": key}, status=status.HTTP_200_OK)
#
# elif state == "change_password":
# receptor = mobile
# send_otp_code(receptor, rand)
# return Response({"is_user": True, "key": key}, status=status.HTTP_200_OK, )
#
# elif state == "change_mobile":
# receptor = mobile
# send_otp_code(receptor, rand)
# return Response({"state": "change_mobile", "key": key}, status=status.HTTP_200_OK)
#
# elif state == "":
# list1 = []
# if userprofile.count() > 1:
#
# for user in userprofile:
# user_dict = {
# "userprofile_id": user.id,
# "fullname": user.fullname,
# "first_name": user.first_name,
# "last_name": user.last_name,
# "mobile": user.mobile,
# "role": user.role.name,
# "province": user.address.province,
# "city": user.address.city,
# "address": user.address.address
# }
# list1.append(user_dict)
# return Response(
# {
# "result": list1,
# },
# status=status.HTTP_200_OK,
# )
#
# else:
#
# return Response(
# {
# "is_user": True,
# },
# status=status.HTTP_200_OK,
# )
@api_view(["POST"])
@permission_classes([AllowAny])
def login(request):
username = request.data["mobile"]
password = request.data["password"]
api_key = request.data["api_key"]
data = {
"username": username,
"password": password,
"api_key": api_key,
}
r = requests.post(url=ARTA_URL_LOGIN, data=data)
if "is_user" in r.json().keys():
return Response({'is_user': False}, status=status.HTTP_401_UNAUTHORIZED)
elif "password" in r.json().keys():
return Response({'password': 'wrong'}, status=status.HTTP_401_UNAUTHORIZED)
user_profile = UserProfile.objects.get(mobile=username)
user = User.objects.get(id=user_profile.user.id)
user_profile.token = r.json()["access_token"]
user_profile.save()
access = AccessToken(token=r.json()['access_token'], user=user, scope=r.json()['scope'],
expires=r.json()['expire_time'])
access.save()
role = Group.objects.get(id=user_profile.role.id)
response = {
"access_token": r.json()['access_token'],
"expires_in": r.json()['expires_in'],
"token_type": r.json()['token_type'],
"scope": r.json()['scope'],
"role": role.name
}
return Response(response, status=status.HTTP_200_OK)
@api_view(["POST"])
@permission_classes([AllowAny])
def register(request):
username = request.data["username"]
password = request.data["password"]
api_key = request.data["api_key"]
province = request.data['province']
city = request.data['city']
role = request.data['role']
role = Group.objects.get(name=role)
data = {
"username": username,
"password": password,
"api_key": api_key,
}
r = requests.post(url=ARTA_URL_REGISTER, data=data)
if 'result' in r.json().keys():
return Response({"result": "user already exist"})
user = User(
username=username, password=cryptocode.encrypt(password, password)
)
user.save()
access = AccessToken(token=r.json()['access_token'], user=user, scope=r.json()['scope'],
expires=r.json()['expire_time'])
access.save()
address = Address(province=province, city=city)
address.save()
userprofile = UserProfile(user=user, mobile=username, address=address, role=role)
userprofile.base_order = 1000 if len(UserProfile.objects.all()) == 0 else UserProfile.objects.all().order_by(
'create_date').last().base_order + 1
userprofile.user = user
userprofile.token = r.json()['access_token']
userprofile.save()
return Response(r.json(), status=status.HTTP_200_OK)
@api_view(["POST"])
@permission_classes([AllowAny])
# @authentication_classes([OAuth2Authentication])
def forget_password(request):
# user = SystemUserProfile.objects.get(user=request.user)
# user.password = request.data['password']
# user.save()
req = requests.post(
url=ARTA_URL_CHANGE_PASSWORD,
data=request.data,
verify=False
)
if req.status_code == 200:
user = SystemUserProfile.objects.get(mobile=request.data['username'])
user.password = request.data['password']
user.save()
return Response(req.json(), status=status.HTTP_200_OK)
# mobile = request.data["mobile"]
# password = request.data["password"]
# try:
# userprofile = UserProfile.objects.get(mobile__exact=mobile)
# except UserProfile.DoesNotExist:
# return Response(status=status.HTTP_401_UNAUTHORIZED)
# user = User.objects.get(id=userprofile.user.id)
# user.password = cryptocode.encrypt(password, password)
# user.save()
# data = {
# "username": str(user.username),
# "password": user.password,
# "client_id": CLIENT_ID,
# "client_secret": CLIENT_SECRET,
# "grant_type": "client_credentials",
# "scope": "read write",
# }
# r = requests.post(url=BASE_URL + "token/", data=json.dumps(data))
# userprofile.token = r.json()["access_token"]
# userprofile.save()
# access = AccessToken.objects.get(token=userprofile.token)
# access.user = userprofile.user
# access.save()
# role = Group.objects.get(id=userprofile.role.id)
# response = {
# "access_token": r.json()['access_token'],
# "expires_in": r.json()['expires_in'],
# "token_type": r.json()['token_type'],
# "scope": r.json()['scope'],
# "role": role.name
# }
# return Response(response, status=status.HTTP_200_OK)
# @api_view(["GET"])
# @permission_classes([AllowAny])
# تابع برای گرفتن گزارش تعداد جوجه و سن جوجه مرغداران استفاده میشود که بصورت فایل اکسل است
def resulting(request):
list2 = []
today = datetime.datetime.now()
if 'age' in request.GET:
users = UserProfile.objects.filter(role_id=1).exclude(incubation_date=None)
for user in users:
age = (today - user.incubation_date).days
if int(age) == int(request.GET['age']):
list2.append(user)
elif 'state' in request.GET:
users = UserProfile.objects.filter(role_id=1).exclude(incubation_date=None)
for user in users:
age = (today - user.incubation_date).days
if int(age) >= int(request.GET['age1']) and int(age) <= int(request.GET['age2']):
list2.append(user)
excel_options = [
'نام و نام خانوادگی'
, 'تاریخ جوجه ریزی'
, 'سن مرغ'
, 'تعداد جوجه ریزی',
'شماره همراه', 'استان',
'شهرستان',
'آدرس'
]
output = BytesIO()
workbook = xlsxwriter.Workbook(output)
worksheet = workbook.add_worksheet()
for count in range(len(excel_options)):
worksheet.write(0, count, excel_options[count])
l = 0
for user in list2:
l += 1
today = datetime.datetime.now()
if user.incubation_date != None:
age = (today - user.incubation_date).days
gregorian_date = jdatetime.date.fromgregorian(
day=user.incubation_date.day,
month=user.incubation_date.month,
year=user.incubation_date.year
)
incubation_date = gregorian_date
else:
age = 'ندارد'
incubation_date = 'ندارد'
list1 = [
user.fullname,
str(incubation_date),
str(age),
user.number_of_incubators,
user.mobile,
user.address.province,
user.address.city,
user.address.address,
]
for item in range(len(list1)):
worksheet.write(l, item, list1[item])
list1 = []
workbook.close()
output.seek(0)
response = HttpResponse(content_type='application/vnd.ms-excel')
response['Content-Disposition'] = 'attachment;filename="Reporting.xlsx"'
response.write(output.getvalue())
return response
# تابع برای دریافت گزارش اطلاعات مربوط به فاکتور های مرغ منجمد به صورت فایل اکسل استفاده میشود
def ware_house_factor(request):
list2 = []
factors = WareHouseFactor.objects.filter(trash=False).order_by('create_date')
for factor in factors:
list2.append(factor)
excel_options = [
'تاریخ',
'نام و نام خانوادگی',
'کدملی'
, 'شماره همراه'
, 'نوع کالا'
,
'شماره نامه جهاد',
'شماره نامه استان',
'قیمت',
'وزن'
]
output = BytesIO()
workbook = xlsxwriter.Workbook(output)
worksheet = workbook.add_worksheet()
for count in range(len(excel_options)):
worksheet.write(0, count, excel_options[count])
l = 0
for factor in factors:
l += 1
gregorian_date = jdatetime.date.fromgregorian(
day=factor.date.day,
month=factor.date.month,
year=factor.date.year
)
list1 = [
str(gregorian_date),
factor.customer,
str(factor.national_code),
factor.mobile,
factor.product_type,
str(factor.letter_number_jahad),
factor.letter_number,
factor.fee,
factor.weight
]
for item in range(len(list1)):
worksheet.write(l, item, list1[item])
list1 = []
workbook.close()
output.seek(0)
response = HttpResponse(content_type='application/vnd.ms-excel')
response['Content-Disposition'] = 'attachment;filename="Reporting.xlsx"'
response.write(output.getvalue())
return response
@api_view(['POST'])
@permission_classes([AllowAny])
def pos_login(request):
build_id = None
link = None
pos_version = PosVersion.objects.filter(trash=False).first()
if pos_version:
build_id = pos_version.build_id
link = pos_version.latest_downloadlink
try:
pos = POSMachine.objects.get(pos_id=request.data['pos-id'], trash=False)
if pos.active == False:
return Response({"result": "این کلید غیر فعال میباشد! "}, status=status.HTTP_401_UNAUTHORIZED)
except:
return Response({"result": "دستگاه پوزی با این شناسه وجود ندارد! "}, status=status.HTTP_401_UNAUTHORIZED)
if User.objects.filter(username__exact=pos.user.mobile).exists():
user = User.objects.get(username__exact=pos.user.mobile)
userprofile = SystemUserProfile.objects.get(
user=user
)
data = {
"username": user.username,
"password": userprofile.password,
"client_id": CLIENT_ID,
"client_secret": CLIENT_SECRET,
"grant_type": "client_credentials",
"scope": "read write",
}
r = requests.post(url=BASE_URL + "token/", data=json.dumps(data), verify=False)
access_token = AccessToken.objects.get(token=r.json()["access_token"])
access_token.user = user
access_token.expires += timedelta(days=3)
access_token.save()
userprofile.token = access_token.token
userprofile.save()
pos.token = access_token.token
pos.save()
if pos.guild:
store_name = pos.guild.guilds_name
phone = pos.guild.phone
else:
store_name = pos.kill_house.name
phone = pos.kill_house.phone
internal_login_dict = {
"access_token": userprofile.token,
"build_id": build_id,
"latest_downloadlink": link,
"profile": {
"pos_id": pos.pos_id,
"store_name": store_name,
"phone": phone,
"mobile": userprofile.mobile,
"fullname": userprofile.fullname,
"firstname": userprofile.first_name,
"lastname": userprofile.last_name,
"city": userprofile.city.name,
"province": userprofile.province.name,
"national_code": userprofile.national_code,
"national_id": userprofile.national_id,
"birthday": userprofile.birthday,
}
}
for pos_item in PosItem.objects.all():
internal_login_dict[pos_item.name] = pos_item.value
return Response(internal_login_dict, status.HTTP_200_OK)
else:
return Response({'msg': 'unauthorized'}, status.HTTP_410_GONE)
@api_view(['POST'])
@permission_classes([AllowAny])
def new_pos_login(request):
pos_id = request.data.get('pos-id')
pos = get_object_or_404(POSMachine, pos_id=pos_id, trash=False)
if not pos.active:
return Response({"result": "این کلید غیر فعال میباشد! "}, status=status.HTTP_401_UNAUTHORIZED)
user = get_object_or_404(User, username=pos.user.mobile)
user_profile = get_object_or_404(SystemUserProfile, user=user)
pos_info = get_pos_info(pos)
data = {
"username": user.username,
"password": user_profile.password,
"client_id": CLIENT_ID,
"client_secret": CLIENT_SECRET,
"grant_type": "client_credentials",
"scope": "read write",
}
response = requests.post(url=f"{BASE_URL}token/", data=json.dumps(data), verify=False)
access_token = update_access_token(response.json()["access_token"], user)
user_profile.token = access_token.token
user_profile.save()
pos.token = access_token.token
pos.save()
internal_login_dict = build_internal_login_response(user_profile, pos_info, pos.pos_id)
return Response(internal_login_dict, status.HTTP_200_OK)
def get_pos_info(pos):
if pos.kill_house:
return {
"type": "KillHouse",
"name": pos.kill_house.name,
"phone": pos.kill_house.phone
}
elif pos.guild:
return {
"type": "Guild",
"name": pos.guild.guilds_name,
"phone": pos.guild.phone
}
else:
return {
"type": "Dispenser",
"name": pos.dispenser.user.fullname,
"phone": pos.dispenser.user.mobile
}
def update_access_token(token_str, user):
access_token = AccessToken.objects.get(token=token_str)
access_token.user = user
access_token.expires += timedelta(days=3)
access_token.save()
return access_token
def build_internal_login_response(user_profile, pos_info, pos_id):
return {
"access_token": user_profile.token,
"type": pos_info["type"],
"profile": {
"pos_id": pos_id,
"name": pos_info["name"],
"phone": pos_info["phone"],
"mobile": user_profile.mobile,
"fullname": user_profile.fullname,
"firstname": user_profile.first_name,
"lastname": user_profile.last_name,
"city": user_profile.city.name,
"province": user_profile.province.name,
"national_code": user_profile.national_code,
"national_id": user_profile.national_id,
"birthday": user_profile.birthday,
}
}
@api_view(['POST'])
@permission_classes([AllowAny])
def show_transaction_info(request):
request.data['registered'] = True
return Response(request.data)
@api_view(['POST'])
@permission_classes([AllowAny])
def TokenVerification(request):
token = AccessToken.objects.get(token=request.data['token'])
user = SystemUserProfile.objects.filter(user=token.user, trash=False).select_related('province', 'city').first()
return Response({
"username": user.mobile,
"password": user.password,
"province": user.province.name,
"city": user.city.name,
})
# def create(self, request, *args, **kwargs):
# group = Group.objects.filter(name__in=request.data['roles'])
# users = SystemUserProfile.objects.filter(trash=False,role__in=group).order_by('id')
# notis_user = users.values_list('id',flat=True)
# return Response(notis_user)
# serializer = self.serializer_class(data=request.data)
# if serializer.is_valid():
# notice = serializer.create(validated_data=request.data)
# notice.users = notis_user
# notice.save()
# for user in notis_user:
# user_notice = UserNoticeInfo(
# notice=notice,
# user = user,
#
# )
# user_notice.save()
# serializer = self.serializer_class(notice)
# return Response(serializer.data)
# return Response(serializer.errors)
@api_view(['POST'])
@permission_classes([AllowAny])
def register_tenant(request):
province = Province.objects.get(key=request.data['province'])
city = City.objects.get(key=request.data['city'])
breeding_uniq_id = request.data['unique_id']
if Poultry.objects.filter(trash=False, breeding_unique_id=breeding_uniq_id).exists():
return Response({'result': 'شناسه یکتا برای شخص دیگری است!'}, status=status.HTTP_403_FORBIDDEN)
owner_poultry = Poultry.objects.get(key=request.data['poultry_key'])
owner_poultry.has_tenant = True
address = SystemAddress(
city=city,
province=province,
address=request.data['address'],
postal_code=request.data['postal_code']
)
address.save()
tenant_poultry = Poultry(
user=owner_poultry.user,
owner=owner_poultry,
unit_name=request.data['unit_name'],
breeding_unique_id=breeding_uniq_id,
address=address,
city_number=city.id,
province_number=province.id,
city_name=city.name,
province_name=province.name
)
tenant_poultry.tenant = True
owner_poultry.save()
tenant_poultry.save()
serializer = PoultrySerializer(tenant_poultry)
return Response(serializer.data, status=status.HTTP_201_CREATED)