from django.shortcuts import render
from rest_framework.views import APIView
from django.contrib.auth import authenticate
from rest_framework.authtoken.models import Token
from django.http import HttpResponse, JsonResponse, HttpResponseRedirect
from Driver.models import *
from AdminApp.models import *
import math
from rest_framework.authtoken.models import Token
from AdminApp.models import *
import math, random, datetime, pytz, string,json
from datetime import timedelta
from django.core.mail import send_mail
from django.conf import settings
from django.views.generic.base import TemplateView, View
import base64
from io import BytesIO
from PIL import Image
from Customer.commonfunctions import getunreadnotificationcount, sendfcmnotification, send_text_message
from django.contrib.auth.hashers import make_password
import timeago, datetime
import os
from django.db.models import Avg
import stripe
from django.db.models.functions import TruncDay
import pytz
import requests

def convert24(str1):
	if str1[-2:] == "AM" and str1[:2] == "12":
		res= "00" + str1[2:-2]
		res=res.replace(" ","")
		res=res+":00"
		return res
	elif str1[-2:] == "AM":
		res= str1[:-2]
		res=res.replace(" ","")
		res=res+":00"
		return res
	elif str1[-2:] == "PM" and str1[:2] == "12":
		res= str1[:-2]
		res=res.replace(" ","")
		res=res+":00"
		return res
	else:
		res= str(int(str1[:2]) + 12) + str1[2:6]
		res=res+":00"
		res=res.replace(" ","")
		return res

def changeSlotStatus(slot,idTS,status):
	# timeslots_data=[]
	# if alltimeslots:
		# for slot in alltimeslots:
	if idTS==1:
		slot.activeSlot1=status
		slot.save()
		return '1'
	elif idTS ==2:
		slot.activeSlot2=status
		slot.save()
		return '1'
	elif idTS ==3:
		slot.activeSlot3=status
		slot.save()
		return '1'
	elif idTS ==4:
		slot.activeSlot4=status
		slot.save()
		return '1'
	elif idTS ==5:
		slot.activeSlot5=status
		slot.save()
		return '1'
	elif idTS ==6:
		slot.activeSlot6=status
		slot.save()
		return '1'
	elif idTS ==7:
		slot.activeSlot7=status
		slot.save()
		return '1'
	elif idTS ==8:
		slot.activeSlot8=status
		slot.save()
		return '1'
	elif idTS ==9:
		slot.activeSlot9=status
		slot.save()
		return '1'
	elif idTS ==10:
		slot.activeSlot10=status
		slot.save()
		return '1'
	elif idTS ==11:
		slot.activeSlot11=status
		slot.save()
		return '1'
	elif idTS ==12:
		slot.activeSlot12=status
		slot.save()
		return '1'
	elif idTS ==13:
		slot.activeSlot13=status
		slot.save()
		return '1'
	elif idTS ==14:
		slot.activeSlot14=status
		slot.save()
		return '1'
	elif idTS ==15:
		slot.activeSlot15=status
		slot.save()
		return '1'
	elif idTS ==16:
		slot.activeSlot16=status
		slot.save()
		return '1'
	elif idTS ==17:
		slot.activeSlot17=status
		slot.save()
		return '1'
	elif idTS ==18:
		slot.activeSlot18=status
		slot.save()
		return '1'
	elif idTS ==19:
		slot.activeSlot19=status
		slot.save()
		return '1'
	elif idTS ==20:
		slot.activeSlot120=status
		slot.save()
		return '1'
	elif idTS ==21:
		slot.activeSlot21=status
		slot.save()
		return '1'
	elif idTS ==22:
		slot.activeSlot22=status
		slot.save()
		return '1'
	elif idTS ==23:
		slot.activeSlot23=status
		slot.save()
		return '1'
	elif idTS ==24:
		slot.activeSlot24=status
		slot.save()
		return '1'
	else:
		return '0'
	return '0'

def addSlots(slot):
	timeslots_data=[]
	# if alltimeslots:
		# for slot in alltimeslots:
	timeslots_data.append({
		'serialno' : 1,
		'openinghour' : slot.openinghourSlot1,
		'closinghour' : slot.closinghourSlot1,
		'status' : slot.activeSlot1,
		'id' : 1,
		})
	timeslots_data.append({
		'serialno' : 2,
		'openinghour' : slot.openinghourSlot2,
		'closinghour' : slot.closinghourSlot2,
		'status' : slot.activeSlot2,
		'id' : 2,
		})
	timeslots_data.append({
		'serialno' : 3,
		'openinghour' : slot.openinghourSlot3,
		'closinghour' : slot.closinghourSlot3,
		'status' : slot.activeSlot3,
		'id' : 3,
		})
	timeslots_data.append({
		'serialno' : 4,
		'openinghour' : slot.openinghourSlot4,
		'closinghour' : slot.closinghourSlot4,
		'status' : slot.activeSlot4,
		'id' : 4,
		})
	timeslots_data.append({
		'serialno' : 5,
		'openinghour' : slot.openinghourSlot5,
		'closinghour' : slot.closinghourSlot5,
		'status' : slot.activeSlot5,
		'id' : 5,
		})
	timeslots_data.append({
		'serialno' : 6,
		'openinghour' : slot.openinghourSlot6,
		'closinghour' : slot.closinghourSlot6,
		'status' : slot.activeSlot6,
		'id' : 6,
		})
	timeslots_data.append({
		'serialno' : 7,
		'openinghour' : slot.openinghourSlot7,
		'closinghour' : slot.closinghourSlot7,
		'status' : slot.activeSlot7,
		'id' : 7,
		})
	timeslots_data.append({
		'serialno' : 8,
		'openinghour' : slot.openinghourSlot8,
		'closinghour' : slot.closinghourSlot8,
		'status' : slot.activeSlot8,
		'id' : 8,
		})
	timeslots_data.append({
		'serialno' : 9,
		'openinghour' : slot.openinghourSlot9,
		'closinghour' : slot.closinghourSlot9,
		'status' : slot.activeSlot9,
		'id' : 9,
		})
	timeslots_data.append({
		'serialno' : 10,
		'openinghour' : slot.openinghourSlot10,
		'closinghour' : slot.closinghourSlot10,
		'status' : slot.activeSlot10,
		'id' : 10,
		})
	timeslots_data.append({
		'serialno' : 11,
		'openinghour' : slot.openinghourSlot11,
		'closinghour' : slot.closinghourSlot11,
		'status' : slot.activeSlot11,
		'id' : 11,
		})
	timeslots_data.append({
		'serialno' : 12,
		'openinghour' : slot.openinghourSlot12,
		'closinghour' : slot.closinghourSlot12,
		'status' : slot.activeSlot12,
		'id' : 12,
		})
	timeslots_data.append({
		'serialno' : 13,
		'openinghour' : slot.openinghourSlot13,
		'closinghour' : slot.closinghourSlot13,
		'status' : slot.activeSlot13,
		'id' : 13,
		})
	timeslots_data.append({
		'serialno' : 14,
		'openinghour' : slot.openinghourSlot14,
		'closinghour' : slot.closinghourSlot14,
		'status' : slot.activeSlot14,
		'id' : 14,
		})
	timeslots_data.append({
		'serialno' : 15,
		'openinghour' : slot.openinghourSlot15,
		'closinghour' : slot.closinghourSlot15,
		'status' : slot.activeSlot15,
		'id' : 15,
		})
	timeslots_data.append({
		'serialno' : 16,
		'openinghour' : slot.openinghourSlot16,
		'closinghour' : slot.closinghourSlot16,
		'status' : slot.activeSlot16,
		'id' : 16,
		})
	timeslots_data.append({
		'serialno' : 17,
		'openinghour' : slot.openinghourSlot17,
		'closinghour' : slot.closinghourSlot17,
		'status' : slot.activeSlot17,
		'id' : 17,
		})
	timeslots_data.append({
		'serialno' : 18,
		'openinghour' : slot.openinghourSlot18,
		'closinghour' : slot.closinghourSlot18,
		'status' : slot.activeSlot18,
		'id' : 18,
		})
	timeslots_data.append({
		'serialno' : 19,
		'openinghour' : slot.openinghourSlot19,
		'closinghour' : slot.closinghourSlot19,
		'status' : slot.activeSlot19,
		'id' : 19,
		})
	timeslots_data.append({
		'serialno' : 20,
		'openinghour' : slot.openinghourSlot20,
		'closinghour' : slot.closinghourSlot20,
		'status' : slot.activeSlot120,
		'id' : 20,
		})
	timeslots_data.append({
		'serialno' : 21,
		'openinghour' : slot.openinghourSlot21,
		'closinghour' : slot.closinghourSlot21,
		'status' : slot.activeSlot21,
		'id' : 21,
		})
	timeslots_data.append({
		'serialno' : 22,
		'openinghour' : slot.openinghourSlot22,
		'closinghour' : slot.closinghourSlot22,
		'status' : slot.activeSlot22,
		'id' : 22,
		})
	timeslots_data.append({
		'serialno' : 23,
		'openinghour' : slot.openinghourSlot23,
		'closinghour' : slot.closinghourSlot23,
		'status' : slot.activeSlot23,
		'id' : 23,
		})
	timeslots_data.append({
		'serialno' : 24,
		'openinghour' : slot.openinghourSlot24,
		'closinghour' : slot.closinghourSlot24,
		'status' : slot.activeSlot24,
		'id' : 24,
		})
	print(timeslots_data)
	return timeslots_data


def slotStatusonJobComplete(sameparcelID):
	customerjob_obj_all = CustomerJob.objects.filter(sameIdForParcelsDetails = sameparcelID)
	packageCompleted=True
	startSlot=24
	lastSlot=0
	driverID=0
	for customer in customerjob_obj_all:
		dJob=DriverJob.objects.filter(customerjob=customer).first()
		driverID=dJob.driver.id
		if dJob.jobcompleted!=True:
			packageCompleted=False
		print(customer.pickuptimeslotDate)
		print(customer.pickuptimeslot)
		stringFirst=customer.pickuptimeslot
		one=stringFirst.split('-')[0]
		two=stringFirst.split('-')[1]
		one=convert24(one)
		two=convert24(two)
		stringFirst=one+" "+two
		print(one)
		print(two)
		print(stringFirst)
		pickupSlotID=int(stringFirst[:2])
		if pickupSlotID<startSlot:
			startSlot=pickupSlotID
		print("Pickupslotid",pickupSlotID)
		print(customer.dropofftimeslot)
		stringSecond=customer.dropofftimeslot
		one=stringSecond.split('-')[0]
		two=stringSecond.split('-')[1]
		one=convert24(one)
		two=convert24(two)
		stringSecond=one+" "+two
		print(one)
		print(two)
		print(stringSecond)
		deliverySlotID=int(stringSecond[:2])
		if deliverySlotID>lastSlot:
			lastSlot=deliverySlotID
	if packageCompleted == True:
		makeslotAvailable(startSlot,lastSlot+1,driverID)

def makeslotAvailable(slotId,slotId2,DriverID):
	try:
		slotId=slotId+1
		driver_obj = DriverModel.objects.filter(id = DriverID).first()
		# print("DriverTimeSlots-in get ")
		# alltimeslots = DriverAllSlots.objects.filter(driver=driver_obj).first()
		driverslotsobj=DriverAllSlots.objects.filter(driver=driver_obj).first()
		if driverslotsobj:
			if slotId<=1 and slotId2>=1:
				driverslotsobj.activeSlot1=True
			if slotId<=2 and slotId2>=2:
				driverslotsobj.activeSlot2=True
			if slotId<=3 and slotId2>=3:
				driverslotsobj.activeSlot3=True
			if slotId<=4 and slotId2>=4:
				driverslotsobj.activeSlot4=True
			if slotId<=5 and slotId2>=5:
				driverslotsobj.activeSlot5=True
			if slotId<=6 and slotId2>=6:
				driverslotsobj.activeSlot6=True
			if slotId<=7 and slotId2>=7:
				driverslotsobj.activeSlot7=True
			if slotId<=8 and slotId2>=8:
				driverslotsobj.activeSlot8=True
			if slotId<=9 and slotId2>=9:
				driverslotsobj.activeSlot9=True
			if slotId<=10 and slotId2>=10:
				driverslotsobj.activeSlot10=True
			if slotId<=11 and slotId2>=11:
				driverslotsobj.activeSlot11=True
			if slotId<=12 and slotId2>=12:
				driverslotsobj.activeSlot12=True
			if slotId<=13 and slotId2>=13:
				driverslotsobj.activeSlot13=True
			if slotId<=14 and slotId2>=14:
				driverslotsobj.activeSlot14=True
			if slotId<=15 and slotId2>=15:
				driverslotsobj.activeSlot15=True
			if slotId<=16 and slotId2>=16:
				driverslotsobj.activeSlot16=True
			if slotId<=17 and slotId2>=17:
				driverslotsobj.activeSlot17=True
			if slotId<=18 and slotId2>=18:
				driverslotsobj.activeSlot18=True
			if slotId<=19 and slotId2>=19:
				driverslotsobj.activeSlot19=True
			if slotId<=20 and slotId2>=20:
				driverslotsobj.activeSlot120=True
			if slotId<=21 and slotId2>=21:
				driverslotsobj.activeSlot21=True
			if slotId<=22 and slotId2>=22:
				driverslotsobj.activeSlot22=True
			if slotId<=23 and slotId2>=23:
				driverslotsobj.activeSlot23=True
			if slotId<=24 and slotId2>=24:
				driverslotsobj.activeSlot24=True
			driverslotsobj.save()
		return 'pass'
	except Exception as e:
		print(e)
		return 'fail'


def createDriverSlots(driverID):
	driver_obj = DriverModel.objects.filter(id = driverID).first()
	# print("DriverTimeSlots-in get ")
	# alltimeslots = DriverAllSlots.objects.filter(driver=driver_obj).first()
	from datetime import havedatetime
	dat1=havedatetime.now()
	dat2=dat1.strftime("%d-%b-%Y")
	print(dat2)
	driverslotsobj=DriverAllSlots.objects.create(driver=driver_obj,dateOfSlots=dat2)
	if driverslotsobj:
		driverslotsobj.openinghourSlot1='00:00:00'
		driverslotsobj.closinghourSlot1='01:00:00'
		driverslotsobj.activeSlot1=True
		driverslotsobj.openinghourSlot2='01:00:00'
		driverslotsobj.closinghourSlot2='02:00:00'
		driverslotsobj.activeSlot2=True
		driverslotsobj.openinghourSlot3='02:00:00'
		driverslotsobj.closinghourSlot3='03:00:00'
		driverslotsobj.activeSlot3=True
		driverslotsobj.openinghourSlot4='03:00:00'
		driverslotsobj.closinghourSlot4='04:00:00'
		driverslotsobj.activeSlot4=True
		driverslotsobj.openinghourSlot5='04:00:00'
		driverslotsobj.closinghourSlot5='05:00:00'
		driverslotsobj.activeSlot5=True
		driverslotsobj.openinghourSlot6='05:00:00'
		driverslotsobj.closinghourSlot6='06:00:00'
		driverslotsobj.activeSlot6=True
		driverslotsobj.openinghourSlot7='06:00:00'
		driverslotsobj.closinghourSlot7='07:00:00'
		driverslotsobj.activeSlot7=True
		driverslotsobj.openinghourSlot8='07:00:00'
		driverslotsobj.closinghourSlot8='08:00:00'
		driverslotsobj.activeSlot8=True
		driverslotsobj.openinghourSlot9='08:00:00'
		driverslotsobj.closinghourSlot9='09:00:00'
		driverslotsobj.activeSlot9=True
		driverslotsobj.openinghourSlot10='09:00:00'
		driverslotsobj.closinghourSlot10='10:00:00'
		driverslotsobj.activeSlot10=True
		driverslotsobj.openinghourSlot11='10:00:00'
		driverslotsobj.closinghourSlot11='11:00:00'
		driverslotsobj.activeSlot11=True
		driverslotsobj.openinghourSlot12='11:00:00'
		driverslotsobj.closinghourSlot12='12:00:00'
		driverslotsobj.activeSlot12=True
		driverslotsobj.openinghourSlot13='12:00:00'
		driverslotsobj.closinghourSlot13='13:00:00'
		driverslotsobj.activeSlot13=True
		driverslotsobj.openinghourSlot14='13:00:00'
		driverslotsobj.closinghourSlot14='14:00:00'
		driverslotsobj.activeSlot14=True
		driverslotsobj.openinghourSlot15='14:00:00'
		driverslotsobj.closinghourSlot15='15:00:00'
		driverslotsobj.activeSlot15=True
		driverslotsobj.openinghourSlot16='15:00:00'
		driverslotsobj.closinghourSlot16='16:00:00'
		driverslotsobj.activeSlot16=True
		driverslotsobj.openinghourSlot17='16:00:00'
		driverslotsobj.closinghourSlot17='17:00:00'
		driverslotsobj.activeSlot17=True
		driverslotsobj.openinghourSlot18='17:00:00'
		driverslotsobj.closinghourSlot18='18:00:00'
		driverslotsobj.activeSlot18=True
		driverslotsobj.openinghourSlot19='18:00:00'
		driverslotsobj.closinghourSlot19='19:00:00'
		driverslotsobj.activeSlot19=True
		driverslotsobj.openinghourSlot20='19:00:00'
		driverslotsobj.closinghourSlot20='20:00:00'
		driverslotsobj.activeSlot120=True
		driverslotsobj.openinghourSlot21='20:00:00'
		driverslotsobj.closinghourSlot21='21:00:00'
		driverslotsobj.activeSlot21=True
		driverslotsobj.openinghourSlot22='21:00:00'
		driverslotsobj.closinghourSlot22='22:00:00'
		driverslotsobj.activeSlot22=True
		driverslotsobj.openinghourSlot23='22:00:00'
		driverslotsobj.closinghourSlot23='23:00:00'
		driverslotsobj.activeSlot23=True
		driverslotsobj.openinghourSlot24='23:00:00'
		driverslotsobj.closinghourSlot24='00:00:00'
		driverslotsobj.activeSlot24=True
		driverslotsobj.save()
		return '1'
	return '0'

class safePalaceImage(APIView):
	# permission_classes = (AllowAny,)
	def post(self, request, *args, **kwargs):
		try:
			print('\n\n')
			print('Uploading safe image API - in post')
			print('data is  : ',request.POST)
			
			session_token_val = request.POST.get('session_token')
			if not session_token_val:
				return JsonResponse({'status_code': 400, 'status_message': 'User not logged in.'})

			customer_id = request.POST.get('customer_id')
			if not customer_id:
				return JsonResponse({'status_code': 400, 'status_message': 'customer_id is required'})

			driver_id = request.POST.get('driver_id')
			if not driver_id:
				return JsonResponse({'status_code': 400, 'status_message': 'driver_id is Required'})
			image = request.FILES.get('image')
			if not image:
				return JsonResponse({'status_code': 400, 'status_message': 'Image is Required'})
			driverjob_obj = DriverJob.objects.filter(id = driver_id).first()
			if driverjob_obj:
				customerjob_obj = CustomerJob.objects.filter(id = customer_id).first()
				if customerjob_obj:
					safedrop_obj = DriverDropSafePalace.objects.filter(driver_job=driverjob_obj,customerjob=customerjob_obj).first()
					filename = image.name
					filename = filename.split('.')
					extension = str(filename[-1])
					image_data = BytesIO(image.read())
					img = Image.open(image_data)
					st = ''.join([random.choice(string.ascii_letters + string.digits) for n in range(6)])
					filepath = str(settings.BASE_DIR)+'/media/safepalaceimages/'+str(customerjob_obj.id)+'_'+str(driverjob_obj.id)+str(st)
					current_date = datetime.datetime.now()
					if(os.path.exists(filepath)):
						pass
					else:
						os.makedirs(filepath)
					img.save(filepath +'/image_of_safe_palace.'+extension)	
					filename = '/media/safepalaceimages/'+str(customerjob_obj.id)+'_'+str(driverjob_obj.id)+str(st) + '/image_of_safe_palace.'+extension
					if safedrop_obj:
						safedrop_obj.safeplace=filename
						safedrop_obj.created_at=current_date
						safedrop_obj.save()
					else:
						safedrop_obj = DriverDropSafePalace.objects.create(driver_job=driverjob_obj,customerjob=customerjob_obj,safeplace=filename,created_at=current_date)
					if safedrop_obj:
						return JsonResponse({ 'status_code': 200 ,'status_message' : 'success' })
					else:
						return JsonResponse({ 'status_code': 500 ,'status_message' : 'Failed' })
				else:
					return JsonResponse({ 'status_code': 500 ,'status_message' : 'Customer job not found' })
			else:
				return JsonResponse({ 'status_code': 500 ,'status_message' : 'Driver job not found' })
		except Exception as e:
			return JsonResponse({ 'status_code': 500 , 'status_message' : 'error' })


# @method_decorator(checklogin, name='dispatch')
class startJobDropOffLocation(APIView):
	# permission_classes = (AllowAny,)
	def post(self, request, *args, **kwargs):
		print('\n\n')
		print('DriverArrivedPickup API - in post')
		print('data is  : ',request.POST)
		
		session_token_val = request.POST.get('session_token')
		if not session_token_val:
			return JsonResponse({'status_code': 400, 'status_message': 'User not logged in.'})

		# customerjobid_val = request.POST.get('customerjobid')
		# if not customerjobid_val:
		# 	return JsonResponse({'status_code': 400, 'status_message': 'customerjobid is required'})
		print("one")
		try:
			# driverjobid_val = request.POST.get('driverjobid')
			# if not driverjobid_val:
			# 	return JsonResponse({'status_code': 400, 'status_message': 'driverjobid is required'})
			data_ids = request.POST.get('data_ids')
			if not data_ids:
				return JsonResponse({'status_code': 400, 'status_message': 'Data is Required'})
			data_ids = json.loads(data_ids)
			# driverjob_obj1 = DriverJob.objects.filter(id  = driverjobid_val)
			# driverjob_obj = DriverJob.objects.filter(id  = driverjobid_val, customerjob_id = customerjobid_val).first()
			# driverjob_obj = DriverJob.objects.filter(id  = driverjobid_val, customerjob_id = customerjobid_val).first()
			# driverjob_obj = DriverJob.objects.filter(id  = driverjobid_val).first()
			# print(driverjob_obj1)
			for ids in data_ids:
				print("two")
				print("count for manpreet")
				# print(parcel['sendername'])
				# print(type(ids['customerjobid']))
				# print(type(ids['driverjobid']))
				customerjobid_val = (ids['customerjobid'])
				driverjobid_val = (ids['driverjobid'])
				latitude_val = ids['latitude']
				longitude_val = ids['longitude']
				print((customerjobid_val))
				print((driverjobid_val))
				print(type(customerjobid_val))
				print(type(driverjobid_val))
				# customerjob_obj = CustomerJob.objects.filter(id = customerjobid_val).first()
				# print(customerjob_obj)
				driverjob_obj = DriverJob.objects.filter(id  = driverjobid_val, customerjob_id = customerjobid_val).first()
				# driverjob_obj = DriverJob.objects.filter(id  = driverjobid_val, customerjob_id = customerjobid_val).first()
				# driverjob_obj = DriverJob.objects.filter(id  = driverjobid_val, customerjob_id = customerjobid_val).first()
				# driverjob_obj = DriverJob.objects.filter(id  = driverjobid_val).first()
				print(driverjob_obj)
				if driverjob_obj:
					# driverjob_obj.start_DropOff = True
					driverjob_obj.start_DropOff = True
					driverjob_obj.save()
					try:
						current_date = datetime.datetime.now()
						customerjobdatetime_obj = CustomerJobDateTime.objects.filter(job_id = customerjobid_val).first()
						if customerjobdatetime_obj:
							customerjobdatetime_obj.startDropOffTime = current_date
							customerjobdatetime_obj.save()
						else:
							customerjob_obj = CustomerJob.objects.filter(id = customerjobid_val).first()
							if customerjob_obj:
								CustomerJobDateTime.objects.create(job = customerjob_obj, driver_pickuparrived_datetime = current_date)
					except Exception as e:
						print(e)
					try:
						sendfcmnotification(driverjob_obj.driver.fcmtoken, 'driver', 'statuschange', 'KwickDelivery', 'Started Drop Off Location Job')
					except Exception as e:
						print(e)
					try:
						sendfcmnotification(driverjob_obj.customerjob.customer.fcmtoken, 'customer', 'statuschange', 'KwickDelivery', 'Driver Started Drop Off Location Job')
					except Exception as e:
						print(e)
					try:
						Notifications.objects.create(user = driverjob_obj.customerjob.customer.user, customerjobid = driverjob_obj.customerjob.id, forcustomer = True, notificationtype = 'Driver Started Drop Off Location Job', notificationtext = 'Driver Started Drop Off Location Job', status = 'unread')
					except Exception as e:
						print(e)
					
				else:
					print("three")
					return JsonResponse({'status_code': 400, 'status_message': 'Not a valid request'})
			return JsonResponse({'status_code': 200, 'status_message': 'success'})
		except Exception as e:
			print(e)
			return JsonResponse({'status_code': 500, 'status_message': 'Internal Server Error',})



# @method_decorator(checklogin, name='dispatch')
class arrivedAtDropOffLocation(APIView):
	# permission_classes = (AllowAny,)
	def post(self, request, *args, **kwargs):
		print('\n\n')
		print('DriverArrivedPickup API - in post')
		print('data is  : ',request.POST)
		
		session_token_val = request.POST.get('session_token')
		if not session_token_val:
			return JsonResponse({'status_code': 400, 'status_message': 'User not logged in.'})

		# customerjobid_val = request.POST.get('customerjobid')
		# if not customerjobid_val:
		# 	return JsonResponse({'status_code': 400, 'status_message': 'customerjobid is required'})
		print("one")
		try:
			# driverjobid_val = request.POST.get('driverjobid')
			# if not driverjobid_val:
			# 	return JsonResponse({'status_code': 400, 'status_message': 'driverjobid is required'})
			data_ids = request.POST.get('data_ids')
			if not data_ids:
				return JsonResponse({'status_code': 400, 'status_message': 'Data is Required'})
			data_ids = json.loads(data_ids)
			# driverjob_obj1 = DriverJob.objects.filter(id  = driverjobid_val)
			# driverjob_obj = DriverJob.objects.filter(id  = driverjobid_val, customerjob_id = customerjobid_val).first()
			# driverjob_obj = DriverJob.objects.filter(id  = driverjobid_val, customerjob_id = customerjobid_val).first()
			# driverjob_obj = DriverJob.objects.filter(id  = driverjobid_val).first()
			# print(driverjob_obj1)
			for ids in data_ids:
				print("two")
				print("count for manpreet")
				# print(parcel['sendername'])
				# print(type(ids['customerjobid']))
				# print(type(ids['driverjobid']))
				customerjobid_val = (ids['customerjobid'])
				driverjobid_val = (ids['driverjobid'])
				print((customerjobid_val))
				print((driverjobid_val))
				print(type(customerjobid_val))
				print(type(driverjobid_val))
				# customerjob_obj = CustomerJob.objects.filter(id = customerjobid_val).first()
				# print(customerjob_obj)
				driverjob_obj = DriverJob.objects.filter(id  = driverjobid_val, customerjob_id = customerjobid_val).first()
				# driverjob_obj = DriverJob.objects.filter(id  = driverjobid_val, customerjob_id = customerjobid_val).first()
				# driverjob_obj = DriverJob.objects.filter(id  = driverjobid_val, customerjob_id = customerjobid_val).first()
				# driverjob_obj = DriverJob.objects.filter(id  = driverjobid_val).first()
				print(driverjob_obj)
				if driverjob_obj:
					driverjob_obj.arrived_atDropOffLocation = True
					driverjob_obj.save()
					try:
						current_date = datetime.datetime.now()
						customerjobdatetime_obj = CustomerJobDateTime.objects.filter(job_id = customerjobid_val).first()
						if customerjobdatetime_obj:
							customerjobdatetime_obj.arrivedDropOffLocation = current_date
							customerjobdatetime_obj.save()
						else:
							customerjob_obj = CustomerJob.objects.filter(id = customerjobid_val).first()
							if customerjob_obj:
								CustomerJobDateTime.objects.create(job = customerjob_obj, driver_pickuparrived_datetime = current_date)
					except Exception as e:
						print(e)
					try:
						sendfcmnotification(driverjob_obj.driver.fcmtoken, 'driver', 'statuschange', 'KwickDelivery', 'Arrived at Drop Off Location')
					except Exception as e:
						print(e)
					try:
						sendfcmnotification(driverjob_obj.customerjob.customer.fcmtoken, 'customer', 'statuschange', 'KwickDelivery', 'Driver Arrived at Drop Off Location')
					except Exception as e:
						print(e)
					try:
						Notifications.objects.create(user = driverjob_obj.customerjob.customer.user, customerjobid = driverjob_obj.customerjob.id, forcustomer = True, notificationtype = 'Driver Arrived at Drop Off Location', notificationtext = 'Driver Arrived at Drop Off Location', status = 'unread')
					except Exception as e:
						print(e)
					
				else:
					print("three")
					return JsonResponse({'status_code': 400, 'status_message': 'Not a valid request'})
			return JsonResponse({'status_code': 200, 'status_message': 'success'})
		except Exception as e:
			print(e)
			return JsonResponse({'status_code': 500, 'status_message': 'Internal Server Error',})

# @method_decorator(checklogin, name='dispatch')
class StartDriverJob(APIView):
	# permission_classes = (AllowAny,)
	def post(self, request, *args, **kwargs):
		print('\n\n')
		print('DriverArrivedPickup API - in post')
		print('data is  : ',request.POST)
		
		session_token_val = request.POST.get('session_token')
		if not session_token_val:
			return JsonResponse({'status_code': 400, 'status_message': 'User not logged in.'})

		# customerjobid_val = request.POST.get('customerjobid')
		# if not customerjobid_val:
		# 	return JsonResponse({'status_code': 400, 'status_message': 'customerjobid is required'})
		print("one")
		try:
			# driverjobid_val = request.POST.get('driverjobid')
			# if not driverjobid_val:
			# 	return JsonResponse({'status_code': 400, 'status_message': 'driverjobid is required'})
			data_ids = request.POST.get('data_ids')
			if not data_ids:
				return JsonResponse({'status_code': 400, 'status_message': 'Data is Required'})
			data_ids = json.loads(data_ids)
			# driverjob_obj1 = DriverJob.objects.filter(id  = driverjobid_val)
			# driverjob_obj = DriverJob.objects.filter(id  = driverjobid_val, customerjob_id = customerjobid_val).first()
			# driverjob_obj = DriverJob.objects.filter(id  = driverjobid_val, customerjob_id = customerjobid_val).first()
			# driverjob_obj = DriverJob.objects.filter(id  = driverjobid_val).first()
			# print(driverjob_obj1)
			for ids in data_ids:
				print("two")
				print("count for manpreet")
				# print(parcel['sendername'])
				# print(type(ids['customerjobid']))
				# print(type(ids['driverjobid']))
				customerjobid_val = (ids['customerjobid'])
				driverjobid_val = (ids['driverjobid'])
				print((customerjobid_val))
				print((driverjobid_val))
				print(type(customerjobid_val))
				print(type(driverjobid_val))
				# customerjob_obj = CustomerJob.objects.filter(id = customerjobid_val).first()
				# print(customerjob_obj)
				driverjob_obj = DriverJob.objects.filter(id  = driverjobid_val, customerjob_id = customerjobid_val).first()
				# driverjob_obj = DriverJob.objects.filter(id  = driverjobid_val, customerjob_id = customerjobid_val).first()
				# driverjob_obj = DriverJob.objects.filter(id  = driverjobid_val, customerjob_id = customerjobid_val).first()
				# driverjob_obj = DriverJob.objects.filter(id  = driverjobid_val).first()
				print(driverjob_obj)
				if driverjob_obj:
					driverjob_obj.jobstarted = True
					driverjob_obj.save()
					try:
						current_date = datetime.datetime.now()
						customerjobdatetime_obj = CustomerJobDateTime.objects.filter(job_id = customerjobid_val).first()
						if customerjobdatetime_obj:
							customerjobdatetime_obj.driver_job_started_datetime = current_date
							customerjobdatetime_obj.save()
						else:
							customerjob_obj = CustomerJob.objects.filter(id = customerjobid_val).first()
							if customerjob_obj:
								CustomerJobDateTime.objects.create(job = customerjob_obj, driver_pickuparrived_datetime = current_date)
					except Exception as e:
						print(e)
					try:
						sendfcmnotification(driverjob_obj.driver.fcmtoken, 'driver', 'statuschange', 'KwickDelivery', 'You have Start Your job')
					except Exception as e:
						print(e)
					try:
						sendfcmnotification(driverjob_obj.customerjob.customer.fcmtoken, 'customer', 'statuschange', 'KwickDelivery', 'Driver has Start the Job')
					except Exception as e:
						print(e)
					try:
						Notifications.objects.create(user = driverjob_obj.customerjob.customer.user, customerjobid = driverjob_obj.customerjob.id, forcustomer = True, notificationtype = 'Driver Job Started', notificationtext = 'Driver has Start the job', status = 'unread')
					except Exception as e:
						print(e)
					
				else:
					print("three")
					return JsonResponse({'status_code': 400, 'status_message': 'Not a valid request'})
			return JsonResponse({'status_code': 200, 'status_message': 'success'})
		except Exception as e:
			print(e)
			return JsonResponse({'status_code': 500, 'status_message': 'Internal Server Error',})



# Create your views here.

class DriverDeleteVehicle(APIView):
	# permission_classes = (AllowAny,)
	def post(self, request, *args, **kwargs):
		print('\n\n')
		print('DriverDeleteVehicle API - in post')
		print('data is  : ',request.POST)
		try:	
			
			session_token_val = request.POST.get('session_token')
			vehicleid = request.POST.get('vehicleid')
			if not session_token_val:
				return JsonResponse({'status_code': 400, 'status_message': 'User not logged in.'})
			if not vehicleid:
				return JsonResponse({'status_code': 400, 'status_message': 'vehicleid is required.'})
			 
			token_obj = Token.objects.filter(key = session_token_val).first()
			if token_obj:
				user_obj = User.objects.filter(id = token_obj.user_id).first()
				if user_obj:
					driver_obj = DriverModel.objects.filter(user = user_obj).first()
					if driver_obj:
						drivervehicle_obj = DriverVehicle.objects.filter(driver = driver_obj, id = vehicleid).update(is_deleted = True)
						if drivervehicle_obj:
							return JsonResponse({'status_code': 200, 'status_message': 'success'})
						else:
							return JsonResponse({'status_code': 400, 'status_message': 'Internal Server Error'})
					else:
						return JsonResponse({'status_code': 400, 'status_message': 'Internal Server Error'})
				else:
					return JsonResponse({'status_code': 400, 'status_message': 'Internal Server Error'})
			else:
				return JsonResponse({'status_code': 400, 'status_message': 'Internal Server Error'})				
		except Exception as e:
			print(e)
			return JsonResponse({'status_code': 500, 'status_message': 'Internal Server Error'})



class DriverSelectActiveVehicle(APIView):
	# permission_classes = (AllowAny,)
	def post(self, request, *args, **kwargs):
		print('\n\n')
		print('DriverSelectActiveVehicle API - in post')
		# print('data is  : ',request.POST)
		try:	
			
			session_token_val = request.POST.get('session_token')
			vehicleid = request.POST.get('vehicleid')
			if not session_token_val:
				return JsonResponse({'status_code': 400, 'status_message': 'User not logged in.'})
			if not vehicleid:
				return JsonResponse({'status_code': 400, 'status_message': 'vehicleid is required.'})
			 
			token_obj = Token.objects.filter(key = session_token_val).first()
			if token_obj:
				user_obj = User.objects.filter(id = token_obj.user_id).first()
				if user_obj:
					driver_obj = DriverModel.objects.filter(user = user_obj).first()
					if driver_obj:
						drivervehicle_obj = DriverVehicle.objects.filter(driver = driver_obj).update(active = False)
						if drivervehicle_obj:
							drivervehicle_obj = DriverVehicle.objects.filter(driver = driver_obj, id = vehicleid).update(active = True)
							if drivervehicle_obj:
								return JsonResponse({'status_code': 200, 'status_message': 'success'})
			# 					else:
			# 						return JsonResponse({'status_code': 400, 'status_message': 'Not a valid request'})
			# 				else:
			# 					return JsonResponse({'status_code': 400, 'status_message': 'Not a valid request'})
			# 			else:
			# 				return JsonResponse({'status_code': 400, 'status_message': 'Not a valid request'})
			# 		else:
			# 			return JsonResponse({'status_code': 400, 'status_message': 'Not a valid request'})
			# 	else:
			# 		return JsonResponse({'status_code': 400, 'status_message': 'Not a valid request'})
			# else:
			# 	return JsonResponse({'status_code': 400, 'status_message': 'Not a valid request'})
		except Exception as e:
			print(e)
			return JsonResponse({'status_code': 500, 'status_message': 'Internal Server Error'})



class DriverVehicleList(APIView):
	# permission_classes = (AllowAny,)
	def get(self, request):
		''' This API method is used to get profile data of user'''
		print('data is  : ',request.GET)
		try:
			session_token_val = request.GET.get('session_token')
			if not session_token_val:
				return JsonResponse({'status_code': 400, 'status_message': 'User not logged in',})
			vehiclelist_data = [] 
			token_obj = Token.objects.filter(key = session_token_val).first()
			if token_obj:
				user_obj = User.objects.filter(id = token_obj.user_id).first()
				if user_obj:
					driver_obj = DriverModel.objects.filter(user = user_obj).first()
					if driver_obj:
						drivervehicle_obj = DriverVehicle.objects.filter(driver = driver_obj, is_deleted = False)
						if drivervehicle_obj:
							for vehicle in drivervehicle_obj:
								if vehicle.vehicleimage:
									vehicleimage = str(settings.MEDIA_BASE_URL) + vehicle.vehicleimage.name
								else:
									vehicleimage = ''
								if vehicle.motor_insurance:
									motor_insurance = str(settings.MEDIA_BASE_URL) + vehicle.motor_insurance.name
								else:
									motor_insurance = ''
								if vehicle.goods_in_transit_cover:
									goods_in_transit_cover = str(settings.MEDIA_BASE_URL) + vehicle.goods_in_transit_cover.name
								else:
									goods_in_transit_cover = ''
								if vehicle.public_liability_insurance:
									public_liability_insurance = str(settings.MEDIA_BASE_URL) + vehicle.public_liability_insurance.name
								else:
									public_liability_insurance = ''
								if vehicle.active:
									status = 'active'
								else:
									status = 'inactive'
								vehiclelist_data.append({
									'vehiclenumber' : vehicle.vehiclenumber,
									'vehicletype' : vehicle.vehicletype,
									'vehicleimage' : vehicleimage,
									'vehicleimage_status' : vehicle.vehicleimage_status,
									'motor_insurance' : motor_insurance,
									'motor_insurance_status' : vehicle.motor_insurance_status,
									'goods_in_transit_cover' : goods_in_transit_cover,
									'goods_in_transit_cover_status' : vehicle.goods_in_transit_cover_status,
									'public_liability_insurance' : public_liability_insurance,
									'public_liability_insurance_status' : vehicle.public_liability_insurance_status,
									'id' : vehicle.id,
									'status' : status,
									'vehical_approve_status':vehicle.vehicle_approve_status,
									})
						
			print(vehiclelist_data)
			return JsonResponse({ 'status_code': 200 , 'data' : vehiclelist_data,'status_message' : 'success' })
		except Exception as e:
			print(e)
			return JsonResponse({'status_code': 500, 'status_message': 'Internal Server Error',})



class DriverUpdateVehicle(APIView):
	# permission_classes = (AllowAny,)
	def post(self, request, *args, **kwargs):
		print('\n\n')
		print('DriverUpdateVehicle API - in post')
		# print('data is  : ',request.POST)
		try:	
			def getI420FromBase64(codec, id_val, image_path="c:\\"):
				print(id_val)
				print('\n\n')
				# print(codec)
				print('0')
				base64_data = codec.split(";base64,")
				print('1')
				extens = base64_data[0]
				print('2')
				ext = extens.split("/")
				print('3')
				print(ext)
				extension = str(ext[1])
				print('4')
				base64_data = base64_data[1]
				print('5')
				byte_data = base64.b64decode(base64_data)
				print('6')
				image_data = BytesIO(byte_data)
				print('7')
				
				print('8')
				img = Image.open(image_data)
				print('9')
				drivervehicle_obj = DriverVehicle.objects.get(id=id_val)
				st = ''.join([random.choice(string.ascii_letters + string.digits) for n in range(6)])
				filepath = str(settings.BASE_DIR)+'/media/Users/Drivers/'+str(driver_obj.id)+'_'+str(driver_obj.user.email)
				if(os.path.exists(filepath)):
					pass
					# filesToRemove = [os.path.join(filepath,f) for f in os.listdir(filepath)]
					# for f in filesToRemove:
					# 	os.remove(f) 
				else:
					os.mkdir(filepath)
								
				img = Image.open(image_data)	
				img.save(filepath+'/'+ st +'.'+extension)	
				filename = '/media/Users/Drivers/'+str(driver_obj.id)+'_'+str(driver_obj.user.email)+'/'+ st +'.'+extension
				
				drivervehicle_obj.vehicleimage = filename
				
				drivervehicle_obj.save()
				return('1')

			
			session_token_val = request.POST.get('session_token')
			vehicleid = request.POST.get('vehicleid')
			vehicleimage = request.POST.get('vehicleimage')
			vehiclenumber = request.POST.get('vehiclenumber')
			vehicletype = request.POST.get('vehicletype')
			status = request.POST.get('status')
			if not session_token_val:
				return JsonResponse({'status_code': 400, 'status_message': 'User not logged in.'})
			if not vehicleid:
				return JsonResponse({'status_code': 400, 'status_message': 'vehicleid is required.'})
			if not vehiclenumber:
				return JsonResponse({'status_code': 400, 'status_message': 'vehiclenumber is required.'})
			if not vehicletype:
				return JsonResponse({'status_code': 400, 'status_message': 'vehicletype is required.'})
			if not status:
				return JsonResponse({'status_code': 400, 'status_message': 'status is required.'}) 
			token_obj = Token.objects.filter(key = session_token_val).first()
			if token_obj:
				user_obj = User.objects.filter(id = token_obj.user_id).first()
				if user_obj:
					driver_obj = DriverModel.objects.filter(user = user_obj).first()
					if driver_obj:
						if status == 'active':
							active = True
							DriverVehicle.objects.filter(driver = driver_obj).update(active = False)
						else:
							active = False
						drivervehicle_obj = DriverVehicle.objects.filter(driver = driver_obj, id = vehicleid).update(vehiclenumber = vehiclenumber, vehicletype = vehicletype, active = active)
						if drivervehicle_obj:
							if vehicleimage:
								codec = 'data:image/png;base64,' + vehicleimage
								print('before function call')
								res = getI420FromBase64(codec, id_val = vehicleid)
								print('after function call')
								if res == '1':
									return JsonResponse({'status_code': 200, 'status_message': 'success'})
								else:
									return JsonResponse({'status_code': 400, 'status_message': 'Not a valid request'})
							else:
								return JsonResponse({'status_code': 200, 'status_message': 'success'})
						else:
							return JsonResponse({'status_code': 400, 'status_message': 'Not a valid request'})
					else:
						return JsonResponse({'status_code': 400, 'status_message': 'Not a valid request'})
				else:
					return JsonResponse({'status_code': 400, 'status_message': 'Not a valid request'})
			else:
				return JsonResponse({'status_code': 400, 'status_message': 'Not a valid request'})
		except Exception as e:
			print(e)
			return JsonResponse({'status_code': 500, 'status_message': 'Internal Server Error'})




class DriverAddVehicle(APIView):
	# permission_classes = (AllowAny,)
	def post(self, request, *args, **kwargs):
		print('\n\n')
		print('AddVehicle API - in post')
		# print('data is  : ',request.POST)
		try:	
			def getI420FromBase64(codec, id_val, image_path="c:\\"):
				print(id_val)
				print('\n\n')
				# print(codec)
				print('0')
				base64_data = codec.split(";base64,")
				print('1')
				extens = base64_data[0]
				print('2')
				ext = extens.split("/")
				print('3')
				print(ext)
				extension = str(ext[1])
				print('4')
				base64_data = base64_data[1]
				print('5')
				byte_data = base64.b64decode(base64_data)
				print('6')
				image_data = BytesIO(byte_data)
				print('7')
				
				print('8')
				img = Image.open(image_data)
				print('9')
				drivervehicle_obj = DriverVehicle.objects.get(id=id_val)
				st = ''.join([random.choice(string.ascii_letters + string.digits) for n in range(6)])
				filepath = str(settings.BASE_DIR)+'/media/Users/Drivers/'+str(driver_obj.id)+'_'+str(driver_obj.user.email)+str(st)
				if(os.path.exists(filepath)):
					pass
				else:
					os.mkdir(filepath)
								
				img = Image.open(image_data)	
				img.save(filepath+'/'+ st +'.'+extension)	
				filename = '/media/Users/Drivers/'+str(driver_obj.id)+'_'+str(driver_obj.user.email)+str(st)+'/'+ st +'.'+extension
				
				drivervehicle_obj.vehicleimage = filename
				
				drivervehicle_obj.save()
				return('1')

			
			session_token_val = request.POST.get('session_token')
			vehicleimage = request.POST.get('vehicleimage')
			vehiclenumber = request.POST.get('vehiclenumber')
			vehicletype = request.POST.get('vehicletype')
			status = request.POST.get('status')
			if not session_token_val:
				return JsonResponse({'status_code': 400, 'status_message': 'User not logged in.'})
			if not vehicleimage:
				return JsonResponse({'status_code': 400, 'status_message': 'vehicleimage is required.'})
			if not vehiclenumber:
				return JsonResponse({'status_code': 400, 'status_message': 'vehiclenumber is required.'})
			if not vehicletype:
				return JsonResponse({'status_code': 400, 'status_message': 'vehicletype is required.'})
			if not status:
				return JsonResponse({'status_code': 400, 'status_message': 'status is required.'})
			 
			token_obj = Token.objects.filter(key = session_token_val).first()
			if token_obj:
				user_obj = User.objects.filter(id = token_obj.user_id).first()
				if user_obj:
					driver_obj = DriverModel.objects.filter(user = user_obj).first()
					if driver_obj:
						if status == 'active':
							active = True
							DriverVehicle.objects.filter(driver = driver_obj).update(active = False)
						else:
							active = False
						try:
							vehical_list_obj=VehicleType.objects.filter(name=vehicletype).first()
							driver_obj.vehicletype=vehical_list_obj
							driver_obj.save()
						except Exception as e:
							print(e)

						drivervehicle_obj = DriverVehicle.objects.create(driver = driver_obj, vehiclenumber = vehiclenumber, vehicletype = vehicletype, active = active)
						if drivervehicle_obj:
							if vehicleimage:
								codec = 'data:image/png;base64,' + vehicleimage
								print('before function call')
								res = getI420FromBase64(codec, id_val = drivervehicle_obj.id)
								print('after function call')
								if res == '1':
									return JsonResponse({'status_code': 200, 'status_message': 'success', 'vehicleid' : drivervehicle_obj.id})
								else:
									return JsonResponse({'status_code': 400, 'status_message': 'Not a valid request'})
							else:
								return JsonResponse({'status_code': 400, 'status_message': 'Not a valid request'})
						else:
							return JsonResponse({'status_code': 400, 'status_message': 'Not a valid request'})
					else:
						return JsonResponse({'status_code': 400, 'status_message': 'Not a valid request'})
				else:
					return JsonResponse({'status_code': 400, 'status_message': 'Not a valid request'})
			else:
				return JsonResponse({'status_code': 400, 'status_message': 'Not a valid request'})
		except Exception as e:
			print(e)
			return JsonResponse({'status_code': 500, 'status_message': 'Internal Server Error'})

class UploadDocumentExtraTest(APIView):
	# permission_classes = (AllowAny,)
	def post(self, request, *args, **kwargs):
		print('\n\n')
		print('UploadDocument API - in post')
		# print('data is  : ',request.POST)
		try:	
			# def getI420FromBase64(codec, id_val, document_name, image_path="c:\\"):
			# 	print(id_val)
			# 	print(document_name)
			# 	print('\n\n')
			# 	# print(codec)
			# 	print('0')
			# 	base64_data = codec.split(";base64,")
			# 	print('1')
			# 	extens = base64_data[0]
			# 	print('2')
			# 	ext = extens.split("/")
			# 	print('3')
			# 	print(ext)
			# 	extension = str(ext[1])
			# 	print('4')
			# 	base64_data = base64_data[1]
			# 	print('5')
			# 	byte_data = base64.b64decode(base64_data)
			# 	print('6')
			# 	image_data = BytesIO(byte_data)
			# 	print('7')
			# 	from PIL import Image
			# 	import string, random, os
			# 	print('8')
			# 	img = Image.open(image_data)
			# 	print('9')
			# 	driver_obj = DriverModel.objects.get(id=id_val)
			# 	st = ''.join([random.choice(string.ascii_letters + string.digits) for n in range(6)])
			# 	filepath = str(settings.BASE_DIR)+'/media/Users/Drivers/'+str(driver_obj.id)+'_'+str(driver_obj.user.email)
			# 	if(os.path.exists(filepath)):
			# 		pass
			# 		# filesToRemove = [os.path.join(filepath,f) for f in os.listdir(filepath)]
			# 		# for f in filesToRemove:
			# 		# 	os.remove(f) 
			# 	else:
			# 		os.mkdir(filepath)
								
			# 	img = Image.open(image_data)	
			# 	img.save(filepath+'/'+document_name+'.'+extension)	
			# 	filename = '/media/Users/Drivers/'+str(driver_obj.id)+'_'+str(driver_obj.user.email)+'/'+document_name+'.'+extension
			# 	if document_name == 'license_front':
			# 		driver_obj.license_front = filename
			# 	elif document_name == 'license_back':
			# 		driver_obj.license_back = filename
			# 	elif document_name == 'id_front':
			# 		driver_obj.id_front = filename
			# 	elif document_name == 'id_back':
			# 		driver_obj.id_back = filename
			# 	elif document_name == 'crb_dbs':
			# 		driver_obj.crb_dbs = filename
			# 	driver_obj.save()
			# 	return('1')
			def upload_func(file,filename):
				print("in upload function")
				print("Writing file")
				with open(filename,'wb+') as f:
					for chunk in file.chunks():
						f.write(chunk)
				return 1
			session_token_val = request.POST.get('session_token')
			document_name = request.POST.get('document_name')
			document_file = request.FILES.get('file')
			file_type = request.POST.get('file_type')
			if not session_token_val:
				return JsonResponse({'status_code': 400, 'status_message': 'User not logged in.'})
			if not document_name:
				return JsonResponse({'status_code': 400, 'status_message': 'document_name is required.'})
			if not document_file:
				return JsonResponse({'status_code': 400, 'status_message': 'File is required.'})
			token_obj = Token.objects.filter(key = session_token_val).first()
			if token_obj:
				user_obj = User.objects.filter(id = token_obj.user_id).first()
				if user_obj:
					driver_obj = DriverModel.objects.filter(user = user_obj).first()
					if driver_obj:
						if document_file:
							driver_obj = DriverModel.objects.get(id=driver_obj.id)
							if file_type=='image':
								image=document_file

								filename = image.name
								filename = filename.split('.')
								extension = str(filename[-1])
								image_data = BytesIO(image.read())
								img = Image.open(image_data)
								# filepath = str(settings.BASE_DIR)+'/media/CustomerJobs/'+str(customerjob_obj.id)

								
								st = ''.join([random.choice(string.ascii_letters + string.digits) for n in range(6)])
								filepath = str(settings.BASE_DIR)+'/media/Users/Drivers/'+str(driver_obj.id)+'_'+str(driver_obj.user.email)+'_'+str(st)
								if(os.path.exists(filepath)):
									pass
								else:
									os.mkdir(filepath)

								img = Image.open(image_data)
								img.save(filepath+'/'+document_name+'.'+extension)
								filename = '/media/Users/Drivers/'+str(driver_obj.id)+'_'+str(driver_obj.user.email)+'_'+str(st)+'/'+document_name+'.'+extension
							if file_type=='pdf':
								pdf_file=document_file
								print("first filed")
								filename = pdf_file.name
								filename = filename.split('.')
								extension = str(filename[-1])
								
								# image_data = BytesIO(image.read())
								# img = Image.open(image_data)
								# filepath = str(settings.BASE_DIR)+'/media/CustomerJobs/'+str(customerjob_obj.id)
								print("second filed")
								
								st = ''.join([random.choice(string.ascii_letters + string.digits) for n in range(6)])
								filepath = str(settings.BASE_DIR)+'/media/Users/Drivers/'+str(driver_obj.id)+'_'+str(driver_obj.user.email)+'_'+st
								print("third filed")
								if(os.path.exists(filepath)):
									pass
									# filesToRemove = [os.path.join(filepath,f) for f in os.listdir(filepath)]
									# for f in filesToRemove:
									# 	os.remove(f) 
								else:
									os.mkdir(filepath)

								# license_front = models.FileField(max_length = 200, default = '', blank = True, null = True)
								# license_front_documentStatus = models.IntegerField(default = 0)
								# license_back = models.FileField(max_length = 200, default = '', blank = True, null = True)
								# license_back_documentStatus = models.IntegerField(default = 0)
								# id_front = models.FileField(max_length = 200, default = '', blank = True, null = True)
								# id_front_documentStatus = models.IntegerField(default = 0)
								# id_back = models.FileField(max_length = 200, default = '', blank = True, null = True)
								# id_back_documentStatus = models.IntegerField(default = 0)
								# crb_dbs = models.FileField(max_length = 200, default = '', blank = True, null = True)
								# crb_dbs_documentStatus = models.IntegerField(default = 0)

								# img = Image.open(image_data)
								# pdf_file.save(filepath+'/'+document_name+'.'+extension)
								print("fourth filed")
								filename = '/media/Users/Drivers/'+str(driver_obj.id)+'_'+str(driver_obj.user.email)+'_'+str(st)+'/'+document_name+'.'+extension
								print("in upload function before")
								res=upload_func(pdf_file,str(settings.BASE_DIR)+filename)
								if res==1:
									print("file saved successfully")
								else:
									print("file not saved")
							print("first fifth")
							if document_name == 'license_front':
								driver_obj.license_front = filename
								driver_obj.license_front_documentStatus=1
							elif document_name == 'license_back':
								driver_obj.license_back = filename
								driver_obj.license_back_documentStatus=1
							elif document_name == 'id_front':
								driver_obj.id_front = filename
								driver_obj.id_front_documentStatus=1
							elif document_name == 'id_back':
								driver_obj.id_back = filename
								driver_obj.id_back_documentStatus=1
							elif document_name == 'crb_dbs':
								driver_obj.crb_dbs = filename
								driver_obj.crb_dbs_documentStatus=1
							driver_obj.save()


							# codec = 'data:image/png;base64,' + document_image
							# print('before function call')
							# res = getI420FromBase64(codec, id_val = driver_obj.id, document_name = document_name)
							# print('after function call')
							# if res == '1':
							return JsonResponse({'status_code': 200, 'status_message': 'success'})
							# else:
								# return JsonResponse({'status_code': 400, 'status_message': 'Not a valid request'})
						else:
							return JsonResponse({'status_code': 400, 'status_message': 'Not a valid request'})
					else:
						return JsonResponse({'status_code': 400, 'status_message': 'Not a valid request'})
				else:
					return JsonResponse({'status_code': 400, 'status_message': 'Not a valid request'})
			else:
				return JsonResponse({'status_code': 400, 'status_message': 'Not a valid request'})
		except Exception as e:
			print(e)
			return JsonResponse({'status_code': 500, 'status_message': 'Internal Server Error'})

class VehicleUploadDocumentExtraTest(APIView):
	# permission_classes = (AllowAny,)
	def post(self, request, *args, **kwargs):
		print('\n\n')
		print('VehicleUploadDocument API - in post')
		# print('data is  : ',request.POST)
		try:	
			def getI420FromBase64(codec, id_val, document_name, image_path="c:\\"):
				print(id_val)
				print(document_name)
				print('\n\n')
				# print(codec)
				print('0')
				base64_data = codec.split(";base64,")
				print('1')
				extens = base64_data[0]
				print('2')
				ext = extens.split("/")
				print('3')
				print(ext)
				extension = str(ext[1])
				print('4')
				base64_data = base64_data[1]
				print('5')
				byte_data = base64.b64decode(base64_data)
				print('6')
				image_data = BytesIO(byte_data)
				print('7')
				
				print('8')
				img = Image.open(image_data)
				print('9')
				drivervehicle_obj = DriverVehicle.objects.get(id=id_val)
				st = ''.join([random.choice(string.ascii_letters + string.digits) for n in range(6)])
				filepath = str(settings.BASE_DIR)+'/media/Users/Drivers/'+str(driver_obj.id)+'_'+str(driver_obj.user.email)
				if(os.path.exists(filepath)):
					pass
					# filesToRemove = [os.path.join(filepath,f) for f in os.listdir(filepath)]
					# for f in filesToRemove:
					# 	os.remove(f) 
				else:
					os.mkdir(filepath)
								
				img = Image.open(image_data)	
				img.save(filepath+'/'+st+'.'+extension)	
				filename = '/media/Users/Drivers/'+str(driver_obj.id)+'_'+str(driver_obj.user.email)+'/'+st+'.'+extension
				if document_name == 'motor_insurance':
					drivervehicle_obj.motor_insurance = filename
				elif document_name == 'goods_in_transit_cover':
					drivervehicle_obj.goods_in_transit_cover = filename
				elif document_name == 'public_liability_insurance':
					drivervehicle_obj.public_liability_insurance = filename
				drivervehicle_obj.save()
				return('1')
			def upload_func(file,filename):
				print("Writing file")
				with open(filename,'wb+') as f:
					for chunk in file.chunks():
						f.write(chunk)
				return 1
			session_token_val = request.POST.get('session_token')
			drivervehicle_id = request.POST.get('drivervehicle_id')
			document_name = request.POST.get('document_name')
			# document_image = request.POST.get('document_image')
			document_file = request.FILES.get('file')
			file_type = request.POST.get('file_type')
		
			if not session_token_val:
				return JsonResponse({'status_code': 400, 'status_message': 'User not logged in.'})
			if not drivervehicle_id:
				return JsonResponse({'status_code': 400, 'status_message': 'drivervehicle_id is required.'})
			if not document_name:
				return JsonResponse({'status_code': 400, 'status_message': 'document_name is required.'})
			if not document_file:
				return JsonResponse({'status_code': 400, 'status_message': 'File is required.'})
			if not file_type:
				return JsonResponse({'status_code': 400, 'status_message': 'File Type is required.'})

			token_obj = Token.objects.filter(key = session_token_val).first()
			if token_obj:
				user_obj = User.objects.filter(id = token_obj.user_id).first()
				if user_obj:
					driver_obj = DriverModel.objects.filter(user = user_obj).first()
					if driver_obj:
						drivervehicle_obj = DriverVehicle.objects.filter(driver = driver_obj).first()
						if driver_obj:
							if drivervehicle_obj:
								drivervehicle_obj = DriverVehicle.objects.get(id=drivervehicle_id)
								if file_type=='image':
									image=document_file
									# customerjob_obj = CustomerJob.objects.filter(id = customerjobid_val).first()
									filename = image.name
									filename = filename.split('.')
									extension = str(filename[-1])
									image_data = BytesIO(image.read())
									img = Image.open(image_data)
									st = ''.join([random.choice(string.ascii_letters + string.digits) for n in range(6)])
									filepath = str(settings.BASE_DIR)+'/media/Users/Drivers/'+str(driver_obj.id)+'_'+str(driver_obj.user.email)+'_'+str(st)
									# filepath = str(settings.BASE_DIR)+'/media/CustomerJobs/'+str(customerjob_obj.id)
									if(os.path.exists(filepath)):
										pass
									else:
										os.makedirs(filepath)
									img.save(filepath+'/'+document_name+'.'+extension)	
									# img.save(filepath +'/pickup_proofofdelivery.'+extension)	
									filename = '/media/Users/Drivers/'+str(driver_obj.id)+'_'+str(driver_obj.user.email)+'_'+str(st)+'/'+document_name+'.'+extension
									if document_name == 'motor_insurance':
										drivervehicle_obj.motor_insurance = filename
										drivervehicle_obj.motor_insurance_status=1
									elif document_name == 'goods_in_transit_cover':
										drivervehicle_obj.goods_in_transit_cover = filename
										drivervehicle_obj.goods_in_transit_cover_status=1
									elif document_name == 'public_liability_insurance':
										drivervehicle_obj.public_liability_insurance = filename
										drivervehicle_obj.public_liability_insurance_status=1
									drivervehicle_obj.save()
									# return('1')
									# filename = '/media/CustomerJobs/'+str(customerjob_obj.id) + '/pickup_proofofdelivery.'+extension
									# customerjobdeliveryextradetails_obj = CustomerJobDeliveryExtraDetails.objects.filter(job_id = customerjobid_val).first()
									# if customerjobdeliveryextradetails_obj:
									# 	customerjobdeliveryextradetails_obj.pickup_proof_method = method_type
									# 	customerjobdeliveryextradetails_obj.pickup_fromperson_name = name_val
									# 	customerjobdeliveryextradetails_obj.pickup_fromperson_signature = filename
									# 	customerjobdeliveryextradetails_obj.save()
									# else:
									# 	CustomerJobDeliveryExtraDetails.objects.create(job_id = customerjobid_val, pickup_proof_method = method_type, pickup_fromperson_name = name_val, pickup_fromperson_signature = filename)
									

									# codec = 'data:image/png;base64,' + document_image
									# print('before function call')
									# res = getI420FromBase64(codec, id_val = drivervehicle_id, document_name = document_name)
									# print('after function call')
									# if res == '1':
								if file_type=='pdf':
									pdf_file=document_file
									# customerjob_obj = CustomerJob.objects.filter(id = customerjobid_val).first()
									filename = pdf_file.name
									filename = filename.split('.')
									extension = str(filename[-1])
									# image_data = BytesIO(image.read())
									# img = Image.open(image_data)
									st = ''.join([random.choice(string.ascii_letters + string.digits) for n in range(6)])
									filepath = str(settings.BASE_DIR)+'/media/Users/Drivers/'+str(driver_obj.id)+'_'+str(driver_obj.user.email)+'_'+str(st)
									# filepath = str(settings.BASE_DIR)+'/media/CustomerJobs/'+str(customerjob_obj.id)
									if(os.path.exists(filepath)):
										pass
									else:
										os.makedirs(filepath)
									# img.save(filepath+'/'+st+'.'+extension)	
									# img.save(filepath +'/pickup_proofofdelivery.'+extension)	
									filename = '/media/Users/Drivers/'+str(driver_obj.id)+'_'+str(driver_obj.user.email)+'_'+str(st)+'/'+document_name+'.'+extension
									res=upload_func(pdf_file,str(settings.BASE_DIR)+filename)
									if res==1:
										print("file saved successfully")
									else:
										print("file not saved")
									if document_name == 'motor_insurance':
										drivervehicle_obj.motor_insurance = filename
										drivervehicle_obj.motor_insurance_status=1
									elif document_name == 'goods_in_transit_cover':
										drivervehicle_obj.goods_in_transit_cover = filename
										drivervehicle_obj.goods_in_transit_cover_status=1
									elif document_name == 'public_liability_insurance':
										drivervehicle_obj.public_liability_insurance = filename
										drivervehicle_obj.public_liability_insurance_status=1
									drivervehicle_obj.save()
								return JsonResponse({'status_code': 200, 'status_message': 'success'})
								# else:
									# return JsonResponse({'status_code': 400, 'status_message': 'Not a valid request'})
							else:
								return JsonResponse({'status_code': 400, 'status_message': 'Not a valid request'})
						else:
							return JsonResponse({'status_code': 400, 'status_message': 'Not a valid request'})
					else:
						return JsonResponse({'status_code': 400, 'status_message': 'Not a valid request'})
				else:
					return JsonResponse({'status_code': 400, 'status_message': 'Not a valid request'})
			else:
				return JsonResponse({'status_code': 400, 'status_message': 'Not a valid request'})
		except Exception as e:
			print(e)
			return JsonResponse({'status_code': 500, 'status_message': 'Internal Server Error'})


class VehicleUploadDocument(APIView):
	# permission_classes = (AllowAny,)
	def post(self, request, *args, **kwargs):
		print('\n\n')
		print('VehicleUploadDocument API - in post')
		# print('data is  : ',request.POST)
		try:	
			def getI420FromBase64(codec, id_val, document_name, image_path="c:\\"):
				print(id_val)
				print(document_name)
				print('\n\n')
				# print(codec)
				print('0')
				base64_data = codec.split(";base64,")
				print('1')
				extens = base64_data[0]
				print('2')
				ext = extens.split("/")
				print('3')
				print(ext)
				extension = str(ext[1])
				print('4')
				base64_data = base64_data[1]
				print('5')
				byte_data = base64.b64decode(base64_data)
				print('6')
				image_data = BytesIO(byte_data)
				print('7')
				
				print('8')
				img = Image.open(image_data)
				print('9')
				drivervehicle_obj = DriverVehicle.objects.get(id=id_val)
				st = ''.join([random.choice(string.ascii_letters + string.digits) for n in range(6)])
				filepath = str(settings.BASE_DIR)+'/media/Users/Drivers/'+str(driver_obj.id)+'_'+str(driver_obj.user.email)
				if(os.path.exists(filepath)):
					pass
					# filesToRemove = [os.path.join(filepath,f) for f in os.listdir(filepath)]
					# for f in filesToRemove:
					# 	os.remove(f) 
				else:
					os.mkdir(filepath)
								
				img = Image.open(image_data)	
				img.save(filepath+'/'+st+'.'+extension)	
				filename = '/media/Users/Drivers/'+str(driver_obj.id)+'_'+str(driver_obj.user.email)+'/'+st+'.'+extension
				if document_name == 'motor_insurance':
					drivervehicle_obj.motor_insurance = filename
				elif document_name == 'goods_in_transit_cover':
					drivervehicle_obj.goods_in_transit_cover = filename
				elif document_name == 'public_liability_insurance':
					drivervehicle_obj.public_liability_insurance = filename
				drivervehicle_obj.save()
				return('1')
	
			session_token_val = request.POST.get('session_token')
			drivervehicle_id = request.POST.get('drivervehicle_id')
			document_name = request.POST.get('document_name')
			document_image = request.POST.get('document_image')
			if not session_token_val:
				return JsonResponse({'status_code': 400, 'status_message': 'User not logged in.'})
			if not drivervehicle_id:
				return JsonResponse({'status_code': 400, 'status_message': 'drivervehicle_id is required.'})
			if not document_name:
				return JsonResponse({'status_code': 400, 'status_message': 'document_name is required.'})
			if not document_image:
				return JsonResponse({'status_code': 400, 'status_message': 'document_image is required.'})
			token_obj = Token.objects.filter(key = session_token_val).first()
			if token_obj:
				user_obj = User.objects.filter(id = token_obj.user_id).first()
				if user_obj:
					driver_obj = DriverModel.objects.filter(user = user_obj).first()
					if driver_obj:
						drivervehicle_obj = DriverVehicle.objects.filter(driver = driver_obj).first()
						if driver_obj:
							if drivervehicle_obj:
								codec = 'data:image/png;base64,' + document_image
								print('before function call')
								res = getI420FromBase64(codec, id_val = drivervehicle_id, document_name = document_name)
								print('after function call')
								if res == '1':
									return JsonResponse({'status_code': 200, 'status_message': 'success'})
								else:
									return JsonResponse({'status_code': 400, 'status_message': 'Not a valid request'})
							else:
								return JsonResponse({'status_code': 400, 'status_message': 'Not a valid request'})
						else:
							return JsonResponse({'status_code': 400, 'status_message': 'Not a valid request'})
					else:
						return JsonResponse({'status_code': 400, 'status_message': 'Not a valid request'})
				else:
					return JsonResponse({'status_code': 400, 'status_message': 'Not a valid request'})
			else:
				return JsonResponse({'status_code': 400, 'status_message': 'Not a valid request'})
		except Exception as e:
			print(e)
			return JsonResponse({'status_code': 500, 'status_message': 'Internal Server Error'})


class UploadDocument(APIView):
	# permission_classes = (AllowAny,)
	def post(self, request, *args, **kwargs):
		print('\n\n')
		print('UploadDocument API - in post')
		# print('data is  : ',request.POST)
		try:	
			def getI420FromBase64(codec, id_val, document_name, image_path="c:\\"):
				print(id_val)
				print(document_name)
				print('\n\n')
				# print(codec)
				print('0')
				base64_data = codec.split(";base64,")
				print('1')
				extens = base64_data[0]
				print('2')
				ext = extens.split("/")
				print('3')
				print(ext)
				extension = str(ext[1])
				print('4')
				base64_data = base64_data[1]
				print('5')
				byte_data = base64.b64decode(base64_data)
				print('6')
				image_data = BytesIO(byte_data)
				print('7')
				from PIL import Image
				import string, random, os
				print('8')
				img = Image.open(image_data)
				print('9')
				driver_obj = DriverModel.objects.get(id=id_val)
				st = ''.join([random.choice(string.ascii_letters + string.digits) for n in range(6)])
				filepath = str(settings.BASE_DIR)+'/media/Users/Drivers/'+str(driver_obj.id)+'_'+str(driver_obj.user.email)
				if(os.path.exists(filepath)):
					pass
					# filesToRemove = [os.path.join(filepath,f) for f in os.listdir(filepath)]
					# for f in filesToRemove:
					# 	os.remove(f) 
				else:
					os.mkdir(filepath)
								
				img = Image.open(image_data)	
				img.save(filepath+'/'+document_name+'.'+extension)	
				filename = '/media/Users/Drivers/'+str(driver_obj.id)+'_'+str(driver_obj.user.email)+'/'+document_name+'.'+extension
				if document_name == 'license_front':
					driver_obj.license_front = filename
					driver_obj.license_front_documentStatus=1
				elif document_name == 'license_back':
					driver_obj.license_back = filename
					driver_obj.license_back_documentStatus=1
				elif document_name == 'id_front':
					driver_obj.id_front = filename
					driver_obj.id_front_documentStatus=1
				elif document_name == 'id_back':
					driver_obj.id_back = filename
					driver_obj.id_back_documentStatus=1
				elif document_name == 'crb_dbs':
					driver_obj.crb_dbs = filename
					driver_obj.crb_dbs_documentStatus=1
				driver_obj.save()
				return('1')

			
			session_token_val = request.POST.get('session_token')
			document_name = request.POST.get('document_name')
			document_image = request.POST.get('document_image')
			if not session_token_val:
				return JsonResponse({'status_code': 400, 'status_message': 'User not logged in.'})
			if not document_name:
				return JsonResponse({'status_code': 400, 'status_message': 'document_name is required.'})
			if not document_image:
				return JsonResponse({'status_code': 400, 'status_message': 'document_image is required.'})
			token_obj = Token.objects.filter(key = session_token_val).first()
			if token_obj:
				user_obj = User.objects.filter(id = token_obj.user_id).first()
				if user_obj:
					driver_obj = DriverModel.objects.filter(user = user_obj).first()
					if driver_obj:
						if document_image:
							codec = 'data:image/png;base64,' + document_image
							print('before function call')
							res = getI420FromBase64(codec, id_val = driver_obj.id, document_name = document_name)
							print('after function call')
							if res == '1':
								return JsonResponse({'status_code': 200, 'status_message': 'success'})
							else:
								return JsonResponse({'status_code': 400, 'status_message': 'Not a valid request'})
						else:
							return JsonResponse({'status_code': 400, 'status_message': 'Not a valid request'})
					else:
						return JsonResponse({'status_code': 400, 'status_message': 'Not a valid request'})
				else:
					return JsonResponse({'status_code': 400, 'status_message': 'Not a valid request'})
			else:
				return JsonResponse({'status_code': 400, 'status_message': 'Not a valid request'})
		except Exception as e:
			print(e)
			return JsonResponse({'status_code': 500, 'status_message': 'Internal Server Error'})

class FilterDriverPaymentHistoryExtraTest(APIView):
	# permission_classes = (AllowAny,)
	def get(self, request):
		''' This API method is used to get profile data of user'''
		print('data is  : ',request.GET)
		try:
			session_token_val = request.GET.get('session_token')
			if not session_token_val:
				return JsonResponse({'status_code': 400, 'status_message': 'User not logged in',})
			month_filter = request.GET.get('month')
			year_filter = request.GET.get('year')
			week_filter = request.GET.get('week')
			day_filter = request.GET.get('day')
			paymenthistory_data= [] 
			token_obj = Token.objects.filter(key = session_token_val).first()
			if token_obj:
				user_obj = User.objects.filter(id = token_obj.user_id).first()
				if user_obj:
					driver_obj = DriverModel.objects.filter(user = user_obj).first()
					if driver_obj:
						
						if year_filter=='yes':
							from_date = request.GET.get('from_date')
							to_date = request.GET.get('to_date')
							from_date = '01/08/2020'
							from_date = datetime.datetime.strptime(from_date, "%d/%m/%Y")
							# from_date = datetime.date.today()
							to_date = datetime.datetime.combine(datetime.date.today(), datetime.datetime.min.time())
							# to_date = '01/08/2020'
							# to_date = datetime.datetime.strptime(to_date, "%d/%m/%Y")
							day_count = (to_date - from_date).days + 1
							print(day_count)
							for date in (to_date - timedelta(n) for n in range(day_count)):
								date = date.date()
								today = datetime.datetime.now()
								print(today.year)
								findyeardate=today.year
								no_of_drops = DriverJob.objects.filter(driver = driver_obj,created_at__contains = date, created_at__year = findyeardate, jobcompleted = True).count()
								print('no_of_drops = ', no_of_drops)
								driverjob_obj = DriverJob.objects.filter(driver = driver_obj,created_at__contains = date, created_at__year = findyeardate, jobcompleted = True)
								min_time = datetime.datetime.combine(date,datetime.datetime.now().time())
								max_time = datetime.datetime.combine(date, datetime.datetime.min.time())
								
								if driverjob_obj:
									print('in if')
									# print(driverjob_obj)
									utc = pytz.timezone(settings.TIME_ZONE)
									min_time = utc.localize(min_time)
									max_time = utc.localize(max_time)
									for driverjob in driverjob_obj:
										# print("created_at__contains",driverjob.created_at__contains)
										# print("created_at__year",driverjob.created_at__year)
										# print("created_at__month",driverjob.created_at__month)
										customerjobdatetime_obj = CustomerJobDateTime.objects.filter(job = driverjob.customerjob).first()
										if customerjobdatetime_obj:
											print(customerjobdatetime_obj.driver_pickuparrived_datetime)
											if customerjobdatetime_obj.driver_pickuparrived_datetime:
												if min_time > customerjobdatetime_obj.driver_pickuparrived_datetime:
													min_time = customerjobdatetime_obj.driver_pickuparrived_datetime
											if customerjobdatetime_obj.itemsdelivered_datetime:
												if max_time < customerjobdatetime_obj.itemsdelivered_datetime:
													max_time = customerjobdatetime_obj.itemsdelivered_datetime
									print('min_time = ', min_time)
									print('max_time = ', max_time)
									# datetime_str1 = str(min_time)
									# datetime_str1=datetime_str1.split('.')[0]
									# datetime_object1 = datetime.strptime(datetime_str1, "%Y-%m-%d %H:%M:%S")
									# print(datetime_object1)
									# min_time=datetime_object1

									# datetime_str2 = str(max_time)
									# datetime_str2=datetime_str2.split('.')[0]
									# datetime_object2 = datetime.strptime(datetime_str2, "%Y-%m-%d %H:%M:%S")
									# print(datetime_object2)
								      # max_time=datetime_object2
									if min_time and max_time:
										tdelta = max_time - min_time
										seconds = tdelta.seconds
										total_minutes = (seconds / 60)
										print(total_minutes)
										# total_minutes = tdelta.total_minutes()
										print(driver_obj.vehicletype)
										priceperdrop = driver_obj.vehicletype.priceperdrop
										priceperhour = driver_obj.vehicletype.priceperhour
										print('priceperdrop = ', priceperdrop)
										print('priceperhour = ', priceperhour)
										total_price = str(round((no_of_drops * priceperdrop + ((total_minutes/60) * priceperhour)),2))
										print(total_price)
										paymenthistory_data.append({
											'no_of_drops' : no_of_drops,
											'priceperdrop' : priceperdrop,
											'priceperhour' : priceperhour,
											'min_time' : min_time,
											'max_time' : max_time,
											'date' : date,
											'total_price' : total_price,
											})
							return JsonResponse({ 'status_code': 200 , 'data' : paymenthistory_data,'status_message' : 'success' })


						
						if month_filter=='yes':
							from_date = request.GET.get('from_date')
							to_date = request.GET.get('to_date')
							from_date = '01/08/2020'
							from_date = datetime.datetime.strptime(from_date, "%d/%m/%Y")
							# from_date = datetime.date.today()
							to_date = datetime.datetime.combine(datetime.date.today(), datetime.datetime.min.time())
							# to_date = '01/08/2020'
							# to_date = datetime.datetime.strptime(to_date, "%d/%m/%Y")
							day_count = (to_date - from_date).days + 1
							print(day_count)
							today = datetime.datetime.now()
							for date in (to_date - timedelta(n) for n in range(day_count)):
								if date.month==today.month:
									# date = date.date()
								 #    date = datetime.date.today()
								 #    print('date = ', date)
									date = date.date()
									today = datetime.datetime.now()
									print(today.year)
									findyeardate=today.year
									findmonths=today.month
									print(findmonths)
									no_of_drops = DriverJob.objects.filter(driver = driver_obj, created_at__contains = date, jobcompleted = True).count()
									print('no_of_drops = ', no_of_drops)
									driverjob_obj = DriverJob.objects.filter(driver = driver_obj, created_at__contains = date, jobcompleted = True)
									min_time = datetime.datetime.combine(date,datetime.datetime.now().time())
									max_time = datetime.datetime.combine(date, datetime.datetime.min.time())
									if driverjob_obj:
										print('in if')
										# print(driverjob_obj)
										utc = pytz.timezone(settings.TIME_ZONE)
										min_time = utc.localize(min_time)
										max_time = utc.localize(max_time)
										for driverjob in driverjob_obj:
											customerjobdatetime_obj = CustomerJobDateTime.objects.filter(job = driverjob.customerjob).first()
											if customerjobdatetime_obj:
												print(customerjobdatetime_obj.driver_pickuparrived_datetime)
												if customerjobdatetime_obj.driver_pickuparrived_datetime:
													if min_time > customerjobdatetime_obj.driver_pickuparrived_datetime:
														min_time = customerjobdatetime_obj.driver_pickuparrived_datetime
												if customerjobdatetime_obj.itemsdelivered_datetime:
													if max_time < customerjobdatetime_obj.itemsdelivered_datetime:
														max_time = customerjobdatetime_obj.itemsdelivered_datetime
										print('min_time = ', min_time)
										print('max_time = ', max_time)
										if min_time and max_time:
											tdelta = max_time - min_time
											seconds = tdelta.seconds
											total_minutes = (seconds / 60)
											print(total_minutes)
											# total_minutes = tdelta.total_minutes()
											print(driver_obj.vehicletype)
											priceperdrop = driver_obj.vehicletype.priceperdrop
											priceperhour = driver_obj.vehicletype.priceperhour
											print('priceperdrop = ', priceperdrop)
											print('priceperhour = ', priceperhour)
											total_price = str(round((no_of_drops * priceperdrop + ((total_minutes/60) * priceperhour)),2))
											print(total_price)
											paymenthistory_data.append({
												'no_of_drops' : no_of_drops,
												'priceperdrop' : priceperdrop,
												'priceperhour' : priceperhour,
												'min_time' : min_time,
												'max_time' : max_time,
												'date' : date,
												'total_price' : total_price,
												})
							return JsonResponse({ 'status_code': 200 , 'data' : paymenthistory_data,'status_message' : 'success' })


						
						if week_filter=='yes':
							from_date = request.GET.get('from_date')
							to_date = request.GET.get('to_date')
							today1 = datetime.datetime.now()
							print(today1.date()- timedelta(days=7))
							start_date=str(today1.date()- timedelta(days=7))
							start_date = start_date.split('-')
							start_date = str(start_date[2])+'/'+str(start_date[1])+'/'+str(start_date[0])

							print(start_date)
							from_date = datetime.datetime.strptime(start_date, "%d/%m/%Y")
							to_date = datetime.datetime.combine(datetime.date.today(), datetime.datetime.min.time())
							# from_date = datetime.date.today()
							# to_date = datetime.datetime.combine(datetime.date.today(), datetime.datetime.min.time())
							# to_date = '01/08/2020'
							# to_date = datetime.datetime.strptime(to_date, "%d/%m/%Y")
							day_count = (to_date - from_date).days + 1
							print(day_count)
							
							# from_date = '01/08/2020'
							# from_date = datetime.datetime.strptime(from_date, "%d/%m/%Y")
							# from_date = datetime.date.today()
							# to_date = datetime.datetime.combine(datetime.date.today(), datetime.datetime.min.time())
							# to_date = '01/08/2020'
							# to_date = datetime.datetime.strptime(to_date, "%d/%m/%Y")
							# day_count = (to_date - from_date).days + 1
							# print(day_count)
							for date in (to_date - timedelta(n) for n in range(day_count)):
								date = date.date()
								# today = datetime.datetime.now()
								# print(today.year)
								# findyeardate=today.year
								# findmonths=today.month
								# print(findmonths)
								no_of_drops = DriverJob.objects.filter(driver = driver_obj, created_at__contains = date, jobcompleted = True).count()
								print('no_of_drops = ', no_of_drops)
								driverjob_obj = DriverJob.objects.filter(driver = driver_obj, created_at__contains = date, jobcompleted = True)
								# driverjob_obj = DriverJob.objects.filter(driver = driver_obj,created_at__contains = date, created_at__year = findyeardate,created_at__month=findmonths, jobcompleted = False)
								min_time = datetime.datetime.combine(date,datetime.datetime.now().time())
								max_time = datetime.datetime.combine(date, datetime.datetime.min.time())
								if driverjob_obj:
									print('in if')
									# print(driverjob_obj)
									utc = pytz.timezone(settings.TIME_ZONE)
									min_time = utc.localize(min_time)
									max_time = utc.localize(max_time)
									for driverjob in driverjob_obj:
										customerjobdatetime_obj = CustomerJobDateTime.objects.filter(job = driverjob.customerjob).first()
										if customerjobdatetime_obj:
											print(customerjobdatetime_obj.driver_pickuparrived_datetime)
											if customerjobdatetime_obj.driver_pickuparrived_datetime:
												if min_time > customerjobdatetime_obj.driver_pickuparrived_datetime:
													min_time = customerjobdatetime_obj.driver_pickuparrived_datetime
											if customerjobdatetime_obj.itemsdelivered_datetime:
												if max_time < customerjobdatetime_obj.itemsdelivered_datetime:
													max_time = customerjobdatetime_obj.itemsdelivered_datetime
									print('min_time = ', min_time)
									print('max_time = ', max_time)
									if min_time and max_time:
										tdelta = max_time - min_time
										seconds = tdelta.seconds
										total_minutes = (seconds / 60)
										print(total_minutes)
										# total_minutes = tdelta.total_minutes()
										print(driver_obj.vehicletype)
										priceperdrop = driver_obj.vehicletype.priceperdrop
										priceperhour = driver_obj.vehicletype.priceperhour
										print('priceperdrop = ', priceperdrop)
										print('priceperhour = ', priceperhour)
										total_price = str(round((no_of_drops * priceperdrop + ((total_minutes/60) * priceperhour)),2))
										print(total_price)
										paymenthistory_data.append({
											'no_of_drops' : no_of_drops,
											'priceperdrop' : priceperdrop,
											'priceperhour' : priceperhour,
											'min_time' : min_time,
											'max_time' : max_time,
											'date' : date,
											'total_price' : total_price,
											})
							return JsonResponse({ 'status_code': 200 , 'data' : paymenthistory_data,'status_message' : 'success' })


						if day_filter=='yes':
							# from_date = request.GET.get('from_date')
							# to_date = request.GET.get('to_date')
							today1 = datetime.datetime.now()
							date=today1.date()
							# print(today1.date()- timedelta(days=7))
							# start_date=str(today1.date()- timedelta(days=7))
							# start_date = start_date.split('-')
							# start_date = str(start_date[2])+'/'+str(start_date[1])+'/'+str(start_date[0])

							# print(start_date)
							# from_date = datetime.datetime.strptime(start_date, "%d/%m/%Y")
							# to_date = datetime.datetime.combine(datetime.date.today(), datetime.datetime.min.time())
							# # from_date = datetime.date.today()
							# # to_date = datetime.datetime.combine(datetime.date.today(), datetime.datetime.min.time())
							# # to_date = '01/08/2020'
							# # to_date = datetime.datetime.strptime(to_date, "%d/%m/%Y")
							# day_count = (to_date - from_date).days + 1
							# print(day_count)
							
							# from_date = '01/08/2020'
							# from_date = datetime.datetime.strptime(from_date, "%d/%m/%Y")
							# from_date = datetime.date.today()
							# to_date = datetime.datetime.combine(datetime.date.today(), datetime.datetime.min.time())
							# to_date = '01/08/2020'
							# to_date = datetime.datetime.strptime(to_date, "%d/%m/%Y")
							# day_count = (to_date - from_date).days + 1
							# print(day_count)
							# for date in (to_date - timedelta(n) for n in range(day_count)):
							# date = date.date()
							# today = datetime.datetime.now()
							# print(today.year)
							# findyeardate=today.year
							# findmonths=today.month
							# print(findmonths)
							no_of_drops = DriverJob.objects.filter(driver = driver_obj, created_at__contains = date, jobcompleted = True).count()
							print('no_of_drops = ', no_of_drops)
							driverjob_obj = DriverJob.objects.filter(driver = driver_obj, created_at__contains = date, jobcompleted = True)
							# driverjob_obj = DriverJob.objects.filter(driver = driver_obj,created_at__contains = date, created_at__year = findyeardate,created_at__month=findmonths, jobcompleted = False)
							min_time = datetime.datetime.combine(date,datetime.datetime.now().time())
							max_time = datetime.datetime.combine(date, datetime.datetime.min.time())
							if driverjob_obj:
								print('in if')
								# print(driverjob_obj)
								utc = pytz.timezone(settings.TIME_ZONE)
								min_time = utc.localize(min_time)
								max_time = utc.localize(max_time)
								for driverjob in driverjob_obj:
									customerjobdatetime_obj = CustomerJobDateTime.objects.filter(job = driverjob.customerjob).first()
									if customerjobdatetime_obj:
										print(customerjobdatetime_obj.driver_pickuparrived_datetime)
										if customerjobdatetime_obj.driver_pickuparrived_datetime:
											if min_time > customerjobdatetime_obj.driver_pickuparrived_datetime:
												min_time = customerjobdatetime_obj.driver_pickuparrived_datetime
										if customerjobdatetime_obj.itemsdelivered_datetime:
											if max_time < customerjobdatetime_obj.itemsdelivered_datetime:
												max_time = customerjobdatetime_obj.itemsdelivered_datetime
								print('min_time = ', min_time)
								print('max_time = ', max_time)
								if min_time and max_time:
									tdelta = max_time - min_time
									seconds = tdelta.seconds
									total_minutes = (seconds / 60)
									print(total_minutes)
									# total_minutes = tdelta.total_minutes()
									print(driver_obj.vehicletype)
									priceperdrop = driver_obj.vehicletype.priceperdrop
									priceperhour = driver_obj.vehicletype.priceperhour
									print('priceperdrop = ', priceperdrop)
									print('priceperhour = ', priceperhour)
									total_price = str(round((no_of_drops * priceperdrop + ((total_minutes/60) * priceperhour)),2))
									print(total_price)
									paymenthistory_data.append({
										'no_of_drops' : no_of_drops,
										'priceperdrop' : priceperdrop,
										'priceperhour' : priceperhour,
										'min_time' : min_time,
										'max_time' : max_time,
										'date' : date,
										'total_price' : total_price,
										})
							return JsonResponse({ 'status_code': 200 , 'data' : paymenthistory_data,'status_message' : 'success' })



						# yesterday_date = datetime.date.today() - timedelta (days = 7)
						from_date = request.GET.get('from_date')
						to_date = request.GET.get('to_date')
						from_date = '01/08/2020'
						from_date = datetime.datetime.strptime(from_date, "%d/%m/%Y")
						# from_date = datetime.date.today()
						to_date = datetime.datetime.combine(datetime.date.today(), datetime.datetime.min.time())
						# to_date = '01/08/2020'
						# to_date = datetime.datetime.strptime(to_date, "%d/%m/%Y")
						day_count = (to_date - from_date).days + 1
						print(day_count)
						for date in (to_date - timedelta(n) for n in range(day_count)):
							date = date.date()
							# date = datetime.date.today()
							print('date = ', date)
							no_of_drops = DriverJob.objects.filter(driver = driver_obj, created_at__contains = date, jobcompleted = True).count()
							print('no_of_drops = ', no_of_drops)
							driverjob_obj = DriverJob.objects.filter(driver = driver_obj, created_at__contains = date, jobcompleted = True)
							min_time = datetime.datetime.combine(date,datetime.datetime.now().time())
							max_time = datetime.datetime.combine(date, datetime.datetime.min.time())
							if driverjob_obj:
								print('in if')
								# print(driverjob_obj)
								utc = pytz.timezone(settings.TIME_ZONE)
								min_time = utc.localize(min_time)
								max_time = utc.localize(max_time)
								for driverjob in driverjob_obj:
									customerjobdatetime_obj = CustomerJobDateTime.objects.filter(job = driverjob.customerjob).first()
									if customerjobdatetime_obj:
										print(customerjobdatetime_obj.driver_pickuparrived_datetime)
										if customerjobdatetime_obj.driver_pickuparrived_datetime:
											if min_time > customerjobdatetime_obj.driver_pickuparrived_datetime:
												min_time = customerjobdatetime_obj.driver_pickuparrived_datetime
										if customerjobdatetime_obj.itemsdelivered_datetime:
											if max_time < customerjobdatetime_obj.itemsdelivered_datetime:
												max_time = customerjobdatetime_obj.itemsdelivered_datetime
								print('min_time = ', min_time)
								print('max_time = ', max_time)
								if min_time and max_time:
									tdelta = max_time - min_time
									seconds = tdelta.seconds
									total_minutes = (seconds / 60)
									print(total_minutes)
									# total_minutes = tdelta.total_minutes()
									print(driver_obj.vehicletype)
									priceperdrop = driver_obj.vehicletype.priceperdrop
									priceperhour = driver_obj.vehicletype.priceperhour
									print('priceperdrop = ', priceperdrop)
									print('priceperhour = ', priceperhour)
									total_price = str(round((no_of_drops * priceperdrop + ((total_minutes/60) * priceperhour)),2))
									print(total_price)
									paymenthistory_data.append({
										'no_of_drops' : no_of_drops,
										'priceperdrop' : priceperdrop,
										'priceperhour' : priceperhour,
										'min_time' : min_time,
										'max_time' : max_time,
										'date' : date,
										'total_price' : total_price,
										})
							else:
								print('else')
						pass
			print(paymenthistory_data)
			return JsonResponse({ 'status_code': 200 , 'data' : paymenthistory_data,'status_message' : 'success' })
				# 		if not driver_obj.image.name:
				# 			image = ''
				# 		else:
				# 			if 'http' in driver_obj.image.name:
				# 				image = driver_obj.image.name	
				# 			else:
				# 				image = str(settings.WEB_BASE_URL) + driver_obj.image.name
				# 		if not driver_obj.address:
				# 			address = ''
				# 		else:
				# 			address = driver_obj.address
				# 		if not driver_obj.countrycode:
				# 			countrycode = ''
				# 		else:
				# 			countrycode = driver_obj.countrycode
				# 		profile_data = {}
				# 		try:
				# 			rating_driver = UserRating.objects.filter(ratingfor = 'driver', driverid = driver_obj.id).aggregate(Avg('rating'))
				# 			print(rating_driver)
				# 			print(rating_driver['rating__avg'])
				# 			if not rating_driver['rating__avg']:
				# 				ratings = 0.0
				# 			else:	
				# 				ratings = rating_driver['rating__avg']
				# 		except Exception as e:
				# 			print(e)
				# 			ratings = 0.0
				# 		if driver_obj.vehicletype and driver_obj.vehiclenumber:
				# 			vehicledetailsexist = True
				# 			vehicletype = driver_obj.vehicletype.name
				# 		else:
				# 			vehicledetailsexist = False
				# 			vehicletype = ''
				# 		profile_data.update({
				# 					'driverid':driver_obj.id,
				# 					'name':driver_obj.name,
				# 					'email':user_obj.email,
				# 					'countrycode':countrycode,
				# 					'phone':driver_obj.phone,
				# 					'vehicletype':vehicletype,
				# 					'vehiclenumber':driver_obj.vehiclenumber,
				# 					'vehicledetailsexist':vehicledetailsexist,
				# 					'address':address,
				# 					'image':image,
				# 					'ratings' : ratings,
				# 				})

				# 		# serializer = UserSerializer(obj, many=True)
				# 		# print(serializer.data)
				# 		return JsonResponse({ 'status_code': 200 , 'data' : profile_data,'status_message' : 'success' })
				# 	else:
				# 		return JsonResponse({ 'status_code': 400 , 'data' : {},'status_message' : '' })
				# else:
				# 	return JsonResponse({ 'status_code': 400 , 'data' : {},'status_message' : '' })
			# else:
			# 	return JsonResponse({ 'status_code': 400 , 'data' : {},'status_message' : '' })
		except Exception as e:
			print(e)
			return JsonResponse({'status_code': 500, 'status_message': 'Internal Server Error',})



class DriverPaymentHistory(APIView):
	# permission_classes = (AllowAny,)
	def get(self, request):
		''' This API method is used to get profile data of user'''
		print('data is  : ',request.GET)
		try:
			session_token_val = request.GET.get('session_token')
			if not session_token_val:
				return JsonResponse({'status_code': 400, 'status_message': 'User not logged in',})
			paymenthistory_data= [] 
			token_obj = Token.objects.filter(key = session_token_val).first()
			if token_obj:
				user_obj = User.objects.filter(id = token_obj.user_id).first()
				if user_obj:
					driver_obj = DriverModel.objects.filter(user = user_obj).first()
					if driver_obj:
						# yesterday_date = datetime.date.today() - timedelta (days = 7)
						from_date = request.GET.get('from_date')
						to_date = request.GET.get('to_date')
						from_date = '01/08/2020'
						from_date = datetime.datetime.strptime(from_date, "%d/%m/%Y")
						# from_date = datetime.date.today()
						to_date = datetime.datetime.combine(datetime.date.today(), datetime.datetime.min.time())
						# to_date = '01/08/2020'
						# to_date = datetime.datetime.strptime(to_date, "%d/%m/%Y")
						day_count = (to_date - from_date).days + 1
						print(day_count)
						for date in (to_date - timedelta(n) for n in range(day_count)):
							date = date.date()
							# date = datetime.date.today()
							print('date = ', date)
							no_of_drops = DriverJob.objects.filter(driver = driver_obj, created_at__contains = date, jobcompleted = True).count()
							print('no_of_drops = ', no_of_drops)
							driverjob_obj = DriverJob.objects.filter(driver = driver_obj, created_at__contains = date, jobcompleted = True)
							min_time = datetime.datetime.combine(date,datetime.datetime.now().time())
							max_time = datetime.datetime.combine(date, datetime.datetime.min.time())
							if driverjob_obj:
								print('in if')
								# print(driverjob_obj)
								utc = pytz.timezone(settings.TIME_ZONE)
								min_time = utc.localize(min_time)
								max_time = utc.localize(max_time)
								for driverjob in driverjob_obj:
									customerjobdatetime_obj = CustomerJobDateTime.objects.filter(job = driverjob.customerjob).first()
									if customerjobdatetime_obj:
										print(customerjobdatetime_obj.driver_pickuparrived_datetime)
										if customerjobdatetime_obj.driver_pickuparrived_datetime:
											if min_time > customerjobdatetime_obj.driver_pickuparrived_datetime:
												min_time = customerjobdatetime_obj.driver_pickuparrived_datetime
										if customerjobdatetime_obj.itemsdelivered_datetime:
											if max_time < customerjobdatetime_obj.itemsdelivered_datetime:
												max_time = customerjobdatetime_obj.itemsdelivered_datetime
								print('min_time = ', min_time)
								print('max_time = ', max_time)
								
								# datetime_str1 = str(min_time)
								# datetime_str1=datetime_str1.split('.')[0]
								# datetime_object1 = datetime.strptime(datetime_str1, "%Y-%m-%d %H:%M:%S")
								# print(datetime_object1)
								# min_time=datetime_object1

								# datetime_str2 = str(max_time)
								# datetime_str2=datetime_str2.split('.')[0]
								# datetime_object2 = datetime.strptime(datetime_str2, "%Y-%m-%d %H:%M:%S")
								# print(datetime_object2)
								# max_time=datetime_object2

								if min_time and max_time:
									tdelta = max_time - min_time
									seconds = tdelta.seconds
									total_minutes = (seconds / 60)
									print(total_minutes)
									# total_minutes = tdelta.total_minutes()
									print(driver_obj.vehicletype)
									priceperdrop = driver_obj.vehicletype.priceperdrop
									priceperhour = driver_obj.vehicletype.priceperhour
									print('priceperdrop = ', priceperdrop)
									print('priceperhour = ', priceperhour)
									total_price = str(round((no_of_drops * priceperdrop + ((total_minutes/60) * priceperhour)),2))
									print(total_price)
									paymenthistory_data.append({
										'no_of_drops' : no_of_drops,
										'priceperdrop' : priceperdrop,
										'priceperhour' : priceperhour,
										'min_time' : min_time,
										'max_time' : max_time,
										'date' : date,
										'total_price' : total_price,
										})
							else:
								print('else')
						pass
			print(paymenthistory_data)
			return JsonResponse({ 'status_code': 200 , 'data' : paymenthistory_data,'status_message' : 'success' })
				# 		if not driver_obj.image.name:
				# 			image = ''
				# 		else:
				# 			if 'http' in driver_obj.image.name:
				# 				image = driver_obj.image.name	
				# 			else:
				# 				image = str(settings.WEB_BASE_URL) + driver_obj.image.name
				# 		if not driver_obj.address:
				# 			address = ''
				# 		else:
				# 			address = driver_obj.address
				# 		if not driver_obj.countrycode:
				# 			countrycode = ''
				# 		else:
				# 			countrycode = driver_obj.countrycode
				# 		profile_data = {}
				# 		try:
				# 			rating_driver = UserRating.objects.filter(ratingfor = 'driver', driverid = driver_obj.id).aggregate(Avg('rating'))
				# 			print(rating_driver)
				# 			print(rating_driver['rating__avg'])
				# 			if not rating_driver['rating__avg']:
				# 				ratings = 0.0
				# 			else:	
				# 				ratings = rating_driver['rating__avg']
				# 		except Exception as e:
				# 			print(e)
				# 			ratings = 0.0
				# 		if driver_obj.vehicletype and driver_obj.vehiclenumber:
				# 			vehicledetailsexist = True
				# 			vehicletype = driver_obj.vehicletype.name
				# 		else:
				# 			vehicledetailsexist = False
				# 			vehicletype = ''
				# 		profile_data.update({
				# 					'driverid':driver_obj.id,
				# 					'name':driver_obj.name,
				# 					'email':user_obj.email,
				# 					'countrycode':countrycode,
				# 					'phone':driver_obj.phone,
				# 					'vehicletype':vehicletype,
				# 					'vehiclenumber':driver_obj.vehiclenumber,
				# 					'vehicledetailsexist':vehicledetailsexist,
				# 					'address':address,
				# 					'image':image,
				# 					'ratings' : ratings,
				# 				})

				# 		# serializer = UserSerializer(obj, many=True)
				# 		# print(serializer.data)
				# 		return JsonResponse({ 'status_code': 200 , 'data' : profile_data,'status_message' : 'success' })
				# 	else:
				# 		return JsonResponse({ 'status_code': 400 , 'data' : {},'status_message' : '' })
				# else:
				# 	return JsonResponse({ 'status_code': 400 , 'data' : {},'status_message' : '' })
			# else:
			# 	return JsonResponse({ 'status_code': 400 , 'data' : {},'status_message' : '' })
		except Exception as e:
			print(e)
			return JsonResponse({'status_code': 500, 'status_message': 'Internal Server Error',})


# @method_decorator(checklogin, name='dispatch')
class DriverArrivedPickupExtraTest(APIView):
	# permission_classes = (AllowAny,)
	def post(self, request, *args, **kwargs):
		print('\n\n')
		print('DriverArrivedPickup API - in post')
		print('data is  : ',request.POST)
		
		session_token_val = request.POST.get('session_token')
		if not session_token_val:
			return JsonResponse({'status_code': 400, 'status_message': 'User not logged in.'})

		# customerjobid_val = request.POST.get('customerjobid')
		# if not customerjobid_val:
		# 	return JsonResponse({'status_code': 400, 'status_message': 'customerjobid is required'})
		try:
			data_ids = request.POST.get('data_ids')
			if not data_ids:
				return JsonResponse({'status_code': 400, 'status_message': 'Data is Required'})
			data_ids = json.loads(data_ids)
			for ids in data_ids:
				print("count for manpreet")
				# print(parcel['sendername'])
				print(ids['customerjobid'])
				print(ids['driverjobid'])
				customerjobid_val = ids['customerjobid']
				driverjobid_val = ids['driverjobid']
				# driverjobid_val = request.POST.get('driverjobid')
				# if not driverjobid_val:
					# return JsonResponse({'status_code': 400, 'status_message': 'driverjobid is required'})
				driverjob_obj = DriverJob.objects.filter(id  = driverjobid_val, customerjob_id = customerjobid_val).first()
				if driverjob_obj:
					driverjob_obj.arrived_at_pickup = True
					driverjob_obj.save()
					try:
						current_date = datetime.datetime.now()
						customerjobdatetime_obj = CustomerJobDateTime.objects.filter(job_id = customerjobid_val).first()
						if customerjobdatetime_obj:
							customerjobdatetime_obj.driver_pickuparrived_datetime = current_date
							customerjobdatetime_obj.save()
						else:
							customerjob_obj = CustomerJob.objects.filter(id = customerjobid_val).first()
							if customerjob_obj:
								CustomerJobDateTime.objects.create(job = customerjob_obj, driver_pickuparrived_datetime = current_date)
					except Exception as e:
						print(e)
					try:
						sendfcmnotification(driverjob_obj.driver.fcmtoken, 'driver', 'statuschange', 'KwickDelivery', 'You have arrived at pickup address')
					except Exception as e:
						print(e)
					try:
						sendfcmnotification(driverjob_obj.customerjob.customer.fcmtoken, 'customer', 'statuschange', 'KwickDelivery', 'Driver has arrived at your pickup address')
					except Exception as e:
						print(e)
					try:
						Notifications.objects.create(user = driverjob_obj.customerjob.customer.user, customerjobid = driverjob_obj.customerjob.id, forcustomer = True, notificationtype = 'Driver Arrived', notificationtext = 'Driver has arrived at your pickup address.', status = 'unread')
					except Exception as e:
						print(e)
					
				else:
					return JsonResponse({'status_code': 400, 'status_message': 'Not a valid request'})
			return JsonResponse({'status_code': 200, 'status_message': 'success'})
		except Exception as e:
			return JsonResponse({'status_code': 500, 'status_message': 'Internal Server Error'})


# @method_decorator(checklogin, name='dispatch')
class DriverArrivedPickup(APIView):
	# permission_classes = (AllowAny,)
	def post(self, request, *args, **kwargs):
		print('\n\n')
		print('DriverArrivedPickup API - in post')
		print('data is  : ',request.POST)
		
		session_token_val = request.POST.get('session_token')
		if not session_token_val:
			return JsonResponse({'status_code': 400, 'status_message': 'User not logged in.'})

		customerjobid_val = request.POST.get('customerjobid')
		if not customerjobid_val:
			return JsonResponse({'status_code': 400, 'status_message': 'customerjobid is required'})
		try:
			driverjobid_val = request.POST.get('driverjobid')
			if not driverjobid_val:
				return JsonResponse({'status_code': 400, 'status_message': 'driverjobid is required'})
			driverjob_obj = DriverJob.objects.filter(id  = driverjobid_val, customerjob_id = customerjobid_val).first()
			if driverjob_obj:
				driverjob_obj.arrived_at_pickup = True
				driverjob_obj.save()
				try:
					current_date = datetime.datetime.now()
					customerjobdatetime_obj = CustomerJobDateTime.objects.filter(job_id = customerjobid_val).first()
					if customerjobdatetime_obj:
						customerjobdatetime_obj.driver_pickuparrived_datetime = current_date
						customerjobdatetime_obj.save()
					else:
						customerjob_obj = CustomerJob.objects.filter(id = customerjobid_val).first()
						if customerjob_obj:
							CustomerJobDateTime.objects.create(job = customerjob_obj, driver_pickuparrived_datetime = current_date)
				except Exception as e:
					print(e)
				try:
					sendfcmnotification(driverjob_obj.driver.fcmtoken, 'driver', 'statuschange', 'KwickDelivery', 'You have arrived at pickup address')
				except Exception as e:
					print(e)
				try:
					sendfcmnotification(driverjob_obj.customerjob.customer.fcmtoken, 'customer', 'statuschange', 'KwickDelivery', 'Driver has arrived at your pickup address')
				except Exception as e:
					print(e)
				try:
					Notifications.objects.create(user = driverjob_obj.customerjob.customer.user, customerjobid = driverjob_obj.customerjob.id, forcustomer = True, notificationtype = 'Driver Arrived', notificationtext = 'Driver has arrived at your pickup address.', status = 'unread')
				except Exception as e:
					print(e)
				return JsonResponse({'status_code': 200, 'status_message': 'success'})
			else:
				return JsonResponse({'status_code': 400, 'status_message': 'Not a valid request'})
		except Exception as e:
			return JsonResponse({'status_code': 500, 'status_message': 'Internal Server Error'})

class GenerateOTPNew(APIView):
	
	def post(self, request, *args, **kwargs):
		print('\n\n\n\n')
		print('data is  : ',request.POST)
		try:
			first_time=True
			data_ids = request.POST.get('data_ids')
			
			session_token_val = request.POST.get('session_token')
				# customerjobid = request.POST.get('customerjobid')
			request_type = request.POST.get('request_type')
			if not session_token_val:
				return JsonResponse({'status_code': 400, 'status_message': 'User not logged in',})
			if not data_ids:
				return JsonResponse({'status_code': 400, 'status_message': 'Data is Required'})
			# if not customerjobid:
			# 	return JsonResponse({'status_code': 400, 'status_message': 'customerjobid is required',})
			if not request_type:
				return JsonResponse({'status_code': 400, 'status_message': 'request_type is required',})
			data_ids = json.loads(data_ids)
			all_data_response=[]
			for ids in data_ids:
				# print("count for manpreet")
				# print(parcel['sendername'])
				print(ids['customerjobid'])
				# print(ids['driverjobid'])
				customerjobid = ids['customerjobid']
				
				customerjob_obj = CustomerJob.objects.filter(id = customerjobid).first()
				if customerjob_obj:
					
					if first_time == True:
						first_time=False
						OTP = ''.join([random.choice( string.digits) for n in range(5)])
						if request_type == 'pickup':
							phone = str(customerjob_obj.sendercountrycode).strip('+') + customerjob_obj.senderphone
						else:
							phone = str(customerjob_obj.recipientcountrycode).strip('+') + customerjob_obj.recipientphone
						print(phone)
						print(OTP)
						print('OTP for' + request_type + 'is' + OTP + '.')
						res1 = send_text_message(phone, 'OTP for' + request_type + 'is' + OTP + '.', 'OTP')
						print(res1)
						# res1 =''
					if res1:
						customeralredycreated=CustomerJobDeliveryExtraDetails.objects.filter(job_id = customerjobid).first()
						if request_type == 'pickup':
							if customeralredycreated:
								customeralredycreated.pickup_otp=OTP
								customeralredycreated.save()
							else:
								CustomerJobDeliveryExtraDetails.objects.create(job_id = customerjobid, pickup_otp = OTP)
						else:
							if customeralredycreated:
								customeralredycreated.delivery_otp=OTP
								customeralredycreated.save()
							else:
								CustomerJobDeliveryExtraDetails.objects.create(job_id = customerjobid, delivery_otp = OTP)
						all_data_response.append({
							'code':200,
							'status_message' : 'success',
							'customerid':customerjobid,
							})
						# return JsonResponse({'status_code': 200, 'status_message' : 'success', 'otp' : OTP})
					else:
						all_data_response.append({
							'code':500,
							'status_message' : 'Internal Server Error',
							'customerid':customerjobid,
							})
						# return JsonResponse({'status_code': 500, 'status_message' : 'Internal Server Error'})
				# a = send_text_message()
			return JsonResponse({'status_code': 200, 'data' : all_data_response,'otp' : OTP})
		except Exception as e:
			print(e)
			return JsonResponse({'status_code': 500, 'status_message' : 'Internal Server Error'})


class GenerateOTP(APIView):
	
	def post(self, request, *args, **kwargs):
		print('\n\n\n\n')
		print('data is  : ',request.POST)
		try:
			session_token_val = request.POST.get('session_token')
			customerjobid = request.POST.get('customerjobid')
			request_type = request.POST.get('request_type')
			if not session_token_val:
				return JsonResponse({'status_code': 400, 'status_message': 'User not logged in',})
			if not customerjobid:
				return JsonResponse({'status_code': 400, 'status_message': 'customerjobid is required',})
			if not request_type:
				return JsonResponse({'status_code': 400, 'status_message': 'request_type is required',})
			customerjob_obj = CustomerJob.objects.filter(id = customerjobid).first()
			if customerjob_obj:
				OTP = ''.join([random.choice( string.digits) for n in range(5)])
				if request_type == 'pickup':
					phone = str(customerjob_obj.sendercountrycode).strip('+') + customerjob_obj.senderphone
				else:
					phone = str(customerjob_obj.recipientcountrycode).strip('+') + customerjob_obj.recipientphone
				print(phone)
				print(OTP)
				print('OTP for' + request_type + 'is' + OTP + '.')
				res1 = send_text_message(phone, 'OTP for' + request_type + 'is' + OTP + '.', 'OTP')
				print(res1)
				# res1 =''
				if res1:
					if request_type == 'pickup':
						CustomerJobDeliveryExtraDetails.objects.create(job_id = customerjobid, pickup_otp = OTP)
					else:
						CustomerJobDeliveryExtraDetails.objects.create(job_id = customerjobid, delivery_otp = OTP)
					return JsonResponse({'status_code': 200, 'status_message' : 'success', 'otp' : OTP})
				else:
					return JsonResponse({'status_code': 500, 'status_message' : 'Internal Server Error'})
				# a = send_text_message()
			
		except Exception as e:
			print(e)
			return JsonResponse({'status_code': 500, 'status_message' : 'Internal Server Error'})




class DriverGetWorkingSlots(APIView):
	
	def get(self, request, *args, **kwargs):
		print('\n\n\n\naa')
		print('data is  : ',request.GET)
		try:
			session_token_val = request.GET.get('session_token')
			
			if not session_token_val:
				return JsonResponse({'status_code': 400, 'status_message': 'User not logged in'})
			
			data = []
			token_obj = Token.objects.filter(key = session_token_val).first()
			if token_obj:
				user_obj = User.objects.filter(id = token_obj.user_id).first()
				if user_obj:
					driver_obj = DriverModel.objects.filter(user = user_obj).first()
					if driver_obj:
						# driverworkingslots_obj = DriverWorkingSlots.objects.filter(driver = driver_obj).first()
						# driverSlotsObj=DriverAllSlots.objects.filter(driver = driver_obj).first()
						alltimeslots = DriverAllSlots.objects.filter(driver=driver_obj).first()
						timeslots_data=[]
						if alltimeslots:
							timeslots_data=addSlots(alltimeslots)
						# if driverworkingslots_obj:
							# data.append({
							# 	'slot_ids' : driverworkingslots_obj.slots,
							# 	'date' : driverworkingslots_obj.date,
							# 	})
							
						return JsonResponse({'status_code': 200, 'status_message': 'success', 'data' : timeslots_data})
					else:
						return JsonResponse({'status_code': 400, 'status_message': 'User not logged in'})
				else:
					return JsonResponse({'status_code': 400, 'status_message': 'User not logged in'})
			else:
				return JsonResponse({'status_code': 400, 'status_message': 'User not logged in'})
		except Exception as e:
			print(e)
			return JsonResponse({'status_code': 500, 'status_message' : 'Internal Server Error'})

class getworkingslotsDates(APIView):
	
	def get(self, request, *args, **kwargs):
		print('\n\n\n\naa')
		print('data is  : ',request.GET)
		try:
			session_token_val = request.GET.get('session_token')
			
			if not session_token_val:
				return JsonResponse({'status_code': 400, 'status_message': 'User not logged in'})
			
			data = []
			token_obj = Token.objects.filter(key = session_token_val).first()
			if token_obj:
				user_obj = User.objects.filter(id = token_obj.user_id).first()
				if user_obj:
					driver_obj = DriverModel.objects.filter(user = user_obj).first()
					if driver_obj:
						# driverworkingslots_obj = DriverWorkingSlots.objects.filter(driver = driver_obj).first()
						# driverSlotsObj=DriverAllSlots.objects.filter(driver = driver_obj).first()
						alltimeslots = DriverAllSlots.objects.filter(driver=driver_obj)
						timeslots_data=[]
						if alltimeslots:
							for slots in alltimeslots:
								timeslots_data.append({'Date':slots.dateOfSlots,
								                      'slotId':slots.id,
								                      })
							return JsonResponse({'status_code': 200, 'status_message': 'success', 'data' : timeslots_data})
						else:
							return JsonResponse({'status_code': 400, 'status_message': 'No TimeSlots available for thi user'})	
					else:
						return JsonResponse({'status_code': 400, 'status_message': 'User not logged in'})
				else:
					return JsonResponse({'status_code': 400, 'status_message': 'User not logged in'})
			else:
				return JsonResponse({'status_code': 400, 'status_message': 'User not logged in'})
		except Exception as e:
			print(e)
			return JsonResponse({'status_code': 500, 'status_message' : 'Internal Server Error'})


class getworkingslotOfADate(APIView):
	
	def get(self, request, *args, **kwargs):
		print('\n\n\n\naa')
		print('data is  : ',request.GET)
		try:
			slotid = request.GET.get('slotid')
			
			if not slotid:
				return JsonResponse({'status_code': 400, 'status_message': 'Slot Id is Required'})
			alltimeslots = DriverAllSlots.objects.filter(id=slotid).first()
			timeslots_data=[]
			if alltimeslots:
				timeslots_data=addSlots(alltimeslots)
				return JsonResponse({'status_code': 200, 'status_message': 'success', 'data' : timeslots_data})
			else:
				return JsonResponse({'status_code': 400, 'status_message': 'No slots available'})
			
		except Exception as e:
			print(e)
			return JsonResponse({'status_code': 500, 'status_message' : 'Internal Server Error'})			




class DriverUpdateWorkingSlots(APIView):
	
	def post(self, request, *args, **kwargs):
		print('\n\n\n\naa')
		print('data is  : ',request.POST)
		try:
			session_token_val = request.POST.get('session_token')
			slot_ids = request.POST.get('slot_ids')
			if not session_token_val:
				return JsonResponse({'status_code': 400, 'status_message': 'User not logged in'})
			if not slot_ids:
				return JsonResponse({'status_code': 400, 'status_message': 'Please select slots'})
			token_obj = Token.objects.filter(key = session_token_val).first()
			if token_obj:
				print(token_obj.user_id)
				user_obj = User.objects.filter(id = token_obj.user_id).first()
				if user_obj:
					driver_obj = DriverModel.objects.filter(user = user_obj).first()
					if driver_obj:
						current_date = datetime.datetime.now().date()
						print('0')
						driverworkingslots_obj = DriverWorkingSlots.objects.filter(driver = driver_obj).first()
						print('1')
						if driverworkingslots_obj:
							print('2')
							print(slot_ids)
							driverworkingslots_obj.slots = slot_ids
							print('3')
							print(current_date)
							driverworkingslots_obj.date = current_date	
							print('4')
							driverworkingslots_obj.save()
							print('5')
						else:
							DriverWorkingSlots.objects.create(driver = driver_obj, date = current_date, slots = slot_ids)
						
						return JsonResponse({'status_code': 200, 'status_message': 'success',})
					else:
						return JsonResponse({'status_code': 400, 'status_message': 'User not logged in'})
				else:
					return JsonResponse({'status_code': 400, 'status_message': 'User not logged in'})
			else:
				return JsonResponse({'status_code': 400, 'status_message': 'User not logged in'})
		except Exception as e:
			print(e)
			return JsonResponse({'status_code': 500, 'status_message' : 'Internal Server Error'})


class DriverUpdateWorkingSlotsExtraTest(APIView):
	
	def post(self, request, *args, **kwargs):
		print('\n\n\n\naa')
		print('data is  : ',request.POST)
		try:
			session_token_val = request.POST.get('session_token')
			slot_ids = request.POST.get('slot_ids')
			# slot_id = request.POST.get('slot_id')
			# new_status = request.POST.get('new_status')
			if not session_token_val:
				return JsonResponse({'status_code': 400, 'status_message': 'User not logged in'})
			if not slot_ids:
				return JsonResponse({'status_code': 400, 'status_message': 'Please select slots'})
			# if not new_status:
			# 	return JsonResponse({'status_code': 400, 'status_message': 'Please select one value enable or disable'})
			token_obj = Token.objects.filter(key = session_token_val).first()
			slot_ids = json.loads(slot_ids)
			if token_obj:
				print(token_obj.user_id)
				user_obj = User.objects.filter(id = token_obj.user_id).first()
				if user_obj:
					driver_obj = DriverModel.objects.filter(user = user_obj).first()
					if driver_obj:
						alltimeslots = DriverAllSlots.objects.filter(driver=driver_obj).first()
						if alltimeslots:
							for s in slot_ids:
								slot_id=int(s['id'])
								if s['new_status'] == 'enable':
									status = True
									respo=changeSlotStatus(alltimeslots,slot_id,status)
									if respo=='1':
										pass
								elif s['new_status'] == 'disable':
									status = False
									respo=changeSlotStatus(alltimeslots,slot_id,status)
									if respo=='1':
										pass
							return JsonResponse({'status_code': 200, 'status_message': 'success',})
						else:
							return JsonResponse({'status_code': 400, 'status_message': 'No slot available for this driver'})
					else:
						return JsonResponse({'status_code': 400, 'status_message': 'User not logged in'})
				else:
					return JsonResponse({'status_code': 400, 'status_message': 'User not logged in'})
			else:
				return JsonResponse({'status_code': 400, 'status_message': 'User not logged in'})
		except Exception as e:
			print(e)
			return JsonResponse({'status_code': 500, 'status_message' : 'Internal Server Error'})

class DriverUpdateWorkingSlotsExtraTest2(APIView):
	
	def post(self, request, *args, **kwargs):
		print('\n\n\n\naa')
		print('data is  : ',request.POST)
		try:
			session_token_val = request.POST.get('session_token')
			slotId = request.POST.get('slotId')
			slotData = request.POST.get('slotData')
			# slot_id = request.POST.get('slot_id')
			# new_status = request.POST.get('new_status')
			if not session_token_val:
				return JsonResponse({'status_code': 400, 'status_message': 'User not logged in'})
			if not slotData:
				return JsonResponse({'status_code': 400, 'status_message': 'Please select slots'})
			# if not new_status:
			# 	return JsonResponse({'status_code': 400, 'status_message': 'Please select one value enable or disable'})
			token_obj = Token.objects.filter(key = session_token_val).first()
			slotData = json.loads(slotData)
			if token_obj:
				print(token_obj.user_id)
				user_obj = User.objects.filter(id = token_obj.user_id).first()
				if user_obj:
					driver_obj = DriverModel.objects.filter(user = user_obj).first()
					if driver_obj:
						alltimeslots = DriverAllSlots.objects.filter(id=slotId).first()
						if alltimeslots:
							for s in slotData:
								slot_id=int(s['srno'])
								if s['new_status'] == 'enable':
									status = True
									respo=changeSlotStatus(alltimeslots,slot_id,status)
									if respo=='1':
										pass
								elif s['new_status'] == 'disable':
									status = False
									respo=changeSlotStatus(alltimeslots,slot_id,status)
									if respo=='1':
										pass
							return JsonResponse({'status_code': 200, 'status_message': 'success',})
						else:
							return JsonResponse({'status_code': 400, 'status_message': 'No slot available for this driver'})
					else:
						return JsonResponse({'status_code': 400, 'status_message': 'User not logged in'})
				else:
					return JsonResponse({'status_code': 400, 'status_message': 'User not logged in'})
			else:
				return JsonResponse({'status_code': 400, 'status_message': 'User not logged in'})
		except Exception as e:
			print(e)
			return JsonResponse({'status_code': 500, 'status_message' : 'Internal Server Error'})




class GetDeliveryFailureReasons(APIView):
	'''This class is used to get all vehicle types '''
	def get(self, request, *args, **kwargs):
		try:
			print('GetDeliveryFailureReasons API - in get')
			data = []
			alltimeslots = TimeSlots.objects.filter(active = True)
			if alltimeslots:
				data.append({
					'reason' : 'Recipient is not at specified address',
					})
				data.append({
					'reason' : 'Any Other Reason',
					})
			print(data)
			return JsonResponse({'status_code': 200, 'status_message' : 'success', 'data' : data})
		except Exception as e:
			print(e)
			return JsonResponse({'status_code': 500, 'status_message' : 'Internal Server Error'})

class DriverDeliveryFailed(APIView):
	# permission_classes = (AllowAny,)
	def post(self, request, *args, **kwargs):
		def getI420FromBase64(codec, id_val, image_path="c:\\"):
			try:
				print(id_val)
				print('\n\n')
				# print(codec)
				print('0')
				base64_data = codec.split(";base64,")
				print('1')
				extens = base64_data[0]
				print('2')
				ext = extens.split("/")
				print('3')
				print(ext)
				extension = str(ext[1])
				print('4')
				base64_data = base64_data[1]
				print('5')
				byte_data = base64.b64decode(base64_data)
				print('6')
				image_data = BytesIO(byte_data)
				print('7')
				
				print('8')
				img = Image.open(image_data)
				print('9')
				customerjob_obj = CustomerJob.objects.filter(id = id_val).first()
				drivervehicle_obj = DriverVehicle.objects.get(id=id_val)
				st = ''.join([random.choice(string.ascii_letters + string.digits) for n in range(6)])
				filepath = str(settings.BASE_DIR)+'/media/DeliveryFailedImg/'+str(customerjob_obj.id)+'_'+str(customerjob_obj.customer.name)
				if(os.path.exists(filepath)):
					pass
					# filesToRemove = [os.path.join(filepath,f) for f in os.listdir(filepath)]
					# for f in filesToRemove:
					# 	os.remove(f) 
				else:
					os.mkdir(filepath)
								
				img = Image.open(image_data)	
				img.save(filepath+'/'+ st +'.'+extension)	
				filename = '/media/DeliveryFailedImg/'+str(customerjob_obj.id)+'_'+str(customerjob_obj.customer.name)+'/'+ st +'.'+extension
				
				# drivervehicle_obj.vehicleimage = filename
				
				# drivervehicle_obj.save()
				return(filename)
			except:
				return('9')
		print('\n\n')
		print('DriverDeliveryFailed API - in post')
		print('data is  : ',request.POST)
		
		session_token_val = request.POST.get('session_token')
		if not session_token_val:
			return JsonResponse({'status_code': 400, 'status_message': 'User not logged in.'})

		customerjobid_val = request.POST.get('customerjobid')
		if not customerjobid_val:
			return JsonResponse({'status_code': 400, 'status_message': 'customerjobid is required'})
		deliveryfailurereason = request.POST.get('deliveryfailurereason')
		if not deliveryfailurereason:
			return JsonResponse({'status_code': 400, 'status_message': 'deliveryfailurereason is required'})
		try:
			driverjobid_val = request.POST.get('driverjobid')
			if not driverjobid_val:
				return JsonResponse({'status_code': 400, 'status_message': 'driverjobid is required'})
			failed_image = request.FILES.get('image')
			if not failed_image:
				return JsonResponse({'status_code': 400, 'status_message': 'Failed Image Proof is required'})
			print('0')
			driverjob_obj = DriverJob.objects.filter(id  = driverjobid_val, customerjob_id = customerjobid_val).first()
			if driverjob_obj:
				print('1')
				driverjob_obj.jobcompleted = True
				driverjob_obj.deliveryfailed = True
				driverjob_obj.save()
				try:
					print('2')
					current_date = datetime.datetime.now()
					customerjobdatetime_obj = CustomerJobDateTime.objects.filter(job_id = customerjobid_val).first()
					if customerjobdatetime_obj:
						print('3')
						customerjobdatetime_obj.deliveryfailed_datetime = current_date
						customerjobdatetime_obj.save()
					else:
						print('4')
						customerjob_obj = CustomerJob.objects.filter(id = customerjobid_val).first()
						if customerjob_obj:
							CustomerJobDateTime.objects.create(job = customerjob_obj, deliveryfailed_datetime = current_date)
					print('5')
					if failed_image:
						customerjob_obj2 = CustomerJob.objects.filter(id = customerjobid_val).first()
						customerjobdeliveryfailed_obj1 = CustomerJobDeliveryFailed.objects.filter(job_id = customerjob_obj2).first()
						# customerjob_obj = CustomerJob.objects.filter(id = customerjobid_val).first()
						if customerjobdeliveryfailed_obj1:
							print('0.6 not updating')
							print('0.7 updating')
							filename = failed_image.name
							filename = filename.split('.')
							extension = str(filename[-1])
							image_data = BytesIO(failed_image.read())
							img = Image.open(image_data)
							st = ''.join([random.choice(string.ascii_letters + string.digits) for n in range(6)])
							filepath = str(settings.BASE_DIR)+'/media/DeliveryFailedImg/'+str(customerjob_obj2.id)+str(st)
							if(os.path.exists(filepath)):
								pass
							else:
								os.makedirs(filepath)
							img.save(filepath +'/delivery_failed.'+extension)	
							filename = '/media/DeliveryFailedImg/'+str(customerjob_obj2.id)+str(st) + '/delivery_failed.'+extension
							print("in RES Image Failed")
							pass
						else:
							print('0.7 updating')
							filename = failed_image.name
							filename = filename.split('.')
							extension = str(filename[-1])
							image_data = BytesIO(failed_image.read())
							img = Image.open(image_data)
							st = ''.join([random.choice(string.ascii_letters + string.digits) for n in range(6)])
							filepath = str(settings.BASE_DIR)+'/media/DeliveryFailedImg/'+str(customerjob_obj2.id)+str(st)
							if(os.path.exists(filepath)):
								pass
							else:
								os.makedirs(filepath)
							img.save(filepath +'/delivery_failed.'+extension)	
							filename = '/media/DeliveryFailedImg/'+str(customerjob_obj2.id)+str(st) + '/delivery_failed.'+extension
							print("in RES Image Failed")
					# if failed_image:
					# 	codec = 'data:image/png;base64,' + failed_image
					# 	print('before function call')
					# 	res = getI420FromBase64(codec, id_val = customerjobid_val)
					# 	print('after function call')
					# 	if res == '9':
					# 		return JsonResponse({'status_code': 400, 'status_message': 'Not a valid request'})
					# 	elif '//' in res:
					# 		image_failed=res
					# 		print("in RES Image Failed")
					customerjobdeliveryfailed_obj = CustomerJobDeliveryFailed.objects.filter(job_id = customerjobid_val).first()
					if customerjobdeliveryfailed_obj:
						print('6')
						pass
					else:
						customerjob_obj = CustomerJob.objects.filter(id = customerjobid_val).first()
						print('7')
						CustomerJobDeliveryFailed.objects.create(job = customerjob_obj, deliveryfailed_datetime = current_date, deliveryfailurereason = deliveryfailurereason,deliveryfailed_image=filename)
				except Exception as e:
					print(e)

				# try:
				# 	sendfcmnotification(driverjob_obj.driver.fcmtoken, 'driver', 'statuschange', 'KwickDelivery', 'You have picked up parcel successfully')
				# except Exception as e:
				# 	print(e)
				try:
					sendfcmnotification(driverjob_obj.customerjob.customer.fcmtoken, 'customer', 'statuschange', 'KwickDelivery', 'Your parcel (AWB-' +  str(10000+int(customerjobid_val)) + ') delivery is failed due to following reason: ' + deliveryfailurereason)

				except Exception as e:
					print(e)
				try:
					Notifications.objects.create(user = driverjob_obj.customerjob.customer.user, customerjobid = customerjobid_val, forcustomer = True, notificationtype = 'Parcel Delivery Failed', notificationtext = 'Your parcel (AWB-' +  str(10000+int(customerjobid_val)) + ') delivery is failed due to following reason: ' + deliveryfailurereason, status = 'unread')

				except Exception as e:
					print(e)

				return JsonResponse({'status_code': 200, 'status_message': 'success'})
			else:
				return JsonResponse({'status_code': 400, 'status_message': 'Not a valid request'})

			
		except Exception as e:
			return JsonResponse({'status_code': 500, 'status_message': 'Internal Server Error'})





class PaymentHistoryForDeliveredParcels(APIView):
	# permission_classes = (AllowAny,)
	def get(self, request):
		''' This API method is used to get profile data of user'''
		print('data is  : ',request.GET)
		try:
			session_token_val = request.GET.get('session_token')
			if not session_token_val:
				return JsonResponse({'status_code': 400, 'status_message': 'User not logged in',})
			chat_data= [] 
			token_obj = Token.objects.filter(key = session_token_val).first()
			if token_obj:
				user_obj = User.objects.filter(id = token_obj.user_id).first()
				if user_obj:
					driver_obj = DriverModel.objects.filter(user = user_obj).first()
					if driver_obj:
						paymenthistory_data= [] 
						driverjob_obj = DriverJob.objects.filter(driver = driver_obj, jobcompleted = True)
						if driverjob_obj:
							print('\n')
							# print(len(driverjob_obj))
							for job in driverjob_obj:
								if job.customerjob.price:
									# print('in if')
									drivercommission = str(round(((70 * job.customerjob.price)/100),2))
								else:
									drivercommission = '0'
								if job.paidtodriver:
									status = 'Paid'
								else:
									status = 'Not Paid'
								print(str(job.customerjob.price))
								print(drivercommission)
								paymenthistory_data.append({
									'sendername' : job.customerjob.sendername,
									'senderpickupaddress' : job.customerjob.pickupaddress,
									'recipientdropoffaddress' : job.customerjob.dropoffaddress,
									'awbnumber' : 'AWB-' + str(10000 + job.customerjob.id),
									'customerjobid' : job.customerjob.id,
									'driverjobid' : job.id,
									'drivercommission' : drivercommission,
									'status' : status,

									})
						# print(paymenthistory_data)
						return JsonResponse({ 'status_code': 200 , 'data' : paymenthistory_data,'status_message' : 'success' })
					else:
						return JsonResponse({ 'status_code': 400 , 'data' : {},'status_message' : '' })
				else:
					return JsonResponse({ 'status_code': 400 , 'data' : {},'status_message' : '' })
			else:
				return JsonResponse({ 'status_code': 400 , 'data' : {},'status_message' : '' })
		except Exception as e:
			print(e)
			return JsonResponse({'status_code': 500, 'status_message': 'Internal Server Error',})



class DriverDeliverToRecipient(APIView):
	# permission_classes = (AllowAny,)
	def post(self, request, *args, **kwargs):
		print('\n\n')
		print('DriverDeliverToRecipient API - in post')
		print('data is  : ',request.POST)
		
		session_token_val = request.POST.get('session_token')
		if not session_token_val:
			return JsonResponse({'status_code': 400, 'status_message': 'User not logged in.'})

		customerjobid_val = request.POST.get('customerjobid')
		if not customerjobid_val:
			return JsonResponse({'status_code': 400, 'status_message': 'customerjobid is required'})
		driverjobid_val = request.POST.get('driverjobid')
		if not driverjobid_val:
			return JsonResponse({'status_code': 400, 'status_message': 'driverjobid is required'})
		try:
			image = request.FILES.get('proofofdelivery')
			if image:
				pass
			else:
				return JsonResponse({'status_code': 400, 'status_message': 'proofofdelivery is required'})
		except Exception as e:
			print(e)
		try:
			customerjob_obj = CustomerJob.objects.filter(id = customerjobid_val).first()
			if customerjob_obj.customer.role == 'customer':
				print('customer user')
				if customerjob_obj.order.charge_from_card:
					if customerjob_obj.price:
						parcel_charge = customerjob_obj.price
						specialbooking_charge = customerjob_obj.specialbooking_charge
						
						total_amount = parcel_charge + specialbooking_charge
						stripe.api_key = "sk_test_P9sozPTZ5nZbhc3fOFCsjNqm00hYGCvJ7l" # varis_raheja
						storedcard_obj = StoredCard.objects.filter(id = customerjob_obj.order.charge_from_card).first()
						if storedcard_obj:
							charge = stripe.Charge.create(
							  amount=int(float(total_amount)*100),
							  currency="gbp",
							  # source = storedcard_obj.stripe_card_id,
							  customer = storedcard_obj.stripe_customer_id,
							  card = storedcard_obj.stripe_card_id,
							  description="Payment for parcel (AWB-" + str(10000 + int(customerjob_obj.id)) + ")",
							)
							customerjobpayment_obj = CustomerJobPayment.objects.create(job = customerjob_obj, stripe_charge_response = str(charge), stripe_charge_id = charge.id, stripe_amount = float((charge.amount)/100))
							if customerjobpayment_obj:
								print('payment received successfully')
				else:
					print("Customer didn't select card while placing order")
					return JsonResponse({'status_code': 400, 'status_message': "Customer didn't select card while placing order"})

			else:
				print('company user')
		except Exception as e:
			print(e)
			return JsonResponse({'status_code': 400, 'status_message': "Payment Server Error"})

		try:
			driverjob_obj = DriverJob.objects.filter(id  = driverjobid_val, customerjob_id = customerjobid_val).first()
			if driverjob_obj:
				driverjob_obj.jobcompleted = True
				driverjob_obj.save()
				try:
					current_date = datetime.datetime.now()
					customerjobdatetime_obj = CustomerJobDateTime.objects.filter(job_id = customerjobid_val).first()
					if customerjobdatetime_obj:
						customerjobdatetime_obj.itemsdelivered_datetime = current_date
						customerjobdatetime_obj.save()
					else:
						customerjob_obj = CustomerJob.objects.filter(id = customerjobid_val).first()
						if customerjob_obj:
							CustomerJobDateTime.objects.create(job = customerjob_obj, itemsdelivered_datetime = current_date)
				except Exception as e:
					print(e)
				try:
					image = request.FILES.get('proofofdelivery')
					if image:
						customerjob_obj = CustomerJob.objects.filter(id = customerjobid_val).first()
						filename = image.name
						filename = filename.split('.')
						extension = str(filename[-1])
						image_data = BytesIO(image.read())
						img = Image.open(image_data)
						filepath = str(settings.BASE_DIR)+'/media/CustomerJobs/'+str(customerjob_obj.id)
						if(os.path.exists(filepath)):
							pass
						else:
							os.makedirs(filepath)
						img.save(filepath +'/proofofdelivery.'+extension)	
						filename = '/media/CustomerJobs/'+str(customerjob_obj.id) + '/proofofdelivery.'+extension
						proofofdelivery_filepath = filename
						
					else:
						print('no proofofdelivery image')
				except Exception as e:
					print(e)


				try:
					sendfcmnotification(driverjob_obj.driver.fcmtoken, 'driver', 'statuschange', 'KwickDelivery', 'You have delivered parcel successfully')
				except Exception as e:
					print(e)
				try:
					Notifications.objects.create(user = driverjob_obj.driver.user, customerjobid = driverjob_obj.customerjob.id, driverjobid = driverjob_obj.id, fordriver = True, notificationtype = 'Parcel Delivered', notificationtext = 'You have delivered parcel successfully', status = 'unread')
				except Exception as e:
					print(e)
				try:
					sendfcmnotification(driverjob_obj.customerjob.customer.fcmtoken, 'customer', 'statuschange', 'KwickDelivery', 'Your parcel is delivered successfully')
				except Exception as e:
					print(e)
				try:
					Notifications.objects.create(user = driverjob_obj.customerjob.customer.user, customerjobid = driverjob_obj.customerjob.id, forcustomer = True, notificationtype = 'Parcel Delivered', notificationtext = 'Your parcel is delivered successfully', status = 'unread')
				except Exception as e:
					print(e)
				try:
					sender_phone = str(driverjob_obj.customerjob.sendercountrycode).strip('+') + driverjob_obj.customerjob.senderphone
					recipient_phone = str(driverjob_obj.customerjob.recipientcountrycode).strip('+') + driverjob_obj.customerjob.recipientphone
					print(sender_phone)
					print(recipient_phone)
					res1 = send_text_message(sender_phone, 'Your parcel is successfully delivered.', 'OTP')
					print(res1)
					res2 = send_text_message(recipient_phone, 'You have successfully received parcel.', 'OTP')
					print(res2)
				except Exception as e:
					print(e)

				return JsonResponse({'status_code': 200, 'status_message': 'success'})
			else:
				return JsonResponse({'status_code': 400, 'status_message': 'Not a valid request'})

			# deliveryboyuser_obj = MainUser.objects.filter(token = session_token_val).first()
			# if not deliveryboyuser_obj:
			# 	return Response({'code': 0, 'error': 'User not logged in.','status_code': 0, 'status_message': 'User not logged in.'})
			# customer_job_obj=CustomerJob.objects.filter(awdnumber = awbnumber_val).first()

			
			# matchedparceldeliveryboy_obj = MatchedParcelsDeliveryBoyModal.objects.filter(matchedparcel = customer_job_obj, matcheddeliveryboy = deliveryboyuser_obj, jobcompleted = False, attime = 1).first()
			# if matchedparceldeliveryboy_obj:
			# 	current_date = datetime.datetime.now()
			# 	customerjobdatetime_obj = CustomerJobDateTime.objects.filter(job=customer_job_obj).update(firstmilepickup_datetime=current_date)
			# 	deliveryduration = ''
			# 	Notifications.objects.create(user=customer_job_obj.user.user,forcustomer=True,related_job_id=customer_job_obj.parcel_id,relatedawbnumber = customer_job_obj.awdnumber,notificationtype='Pickedup By Delivery Boy',text='Your parcel is pickedup by delivery boy.')
			# 	Notifications.objects.create(user=deliveryboyuser_obj,fordelivery=True,deliveryduration = deliveryduration,related_job_id=customer_job_obj.parcel_id,relatedawbnumber = customer_job_obj.awdnumber,notificationtype='Parcel Pickedup',text='You have pickedup parcel from customer pickup address.')
			# 	CustomerJobStatus.objects.filter(job=customer_job_obj).update(bookingreceived=False,bookingconfirmed=False,deliveryboyassigned=False,firstmilepickup=True,atairdelyhub=False,parcelassignedtoairtraveller=False,otwtoairport=False,intransit=False,atdestinationairport=False,atdestinationhub=False,outfordelivery=False,itemsdelivered=False,customerselfdeliverytoairdelycentre=False,recipientselfcollectfromairdelycentre=False)
				
			# 	matchedparceldeliveryboy_obj.parcelverified = True
			# 	# matchedparceldeliveryboy_obj.jobcompleted = True
			# 	matchedparceldeliveryboy_obj.save()
			# 	BookedDeliveryBoys.objects.filter(matchedparcelsdeliveryboy_reference = matchedparceldeliveryboy_obj).delete()
			# 	return JsonResponse({ 'code': 200 , 'message' : 'You have pickedup the parcel.','status_code': 200 , 'status_message' : 'You have pickedup the parcel.' }, status=200, safe=False)
			# else:
			# 	return JsonResponse({ 'code': 100 , 'message' : 'This QR Code is not associated with your record.','status_code': 100 , 'status_message' : 'This QR Code is not associated with your record.' }, status=200, safe=False)
		except Exception as e:
			return JsonResponse({'status_code': 500, 'status_message': 'Internal Server Error'})


class DriverDeliverToRecipientTestExtraTest(APIView):
	# permission_classes = (AllowAny,)
	def post(self, request, *args, **kwargs):
		print('\n\n')
		print('DriverDeliverToRecipient API - in post')
		print('data is  : ',request.POST)
		
		session_token_val = request.POST.get('session_token')
		if not session_token_val:
			return JsonResponse({'status_code': 400, 'status_message': 'User not logged in.'})

		# customerjobid_val = request.POST.get('customerjobid')
		# if not customerjobid_val:
		# 	return JsonResponse({'status_code': 400, 'status_message': 'customerjobid is required'})
		# driverjobid_val = request.POST.get('driverjobid')
		# if not driverjobid_val:
		# 	return JsonResponse({'status_code': 400, 'status_message': 'driverjobid is required'})
		method_type = request.POST.get('method_type')
		if not method_type:
			return JsonResponse({'status_code': 400, 'status_message': 'method_type is required'})
		data_ids = request.POST.get('data_ids')
		# data_ids = json.loads(data_ids)
		if not data_ids:
			return JsonResponse({'status_code': 400, 'status_message': 'Data is Required'})
		data_ids = json.loads(data_ids)
		all_data_response=[]
		sameIdParcelCopy=0
		for ids in data_ids:
			print(ids['customerjobid'])
			print(ids['driverjobid'])
			customerjobid_val = ids['customerjobid']
			driverjobid_val = ids['driverjobid']
			latitude_val = ids['latitude']
			longitude_val = ids['longitude']
			comment_for_parcel=False
			customerjob_obj = CustomerJob.objects.filter(id = customerjobid_val).first()
			sameIdParcelCopy=customerjob_obj.sameIdForParcelsDetails
			try:
				driverjob_obj = DriverJob.objects.filter(id  = driverjobid_val, customerjob_id = customerjobid_val).first()
				if driverjob_obj.parcel_disabled == True:
					comment_for_parcel=True
				# else:
				# 	method_type = request.POST.get('method_type')
				# 	if not method_type:
				# 		return JsonResponse({'status_code': 400, 'status_message': 'method_type is required'})
						
			except Exception as e:
				all_data_response.append({
					'customerid':customerjobid_val,
					'driverid':driverjobid_val,
					'status_message' : 'Driver Job not Found',
					'error':'true',
					})


			try:
				customerjob_obj = CustomerJob.objects.filter(id = customerjobid_val).first()
				api_key = str(settings.GOOGLE_API_KEY)
				print("location 1")
				# pickupaddress_val = pickupaddress_val.replace(' ','')
				# pickupaddress_val = pickupaddress_val.replace('#','')
				# dropaddress_val = dropaddress_val.replace(' ','')
				# dropaddress_val = dropaddress_val.replace('#','')
				# source = pickupaddress_val

				# dest = dropaddress_val
				driverlatitude_val=str(latitude_val)
				driverlongitude_val=str(longitude_val)
				parcellatitude_val=str(customerjob_obj.recipientlatitude)
				parcellongitude_val=str(customerjob_obj.recipientlongitude)
				print("location 2")
				url ='https://maps.googleapis.com/maps/api/distancematrix/json?'
				if driverlatitude_val and driverlongitude_val and parcellatitude_val and parcellongitude_val:
					print("location 3")
					drivercoordinates_val = driverlatitude_val + ',' + driverlongitude_val
					parcelcoordinates_val = parcellatitude_val + ',' + parcellongitude_val
					# return response object 
					print(url + 'origins=' + drivercoordinates_val + '&destinations=' + parcelcoordinates_val + '&key=' + api_key)
					r = requests.get(url + 'origins=' + drivercoordinates_val + '&destinations=' + parcelcoordinates_val + '&key=' + api_key)
				print("location 4")
				x = r.json() 
				print(x)
				print('\n')
				print("location 5")
				radius=500.0
				try:
					radiusObject=RadiusControl.objects.filter(enable=True).first()
					radius=radiusObject.distance
				except:
					radius=500.0
				if x['status'] == 'OK':
					print("location 6")
					multiplicationfactor = 0.000621371192
					distanceinmiles = float(x['rows'][0]['elements'][0]['distance']['value']) * multiplicationfactor
					desti_radius=float(radius*multiplicationfactor)
					print(desti_radius)
					print("location 7")
					if distanceinmiles<=desti_radius:
					# if True:
						print("arrived")
					else:
						try:
							radiusPermisssion=RadiusPermission.objects.filter(driverjob=driverjob_obj,customerjob=customerjob_obj).first()
							if radiusPermisssion:
								if radiusPermisssion.status=='0':
									return JsonResponse({'status_code': 400, 'status_message': 'Your request is in Process,Please wait'})
								elif radiusPermisssion.status=='1':
									pass
								elif radiusPermisssion.status=='2':
									return JsonResponse({'status_code': 400, 'status_message': 'you are not in radius,Admin Rejected your request'})
							else:
								RadiusPermission.objects.create(driverjob=driverjob_obj,customerjob=customerjob_obj,distance=distanceinmiles,status=0)
								return JsonResponse({'status_code': 400, 'status_message': 'Your request send to admin,Please wait'})
						except Exception as e:
							print(e)
							return JsonResponse({'status_code': 400, 'status_message': 'location error'})
				else:
					print("nothing")
					return JsonResponse({'status_code': 400, 'status_message': 'you are not in radius of parcel location'})
			except Exception as e:
				print(e)
				return JsonResponse({'status_code': 400, 'status_message': 'location error'})





			# parcel_comment = ids['comment']
			
			if comment_for_parcel == False:
				try:
					if method_type == 'signature':
						name_val = request.POST.get('name')
						if not name_val:
							return JsonResponse({'status_code': 400, 'status_message': 'name is required'})
						try:
							print('000000000000000')
							image = request.FILES.get('signature')
							print('11111111111111')
							try:
								print('2222222222222')
								print(image.name)

							except Exception as e:
								print(e)
							if image:
								customerjob_obj = CustomerJob.objects.filter(id = customerjobid_val).first()
								filename = image.name
								filename = filename.split('.')
								extension = str(filename[-1])
								image_data = BytesIO(image.read())
								img = Image.open(image_data)
								filepath = str(settings.BASE_DIR)+'/media/CustomerJobs/'+str(customerjob_obj.id)
								if(os.path.exists(filepath)):
									pass
								else:
									os.makedirs(filepath)
								img.save(filepath +'/delivery_recipientsignature.'+extension)	
								filename = '/media/CustomerJobs/'+str(customerjob_obj.id) + '/delivery_recipientsignature.'+extension
								customerjobdeliveryextradetails_obj = CustomerJobDeliveryExtraDetails.objects.filter(job_id = customerjobid_val).first()
								if customerjobdeliveryextradetails_obj:
									customerjobdeliveryextradetails_obj.delivery_proof_method = method_type
									customerjobdeliveryextradetails_obj.delivery_toperson_name = name_val
									customerjobdeliveryextradetails_obj.delivery_toperson_signature = filename
									customerjobdeliveryextradetails_obj.save()
								else:
									CustomerJobDeliveryExtraDetails.objects.create(job_id = customerjobid_val, delivery_proof_method = method_type, delivery_toperson_name = name_val, delivery_toperson_signature = filename)
								
							else:
								return JsonResponse({'status_code': 400, 'status_message': 'signature is required'})
						except Exception as e:
							print(e)
							return JsonResponse({'status_code': 400, 'status_message': 'Internal Server Error'})

					elif method_type =='otp':
						otp_val = request.POST.get('otp')
						if not otp_val:
							return JsonResponse({'status_code': 400, 'status_message': 'otp is required'})
						customerjobdeliveryextradetails_obj = CustomerJobDeliveryExtraDetails.objects.filter(job_id = customerjobid_val).last()
						if customerjobdeliveryextradetails_obj:
							if customerjobdeliveryextradetails_obj.delivery_otp == otp_val:
								customerjobdeliveryextradetails_obj = CustomerJobDeliveryExtraDetails.objects.filter(job_id = customerjobid_val).first()
								if customerjobdeliveryextradetails_obj:
									customerjobdeliveryextradetails_obj.delivery_proof_method = method_type
									customerjobdeliveryextradetails_obj.save()
								else:
									CustomerJobDeliveryExtraDetails.objects.create(job_id = customerjobid_val, delivery_proof_method = method_type)
							else:
								return JsonResponse({'status_code': 400, 'status_message': 'Invalid OTP'})
				except Exception as e:
					print(e)
					return JsonResponse({'status_code': 500, 'status_message': 'Internal Server Error'})
				
				try:
					customerjob_obj = CustomerJob.objects.filter(id = customerjobid_val).first()
					if customerjob_obj.customer.role == 'customer':
						print('customer user')
						if customerjob_obj.order.charge_from_card:
							if customerjob_obj.price:
								parcel_charge = customerjob_obj.price
								specialbooking_charge = customerjob_obj.specialbooking_charge
								
								total_amount = parcel_charge + specialbooking_charge
								# stripe.api_key = "sk_test_P9sozPTZ5nZbhc3fOFCsjNqm00hYGCvJ7l" # varis_raheja
								stripe.api_key = str(settings.STRIPE_KEY)
								storedcard_obj = StoredCard.objects.filter(id = customerjob_obj.order.charge_from_card).first()
								if storedcard_obj:
									charge = stripe.Charge.create(
									  amount=int(float(total_amount)*100),
									  currency="gbp",
									  # source = storedcard_obj.stripe_card_id,
									  customer = storedcard_obj.stripe_customer_id,
									  card = storedcard_obj.stripe_card_id,
									  description="Payment for parcel (AWB-" + str(10000 + int(customerjob_obj.id)) + ")",
									)
									customerjobpayment_obj = CustomerJobPayment.objects.create(job = customerjob_obj, stripe_charge_response = str(charge), stripe_charge_id = charge.id, stripe_amount = float((charge.amount)/100))
									if customerjobpayment_obj:
										print('payment received successfully')
						else:
							print("Customer didn't select card while placing order")
							return JsonResponse({'status_code': 400, 'status_message': "Customer didn't select card while placing order"})

					else:
						print('company user')
				except Exception as e:
					print(e)
					return JsonResponse({'status_code': 400, 'status_message': "Payment Server Error"})

			try:
				driverjob_obj = DriverJob.objects.filter(id  = driverjobid_val, customerjob_id = customerjobid_val).first()
				
				if driverjob_obj:
					if comment_for_parcel == False:
						driverjob_obj.jobcompleted = True
						driverjob_obj.save()
						try:
							current_date = datetime.datetime.now()
							customerjobdatetime_obj = CustomerJobDateTime.objects.filter(job_id = customerjobid_val).first()
							if customerjobdatetime_obj:
								customerjobdatetime_obj.itemsdelivered_datetime = current_date
								customerjobdatetime_obj.save()
							else:
								customerjob_obj = CustomerJob.objects.filter(id = customerjobid_val).first()
								if customerjob_obj:
									CustomerJobDateTime.objects.create(job = customerjob_obj, itemsdelivered_datetime = current_date)
						except Exception as e:
							print(e)
					else:
						driverjob_obj.jobcompleted = True
						driverjob_obj.save()

					
					if comment_for_parcel == False:
						try:
							sendfcmnotification(driverjob_obj.driver.fcmtoken, 'driver', 'statuschange', 'KwickDelivery', 'You have delivered parcel successfully')
						except Exception as e:
							print(e)
					else:
						try:
							sendfcmnotification(driverjob_obj.driver.fcmtoken, 'driver', 'statuschange', 'KwickDelivery', 'This Parcel is Disabled')
						except Exception as e:
							print(e)

					if comment_for_parcel == False:
						try:
							Notifications.objects.create(user = driverjob_obj.driver.user, customerjobid = driverjob_obj.customerjob.id, driverjobid = driverjob_obj.id, fordriver = True, notificationtype = 'Parcel Delivered', notificationtext = 'You have delivered parcel successfully', status = 'unread')
						except Exception as e:
							print(e)
					else:
						try:
							Notifications.objects.create(user = driverjob_obj.driver.user, customerjobid = driverjob_obj.customerjob.id, driverjobid = driverjob_obj.id, fordriver = True, notificationtype = 'Parcel Delivered', notificationtext = 'This Parcel is Disabled', status = 'unread')
						except Exception as e:
							print(e)

					if comment_for_parcel == False:	
						try:
							sendfcmnotification(driverjob_obj.customerjob.customer.fcmtoken, 'customer', 'statuschange', 'KwickDelivery', 'Your parcel is delivered successfully')
						except Exception as e:
							print(e)
					else:
						try:
							sendfcmnotification(driverjob_obj.customerjob.customer.fcmtoken, 'customer', 'statuschange', 'KwickDelivery', 'This Parcel is Disabled,Driver not found this parcel')
						except Exception as e:
							print(e)

					if comment_for_parcel == False:		
						try:
							Notifications.objects.create(user = driverjob_obj.customerjob.customer.user, customerjobid = driverjob_obj.customerjob.id, forcustomer = True, notificationtype = 'Parcel Delivered', notificationtext = 'Your parcel is delivered successfully', status = 'unread')
						except Exception as e:
							print(e)
					else:
						try:
							Notifications.objects.create(user = driverjob_obj.customerjob.customer.user, customerjobid = driverjob_obj.customerjob.id, forcustomer = True, notificationtype = 'Parcel Delivered', notificationtext = 'This Parcel is Disabled,Driver not found this parcel', status = 'unread')
						except Exception as e:
							print(e)
					if comment_for_parcel == False:
						try:
							sender_phone = str(driverjob_obj.customerjob.sendercountrycode).strip('+') + driverjob_obj.customerjob.senderphone
							recipient_phone = str(driverjob_obj.customerjob.recipientcountrycode).strip('+') + driverjob_obj.customerjob.recipientphone
							print(sender_phone)
							print(recipient_phone)
							res1 = send_text_message(sender_phone, 'Your parcel is successfully delivered.', 'OTP')
							print(res1)
							res2 = send_text_message(recipient_phone, 'You have successfully received parcel.', 'OTP')
							print(res2)
						except Exception as e:
							print(e)

						# return JsonResponse({'status_code': 200, 'status_message': 'success'})
					if comment_for_parcel == False:
						all_data_response.append({
							'customerid':customerjobid_val,
							'driverid':driverjobid_val,
							'status_message' : 'Parcel Deliverd',
							'error':'false',
							})
					else:
						all_data_response.append({
							'customerid':customerjobid_val,
							'driverid':driverjobid_val,
							'status_message' : 'This Parcel is disabled',
							'error':'false',
							})
				else:
					all_data_response.append({
						'customerid':customerjobid_val,
						'driverid':driverjobid_val,
						'status_message' : 'Driver Job not Found',
						'error':'true',
						})
				

					# return JsonResponse({'status_code': 400, 'status_message': 'Not a valid request'})

				# deliveryboyuser_obj = MainUser.objects.filter(token = session_token_val).first()
				# if not deliveryboyuser_obj:
				# 	return Response({'code': 0, 'error': 'User not logged in.','status_code': 0, 'status_message': 'User not logged in.'})
				# customer_job_obj=CustomerJob.objects.filter(awdnumber = awbnumber_val).first()

				
				# matchedparceldeliveryboy_obj = MatchedParcelsDeliveryBoyModal.objects.filter(matchedparcel = customer_job_obj, matcheddeliveryboy = deliveryboyuser_obj, jobcompleted = False, attime = 1).first()
				# if matchedparceldeliveryboy_obj:
				# 	current_date = datetime.datetime.now()
				# 	customerjobdatetime_obj = CustomerJobDateTime.objects.filter(job=customer_job_obj).update(firstmilepickup_datetime=current_date)
				# 	deliveryduration = ''
				# 	Notifications.objects.create(user=customer_job_obj.user.user,forcustomer=True,related_job_id=customer_job_obj.parcel_id,relatedawbnumber = customer_job_obj.awdnumber,notificationtype='Pickedup By Delivery Boy',text='Your parcel is pickedup by delivery boy.')
				# 	Notifications.objects.create(user=deliveryboyuser_obj,fordelivery=True,deliveryduration = deliveryduration,related_job_id=customer_job_obj.parcel_id,relatedawbnumber = customer_job_obj.awdnumber,notificationtype='Parcel Pickedup',text='You have pickedup parcel from customer pickup address.')
				# 	CustomerJobStatus.objects.filter(job=customer_job_obj).update(bookingreceived=False,bookingconfirmed=False,deliveryboyassigned=False,firstmilepickup=True,atairdelyhub=False,parcelassignedtoairtraveller=False,otwtoairport=False,intransit=False,atdestinationairport=False,atdestinationhub=False,outfordelivery=False,itemsdelivered=False,customerselfdeliverytoairdelycentre=False,recipientselfcollectfromairdelycentre=False)
					
				# 	matchedparceldeliveryboy_obj.parcelverified = True
				# 	# matchedparceldeliveryboy_obj.jobcompleted = True
				# 	matchedparceldeliveryboy_obj.save()
				# 	BookedDeliveryBoys.objects.filter(matchedparcelsdeliveryboy_reference = matchedparceldeliveryboy_obj).delete()
				# 	return JsonResponse({ 'code': 200 , 'message' : 'You have pickedup the parcel.','status_code': 200 , 'status_message' : 'You have pickedup the parcel.' }, status=200, safe=False)
				# else:
				# return JsonResponse({ 'code': 100 , 'message' : 'This QR Code is not associated with your record.','status_code': 100 , 'status_message' : 'This QR Code is not associated with your record.' }, status=200, safe=False)
				# return JsonResponse({'status_code': 500, 'status_message': 'Internal Server Error'})
			
			except Exception as e:
				all_data_response.append({
					'customerid':customerjobid_val,
					'driverid':driverjobid_val,
					'status_message' : 'Internal Server Error',
					'error':'true',
					})
				# return JsonResponse({'status_code': 500, 'status_message': 'Internal Server Error'})
		if sameIdParcelCopy !=0:
			slotStatusonJobCompletenew(sameIdParcelCopy)
		return JsonResponse({'status_code': 200, 'status_message': all_data_response})

def slotStatusonJobCompletenew(sameparcelID):
	customerjob_obj_all = CustomerJob.objects.filter(sameIdForParcelsDetails = sameparcelID)
	packageCompleted=True
	startSlot=24
	lastSlot=0
	driverID=0
	driverExist=False
	for customer in customerjob_obj_all:
		dJob=DriverJob.objects.filter(customerjob=customer).first()
		if dJob:
			print("we are in driver job")
			driverExist=True
			driverID=dJob.driver.id
			print(customer.pickuptimeslotDate)
			print(customer.pickuptimeslot)
			stringFirst=customer.pickuptimeslot
			one=stringFirst.split('-')[0]
			two=stringFirst.split('-')[1]
			one=convert24(one)
			two=convert24(two)
			stringFirst=one+" "+two
			print(one)
			print(two)
			print(stringFirst)
			pickupSlotID=int(stringFirst[:2])
			if pickupSlotID<startSlot:
				startSlot=pickupSlotID
			print("Pickupslotid",pickupSlotID)
			print(customer.dropofftimeslot)
			stringSecond=customer.dropofftimeslot
			one=stringSecond.split('-')[0]
			two=stringSecond.split('-')[1]
			one=convert24(one)
			two=convert24(two)
			stringSecond=one+" "+two
			print(one)
			print(two)
			print(stringSecond)
			deliverySlotID=int(stringSecond[:2])
			if deliverySlotID>lastSlot:
				lastSlot=deliverySlotID
	slotsFind=False
	idofslottables=0
	print("one 1")
	pickupdateCuystomer = CustomerJob.objects.filter(sameIdForParcelsDetails = sameparcelID).first()
	print(pickupdateCuystomer)
	print("one 2")
	parcelpickupdate=pickupdateCuystomer.pickuptimeslotDate
	print("one 3")
	dJob=DriverJob.objects.filter(customerjob=pickupdateCuystomer).first()
	print(dJob)
	if dJob:
		print("one 4")
		driver=dJob.driver
		print("one 5",driver)
		driverslotsobj=DriverAllSlots.objects.filter(driver=driver)
		print("one 6",driverslotsobj)
		for d in driverslotsobj:
			print("one 7")
			if d.dateOfSlots==parcelpickupdate:
				print("one 8",d.dateOfSlots)
				slotsFind=True
				idofslottables=d.id
				print("one 8",idofslottables)
	if slotsFind==True:
		print("one 9")
		if driverExist:
			print("one 10")
			makeslotAvailablenew(startSlot,lastSlot+1,idofslottables)

def makeslotAvailablenew(slotId,slotId2,driveridforslots):
	try:
		slotId=slotId+1
		# driver_obj = DriverModel.objects.filter(id = DriverID).first()
		# print("DriverTimeSlots-in get ")
		# alltimeslots = DriverAllSlots.objects.filter(driver=driver_obj).first()
		driverslotsobj=DriverAllSlots.objects.filter(id=driveridforslots).first()
		if driverslotsobj:
			if slotId<=1 and slotId2>=1:
				driverslotsobj.activeSlot1=True
			if slotId<=2 and slotId2>=2:
				driverslotsobj.activeSlot2=True
			if slotId<=3 and slotId2>=3:
				driverslotsobj.activeSlot3=True
			if slotId<=4 and slotId2>=4:
				driverslotsobj.activeSlot4=True
			if slotId<=5 and slotId2>=5:
				driverslotsobj.activeSlot5=True
			if slotId<=6 and slotId2>=6:
				driverslotsobj.activeSlot6=True
			if slotId<=7 and slotId2>=7:
				driverslotsobj.activeSlot7=True
			if slotId<=8 and slotId2>=8:
				driverslotsobj.activeSlot8=True
			if slotId<=9 and slotId2>=9:
				driverslotsobj.activeSlot9=True
			if slotId<=10 and slotId2>=10:
				driverslotsobj.activeSlot10=True
			if slotId<=11 and slotId2>=11:
				driverslotsobj.activeSlot11=True
			if slotId<=12 and slotId2>=12:
				driverslotsobj.activeSlot12=True
			if slotId<=13 and slotId2>=13:
				driverslotsobj.activeSlot13=True
			if slotId<=14 and slotId2>=14:
				driverslotsobj.activeSlot14=True
			if slotId<=15 and slotId2>=15:
				driverslotsobj.activeSlot15=True
			if slotId<=16 and slotId2>=16:
				driverslotsobj.activeSlot16=True
			if slotId<=17 and slotId2>=17:
				driverslotsobj.activeSlot17=True
			if slotId<=18 and slotId2>=18:
				driverslotsobj.activeSlot18=True
			if slotId<=19 and slotId2>=19:
				driverslotsobj.activeSlot19=True
			if slotId<=20 and slotId2>=20:
				driverslotsobj.activeSlot120=True
			if slotId<=21 and slotId2>=21:
				driverslotsobj.activeSlot21=True
			if slotId<=22 and slotId2>=22:
				driverslotsobj.activeSlot22=True
			if slotId<=23 and slotId2>=23:
				driverslotsobj.activeSlot23=True
			if slotId<=24 and slotId2>=24:
				driverslotsobj.activeSlot24=True
			driverslotsobj.save()
		return 'pass'
	except Exception as e:
		print(e)
		return 'fail'

		
class DriverDeliverToRecipientTest(APIView):
	# permission_classes = (AllowAny,)
	def post(self, request, *args, **kwargs):
		print('\n\n')
		print('DriverDeliverToRecipient API - in post')
		print('data is  : ',request.POST)
		
		session_token_val = request.POST.get('session_token')
		if not session_token_val:
			return JsonResponse({'status_code': 400, 'status_message': 'User not logged in.'})

		customerjobid_val = request.POST.get('customerjobid')
		if not customerjobid_val:
			return JsonResponse({'status_code': 400, 'status_message': 'customerjobid is required'})
		driverjobid_val = request.POST.get('driverjobid')
		if not driverjobid_val:
			return JsonResponse({'status_code': 400, 'status_message': 'driverjobid is required'})
		method_type = request.POST.get('method_type')
		if not method_type:
			return JsonResponse({'status_code': 400, 'status_message': 'method_type is required'})
		try:
			if method_type == 'signature':
				name_val = request.POST.get('name')
				if not name_val:
					return JsonResponse({'status_code': 400, 'status_message': 'name is required'})
				try:
					print('000000000000000')
					image = request.FILES.get('signature')
					print('11111111111111')
					try:
						print('2222222222222')
						print(image.name)

					except Exception as e:
						print(e)
					if image:
						customerjob_obj = CustomerJob.objects.filter(id = customerjobid_val).first()
						filename = image.name
						filename = filename.split('.')
						extension = str(filename[-1])
						image_data = BytesIO(image.read())
						img = Image.open(image_data)
						filepath = str(settings.BASE_DIR)+'/media/CustomerJobs/'+str(customerjob_obj.id)
						if(os.path.exists(filepath)):
							pass
						else:
							os.makedirs(filepath)
						img.save(filepath +'/delivery_recipientsignature.'+extension)	
						filename = '/media/CustomerJobs/'+str(customerjob_obj.id) + '/delivery_recipientsignature.'+extension
						customerjobdeliveryextradetails_obj = CustomerJobDeliveryExtraDetails.objects.filter(job_id = customerjobid_val).first()
						if customerjobdeliveryextradetails_obj:
							customerjobdeliveryextradetails_obj.delivery_proof_method = method_type
							customerjobdeliveryextradetails_obj.delivery_toperson_name = name_val
							customerjobdeliveryextradetails_obj.delivery_toperson_signature = filename
							customerjobdeliveryextradetails_obj.save()
						else:
							CustomerJobDeliveryExtraDetails.objects.create(job_id = customerjobid_val, delivery_proof_method = method_type, delivery_toperson_name = name_val, delivery_toperson_signature = filename)
						
					else:
						return JsonResponse({'status_code': 400, 'status_message': 'signature is required'})
				except Exception as e:
					print(e)
					return JsonResponse({'status_code': 400, 'status_message': 'Internal Server Error'})

			elif method_type =='otp':
				otp_val = request.POST.get('otp')
				if not otp_val:
					return JsonResponse({'status_code': 400, 'status_message': 'otp is required'})
				customerjobdeliveryextradetails_obj = CustomerJobDeliveryExtraDetails.objects.filter(job_id = customerjobid_val).last()
				if customerjobdeliveryextradetails_obj:
					if customerjobdeliveryextradetails_obj.delivery_otp == otp_val:
						customerjobdeliveryextradetails_obj = CustomerJobDeliveryExtraDetails.objects.filter(job_id = customerjobid_val).first()
						if customerjobdeliveryextradetails_obj:
							customerjobdeliveryextradetails_obj.delivery_proof_method = method_type
							customerjobdeliveryextradetails_obj.save()
						else:
							CustomerJobDeliveryExtraDetails.objects.create(job_id = customerjobid_val, delivery_proof_method = method_type)
					else:
						return JsonResponse({'status_code': 400, 'status_message': 'Invalid OTP'})
		except Exception as e:
			print(e)
			return JsonResponse({'status_code': 500, 'status_message': 'Internal Server Error'})
		
		try:
			customerjob_obj = CustomerJob.objects.filter(id = customerjobid_val).first()
			if customerjob_obj.customer.role == 'customer':
				print('customer user')
				if customerjob_obj.order.charge_from_card:
					if customerjob_obj.price:
						parcel_charge = customerjob_obj.price
						specialbooking_charge = customerjob_obj.specialbooking_charge
						
						total_amount = parcel_charge + specialbooking_charge
						# stripe.api_key = "sk_test_P9sozPTZ5nZbhc3fOFCsjNqm00hYGCvJ7l" # varis_raheja
						stripe.api_key = str(settings.STRIPE_KEY)
						storedcard_obj = StoredCard.objects.filter(id = customerjob_obj.order.charge_from_card).first()
						if storedcard_obj:
							charge = stripe.Charge.create(
							  amount=int(float(total_amount)*100),
							  currency="gbp",
							  # source = storedcard_obj.stripe_card_id,
							  customer = storedcard_obj.stripe_customer_id,
							  card = storedcard_obj.stripe_card_id,
							  description="Payment for parcel (AWB-" + str(10000 + int(customerjob_obj.id)) + ")",
							)
							customerjobpayment_obj = CustomerJobPayment.objects.create(job = customerjob_obj, stripe_charge_response = str(charge), stripe_charge_id = charge.id, stripe_amount = float((charge.amount)/100))
							if customerjobpayment_obj:
								print('payment received successfully')
				else:
					print("Customer didn't select card while placing order")
					return JsonResponse({'status_code': 400, 'status_message': "Customer didn't select card while placing order"})

			else:
				print('company user')
		except Exception as e:
			print(e)
			return JsonResponse({'status_code': 400, 'status_message': "Payment Server Error"})

		try:
			driverjob_obj = DriverJob.objects.filter(id  = driverjobid_val, customerjob_id = customerjobid_val).first()
			if driverjob_obj:
				driverjob_obj.jobcompleted = True
				driverjob_obj.save()
				try:
					current_date = datetime.datetime.now()
					customerjobdatetime_obj = CustomerJobDateTime.objects.filter(job_id = customerjobid_val).first()
					if customerjobdatetime_obj:
						customerjobdatetime_obj.itemsdelivered_datetime = current_date
						customerjobdatetime_obj.save()
					else:
						customerjob_obj = CustomerJob.objects.filter(id = customerjobid_val).first()
						if customerjob_obj:
							CustomerJobDateTime.objects.create(job = customerjob_obj, itemsdelivered_datetime = current_date)
				except Exception as e:
					print(e)
				

				try:
					sendfcmnotification(driverjob_obj.driver.fcmtoken, 'driver', 'statuschange', 'KwickDelivery', 'You have delivered parcel successfully')
				except Exception as e:
					print(e)
				try:
					Notifications.objects.create(user = driverjob_obj.driver.user, customerjobid = driverjob_obj.customerjob.id, driverjobid = driverjob_obj.id, fordriver = True, notificationtype = 'Parcel Delivered', notificationtext = 'You have delivered parcel successfully', status = 'unread')
				except Exception as e:
					print(e)
				try:
					sendfcmnotification(driverjob_obj.customerjob.customer.fcmtoken, 'customer', 'statuschange', 'KwickDelivery', 'Your parcel is delivered successfully')
				except Exception as e:
					print(e)
				try:
					Notifications.objects.create(user = driverjob_obj.customerjob.customer.user, customerjobid = driverjob_obj.customerjob.id, forcustomer = True, notificationtype = 'Parcel Delivered', notificationtext = 'Your parcel is delivered successfully', status = 'unread')
				except Exception as e:
					print(e)
				try:
					sender_phone = str(driverjob_obj.customerjob.sendercountrycode).strip('+') + driverjob_obj.customerjob.senderphone
					recipient_phone = str(driverjob_obj.customerjob.recipientcountrycode).strip('+') + driverjob_obj.customerjob.recipientphone
					print(sender_phone)
					print(recipient_phone)
					res1 = send_text_message(sender_phone, 'Your parcel is successfully delivered.', 'OTP')
					print(res1)
					res2 = send_text_message(recipient_phone, 'You have successfully received parcel.', 'OTP')
					print(res2)
				except Exception as e:
					print(e)

				return JsonResponse({'status_code': 200, 'status_message': 'success'})
			else:
				return JsonResponse({'status_code': 400, 'status_message': 'Not a valid request'})

			# deliveryboyuser_obj = MainUser.objects.filter(token = session_token_val).first()
			# if not deliveryboyuser_obj:
			# 	return Response({'code': 0, 'error': 'User not logged in.','status_code': 0, 'status_message': 'User not logged in.'})
			# customer_job_obj=CustomerJob.objects.filter(awdnumber = awbnumber_val).first()

			
			# matchedparceldeliveryboy_obj = MatchedParcelsDeliveryBoyModal.objects.filter(matchedparcel = customer_job_obj, matcheddeliveryboy = deliveryboyuser_obj, jobcompleted = False, attime = 1).first()
			# if matchedparceldeliveryboy_obj:
			# 	current_date = datetime.datetime.now()
			# 	customerjobdatetime_obj = CustomerJobDateTime.objects.filter(job=customer_job_obj).update(firstmilepickup_datetime=current_date)
			# 	deliveryduration = ''
			# 	Notifications.objects.create(user=customer_job_obj.user.user,forcustomer=True,related_job_id=customer_job_obj.parcel_id,relatedawbnumber = customer_job_obj.awdnumber,notificationtype='Pickedup By Delivery Boy',text='Your parcel is pickedup by delivery boy.')
			# 	Notifications.objects.create(user=deliveryboyuser_obj,fordelivery=True,deliveryduration = deliveryduration,related_job_id=customer_job_obj.parcel_id,relatedawbnumber = customer_job_obj.awdnumber,notificationtype='Parcel Pickedup',text='You have pickedup parcel from customer pickup address.')
			# 	CustomerJobStatus.objects.filter(job=customer_job_obj).update(bookingreceived=False,bookingconfirmed=False,deliveryboyassigned=False,firstmilepickup=True,atairdelyhub=False,parcelassignedtoairtraveller=False,otwtoairport=False,intransit=False,atdestinationairport=False,atdestinationhub=False,outfordelivery=False,itemsdelivered=False,customerselfdeliverytoairdelycentre=False,recipientselfcollectfromairdelycentre=False)
				
			# 	matchedparceldeliveryboy_obj.parcelverified = True
			# 	# matchedparceldeliveryboy_obj.jobcompleted = True
			# 	matchedparceldeliveryboy_obj.save()
			# 	BookedDeliveryBoys.objects.filter(matchedparcelsdeliveryboy_reference = matchedparceldeliveryboy_obj).delete()
			# 	return JsonResponse({ 'code': 200 , 'message' : 'You have pickedup the parcel.','status_code': 200 , 'status_message' : 'You have pickedup the parcel.' }, status=200, safe=False)
			# else:
			# 	return JsonResponse({ 'code': 100 , 'message' : 'This QR Code is not associated with your record.','status_code': 100 , 'status_message' : 'This QR Code is not associated with your record.' }, status=200, safe=False)
		except Exception as e:
			return JsonResponse({'status_code': 500, 'status_message': 'Internal Server Error'})



class SendMessageToAdmin(APIView):
	
	def post(self, request, *args, **kwargs):
		print('\n\n\n\n')
		print('Chat  - in post ')
		# print('data is  : ',request.POST)
		try:
			sender = request.POST.get('sender')
			driver_id = request.POST.get('driver_id')
			# admin_id = request.POST.get('admin_id')
			message = request.POST.get('message')
			messageexist = request.POST.get('messageexist')
			attachmentexist = request.POST.get('attachmentexist')
			if messageexist == 'yes':
				message = request.POST.get('message')
			if attachmentexist == 'yes':
				attachment = request.FILES['file']
				if attachment:
					print('attachment exists')
				else:
					print('no attachment')
			# if driver_id == '':
			# 	print('driver_id does not exist')
			# if admin_id == '':
			# 	print('admin_id does not exist')
			# if message == '':
			# 	print('message does not exist')
			# if sender == '':
			# 	print('sender does not exist')
			admin_id = 1
			if driver_id and admin_id  and sender:
				if messageexist == 'yes':
					chat_obj = Chat.objects.create(driver_id=driver_id,admin_id=admin_id,message=message,sender=sender)
					if chat_obj:
						print('message saved in database')
				if attachmentexist == 'yes':
					st = ''.join([random.choice(string.ascii_letters + string.digits) for n in range(8)])
					print(st)
					fs = FileSystemStorage()
					filename = fs.save(attachment.name, attachment)
					filename = fs.url(filename)
					filename = '/media/' + filename 
					print(filename)
					chat_obj = Chat.objects.create(driver_id=driver_id,admin_id=admin_id,files=filename,sender=sender)
					if chat_obj:
						print('attachment saved in database')		
			return JsonResponse({'status_code': 200, 'status_message': 'success',})
			# return JsonResponse({'code': 400, 'message': 'Bad Request',})
		except Exception as e:
			print(e)
			return JsonResponse({'status_code': 500, 'status_message': 'Internal Server Error',})
	



class GetChats(APIView):
	# permission_classes = (AllowAny,)
	def get(self, request):
		''' This API method is used to get profile data of user'''
		print('data is  : ',request.GET)
		try:
			session_token_val = request.GET.get('session_token')
			if not session_token_val:
				return JsonResponse({'status_code': 400, 'status_message': 'User not logged in',})
			chat_data= [] 
			token_obj = Token.objects.filter(key = session_token_val).first()
			if token_obj:
				user_obj = User.objects.filter(id = token_obj.user_id).first()
				if user_obj:
					driverid = DriverModel.objects.filter(user = user_obj).first().id
					if driverid:
						chat_data= [] 
						chat_obj = Chat.objects.filter(driver_id = driverid).order_by('created_at')
						if chat_obj:
							for chat in chat_obj:
								if chat.files:
									attachment = str(settings.WEB_BASE_URL) + chat.files.name
								else:
									attachment = ''
								# import pytz
								# print()
								# now = datetime.datetime.now().replace(tzinfo=pytz.UTC) + datetime.timedelta(seconds = 60 * 3.4)
								# now = now.replace(tzinfo=pytz.UTC)
								chat_data.append({
									'adminid': chat.admin.id,
									'adminname': chat.admin.name,
									'driverid': chat.driver.id,
									'drivername': chat.driver.name,
									'message':chat.message,
									'sender': chat.sender,
									'attachment': attachment,
									'time' : chat.created_at.strftime("%d/%m/%Y %I:%M:%S %p"),
									# 'time' : chat.created_at.strftime("%I:%M %p"),
									})
						
						return JsonResponse({ 'status_code': 200 , 'data' : chat_data,'status_message' : 'success' })
					else:
						return JsonResponse({ 'status_code': 400 , 'data' : {},'status_message' : '' })
				else:
					return JsonResponse({ 'status_code': 400 , 'data' : {},'status_message' : '' })
			else:
				return JsonResponse({ 'status_code': 400 , 'data' : {},'status_message' : '' })
		except Exception as e:
			print(e)
			return JsonResponse({'status_code': 500, 'status_message': 'Internal Server Error',})



class DriverUpdateCoordinates(APIView):
	
	def post(self, request, *args, **kwargs):
		print('\n\n\n\naa')
		print('data is  : ',request.POST)
		try:
			session_token_val = request.POST.get('session_token')
			latitude_val = request.POST.get('latitude')
			longitude_val = request.POST.get('longitude')
			if not session_token_val:
				return JsonResponse({'status_code': 400, 'status_message': 'User not logged in'})
			if not latitude_val:
				return JsonResponse({'status_code': 400, 'status_message': 'Please enter latitude'})
			if not longitude_val:
				return JsonResponse({'status_code': 400, 'status_message': 'Please enter longitude'})
			token_obj = Token.objects.filter(key = session_token_val).first()
			if token_obj:
				print(token_obj.user_id)
				user_obj = User.objects.filter(id = token_obj.user_id).first()
				if user_obj:
					driver_obj = DriverModel.objects.filter(user = user_obj).first()
					if driver_obj:
						drivercoordinates_obj = DriverCoordinates.objects.filter(driver = driver_obj).first()
						if drivercoordinates_obj:
							drivercoordinates_obj.latitude = latitude_val
							drivercoordinates_obj.longitude = longitude_val
							drivercoordinates_obj.save()
						else:
							DriverCoordinates.objects.create(user = user_obj, driver = driver_obj, latitude = latitude_val, longitude = longitude_val)
						
						return JsonResponse({'status_code': 200, 'status_message': 'success',})
					else:
						return JsonResponse({'status_code': 400, 'status_message': 'User not logged in'})
				else:
					return JsonResponse({'status_code': 400, 'status_message': 'User not logged in'})
			else:
				return JsonResponse({'status_code': 400, 'status_message': 'User not logged in'})
		except Exception as e:
			print(e)
			return JsonResponse({'status_code': 500, 'status_message' : 'Internal Server Error'})




class DriverChangePassword(APIView):
	
	def post(self, request, *args, **kwargs):
		print('\n\n\n\naa')
		print('data is  : ',request.POST)
		try:
			session_token_val = request.POST.get('session_token')
			oldpassword_val = request.POST.get('oldpassword')
			newpassword_val = request.POST.get('newpassword')
			if not session_token_val:
				return JsonResponse({'status_code': 400, 'status_message': 'User not logged in',})
			if not oldpassword_val:
				return JsonResponse({'status_code': 400, 'status_message': 'Please enter old password',})
			if not newpassword_val:
				return JsonResponse({'status_code': 400, 'status_message': 'Please enter new password',})
			token_obj = Token.objects.filter(key = session_token_val).first()
			if token_obj:
				print(token_obj.user_id)
				user_obj = User.objects.get(id = token_obj.user_id)
				if user_obj.check_password(oldpassword_val):
					print('correct password')
					user_obj.password = make_password(newpassword_val)
					user_obj.save()
					driver_obj = DriverModel.objects.filter(user = user_obj).first()
					if driver_obj:
						try:
							sendfcmnotification(driver_obj.fcmtoken, 'driver', 'passwordchange', 'KwickDelivery', 'Your password is updated successfully')
						except Exception as e:
							print(e)
					return JsonResponse({'status_code': 200, 'status_message': 'success',})
					
				else:
					print('invalid password')
					return JsonResponse({'status_code': 400, 'status_message': 'Old password is incorrect',})

			
		except Exception as e:
			print(e)
			return JsonResponse({'status_code': 500, 'status_message' : 'Internal Server Error'})



class DriverGetUnreadNotificationsCount(APIView):
	
	def get(self, request, *args, **kwargs):
		'''This function shows the content on customer dashboard screen'''
		print("DriverGetUnreadNotificationsCount - in get ")

		try:
			session_token_val = request.GET.get('session_token')
			if not session_token_val:
				return JsonResponse({'status_code': 400, 'status_message': 'User not logged in',})
			token_obj = Token.objects.filter(key = session_token_val).first()
			if token_obj:
				result, count = getunreadnotificationcount(token_obj.user_id)
				if result == 'success':
					print(count)
				elif result == 'error':
					print(count)
				return JsonResponse({'status_code': 200, 'unread_notifications_count' : count, 'status_message': 'success',})       
			else:
				return JsonResponse({'status_code': 400, 'status_message': 'User not logged in',})      
		except Exception as e:
			print(e)
			return JsonResponse({'status_code': 500, 'status_message' : 'Internal Server Error'})



class DriverNotifications(APIView):
	
	def get(self, request, *args, **kwargs):
		'''This function shows the content on customer dashboard screen'''
		print("DriverNotifications - in get ")

		try:
			session_token_val = request.GET.get('session_token')
			if not session_token_val:
				return JsonResponse({'status_code': 400, 'status_message': 'User not logged in',})
			token_obj = Token.objects.filter(key = session_token_val).first()
			if token_obj:
				user_obj = User.objects.filter(id = token_obj.user_id).first()
				if user_obj:
					notifications_data = []
					all_notifications = Notifications.objects.filter(user = user_obj, deleted = False).order_by('-id')
					if all_notifications:
						for notification in all_notifications:
							driverjob_obj = DriverJob.objects.filter(customerjob_id = notification.customerjobid).first()
							jobcompleted = False
							driverjobid = ''
							if driverjob_obj:
								driverjobid = driverjob_obj.id
								if driverjob_obj.jobcompleted:
									jobcompleted = True
							notifications_data.append({
								'id' : notification.id,
								'fordriver' : notification.fordriver,
								'notificationtype' : notification.notificationtype,
								'notificationtext' : notification.notificationtext,
								'customerjobid' : notification.customerjobid,
								'status' : notification.status,
								'date' : notification.date,
								'driverjobid' : driverjobid,
								'jobcompleted' : jobcompleted,

								})
						return JsonResponse({ 'status_code': 200 , 'data' : notifications_data, 'status_message' : 'success' })
					else:
						return JsonResponse({ 'status_code': 200 , 'data' : [],'status_message' : 'success' })
				else:
					return JsonResponse({'status_code': 400, 'status_message': 'User not logged in',})
			else:
				return JsonResponse({'status_code': 400, 'status_message': 'User not logged in',})		
		except Exception as e:
			print(e)
			return JsonResponse({'status_code': 500, 'status_message' : 'Internal Server Error'})


class DriverCustomerJobDetail(APIView):
	# permission_classes = (AllowAny,)
	def get(self, request):
		''' This API method is used to get profile data of user'''
		print('data is  : ',request.GET)
		try:
			session_token_val = request.GET.get('session_token')
			customerjobid_val = request.GET.get('customerjobid')
			driverjobid_val = request.GET.get('driverjobid')
			if not session_token_val:
				return JsonResponse({'status_code': 400, 'status_message': 'User not logged in',})
			if not customerjobid_val:
				return JsonResponse({'status_code': 400, 'status_message': 'CustomerJob id is required',})
			if not driverjobid_val:
				return JsonResponse({'status_code': 400, 'status_message': 'DriverJob id is required',})
			customerjob_data = {}
			token_obj = Token.objects.filter(key = session_token_val).first()
			if token_obj:
				user_obj = User.objects.filter(id = token_obj.user_id).first()
				if user_obj:
					driver_obj = DriverModel.objects.filter(user = user_obj).first()
					if driver_obj:
						pass
			driverjob_obj = DriverJob.objects.filter(id = driverjobid_val).first()

			driver_job_status=0
			if driverjob_obj:	
				print("first -1")
				if driverjob_obj.jobstarted == True:
					driver_job_status=1
				if driverjob_obj.arrived_at_pickup == True:
					driver_job_status=2
				if driverjob_obj.parcel_picked_by_driver == True:
					driver_job_status=3
				if driverjob_obj.start_DropOff == True:
					driver_job_status=4
				if driverjob_obj.arrived_atDropOffLocation == True:
					driver_job_status=5
				if driverjob_obj.jobcompleted == True:
					driver_job_status=6
				if driverjob_obj.deliveryfailed == True:
					driver_job_status=99

			showscanbutton = False
			showhandovertorecipientbutton = False
			if driverjob_obj:	
				print('if')
				if driverjob_obj.jobstarted == False and driverjob_obj.jobcompleted == False:
					print('if 2')
					showscanbutton = True
				elif driverjob_obj.jobstarted == True and driverjob_obj.jobcompleted == False:
					print('elif')
					showscanbutton = False
					showhandovertorecipientbutton = True
				elif driverjob_obj.jobstarted == True and driverjob_obj.jobcompleted == True:
					print('elif')
					showscanbutton = False
					showhandovertorecipientbutton = False
			customerjob_obj = CustomerJob.objects.filter(id = customerjobid_val).first()
			if customerjob_obj:			
				if not customerjob_obj.sendercountrycode:
					sendercountrycode = ''
				else:
					sendercountrycode = customerjob_obj.sendercountrycode

				if not customerjob_obj.recipientcountrycode:
					recipientcountrycode = ''
				else:
					recipientcountrycode = customerjob_obj.recipientcountrycode
				if not customerjob_obj.qrcode:
					qrcode = ''
				else:
					qrcode = str(settings.MEDIA_BASE_URL) + customerjob_obj.qrcode.name

				if customerjob_obj.parcelpdf:
					parcelpdf_link = str(settings.WEB_BASE_URL) + customerjob_obj.parcelpdf.name
				else:
					parcelpdf_link = ''

				if customerjob_obj.order.ordertype == 1:
					ordertype = 'Single-Drop'
				elif customerjob_obj.order.ordertype == 2:
					ordertype = 'Multi-Drop'
				else:
					ordertype = ''
				rating, feedback, feedbackgiven = 0, '', False
				userrating_obj = UserRating.objects.filter(customerjobid = customerjob_obj.id, ratingfor = 'customer').first()
				if userrating_obj:
					feedbackgiven = True
					rating = userrating_obj.rating
					feedback = userrating_obj.note

				customerjobdatetime_obj = CustomerJobDateTime.objects.filter(job = customerjob_obj).first()
				payment_datetime, pickup_datetime, itemsdelivered_datetime, deliveryfailed_datetime = '', '', '', ''
				if customerjobdatetime_obj:
					payment_datetime = customerjobdatetime_obj.payment_datetime
					pickup_datetime = customerjobdatetime_obj.pickup_datetime
					itemsdelivered_datetime = customerjobdatetime_obj.itemsdelivered_datetime
					deliveryfailed_datetime = customerjobdatetime_obj.deliveryfailed_datetime

				delivery_safe_status=False
				safe_image_proof=''

				safepalceImage=DriverDropSafePalace.objects.filter(driver_job=driverjob_obj,customerjob=customerjob_obj).first()
				if safepalceImage:
					delivery_safe_status=True
					safe_image_proof=safepalceImage.safeplace.name


				delivery_proof_method, delivery_toperson_name, delivery_toperson_phone, delivery_toperson_signature = '', '', '', ''
				pickup_proof_method, pickup_fromperson_name, pickup_fromperson_phone, pickup_fromperson_signature = '', '', '', ''
				customerjobdeliveryextradetails_obj = CustomerJobDeliveryExtraDetails.objects.filter(job = customerjob_obj).first()
				if customerjobdeliveryextradetails_obj:
					if customerjobdeliveryextradetails_obj.delivery_proof_method == 'signature':
						delivery_proof_method = customerjobdeliveryextradetails_obj.delivery_proof_method
						delivery_toperson_name = customerjobdeliveryextradetails_obj.delivery_toperson_name
						delivery_toperson_signature = str(settings.MEDIA_BASE_URL) + customerjobdeliveryextradetails_obj.delivery_toperson_signature.name
					elif customerjobdeliveryextradetails_obj.delivery_proof_method == 'otp':
						delivery_proof_method = customerjobdeliveryextradetails_obj.delivery_proof_method
						delivery_toperson_name = customerjob_obj.recipientname
						delivery_toperson_phone = customerjob_obj.recipientcountrycode + '-' + customerjob_obj.recipientphone
					else:
						delivery_proof_method = customerjobdeliveryextradetails_obj.delivery_proof_method

					
					if customerjobdeliveryextradetails_obj.pickup_proof_method == 'signature':
						pickup_proof_method = customerjobdeliveryextradetails_obj.pickup_proof_method
						pickup_fromperson_name = customerjobdeliveryextradetails_obj.pickup_fromperson_name
						pickup_fromperson_signature = str(settings.MEDIA_BASE_URL) + customerjobdeliveryextradetails_obj.pickup_fromperson_signature.name
					elif customerjobdeliveryextradetails_obj.pickup_proof_method == 'otp':
						pickup_proof_method = customerjobdeliveryextradetails_obj.pickup_proof_method
						pickup_fromperson_name = customerjob_obj.sendername
						pickup_fromperson_phone = customerjob_obj.sendercountrycode + '-' + customerjob_obj.senderphone
					else:
						pickup_proof_method = customerjobdeliveryextradetails_obj.pickup_proof_method
				

				customerjob_data.update({
					'awbnumber' : 'AWB-' + str(10000 + customerjob_obj.id),
					'sendername' : customerjob_obj.sendername,
					'sendercountrycode' : sendercountrycode,
					'senderphone' : customerjob_obj.senderphone,
					'senderpickupaddress' : customerjob_obj.pickupaddress,
					'sendercity' : customerjob_obj.sendercity,
					'pickuptimeslot' : customerjob_obj.pickuptimeslot,
					'noofparcels' : customerjob_obj.noofparcels,
					'recipientname' : customerjob_obj.recipientname,
					'recipientcountrycode' : recipientcountrycode,
					'recipientphone' : customerjob_obj.recipientphone,
					'recipientdropoffaddress' : customerjob_obj.dropoffaddress,
					'dropofftimeslot' : customerjob_obj.dropofftimeslot,
					# 'recipientdropoffaddress' : customerjob_obj.dropoffaddress,
					'length' : customerjob_obj.length,
					'width' : customerjob_obj.width,
					'height' : customerjob_obj.height,
					'weight' : customerjob_obj.weight,
					'parceltype' : customerjob_obj.parceltype,
					'vehicletype' : customerjob_obj.vehicletype.name,
					'fare' : round(customerjob_obj.price,2),
					'parcelpdf_link' : parcelpdf_link,
					'qrcode' : qrcode,
					'specialbooking' : customerjob_obj.specialbooking,

					'senderlatitude' : customerjob_obj.senderlatitude,
					'senderlongitude' : customerjob_obj.senderlongitude,
					'recipientlatitude' : customerjob_obj.recipientlatitude,
					'recipientlongitude' : customerjob_obj.recipientlongitude,
					'showscanbutton' : showscanbutton,
					'showhandovertorecipientbutton' : showhandovertorecipientbutton, 
					'pickupspecialnote' : customerjob_obj.pickupspecialnote,
					'dropoffspecialnote' : customerjob_obj.dropoffspecialnote,

					'delivery_safe_status':delivery_safe_status,
					'safe_image_proof':safe_image_proof,
					'driver_job_status':driver_job_status,

					'rating' : rating,
					'feedback' : feedback,
					'feedbackgiven' : feedbackgiven,

					'crationDate' : customerjob_obj.creation_date,
					'deliveryDuration' : customerjob_obj.deliveryduration,
					'status' : customerjob_obj.status,

					'ordertype' : ordertype,
					
					'delivery_proof_method' : delivery_proof_method,
					'delivery_toperson_name' : delivery_toperson_name,
					'delivery_toperson_phone' : delivery_toperson_phone,
					'delivery_toperson_signature' : delivery_toperson_signature,
					
					'pickup_proof_method' : pickup_proof_method,
					'pickup_fromperson_name' : pickup_fromperson_name,
					'pickup_fromperson_phone' : pickup_fromperson_phone,
					'pickup_fromperson_signature' : pickup_fromperson_signature,

					'itemsdelivered_datetime' : itemsdelivered_datetime,
					})
			
						
			return JsonResponse({ 'status_code': 200 , 'data' : customerjob_data,'status_message' : 'success' })
				# 	else:
				# 		return JsonResponse({ 'status_code': 400 , 'data' : [],'status_message' : '' })
				# else:
				# 	return JsonResponse({ 'status_code': 400 , 'data' : [],'status_message' : '' })
			# else:
			# 	return JsonResponse({ 'status_code': 401 , 'data' : [] ,'status_message' : 'User not logged in.' })
		except Exception as e:
			print(e)
			return JsonResponse({'status_code': 500, 'status_message': 'Internal Server Error',})


class DriverCustomerJobDetailExtraTestViewDate(APIView):
	# permission_classes = (AllowAny,)
	def get(self, request):
		''' This API method is used to get profile data of user'''
		print('data is  : ',request.GET)
		try:
			session_token_val = request.GET.get('session_token')
			if not session_token_val:
				return JsonResponse({'status_code': 400, 'status_message': 'User not logged in',})
			dateStatus = request.GET.get('dateStatus')
			if not dateStatus:
				return JsonResponse({'status_code': 400, 'status_message': 'dateStatus is required',})
			alldriverjobs_data = []
			newDataAfterFilter=[]
			token_obj = Token.objects.filter(key = session_token_val).first()
			if token_obj:
				user_obj = User.objects.filter(id = token_obj.user_id).first()
				if user_obj:
					print('0')
					driver_obj = DriverModel.objects.filter(user = user_obj).first()
					if driver_obj:
						print('1')

						supportdetail_obj = SupportDetail.objects.filter(isdeleted = False).first()
						if supportdetail_obj:
							support_phone = supportdetail_obj.phone
						else:
							support_phone = ''
						driverjob_obj = DriverJob.objects.filter(driver = driver_obj)
						if driverjob_obj:
							print('2')
							print(len(driverjob_obj))
							totalParcelToBeDeliverd=0
							today = datetime.datetime.today()
							for job in driverjob_obj:
								print("Today Date",today)
								print("Job Pickup Date",job.customerjob.pickuptimeslotDate)
								date_time_str = str(job.customerjob.pickuptimeslotDate)
								# date_time_str = (job.customerjob.pickuptimeslotDate)
								first=date_time_str.split('-')[0]
								second=date_time_str.split('-')[1]
								third=date_time_str.split('-')[2]
								first=first.replace(' ','')
								second=second.replace(' ','')
								third=third.replace(' ','')
								print(first)
								print(second)
								print(third)
								newDate=first+' '+second+' '+third
								date_time_obj = datetime.datetime.strptime(newDate, '%d %b %Y')
								print('Date:', date_time_obj.date())
								print('Date-time:', date_time_obj)

								# today = datetime.datetime.today()
								# print("Today's date:", today.date())
								delta = datetime.timedelta(days = 1)
								nextDate = today + delta
								print(nextDate.date())
								DateStatus='None'
								if today.date()==date_time_obj.date():
									DateStatus='Today'
									print("Match")
								elif nextDate.date()==date_time_obj.date():
									DateStatus='Tommorow'
								elif date_time_obj.date()>nextDate.date():
									DateStatus='Others'
								else:
									DateStatus='Past'
								driverOnWay=False
								driverArrived=False
								if dateStatus== DateStatus:
									totalParcelToBeDeliverd=totalParcelToBeDeliverd+int(job.customerjob.noofparcels)
								elif dateStatus== DateStatus:
									totalParcelToBeDeliverd=totalParcelToBeDeliverd+int(job.customerjob.noofparcels)
									pass
								elif dateStatus== DateStatus:
									totalParcelToBeDeliverd=totalParcelToBeDeliverd+int(job.customerjob.noofparcels)
								showscanbutton = False
								showhandovertorecipientbutton = False
								driverOnWayButtton = False
								driverArrivedButton = False
								driverPickedUpParcelButton = False 
								driver_job_status=0
								if job:	
									print("first -1")
									if job.jobstarted == True:
										driver_job_status=1
									if job.arrived_at_pickup == True:
										driver_job_status=2
									if job.parcel_picked_by_driver == True:
										driver_job_status=3
									if job.start_DropOff == True:
										driver_job_status=4
									if job.arrived_atDropOffLocation == True:
										driver_job_status=5
									if job.jobcompleted == True:
										driver_job_status=6
									if job.deliveryfailed == True:
										driver_job_status=99
									# print('if')
									# if job.jobstarted == False and job.driverArrived == False:
									# 	print('if 2')
									# 	driverOnWayButtton = True
									# elif job.driverOnWay == True and job.driverArrived == False:
									# 	print('if 2')
									# 	driverArrivedButton = True
									# elif job.driverArrived == True and job.jobstarted == False:
									# 	print('if 2')
									# 	driverPickedUpParcelButton = True
									# elif job.jobstarted == False and job.jobcompleted == False:
									# 	print('if 2')
									# 	showscanbutton = True
									# elif job.jobstarted == True and job.jobcompleted == False:
									# 	print('elif')
									# 	showscanbutton = False
									# 	showhandovertorecipientbutton = True
									# elif job.jobstarted == True and job.jobcompleted == True:
									# 	print('elif')
									# 	showscanbutton = False
									# 	showhandovertorecipientbutton = False
								print("first -2")

								# customerjob_obj = CustomerJob.objects.filter(id = customerjobid_val).first()
								if job.customerjob:			
									if not job.customerjob.sendercountrycode:
										sendercountrycode = ''
									else:
										sendercountrycode = job.customerjob.sendercountrycode

									if not job.customerjob.recipientcountrycode:
										recipientcountrycode = ''
									else:
										recipientcountrycode = job.customerjob.recipientcountrycode
									if not job.customerjob.qrcode:
										qrcode = ''
									else:
										qrcode = str(settings.MEDIA_BASE_URL) + job.customerjob.qrcode.name

									if job.customerjob.parcelpdf:
										parcelpdf_link = str(settings.WEB_BASE_URL) + job.customerjob.parcelpdf.name
									else:
										parcelpdf_link = ''

									if job.customerjob.order.ordertype == 1:
										ordertype = 'Single-Drop'
									elif job.customerjob.order.ordertype == 2:
										ordertype = 'Multi-Drop'
									else:
										ordertype = ''
									rating, feedback, feedbackgiven = 0, '', False
									userrating_obj = UserRating.objects.filter(customerjobid = job.customerjob.id, ratingfor = 'customer').first()
									if userrating_obj:
										feedbackgiven = True
										rating = userrating_obj.rating
										feedback = userrating_obj.note

									delivery_safe_status=False
									safe_image_proof=''

									safepalceImage=DriverDropSafePalace.objects.filter(driver_job=job,customerjob=job.customerjob).first()
									if safepalceImage:
										delivery_safe_status=True
										safe_image_proof= str(settings.MEDIA_BASE_URL) + safepalceImage.safeplace.name
									print("first -3")
									customerjobdatetime_obj = CustomerJobDateTime.objects.filter(job = job.customerjob).first()
									payment_datetime, pickup_datetime, itemsdelivered_datetime, deliveryfailed_datetime = '', '', '', ''
									if customerjobdatetime_obj:
										payment_datetime = customerjobdatetime_obj.payment_datetime
										pickup_datetime = customerjobdatetime_obj.pickup_datetime
										itemsdelivered_datetime = customerjobdatetime_obj.itemsdelivered_datetime
										deliveryfailed_datetime = customerjobdatetime_obj.deliveryfailed_datetime

									try:
										pickup_proof_method_new, pickup_fromperson_name_new, pickup_fromperson_phone_new, pickup_fromperson_signature_new = '', '', '', ''
										if job.customerjob.sameIdForParcelsDetails!=0:
											all_customer_job = CustomerJob.objects.filter(sameIdForParcelsDetails = job.customerjob.sameIdForParcelsDetails)
											for al in all_customer_job:
												customer_deatils_all = CustomerJobDeliveryExtraDetails.objects.filter(job = al).first()
												if customer_deatils_all:
													if customer_deatils_all.pickup_proof_method == 'signature':
														pickup_proof_method_new = customer_deatils_all.pickup_proof_method
														pickup_fromperson_name_new = customer_deatils_all.pickup_fromperson_name
														try:
															pickup_fromperson_signature_new = str(settings.MEDIA_BASE_URL) + customer_deatils_all.pickup_fromperson_signature.name
														except:
															pickup_fromperson_signature_new= ''
													elif customer_deatils_all.pickup_proof_method == 'otp':
														pickup_proof_method_new= customer_deatils_all.pickup_proof_method
														pickup_fromperson_name_new= job.customerjob.sendername
														try:
															pickup_fromperson_phone_new= job.customerjob.sendercountrycode + '-' + job.customerjob.senderphone
														except:
															pickup_fromperson_phone_new= ''
													else:
														pickup_proof_method_new= customer_deatils_all.pickup_proof_method
									except Exception as e:
										print(e)





									delivery_proof_method, delivery_toperson_name, delivery_toperson_phone, delivery_toperson_signature = '', '', '', ''
									pickup_proof_method, pickup_fromperson_name, pickup_fromperson_phone, pickup_fromperson_signature = '', '', '', ''
									customerjobdeliveryextradetails_obj = CustomerJobDeliveryExtraDetails.objects.filter(job = job.customerjob).first()
									if customerjobdeliveryextradetails_obj:
										if customerjobdeliveryextradetails_obj.delivery_proof_method == 'signature':
											delivery_proof_method = customerjobdeliveryextradetails_obj.delivery_proof_method
											delivery_toperson_name = customerjobdeliveryextradetails_obj.delivery_toperson_name
											try:
												delivery_toperson_signature = str(settings.MEDIA_BASE_URL) + customerjobdeliveryextradetails_obj.delivery_toperson_signature.name
											except:
												delivery_toperson_signature=''
										elif customerjobdeliveryextradetails_obj.delivery_proof_method == 'otp':
											delivery_proof_method = customerjobdeliveryextradetails_obj.delivery_proof_method
											delivery_toperson_name = job.customerjob.recipientname
											try:
												delivery_toperson_phone = job.customerjob.recipientcountrycode + '-' + job.customerjob.recipientphone
											except:
												delivery_toperson_phone=''
										else:
											delivery_proof_method = customerjobdeliveryextradetails_obj.delivery_proof_method

										
										if customerjobdeliveryextradetails_obj.pickup_proof_method == 'signature':
											pickup_proof_method = customerjobdeliveryextradetails_obj.pickup_proof_method
											pickup_fromperson_name = customerjobdeliveryextradetails_obj.pickup_fromperson_name
											try:
												pickup_fromperson_signature = str(settings.MEDIA_BASE_URL) + customerjobdeliveryextradetails_obj.pickup_fromperson_signature.name
											except:
												pickup_fromperson_signature= ''

										elif customerjobdeliveryextradetails_obj.pickup_proof_method == 'otp':
											pickup_proof_method = customerjobdeliveryextradetails_obj.pickup_proof_method
											pickup_fromperson_name = job.customerjob.sendername
											try:
												pickup_fromperson_phone = job.customerjob.sendercountrycode + '-' + job.customerjob.senderphone
											except:
												pickup_fromperson_phone = ''
										else:
											pickup_proof_method = customerjobdeliveryextradetails_obj.pickup_proof_method
								pass
								print('first-4')
								alldriverjobs_data.append({
									'awbnumber' : 'AWB-' + str(10000 + job.customerjob.id),
									'sendername' : job.customerjob.sendername,
									'sendercountrycode' : sendercountrycode,
									'senderphone' : job.customerjob.senderphone,
									'senderpickupaddress' : job.customerjob.pickupaddress,
									'sendercity' : job.customerjob.sendercity,
									'pickuptimeslot' : job.customerjob.pickuptimeslot,
									'noofparcels' : job.customerjob.noofparcels,
									'recipientname' : job.customerjob.recipientname,
									'recipientcountrycode' : recipientcountrycode,
									'recipientphone' : job.customerjob.recipientphone,
									'recipientdropoffaddress' : job.customerjob.dropoffaddress,
									'dropofftimeslot' : job.customerjob.dropofftimeslot,
									# 'recipientdropoffaddress' : customerjob_obj.dropoffaddress, not commented by me
									'length' : job.customerjob.length,
									'width' : job.customerjob.width,
									'height' : job.customerjob.height,
									'weight' : job.customerjob.weight,
									'parceltype' : job.customerjob.parceltype,
									'vehicletype' : job.customerjob.vehicletype.name,
									'fare' : round(job.customerjob.price,2),
									'parcelpdf_link' : parcelpdf_link,
									'qrcode' : qrcode,
									'specialbooking' : job.customerjob.specialbooking,

									'delivery_safe_status':delivery_safe_status,
									'safe_image_proof':safe_image_proof,
									'driver_job_status':driver_job_status,

									'senderlatitude' : job.customerjob.senderlatitude,
									'senderlongitude' : job.customerjob.senderlongitude,
									'recipientlatitude' : job.customerjob.recipientlatitude,
									'recipientlongitude' : job.customerjob.recipientlongitude,
									'showscanbutton' : showscanbutton,
									'showhandovertorecipientbutton' : showhandovertorecipientbutton, 
									'pickupspecialnote' : job.customerjob.pickupspecialnote,
									'dropoffspecialnote' : job.customerjob.dropoffspecialnote,

									'rating' : rating,
									'feedback' : feedback,
									'feedbackgiven' : feedbackgiven,

									'crationDate' : job.customerjob.creation_date,
									'deliveryDuration' : job.customerjob.deliveryduration,
									'status' : job.customerjob.status,

									'ordertype' : ordertype,
									
									'delivery_proof_method' : delivery_proof_method,
									'delivery_toperson_name' : delivery_toperson_name,
									'delivery_toperson_phone' : delivery_toperson_phone,
									'delivery_toperson_signature' : delivery_toperson_signature,
									
									'pickup_proof_method' : pickup_proof_method_new,
									'pickup_fromperson_name' : pickup_fromperson_name_new,
									'pickup_fromperson_phone' : pickup_fromperson_phone_new,
									'pickup_fromperson_signature' : pickup_fromperson_signature_new,

									'itemsdelivered_datetime' : itemsdelivered_datetime,


									# 'noOfParcel':job.customerjob.noofparcels,
									# 'sendername' : job.customerjob.sendername,
									# 'senderphone' : job.customerjob.senderphone,
									# 'senderpickupaddress' : job.customerjob.pickupaddress,
									# 'recipientname' : job.customerjob.recipientname,
									# 'recipientcountrycode' : job.customerjob.recipientcountrycode,
									# 'recipientphone' : job.customerjob.recipientphone,
									# 'recipientdropoffaddress' : job.customerjob.dropoffaddress,
									# 'customerjobid' : job.customerjob.id,
									'driverjobid' : job.id,
									'driverOnWayButtton':driverOnWayButtton,
									'driverArrivedButton':driverArrivedButton,
									'driverPickedUpParcelButton': driverPickedUpParcelButton,
									'dateStatus':DateStatus,
									})
						for view in alldriverjobs_data:
							if view['dateStatus'] == dateStatus:
								newDataAfterFilter.append(view)
						print('first-5')
						print(alldriverjobs_data)
						return JsonResponse({ 'status_code': 200 ,'Total Parcel To Be Deliverd':totalParcelToBeDeliverd,'data' : newDataAfterFilter, 'support_phone' : support_phone, 'status_message' : 'success' })
					else:
						return JsonResponse({ 'status_code': 200 , 'data' : [],'status_message' : 'success' })
				else:
					return JsonResponse({ 'status_code': 400 , 'data' : [],'status_message' : '' })
			else:
				return JsonResponse({ 'status_code': 401 , 'data' : [] ,'status_message' : 'User not logged in.' })
		except Exception as e:
			print(e)
			return JsonResponse({'status_code': 500, 'status_message': 'Internal Server Error',})

class DriverCustomerJobDetailExtraTestViewDate2(APIView):
	# permission_classes = (AllowAny,)
	def get(self, request):
		''' This API method is used to get profile data of user'''
		print('data is  : ',request.GET)
		try:
			session_token_val = request.GET.get('session_token')
			if not session_token_val:
				return JsonResponse({'status_code': 400, 'status_message': 'User not logged in',})
			dateStatus = request.GET.get('dateStatus')
			if not dateStatus:
				return JsonResponse({'status_code': 400, 'status_message': 'dateStatus is required',})
			alldriverjobs_data = []
			newDataAfterFilter=[]
			token_obj = Token.objects.filter(key = session_token_val).first()
			if token_obj:
				user_obj = User.objects.filter(id = token_obj.user_id).first()
				if user_obj:
					print('0')
					driver_obj = DriverModel.objects.filter(user = user_obj).first()
					if driver_obj:
						print('1')

						supportdetail_obj = SupportDetail.objects.filter(isdeleted = False).first()
						if supportdetail_obj:
							support_phone = supportdetail_obj.phone
						else:
							support_phone = ''
						driverjob_obj = DriverJob.objects.filter(driver = driver_obj)
						if driverjob_obj:
							print('2')
							print(len(driverjob_obj))
							totalParcelToBeDeliverd=0
							today = datetime.datetime.today()
							for job in driverjob_obj:
								print("Today Date",today)
								print("Job Pickup Date",job.customerjob.pickuptimeslotDate)
								date_time_str = str(job.customerjob.pickuptimeslotDate)
								# date_time_str = (job.customerjob.pickuptimeslotDate)
								first=date_time_str.split('-')[0]
								second=date_time_str.split('-')[1]
								third=date_time_str.split('-')[2]
								first=first.replace(' ','')
								second=second.replace(' ','')
								third=third.replace(' ','')
								print(first)
								print(second)
								print(third)
								newDate=first+' '+second+' '+third
								date_time_obj = datetime.datetime.strptime(newDate, '%d %b %Y')
								print('Date:', date_time_obj.date())
								print('Date-time:', date_time_obj)

								# today = datetime.datetime.today()
								# print("Today's date:", today.date())
								delta = datetime.timedelta(days = 1)
								nextDate = today + delta
								print(nextDate.date())
								DateStatus='None'
								if today.date()==date_time_obj.date():
									DateStatus='Today'
									print("Match")
								elif nextDate.date()==date_time_obj.date():
									DateStatus='Tommorow'
								elif date_time_obj.date()>nextDate.date():
									DateStatus='Others'
								else:
									DateStatus='Past'
								driverOnWay=False
								driverArrived=False
								if dateStatus== DateStatus:
									totalParcelToBeDeliverd=totalParcelToBeDeliverd+int(job.customerjob.noofparcels)
								elif dateStatus== DateStatus:
									totalParcelToBeDeliverd=totalParcelToBeDeliverd+int(job.customerjob.noofparcels)
									pass
								elif dateStatus== DateStatus:
									totalParcelToBeDeliverd=totalParcelToBeDeliverd+int(job.customerjob.noofparcels)
								showscanbutton = False
								showhandovertorecipientbutton = False
								driverOnWayButtton = False
								driverArrivedButton = False
								driverPickedUpParcelButton = False 
								driver_job_status=0
								if job:	
									print("first -1")
									if job.jobstarted == True:
										driver_job_status=1
									if job.arrived_at_pickup == True:
										driver_job_status=2
									if job.parcel_picked_by_driver == True:
										driver_job_status=3
									if job.start_DropOff == True:
										driver_job_status=4
									if job.arrived_atDropOffLocation == True:
										driver_job_status=5
									if job.jobcompleted == True:
										driver_job_status=6
									if job.deliveryfailed == True:
										driver_job_status=99
									# print('if')
									# if job.jobstarted == False and job.driverArrived == False:
									# 	print('if 2')
									# 	driverOnWayButtton = True
									# elif job.driverOnWay == True and job.driverArrived == False:
									# 	print('if 2')
									# 	driverArrivedButton = True
									# elif job.driverArrived == True and job.jobstarted == False:
									# 	print('if 2')
									# 	driverPickedUpParcelButton = True
									# elif job.jobstarted == False and job.jobcompleted == False:
									# 	print('if 2')
									# 	showscanbutton = True
									# elif job.jobstarted == True and job.jobcompleted == False:
									# 	print('elif')
									# 	showscanbutton = False
									# 	showhandovertorecipientbutton = True
									# elif job.jobstarted == True and job.jobcompleted == True:
									# 	print('elif')
									# 	showscanbutton = False
									# 	showhandovertorecipientbutton = False
								print("first -2")

								# customerjob_obj = CustomerJob.objects.filter(id = customerjobid_val).first()
								if job.customerjob:			
									if not job.customerjob.sendercountrycode:
										sendercountrycode = ''
									else:
										sendercountrycode = job.customerjob.sendercountrycode

									if not job.customerjob.recipientcountrycode:
										recipientcountrycode = ''
									else:
										recipientcountrycode = job.customerjob.recipientcountrycode
									if not job.customerjob.qrcode:
										qrcode = ''
									else:
										qrcode = str(settings.MEDIA_BASE_URL) + job.customerjob.qrcode.name

									if job.customerjob.parcelpdf:
										parcelpdf_link = str(settings.WEB_BASE_URL) + job.customerjob.parcelpdf.name
									else:
										parcelpdf_link = ''

									if job.customerjob.order.ordertype == 1:
										ordertype = 'Single-Drop'
									elif job.customerjob.order.ordertype == 2:
										ordertype = 'Multi-Drop'
									else:
										ordertype = ''
									rating, feedback, feedbackgiven = 0, '', False
									userrating_obj = UserRating.objects.filter(customerjobid = job.customerjob.id, ratingfor = 'customer').first()
									if userrating_obj:
										feedbackgiven = True
										rating = userrating_obj.rating
										feedback = userrating_obj.note

									delivery_safe_status=False
									safe_image_proof=''

									safepalceImage=DriverDropSafePalace.objects.filter(driver_job=job,customerjob=job.customerjob).first()
									if safepalceImage:
										delivery_safe_status=True
										safe_image_proof= str(settings.MEDIA_BASE_URL) + safepalceImage.safeplace.name
									print("first -3")
									customerjobdatetime_obj = CustomerJobDateTime.objects.filter(job = job.customerjob).first()
									payment_datetime, pickup_datetime, itemsdelivered_datetime, deliveryfailed_datetime = '', '', '', ''
									if customerjobdatetime_obj:
										payment_datetime = customerjobdatetime_obj.payment_datetime
										pickup_datetime = customerjobdatetime_obj.pickup_datetime
										itemsdelivered_datetime = customerjobdatetime_obj.itemsdelivered_datetime
										deliveryfailed_datetime = customerjobdatetime_obj.deliveryfailed_datetime

									try:
										pickup_proof_method_new, pickup_fromperson_name_new, pickup_fromperson_phone_new, pickup_fromperson_signature_new = '', '', '', ''
										if job.customerjob.sameIdForParcelsDetails!=0:
											all_customer_job = CustomerJob.objects.filter(sameIdForParcelsDetails = job.customerjob.sameIdForParcelsDetails)
											for al in all_customer_job:
												customer_deatils_all = CustomerJobDeliveryExtraDetails.objects.filter(job = al).first()
												if customer_deatils_all:
													if customer_deatils_all.pickup_proof_method == 'signature':
														pickup_proof_method_new = customer_deatils_all.pickup_proof_method
														pickup_fromperson_name_new = customer_deatils_all.pickup_fromperson_name
														try:
															pickup_fromperson_signature_new = str(settings.MEDIA_BASE_URL) + customer_deatils_all.pickup_fromperson_signature.name
														except:
															pickup_fromperson_signature_new= ''
													elif customer_deatils_all.pickup_proof_method == 'otp':
														pickup_proof_method_new= customer_deatils_all.pickup_proof_method
														pickup_fromperson_name_new= job.customerjob.sendername
														try:
															pickup_fromperson_phone_new= job.customerjob.sendercountrycode + '-' + job.customerjob.senderphone
														except:
															pickup_fromperson_phone_new= ''
													else:
														pickup_proof_method_new= customer_deatils_all.pickup_proof_method
									except Exception as e:
										print(e)





									delivery_proof_method, delivery_toperson_name, delivery_toperson_phone, delivery_toperson_signature = '', '', '', ''
									pickup_proof_method, pickup_fromperson_name, pickup_fromperson_phone, pickup_fromperson_signature = '', '', '', ''
									customerjobdeliveryextradetails_obj = CustomerJobDeliveryExtraDetails.objects.filter(job = job.customerjob).first()
									if customerjobdeliveryextradetails_obj:
										if customerjobdeliveryextradetails_obj.delivery_proof_method == 'signature':
											delivery_proof_method = customerjobdeliveryextradetails_obj.delivery_proof_method
											delivery_toperson_name = customerjobdeliveryextradetails_obj.delivery_toperson_name
											try:
												delivery_toperson_signature = str(settings.MEDIA_BASE_URL) + customerjobdeliveryextradetails_obj.delivery_toperson_signature.name
											except:
												delivery_toperson_signature=''
										elif customerjobdeliveryextradetails_obj.delivery_proof_method == 'otp':
											delivery_proof_method = customerjobdeliveryextradetails_obj.delivery_proof_method
											delivery_toperson_name = job.customerjob.recipientname
											try:
												delivery_toperson_phone = job.customerjob.recipientcountrycode + '-' + job.customerjob.recipientphone
											except:
												delivery_toperson_phone=''
										else:
											delivery_proof_method = customerjobdeliveryextradetails_obj.delivery_proof_method

										
										if customerjobdeliveryextradetails_obj.pickup_proof_method == 'signature':
											pickup_proof_method = customerjobdeliveryextradetails_obj.pickup_proof_method
											pickup_fromperson_name = customerjobdeliveryextradetails_obj.pickup_fromperson_name
											try:
												pickup_fromperson_signature = str(settings.MEDIA_BASE_URL) + customerjobdeliveryextradetails_obj.pickup_fromperson_signature.name
											except:
												pickup_fromperson_signature= ''

										elif customerjobdeliveryextradetails_obj.pickup_proof_method == 'otp':
											pickup_proof_method = customerjobdeliveryextradetails_obj.pickup_proof_method
											pickup_fromperson_name = job.customerjob.sendername
											try:
												pickup_fromperson_phone = job.customerjob.sendercountrycode + '-' + job.customerjob.senderphone
											except:
												pickup_fromperson_phone = ''
										else:
											pickup_proof_method = customerjobdeliveryextradetails_obj.pickup_proof_method
								pass
								print('first-4')
								alldriverjobs_data.append({
									'awbnumber' : 'AWB-' + str(10000 + job.customerjob.id),
									'sendername' : job.customerjob.sendername,
									'sendercountrycode' : sendercountrycode,
									'senderphone' : job.customerjob.senderphone,
									'senderpickupaddress' : job.customerjob.pickupaddress,
									'sendercity' : job.customerjob.sendercity,
									'pickuptimeslot' : job.customerjob.pickuptimeslot,
									'noofparcels' : job.customerjob.noofparcels,
									'recipientname' : job.customerjob.recipientname,
									'recipientcountrycode' : recipientcountrycode,
									'recipientphone' : job.customerjob.recipientphone,
									'recipientdropoffaddress' : job.customerjob.dropoffaddress,
									'dropofftimeslot' : job.customerjob.dropofftimeslot,
									# 'recipientdropoffaddress' : customerjob_obj.dropoffaddress, not commented by me
									'length' : job.customerjob.length,
									'width' : job.customerjob.width,
									'height' : job.customerjob.height,
									'weight' : job.customerjob.weight,
									'parceltype' : job.customerjob.parceltype,
									'vehicletype' : job.customerjob.vehicletype.name,
									'fare' : round(job.customerjob.price,2),
									'parcelpdf_link' : parcelpdf_link,
									'qrcode' : qrcode,
									'specialbooking' : job.customerjob.specialbooking,

									'delivery_safe_status':delivery_safe_status,
									'safe_image_proof':safe_image_proof,
									'driver_job_status':driver_job_status,

									'senderlatitude' : job.customerjob.senderlatitude,
									'senderlongitude' : job.customerjob.senderlongitude,
									'recipientlatitude' : job.customerjob.recipientlatitude,
									'recipientlongitude' : job.customerjob.recipientlongitude,
									'showscanbutton' : showscanbutton,
									'showhandovertorecipientbutton' : showhandovertorecipientbutton, 
									'pickupspecialnote' : job.customerjob.pickupspecialnote,
									'dropoffspecialnote' : job.customerjob.dropoffspecialnote,

									'rating' : rating,
									'feedback' : feedback,
									'feedbackgiven' : feedbackgiven,

									'crationDate' : job.customerjob.creation_date,
									'deliveryDuration' : job.customerjob.deliveryduration,
									'status' : job.customerjob.status,

									'ordertype' : ordertype,
									
									'delivery_proof_method' : delivery_proof_method,
									'delivery_toperson_name' : delivery_toperson_name,
									'delivery_toperson_phone' : delivery_toperson_phone,
									'delivery_toperson_signature' : delivery_toperson_signature,
									
									'pickup_proof_method' : pickup_proof_method_new,
									'pickup_fromperson_name' : pickup_fromperson_name_new,
									'pickup_fromperson_phone' : pickup_fromperson_phone_new,
									'pickup_fromperson_signature' : pickup_fromperson_signature_new,

									'itemsdelivered_datetime' : itemsdelivered_datetime,


									# 'noOfParcel':job.customerjob.noofparcels,
									# 'sendername' : job.customerjob.sendername,
									# 'senderphone' : job.customerjob.senderphone,
									# 'senderpickupaddress' : job.customerjob.pickupaddress,
									# 'recipientname' : job.customerjob.recipientname,
									# 'recipientcountrycode' : job.customerjob.recipientcountrycode,
									# 'recipientphone' : job.customerjob.recipientphone,
									# 'recipientdropoffaddress' : job.customerjob.dropoffaddress,
									# 'customerjobid' : job.customerjob.id,
									'driverjobid' : job.id,
									'driverOnWayButtton':driverOnWayButtton,
									'driverArrivedButton':driverArrivedButton,
									'driverPickedUpParcelButton': driverPickedUpParcelButton,
									'dateStatus':DateStatus,
									'priorityBaseIDForParcel':job.customerjob.priorityBaseIDForParcel,
									'priorityBaseIDJobs':job.priorityBaseIDJobs,
									})
						for view in alldriverjobs_data:
							if view['dateStatus'] == dateStatus:
								newDataAfterFilter.append(view)
						print('first-5')
						print(alldriverjobs_data)
						# print(outstandingdriverjobs_data)
						newsorted=[]
						for i in newDataAfterFilter:
							sorted_obj = sorted(i, key=lambda j : j['priorityBaseIDForParcel'], reverse=False)
							newsorted.append(sorted_obj)
							print(sorted_obj)
						outstandingdriverjobs_datanew = sorted(newsorted, key=take_second)
						print('Sorted list:', outstandingdriverjobs_datanew)
						return JsonResponse({ 'status_code': 200 ,'Total Parcel To Be Deliverd':totalParcelToBeDeliverd,'data' : outstandingdriverjobs_datanew, 'support_phone' : support_phone, 'status_message' : 'success' })
					else:
						return JsonResponse({ 'status_code': 200 , 'data' : [],'status_message' : 'success' })
				else:
					return JsonResponse({ 'status_code': 400 , 'data' : [],'status_message' : '' })
			else:
				return JsonResponse({ 'status_code': 401 , 'data' : [] ,'status_message' : 'User not logged in.' })
		except Exception as e:
			print(e)
			return JsonResponse({'status_code': 500, 'status_message': 'Internal Server Error',})
class DriverCustomerJobDetailExtraTest(APIView):
	# permission_classes = (AllowAny,)
	def get(self, request):
		''' This API method is used to get profile data of user'''
		print('data is  : ',request.GET)
		try:
			session_token_val = request.GET.get('session_token')
			if not session_token_val:
				return JsonResponse({'status_code': 400, 'status_message': 'User not logged in',})
			alldriverjobs_data = []
			token_obj = Token.objects.filter(key = session_token_val).first()
			if token_obj:
				user_obj = User.objects.filter(id = token_obj.user_id).first()
				if user_obj:
					print('0')
					driver_obj = DriverModel.objects.filter(user = user_obj).first()
					if driver_obj:
						print('1')

						supportdetail_obj = SupportDetail.objects.filter(isdeleted = False).first()
						if supportdetail_obj:
							support_phone = supportdetail_obj.phone
						else:
							support_phone = ''
						driverjob_obj = DriverJob.objects.filter(driver = driver_obj)
						if driverjob_obj:
							print('2')
							print(len(driverjob_obj))
							totalParcelToBeDeliverd=0
							for job in driverjob_obj:
								driverOnWay=False
								driverArrived=False
								totalParcelToBeDeliverd=totalParcelToBeDeliverd+int(job.customerjob.noofparcels)
								showscanbutton = False
								showhandovertorecipientbutton = False
								driverOnWayButtton = False
								driverArrivedButton = False
								driverPickedUpParcelButton = False 
								driver_job_status=0
								if job:	
									print("first -1")
									if job.jobstarted == True:
										driver_job_status=1
									if job.arrived_at_pickup == True:
										driver_job_status=2
									if job.parcel_picked_by_driver == True:
										driver_job_status=3
									if job.start_DropOff == True:
										driver_job_status=4
									if job.arrived_atDropOffLocation == True:
										driver_job_status=5
									if job.jobcompleted == True:
										driver_job_status=6
									if job.deliveryfailed == True:
										driver_job_status=99
									# print('if')
									# if job.jobstarted == False and job.driverArrived == False:
									# 	print('if 2')
									# 	driverOnWayButtton = True
									# elif job.driverOnWay == True and job.driverArrived == False:
									# 	print('if 2')
									# 	driverArrivedButton = True
									# elif job.driverArrived == True and job.jobstarted == False:
									# 	print('if 2')
									# 	driverPickedUpParcelButton = True
									# elif job.jobstarted == False and job.jobcompleted == False:
									# 	print('if 2')
									# 	showscanbutton = True
									# elif job.jobstarted == True and job.jobcompleted == False:
									# 	print('elif')
									# 	showscanbutton = False
									# 	showhandovertorecipientbutton = True
									# elif job.jobstarted == True and job.jobcompleted == True:
									# 	print('elif')
									# 	showscanbutton = False
									# 	showhandovertorecipientbutton = False
								print("first -2")

								# customerjob_obj = CustomerJob.objects.filter(id = customerjobid_val).first()
								if job.customerjob:			
									if not job.customerjob.sendercountrycode:
										sendercountrycode = ''
									else:
										sendercountrycode = job.customerjob.sendercountrycode

									if not job.customerjob.recipientcountrycode:
										recipientcountrycode = ''
									else:
										recipientcountrycode = job.customerjob.recipientcountrycode
									if not job.customerjob.qrcode:
										qrcode = ''
									else:
										qrcode = str(settings.MEDIA_BASE_URL) + job.customerjob.qrcode.name

									if job.customerjob.parcelpdf:
										parcelpdf_link = str(settings.WEB_BASE_URL) + job.customerjob.parcelpdf.name
									else:
										parcelpdf_link = ''

									if job.customerjob.order.ordertype == 1:
										ordertype = 'Single-Drop'
									elif job.customerjob.order.ordertype == 2:
										ordertype = 'Multi-Drop'
									else:
										ordertype = ''
									rating, feedback, feedbackgiven = 0, '', False
									userrating_obj = UserRating.objects.filter(customerjobid = job.customerjob.id, ratingfor = 'customer').first()
									if userrating_obj:
										feedbackgiven = True
										rating = userrating_obj.rating
										feedback = userrating_obj.note

									delivery_safe_status=False
									safe_image_proof=''

									safepalceImage=DriverDropSafePalace.objects.filter(driver_job=job,customerjob=job.customerjob).first()
									if safepalceImage:
										delivery_safe_status=True
										safe_image_proof= str(settings.MEDIA_BASE_URL) + safepalceImage.safeplace.name
									print("first -3")
									customerjobdatetime_obj = CustomerJobDateTime.objects.filter(job = job.customerjob).first()
									payment_datetime, pickup_datetime, itemsdelivered_datetime, deliveryfailed_datetime = '', '', '', ''
									if customerjobdatetime_obj:
										payment_datetime = customerjobdatetime_obj.payment_datetime
										pickup_datetime = customerjobdatetime_obj.pickup_datetime
										itemsdelivered_datetime = customerjobdatetime_obj.itemsdelivered_datetime
										deliveryfailed_datetime = customerjobdatetime_obj.deliveryfailed_datetime

									try:
										pickup_proof_method_new, pickup_fromperson_name_new, pickup_fromperson_phone_new, pickup_fromperson_signature_new = '', '', '', ''
										if job.customerjob.sameIdForParcelsDetails!=0:
											all_customer_job = CustomerJob.objects.filter(sameIdForParcelsDetails = job.customerjob.sameIdForParcelsDetails)
											for al in all_customer_job:
												customer_deatils_all = CustomerJobDeliveryExtraDetails.objects.filter(job = al).first()
												if customer_deatils_all:
													if customer_deatils_all.pickup_proof_method == 'signature':
														pickup_proof_method_new = customer_deatils_all.pickup_proof_method
														pickup_fromperson_name_new = customer_deatils_all.pickup_fromperson_name
														try:
															pickup_fromperson_signature_new = str(settings.MEDIA_BASE_URL) + customer_deatils_all.pickup_fromperson_signature.name
														except:
															pickup_fromperson_signature_new= ''
													elif customer_deatils_all.pickup_proof_method == 'otp':
														pickup_proof_method_new= customer_deatils_all.pickup_proof_method
														pickup_fromperson_name_new= job.customerjob.sendername
														try:
															pickup_fromperson_phone_new= job.customerjob.sendercountrycode + '-' + job.customerjob.senderphone
														except:
															pickup_fromperson_phone_new= ''
													else:
														pickup_proof_method_new= customer_deatils_all.pickup_proof_method
									except Exception as e:
										print(e)





									delivery_proof_method, delivery_toperson_name, delivery_toperson_phone, delivery_toperson_signature = '', '', '', ''
									pickup_proof_method, pickup_fromperson_name, pickup_fromperson_phone, pickup_fromperson_signature = '', '', '', ''
									customerjobdeliveryextradetails_obj = CustomerJobDeliveryExtraDetails.objects.filter(job = job.customerjob).first()
									if customerjobdeliveryextradetails_obj:
										if customerjobdeliveryextradetails_obj.delivery_proof_method == 'signature':
											delivery_proof_method = customerjobdeliveryextradetails_obj.delivery_proof_method
											delivery_toperson_name = customerjobdeliveryextradetails_obj.delivery_toperson_name
											try:
												delivery_toperson_signature = str(settings.MEDIA_BASE_URL) + customerjobdeliveryextradetails_obj.delivery_toperson_signature.name
											except:
												delivery_toperson_signature=''
										elif customerjobdeliveryextradetails_obj.delivery_proof_method == 'otp':
											delivery_proof_method = customerjobdeliveryextradetails_obj.delivery_proof_method
											delivery_toperson_name = job.customerjob.recipientname
											try:
												delivery_toperson_phone = job.customerjob.recipientcountrycode + '-' + job.customerjob.recipientphone
											except:
												delivery_toperson_phone=''
										else:
											delivery_proof_method = customerjobdeliveryextradetails_obj.delivery_proof_method

										
										if customerjobdeliveryextradetails_obj.pickup_proof_method == 'signature':
											pickup_proof_method = customerjobdeliveryextradetails_obj.pickup_proof_method
											pickup_fromperson_name = customerjobdeliveryextradetails_obj.pickup_fromperson_name
											try:
												pickup_fromperson_signature = str(settings.MEDIA_BASE_URL) + customerjobdeliveryextradetails_obj.pickup_fromperson_signature.name
											except:
												pickup_fromperson_signature= ''

										elif customerjobdeliveryextradetails_obj.pickup_proof_method == 'otp':
											pickup_proof_method = customerjobdeliveryextradetails_obj.pickup_proof_method
											pickup_fromperson_name = job.customerjob.sendername
											try:
												pickup_fromperson_phone = job.customerjob.sendercountrycode + '-' + job.customerjob.senderphone
											except:
												pickup_fromperson_phone = ''
										else:
											pickup_proof_method = customerjobdeliveryextradetails_obj.pickup_proof_method
								pass
								print('first-4')
								alldriverjobs_data.append({
									'awbnumber' : 'AWB-' + str(10000 + job.customerjob.id),
									'sendername' : job.customerjob.sendername,
									'sendercountrycode' : sendercountrycode,
									'senderphone' : job.customerjob.senderphone,
									'senderpickupaddress' : job.customerjob.pickupaddress,
									'sendercity' : job.customerjob.sendercity,
									'pickuptimeslot' : job.customerjob.pickuptimeslot,
									'noofparcels' : job.customerjob.noofparcels,
									'recipientname' : job.customerjob.recipientname,
									'recipientcountrycode' : recipientcountrycode,
									'recipientphone' : job.customerjob.recipientphone,
									'recipientdropoffaddress' : job.customerjob.dropoffaddress,
									'dropofftimeslot' : job.customerjob.dropofftimeslot,
									# 'recipientdropoffaddress' : customerjob_obj.dropoffaddress, not commented by me
									'length' : job.customerjob.length,
									'width' : job.customerjob.width,
									'height' : job.customerjob.height,
									'weight' : job.customerjob.weight,
									'parceltype' : job.customerjob.parceltype,
									'vehicletype' : job.customerjob.vehicletype.name,
									'fare' : round(job.customerjob.price,2),
									'parcelpdf_link' : parcelpdf_link,
									'qrcode' : qrcode,
									'specialbooking' : job.customerjob.specialbooking,

									'delivery_safe_status':delivery_safe_status,
									'safe_image_proof':safe_image_proof,
									'driver_job_status':driver_job_status,

									'senderlatitude' : job.customerjob.senderlatitude,
									'senderlongitude' : job.customerjob.senderlongitude,
									'recipientlatitude' : job.customerjob.recipientlatitude,
									'recipientlongitude' : job.customerjob.recipientlongitude,
									'showscanbutton' : showscanbutton,
									'showhandovertorecipientbutton' : showhandovertorecipientbutton, 
									'pickupspecialnote' : job.customerjob.pickupspecialnote,
									'dropoffspecialnote' : job.customerjob.dropoffspecialnote,

									'rating' : rating,
									'feedback' : feedback,
									'feedbackgiven' : feedbackgiven,

									'crationDate' : job.customerjob.creation_date,
									'deliveryDuration' : job.customerjob.deliveryduration,
									'status' : job.customerjob.status,

									'ordertype' : ordertype,
									
									'delivery_proof_method' : delivery_proof_method,
									'delivery_toperson_name' : delivery_toperson_name,
									'delivery_toperson_phone' : delivery_toperson_phone,
									'delivery_toperson_signature' : delivery_toperson_signature,
									
									'pickup_proof_method' : pickup_proof_method_new,
									'pickup_fromperson_name' : pickup_fromperson_name_new,
									'pickup_fromperson_phone' : pickup_fromperson_phone_new,
									'pickup_fromperson_signature' : pickup_fromperson_signature_new,

									'itemsdelivered_datetime' : itemsdelivered_datetime,


									# 'noOfParcel':job.customerjob.noofparcels,
									# 'sendername' : job.customerjob.sendername,
									# 'senderphone' : job.customerjob.senderphone,
									# 'senderpickupaddress' : job.customerjob.pickupaddress,
									# 'recipientname' : job.customerjob.recipientname,
									# 'recipientcountrycode' : job.customerjob.recipientcountrycode,
									# 'recipientphone' : job.customerjob.recipientphone,
									# 'recipientdropoffaddress' : job.customerjob.dropoffaddress,
									# 'customerjobid' : job.customerjob.id,
									'driverjobid' : job.id,
									'driverOnWayButtton':driverOnWayButtton,
									'driverArrivedButton':driverArrivedButton,
									'driverPickedUpParcelButton': driverPickedUpParcelButton,

									})
						print('first-5')
						print(alldriverjobs_data)
						return JsonResponse({ 'status_code': 200 ,'Total Parcel To Be Deliverd':totalParcelToBeDeliverd,'data' : alldriverjobs_data, 'support_phone' : support_phone, 'status_message' : 'success' })
					else:
						return JsonResponse({ 'status_code': 200 , 'data' : [],'status_message' : 'success' })
				else:
					return JsonResponse({ 'status_code': 400 , 'data' : [],'status_message' : '' })
			else:
				return JsonResponse({ 'status_code': 401 , 'data' : [] ,'status_message' : 'User not logged in.' })
		except Exception as e:
			print(e)
			return JsonResponse({'status_code': 500, 'status_message': 'Internal Server Error',})


# @method_decorator(checklogin, name='dispatch')
class DriverPickupVerifyParcel(APIView):
	# permission_classes = (AllowAny,)
	def post(self, request, *args, **kwargs):
		print('\n\n')
		print('DriverPickupVerifyParcel API - in post')
		print('data is  : ',request.POST)
		
		session_token_val = request.POST.get('session_token')
		if not session_token_val:
			return JsonResponse({'status_code': 400, 'status_message': 'User not logged in.'})

		customerjobid_val = request.POST.get('customerjobid')
		if not customerjobid_val:
			return JsonResponse({'status_code': 400, 'status_message': 'customerjobid is required'})
		try:
			selectedcustomerjobid_val = request.POST.get('selectedcustomerjobid')
			if not selectedcustomerjobid_val:
				return Response({'status_code': 400, 'status_message': 'selectedcustomerjobid is required'})

			if customerjobid_val != selectedcustomerjobid_val:
				return Response({'status_code': 400, 'status_message': 'This QR Code is not associated with this record.'})
		except Exception as e:
			print(e)
		try:
			driverjobid_val = request.POST.get('driverjobid')
			if not driverjobid_val:
				return JsonResponse({'status_code': 400, 'status_message': 'driverjobid is required'})
			driverjob_obj = DriverJob.objects.filter(id  = driverjobid_val, customerjob_id = customerjobid_val).first()
			if driverjob_obj:
				driverjob_obj.jobstarted = True
				driverjob_obj.save()
				try:
					current_date = datetime.datetime.now()
					customerjobdatetime_obj = CustomerJobDateTime.objects.filter(job_id = customerjobid_val).first()
					if customerjobdatetime_obj:
						customerjobdatetime_obj.pickup_datetime = current_date
						customerjobdatetime_obj.save()
					else:
						customerjob_obj = CustomerJob.objects.filter(id = customerjobid_val).first()
						if customerjob_obj:
							CustomerJobDateTime.objects.create(job = customerjob_obj, pickup_datetime = current_date)
				except Exception as e:
					print(e)
				try:
					sendfcmnotification(driverjob_obj.driver.fcmtoken, 'driver', 'statuschange', 'KwickDelivery', 'You have picked up parcel successfully')
				except Exception as e:
					print(e)
				try:
					sendfcmnotification(driverjob_obj.customerjob.customer.fcmtoken, 'customer', 'statuschange', 'KwickDelivery', 'Your parcel is picked up successfully')
				except Exception as e:
					print(e)
				try:
					Notifications.objects.create(user = driverjob_obj.customerjob.customer.user, customerjobid = driverjob_obj.customerjob.id, forcustomer = True, notificationtype = 'Parcel Picked', notificationtext = 'Your parcel is picked up successfully', status = 'unread')
				except Exception as e:
					print(e)
				return JsonResponse({'status_code': 200, 'status_message': 'success'})
			else:
				return JsonResponse({'status_code': 400, 'status_message': 'Not a valid request'})

			# deliveryboyuser_obj = MainUser.objects.filter(token = session_token_val).first()
			# if not deliveryboyuser_obj:
			# 	return Response({'code': 0, 'error': 'User not logged in.','status_code': 0, 'status_message': 'User not logged in.'})
			# customer_job_obj=CustomerJob.objects.filter(awdnumber = awbnumber_val).first()

			
			# matchedparceldeliveryboy_obj = MatchedParcelsDeliveryBoyModal.objects.filter(matchedparcel = customer_job_obj, matcheddeliveryboy = deliveryboyuser_obj, jobcompleted = False, attime = 1).first()
			# if matchedparceldeliveryboy_obj:
			# 	current_date = datetime.datetime.now()
			# 	customerjobdatetime_obj = CustomerJobDateTime.objects.filter(job=customer_job_obj).update(firstmilepickup_datetime=current_date)
			# 	deliveryduration = ''
			# 	Notifications.objects.create(user=customer_job_obj.user.user,forcustomer=True,related_job_id=customer_job_obj.parcel_id,relatedawbnumber = customer_job_obj.awdnumber,notificationtype='Pickedup By Delivery Boy',text='Your parcel is pickedup by delivery boy.')
			# 	Notifications.objects.create(user=deliveryboyuser_obj,fordelivery=True,deliveryduration = deliveryduration,related_job_id=customer_job_obj.parcel_id,relatedawbnumber = customer_job_obj.awdnumber,notificationtype='Parcel Pickedup',text='You have pickedup parcel from customer pickup address.')
			# 	CustomerJobStatus.objects.filter(job=customer_job_obj).update(bookingreceived=False,bookingconfirmed=False,deliveryboyassigned=False,firstmilepickup=True,atairdelyhub=False,parcelassignedtoairtraveller=False,otwtoairport=False,intransit=False,atdestinationairport=False,atdestinationhub=False,outfordelivery=False,itemsdelivered=False,customerselfdeliverytoairdelycentre=False,recipientselfcollectfromairdelycentre=False)
				
			# 	matchedparceldeliveryboy_obj.parcelverified = True
			# 	# matchedparceldeliveryboy_obj.jobcompleted = True
			# 	matchedparceldeliveryboy_obj.save()
			# 	BookedDeliveryBoys.objects.filter(matchedparcelsdeliveryboy_reference = matchedparceldeliveryboy_obj).delete()
			# 	return JsonResponse({ 'code': 200 , 'message' : 'You have pickedup the parcel.','status_code': 200 , 'status_message' : 'You have pickedup the parcel.' }, status=200, safe=False)
			# else:
			# 	return JsonResponse({ 'code': 100 , 'message' : 'This QR Code is not associated with your record.','status_code': 100 , 'status_message' : 'This QR Code is not associated with your record.' }, status=200, safe=False)
		except Exception as e:
			return JsonResponse({'status_code': 500, 'status_message': 'Internal Server Error'})


class DriverPickupVerifyParcelExtraTest(APIView):
	# permission_classes = (AllowAny,)
	def post(self, request, *args, **kwargs):
		print('\n\n')
		print('DriverPickupVerifyParcel API - in post')
		print('data is  : ',request.POST)
		
		session_token_val = request.POST.get('session_token')
		if not session_token_val:
			return JsonResponse({'status_code': 400, 'status_message': 'User not logged in.'})

		# customerjobid_val = request.POST.get('customerjobid')
		# if not customerjobid_val:
			# return JsonResponse({'status_code': 400, 'status_message': 'customerjobid is required'})
		# driverjobid_val = request.POST.get('driverjobid')
		# if not driverjobid_val:
			# return JsonResponse({'status_code': 400, 'status_message': 'driverjobid is required'})
		method_type = request.POST.get('method_type')
		if not method_type:
			return JsonResponse({'status_code': 400, 'status_message': 'method_type is required'})
		data_ids = request.POST.get('data_ids')
		if not data_ids:
			return JsonResponse({'status_code': 400, 'status_message': 'Data is Required'})
		data_ids = json.loads(data_ids)
		all_data_response=[]
		for ids in data_ids:
			print("count for manpreet")
			# print(parcel['sendername'])
			print(ids['customerjobid'])
			print(ids['driverjobid'])
			customerjobid_val = ids['customerjobid']
			driverjobid_val = ids['driverjobid']
			parcel_comment = ids['comment']
			latitude_val = ids['latitude']
			longitude_val = ids['longitude']

			try:
				customerjob_obj = CustomerJob.objects.filter(id = customerjobid_val).first()
				api_key = str(settings.GOOGLE_API_KEY)
				print("location 1")
				# pickupaddress_val = pickupaddress_val.replace(' ','')
				# pickupaddress_val = pickupaddress_val.replace('#','')
				# dropaddress_val = dropaddress_val.replace(' ','')
				# dropaddress_val = dropaddress_val.replace('#','')
				# source = pickupaddress_val

				# dest = dropaddress_val
				driverlatitude_val=str(latitude_val)
				driverlongitude_val=str(longitude_val)
				parcellatitude_val=str(customerjob_obj.senderlatitude)
				parcellongitude_val=str(customerjob_obj.senderlongitude)
				print("location 2")
				url ='https://maps.googleapis.com/maps/api/distancematrix/json?'
				if driverlatitude_val and driverlongitude_val and parcellatitude_val and parcellongitude_val:
					print("location 3")
					drivercoordinates_val = driverlatitude_val + ',' + driverlongitude_val
					parcelcoordinates_val = parcellatitude_val + ',' + parcellongitude_val
					# return response object 
					print(url + 'origins=' + drivercoordinates_val + '&destinations=' + parcelcoordinates_val + '&key=' + api_key)
					r = requests.get(url + 'origins=' + drivercoordinates_val + '&destinations=' + parcelcoordinates_val + '&key=' + api_key)
				print("location 4")
				x = r.json() 
				print(x)
				print('\n')
				print("location 5")
				if x['status'] == 'OK':
					print("location 6")
					multiplicationfactor = 0.000621371192
					distanceinmiles = float(x['rows'][0]['elements'][0]['distance']['value']) * multiplicationfactor
					radius=500.0
					try:
						radiusObject=RadiusControl.objects.filter(enable=True).first()
						radius=radiusObject.distance
					except Exception as e:
						print(e)
					desti_radius=float(radius*multiplicationfactor)
					print(desti_radius)
					print("location 7")
					if distanceinmiles<=desti_radius:
					# if True:
						print("arrived")
					else:
						try:
							driverjob_obj = DriverJob.objects.filter(id  = driverjobid_val, customerjob_id = customerjobid_val).first()
							radiusPermisssion=RadiusPermission.objects.filter(driverjob=driverjob_obj,customerjob=customerjob_obj).first()
							if radiusPermisssion:
								if radiusPermisssion.status=='0':
									return JsonResponse({'status_code': 400, 'status_message': 'Your request is in Process,Please wait'})
								elif radiusPermisssion.status=='1':
									pass
								elif radiusPermisssion.status=='2':
									return JsonResponse({'status_code': 400, 'status_message': 'you are not in radius,Admin Rejected your request'})
							else:
								RadiusPermission.objects.create(driverjob=driverjob_obj,customerjob=customerjob_obj,distance=distanceinmiles,status=0)
								return JsonResponse({'status_code': 400, 'status_message': 'Your request send to admin,Please wait'})
						except Exception as e:
							print(e)
							return JsonResponse({'status_code': 400, 'status_message': 'location error'})
				else:
					return JsonResponse({'status_code': 400, 'status_message': 'you are not in radius of parcel location'})
			except Exception as e:
				print(e)
				return JsonResponse({'status_code': 400, 'status_message': 'location error'})
			comment_for_parcel=True
			if parcel_comment == 'NONE':
				comment_for_parcel=False
			if comment_for_parcel == False:
				try:
					if method_type == 'scan':
						scannedcustomerjobid_val = request.POST.get('scannedcustomerjobid')
						if not scannedcustomerjobid_val:
							return JsonResponse({'status_code': 400, 'status_message': 'scannedcustomerjobid is required'})
						scannedcustomerjobid_val = scannedcustomerjobid_val.split('-')[-1] 
						if customerjobid_val != scannedcustomerjobid_val:
							return JsonResponse({'status_code': 400, 'status_message': 'This QR Code is not associated with this record.'})
						
						customerjobdeliveryextradetails_obj = CustomerJobDeliveryExtraDetails.objects.filter(job_id = customerjobid_val).first()
						if customerjobdeliveryextradetails_obj:
							customerjobdeliveryextradetails_obj.pickup_proof_method = method_type
							customerjobdeliveryextradetails_obj.save()
						else:
							CustomerJobDeliveryExtraDetails.objects.create(job_id = customerjobid_val, pickup_proof_method = method_type)
						
					elif method_type == 'signature':
						name_val = request.POST.get('name')
						if not name_val:
							return JsonResponse({'status_code': 400, 'status_message': 'name is required'})
						try:
							image = request.FILES.get('signature')
							if image:
								customerjob_obj = CustomerJob.objects.filter(id = customerjobid_val).first()
								filename = image.name
								filename = filename.split('.')
								extension = str(filename[-1])
								image_data = BytesIO(image.read())
								img = Image.open(image_data)
								filepath = str(settings.BASE_DIR)+'/media/CustomerJobs/'+str(customerjob_obj.id)
								if(os.path.exists(filepath)):
									pass
								else:
									os.makedirs(filepath)
								img.save(filepath +'/pickup_proofofdelivery.'+extension)	
								filename = '/media/CustomerJobs/'+str(customerjob_obj.id) + '/pickup_proofofdelivery.'+extension
								customerjobdeliveryextradetails_obj = CustomerJobDeliveryExtraDetails.objects.filter(job_id = customerjobid_val).first()
								if customerjobdeliveryextradetails_obj:
									customerjobdeliveryextradetails_obj.pickup_proof_method = method_type
									customerjobdeliveryextradetails_obj.pickup_fromperson_name = name_val
									customerjobdeliveryextradetails_obj.pickup_fromperson_signature = filename
									customerjobdeliveryextradetails_obj.save()
								else:
									CustomerJobDeliveryExtraDetails.objects.create(job_id = customerjobid_val, pickup_proof_method = method_type, pickup_fromperson_name = name_val, pickup_fromperson_signature = filename)
								
							else:
								return JsonResponse({'status_code': 400, 'status_message': 'signature is required'})
						except Exception as e:
							print(e)
					elif method_type =='otp':
						otp_val = request.POST.get('otp')
						if not otp_val:
							return JsonResponse({'status_code': 400, 'status_message': 'otp is required'})
						customerjobdeliveryextradetails_obj = CustomerJobDeliveryExtraDetails.objects.filter(job_id = customerjobid_val).first()
						print("my customer details",customerjobdeliveryextradetails_obj)
						print("my customer otp",customerjobdeliveryextradetails_obj.pickup_otp)
						print("my otp",otp_val)
						if customerjobdeliveryextradetails_obj:
							if customerjobdeliveryextradetails_obj.pickup_otp == otp_val:
								customerjobdeliveryextradetails_obj = CustomerJobDeliveryExtraDetails.objects.filter(job_id = customerjobid_val).first()
								if customerjobdeliveryextradetails_obj:
									customerjobdeliveryextradetails_obj.pickup_proof_method = method_type
									customerjobdeliveryextradetails_obj.save()
								else:
									CustomerJobDeliveryExtraDetails.objects.create(job_id = customerjobid_val, pickup_proof_method = method_type)
							else:
								return JsonResponse({'status_code': 400, 'status_message': 'Invalid OTP'})
						else:
							CustomerJobDeliveryExtraDetails.objects.create(job_id = customerjobid_val, pickup_proof_method = method_type)


					# customerjobdeliveryextradetails_obj = CustomerJobDeliveryExtraDetails.objects.filter()
				except Exception as e:
					print(e)
			try:
				
				driverjob_obj = DriverJob.objects.filter(id  = driverjobid_val, customerjob_id = customerjobid_val).first()
				if driverjob_obj:
					if comment_for_parcel == False:
						driverjob_obj.parcel_picked_by_driver = True
						# driverjob_obj.start_DropOff = True
						driverjob_obj.save()
					else:
						driverjob_obj.parcel_disabled = True
						driverjob_obj.save()
					if comment_for_parcel == False:
						try:
							current_date = datetime.datetime.now()
							customerjobdatetime_obj = CustomerJobDateTime.objects.filter(job_id = customerjobid_val).first()
							if customerjobdatetime_obj:
								customerjobdatetime_obj.pickup_datetime = current_date
								customerjobdatetime_obj.startDropOffTime = current_date
								customerjobdatetime_obj.save()
							else:
								customerjob_obj = CustomerJob.objects.filter(id = customerjobid_val).first()
								if customerjob_obj:
									CustomerJobDateTime.objects.create(job = customerjob_obj, pickup_datetime = current_date)
						except Exception as e:
							print(e)
					else:
						customerjob_obj = CustomerJob.objects.filter(id = customerjobid_val).first()
						customerjob_obj.isdisabled=True
						customerjob_obj.comment_of_Parcel = parcel_comment
						customerjob_obj.save()
					if comment_for_parcel == False:
						try:
							sendfcmnotification(driverjob_obj.driver.fcmtoken, 'driver', 'statuschange', 'KwickDelivery', 'You have picked up parcel successfully')
						except Exception as e:
							print(e)
						try:
							sendfcmnotification(driverjob_obj.customerjob.customer.fcmtoken, 'customer', 'statuschange', 'KwickDelivery', 'Your parcel is picked up successfully')
						except Exception as e:
							print(e)
						try:
							Notifications.objects.create(user = driverjob_obj.customerjob.customer.user, customerjobid = driverjob_obj.customerjob.id, forcustomer = True, notificationtype = 'Parcel Picked', notificationtext = 'Your parcel is picked up successfully', status = 'unread')
						except Exception as e:
							print(e)
					else:
						try:
							sendfcmnotification(driverjob_obj.driver.fcmtoken, 'driver', 'statuschange', 'KwickDelivery', 'Parcel Not Found')
						except Exception as e:
							print(e)
						try:
							sendfcmnotification(driverjob_obj.customerjob.customer.fcmtoken, 'customer', 'statuschange', 'KwickDelivery', 'Parcel not Found')
						except Exception as e:
							print(e)
						try:
							Notifications.objects.create(user = driverjob_obj.customerjob.customer.user, customerjobid = driverjob_obj.customerjob.id, forcustomer = True, notificationtype = 'Parcel Not Found', notificationtext = 'Parcel Not Found', status = 'unread')
						except Exception as e:
							print(e)
					all_data_response.append({
					'customerid':customerjobid_val,
					'driverid':driverjobid_val,
					'status_message' : 'Parcel Picked-Up Successfully',
					'error':'false',
					})
				else:
					all_data_response.append({
					'customerid':customerjobid_val,
					'driverid':driverjobid_val,
					'status_message' : 'Not a valid request',
					'error':'true',
					})
					# return JsonResponse({'status_code': 400, 'status_message': 'Not a valid request'})

				# deliveryboyuser_obj = MainUser.objects.filter(token = session_token_val).first()
				# if not deliveryboyuser_obj:
				# 	return Response({'code': 0, 'error': 'User not logged in.','status_code': 0, 'status_message': 'User not logged in.'})
				# customer_job_obj=CustomerJob.objects.filter(awdnumber = awbnumber_val).first()

				
				# matchedparceldeliveryboy_obj = MatchedParcelsDeliveryBoyModal.objects.filter(matchedparcel = customer_job_obj, matcheddeliveryboy = deliveryboyuser_obj, jobcompleted = False, attime = 1).first()
				# if matchedparceldeliveryboy_obj:
				# 	current_date = datetime.datetime.now()
				# 	customerjobdatetime_obj = CustomerJobDateTime.objects.filter(job=customer_job_obj).update(firstmilepickup_datetime=current_date)
				# 	deliveryduration = ''
				# 	Notifications.objects.create(user=customer_job_obj.user.user,forcustomer=True,related_job_id=customer_job_obj.parcel_id,relatedawbnumber = customer_job_obj.awdnumber,notificationtype='Pickedup By Delivery Boy',text='Your parcel is pickedup by delivery boy.')
				# 	Notifications.objects.create(user=deliveryboyuser_obj,fordelivery=True,deliveryduration = deliveryduration,related_job_id=customer_job_obj.parcel_id,relatedawbnumber = customer_job_obj.awdnumber,notificationtype='Parcel Pickedup',text='You have pickedup parcel from customer pickup address.')
				# 	CustomerJobStatus.objects.filter(job=customer_job_obj).update(bookingreceived=False,bookingconfirmed=False,deliveryboyassigned=False,firstmilepickup=True,atairdelyhub=False,parcelassignedtoairtraveller=False,otwtoairport=False,intransit=False,atdestinationairport=False,atdestinationhub=False,outfordelivery=False,itemsdelivered=False,customerselfdeliverytoairdelycentre=False,recipientselfcollectfromairdelycentre=False)
					
				# 	matchedparceldeliveryboy_obj.parcelverified = True
				# 	# matchedparceldeliveryboy_obj.jobcompleted = True
				# 	matchedparceldeliveryboy_obj.save()
				# 	BookedDeliveryBoys.objects.filter(matchedparcelsdeliveryboy_reference = matchedparceldeliveryboy_obj).delete()
				# 	return JsonResponse({ 'code': 200 , 'message' : 'You have pickedup the parcel.','status_code': 200 , 'status_message' : 'You have pickedup the parcel.' }, status=200, safe=False)
				# else:
				# 	return JsonResponse({ 'code': 100 , 'message' : 'This QR Code is not associated with your record.','status_code': 100 , 'status_message' : 'This QR Code is not associated with your record.' }, status=200, safe=False)
			except Exception as e:
				all_data_response.append({
					'customerid':customerjobid_val,
					'driverid':Driver_id,
					'status_message' : 'Internal Server Error',
					'error':'true',
					})
				# return JsonResponse({'status_code': 500, 'status_message': 'Internal Server Error'})
		return JsonResponse({'status_code': 200, 'status_message': all_data_response})



#This is our Oroginal Code
class DriverPickupVerifyParcelTest(APIView):
	# permission_classes = (AllowAny,)
	def post(self, request, *args, **kwargs):
		print('\n\n')
		print('DriverPickupVerifyParcel API - in post')
		print('data is  : ',request.POST)
		
		session_token_val = request.POST.get('session_token')
		if not session_token_val:
			return JsonResponse({'status_code': 400, 'status_message': 'User not logged in.'})

		customerjobid_val = request.POST.get('customerjobid')
		if not customerjobid_val:
			return JsonResponse({'status_code': 400, 'status_message': 'customerjobid is required'})
		driverjobid_val = request.POST.get('driverjobid')
		if not driverjobid_val:
			return JsonResponse({'status_code': 400, 'status_message': 'driverjobid is required'})
		method_type = request.POST.get('method_type')
		if not method_type:
			return JsonResponse({'status_code': 400, 'status_message': 'method_type is required'})
		
		try:
			if method_type == 'scan':
				scannedcustomerjobid_val = request.POST.get('scannedcustomerjobid')
				if not scannedcustomerjobid_val:
					return JsonResponse({'status_code': 400, 'status_message': 'scannedcustomerjobid is required'})
				scannedcustomerjobid_val = scannedcustomerjobid_val.split('-')[-1] 
				if customerjobid_val != scannedcustomerjobid_val:
					return JsonResponse({'status_code': 400, 'status_message': 'This QR Code is not associated with this record.'})
				
				customerjobdeliveryextradetails_obj = CustomerJobDeliveryExtraDetails.objects.filter(job_id = customerjobid_val).first()
				if customerjobdeliveryextradetails_obj:
					customerjobdeliveryextradetails_obj.pickup_proof_method = method_type
					customerjobdeliveryextradetails_obj.save()
				else:
					CustomerJobDeliveryExtraDetails.objects.create(job_id = customerjobid_val, pickup_proof_method = method_type)
				
			elif method_type == 'signature':
				name_val = request.POST.get('name')
				if not name_val:
					return JsonResponse({'status_code': 400, 'status_message': 'name is required'})
				try:
					image = request.FILES.get('signature')
					if image:
						customerjob_obj = CustomerJob.objects.filter(id = customerjobid_val).first()
						filename = image.name
						filename = filename.split('.')
						extension = str(filename[-1])
						image_data = BytesIO(image.read())
						img = Image.open(image_data)
						filepath = str(settings.BASE_DIR)+'/media/CustomerJobs/'+str(customerjob_obj.id)
						if(os.path.exists(filepath)):
							pass
						else:
							os.makedirs(filepath)
						img.save(filepath +'/pickup_proofofdelivery.'+extension)	
						filename = '/media/CustomerJobs/'+str(customerjob_obj.id) + '/pickup_proofofdelivery.'+extension
						customerjobdeliveryextradetails_obj = CustomerJobDeliveryExtraDetails.objects.filter(job_id = customerjobid_val).first()
						if customerjobdeliveryextradetails_obj:
							customerjobdeliveryextradetails_obj.pickup_proof_method = method_type
							customerjobdeliveryextradetails_obj.pickup_fromperson_name = name_val
							customerjobdeliveryextradetails_obj.pickup_fromperson_signature = filename
							customerjobdeliveryextradetails_obj.save()
						else:
							CustomerJobDeliveryExtraDetails.objects.create(job_id = customerjobid_val, pickup_proof_method = method_type, pickup_fromperson_name = name_val, pickup_fromperson_signature = filename)
						
					else:
						return JsonResponse({'status_code': 400, 'status_message': 'signature is required'})
				except Exception as e:
					print(e)
			elif method_type =='otp':
				otp_val = request.POST.get('otp')
				if not otp_val:
					return JsonResponse({'status_code': 400, 'status_message': 'otp is required'})
				customerjobdeliveryextradetails_obj = CustomerJobDeliveryExtraDetails.objects.filter(job_id = customerjobid_val).first()
				if customerjobdeliveryextradetails_obj:
					if customerjobdeliveryextradetails_obj.pickup_otp == otp_val:
						customerjobdeliveryextradetails_obj = CustomerJobDeliveryExtraDetails.objects.filter(job_id = customerjobid_val).first()
						if customerjobdeliveryextradetails_obj:
							customerjobdeliveryextradetails_obj.pickup_proof_method = method_type
							customerjobdeliveryextradetails_obj.save()
						else:
							CustomerJobDeliveryExtraDetails.objects.create(job_id = customerjobid_val, pickup_proof_method = method_type)
					else:
						return JsonResponse({'status_code': 400, 'status_message': 'Invalid OTP'})
				else:
					CustomerJobDeliveryExtraDetails.objects.create(job_id = customerjobid_val, pickup_proof_method = method_type)


			# customerjobdeliveryextradetails_obj = CustomerJobDeliveryExtraDetails.objects.filter()
		except Exception as e:
			print(e)
		try:
			
			driverjob_obj = DriverJob.objects.filter(id  = driverjobid_val, customerjob_id = customerjobid_val).first()
			if driverjob_obj:
				driverjob_obj.jobstarted = True
				driverjob_obj.save()
				try:
					current_date = datetime.datetime.now()
					customerjobdatetime_obj = CustomerJobDateTime.objects.filter(job_id = customerjobid_val).first()
					if customerjobdatetime_obj:
						customerjobdatetime_obj.pickup_datetime = current_date
						customerjobdatetime_obj.save()
					else:
						customerjob_obj = CustomerJob.objects.filter(id = customerjobid_val).first()
						if customerjob_obj:
							CustomerJobDateTime.objects.create(job = customerjob_obj, pickup_datetime = current_date)
				except Exception as e:
					print(e)
				try:
					sendfcmnotification(driverjob_obj.driver.fcmtoken, 'driver', 'statuschange', 'KwickDelivery', 'You have picked up parcel successfully')
				except Exception as e:
					print(e)
				try:
					sendfcmnotification(driverjob_obj.customerjob.customer.fcmtoken, 'customer', 'statuschange', 'KwickDelivery', 'Your parcel is picked up successfully')
				except Exception as e:
					print(e)
				try:
					Notifications.objects.create(user = driverjob_obj.customerjob.customer.user, customerjobid = driverjob_obj.customerjob.id, forcustomer = True, notificationtype = 'Parcel Picked', notificationtext = 'Your parcel is picked up successfully', status = 'unread')
				except Exception as e:
					print(e)
				return JsonResponse({'status_code': 200, 'status_message': 'success'})
			else:
				return JsonResponse({'status_code': 400, 'status_message': 'Not a valid request'})

			# deliveryboyuser_obj = MainUser.objects.filter(token = session_token_val).first()
			# if not deliveryboyuser_obj:
			# 	return Response({'code': 0, 'error': 'User not logged in.','status_code': 0, 'status_message': 'User not logged in.'})
			# customer_job_obj=CustomerJob.objects.filter(awdnumber = awbnumber_val).first()

			
			# matchedparceldeliveryboy_obj = MatchedParcelsDeliveryBoyModal.objects.filter(matchedparcel = customer_job_obj, matcheddeliveryboy = deliveryboyuser_obj, jobcompleted = False, attime = 1).first()
			# if matchedparceldeliveryboy_obj:
			# 	current_date = datetime.datetime.now()
			# 	customerjobdatetime_obj = CustomerJobDateTime.objects.filter(job=customer_job_obj).update(firstmilepickup_datetime=current_date)
			# 	deliveryduration = ''
			# 	Notifications.objects.create(user=customer_job_obj.user.user,forcustomer=True,related_job_id=customer_job_obj.parcel_id,relatedawbnumber = customer_job_obj.awdnumber,notificationtype='Pickedup By Delivery Boy',text='Your parcel is pickedup by delivery boy.')
			# 	Notifications.objects.create(user=deliveryboyuser_obj,fordelivery=True,deliveryduration = deliveryduration,related_job_id=customer_job_obj.parcel_id,relatedawbnumber = customer_job_obj.awdnumber,notificationtype='Parcel Pickedup',text='You have pickedup parcel from customer pickup address.')
			# 	CustomerJobStatus.objects.filter(job=customer_job_obj).update(bookingreceived=False,bookingconfirmed=False,deliveryboyassigned=False,firstmilepickup=True,atairdelyhub=False,parcelassignedtoairtraveller=False,otwtoairport=False,intransit=False,atdestinationairport=False,atdestinationhub=False,outfordelivery=False,itemsdelivered=False,customerselfdeliverytoairdelycentre=False,recipientselfcollectfromairdelycentre=False)
				
			# 	matchedparceldeliveryboy_obj.parcelverified = True
			# 	# matchedparceldeliveryboy_obj.jobcompleted = True
			# 	matchedparceldeliveryboy_obj.save()
			# 	BookedDeliveryBoys.objects.filter(matchedparcelsdeliveryboy_reference = matchedparceldeliveryboy_obj).delete()
			# 	return JsonResponse({ 'code': 200 , 'message' : 'You have pickedup the parcel.','status_code': 200 , 'status_message' : 'You have pickedup the parcel.' }, status=200, safe=False)
			# else:
			# 	return JsonResponse({ 'code': 100 , 'message' : 'This QR Code is not associated with your record.','status_code': 100 , 'status_message' : 'This QR Code is not associated with your record.' }, status=200, safe=False)
		except Exception as e:
			return JsonResponse({'status_code': 500, 'status_message': 'Internal Server Error'})




class DriverRegister(APIView):
	'''This API sends the OTP on customer mobile at the time of registration'''
	def post(self, request, *args, **kwargs):
		try:
			print('DriverRegister API - in post')
			print('data is  : ',request.POST)
			userrole_val = request.POST.get('userrole')
			name_val = request.POST.get('name')
			email_val = request.POST.get('email')
			countrycode_val = request.POST.get('countrycode')
			phone_val = request.POST.get('phone')
			password_val = request.POST.get('password')
			if not userrole_val:
				return JsonResponse({'status_code': 400, 'status_message': 'User Role is required'})
			if not name_val:
				return JsonResponse({'status_code': 400, 'status_message': 'Name is required'})
			if not email_val:
				return JsonResponse({'status_code': 400, 'status_message': 'Email Address is required'})
			if not countrycode_val:
				return JsonResponse({'status_code': 400, 'status_message': 'Countrycode is required'})
			if not phone_val:
				return JsonResponse({'status_code': 400, 'status_message': 'Phone number is required'})
			if not password_val:
				return JsonResponse({'status_code': 400, 'status_message': 'Password is required'})
			
			# if userrole_val == 'driver':
			# 	vehicletype_val = request.POST.get('vehicletype')
			# 	vehiclenumber_val = request.POST.get('vehiclenumber')
			# 	preferredarea_val = request.POST.get('preferredarea')
			# 	if not vehicletype_val:
			# 		return JsonResponse({'status_code': 400, 'status_message': 'Vehicle Type is required'})
			# 	if not vehiclenumber_val:
			# 		return JsonResponse({'status_code': 400, 'status_message': 'Vehicle Number is required'})
			# 	if not preferredarea_val:
			# 		return JsonResponse({'status_code': 400, 'status_message': 'Preferred Area is required'})

			user_obj = User.objects.filter(username = email_val).first()
			if user_obj:
				try:
					driver_emailverified_obj = DriverModel.objects.filter(user = user_obj, emailverified = True)
					if driver_emailverified_obj:
						return JsonResponse({'status_code': 409, 'status_message': 'User already exists'})
					driver_emailnotverified_obj = DriverModel.objects.filter(user = user_obj, emailverified = False)
					if driver_emailnotverified_obj:
						return JsonResponse({'status_code' : 200, 'status_message' : 'A verification link has been sent to your email address.'})
					else:
						return JsonResponse({'status_code': 409, 'status_message': 'A customer with this email address already exists.'})
				except Exception as e:
					print(e)
					return JsonResponse({'status_code': 409, 'status_message': 'User already exists.'})
			else:
				user_obj = User.objects.create_user(username = email_val, email = email_val, password = password_val)
				st = ''.join([random.choice(string.ascii_letters + string.digits) for n in range(12)])
				baselink = '/user/' + userrole_val + '/verify/' + str(user_obj.email) + '/' + st
				completelink = str(settings.WEB_BASE_URL) + baselink
				message = "\nVerify your account through following link:\n" + completelink
				try:
					print(message)
					res = send_mail('Email verification:',message,'tmpython4esf@gmail.com',[str(email_val)],fail_silently=True)
					print(res)
				except Exception as e:
					print(e)
				if userrole_val == 'driver':
					driver_obj = DriverModel.objects.create(user = user_obj, name = name_val, email = email_val, countrycode = countrycode_val, phone = phone_val, emailverificationlink = baselink)
					if driver_obj:
						from datetime import datetime as dateOfSlotsForCurrent
						dat1=dateOfSlotsForCurrent.now()
						dat2=dat1.strftime("%d-%b-%Y")
						print(dat2)
						newdateSlots=DriverAllSlots.objects.create(driver=driver_obj,dateOfSlots=dat2)
						print(newdateSlots.id)
						if newdateSlots:
							print("here one 3")
							respos=makeallsloteenablebydefault(newdateSlots.id)
						# respos=createDriverSlots(driver_obj.id)
						if respos == '1':
							print("========================Driver Slots Added Successfully====================")
						else:
							print("=======================Driver Slots errors====================================")
						return JsonResponse({'status_code' : 200, 'status_message' : 'A verification link has been sent to your email address.'})
				# elif userrole_val == 'driver':
				# 	driver_obj = DriverModel.objects.create(user = user_obj, name = name_val, email = email_val, phone = phone_val, vehicletype = vehicletype_val, vehiclenumber = vehiclenumber_val, preferredarea = preferredarea_val, emailverificationlink = baselink)
				# 	if driver_obj:
				# 		return JsonResponse({'status_code' : 200, 'status_message' : 'Record added successfully.'})
				else:
					return JsonResponse({'status_code' : 400, 'status_message' : 'User Role is not defined'})
		except Exception as e:
			print(e)
			return JsonResponse({'status_code': 500, 'status_message': 'Internal Server Error'})

def makeallsloteenablebydefault(alreadycreatedSlotID):
	driverslotsobj=DriverAllSlots.objects.filter(id=alreadycreatedSlotID).first()
	if driverslotsobj:
		driverslotsobj.openinghourSlot1='00:00:00'
		driverslotsobj.closinghourSlot1='01:00:00'
		driverslotsobj.activeSlot1=True
		driverslotsobj.openinghourSlot2='01:00:00'
		driverslotsobj.closinghourSlot2='02:00:00'
		driverslotsobj.activeSlot2=True
		driverslotsobj.openinghourSlot3='02:00:00'
		driverslotsobj.closinghourSlot3='03:00:00'
		driverslotsobj.activeSlot3=True
		driverslotsobj.openinghourSlot4='03:00:00'
		driverslotsobj.closinghourSlot4='04:00:00'
		driverslotsobj.activeSlot4=True
		driverslotsobj.openinghourSlot5='04:00:00'
		driverslotsobj.closinghourSlot5='05:00:00'
		driverslotsobj.activeSlot5=True
		driverslotsobj.openinghourSlot6='05:00:00'
		driverslotsobj.closinghourSlot6='06:00:00'
		driverslotsobj.activeSlot6=True
		driverslotsobj.openinghourSlot7='06:00:00'
		driverslotsobj.closinghourSlot7='07:00:00'
		driverslotsobj.activeSlot7=True
		driverslotsobj.openinghourSlot8='07:00:00'
		driverslotsobj.closinghourSlot8='08:00:00'
		driverslotsobj.activeSlot8=True
		driverslotsobj.openinghourSlot9='08:00:00'
		driverslotsobj.closinghourSlot9='09:00:00'
		driverslotsobj.activeSlot9=True
		driverslotsobj.openinghourSlot10='09:00:00'
		driverslotsobj.closinghourSlot10='10:00:00'
		driverslotsobj.activeSlot10=True
		driverslotsobj.openinghourSlot11='10:00:00'
		driverslotsobj.closinghourSlot11='11:00:00'
		driverslotsobj.activeSlot11=True
		driverslotsobj.openinghourSlot12='11:00:00'
		driverslotsobj.closinghourSlot12='12:00:00'
		driverslotsobj.activeSlot12=True
		driverslotsobj.openinghourSlot13='12:00:00'
		driverslotsobj.closinghourSlot13='13:00:00'
		driverslotsobj.activeSlot13=True
		driverslotsobj.openinghourSlot14='13:00:00'
		driverslotsobj.closinghourSlot14='14:00:00'
		driverslotsobj.activeSlot14=True
		driverslotsobj.openinghourSlot15='14:00:00'
		driverslotsobj.closinghourSlot15='15:00:00'
		driverslotsobj.activeSlot15=True
		driverslotsobj.openinghourSlot16='15:00:00'
		driverslotsobj.closinghourSlot16='16:00:00'
		driverslotsobj.activeSlot16=True
		driverslotsobj.openinghourSlot17='16:00:00'
		driverslotsobj.closinghourSlot17='17:00:00'
		driverslotsobj.activeSlot17=True
		driverslotsobj.openinghourSlot18='17:00:00'
		driverslotsobj.closinghourSlot18='18:00:00'
		driverslotsobj.activeSlot18=True
		driverslotsobj.openinghourSlot19='18:00:00'
		driverslotsobj.closinghourSlot19='19:00:00'
		driverslotsobj.activeSlot19=True
		driverslotsobj.openinghourSlot20='19:00:00'
		driverslotsobj.closinghourSlot20='20:00:00'
		driverslotsobj.activeSlot120=True
		driverslotsobj.openinghourSlot21='20:00:00'
		driverslotsobj.closinghourSlot21='21:00:00'
		driverslotsobj.activeSlot21=True
		driverslotsobj.openinghourSlot22='21:00:00'
		driverslotsobj.closinghourSlot22='22:00:00'
		driverslotsobj.activeSlot22=True
		driverslotsobj.openinghourSlot23='22:00:00'
		driverslotsobj.closinghourSlot23='23:00:00'
		driverslotsobj.activeSlot23=True
		driverslotsobj.openinghourSlot24='23:00:00'
		driverslotsobj.closinghourSlot24='00:00:00'
		driverslotsobj.activeSlot24=True
		driverslotsobj.save()
		return '1'
	return '0'

class DriverLogin(APIView):
	'''This class is used for login process for driver users'''
	def post(self, request, *args, **kwargs):
		try:
			print('DriverLogin API - in post')
			userrole_val = request.POST.get('userrole')
			email_val = request.POST.get('email')
			password_val = request.POST.get('password')
			fcmtoken_val = request.POST.get('fcm')
			
			if not userrole_val:
				return JsonResponse({'status_code': 400, 'status_message': 'User Role is required'})
			if not fcmtoken_val:
				return JsonResponse({'status_code': 400, 'status_message': 'Fcm token is required'})
			if not email_val:
				return JsonResponse({'status_code' : 400, 'status_message' : 'Email address is required'})
			if not password_val:
				return JsonResponse({'status_code' : 400, 'status_message' : 'Password is required'})
			user = authenticate(username = email_val, password = password_val)  
			if user is not None:
				print('0')
				token, status = Token.objects.get_or_create(user = user)
				if userrole_val == 'driver':
					print('1')
					driver_obj = DriverModel.objects.filter(user = user).first()
					if driver_obj:
						print('2')
						if driver_obj.emailverified == False:
							return JsonResponse({'status_code' : 111, 'status_message' : 'Please verify your email first.'})
						elif driver_obj.isdisabled:
							return JsonResponse({'status_code' : 100, 'status_message' : 'User is disabled by Admin.'})
						else:
							driver_obj.fcmtoken = fcmtoken_val
							driver_obj.save()
							result, unread_notifications_count = getunreadnotificationcount(user.id)
							if result == 'success':
								print(unread_notifications_count)
							elif result == 'error':
								print(unread_notifications_count)
							if driver_obj.name and driver_obj.email and driver_obj.phone and driver_obj.vehicletype and driver_obj.vehiclenumber:
								profileupdated = True
							else:
								profileupdated = False
							return JsonResponse({'status_code': 200, 'user' : 'driver', 'driverid' : driver_obj.id, 'name' : driver_obj.name,'countrycode' : driver_obj.countrycode, 'phone' : driver_obj.phone, 'image' : driver_obj.image.name, 'token' : token.key, 'unread_notifications_count' : unread_notifications_count, 'profileupdated' : profileupdated, 'status_message' : 'driver login successfull'})
				return JsonResponse({'status_code': 401, 'status_message' : 'Invalid Credentials.'})
			else:
				print('3')
				return JsonResponse({'status_code': 401, 'status_message' : 'Invalid Credentials.'})
		except Exception as error:
			print('error is',error)
			return JsonResponse({'status_code': 500, 'status_message' : 'Exception occurred : ' + str(error)})

class GetProfileDocumentsExtraTest(APIView):
	# permission_classes = (AllowAny,)
	def get(self, request):
		''' This API method is used to get profile data of user'''
		print('data is  : ',request.GET)
		try:
			session_token_val = request.GET.get('session_token')
			if not session_token_val:
				return JsonResponse({'status_code': 400, 'status_message': 'User not logged in',})
			token_obj = Token.objects.filter(key = session_token_val).first()
			if token_obj:
				user_obj = User.objects.filter(id = token_obj.user_id).first()
				if user_obj:
					driver_obj = DriverModel.objects.filter(user = user_obj).first()
					if driver_obj:
						if not driver_obj.image.name:
							image = ''
						else:
							if 'http' in driver_obj.image.name:
								image = driver_obj.image.name	
							else:
								image = str(settings.WEB_BASE_URL) + driver_obj.image.name
						if not driver_obj.address:
							address = ''
						else:
							address = driver_obj.address
						if not driver_obj.countrycode:
							countrycode = ''
						else:
							countrycode = driver_obj.countrycode
						profile_data = {}
						try:
							rating_driver = UserRating.objects.filter(ratingfor = 'driver', driverid = driver_obj.id).aggregate(Avg('rating'))
							print(rating_driver)
							print(rating_driver['rating__avg'])
							if not rating_driver['rating__avg']:
								ratings = 0.0
							else:	
								ratings = rating_driver['rating__avg']
						except Exception as e:
							print(e)
							ratings = 0.0
						if driver_obj.vehicletype and driver_obj.vehiclenumber:
							vehicledetailsexist = True
							vehicletype = driver_obj.vehicletype.name
						else:
							vehicledetailsexist = False
							vehicletype = ''
						license_front_image=''
						license_back_image=''
						id_front_image=''
						id_back_image=''
						crb_dbs_image=''

						license_front, license_back, id_front, id_back, crb_dbs = False, False, False, False, False
						if driver_obj.license_front != '':
							license_front = True
							license_front_image=str(settings.MEDIA_BASE_URL) + driver_obj.license_front.name
						if driver_obj.license_back != '':
							license_back = True
							license_back_image= str(settings.MEDIA_BASE_URL) +driver_obj.license_back.name
						if driver_obj.id_front != '':
							id_front = True
							id_front_image=str(settings.MEDIA_BASE_URL) + driver_obj.id_front.name
						if driver_obj.id_back != '':
							id_back = True
							id_back_image=str(settings.MEDIA_BASE_URL) + driver_obj.id_back.name
						if driver_obj.crb_dbs != '':
							crb_dbs = True
							crb_dbs_image=str(settings.MEDIA_BASE_URL) + driver_obj.crb_dbs.name

						# documentStatus
						
						# license_front_approvedByAdmin=False
						# license_back_approvedByAdmin=False
						# id_front_approvedByAdmin=False
						# id_back_approvedByAdmin=False
						# crb_dbs_approvedByAdmin=False

						# if driver_obj.license_front_documentStatus==True:
						# 	license_front_approvedByAdmin=True

						# if driver_obj.license_back_documentStatus==True:
						# 	license_back_approvedByAdmin=True

						# if driver_obj.id_front_documentStatus==True:
						# 	id_front_approvedByAdmin=True

						# if driver_obj.id_back_documentStatus==True:
						# 	id_back_approvedByAdmin=True

						# if driver_obj.crb_dbs_documentStatus==True:
						# 	crb_dbs_approvedByAdmin=True
						profile_data.update({
									# 'driverid':driver_obj.id,
									# 'name':driver_obj.name,
									# 'email':user_obj.email,
									# 'countrycode':countrycode,
									# 'phone':driver_obj.phone,
									# 'vehicletype':vehicletype,
									# 'vehiclenumber':driver_obj.vehiclenumber,
									# 'vehicledetailsexist':vehicledetailsexist,
									# 'address' : address,
									# 'city' : driver_obj.city,
									# 'postalcode' : driver_obj.postalcode,
									# 'country' : driver_obj.country,
									# 'national_insurance_number' : driver_obj.national_insurance_number,
									# 'driving_license_number' : driver_obj.driving_license_number,
									# 'image':image,
									# 'ratings' : ratings,
									# 'license_front' : license_front,
									# 'license_back' : license_back,
									# 'id_front' : id_front,
									# 'id_back' : id_back,
									# 'crb_dbs' : crb_dbs,
									'license_front':driver_obj.license_front_documentStatus,
									'license_back':driver_obj.license_back_documentStatus,
									'id_front':driver_obj.id_front_documentStatus,
									'id_back':driver_obj.id_back_documentStatus,
									'crb_dbs':driver_obj.crb_dbs_documentStatus,
									'license_front_image':license_front_image,
									'license_back_image':license_back_image,
									'id_front_image':id_front_image,
									'id_back_image':id_back_image,
									'crb_dbs_image':crb_dbs_image,
								})

						# serializer = UserSerializer(obj, many=True)
						# print(serializer.data)
						return JsonResponse({ 'status_code': 200 , 'data' : profile_data,'status_message' : 'success' })
					else:
						return JsonResponse({ 'status_code': 400 , 'data' : {},'status_message' : '' })
				else:
					return JsonResponse({ 'status_code': 400 , 'data' : {},'status_message' : '' })
			else:
				return JsonResponse({ 'status_code': 400 , 'data' : {},'status_message' : '' })
		except Exception as e:
			print(e)
			return JsonResponse({'status_code': 500, 'status_message': 'Internal Server Error',})

class GetProfileExtraTest(APIView):
	# permission_classes = (AllowAny,)
	def get(self, request):
		''' This API method is used to get profile data of user'''
		print('data is  : ',request.GET)
		try:
			session_token_val = request.GET.get('session_token')
			if not session_token_val:
				return JsonResponse({'status_code': 400, 'status_message': 'User not logged in',})
			token_obj = Token.objects.filter(key = session_token_val).first()
			if token_obj:
				user_obj = User.objects.filter(id = token_obj.user_id).first()
				if user_obj:
					driver_obj = DriverModel.objects.filter(user = user_obj).first()
					if driver_obj:
						if not driver_obj.image.name:
							image = ''
						else:
							if 'http' in driver_obj.image.name:
								image = driver_obj.image.name	
							else:
								image = str(settings.WEB_BASE_URL) + driver_obj.image.name
						if not driver_obj.address:
							address = ''
						else:
							address = driver_obj.address
						if not driver_obj.countrycode:
							countrycode = ''
						else:
							countrycode = driver_obj.countrycode
						profile_data = {}
						try:
							rating_driver = UserRating.objects.filter(ratingfor = 'driver', driverid = driver_obj.id).aggregate(Avg('rating'))
							print(rating_driver)
							print(rating_driver['rating__avg'])
							if not rating_driver['rating__avg']:
								ratings = 0.0
							else:	
								ratings = rating_driver['rating__avg']
						except Exception as e:
							print(e)
							ratings = 0.0
						# drivervehicle_obj = DriverVehicle.objects.filter(driver = driver_obj, vehiclenumber = vehiclenumber, vehicletype = vehicletype, active = active)
						drivervehicle_obj = DriverVehicle.objects.filter(driver = driver_obj, active = True).first()
						if drivervehicle_obj:
							if drivervehicle_obj.vehicletype and drivervehicle_obj.vehiclenumber:
								vehicledetailsexist = True
								vehicletype = drivervehicle_obj.vehicletype
							else:
								vehicledetailsexist = False
								vehicletype = ''
						else:
							vehicledetailsexist = False
							vehicletype = ''

						license_front, license_back, id_front, id_back, crb_dbs = False, False, False, False, False
						documents_approved_by_admin=False
						documents_Lic_Exist=False
						if driver_obj.license_front_documentStatus==2 and driver_obj.license_back_documentStatus==2:
							documents_approved_by_admin=True
						if driver_obj.license_front_documentStatus>=1 and driver_obj.license_back_documentStatus>=1:
							documents_Lic_Exist=True
						if driver_obj.license_front != '':
							license_front = True
						if driver_obj.license_back != '':
							license_back = True
						if driver_obj.id_front != '':
							id_front = True
						if driver_obj.id_back != '':
							id_back = True
						if driver_obj.crb_dbs != '':
							crb_dbs = True
						profile_data.update({
									'driverid':driver_obj.id,
									'name':driver_obj.name,
									'email':user_obj.email,
									'countrycode':countrycode,
									'phone':driver_obj.phone,
									# 'vehicletype':vehicletype,
									# 'vehiclenumber':driver_obj.vehiclenumber,
									'vehicledetailsexist':vehicledetailsexist,
									'address' : address,
									'city' : driver_obj.city,
									'postalcode' : driver_obj.postalcode,
									'country' : driver_obj.country,
									'national_insurance_number' : driver_obj.national_insurance_number,
									'driving_license_number' : driver_obj.driving_license_number,
									'image':image,
									'ratings' : ratings,
									'documents_approved':documents_approved_by_admin,
									'documents_Lic_Exist':documents_Lic_Exist,
									# 'license_front' : license_front,
									# 'license_back' : license_back,
									# 'id_front' : id_front,
									# 'id_back' : id_back,
									# 'crb_dbs' : crb_dbs,
								})

						# serializer = UserSerializer(obj, many=True)
						# print(serializer.data)
						return JsonResponse({ 'status_code': 200 , 'data' : profile_data,'status_message' : 'success' })
					else:
						return JsonResponse({ 'status_code': 400 , 'data' : {},'status_message' : '' })
				else:
					return JsonResponse({ 'status_code': 400 , 'data' : {},'status_message' : '' })
			else:
				return JsonResponse({ 'status_code': 400 , 'data' : {},'status_message' : '' })
		except Exception as e:
			print(e)
			return JsonResponse({'status_code': 500, 'status_message': 'Internal Server Error',})

class GetProfile(APIView):
	# permission_classes = (AllowAny,)
	def get(self, request):
		''' This API method is used to get profile data of user'''
		print('data is  : ',request.GET)
		try:
			session_token_val = request.GET.get('session_token')
			if not session_token_val:
				return JsonResponse({'status_code': 400, 'status_message': 'User not logged in',})
			token_obj = Token.objects.filter(key = session_token_val).first()
			if token_obj:
				user_obj = User.objects.filter(id = token_obj.user_id).first()
				if user_obj:
					driver_obj = DriverModel.objects.filter(user = user_obj).first()
					if driver_obj:
						if not driver_obj.image.name:
							image = ''
						else:
							if 'http' in driver_obj.image.name:
								image = driver_obj.image.name	
							else:
								image = str(settings.WEB_BASE_URL) + driver_obj.image.name
						if not driver_obj.address:
							address = ''
						else:
							address = driver_obj.address
						if not driver_obj.countrycode:
							countrycode = ''
						else:
							countrycode = driver_obj.countrycode
						profile_data = {}
						try:
							rating_driver = UserRating.objects.filter(ratingfor = 'driver', driverid = driver_obj.id).aggregate(Avg('rating'))
							print(rating_driver)
							print(rating_driver['rating__avg'])
							if not rating_driver['rating__avg']:
								ratings = 0.0
							else:	
								ratings = rating_driver['rating__avg']
						except Exception as e:
							print(e)
							ratings = 0.0
						if driver_obj.vehicletype and driver_obj.vehiclenumber:
							vehicledetailsexist = True
							vehicletype = driver_obj.vehicletype.name
						else:
							vehicledetailsexist = False
							vehicletype = ''
						license_front, license_back, id_front, id_back, crb_dbs = False, False, False, False, False
						if driver_obj.license_front != '':
							license_front = True
						if driver_obj.license_back != '':
							license_back = True
						if driver_obj.id_front != '':
							id_front = True
						if driver_obj.id_back != '':
							id_back = True
						if driver_obj.crb_dbs != '':
							crb_dbs = True
						profile_data.update({
									'driverid':driver_obj.id,
									'name':driver_obj.name,
									'email':user_obj.email,
									'countrycode':countrycode,
									'phone':driver_obj.phone,
									'vehicletype':vehicletype,
									'vehiclenumber':driver_obj.vehiclenumber,
									'vehicledetailsexist':vehicledetailsexist,
									'address' : address,
									'city' : driver_obj.city,
									'postalcode' : driver_obj.postalcode,
									'country' : driver_obj.country,
									'national_insurance_number' : driver_obj.national_insurance_number,
									'driving_license_number' : driver_obj.driving_license_number,
									'image':image,
									'ratings' : ratings,
									'license_front' : license_front,
									'license_back' : license_back,
									'id_front' : id_front,
									'id_back' : id_back,
									'crb_dbs' : crb_dbs,
								})

						# serializer = UserSerializer(obj, many=True)
						# print(serializer.data)
						return JsonResponse({ 'status_code': 200 , 'data' : profile_data,'status_message' : 'success' })
					else:
						return JsonResponse({ 'status_code': 400 , 'data' : {},'status_message' : '' })
				else:
					return JsonResponse({ 'status_code': 400 , 'data' : {},'status_message' : '' })
			else:
				return JsonResponse({ 'status_code': 400 , 'data' : {},'status_message' : '' })
		except Exception as e:
			print(e)
			return JsonResponse({'status_code': 500, 'status_message': 'Internal Server Error',})

# @method_decorator(checklogin, name='dispatch')
class UpdateProfile(APIView):
	# permission_classes = (AllowAny,)
	def post(self, request, *args, **kwargs):
		print('UpdateProfile - in post')
		# print('data is  : ',request.POST)
		try:
			def getI420FromBase64(codec, id_val, image_path="c:\\"):
				print(id_val)
				print('\n\n')
				# print(codec)
				print('0')
				base64_data = codec.split(";base64,")
				print('1')
				extens = base64_data[0]
				print('2')
				ext = extens.split("/")
				print('3')
				print(ext)
				extension = str(ext[1])
				print('4')
				base64_data = base64_data[1]
				print('5')
				byte_data = base64.b64decode(base64_data)
				print('6')
				image_data = BytesIO(byte_data)
				print('7')
				from PIL import Image
				import string, random, os
				print('8')
				img = Image.open(image_data)
				print('9')
				driver_obj = DriverModel.objects.get(id=id_val)
				st = ''.join([random.choice(string.ascii_letters + string.digits) for n in range(6)])
				thumbnailsize_objs = ThumbnailSize.objects.all()
				filepath = str(settings.BASE_DIR)+'/media/Users/Drivers/'+str(driver_obj.id)+'_'+str(driver_obj.user.email)
				if(os.path.exists(filepath)):
					filesToRemove = [os.path.join(filepath,f) for f in os.listdir(filepath)]
					for f in filesToRemove:
						os.remove(f) 
				else:
					os.mkdir(filepath)
				for obj in thumbnailsize_objs:
					img = Image.open(image_data)
					im = img.thumbnail([int(obj.height),int(obj.width)], Image.ANTIALIAS)
					im = img.save(filepath+'/'+str(obj.height)+'*'+str(obj.width)+'-'+st+'.'+extension)								
				img = Image.open(image_data)	
				img.save(filepath+'/original-'+st+'.'+extension)	
				filename = '/media/Users/Drivers/'+str(driver_obj.id)+'_'+str(driver_obj.user.email)+'/original-'+st+'.'+extension
				driver_obj.image = filename
				driver_obj.save()
				return('1')

			session_token_val = request.POST.get('session_token')
			name_val = request.POST.get('name')
			countrycode_val = request.POST.get('countrycode')
			phone_val = request.POST.get('phone')
			email_val = request.POST.get('email')
			address_val = request.POST.get('address')
			imagebase64_val = request.POST.get('imagebase64')
			# vehicletype_val = request.POST.get('vehicletype')
			# vehiclenumber_val = request.POST.get('vehiclenumber')
			address = request.POST.get('address')
			city = request.POST.get('city')
			postalcode = request.POST.get('postalcode')
			country = request.POST.get('country')
			national_insurance_number = request.POST.get('national_insurance_number')
			driving_license_number = request.POST.get('driving_license_number')

			if not session_token_val:
				return JsonResponse({'status': 400, 'message': 'User not logged in',})
			if not name_val:
				return JsonResponse({'status': 400, 'message': 'Name is required'})
			if not countrycode_val:
				return JsonResponse({'status_code': 400, 'status_message': 'Countrycode is required'})
			if not phone_val:
				return JsonResponse({'status': 400, 'message': 'Phone Number is required'})
			if not email_val:
				return JsonResponse({'status': 400, 'message': 'Email is required'})
			# if not address_val:
			# 	return JsonResponse({'status': 400, 'message': 'Address is required'})
			# if not vehicletype_val:
			# 	return JsonResponse({'status': 400, 'message': 'vehicletype is required'})
			# if not vehiclenumber_val:
			# 	return JsonResponse({'status': 400, 'message': 'vehiclenumber is required'})
			
			# if not imagebase64_val:
			# 	return JsonResponse({'status': 400, 'message': 'Image is required'})
			if not address:
				return JsonResponse({'status_code': 400, 'status_message': 'address is required'})
			if not city:
				return JsonResponse({'status_code': 400, 'status_message': 'city is required'})
			if not postalcode:
				return JsonResponse({'status_code': 400, 'status_message': 'postalcode is required'})
			if not country:
				return JsonResponse({'status_code': 400, 'status_message': 'country is required'})
			if not national_insurance_number:
				return JsonResponse({'status_code': 400, 'status_message': 'national_insurance_number is required'})
			if not driving_license_number:
				return JsonResponse({'status_code': 400, 'status_message': 'driving_license_number is required'})
			print("one")
			token_obj = Token.objects.filter(key = session_token_val).first()
			if token_obj:
				print("two")
				user_obj = User.objects.filter(id = token_obj.user_id).first()
				if user_obj:
					print("three")
					driver_obj = DriverModel.objects.filter(user = user_obj).first()
					if driver_obj:
						print("four")
						driver_obj.name = name_val
						driver_obj.countrycode = countrycode_val
						driver_obj.phone = phone_val
						driver_obj.address = address_val
						driver_obj.address = address
						driver_obj.city = city
						driver_obj.postalcode = postalcode
						driver_obj.country = country
						driver_obj.national_insurance_number = national_insurance_number
						driver_obj.driving_license_number = driving_license_number
						driver_obj.save()
						print("five")
						if imagebase64_val:
							codec = 'data:image/png;base64,' + imagebase64_val
							print('before function call')
							getI420FromBase64(codec, id_val = driver_obj.id)
							print('after function call')
						print("six")
						try:
							sendfcmnotification(driver_obj.fcmtoken, 'driver', 'profile', 'KwickDelivery', 'Your profile is updated successfully')
						except Exception as e:
							print(e)
						return JsonResponse({ 'status_code': 200 , 'status_message' : 'profile updated successfully' })
		except Exception as e:
			print(e)
			return JsonResponse({'status_code': 500, 'status_message': 'Internal Server Error',})





class ForgotPassword(APIView):
	# permission_classes = (IsAuthenticated,)
	def post(self, request, *args, **kwargs):
		try:	
			userrole_val = request.POST.get('userrole')
			email_val = request.POST.get('email')

			if not userrole_val:
				return JsonResponse({'status_code': 0, 'status_message': 'User Role is required'})
			if not email_val:
				return JsonResponse({'status_code': 400, 'message': 'Email Address is required',})		
			user_obj = User.objects.filter(email = email_val).first()
			if user_obj:
				driver_obj = DriverModel.objects.filter(user = user_obj).first()
				if driver_obj:	
					ran_num = ''.join([random.choice(string.ascii_letters + string.digits) for n in range(12)])
					baselink = '/user/' + userrole_val + '/forgot/' + str(user_obj.email) + '/' + ran_num
					completelink = str(settings.WEB_BASE_URL) + baselink
					message = "\nForgot your Password click following link:\n" + completelink
					driver_obj.forgot_password_link = baselink
					driver_obj.save()
					send_mail('Forgot Password:',message,'testdemotest11@gmail.com',[str(email_val)],fail_silently=True)				
				return JsonResponse({'status_code': 200, 'status_message': 'Link sent on email address'})				

			else:
				return JsonResponse({'status_code': 0, 'message': 'Email does not exist',})
		except Exception as e:
			print(e)
			return JsonResponse({'status': 0, 'message': str(e),})

class DriverAllRequests(APIView):
	# permission_classes = (AllowAny,)
	def get(self, request):
		''' This API method is used to get profile data of user'''
		print('data is  : ',request.GET)
		try:
			session_token_val = request.GET.get('session_token')
			if not session_token_val:
				return JsonResponse({'status_code': 400, 'status_message': 'User not logged in',})
			alldriverjobs_data = []
			token_obj = Token.objects.filter(key = session_token_val).first()
			if token_obj:
				user_obj = User.objects.filter(id = token_obj.user_id).first()
				if user_obj:
					print('0')
					driver_obj = DriverModel.objects.filter(user = user_obj).first()
					if driver_obj:
						print('1')

						supportdetail_obj = SupportDetail.objects.filter(isdeleted = False).first()
						if supportdetail_obj:
							support_phone = supportdetail_obj.phone
						else:
							support_phone = ''
						driverjob_obj = DriverJob.objects.filter(driver = driver_obj)
						if driverjob_obj:
							print('2')
							print(len(driverjob_obj))
							for job in driverjob_obj:
								pass
								alldriverjobs_data.append({
									'sendername' : job.customerjob.sendername,
									'senderphone' : job.customerjob.senderphone,
									'senderpickupaddress' : job.customerjob.pickupaddress,
									'recipientname' : job.customerjob.recipientname,
									'recipientcountrycode' : job.customerjob.recipientcountrycode,
									'recipientphone' : job.customerjob.recipientphone,
									'recipientdropoffaddress' : job.customerjob.dropoffaddress,
									'customerjobid' : job.customerjob.id,
									'driverjobid' : job.id,

									})
						print(alldriverjobs_data)
						return JsonResponse({ 'status_code': 200 , 'data' : alldriverjobs_data, 'support_phone' : support_phone, 'status_message' : 'success' })
					else:
						return JsonResponse({ 'status_code': 200 , 'data' : [],'status_message' : 'success' })
				else:
					return JsonResponse({ 'status_code': 400 , 'data' : [],'status_message' : '' })
			else:
				return JsonResponse({ 'status_code': 401 , 'data' : [] ,'status_message' : 'User not logged in.' })
		except Exception as e:
			print(e)
			return JsonResponse({'status_code': 500, 'status_message': 'Internal Server Error',})


class DriverOutstandingRequests(APIView):
	# permission_classes = (AllowAny,)
	def get(self, request):
		''' This API method is used to get profile data of user'''
		print('data is  : ',request.GET)
		try:
			session_token_val = request.GET.get('session_token')
			if not session_token_val:
				return JsonResponse({'status_code': 400, 'status_message': 'User not logged in',})
			outstandingdriverjobs_data = []
			token_obj = Token.objects.filter(key = session_token_val).first()
			if token_obj:
				user_obj = User.objects.filter(id = token_obj.user_id).first()
				if user_obj:
					print('0')
					driver_obj = DriverModel.objects.filter(user = user_obj).first()
					if driver_obj:
						print('1')

						supportdetail_obj = SupportDetail.objects.filter(isdeleted = False).first()
						if supportdetail_obj:
							support_phone = supportdetail_obj.phone
						else:
							support_phone = ''
						driverjob_obj = DriverJob.objects.filter(driver = driver_obj, jobcompleted = False)
						if driverjob_obj:
							print('2')
							print(len(driverjob_obj))
							for job in driverjob_obj:
								status = 'Waiting For Pickup'
								if job.jobstarted == False and job.jobcompleted == False:
									status = 'Waiting For Pickup'
								elif job.jobstarted == True and job.jobcompleted == False:
									status = 'Out For Delivery'
								elif job.jobstarted == True and job.jobcompleted == True:
									status = 'Delivered'

								outstandingdriverjobs_data.append({
									'sendername' : job.customerjob.sendername,
									'senderphone' : job.customerjob.senderphone,
									'senderpickupaddress' : job.customerjob.pickupaddress,
									'recipientname' : job.customerjob.recipientname,
									'recipientcountrycode' : job.customerjob.recipientcountrycode,
									'recipientphone' : job.customerjob.recipientphone,
									'recipientdropoffaddress' : job.customerjob.dropoffaddress,

									'senderlatitude' : job.customerjob.senderlatitude,
									'senderlongitude' : job.customerjob.senderlongitude,
									'recipientlatitude' : job.customerjob.recipientlatitude,
									'recipientlongitude' : job.customerjob.recipientlongitude,
									'pickupspecialnote' : job.customerjob.pickupspecialnote,
									'dropoffspecialnote' : job.customerjob.dropoffspecialnote,
									'noofitems_in_parcel' : job.customerjob.no_of_item_in_parcel,
									'status' : status,
									'awbnumber' : 'AWB-' + str(10000 + job.customerjob.id),
									'customerjobid' : job.customerjob.id,
									'driverjobid' : job.id,

									})
						print(outstandingdriverjobs_data)
						return JsonResponse({ 'status_code': 200 , 'data' : outstandingdriverjobs_data, 'support_phone' : support_phone, 'status_message' : 'success' })
					else:
						return JsonResponse({ 'status_code': 200 , 'data' : [],'status_message' : 'success' })
				else:
					return JsonResponse({ 'status_code': 400 , 'data' : [],'status_message' : '' })
			else:
				return JsonResponse({ 'status_code': 401 , 'data' : [] ,'status_message' : 'User not logged in.' })
		except Exception as e:
			print(e)
			return JsonResponse({'status_code': 500, 'status_message': 'Internal Server Error',})


class DriverCompletedRequests(APIView):
	# permission_classes = (AllowAny,)
	def get(self, request):
		''' This API method is used to get profile data of user'''
		print('data is  : ',request.GET)
		try:
			session_token_val = request.GET.get('session_token')
			if not session_token_val:
				return JsonResponse({'status_code': 400, 'status_message': 'User not logged in',})
			completeddriverjobs_data = []
			token_obj = Token.objects.filter(key = session_token_val).first()
			if token_obj:
				user_obj = User.objects.filter(id = token_obj.user_id).first()
				if user_obj:
					print('0')
					driver_obj = DriverModel.objects.filter(user = user_obj).first()
					if driver_obj:
						print('1')

						supportdetail_obj = SupportDetail.objects.filter(isdeleted = False).first()
						if supportdetail_obj:
							support_phone = supportdetail_obj.phone
						else:
							support_phone = ''
						driverjob_obj = DriverJob.objects.filter(driver = driver_obj, jobcompleted = True)
						if driverjob_obj:
							print('2')
							print(len(driverjob_obj))
							for job in driverjob_obj:
								completeddriverjobs_data.append({
									'sendername' : job.customerjob.sendername,
									'senderphone' : job.customerjob.senderphone,
									'senderpickupaddress' : job.customerjob.pickupaddress,
									'recipientname' : job.customerjob.recipientname,
									'recipientcountrycode' : job.customerjob.recipientcountrycode,
									'recipientphone' : job.customerjob.recipientphone,
									'recipientdropoffaddress' : job.customerjob.dropoffaddress,
									'status' : 'Delivered',
									'awbnumber' : 'AWB-' + str(10000 + job.customerjob.id),
									'customerjobid' : job.customerjob.id,
									'driverjobid' : job.id,

									})
						print(completeddriverjobs_data)
						return JsonResponse({ 'status_code': 200 , 'data' : completeddriverjobs_data, 'support_phone' : support_phone, 'status_message' : 'success' })
					else:
						return JsonResponse({ 'status_code': 200 , 'data' : [],'status_message' : 'success' })
				else:
					return JsonResponse({ 'status_code': 400 , 'data' : [],'status_message' : '' })
			else:
				return JsonResponse({ 'status_code': 401 , 'data' : [] ,'status_message' : 'User not logged in.' })
		except Exception as e:
			print(e)
			return JsonResponse({'status_code': 500, 'status_message': 'Internal Server Error',})


class DriverOutstandingRequestsExtraTestDriverJobStatusNew2(APIView):
	# permission_classes = (AllowAny,)
	def post(self, request, *args, **kwargs):
		''' This API method is used to get profile data of user'''
		# print('data is  : ',request.GET)
		try:
			session_token_val = request.POST.get('session_token')
			if not session_token_val:
				return JsonResponse({'status_code': 400, 'status_message': 'User not logged in',})
			# session_token_val = request.GET.get('session_token')
			# Driver_id = request.POST.get('driver_id')
			# if not Driver_id:
			# 	return JsonResponse({'status_code': 400, 'status_message': 'Driver Id Required',})
			# status_id = request.POST.get('status_id')
			# if not status_id:
			# 	return JsonResponse({'status_code': 400, 'status_message': 'Status Id Required',})
			# customer_job_id = request.POST.get('customer_job_id')
			# if not customer_job_id:
			# 	return JsonResponse({'status_code': 400, 'status_message': 'Customer Job Id Required',})
			data_ids = request.POST.get('data_ids')
			if not data_ids:
				return JsonResponse({'status_code': 400, 'status_message': 'Data is Required'})
			data_ids = json.loads(data_ids)
			outstandingdriverjobs_data = []
			token_obj = Token.objects.filter(key = session_token_val).first()
			if token_obj:
				user_obj = User.objects.filter(id = token_obj.user_id).first()
				if user_obj:
					all_data_response=[]
					for ids in data_ids:
						customer_job_id = (ids['customer_job_id'])
						Driver_id = (ids['driver_id'])
						status_id = (ids['status_id'])
						print('0')
						driver_obj = DriverModel.objects.filter(user = user_obj).first()
						print("our driver",driver_obj)
						customerjob_obj = CustomerJob.objects.filter(id = customer_job_id,isdeleted=False).first()
						print("our customer",customerjob_obj)
						if customerjob_obj:
							pass
						else:
							return JsonResponse({'status_code': 400, 'status_message': 'No Customer found with this id',})
						if driver_obj:
							print('1')

							supportdetail_obj = SupportDetail.objects.filter(isdeleted = False).first()
							if supportdetail_obj:
								support_phone = supportdetail_obj.phone
							else:
								support_phone = ''
							driverjob_obj = DriverJob.objects.filter(driver = driver_obj,id=Driver_id,customerjob=customerjob_obj,jobcompleted = False).first()
							print('Our driver job,',driverjob_obj)
							print(status_id)
							if driverjob_obj:
								print('2')
								# print(len(driverjob_obj))
								if status_id == 1:
									driverjob_obj.jobstarted = True
									driverjob_obj.save()
									all_data_response.append({
										'customerid':customer_job_id,
										'driverid':Driver_id,
										'status_message' : 'Start Pickup Driver Job',
										'nextStatusId':'2',
										'error':'false',
										})
									# return JsonResponse({ 'status_code': 200 ,'status_message' : 'Start Pickup Driver Job','nextStatusId':'2' })
								elif status_id == 2:
									driverjob_obj.arrived_at_pickup = True
									driverjob_obj.save()
									all_data_response.append({
										'customerid':customer_job_id,
										'driverid':Driver_id,
										'status_message' : 'Arrived at Parcel Picked Up Location',
										'nextStatusId':'3', 
										'error':'false',
										})
									# return JsonResponse({ 'status_code': 200 ,'status_message' : 'Arrived at Parcel Picked Up Location','nextStatusId':'3'})
								elif status_id == 3:
									driverjob_obj.parcel_picked_by_driver = True
									driverjob_obj.save()
									all_data_response.append({
										'customerid':customer_job_id,
										'driverid':Driver_id,
										'status_message' : 'Parcel Picked Up By Driver',
										'nextStatusId':'4', 
										'error':'false',
										})
									# return JsonResponse({ 'status_code': 200 ,'status_message' : 'Parcel Picked Up By Driver','nextStatusId':'4'})
								elif status_id == 4:
									driverjob_obj.start_DropOff = True
									driverjob_obj.save()
									all_data_response.append({
										'customerid':customer_job_id,
										'driverid':Driver_id,
										'status_message' : 'Start Drop Off Job',
										'nextStatusId':'5', 
										'error':'false',
										})
									# return JsonResponse({ 'status_code': 200 ,'status_message' : 'Start Drop Off Job','nextStatusId':'5'})
								elif status_id == 5:
									driverjob_obj.arrived_atDropOffLocation = True
									driverjob_obj.save()
									all_data_response.append({
										'customerid':customer_job_id,
										'driverid':Driver_id,
										'status_message' : 'Arrived at Drop Off Location',
										'nextStatusId':'6', 
										'error':'false',
										})
									# return JsonResponse({ 'status_code': 200 ,'status_message' : 'Arrived at Drop Off Location','nextStatusId':'6'})
								elif status_id == 6:
									driverjob_obj.jobcompleted = True
									driverjob_obj.save()
									all_data_response.append({
										'customerid':customer_job_id,
										'driverid':Driver_id,
										'status_message' : 'Job Completed',
										'nextStatusId':'99',
										'error':'false',
										})
									# return JsonResponse({ 'status_code': 200 ,'status_message' : 'Job Completed','nextStatusId':'99'})
								else:
									# driverjob_obj.jobcompleted = True
									# driverjob_obj.save()
									all_data_response.append({
										'customerid':customer_job_id,
										'driverid':Driver_id,
										'status_message' : 'Status Code Not Valid',
										'nextStatusId':'101', 
										'error':'true',
										})
									# return JsonResponse({ 'status_code': 200 ,'status_message' : 'Status Code Not Valid' })
							else:
								# driverjob_obj.save()
								all_data_response.append({
									'customerid':customer_job_id,
									'driverid':Driver_id,
									'status_message' : 'Driver Job not Found',
									'nextStatusId':'101',
									'error':'true',
									})
								# return JsonResponse({ 'status_code': 200 ,'status_message' : 'Driver Job not Found' })
						else:
							all_data_response.append({
								'customerid':customer_job_id,
								'driverid':Driver_id,
								'status_message' : 'Driver not Found',
								'nextStatusId':'101',
								'error':'true',
								})
							# return JsonResponse({ 'status_code': 200 , 'data' : [],'status_message' : 'success' })
					return JsonResponse({ 'status_code': 200 , 'data' : all_data_response,'status_message' : 'success' })
				else:
					return JsonResponse({ 'status_code': 400 , 'data' : [],'status_message' : '' })
			else:
				return JsonResponse({ 'status_code': 401 , 'data' : [] ,'status_message' : 'User not logged in.' })
		except Exception as e:
			print(e)
			return JsonResponse({'status_code': 500, 'status_message': 'Internal Server Error',})

class DriverOutstandingRequestsExtraTestDriverJobStatus(APIView):
	# permission_classes = (AllowAny,)
	def post(self, request, *args, **kwargs):
		''' This API method is used to get profile data of user'''
		# print('data is  : ',request.GET)
		try:
			session_token_val = request.POST.get('session_token')
			if not session_token_val:
				return JsonResponse({'status_code': 400, 'status_message': 'User not logged in',})
			# session_token_val = request.GET.get('session_token')
			Driver_id = request.POST.get('driver_id')
			if not Driver_id:
				return JsonResponse({'status_code': 400, 'status_message': 'Driver Id Required',})
			status_id = request.POST.get('status_id')
			if not status_id:
				return JsonResponse({'status_code': 400, 'status_message': 'Status Id Required',})
			customer_job_id = request.POST.get('customer_job_id')
			if not customer_job_id:
				return JsonResponse({'status_code': 400, 'status_message': 'Customer Job Id Required',})

			outstandingdriverjobs_data = []
			token_obj = Token.objects.filter(key = session_token_val).first()
			if token_obj:
				user_obj = User.objects.filter(id = token_obj.user_id).first()
				if user_obj:
					print('0')
					driver_obj = DriverModel.objects.filter(user = user_obj).first()
					customerjob_obj = CustomerJob.objects.filter(id = customer_job_id,isdeleted=False).first()
					if customerjob_obj:
						pass
					else:
						return JsonResponse({'status_code': 400, 'status_message': 'No Customer found with this id',})
					if driver_obj:
						print('1')

						supportdetail_obj = SupportDetail.objects.filter(isdeleted = False).first()
						if supportdetail_obj:
							support_phone = supportdetail_obj.phone
						else:
							support_phone = ''
						driverjob_obj = DriverJob.objects.filter(driver = driver_obj,id=Driver_id,customerjob=customerjob_obj,jobcompleted = False).first()
						print('Our driver job,',driverjob_obj)
						print(status_id)
						if driverjob_obj:
							print('2')
							# print(len(driverjob_obj))
							if status_id == '1':
								driverjob_obj.jobstarted = True
								driverjob_obj.save()
								return JsonResponse({ 'status_code': 200 ,'status_message' : 'Start Pickup Driver Job','nextStatusId':'2' })
							elif status_id == '2':
								driverjob_obj.arrived_at_pickup = True
								driverjob_obj.save()
								return JsonResponse({ 'status_code': 200 ,'status_message' : 'Arrived at Parcel Picked Up Location','nextStatusId':'3'})
							elif status_id == '3':
								driverjob_obj.parcel_picked_by_driver = True
								driverjob_obj.save()
								return JsonResponse({ 'status_code': 200 ,'status_message' : 'Parcel Picked Up By Driver','nextStatusId':'4'})
							elif status_id == '4':
								driverjob_obj.start_DropOff = True
								driverjob_obj.save()
								return JsonResponse({ 'status_code': 200 ,'status_message' : 'Start Drop Off Job','nextStatusId':'5'})
							elif status_id == '5':
								driverjob_obj.arrived_atDropOffLocation = True
								driverjob_obj.save()
								return JsonResponse({ 'status_code': 200 ,'status_message' : 'Arrived at Drop Off Location','nextStatusId':'6'})
							elif status_id == '6':
								driverjob_obj.jobcompleted = True
								driverjob_obj.save()
								return JsonResponse({ 'status_code': 200 ,'status_message' : 'Job Completed','nextStatusId':'99'})
							else:
								return JsonResponse({ 'status_code': 200 ,'status_message' : 'Status Code Not Valid' })
						else:
							return JsonResponse({ 'status_code': 200 ,'status_message' : 'Driver Job not Found' })
						# 	status = 'Driver have not yet Started Job'
						# 	if job.jobstarted == True and job.arrived_at_pickup == False:
						# 		status = 'Driver Started Job'
						# 	elif job.arrived_at_pickup == True and job.parcel_picked_by_driver == False:
						# 		status = 'Driver Arrived,Waiting For Pickup'
						# 	elif job.parcel_picked_by_driver == True and job.arrived_atDropOffLocation == False:
						# 		status = 'Out For Delivery,Start Drop Off Job'
						# 	elif job.arrived_atDropOffLocation == True and job.jobcompleted == False:
						# 		status = 'Arrived At Drop Off Location'
						# 	elif job.parcel_picked_by_driver == True and job.jobcompleted == True:
						# 		status = 'Delivered'
						# 	same_customer_list=[]
						# 	first_time_get_customer=[]
						# 	first_time_get_customer2=[]
						# 	unique=[]


						# 	# all_customers=[]
						# 	# for jobIDs in driverjob_obj:
						# 	# 	if jobIDs.sameIdForParcels not in unique:
						# 	# 		unique.append(jobIDs.sameIdForParcels)
						# 	# print("here is my unique ids",unique)
						# 	for unique_id in unique:
						# 		parcel_data = []
						# 		for job in driverjob_obj:
						# 			if job.sameIdForParcels == unique_id:
						# 				status = 'Driver have not yet Started Job'
						# 				if job.jobstarted == True and job.arrived_at_pickup == False:
						# 					status = 'Driver Started Job'
						# 				elif job.arrived_at_pickup == True and job.parcel_picked_by_driver == False:
						# 					status = 'Driver Arrived,Waiting For Pickup'
						# 				elif job.parcel_picked_by_driver == True and job.arrived_atDropOffLocation == False:
						# 					status = 'Out For Delivery,Start Drop Off Job'
						# 				elif job.arrived_atDropOffLocation == True and job.jobcompleted == False:
						# 					status = 'Arrived At Drop Off Location'
						# 				elif job.parcel_picked_by_driver == True and job.jobcompleted == True:
						# 					status = 'Delivered'

						# 				if job.customerjob.order.ordertype == 1:
						# 					ordertype = 'Single-Drop'
						# 				elif job.customerjob.order.ordertype == 2:
						# 					ordertype = 'Multi-Drop'
										
						# 				# if job1.customerjob.customer.user.username == job.customerjob.customer.user.username:
						# 					# first_time_get_customer.append(job.customerjob.customer.customer.user.username)
						# 				parcel_data.append({
						# 					'sendername' : job.customerjob.sendername,
						# 					'senderphone' : job.customerjob.senderphone,
						# 					'senderpickupaddress' : job.customerjob.pickupaddress,
						# 					'recipientname' : job.customerjob.recipientname,
						# 					'recipientcountrycode' : job.customerjob.recipientcountrycode,
						# 					'recipientphone' : job.customerjob.recipientphone,
						# 					'recipientdropoffaddress' : job.customerjob.dropoffaddress,
						# 					'senderlatitude' : job.customerjob.senderlatitude,
						# 					'senderlongitude' : job.customerjob.senderlongitude,
						# 					'recipientlatitude' : job.customerjob.recipientlatitude,
						# 					'recipientlongitude' : job.customerjob.recipientlongitude,

						# 					'pickupspecialnote' : job.customerjob.pickupspecialnote,
						# 					'dropoffspecialnote' : job.customerjob.dropoffspecialnote,
						# 					'status' : status,
						# 					'awbnumber' : 'AWB-' + str(10000 + job.customerjob.id),
						# 					'customerjobid' : job.customerjob.id,
						# 					'driverjobid' : job.id,
						# 					'ordertype' : ordertype,
						# 					'No Of Parcels':job.customerjob.noofparcels,
						# 					'PackageAndParcelId':str(job.sameIdForParcels)+'-'+str(job.customerjob.id),
						# 					'SamePackageID':job.sameIdForParcels,
						# 					'Idno':job.sameIdForParcels,
						# 					'isDisabled':job.customerjob.isdisabled,
						# 					'comment':job.customerjob.comment_of_Parcel,

						# 					})
						# 				if unique_id==0:
						# 					outstandingdriverjobs_data.append(parcel_data)
						# 					parcel_data=[]
						# 		outstandingdriverjobs_data.append(parcel_data)
						# 		# parcel_data.append({
						# 		# 	'sendername' : job.customerjob.sendername,
						# 		# 	'senderphone' : job.customerjob.senderphone,
						# 		# 	'senderpickupaddress' : job.customerjob.pickupaddress,
						# 		# 	'recipientname' : job.customerjob.recipientname,
						# 		# 	'recipientcountrycode' : job.customerjob.recipientcountrycode,
						# 		# 	'recipientphone' : job.customerjob.recipientphone,
						# 		# 	'recipientdropoffaddress' : job.customerjob.dropoffaddress,
						# 		# 	'status' : status,
						# 		# 	'awbnumber' : 'AWB-' + str(10000 + job.customerjob.id),
						# 		# 	'customerjobid' : job.customerjob.id,
						# 		# 	'driverjobid' : job.id,

						# 		# 	})
								
						# 		# if job.customerjob.customer.customer.user.username in first_time_get_customer2:
						# 			# pass
						# 		# else:
						# 			# first_time_get_customer2.append(job.customerjob.customer.customer.user.username)
						# 			# outstandingdriverjobs_data.append(same)
						# 			# same=[]
						# print(outstandingdriverjobs_data)
						# return JsonResponse({ 'status_code': 200 , 'data' : outstandingdriverjobs_data, 'support_phone' : support_phone, 'status_message' : 'success' })
					else:
						return JsonResponse({ 'status_code': 200 , 'data' : [],'status_message' : 'success' })
				else:
					return JsonResponse({ 'status_code': 400 , 'data' : [],'status_message' : '' })
			else:
				return JsonResponse({ 'status_code': 401 , 'data' : [] ,'status_message' : 'User not logged in.' })
		except Exception as e:
			print(e)
			return JsonResponse({'status_code': 500, 'status_message': 'Internal Server Error',})

def take_second(elem):
	return elem[0]['priorityBaseIDJobs']

class DriverOutstandingRequestsExtraTest(APIView):
	# permission_classes = (AllowAny,)
	def get(self, request):
		''' This API method is used to get profile data of user'''
		print('data is  : ',request.GET)
		try:
			session_token_val = request.GET.get('session_token')
			if not session_token_val:
				return JsonResponse({'status_code': 400, 'status_message': 'User not logged in',})
			outstandingdriverjobs_data = []
			token_obj = Token.objects.filter(key = session_token_val).first()
			if token_obj:
				user_obj = User.objects.filter(id = token_obj.user_id).first()
				if user_obj:
					print('0')
					driver_obj = DriverModel.objects.filter(user = user_obj).first()
					if driver_obj:
						print('1')

						supportdetail_obj = SupportDetail.objects.filter(isdeleted = False).first()
						if supportdetail_obj:
							support_phone = supportdetail_obj.phone
						else:
							support_phone = ''
						driverjob_obj = DriverJob.objects.filter(driver = driver_obj, jobcompleted = False,deliveryfailed=False)
						if driverjob_obj:
							print('2')
							print(len(driverjob_obj))
							same_customer_list=[]
							first_time_get_customer=[]
							first_time_get_customer2=[]
							unique=[]
							# all_customers=[]
							for jobIDs in driverjob_obj:
								if jobIDs.sameIdForParcels not in unique:
									unique.append(jobIDs.sameIdForParcels)
							print("here is my unique ids",unique)
							for unique_id in unique:
								parcel_data = []
								for job in driverjob_obj:
									if job.sameIdForParcels == unique_id:
										driverJobStatusId='0'
										status = 'Driver have not yet Started Job'
										if job.jobstarted == True and job.arrived_at_pickup == False:
											status = 'Driver Started Job'
											driverJobStatusId='1'
										elif job.arrived_at_pickup == True and job.parcel_picked_by_driver == False:
											status = 'Driver Arrived,Waiting For Pickup'
											driverJobStatusId='2'
										elif job.parcel_picked_by_driver == True and job.start_DropOff == False:
											status = 'Parcel Picked-Up'
											driverJobStatusId='3'
										elif job.start_DropOff == True and job.arrived_atDropOffLocation == False:
											status = 'Driver Start Job off for delivery'
											driverJobStatusId='4'
										elif job.arrived_atDropOffLocation == True and job.jobcompleted == False:
											status = 'Arrived At Drop Off Location'
											driverJobStatusId='5'
										elif job.parcel_picked_by_driver == True and job.jobcompleted == True:
											status = 'Delivered'
											driverJobStatusId='6'

										if job.customerjob.order.ordertype == 1:
											ordertype = 'Single-Drop'
										elif job.customerjob.order.ordertype == 2:
											ordertype = 'Multi-Drop'
										
										# if job1.customerjob.customer.user.username == job.customerjob.customer.user.username:
											# first_time_get_customer.append(job.customerjob.customer.customer.user.username)
										parcel_data.append({
											'sendername' : job.customerjob.sendername,
											'senderphone' : job.customerjob.senderphone,
											'senderpickupaddress' : job.customerjob.pickupaddress,
											'recipientname' : job.customerjob.recipientname,
											'recipientcountrycode' : job.customerjob.recipientcountrycode,
											'recipientphone' : job.customerjob.recipientphone,
											'recipientdropoffaddress' : job.customerjob.dropoffaddress,
											'senderlatitude' : job.customerjob.senderlatitude,
											'senderlongitude' : job.customerjob.senderlongitude,
											'recipientlatitude' : job.customerjob.recipientlatitude,
											'recipientlongitude' : job.customerjob.recipientlongitude,

											'pickupspecialnote' : job.customerjob.pickupspecialnote,
											'dropoffspecialnote' : job.customerjob.dropoffspecialnote,
											'status' : status,
											'awbnumber' : 'AWB-' + str(10000 + job.customerjob.id),
											'customerjobid' : job.customerjob.id,
											'driverjobid' : job.id,
											'ordertype' : ordertype,
											'No Of Parcels':job.customerjob.noofparcels,
											'PackageAndParcelId':str(job.sameIdForParcels)+'-'+str(job.customerjob.id),
											'SamePackageID':job.sameIdForParcels,
											'Idno':job.sameIdForParcels,
											'isDisabled':job.customerjob.isdisabled,
											'comment':job.customerjob.comment_of_Parcel,
											'DriverJobStatusId':driverJobStatusId,
											'parcelDeliver_Safe':job.customerjob.deliverySafePlace,
											'priorityBaseIDForParcel':job.customerjob.priorityBaseIDForParcel,
											'priorityBaseIDJobs':job.priorityBaseIDJobs,
											})
										if unique_id==0:
											outstandingdriverjobs_data.append(parcel_data)
											parcel_data=[]
								outstandingdriverjobs_data.append(parcel_data)
								# parcel_data.append({
								# 	'sendername' : job.customerjob.sendername,
								# 	'senderphone' : job.customerjob.senderphone,
								# 	'senderpickupaddress' : job.customerjob.pickupaddress,
								# 	'recipientname' : job.customerjob.recipientname,
								# 	'recipientcountrycode' : job.customerjob.recipientcountrycode,
								# 	'recipientphone' : job.customerjob.recipientphone,
								# 	'recipientdropoffaddress' : job.customerjob.dropoffaddress,
								# 	'status' : status,
								# 	'awbnumber' : 'AWB-' + str(10000 + job.customerjob.id),
								# 	'customerjobid' : job.customerjob.id,
								# 	'driverjobid' : job.id,

								# 	})
								
								# if job.customerjob.customer.customer.user.username in first_time_get_customer2:
									# pass
								# else:
									# first_time_get_customer2.append(job.customerjob.customer.customer.user.username)
									# outstandingdriverjobs_data.append(same)
									# same=[]
						print(outstandingdriverjobs_data)
						# newsorted=[]
						# for i in outstandingdriverjobs_data:
							# sorted_obj = sorted(i, key=lambda j : j['priorityBaseIDForParcel'], reverse=False)
							# newsorted.append(sorted_obj)
							# print(sorted_obj)
						# outstandingdriverjobs_datanew = sorted(newsorted, key=take_second)
						# print('Sorted list:', outstandingdriverjobs_datanew)
						# outstandingdriverjobs_datanew=[]
						# for i in outstandingdriverjobs_data:
						# 	sorted_obj = sorted(i, key=lambda i : i['priorityBaseIDForParcel'], reverse=False)
						# 	outstandingdriverjobs_datanew.append(sorted_obj)
						# 	print(sorted_obj)
						return JsonResponse({ 'status_code': 200 , 'data' : outstandingdriverjobs_data, 'support_phone' : support_phone, 'status_message' : 'success' })
					else:
						return JsonResponse({ 'status_code': 200 , 'data' : [],'status_message' : 'success' })
				else:
					return JsonResponse({ 'status_code': 400 , 'data' : [],'status_message' : '' })
			else:
				return JsonResponse({ 'status_code': 401 , 'data' : [] ,'status_message' : 'User not logged in.' })
		except Exception as e:
			print(e)
			return JsonResponse({'status_code': 500, 'status_message': 'Internal Server Error',})

class DriverOutstandingRequestsExtraTest2(APIView):
	# permission_classes = (AllowAny,)
	def get(self, request):
		''' This API method is used to get profile data of user'''
		print('data is  : ',request.GET)
		try:
			session_token_val = request.GET.get('session_token')
			if not session_token_val:
				return JsonResponse({'status_code': 400, 'status_message': 'User not logged in',})
			dateStatus = request.GET.get('dateStatus')
			if not dateStatus:
				return JsonResponse({'status_code': 400, 'status_message': 'dateStatus is required',})
			outstandingdriverjobs_data = []
			token_obj = Token.objects.filter(key = session_token_val).first()
			if token_obj:
				user_obj = User.objects.filter(id = token_obj.user_id).first()
				if user_obj:
					print('0')
					driver_obj = DriverModel.objects.filter(user = user_obj).first()
					if driver_obj:
						print('1')

						supportdetail_obj = SupportDetail.objects.filter(isdeleted = False).first()
						if supportdetail_obj:
							support_phone = supportdetail_obj.phone
						else:
							support_phone = ''
						driverjob_obj = DriverJob.objects.filter(driver = driver_obj, jobcompleted = False,deliveryfailed=False)
						if driverjob_obj:
							print('2')
							print(len(driverjob_obj))
							same_customer_list=[]
							first_time_get_customer=[]
							first_time_get_customer2=[]
							unique=[]
							# all_customers=[]
							for jobIDs in driverjob_obj:
								if jobIDs.sameIdForParcels not in unique:
									unique.append(jobIDs.sameIdForParcels)
							print("here is my unique ids",unique)
							for unique_id in unique:
								parcel_data = []
								for job in driverjob_obj:
									if job.sameIdForParcels == unique_id:
										today = datetime.datetime.today()
										print("Today Date",today)
										print("Job Pickup Date",job.customerjob.pickuptimeslotDate)
										date_time_str = str(job.customerjob.pickuptimeslotDate)
										# date_time_str = (job.customerjob.pickuptimeslotDate)
										first=date_time_str.split('-')[0]
										second=date_time_str.split('-')[1]
										third=date_time_str.split('-')[2]
										first=first.replace(' ','')
										second=second.replace(' ','')
										third=third.replace(' ','')
										print(first)
										print(second)
										print(third)
										newDate=first+' '+second+' '+third
										date_time_obj = datetime.datetime.strptime(newDate, '%d %b %Y')
										print('Date:', date_time_obj.date())
										print('Date-time:', date_time_obj)

										# today = datetime.datetime.today()
										# print("Today's date:", today.date())
										delta = datetime.timedelta(days = 1)
										nextDate = today + delta
										print(nextDate.date())
										DateStatus1='None'
										if today.date()==date_time_obj.date():
											DateStatus1='Today'
											print("Match")
										elif nextDate.date()==date_time_obj.date():
											DateStatus1='Tommorow'
										elif date_time_obj.date()>nextDate.date():
											DateStatus1='Others'
										else:
											DateStatus1='Past'
										driverJobStatusId='0'
										print('Here i am')
										status = 'Driver have not yet Started Job'
										if job.jobstarted == True and job.arrived_at_pickup == False:
											status = 'Driver Started Job'
											driverJobStatusId='1'
										elif job.arrived_at_pickup == True and job.parcel_picked_by_driver == False:
											status = 'Driver Arrived,Waiting For Pickup'
											driverJobStatusId='2'
										elif job.parcel_picked_by_driver == True and job.start_DropOff == False:
											status = 'Parcel Picked-Up'
											driverJobStatusId='3'
										elif job.start_DropOff == True and job.arrived_atDropOffLocation == False:
											status = 'Driver Start Job off for delivery'
											driverJobStatusId='4'
										elif job.arrived_atDropOffLocation == True and job.jobcompleted == False:
											status = 'Arrived At Drop Off Location'
											driverJobStatusId='5'
										elif job.parcel_picked_by_driver == True and job.jobcompleted == True:
											status = 'Delivered'
											driverJobStatusId='6'

										if job.customerjob.order.ordertype == 1:
											ordertype = 'Single-Drop'
										elif job.customerjob.order.ordertype == 2:
											ordertype = 'Multi-Drop'
										
										# if job1.customerjob.customer.user.username == job.customerjob.customer.user.username:
											# first_time_get_customer.append(job.customerjob.customer.customer.user.username)
										parcel_data.append({
											'sendername' : job.customerjob.sendername,
											'senderphone' : job.customerjob.senderphone,
											'senderpickupaddress' : job.customerjob.pickupaddress,
											'recipientname' : job.customerjob.recipientname,
											'recipientcountrycode' : job.customerjob.recipientcountrycode,
											'recipientphone' : job.customerjob.recipientphone,
											'recipientdropoffaddress' : job.customerjob.dropoffaddress,
											'senderlatitude' : job.customerjob.senderlatitude,
											'senderlongitude' : job.customerjob.senderlongitude,
											'recipientlatitude' : job.customerjob.recipientlatitude,
											'recipientlongitude' : job.customerjob.recipientlongitude,

											'pickupspecialnote' : job.customerjob.pickupspecialnote,
											'dropoffspecialnote' : job.customerjob.dropoffspecialnote,
											'status' : status,
											'awbnumber' : 'AWB-' + str(10000 + job.customerjob.id),
											'customerjobid' : job.customerjob.id,
											'driverjobid' : job.id,
											'ordertype' : ordertype,
											'No Of Parcels':job.customerjob.noofparcels,
											'PackageAndParcelId':str(job.sameIdForParcels)+'-'+str(job.customerjob.id),
											'SamePackageID':job.sameIdForParcels,
											'Idno':job.sameIdForParcels,
											'isDisabled':job.customerjob.isdisabled,
											'comment':job.customerjob.comment_of_Parcel,
											'DriverJobStatusId':driverJobStatusId,
											'parcelDeliver_Safe':job.customerjob.deliverySafePlace,
											'priorityBaseIDForParcel':job.customerjob.priorityBaseIDForParcel,
											'priorityBaseIDJobs':job.priorityBaseIDJobs,
											'dateStatus':DateStatus1,

											})
										if unique_id==0:
											if DateStatus1 == dateStatus:
												# newDataAfterFilter.append(view)
												outstandingdriverjobs_data.append(parcel_data)
												parcel_data=[]
								if DateStatus1 == dateStatus:
									outstandingdriverjobs_data.append(parcel_data)
								# parcel_data.append({
								# 	'sendername' : job.customerjob.sendername,
								# 	'senderphone' : job.customerjob.senderphone,
								# 	'senderpickupaddress' : job.customerjob.pickupaddress,
								# 	'recipientname' : job.customerjob.recipientname,
								# 	'recipientcountrycode' : job.customerjob.recipientcountrycode,
								# 	'recipientphone' : job.customerjob.recipientphone,
								# 	'recipientdropoffaddress' : job.customerjob.dropoffaddress,
								# 	'status' : status,
								# 	'awbnumber' : 'AWB-' + str(10000 + job.customerjob.id),
								# 	'customerjobid' : job.customerjob.id,
								# 	'driverjobid' : job.id,

								# 	})
								
								# if job.customerjob.customer.customer.user.username in first_time_get_customer2:
									# pass
								# else:
									# first_time_get_customer2.append(job.customerjob.customer.customer.user.username)
									# outstandingdriverjobs_data.append(same)
									# same=[]
						# print("here we start date checking.......")
						# newDataAfterFilter=[]
						# for view in outstandingdriverjobs_data:
						# 	print(view)
						# 	for v in view:

						# 	print(dateStatus)
						# 	print("in loop")
						# 	print((view['dateStatus']))
						# 	print((dateStatus))
						# 	print(type(view['dateStatus']))
						# 	print(type(dateStatus))
						# 	if view['dateStatus'] == dateStatus:
						# 		newDataAfterFilter.append(view)
						# 	print("outer loop")
						# print('first-5')
						# # print(alldriverjobs_data)
						# print(newDataAfterFilter)
						newsorted=[]
						print("here we start sorting.......")
						for i in outstandingdriverjobs_data:
							sorted_obj = sorted(i, key=lambda j : j['priorityBaseIDForParcel'], reverse=False)
							newsorted.append(sorted_obj)
							print(sorted_obj)
						outstandingdriverjobs_datanew = sorted(newsorted, key=take_second)
						print('Sorted list:', outstandingdriverjobs_datanew)
						# outstandingdriverjobs_datanew=[]
						# for i in outstandingdriverjobs_data:
						# 	sorted_obj = sorted(i, key=lambda i : i['priorityBaseIDForParcel'], reverse=False)
						# 	outstandingdriverjobs_datanew.append(sorted_obj)
						# 	print(sorted_obj)
						return JsonResponse({ 'status_code': 200 , 'data' : outstandingdriverjobs_datanew, 'support_phone' : support_phone, 'status_message' : 'success' })
					else:
						return JsonResponse({ 'status_code': 200 , 'data' : [],'status_message' : 'success' })
				else:
					return JsonResponse({ 'status_code': 400 , 'data' : [],'status_message' : '' })
			else:
				return JsonResponse({ 'status_code': 401 , 'data' : [] ,'status_message' : 'User not logged in.' })
		except Exception as e:
			print(e)
			return JsonResponse({'status_code': 500, 'status_message': 'Internal Server Error',})


class DriverOutstandingRequestsTest(APIView):
	# permission_classes = (AllowAny,)
	def get(self, request):
		''' This API method is used to get profile data of user'''
		print('data is  : ',request.GET)
		try:
			session_token_val = request.GET.get('session_token')
			if not session_token_val:
				return JsonResponse({'status_code': 400, 'status_message': 'User not logged in',})
			outstandingdriverjobs_data = []
			token_obj = Token.objects.filter(key = session_token_val).first()
			if token_obj:
				user_obj = User.objects.filter(id = token_obj.user_id).first()
				if user_obj:
					print('0')
					driver_obj = DriverModel.objects.filter(user = user_obj).first()
					if driver_obj:
						print('1')

						supportdetail_obj = SupportDetail.objects.filter(isdeleted = False).first()
						if supportdetail_obj:
							support_phone = supportdetail_obj.phone
						else:
							support_phone = ''
						driverjob_obj = DriverJob.objects.filter(driver = driver_obj, jobcompleted = False)
						if driverjob_obj:
							print('2')
							print(len(driverjob_obj))
							for job in driverjob_obj:
								parcel_data = []
								status = 'Waiting For Pickup'
								if job.jobstarted == False and job.jobcompleted == False:
									status = 'Waiting For Pickup'
								elif job.jobstarted == True and job.jobcompleted == False:
									status = 'Out For Delivery'
								elif job.jobstarted == True and job.jobcompleted == True:
									status = 'Delivered'

								if job.customerjob.order.ordertype == 1:
									ordertype = 'Single-Drop'
								elif job.customerjob.order.ordertype == 2:
									ordertype = 'Multi-Drop'

								parcel_data.append({
									'sendername' : job.customerjob.sendername,
									'senderphone' : job.customerjob.senderphone,
									'senderpickupaddress' : job.customerjob.pickupaddress,
									'recipientname' : job.customerjob.recipientname,
									'recipientcountrycode' : job.customerjob.recipientcountrycode,
									'recipientphone' : job.customerjob.recipientphone,
									'recipientdropoffaddress' : job.customerjob.dropoffaddress,
									'senderlatitude' : job.customerjob.senderlatitude,
									'senderlongitude' : job.customerjob.senderlongitude,
									'recipientlatitude' : job.customerjob.recipientlatitude,
									'recipientlongitude' : job.customerjob.recipientlongitude,

									'pickupspecialnote' : job.customerjob.pickupspecialnote,
									'dropoffspecialnote' : job.customerjob.dropoffspecialnote,
									'status' : status,
									'awbnumber' : 'AWB-' + str(10000 + job.customerjob.id),
									'customerjobid' : job.customerjob.id,
									'driverjobid' : job.id,
									'ordertype' : ordertype,

									})
								# parcel_data.append({
								# 	'sendername' : job.customerjob.sendername,
								# 	'senderphone' : job.customerjob.senderphone,
								# 	'senderpickupaddress' : job.customerjob.pickupaddress,
								# 	'recipientname' : job.customerjob.recipientname,
								# 	'recipientcountrycode' : job.customerjob.recipientcountrycode,
								# 	'recipientphone' : job.customerjob.recipientphone,
								# 	'recipientdropoffaddress' : job.customerjob.dropoffaddress,
								# 	'status' : status,
								# 	'awbnumber' : 'AWB-' + str(10000 + job.customerjob.id),
								# 	'customerjobid' : job.customerjob.id,
								# 	'driverjobid' : job.id,

								# 	})
								outstandingdriverjobs_data.append(parcel_data)
						print(outstandingdriverjobs_data)
						return JsonResponse({ 'status_code': 200 , 'data' : outstandingdriverjobs_data, 'support_phone' : support_phone, 'status_message' : 'success' })
					else:
						return JsonResponse({ 'status_code': 200 , 'data' : [],'status_message' : 'success' })
				else:
					return JsonResponse({ 'status_code': 400 , 'data' : [],'status_message' : '' })
			else:
				return JsonResponse({ 'status_code': 401 , 'data' : [] ,'status_message' : 'User not logged in.' })
		except Exception as e:
			print(e)
			return JsonResponse({'status_code': 500, 'status_message': 'Internal Server Error',})


class DriverCompletedRequestsTest(APIView):
	# permission_classes = (AllowAny,)
	def get(self, request):
		''' This API method is used to get profile data of user'''
		print('data is  : ',request.GET)
		try:
			session_token_val = request.GET.get('session_token')
			if not session_token_val:
				return JsonResponse({'status_code': 400, 'status_message': 'User not logged in',})
			completeddriverjobs_data = []
			token_obj = Token.objects.filter(key = session_token_val).first()
			if token_obj:
				user_obj = User.objects.filter(id = token_obj.user_id).first()
				if user_obj:
					print('0')
					driver_obj = DriverModel.objects.filter(user = user_obj).first()
					if driver_obj:
						print('1')

						supportdetail_obj = SupportDetail.objects.filter(isdeleted = False).first()
						if supportdetail_obj:
							support_phone = supportdetail_obj.phone
						else:
							support_phone = ''
						driverjob_obj = DriverJob.objects.filter(driver = driver_obj, jobcompleted = True)
						if driverjob_obj:
							print('2')
							print(len(driverjob_obj))
							for job in driverjob_obj:
								parcel_data = []
								parcel_data.append({
									'sendername' : job.customerjob.sendername,
									'senderphone' : job.customerjob.senderphone,
									'senderpickupaddress' : job.customerjob.pickupaddress,
									'recipientname' : job.customerjob.recipientname,
									'recipientcountrycode' : job.customerjob.recipientcountrycode,
									'recipientphone' : job.customerjob.recipientphone,
									'recipientdropoffaddress' : job.customerjob.dropoffaddress,
									'status' : 'Delivered',
									'awbnumber' : 'AWB-' + str(10000 + job.customerjob.id),
									'customerjobid' : job.customerjob.id,
									'driverjobid' : job.id,

									})
								parcel_data.append({
									'sendername' : job.customerjob.sendername,
									'senderphone' : job.customerjob.senderphone,
									'senderpickupaddress' : job.customerjob.pickupaddress,
									'recipientname' : job.customerjob.recipientname,
									'recipientcountrycode' : job.customerjob.recipientcountrycode,
									'recipientphone' : job.customerjob.recipientphone,
									'recipientdropoffaddress' : job.customerjob.dropoffaddress,
									'status' : 'Delivered',
									'awbnumber' : 'AWB-' + str(10000 + job.customerjob.id),
									'customerjobid' : job.customerjob.id,
									'driverjobid' : job.id,

									})
								completeddriverjobs_data.append(parcel_data)
						print(completeddriverjobs_data)
						return JsonResponse({ 'status_code': 200 , 'data' : completeddriverjobs_data, 'support_phone' : support_phone, 'status_message' : 'success' })
					else:
						return JsonResponse({ 'status_code': 200 , 'data' : [],'status_message' : 'success' })
				else:
					return JsonResponse({ 'status_code': 400 , 'data' : [],'status_message' : '' })
			else:
				return JsonResponse({ 'status_code': 401 , 'data' : [] ,'status_message' : 'User not logged in.' })
		except Exception as e:
			print(e)
			return JsonResponse({'status_code': 500, 'status_message': 'Internal Server Error',})
