121 lines
5.2 KiB
Python
121 lines
5.2 KiB
Python
|
|
import datetime
|
||
|
|
import secrets
|
||
|
|
from django.http import JsonResponse
|
||
|
|
|
||
|
|
from panel.models import PosDeviceVersion, PosCompany, POSDeviceSession, POSMachine
|
||
|
|
|
||
|
|
|
||
|
|
def make_pos_unique_id():
|
||
|
|
while True:
|
||
|
|
random_number = '0' + ''.join(str(secrets.randbelow(10)) for _ in range(5))
|
||
|
|
if not POSMachine.objects.filter(pos_unique_id=random_number).exists():
|
||
|
|
return random_number
|
||
|
|
|
||
|
|
|
||
|
|
def get_client_ip(request):
|
||
|
|
x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
|
||
|
|
if x_forwarded_for:
|
||
|
|
# اگر از پروکسی استفاده میشود، IP اول را برمیگردانیم
|
||
|
|
ip = x_forwarded_for.split(',')[0]
|
||
|
|
else:
|
||
|
|
# در غیر این صورت از REMOTE_ADDR استفاده میکنیم
|
||
|
|
ip = request.META.get('REMOTE_ADDR')
|
||
|
|
return ip
|
||
|
|
|
||
|
|
|
||
|
|
class PosDeviceValidator:
|
||
|
|
def __init__(self, request):
|
||
|
|
self.request = request
|
||
|
|
self.headers = request.headers
|
||
|
|
self.device_id = request.headers.get('device-id')
|
||
|
|
self.device_mac = request.headers.get('device-mac')
|
||
|
|
self.device_name = request.headers.get('device-name')
|
||
|
|
self.device_sdk = request.headers.get('device-sdk')
|
||
|
|
self.device_serial = request.headers.get('device-serial')
|
||
|
|
self.device_provider = request.headers.get('device-provider')
|
||
|
|
self.device_version = request.headers.get('device-version')
|
||
|
|
self.device_version_name = request.headers.get('device-vname')
|
||
|
|
self.device_lng = request.headers.get('device-lng')
|
||
|
|
self.device_lot = request.headers.get('device-lot')
|
||
|
|
self.role = request.headers.get('device-role')
|
||
|
|
|
||
|
|
def validation_version(self):
|
||
|
|
if self.device_provider == "" or self.device_provider == None:
|
||
|
|
return JsonResponse({'result': 'پارامتر های ارسالی صحیح نمیباشد!'}, status=402)
|
||
|
|
|
||
|
|
company = PosCompany.objects.filter(en_name=self.device_provider).first()
|
||
|
|
if not company:
|
||
|
|
return JsonResponse({'result': 'شرکت پرداخت الکترونیک پشتیبانی نمیشود!'}, status=402)
|
||
|
|
|
||
|
|
if not company.active:
|
||
|
|
return JsonResponse({'result': 'شرکت پرداخت الکترونیک توسط مدیریت مسدود شده است!'}, status=402)
|
||
|
|
version = PosDeviceVersion.objects.filter(company=company).order_by('code')
|
||
|
|
if not version:
|
||
|
|
return JsonResponse({'result': ' هیچ نسخه معتبری برای این شرکت پرداخت الکترونیک منتشر نشده است!'},
|
||
|
|
status=402)
|
||
|
|
|
||
|
|
current_version = version.filter(code=self.device_version).first()
|
||
|
|
if not current_version or current_version.remove:
|
||
|
|
return JsonResponse({'result': f'نسخه {self.device_version_name} منقضی شده است لطفا بروز رسانی کنید '},
|
||
|
|
status=402)
|
||
|
|
return None
|
||
|
|
|
||
|
|
def validation_device(self):
|
||
|
|
pos_session = POSDeviceSession.objects.filter(pos__pos_id=self.device_id, mac=self.device_mac).first()
|
||
|
|
if not pos_session:
|
||
|
|
return None
|
||
|
|
else:
|
||
|
|
pos_session.session_last_seen_date = datetime.datetime.now()
|
||
|
|
pos_session.lng = self.device_lng
|
||
|
|
pos_session.lot = self.device_lot
|
||
|
|
pos_session.version = self.device_version
|
||
|
|
pos_session.ip = get_client_ip(self.request)
|
||
|
|
pos_session.save()
|
||
|
|
return pos_session.pos.pos_id
|
||
|
|
|
||
|
|
def validation_pos(self):
|
||
|
|
pos = POSMachine.objects.filter(serial=self.device_serial, mac=self.device_mac).first()
|
||
|
|
if not pos:
|
||
|
|
return JsonResponse({"result": "دستگاه معتبر نمیباشد!"},
|
||
|
|
status=401)
|
||
|
|
else:
|
||
|
|
|
||
|
|
if not pos.owner:
|
||
|
|
return JsonResponse({"result": f"برای این دستگاه مالکی تعیین نشده!شناسه پوز:{pos.pos_unique_id}"},
|
||
|
|
status=403)
|
||
|
|
|
||
|
|
if not pos.active:
|
||
|
|
return JsonResponse({"result": f"دستگاه غیر فعال میباشد!شناسه پوز:{pos.pos_unique_id}"},
|
||
|
|
status=403)
|
||
|
|
pos.last_check = datetime.datetime.now()
|
||
|
|
pos.Long = self.device_lng
|
||
|
|
pos.Lat = self.device_lot
|
||
|
|
pos.version = self.device_version
|
||
|
|
pos.ip = get_client_ip(self.request)
|
||
|
|
pos.save()
|
||
|
|
return pos
|
||
|
|
|
||
|
|
def manage_device(self):
|
||
|
|
company = PosCompany.objects.get(en_name=self.device_provider, trash=False)
|
||
|
|
pos = POSMachine.objects.filter(serial=self.device_serial, mac=self.device_mac).first()
|
||
|
|
if not pos:
|
||
|
|
pos = POSMachine(
|
||
|
|
pos_company=company,
|
||
|
|
serial=self.device_serial,
|
||
|
|
mac=self.device_mac,
|
||
|
|
sdk=self.device_sdk,
|
||
|
|
version=self.device_version,
|
||
|
|
name=self.device_name,
|
||
|
|
Lat=self.device_lot,
|
||
|
|
Long=self.device_lng,
|
||
|
|
pos_unique_id=make_pos_unique_id(),
|
||
|
|
ip=get_client_ip(self.request)
|
||
|
|
)
|
||
|
|
pos.save()
|
||
|
|
|
||
|
|
if pos.pos_company.en_name != company.en_name:
|
||
|
|
pos.pos_company = company
|
||
|
|
pos.save(update_fields=['pos_company'])
|
||
|
|
|
||
|
|
return pos
|