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