3
6am                @   s  d dl mZ d dlmZ d dlmZ d dlmZ d dlm	Z	 d dl
mZ d dlmZ d dlT d dlT d dlT d d	lZd d	lZd d	lZd d	lZd d	lZd d
lmZ d dlmZ d dlmZ d dlmZ d d	lZd dlmZ d dlmZ d d	l Z d d	l!Z!d dl"m#Z#m$Z$m%Z%m&Z& d dl'm(Z( d dl)m*Z* d dl+m,Z, d d	l-Z-d d	l.Z.d dl/m0Z0 d dl/m1Z1 dd Z2dd Z3dd Z4dd Z5dd Z6G dd  d eZ7G d!d" d"eZ8G d#d$ d$eZ9G d%d& d&eZ:G d'd( d(eZ;G d)d* d*eZ<G d+d, d,eZ=G d-d. d.eZ>G d/d0 d0eZ?G d1d2 d2eZ@G d3d4 d4eZAG d5d6 d6eZBG d7d8 d8eZCG d9d: d:eZDG d;d< d<eZEd=d> ZFG d?d@ d@eZGG dAdB dBeZHG dCdD dDeZIG dEdF dFeZJG dGdH dHeZKG dIdJ dJeZLG dKdL dLeZMG dMdN dNeZNG dOdP dPeZOG dQdR dReZPG dSdT dTeZQG dUdV dVeZRG dWdX dXeZSG dYdZ dZeZTG d[d\ d\eZUG d]d^ d^eZVG d_d` d`eZWG dadb dbeZXG dcdd ddeZYG dedf dfeZZG dgdh dheZ[G didj djeZ\G dkdl dleZ]G dmdn dneZ^G dodp dpeZ_G dqdr dreZ`G dsdt dteZaG dudv dveZbG dwdx dxeZcG dydz dzeZdG d{d| d|eZeG d}d~ d~eZfG dd deZgG dd deZhd	S )    )render)APIView)JsonResponse)csrf_exempt)User)authenticate)Token)*N)	timedelta)settings)	send_mail)BytesIO)Image)getunreadnotificationcountsendfcmnotificationgenerateparcelpdfgenerateqrcode)sendnewusermail)FCMNotification)make_password)Avg)Qc             C   s   | dd  dkrH| d d dkrHd| dd  }|j dd}|d }|S | dd  dkr|| d d }|j dd}|d }|S | dd  dkr| d d dkr| d d }|j dd}|d }|S tt| d d d	 | dd
  }|d }|j dd}|S d S )N   AMZ12Z00  z:00PM      r   r   r   r   r   )replacestrint)Zstr1res r$   9/var/www/html/Stanley/GoodsDelivery/API_Customer/views.py	convert24   s&      $r&   c             C   s  y| d } t jj|dj }tjj|dj }|r| dkrL|dkrLd|_| dkrb|dkrbd|_| dkrx|dkrxd|_| dkr|dkrd|_| dkr|dkrd|_	| d	kr|d	krd|_
| d
kr|d
krd|_| dkr|dkrd|_| dkr|dkrd|_| dkr|dkrd|_| dkr0|dkr0d|_| dkrJ|dkrJd|_| dkrd|dkrdd|_| dkr~|dkr~d|_| dkr|dkrd|_| dkr|dkrd|_| dkr|dkrd|_| dkr|dkrd|_| dkr |dkr d|_| dkr|dkrd|_| dkr4|dkr4d|_| dkrN|dkrNd|_| dkrh|dkrhd|_| dkr|dkrd|_|j  dS  tk
r } zt| dS d }~X nX d S )N   )id)driverTr            r         	   
      r                                       passfail) DriverModelobjectsfilterfirstDriverAllSlotsactiveSlot1activeSlot2activeSlot3activeSlot4activeSlot5activeSlot6activeSlot7activeSlot8activeSlot9activeSlot10activeSlot11activeSlot12activeSlot13activeSlot14activeSlot15activeSlot16activeSlot17activeSlot18activeSlot19activeSlot120activeSlot21activeSlot22activeSlot23activeSlot24save	Exceptionprint)slotIdslotId2ZDriverID
driver_objdriverslotsobjer$   r$   r%   makeslotAvailable5   st    re   c             C   s|  t jj| d}d}d}d}d}d}x<|D ]2}tjj|dj }|r*d}|jj}t|j t|j	 |j	}	|	j
dd }
|	j
dd }t|
}
t|}|
d	 | }	t|
 t| t|	 t|	d d
 }||k r|}td| t|j |j}|j
dd }
|j
dd }t|
}
t|}|
d	 | }t|
 t| t| t|d d
 }||kr*|}q*W |rxt||d | d S )N)sameIdForParcelsDetailsTr=   r   F)customerjob-r'   r   r   Pickupslotid)CustomerJobrA   rB   	DriverJobrC   r)   r(   r_   pickuptimeslotDatepickuptimeslotsplitr&   r"   dropofftimeslotre   )sameparcelIDcustomerjob_obj_allpackageCompleted	startSlotlastSlotdriverIDdriverExistcustomerdJobstringFirstonetwopickupSlotIDstringSeconddeliverySlotIDr$   r$   r%   slotStatusonJobCompletes   sR    



r   c             C   sr  t jj| d}d}d}d}d}d}xD|D ]:}tjj|dj }|r*td d}|jj}t|j t|j	 |j	}	|	j
dd }
|	j
dd	 }t|
}
t|}|
d
 | }	t|
 t| t|	 t|	d d }||k r|}td| t|j |j}|j
dd }
|j
dd	 }t|
}
t|}|
d
 | }t|
 t| t| t|d d }||kr*|}q*W d}d}td t jj| dj }t| td |j}td tjj|dj }t| |r>td |j}td| tjj|d}td| xB|D ]:}td |j|kr td|j d}|j}td| q W |dkrntd |rntd t||d	 | d S )N)rf   Tr=   r   F)rg   zwe are in driver jobrh   r'   r   r   ri   zone 1zone 2zone 3zone 4zone 5)r)   zone 6zone 7zone 8zone 9zone 10)rj   rA   rB   rk   rC   r_   r)   r(   rl   rm   rn   r&   r"   ro   rD   ZdateOfSlotsmakeslotAvailablenew)rp   rq   rr   rs   rt   ru   rv   rw   rx   ry   rz   r{   r|   r}   r~   Z	slotsFindZidofslottablesZpickupdateCuystomerZparcelpickupdater)   rc   dr$   r$   r%   slotStatusonJobCompletenew   s    







r   c             C   s  yv| d } t jj|dj }|rv| dkr:|dkr:d|_| dkrP|dkrPd|_| dkrf|dkrfd|_| dkr||dkr|d|_| dkr|dkrd|_| dkr|dkrd|_	| d	kr|d	krd|_
| d
kr|d
krd|_| dkr|dkrd|_| dko|dkrd|_| dkr|dkrd|_| dkr6|dkr6d|_| dkrP|dkrPd|_| dkrj|dkrjd|_| dkr|dkrd|_| dkr|dkrd|_| dkr|dkrd|_| dkr|dkrd|_| dkr|dkrd|_| dkr|dkrd|_| dkr |dkr d|_| dkr:|dkr:d|_| dkrT|dkrTd|_| dkrn|dkrnd|_|j  dS  tk
r } zt| dS d }~X nX d S )Nr'   )r(   Tr   r*   r+   r,   r   r-   r.   r/   r0   r1   r   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   r?   )rD   rA   rB   rC   rE   rF   rG   rH   rI   rJ   rK   rL   rM   rN   rO   rP   rQ   rR   rS   rT   rU   rV   rW   rX   rY   rZ   r[   r\   r]   r^   r_   )r`   ra   Zdriveridforslotsrc   rd   r$   r$   r%   r      sr    r   c               @   s   e Zd Zdd ZdS )cancelParcelOrderc             O   sJ  t d y|jjd}|s*tdddS tjj|d}d}|rx\|D ]T}y$tjj|dj }|j	dkrnd	}W qH t
k
r }	 zt |	 W Y d
d
}	~	X qHX qHW |dkr x>|D ]6}
d|
_tjj|
dj }|rd|_|j  |
j  qW t| tdddS tdddS W n4 t
k
rD }	 zt |	 tdddS d
}	~	X nX d
S )zFThis function is being used to delete the parcel type details by Adminz Customer - in cancelParcelOrder rp   i  zsameparcelID is required.)status_codestatus_message)rf   T)rg   FN   zParcel cancelled successfully.zBad Request.i  zInternal Server Error)r_   POSTgetr   rj   rA   rB   rk   rC   
jobstartedr^   	isdeletedr]   r   )selfrequestargskwargsrp   customerjob_objZcancelParcelcrx   rd   customr$   r$   r%   post$  s:    



zcancelParcelOrder.postN)__name__
__module____qualname__r   r$   r$   r$   r%   r   #  s   r   c               @   s   e Zd Zdd ZdS )	AllAdressc       
      C   s4  t d|j y|jjd}|s,tdddS tjj|dj }|rtjj|j	dj }|rg }t
jj|dj }|rtjj|d	}x0|D ](}|j|j|j|j|j|j|jd
 qW td|ddS tdi ddS qtdi ddS ntdi ddS W n4 tk
r. }	 zt |	 tdddS d}	~	X nX dS )z4 This API method is used to get profile data of userzdata is  : session_tokeni  zUser not logged in)r   r   )key)r(   )user)rw   )recipientnamerecipientcountrycoderecipientphonerecipientlatituderecipientlongitudedropoffaddressr   success)r   datar   r   i  zInternal Server ErrorN)r_   GETr   r   r   rA   rB   rC   r   user_idCustomerrj   appendr   r   r   r   r   r   r^   )
r   r   session_token_val	token_objuser_objprofile_datacustomer_objr   r   rd   r$   r$   r%   r   I  s8    
zAllAdress.getN)r   r   r   r   r$   r$   r$   r%   r   G  s   r   c               @   s   e Zd ZdZdd ZdS )Testmanz,This class is used to get all vehicle types c             O   s   yt d |jjd}|s(tdddS g }tjj|dj }|rtjj|j	dj }|rt
jj }|rx2|D ]*}	|	j|	j|	jd}
|
|krqn|j|
 qnW td	d
|dS  tk
r } zt | tdddS d }~X nX d S )NzGetRepeatOrders API - in getr   i  zUser not logged in)r   r   )r   )r   )r   r   r   r   r   )r   r   r   i  zInternal Server Error)r_   r   r   r   r   rA   rB   rC   r   r   rj   allr   r   r   r   r^   )r   r   r   r   r   repeatorders_datar   r   r   r   Z	temp_dictrd   r$   r$   r%   r     s.    


zTestman.getN)r   r   r   __doc__r   r$   r$   r$   r%   r     s   r   c               @   s   e Zd ZdZdd ZdS )GetRepeatOrdersz,This class is used to get all vehicle types c             O   s0  yt d |jjd}|s(tdddS g }tjj|dj }|rtjj|j	dj }|rt
jj|dd	}|rxx|D ]p}	tjj|	jd
j }
|
rt|j|	j|	j|	j|	j|	j|	j|	j|
j|
j|
jd |
j |
jd |
j |
j|
jd qtW tdd|dS  tk
r* } zt | tdddS d }~X nX d S )NzGetRepeatOrders API - in getr   i  zUser not logged in)r   r   )r   )r   F)rw   is_cancelled)r(   rh   )base_customerjob_idrepeat_after_daysrepeat_date_string
start_dateend_daterm   ro   
sendernamer   senderphoner   pickupaddressr   r   r   )r   r   r   i  zInternal Server Error)r_   r   r   r   r   rA   rB   rC   r   r   RepeatOrderrj   r   r   r   r   r   r   rm   ro   r   r   sendercountrycoder   r   r   r   r   r^   )r   r   r   r   r   r   r   r   repeatorder_objorderr   rd   r$   r$   r%   r     sB    
zGetRepeatOrders.getN)r   r   r   r   r   r$   r$   r$   r%   r     s   r   c               @   s   e Zd Zdd ZdS )CancelRepeatBookingc             O   s   t d yb|jjd}|s(tdddS tjj|dj }|rZd|_|j	  tdd	dS tdd
dS W n2 t
k
r } zt | tdddS d}~X nX dS )zFThis function is being used to delete the parcel type details by Adminz"Customer - in CancelRepeatBooking r   i  z base_customerjob_id is required.)r   r   )r   Tr   zBooking cancelled successfully.zBad Request.i  zInternal Server ErrorN)r_   r   r   r   r   rA   rB   rC   r   r]   r^   )r   r   r   r   r   r   rd   r$   r$   r%   r     s    zCancelRepeatBooking.postN)r   r   r   r   r$   r$   r$   r%   r     s   r   c               @   s   e Zd ZdZdd ZdS )GetCardsz,This class is used to get all vehicle types c             O   s   yt d |jjd}|s(tdddS g }tjj|dj }|rtjj|j	dj }|rt
jj|d}|rd	}	x8|D ]0}
|	d
7 }	|j|	|
j|
jd |
j |
jd qvW tdd|dS  tk
r } zt | tdddS d }~X nX d S )NzGetCards API - in getr   i  zUser not logged in)r   r   )r   )r   )rw   r   r'   /)serialnoZlast4digitsZexpiry_datecard_idr   r   )r   r   r   i  zInternal Server Error)r_   r   r   r   r   rA   rB   rC   r   r   
StoredCardr   !stripe_card_number_lastfourdigitsstripe_card_exp_monthstripe_card_exp_yearr(   r^   )r   r   r   r   r   Zstoredcards_datar   r   storedcard_objr   cardrd   r$   r$   r%   r     s0    
zGetCards.getN)r   r   r   r   r   r$   r$   r$   r%   r     s   r   c               @   s   e Zd Zdd ZdS )CustomerDeleteCardc             O   s   t d y|jjd}|s(tdddS tjj|dj }|rtt	j
t_tjj|j|j}t | |d dkrtjj|dj  td	d
dS tdddS td	d
dS tdddS W n2 tk
r } zt | tdddS d}~X nX dS )zFThis function is being used to delete the parcel type details by Adminz"Customer - in delete_card functionr   i  zcard_id is required.)r   r   )r(   deletedTr   zRecord deleted successfully.zBad Request.i  zInternal Server ErrorN)r_   r   r   r   r   rA   rB   rC   r!   r   
STRIPE_KEYstripeapi_keyr   Zdelete_sourcestripe_customer_idstripe_card_iddeleter^   )r   r   r   r   r   r   r#   rd   r$   r$   r%   r     s*    zCustomerDeleteCard.postN)r   r   r   r   r$   r$   r$   r%   r     s   r   c               @   s   e Zd Zdd ZdS )CustomerAddCardc             O   sp  t d y,|jjd}|jjd}|jjd}|jjd}|jjd}|jjd}	|sftdd	d
S |sxtddd
S |stddd
S |stddd
S |stddd
S |	stddd
S ttjt_t	j
j|dj }
|
r4tj
j|
jdj }|r&|j}tj
j|dj }|rt d ytj	j|t|t||	dd}|d d }|d d }|d d }|d d }|d }t d| t d| tjj|j|d}tj
j||j||||d}tdd d
S  tk
r } zt | tdd!d
S d"}~X nX q4tjj|d#}|d }t d$| tj
j||d%d&}|r4ytj	j|t|t||	dd}|d d }|d d }|d d }|d d }|d }t d| t d| tjj||d}t | ||_||_||_||_|j  tdd d
S  tk
r" } zt | tdd!d
S d"}~X nX ntdd'd
S W n4 tk
rj } zt | td(d)d
S d"}~X nX d"S )*z1This function shows the content on profile screenzCustomerAddCard - in post r   	card_namecard_numbercard_expiry_monthcard_expiry_yearcard_expiry_cvci  zUser not logged in)r   r   zcard_name is requiredzcard_number is requiredzcard_expiry_month is requiredzcard_expiry_year is requiredzcard_expiry_cvc is required)r   )r   )rw   zatleast one card is stored)number	exp_monthexp_yearZcvc)r   r   Zlast4r   r   r(   z
card_id = ztoken_id = )source)rw   r   r   r   r   r   r   z Your card is added successfully.zYour card details are invalidN)emailzcustomer_id = T)rw   r   Z
is_defaultz"You are not authorized to add cardi  zInternal server error.)r_   r   r   r   r!   r   r   r   r   r   rA   rB   rC   r   r   r   r   creater"   Zcreate_sourcer   r^   r   r   r   r   r]   )r   r   r   r   r   r   r   r   r   r   r   r   	email_valr   r   Zlast_four_digitsr   r   r   Ztoken_idZres2rd   rw   customer_idr$   r$   r%   r   4  s    




zCustomerAddCard.postN)r   r   r   r   r$   r$   r$   r%   r   3  s   r   c               @   s   e Zd Zdd ZdS )RepeatBookingc          :   O   s,  t d t d t d|j y|jjd}|jjd}|jjd}|jjd}|jjd}|jjd	}	|jjd
}
|jjd}|stdddS |stdddS |stdddS |stdddS |stdddS |	stdddS |
s tdddS |stdddS yltjj|	dj }|rptjj	|j
|	|||||
|d}|r`tdddS tdddS ntdddS W n4 tk
r } zt | tdddS d }~X nX ytjj|	dj }|rt |j t |jj d}|jrtjjddj }|r|j}|j}|| }tjj	|jj
d |||d!}|rt d" tjj	||j
|j|j|j|j|j|j|j|j|j|j|j|j|j|j|j |j!|j"|j#|j$|j%|j&|j'|j(|j)|j*|j+j,|jd#}|r|
r|r|
|_(||_)|j-  t d$ y t d% t.|jd& t d' W n, tk
rB } zt | W Y d d }~X nX yt/|j}t | W n, tk
r } zt | W Y d d }~X nX nt d( nt d) tdddS tdddS W n4 tk
r } zt | tdddS d }~X nX W n4 tk
r& } zt | tdddS d }~X nX d S )*Nz



zRepeatBooking - post zdata is  : r   r   r   r   r   r   rm   ro   i  zUser not logged in)r   r   zstart_date is requiredzend_date is requiredzrepeat_date_string is requiredzrepeat_after_days is requiredzbase_customerjob_id is requiredzpickuptimeslot is requiredzdropofftimeslot is required)r(   )rw   r   r   r   r   r   rm   ro   r   r   zBad Requesti  zInternal Server Errorg        zSpecial Booking Charges)namer'   )rw   	ordertypeparceldelivery_chargesspecialbooking_chargestotalamountz#
order_obj is successfully created
)r   rw   r   senderemailr   r   r   
sendercitysenderlatitudesenderlongitudepickupspecialnotenoofparcelsr   r   r   r   r   r   dropoffspecialnotelengthwidthheightweight
parceltyperm   ro   vehicletypeimagespecialbookingz 
new_customerjob_obj is created
z#before generateqrcode function call)id_valzafter function callz$
new_customerjob_obj is not created
z
order_obj is not created
)0r_   r   r   r   rj   rA   rB   rC   r   r   rw   r^   r   r(   r   BackendControlpriceOrderr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rm   ro   r   r   r   r]   r   r   )r   r   r   r   r   r   r   r   r   r   rm   ro   r   r   rd   r   backendcontrol_objr   r   	order_objZnew_customerjob_objr#   r$   r$   r%   r     s    


zRepeatBooking.postN)r   r   r   r   r$   r$   r$   r%   r     s   r   c               @   s   e Zd Zdd ZdS )CompanyGetAllCreditRequestsc             C   sh  t d|j y |jjd}|s.tdddS tjj|dj }g }|rtjj|j	dj }|r
t
jj|dd	j }|rtjj|d
j }d}|r|j}tjj|jd}	|	rx2|	D ]*}
|jt|
j|
j|
j|
jjdd qW td|d|dS td|d|dS ntd|ddS ntd|ddS W n4 tk
rb } zt | tdddS d}~X nX dS )z4 This API method is used to get profile data of userzdata is  : r   i  zUser not logged in)r   r   )r   )r(   company)r   role)rw   g        )company_emailz%d/%m/%Y %I:%M:%S %p)creditsnote_by_companystatusdater   r   )r   r   r   current_creditsr   )r   r   r   i  zInternal Server ErrorN)r_   r   r   r   r   rA   rB   rC   r   r   r   CompanyDetailr   CreditsRequestedr   r   r!   r   r   Z
created_atstrftimer^   )r   r   r   r   Zall_credit_requests_datar   r   companydetail_objr  creditsrequested_objreqrd   r$   r$   r%   r     s>    
zCompanyGetAllCreditRequests.getN)r   r   r   r   r$   r$   r$   r%   r     s   r   c               @   s   e Zd Zdd ZdS )CompanyMakeCreditrequestc             O   s   t d y|jjd}|jjd}|jjd}|s@tdddS |sRtdddS tjj|d	j }|r|j}t	jj|d
dj }	|	rt
jj|	j||dd}
|
rtdddS ntdddS W n2 tk
r } zt | tdddS d}~X nX dS )z1This function shows the content on profile screenz#CompanyMakeCreditrequest - in post r   credits_requestcredits_request_notei  zcredits_request is required)r   r   z credits_request_note is required)r   r   )user__idr   pending)r   r   r   r   r   r   z-You are not authorized to make credit requesti  zInternal server error.N)r_   r   r   r   r   rA   rB   rC   r   r   r  r   r   r^   )r   r   r   r   r   r	  r
  r   r   r   r  rd   r$   r$   r%   r   G  s*    zCompanyMakeCreditrequest.postN)r   r   r   r   r$   r$   r$   r%   r  F  s   r  c               @   s   e Zd Zdd ZdS )CheckOperationAreac                s<  t d t d t d|j y|jjd}|jjd}|jjd}|sTtddd	S |sftdd
d	S |sxtddd	S ddlmmmm m	  fdd}t
jj }|rx>|D ]6}	||||	j|	j}
t |
 |
|	jkrtddd	S qW tddd	S  tk
r6 } zt | tddd	S d }~X nX d S )Nz



zCheckOperationArea - post zdata is  : r   latitude	longitudei  zUser not logged in)r   r   zlatitude is requiredzlongitude is requiredr   )radianscossinasinsqrtc       	         s   t t| |||g\} }}}t | |||g\} }}}|| }||  }|d d | | |d d   }d | }d}|| S )Nr   it  )mapfloat)	lat1lon1lat2lon2dlondlatar   r)r  r  r  r  r  r$   r%   	haversine|  s    0z*CheckOperationArea.post.<locals>.haversiner   r   z*Currently, we do not operate in this area.i  zInternal Server Error)r_   r   r   r   mathr  r  r  r  r  ZOperationalArearA   r   r  r  Zdistance_from_centre_pointr^   )r   r   r   r   r   Zlatitude_valZlongitude_valr  Zoperationalarea_objareadisrd   r$   )r  r  r  r  r  r%   r   l  s4    


zCheckOperationArea.postN)r   r   r   r   r$   r$   r$   r%   r  j  s   r  c               @   s   e Zd Zdd ZdS )
GiveRatingc             O   s^  t d t d t d|j y|jjd}|jjd}|jjd}|jjd}|jjd}|jjd	}	|jjd
}
|stdddS |stdddS |stdddS |stdddS |	stdddS y&tjj|||||	|
d tdddS  tk
r  } zt | W Y d d }~X nX W n4 tk
rX } zt | tdddS d }~X nX d S )Nz



zGiveRating - post zdata is  : r   	ratingforcustomerjobid
customeriddriveridratingnotei  zUser not logged in)r   r   zRating for is requiredzcustomerjobid is requiredzdriverid is requiredzrating is required)r$  r%  r&  r'  r(  r)  r   zThanks for the review.i  zInternal Server Error)r_   r   r   r   
UserRatingrA   r   r^   )r   r   r   r   r   Zratingfor_valcustomerjobid_valZcustomerid_valdriverid_valZ
rating_valZnote_valrd   r$   r$   r%   r     s:    zGiveRating.postN)r   r   r   r   r$   r$   r$   r%   r#    s   r#  c               @   s   e Zd ZdZdd ZdS )GetTimeSlotsz,This class is used to get all vehicle types c             O   s   ylt d g }tjjdd}|rVx4|D ],}|j|j|jjd|jjd|j	d q&W t | t
dd|dS  tk
r } zt | t
d	d
dS d }~X nX d S )NzGetTimeSlots API - in getT)activez%I:%M %p)r(   openinghourclosinghourr   r   r   )r   r   r   i  zInternal Server Error)r   r   )r_   Z	TimeSlotsrA   rB   r   r(   r/  r  r0  r.  r   r^   )r   r   r   r   r   Zalltimeslotsslotrd   r$   r$   r%   r     s     


zGetTimeSlots.getN)r   r   r   r   r   r$   r$   r$   r%   r-    s   r-  c               @   s   e Zd Zdd ZdS )GetDriverCoordinatesc       	      O   s   t d t d t d|j y|jjd}|s<tdddS i }tjj|dj }|rtjj|d	j }|r|j	|j
|jd
 td|ddS tdddS W n2 tk
r } zt | tdddS d }~X nX d S )Nz



zGetDriverCoordinates - get zdata is  : r'  i  zdriverid is required)r   r   )r(   )r)   )r  r  r   r   )r   r   r   zUser not logged ini  zInternal Server Error)r_   r   r   r   r@   rA   rB   rC   DriverCoordinatesupdater  r  r^   )	r   r   r   r   r,  r   rb   drivercoordinates_objrd   r$   r$   r%   r     s(    zGetDriverCoordinates.getN)r   r   r   r   r$   r$   r$   r%   r2    s   r2  c             C   s*   t jj| d}|r"| d } t| S | S d S )N)priorityBaseIDForParcelr'   )rj   rA   rB   prorityandChecking)ZprorityZcheckinr$   r$   r%   r7    s
    r7  c               @   s   e Zd ZdZdd ZdS )CompanyPlaceOrderExtraTestzQThis class is being used to save the customer job request details in the databasec       E      O   s	  t d t d t d t d dd }dndd}|jjd}|jjd	}|jjd
}|jjd}	|jjd}
|jjd}|jjd}|jjd}|jjd}|jjd}y>tjj }|rt|jdkrt|jd }nt|jd }W n, tk
r } zt | W Y d d }~X nX yt	jj
|dj }t d |rt d |j}tjj
|dj }t d |rtjj
|jdj }|r|jt| dk rtdddS |
dkrd}
n|
d krd!}
ntdd"dS tjj||
t|t|t|d#d$}W n, tk
r" } zt | W Y d d }~X nX t d% tj|}t d t | |	ryft |	 ttjt_tjjtt|d& d'd(|	d)}t | tjj|d*t||jt|jd& d+ W n. tk
r } zt d,| W Y d d }~X nX ntjj
|jdj }|rr|jt| dkrb| jt|8  _|j   tjj|d-t|d.}|rRt d/ ntdd0dS ntdddS ntdddS d}t d% t	jj
|dj }t d |	rt d |j}tjj
|dj }t d |	rt d1 x|D ]}t d2 t d3 t | t d3 t |d4  t |d5  t |d6  t |d7  t |d8  t |d9  t |d:  t |d;  t |d<  t |d=  t |d>  t |d?  t |d@  t |dA  t |dB  t |dC  t |dD  |d4 }|d5 }|d6 }|dE }|dF } |d7 }!dG}"y|d8 }"W n, tk
rH } zt | W Y d d }~X nX |d9 }#|d: }$|d; }%|d< }&|d= }'|d> }(|d? })|d@ }*|dA }+|dB },|dH }-|dI }.|dJ }/|dK }0|dL }1|dM }2|dC }3|dD }4d#}5|4dkrdN}5|dO }6|dP }7|7dQkrdN}8nd#}8t!jj
|dRj }9|9	rjt dS yt"jj
|| |0|1dTdUj }:|:r|:j#};|;|9j$krl|9j%}<nr|9j%}<t d3 t |9j& t |< |;|9j$ };|;t|;krt|;d };n|;};t |; t |9j' |<|;|9j'  }<t |< W n, tk
r } zt | W Y d d }~X nX y,d}=|8r8t(jj
dVdRj }>|>r8|>j)}=W n, tk
rf } zt | W Y d d }~X nX tjj }|j*}?|?d }?t+|?}?tjj|||||!|"||(|)|*|+|,|2||#|$|%|&|'||9|<|.|/|-|8|=||3|5|?dW}@|r||@_,| |@_-|0|@_.|1|@_/|@j   yt0j0j1 }At2jj|@|AdX W n, tk
rB } zt | W Y d d }~X nX y8t3jj|@jdNdYdZd[d\ t3jj|j4|@jdNdYd]d[d^ W n, tk
r } zt | W Y d d }~X nX |6rd_|6 }Bt d` ||B|@jda t db y t dc ||@jda t db W n, tk
	r" } zt | W Y d d }~X nX yt5|@j}Ct |C W n, tk
	rf } zt | W Y d d }~X nX ntddddS qW yt6|j7dedfdgdh W n, tk
	r } zt | W Y d d }~X nX ntddidS ntddidS tjj j}Dtdjdk|DdlS )oNz

zCompanyPlaceOrder API - in postc       
      S   s   yt |  dd l}dd l}dd l}tjj| d}djdd tdD }t	t
jd t	|j }|jj|r~t d t d	 n(t d t d
 |jd |j|dd |jdt	|  d}|j|d dd dt	|j d }||_|j  dS  tk
r }	 zt |	 W Y d d }	~	X nX d S )Nr   )r(   r   c             S   s   g | ]}t jtjtj qS r$   )randomchoicestringascii_lettersdigits).0nr$   r$   r%   
<listcomp>  s    zKCompanyPlaceOrderExtraTest.post.<locals>.generateqrcode.<locals>.<listcomp>r   z/media/CustomerJobs/z



zdirectory existszdirectory not existsi  )modezAWB-)contentz/qrcode.pngr.   )scale1)r_   pyqrcodepngosrj   rA   r   joinranger!   r   BASE_DIRr(   pathexistsumaskmakedirsr   qrcoder]   r^   )
r   rE  rF  rG  r   stfilepathurlfilenamerd   r$   r$   r%   r     s,    
z7CompanyPlaceOrderExtraTest.post.<locals>.generateqrcodec:\c                st  t | | jd}|d }|jd}t|d }|d }tj|}t|}ddlm}	 dd ldd l	dd l
|	j|}
tjj|d}djfdd	td
D }tjj }ttjd t|j  jj r fdd	j D }x&|D ]}j| qW nj dd |	j|}
|
jddg|	j}|
j d d | }dt|j d d | }||_|j  dS )Nz;base64,r   r   r'   )r   )r(   r   c                s   g | ]} j jj qS r$   )r:  r<  r=  )r>  r?  )r9  r;  r$   r%   r@  5  s    zNCompanyPlaceOrderExtraTest.post.<locals>.getI420FromBase64.<locals>.<listcomp>r   z/media/CustomerJobs/c                s   g | ]}j j |qS r$   )rK  rH  )r>  f)rQ  rG  r$   r%   r@  9  s    i  )rA  i  zparcelimage.rD  )r_   rn   r!   base64	b64decoder   PILr   r;  r9  rG  openrj   rA   r   rH  rI  ThumbnailSizer   r   rJ  r(   rK  rL  listdirremoverN  	thumbnail	ANTIALIASr]   r   )codecr   
image_pathbase64_dataextensext	extension	byte_data
image_datar   imgr   rP  thumbnailsize_objsfilesToRemoverU  imrS  r$   )rQ  rG  r9  r;  r%   getI420FromBase64(  s6    






z:CompanyPlaceOrderExtraTest.post.<locals>.getI420FromBase64r   parcels_datar   payment_tokenr   r   r   r   r   credits_to_be_usedr   i  r'   )r   rD  2)r  3)customer__emailg        i  zNot enough credits in account.)r   r   
singledrop	multidropr   zOrder type is required.F)rw   r   r   r   r   r   0d   gbpzParcel Payment)amountcurrencydescriptionr   r   )r   methodstripe_charge_responsestripe_charge_idstripe_amountzException in creating charge = r   )r   rz  rn  zcredits payment successzInternal Server Error.4zcount for manpreet
r   r   r   r   r   r   r   r   r   r   specialnoter   r   r   dropaddressparcelItemsparcelDeliver_Safer   r   r   rl   rm   ro   r   r   recipientspecialnoteTimagebase64r   yes)r   5mile)r   r   r   r   distanceunitzSpecial Booking Charges)r   r   r   r   r   r   r   r   r   r   r   r   r   deliverydurationr   r   r   r   r   rw   r   r   rm   ro   rl   r   specialbooking_chargerf   no_of_item_in_parceldeliverySafePlacer6  )jobpayment_datetimezParcel Job Createdz"You have created one parcel order.unread)r%  forcustomernotificationtypenotificationtextr   z&Customer has created one parcel order.)r   r%  foradminr  r  r   zdata:image/png;base64,zbefore function call)r   zafter function callz#before generateqrcode function callz Selected Vehicle does not exist.rw   parcelKwickDeliveryz*Your parcel details are saved successfullyzUser not logged in.r   zSuccess.)r   r   customerjob_idzsuccess.)rT  )8r_   r   r   rj   rA   lastr"   rf   r^   r   rB   rC   r   r   r  r   r   r  r   r   r   jsonloadsr!   r   r   r   r   ChargeOrderPaymentr(   rw  r]   VehicleTypeDistanceTabledistancefixeddistancebaserater   addittionalrateperunitr   r   r6  r7  r   r   r   r   datetimenowCustomerJobDateTimeNotificationsr   r   r   fcmtoken)Er   r   r   r   r   rk  r   rl  noofparcels_valrm  r   r   r   r   r   rn  last_customer_objsameIdForStoringrd   r   r   r   r  r   chargeorderpayment_objdeliveryduration_valr  sendername_valsendercountrycode_valsenderphone_valsenderlatitude_valsenderlongitude_valpickupaddress_valsendercity_val
length_val	width_val
height_val
weight_valparceltype_valspecialnote_valrecipientname_valrecipientcountrycode_valrecipientphone_valdropaddress_valpickuptimeslotDate_valpickuptimeslot_valdropofftimeslot_valrecipientlatitude_valrecipientlongitude_valrecipientspecialnote_valr  parcelDeliverysafe1parcelDeliverysafeimagebase64_valspecialbooking_valr   vehicletype_objdistancetable_objr  rater  r   prorityIdforParcelr   current_dater_  r#   lastcustomerjobidr$   r$   r%   r     s   
"


(
*







J
 
zCompanyPlaceOrderExtraTest.postN)r   r   r   r   r   r$   r$   r$   r%   r8     s   r8  c               @   s   e Zd ZdZdd ZdS )CompanyPlaceOrderzQThis class is being used to save the customer job request details in the databasec       >      O   s&	  t d t d t d t d dd }didd}|jjd}|jjd	}|jjd
}|jjd}	|jjd}
|jjd}|jjd}|jjd}|jjd}|jjd}ytjj|dj }t d |rt d |j}tjj|dj }t d |rt	jj|j
dj }|r6|jt| dk r6tdddS |
dkrFd}
n|
dkrVd}
ntdd dS tjj||
t|t|t|d!d"}W n, tk
r } zt | W Y d d }~X nX t d# tj|}t d t | |	rxyft |	 ttjt_tjjtt|d$ d%d&|	d'}t | tjj|d(t||jt|jd$ d) W n. tk
rt } zt d*| W Y d d }~X nX nt	jj|j
dj }|r|jt| dkr| jt|8  _|j  tjj|d+t|d,}|rt d- ntdd.dS ntdddS ntdddS d}t d# tjj|dj }t d |rt d |j}tjj|dj }t d |rt d/ x,|D ]"}t d0 t d1 t | t d1 t |d2  t |d3  t |d4  t |d5  t |d6  t |d7  t |d8  t |d9  t |d:  t |d;  t |d<  t |d=  t |d>  t |d?  t |d@  |d2 }|d3 }|d4 }|dA }|dB }|d5 }dC} y|d6 } W n, tk
r } zt | W Y d d }~X nX |d7 }!|d8 }"|d9 }#|d: }$|d; }%|d< }&|d= }'|d> }(|d? })|d@ }*|dD }+|dE },|dF }-|dG }.|dH }/|dI }0|dJ }1|1dKkr^dL}2nd!}2tjj|dMj }3|3rt dN ytjj|||-|.dOdPj }4|4r0|4j }5|5|3j!kr|3j"}6nr|3j"}6t d1 t |3j# t |6 |5|3j! }5|5t|5krt|5d }5n|5}5t |5 t |3j$ |6|5|3j$  }6t |6 W n, tk
r^ } zt | W Y d d }~X nX y,d}7|2rt%jjdQdMj }8|8r|8j&}7W n, tk
r } zt | W Y d d }~X nX t'jj|||||| ||&|'|(|)|*|/||!|"|#|$|%||3|6|+|,|2|7dR}9|r ||9_(||9_)|-|9_*|.|9_+|9j  yt,j,j- }:t.jj|9|:dS W n, tk
rj } zt | W Y d d }~X nX y8t/jj|9jdLdTdUdVdW t/jj|j0|9jdLdTdXdVdY W n, tk
r } zt | W Y d d }~X nX |0rdZ|0 };t d[ ||;|9jd\ t d] y t d^ ||9jd\ t d] W n, tk
rJ } zt | W Y d d }~X nX yt1|9j}<t |< W n, tk
r } zt | W Y d d }~X nX ntdd_dS q~W yt2|j3d`dadbdc W n, tk
r } zt | W Y d d }~X nX ntddddS ntddddS t'jj4 j}=tdedf|=dgS )jNz

zCompanyPlaceOrder API - in postc       
      S   s   yt |  dd l}dd l}dd l}tjj| d}djdd tdD }t	t
jd t	|j }|jj|r~t d t d	 n(t d t d
 |jd |j|dd |jdt	|  d}|j|d dd dt	|j d }||_|j  dS  tk
r }	 zt |	 W Y d d }	~	X nX d S )Nr   )r(   r   c             S   s   g | ]}t jtjtj qS r$   )r9  r:  r;  r<  r=  )r>  r?  r$   r$   r%   r@  Z  s    zBCompanyPlaceOrder.post.<locals>.generateqrcode.<locals>.<listcomp>r   z/media/CustomerJobs/z



zdirectory existszdirectory not existsi  )rA  zAWB-)rB  z/qrcode.pngr.   )rC  rD  )r_   rE  rF  rG  rj   rA   r   rH  rI  r!   r   rJ  r(   rK  rL  rM  rN  r   rO  r]   r^   )
r   rE  rF  rG  r   rP  rQ  rR  rS  rd   r$   r$   r%   r   T  s,    
z.CompanyPlaceOrder.post.<locals>.generateqrcodec:\c                st  t | | jd}|d }|jd}t|d }|d }tj|}t|}ddlm}	 dd ldd l	dd l
|	j|}
tjj|d}djfdd	td
D }tjj }ttjd t|j  jj r fdd	j D }x&|D ]}j| qW nj dd |	j|}
|
jddg|	j}|
j d d | }dt|j d d | }||_|j  dS )Nz;base64,r   r   r'   )r   )r(   r   c                s   g | ]} j jj qS r$   )r:  r<  r=  )r>  r?  )r9  r;  r$   r%   r@  ~  s    zECompanyPlaceOrder.post.<locals>.getI420FromBase64.<locals>.<listcomp>r   z/media/CustomerJobs/c                s   g | ]}j j |qS r$   )rK  rH  )r>  rU  )rQ  rG  r$   r%   r@    s    i  )rA  i  zparcelimage.rD  )r_   rn   r!   rV  rW  r   rX  r   r;  r9  rG  rY  rj   rA   r   rH  rI  rZ  r   r   rJ  r(   rK  rL  r[  r\  rN  r]  r^  r]   r   )r_  r   r`  ra  rb  rc  rd  re  rf  r   rg  r   rP  rh  ri  rU  rj  rS  r$   )rQ  rG  r9  r;  r%   rk  q  s6    






z1CompanyPlaceOrder.post.<locals>.getI420FromBase64r   rl  r   rm  r   r   r   r   r   rn  )r   rD  ro  )r  rp  )rq  g        i  zNot enough credits in account.)r   r   rr  r'   rs  r   zOrder type is required.F)rw   r   r   r   r   r   rt  ru  rv  zParcel Payment)rw  rx  ry  r   r   )r   rz  r{  r|  r}  zException in creating charge = r   )r   rz  rn  zcredits payment successzInternal Server Error.r~  zcount for manpreetr  r   r   r   r   r   r   r   r   r   r   r  r   r   r   r  r   r   r   rm   ro   r   r   r  r  r   r  T)r   r  r  )r   r   r   r   r  zSpecial Booking Charges)r   r   r   r   r   r   r   r   r   r   r   r   r   r  r   r   r   r   r   rw   r   r   rm   ro   r   r  )r  r  zParcel Job Createdz"You have created one parcel order.r  )r%  r  r  r  r   z&Customer has created one parcel order.)r   r%  r  r  r  r   zdata:image/png;base64,zbefore function call)r   zafter function callz#before generateqrcode function callz Selected Vehicle does not exist.rw   r  r  z*Your parcel details are saved successfullyzUser not logged in.r   zSuccess.)r   r   r  zsuccess.)r  )5r_   r   r   r   rA   rB   rC   r   r   r  r   r   r  r   r   r   r^   r  r  r!   r   r   r   r   r  r"   r  r(   rw  r]   r  r  r  r  r  r   r  r   r   rj   r   r   r   r   r  r  r  r  r   r   r   r  r  )>r   r   r   r   r   rk  r   rl  r  rm  r   r   r   r   r   rn  r   r   r   r  r   rd   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r  r  r  r  r  r   r   r  r_  r#   r  r$   r$   r%   r   L  s   
"

(
*





@
 
zCompanyPlaceOrder.postN)r   r   r   r   r   r$   r$   r$   r%   r  I  s   r  c               @   s   e Zd ZdZdd ZdS )PlaceOrderTesExtraTestzQThis class is being used to save the customer job request details in the databasec       K      O   s  t d t d t d t |j t d t d dd }t d ddd	}t d
 |jjd}|jjd}|jjd}|jjd}	|jjd}
|jjd}|jjd}|jjd}|jjd}|jjd}t | t | t | t |	 t | t d |stdddS |s$tdddS |s8tdddS |
sLtdddS |s`tdddS t d |s|tdddS |stdddS |stdd dS |stdd!dS t d" t d# ytjj|d$j }t d% |rlt d& |j}t	jj|d'j }t d( |rl|
d)kr(d*}
n|
d+kr8d,}
ntdd-dS t
jj||
t||t|t|d.d/}W n, tk
r } zt | W Y d d }~X nX t d0 yBtjj }|rt|jd1krt|jd2 }nt|jd* }W n, tk
r } zt | W Y d d }~X nX tj|}t d% t d3 t | d*}t d0 tjj|d$j }t d% |	rrt d& |j}t	jj|d'j }t d( |	rbt d4 x|D ]v}t d5 t | t d5 t |d6  t |d7  t |d8  t |d9  t |d:  t |d;  t |d<  t |d=  t |d>  t |d?  t |d@  t |dA  t |dB  t |dC  t |dD  t |dE  t |dF  |dE }|d6 }|d7 }|d8 }|dG }|dH }|d9 }dI} y|d: } W n, tk
r } zt | W Y d d }~X nX |d; }!|d< }"|d= }#|d> }$|d? }%|d@ }&|dA }'|dB }(|dC })|dD }*|dJ }+|dK },|dL }-|dF }.d.}/|.d%krdM}/|dN }0|dO }1|dP }2|dQ }3|dR }4|4dSkrdM}5nd.}5tjj|dTj }6|6	rt dU ytjj|||0|1dVdWj }7|7r|7j}8|8|6jkr|6j}9nr|6j}9t d5 t |6j t |9 |8|6j }8|8t|8kr`t|8d* }8n|8}8t |8 t |6j |9|8|6j  }9t |9 W n, tk
r } zt | W Y d d }~X nX y,dX}:|5rtjjdYdTj };|;r|;j}:W n, tk
r } zt | W Y d d }~X nX tjj }|j}<|<d* }<t|<}<tjj|||||| ||&|'|(|)|*|2||!|"|#|$|%||6|9|,|-|+|5|:|||/|<dZ}=|r||=_||=_ |0|=_!|1|=_"|=j#  yt$j$j% }>t&jj|=|>d[ W n, tk
r } zt | W Y d d }~X nX y8t'jj|j(|=j)dMd\d]d^d_ t'jj|=j)dMd\d`d^da W n, tk
rV } zt | W Y d d }~X nX |3rt||?|=j)db t dc y t dd ||=j)db t dc W n, tk
r } zt | W Y d d }~X nX yt*|=j)}@t |@ W n, tk
	r } zt | W Y d d }~X nX ntddedS qW yt+|j,dfdgdhdi W n, tk
	r^ } zt | W Y d d }~X nX ntddjdS ntddjdS tjj j)}Atdkdl|AdmS |	stddsdS |	stddtdS |	stddudS |	stddvdS | 
s tddwdS |
stdddS |%
s(tddxdS |'
s<tddydS |(
sPtddzdS |)
sdtdd{dS |*
sxtdd|dS |B
stdd}dS |C
stdd~dS |	ry:t |	 dt-_.t-j/jtt|Cd dd|	d}Dt |D W n. tk
r } zt d| W Y d d }~X nX d*}t d0 tjj|d$j }t d% |rt d& |j}t	jj|d'j }t d( |r(t d4 tjj|BdTj }6|6r(t dU tjj||||| ||&|'|(|)|*||"|#|$|%||6|Cd}=|r||=_||=_ |0|=_!|1|=_"|=j#  y8t'jj|=j)dMd\d]d^d t'jj|j(|=j)dMd\d`d^d W n, tk
rN } zt | W Y d d }~X nX yt+|j,dfdgdhdi W n, tk
r } zt | W Y d d }~X nX |3rd|3 }?t d ||?|=j)db t dc y||=j)db t dc W n, tk
r } zt | W Y d d }~X nX tdkdl|=j)dmS ntddjdS tdddS |sJtddjdS tjj }t0jjt1dj }E|Er@t	jj|EdMdj }|r0t2jjdt3dj }F|Fr |Fj4}G|Fj5}Ht |G t |H t6t7j8}It$j$j%t9j:|I}Jt |J |J|Gkr|J|Hk rdM|F_;|Fj#  tdkddS td1ddS ntd1ddS ntd1ddS ntddjdS W n4 tk
r } zt | tdddS d }~X nX d S )Nz

zPlaceOrderTest API - in postz1 testc       
      S   s   yt |  dd l}dd l}dd l}tjj| d}djdd tdD }t	t
jd t	|j }|jj|r~t d t d	 n(t d t d
 |jd |j|dd |jdt	|  d}|j|d dd dt	|j d }||_|j  dS  tk
r }	 zt |	 W Y d d }	~	X nX d S )Nr   )r(   r   c             S   s   g | ]}t jtjtj qS r$   )r9  r:  r;  r<  r=  )r>  r?  r$   r$   r%   r@    s    zGPlaceOrderTesExtraTest.post.<locals>.generateqrcode.<locals>.<listcomp>r   z/media/CustomerJobs/z



zdirectory existszdirectory not existsi  )rA  zAWB-)rB  z/qrcode.pngr.   )rC  rD  )r_   rE  rF  rG  rj   rA   r   rH  rI  r!   r   rJ  r(   rK  rL  rM  rN  r   rO  r]   r^   )
r   rE  rF  rG  r   rP  rQ  rR  rS  rd   r$   r$   r%   r     s,    
z3PlaceOrderTesExtraTest.post.<locals>.generateqrcodez2 testc:\c                sP  t | | jd}|d }|jd}t|d }|d }tj|}t|}ddlm}	 dd ldd l	 dd l
}
|	j|}tjj|d}dj fdd	td
D }tjj }ttjd t|j t| }|
jj|rn|
j|dd |	j|}|jddg|	j}|j|d d | }dt|j t| d d | }||_|j  dS )Nz;base64,r   r   r'   )r   )r(   r   c                s   g | ]} j jj qS r$   )r:  r<  r=  )r>  r?  )r9  r;  r$   r%   r@    s    zJPlaceOrderTesExtraTest.post.<locals>.getI420FromBase64.<locals>.<listcomp>r   z/media/CustomerJobs/i  )rA  i  zparcelimage.rD  )r_   rn   r!   rV  rW  r   rX  r   r;  r9  rG  rY  rj   rA   r   rH  rI  rZ  r   r   rJ  r(   rK  rL  rN  r]  r^  r]   r   )r_  r   r`  ra  rb  rc  rd  re  rf  r   rG  rg  r   rP  rh  rQ  rj  rS  r$   )r9  r;  r%   rk    s2    




 
"z6PlaceOrderTesExtraTest.post.<locals>.getI420FromBase64z3 testr   rl  r   rm  r   r   r   r   r   r   z4 testi  zUser not logged in)r   r   zparcels_data is requiredznoofparcels_val is requiredzordertype is requiredztotalamount is requiredz5 testz"parceldelivery_charges is requiredz"specialbooking_charges is requiredzvehicletype is requiredzcard_id is requiredz6 testz7 test)r   rD  ro  )r  rp  rr  r'   rs  r   zOrder type is required.F)rw   r   r   charge_from_cardr   r   r   rt  r   i  z8 testr~  r  r   r   r   r   r   r   r   r   r   r   r  r   r   r   r  r  r  r   r   r   rl   rm   ro   Tr   r   r  r  r   r  )r   r  r  )r   r   r   r   r  g        zSpecial Booking Charges)r   r   r   r   r   r   r   r   r   r   r   r   r   r  r   r   r   r   r   rw   r   r   rm   ro   rl   r   r  rf   r  r  r6  )r  r  zParcel Job Createdz"You have created one parcel order.r  )r   r%  r  r  r  r   z&Customer has created one parcel order.)r%  r  r  r  r   )r   zafter function callz#before generateqrcode function callz Selected Vehicle does not exist.rw   r  r  z*Your parcel details are saved successfullyzUser not logged in.r   zSuccess.)r   r   r  zHow are you?zsuccess.c       	      S   s   t |  dd l}dd l}dd l}tjj| d}djdd tdD }t	t
jd t	|j }|jj|rln
|j| |jdt	|  d	}|j|d
 dd dt	|j d
 }||_|j  dS )Nr   )r(   r   c             S   s   g | ]}t jtjtj qS r$   )r9  r:  r;  r<  r=  )r>  r?  r$   r$   r%   r@    s    zGPlaceOrderTesExtraTest.post.<locals>.generateqrcode.<locals>.<listcomp>r   z/media/CustomerJobs/zAWB-)rB  z/qrcode.pngr.   )rC  rD  )r_   rE  rF  rG  rj   rA   r   rH  rI  r!   r   rJ  r(   rK  rL  mkdirr   rO  r]   )	r   rE  rF  rG  r   rP  rQ  rR  rS  r$   r$   r%   r     s    
c                sp  t | | jd}|d }|jd}t|d }|d }tj|}t|}ddlm}	 dd ldd l	dd l
|	j|}
tjj|d}djfdd	td
D }tjj }ttjd t|j  jj r fdd	j D }x"|D ]}j| qW n
j  |	j|}
|
jddg|	j}|
j d d | }dt|j d d | }||_|j  dS )Nz;base64,r   r   r'   )r   )r(   r   c                s   g | ]} j jj qS r$   )r:  r<  r=  )r>  r?  )r9  r;  r$   r%   r@  
  s    zJPlaceOrderTesExtraTest.post.<locals>.getI420FromBase64.<locals>.<listcomp>r   z/media/CustomerJobs/c                s   g | ]}j j |qS r$   )rK  rH  )r>  rU  )rQ  rG  r$   r%   r@    s    i  zparcelimage.rD  )r_   rn   r!   rV  rW  r   rX  r   r;  r9  rG  rY  rj   rA   r   rH  rI  rZ  r   r   rJ  r(   rK  rL  r[  r\  r  r]  r^  r]   r   )r_  r   r`  ra  rb  rc  rd  re  rf  r   rg  r   rP  rh  ri  rU  rj  rS  r$   )rQ  rG  r9  r;  r%   rk    s6    







r   zsendername_val is requiredzSender countrycode is requiredz"Sender senderphone_val is requiredzpickupaddress_val is requiredzsendercity_val is requiredzparceltype_val is requiredzrecipientname_val is requiredz!recipient countrycode is requiredzrecipientphone_val is requiredzdropaddress_val is requiredzvehicletype_val is requiredzprice_val is required*sk_test_w82uzdTc8eWEVizgPOI0WRnj00n43jBnY5ru  rv  zParcel Payment)rw  rx  ry  r   zException in creating charge = )r   r   r   r   r   r   r   r   r   r   r   r  r   r   r   r   rw   r   r   )r%  r  r  r  r   )r   r%  r  r  r  r   zdata:image/png;base64,zbefore function calli  zInternal Server Errorzraheja@yopmail.com)username)r   accountapprovedsignup)caseotpzUser registered successfully.zOTP has expired 1zInvalid OTPzCustomer exists.i  )r  )<r_   r   r   r   r   rA   rB   rC   r   r   r   r   r  r^   rj   r  r"   rf   r  r  r  r  r  r  r  r   r  r   r   r6  r7  r   r   r   r   r]   r  r  r  r  r   r(   r   r   r  r   r   r  r   r   OTPotp_valstartdatetimeexpiredatetimer!   r   	TIME_ZONEpytztimezoneverified)Kr   r   r   r   r   rk  r   rl  r  rm  r   r   r   r   r   r   r   r   r   r   rd   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r  r  r  r  r  r   r  r   r  r_  r#   r  vehicletype_val	price_valr  r   otp_objst_timeex_timer  timer$   r$   r%   r     s   

!

*








J

     !                           2   

zPlaceOrderTesExtraTest.postN)r   r   r   r   r   r$   r$   r$   r%   r  }  s   r  c               @   s   e Zd ZdZdd ZdS )PlaceOrderTestzQThis class is being used to save the customer job request details in the databasec       D   s   O   sD  t d t d t d t d dd }ddd}|jjd}|jjd	}|jjd
}|jjd}	|jjd}
|jjd}|jjd}|jjd}|jjd}|jjd}|stdddS |stdddS |stdddS |
stdddS |stdddS |stdddS |s.tdddS |sBtdddS |sVtdddS ytjj|dj }t d |rt d |j}t	jj|d j }t d! |r|
d"krd#}
n|
d$krd%}
ntdd&dS t
jj||
t||t|t|d'd(}W n, tk
r( } zt | W Y d d }~X nX t d) tj|}t d t | d#}t d) tjj|dj }t d |r,t d |j}t	jj|d j }t d! |rt d* x$|D ]}t d+ t | t d+ t |d,  t |d-  t |d.  t |d/  t |d0  t |d1  t |d2  t |d3  t |d4  t |d5  t |d6  t |d7  t |d8  t |d9  t |d:  |d, }|d- }|d. }|d; }|d< }|d/ }d=}y|d0 }W n, tk
r } zt | W Y d d }~X nX |d1 }|d2 }|d3 } |d4 }!|d5 }"|d6 }#|d7 }$|d8 }%|d9 }&|d: }'|d> }(|d? })|d@ }*|dA }+|dB },|dC }-|dD }.|.dEkrdF}/nd'}/tjj|dGj }0|0rt dH ytjj|||*|+dIdJj }1|1r`|1j}2|2|0jkr|0j}3nr|0j}3t d+ t |0j t |3 |2|0j }2|2t|2kr4t|2d# }2n|2}2t |2 t |0j |3|2|0j  }3t |3 W n, tk
r } zt | W Y d d }~X nX y,dK}4|/rtjjdLdGj }5|5r|5j}4W n, tk
r } zt | W Y d d }~X nX tjj||||||||#|$|%|&|'|,|||| |!|"||0|3|(|)|/|4dM}6|rP||6_||6_|*|6_|+|6_|6j  yt j j! }7t"jj|6|7dN W n, tk
r } zt | W Y d d }~X nX y8t#jj|j$|6j%dFdOdPdQdR t#jj|6j%dFdOdSdQdT W n, tk
r  } zt | W Y d d }~X nX |-r.dU|- }8t dV ||8|6j%dW t dX y t dY ||6j%dW t dX W n, tk
rz } zt | W Y d d }~X nX yt&|6j%}9t |9 W n, tk
r } zt | W Y d d }~X nX ntddZdS qW yt'|j(d[d\d]d^ W n, tk
r } zt | W Y d d }~X nX ntdd_dS ntdd_dS tjj) j%}:td`da|:dbS |sjtddhdS |s~tddidS |stddjdS |stddkdS |stddldS |stdddS |"stddmdS |$stddndS |%	s
tddodS |&	stddpdS |'	s2tddqdS |;	sFtddrdS |<	sZtddsdS |		ry:t |	 dtt*_+t*j,jtt|<du dvdw|	dx}=t |= W n. tk
	r } zt dy| W Y d d }~X nX d#}t d) tjj|dj }t d |rt d |j}t	jj|d j }t d! |rt d* tjj|;dGj }0|0rt dH tjj|||||||#|$|%|&|'||| |!|"||0|<dz}6|
r||6_||6_|*|6_|+|6_|6j  y8t#jj|6j%dFdOdPdQd{ t#jj|j$|6j%dFdOdSdQd| W n, tk
r } zt | W Y d d }~X nX yt'|j(d[d\d]d^ W n, tk
rL } zt | W Y d d }~X nX |-rzdU|- }8t dV ||8|6j%dW t dX y||6j%dW t dX W n, tk
r } zt | W Y d d }~X nX td`da|6j%dbS ntdd_dS td}d~dS |stdd_dS tjj }t-jjt.dj }>|>rt	jj|>dFdj }|rt/jjdt0dj) }?|?r|?j1}@|?j2}At |@ t |A t3t4j5}Bt j j!t6j7|B}Ct |C |C|@kr|C|Ak rdF|?_8|?j  td`ddS tdddS ntdddS ntdddS ntdd_dS W n4 tk
r> } zt | td}d~dS d }~X nX d S )Nz

zPlaceOrderTest API - in postc       
      S   s   yt |  dd l}dd l}dd l}tjj| d}djdd tdD }t	t
jd t	|j }|jj|r~t d t d	 n(t d t d
 |jd |j|dd |jdt	|  d}|j|d dd dt	|j d }||_|j  dS  tk
r }	 zt |	 W Y d d }	~	X nX d S )Nr   )r(   r   c             S   s   g | ]}t jtjtj qS r$   )r9  r:  r;  r<  r=  )r>  r?  r$   r$   r%   r@    s    z?PlaceOrderTest.post.<locals>.generateqrcode.<locals>.<listcomp>r   z/media/CustomerJobs/z



zdirectory existszdirectory not existsi  )rA  zAWB-)rB  z/qrcode.pngr.   )rC  rD  )r_   rE  rF  rG  rj   rA   r   rH  rI  r!   r   rJ  r(   rK  rL  rM  rN  r   rO  r]   r^   )
r   rE  rF  rG  r   rP  rQ  rR  rS  rd   r$   r$   r%   r     s,    
z+PlaceOrderTest.post.<locals>.generateqrcodec:\c                st  t | | jd}|d }|jd}t|d }|d }tj|}t|}ddlm}	 dd ldd l	dd l
|	j|}
tjj|d}djfdd	td
D }tjj }ttjd t|j  jj r fdd	j D }x&|D ]}j| qW nj dd |	j|}
|
jddg|	j}|
j d d | }dt|j d d | }||_|j  dS )Nz;base64,r   r   r'   )r   )r(   r   c                s   g | ]} j jj qS r$   )r:  r<  r=  )r>  r?  )r9  r;  r$   r%   r@  	  s    zBPlaceOrderTest.post.<locals>.getI420FromBase64.<locals>.<listcomp>r   z/media/CustomerJobs/c                s   g | ]}j j |qS r$   )rK  rH  )r>  rU  )rQ  rG  r$   r%   r@  	  s    i  )rA  i  zparcelimage.rD  )r_   rn   r!   rV  rW  r   rX  r   r;  r9  rG  rY  rj   rA   r   rH  rI  rZ  r   r   rJ  r(   rK  rL  r[  r\  rN  r]  r^  r]   r   )r_  r   r`  ra  rb  rc  rd  re  rf  r   rg  r   rP  rh  ri  rU  rj  rS  r$   )rQ  rG  r9  r;  r%   rk    s6    






z.PlaceOrderTest.post.<locals>.getI420FromBase64r   rl  r   rm  r   r   r   r   r   r   i  zUser not logged in)r   r   zparcels_data is requiredznoofparcels_val is requiredzordertype is requiredztotalamount is requiredz"parceldelivery_charges is requiredz"specialbooking_charges is requiredzvehicletype is requiredzcard_id is required)r   rD  ro  )r  rp  rr  r'   rs  r   zOrder type is required.F)rw   r   r   r  r   r   r   rt  r~  r  r   r   r   r   r   r   r   r   r   r   r  r   r   r   r  r   r   r   rm   ro   r   r   r  r  r   r  T)r   r  r  )r   r   r   r   r  g        zSpecial Booking Charges)r   r   r   r   r   r   r   r   r   r   r   r   r   r  r   r   r   r   r   rw   r   r   rm   ro   r   r  )r  r  zParcel Job Createdz"You have created one parcel order.r  )r   r%  r  r  r  r   z&Customer has created one parcel order.)r%  r  r  r  r   zdata:image/png;base64,zbefore function call)r   zafter function callz#before generateqrcode function callz Selected Vehicle does not exist.rw   r  r  z*Your parcel details are saved successfullyzUser not logged in.r   zSuccess.)r   r   r  zHow are you?zsuccess.c       	      S   s   t |  dd l}dd l}dd l}tjj| d}djdd tdD }t	t
jd t	|j }|jj|rln
|j| |jdt	|  d	}|j|d
 dd dt	|j d
 }||_|j  dS )Nr   )r(   r   c             S   s   g | ]}t jtjtj qS r$   )r9  r:  r;  r<  r=  )r>  r?  r$   r$   r%   r@   
  s    z?PlaceOrderTest.post.<locals>.generateqrcode.<locals>.<listcomp>r   z/media/CustomerJobs/zAWB-)rB  z/qrcode.pngr.   )rC  rD  )r_   rE  rF  rG  rj   rA   r   rH  rI  r!   r   rJ  r(   rK  rL  r  r   rO  r]   )	r   rE  rF  rG  r   rP  rQ  rR  rS  r$   r$   r%   r   	  s    
c                sp  t | | jd}|d }|jd}t|d }|d }tj|}t|}ddlm}	 dd ldd l	dd l
|	j|}
tjj|d}djfdd	td
D }tjj }ttjd t|j  jj r fdd	j D }x"|D ]}j| qW n
j  |	j|}
|
jddg|	j}|
j d d | }dt|j d d | }||_|j  dS )Nz;base64,r   r   r'   )r   )r(   r   c                s   g | ]} j jj qS r$   )r:  r<  r=  )r>  r?  )r9  r;  r$   r%   r@  
  s    zBPlaceOrderTest.post.<locals>.getI420FromBase64.<locals>.<listcomp>r   z/media/CustomerJobs/c                s   g | ]}j j |qS r$   )rK  rH  )r>  rU  )rQ  rG  r$   r%   r@  !
  s    i  zparcelimage.rD  )r_   rn   r!   rV  rW  r   rX  r   r;  r9  rG  rY  rj   rA   r   rH  rI  rZ  r   r   rJ  r(   rK  rL  r[  r\  r  r]  r^  r]   r   )r_  r   r`  ra  rb  rc  rd  re  rf  r   rg  r   rP  rh  ri  rU  rj  rS  r$   )rQ  rG  r9  r;  r%   rk  
  s6    







r   zsendername_val is requiredzSender countrycode is requiredz"Sender senderphone_val is requiredzpickupaddress_val is requiredzsendercity_val is requiredzparceltype_val is requiredzrecipientname_val is requiredz!recipient countrycode is requiredzrecipientphone_val is requiredzdropaddress_val is requiredzvehicletype_val is requiredzprice_val is requiredr  ru  rv  zParcel Payment)rw  rx  ry  r   zException in creating charge = )r   r   r   r   r   r   r   r   r   r   r   r  r   r   r   r   rw   r   r   )r%  r  r  r  r   )r   r%  r  r  r  r   i  zInternal Server Errorzraheja@yopmail.com)r  )r   r  r  )r  r  zUser registered successfully.r   zOTP has expired 1zInvalid OTPzCustomer exists.i  )r  )9r_   r   r   r   r   rA   rB   rC   r   r   r   r   r  r^   r  r  r  r  r  r  r  r   r"   r  r   r   rj   r   r   r   r   r]   r  r  r  r  r   r(   r   r   r  r  r   r   r  r   r   r  r  r  r  r!   r   r  r  r  r  )Dr   r   r   r   r   rk  r   rl  r  rm  r   r   r   r   r   r   r   r   r   r   rd   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r  r  r  r  r  r   r   r  r_  r#   r  r  r  r  r   r  r  r  r  r  r$   r$   r%   r     s   
"

*





@

     !                           2   

zPlaceOrderTest.postN)r   r   r   r   r   r$   r$   r$   r%   r    s   r  c               @   s    e Zd ZdZdd Zdd ZdS )TestzBThis class is used for login process for company or customer usersc             O   s    yt d tjjddd}t | |rx~|D ]v}tjj tdd j }tjj|tjj	j
 }t | tjj|dj|dj }t | t tjj jd	d
  P q.W tdddS  tk
 r } zt d| tdddS d }~X nX d S )NzTest API - in getFT)
isdisabledemailverifiedr'   )days)r)   )Zcreated_at__gtez-created_atr   r   r   )r   r      )MessagingClientz$20158A81-3357-414B-A605-82EEF14E0ACDzXM/Uts+7ollgrq0oGkaNtTu3k45ZYi/SK+u+5QpFuvFOLZU+NAZcYeaRFkPmit1FQH9ThrS0cCs+k2Ey5UawsOA==Z919255568967zHello, this is a test messageZARNr  zerror isi  zInternal Server Error)r_   r@   rA   rB   r  r  r
   r   combineminr  rk   countr   order_byr   r   Ztelesign.messagingr  messagetyper  r^   )r   r   r   r   Zdriversr)   Zyesterday_datedriverjob_objr#   r  r   r   Zphone_numberr  Zmessage_type	messagingresponseerrorr$   r$   r%   r   
  sB    
               R 
zTest.getc                s  yt d |jjd}t|}t | tdddS t d tjj|
dd}g }x|D ]
}t |jj d}|js~|j r|jrd}n|j rd}t | |dk s|dkr|j|jj|jj|jj|jj|jj|jj|jj|jj|jj |jj!|jj||jd |dkrZt"jj|jdj }|r^|jd|jj|jj|j#|jj|jjd|jj d qZt d qZW t$|dd dd}t | tdddS r|jd|jj|jj|jjd|jj d |jd|jj|jj |jj!d|jj d |jdd||d d ||d!< ||d"< ||d#< t t%|  fd$d%}x,|D ]$}||||d& |d' }||d(< q>W t$|d)d dd}t d* x*|D ]"}t |d+ d, t&|d(   qW t d* ||d-< tdddS  t'k
r } zt | td.d/dS d }~X nX d S )0NzTest - postr%  r   r   )r   r   r   )r  r  r  r  r  r,   )r(   r   )r)   z$drivercoordinates_obj does not existF)r)   jobcompletedZAssignedZ	Completedz	Picked Up)r   r   r   senderpickupaddressr   r   r   recipientdropoffaddressr   r   r%  r   r(   )r  Zpickupz<b>Pickup:</b> )r  r%  addresspickup_datetimer  r  typeplusaddresszpickup_datetime does not existc             S   s   | d S )Nr  r$   )ir$   r$   r%   <lambda>  s    zTest.post.<locals>.<lambda>)r   reverse)r  r  r  r  r   Zdropoffz<b>Dropoff:</b> ZdriverlocationStartz<b>Start</b>Zall_driverjobsdriverlatitudedriverlongitudec       	         s   t t| |||g\} }}}t | |||g\} }}}|| }||  }|d d | | |d d   }d | }d}|| S )Nr   i  )r  r  )	r  r  r  r  r  r  r  r   r  )r  r  r  r  r  r$   r%   r    s    0zTest.post.<locals>.haversiner  r  distance_fromdriverlocationc             S   s   | d S )Nr  r$   )r  r$   r$   r%   r    s    z

r  z  --  tracking_datai  zInternal Server Error)(r_   r   r   r   r   r   r  r  r  r  r  r@   rA   rB   rC   r3  r  r  rk   rg   r(   r   r  r   r   r   r   r   r   r   r   r   r   r   r  r  sortedlenr!   r^   )r   r   r   r   r%  r#   contextr   r  r'  rb   r  r  r5  Zdriverjobs_objZpicked_tracking_dataZ	driverjobr   customerjobdatetime_objZpicked_tracking_data_sortedr  locationr  rd   r$   )r  r  r  r  r  r%   r   i  s                



"z	Test.postN)r   r   r   r   r   r   r$   r$   r$   r%   r  
  s    	r  c               @   s   e Zd Zdd ZdS )SendSupportQueryc       	      O   s   t d t d t d|j y|jjd}|jjd}|sHtdddS |}y2t | td	|d
dgdd}t | tdddS  tk
r } zt | W Y d d }~X nX W n2 tk
r } zt | tdddS d }~X nX d S )Nz



zSendSupportQuery - post zdata is  : r   queryi  zPlease enter query)r   r   zHelp and Support:ztmpython4esf@gmail.comztest@yopmail.comF)fail_silentlyr   zRequest sent.i  zInternal Server Error)r_   r   r   r   r   r^   )	r   r   r   r   r   	query_valr  r#   rd   r$   r$   r%   r     s&    zSendSupportQuery.postN)r   r   r   r   r$   r$   r$   r%   r    s   r  c               @   s   e Zd Zdd ZdS )ChangePasswordc             O   s  t d t d|j yB|jjd}|jjd}|jjd}|jjd}|sZtddd	S |sltdd
d	S |s~tddd	S tjj|dj }|rVt |j t	jj|jd}	|	j
|r@t d t||	_|	j  tjj|	dj }
|
r2yt|
jdddd W n, tk
r0 } zt | W Y d d }~X nX tddd	S t d tddd	S W n4 tk
r } zt | tddd	S d }~X nX d S )Nz



aazdata is  : r   userroleZoldpasswordnewpasswordi  zUser not logged in)r   r   zPlease enter old passwordzPlease enter new password)r   )r(   zcorrect password)r   rw   Zpasswordchanger  z%Your password is updated successfullyr   r   zinvalid passwordzCurrent password is incorrecti  zInternal Server Error)r_   r   r   r   r   rA   rB   rC   r   r   Zcheck_passwordr   passwordr]   r   r   r  r^   )r   r   r   r   r   userrole_valZoldpassword_valZnewpassword_valr   r   r   rd   r$   r$   r%   r     sB    

zChangePassword.postN)r   r   r   r   r$   r$   r$   r%   r    s   r  c               @   s   e Zd Zdd ZdS )GetUnreadNotificationsCountc       	      O   s   t d y|jjd}|s(tdddS tjj|dj }|r~t|j	\}}|dkr^t | n|dkrnt | td	|dd
S tdddS W n2 t
k
r } zt | tdddS d}~X nX dS )z<This function shows the content on customer dashboard screenz%GetUnreadNotificationsCount - in get r   i  zUser not logged in)r   r   )r   r   r  r   )r   unread_notifications_countr   i  zInternal Server ErrorN)r_   r   r   r   r   rA   rB   rC   r   r   r^   )	r   r   r   r   r   r   resultr  rd   r$   r$   r%   r   <  s"    
zGetUnreadNotificationsCount.getN)r   r   r   r   r$   r$   r$   r%   r  :  s   r  c               @   s   e Zd Zdd ZdS )CustomerNotificationsc             O   s&  t d y|jjd}|s(tdddS tjj|dj }|rtjj|j	dj }|rg }t
jj|dd	jd
}|rx4|D ],}	|j|	j|	j|	j|	j|	j|	j|	jd qzW td|ddS tdg ddS qtdddS ntdddS W n4 tk
r  }
 zt |
 tdddS d}
~
X nX dS )z<This function shows the content on customer dashboard screenzCustomerNotifications - in get r   i  zUser not logged in)r   r   )r   )r(   F)r   r   z-id)r(   r  r  r  r%  r   r   r   r   )r   r   r   i  zInternal Server ErrorN)r_   r   r   r   r   rA   rB   rC   r   r   r  r  r   r(   r  r  r  r%  r   r   r^   )r   r   r   r   r   r   r   Znotifications_dataZall_notificationsZnotificationrd   r$   r$   r%   r   T  s8    
zCustomerNotifications.getN)r   r   r   r   r$   r$   r$   r%   r  R  s   r  c               @   s   e Zd ZdZdd ZdS )GetParcelWeightsz,This class is used to get all vehicle types c             O   s   yrt d g }tjjdd}|jddd |jddd |jd	d
d |jddd t | tdd|dS  tk
r } zt | tdddS d }~X nX d S )NzGetParcelWeights API - in getF)r   r'   zLess than 5 kg)r(   r   r   z"More than 5 kg but less than 20 kgr*   z#More than 20 kg but less than 50 kgr+   zMore than 50 kgr   r   )r   r   r   i  zInternal Server Error)r   r   )r_   r  rA   rB   r   r   r^   )r   r   r   r   r   allvehicletypesrd   r$   r$   r%   r   z  s*    



zGetParcelWeights.getN)r   r   r   r   r   r$   r$   r$   r%   r  x  s   r  c               @   s   e Zd ZdZdd ZdS )GetVehicleTypesz,This class is used to get all vehicle types c             O   s   ydt d g }tjjdd}|rNx,|D ]$}|j|j|jttj	d d q&W t | t
dd|dS  tk
r } zt | t
d	d
dS d }~X nX d S )NzGetVehicleTypes API - in getF)r   z/static/images/bike.png)Zvehicletypeidr   Zvehicleimager   r   )r   r   r   i  zInternal Server Error)r   r   )r_   r  rA   rB   r   r(   r   r!   r   WEB_BASE_URLr   r^   )r   r   r   r   r   r  r   rd   r$   r$   r%   r     s    
zGetVehicleTypes.getN)r   r   r   r   r   r$   r$   r$   r%   r    s   r  c               @   s   e Zd ZdZdd ZdS )QuickFareEstimatezBThis class is used for login process for company or customer usersc             O   s,  yt d dd }|jjd}|jjd}|jjd}|jjd}|jjd}	|jjd	}
|jjd
}|sxtdddS |stdddS |stdddS d\}}|r|	r|
r|r|d |	 }|
d | }||||||\}}}t|||dS  tk
r& } zt d| tdddS d }~X nX d S )NzQuickFareEstimate API - in postc             S   s  i }yFt tj}| jdd} | jdd} |jdd}|jdd}| }|}d}	|r|rt|	d | d | d |  tj|	d | d | d | }
nBt|	d | d | d |  tj|	d | d | d | }
|
j }t| td |d	 d
kr@d}t|d d d d d d | }t	j
jd|dj }|r6|}||jkr\|j}n>|j}||j }|t|krt|d }n|}|||j  }t tj}|jdkr|d7 }nV|jdkr|d7 }n@|jdkr|d7 }n*|jdkr|d7 }n|jdkr|d7 }|j|jt tt|d|j|d dd |fS d!d"|fS W n0 tk
r| } zt| d!d"|fS d }~X nX d S )#Nr   r   #z9https://maps.googleapis.com/maps/api/distancematrix/json?zorigins=z&destinations=z&key=r  r   OKgobyp\D?rowsr   elementsr  valuer  )r  r   r'   Bikez/static/images/bike.pngCarz/static/images/car.jpgsmallvanz/static/images/smallvan.png	mediumvanlargevanz/static/images/largevan.jpgr   )r   r   rx  r   r   r   i  zEnter valid address)r!   r   GOOGLE_API_KEYr    r_   requestsr   r  r  r  rA   rB   rC   r  r  r"   r  r  r   r4  roundrx  r^   )r  r  r  sendercoordinates_valrecipientcoordinates_valr   r   r   destrR  r  xmultiplicationfactordistanceinmilesr  r  r  r   rd   r$   r$   r%   getquickfareforvehicletype  sb    
 $ "$





&
z:QuickFareEstimate.post.<locals>.getquickfareforvehicletyper   r  r   r   r   r   r   i  zpickupaddress is required)r   r   zdropaddress is requiredzvehicletype is requiredr   ,)r   r   r   zerror isi  zInternal Server Error)r   r   )r_   r   r   r   r^   )r   r   r   r   r3  r  r  r  r  r  r  r  r-  r.  r   r   r   r  r$   r$   r%   r     s2    D
zQuickFareEstimate.postN)r   r   r   r   r   r$   r$   r$   r%   r    s   r  c               @   s   e Zd Zdd ZdS )GetParcelTypesc             C   s   yHt jjdd}g }|r:x |D ]}|j|j|jd qW td|ddS  tk
rz } zt| tddd	S d
}~X nX d
S )z0 This API method is used to get all parcel typesF)r   )r   r(   r   r   )r   r   r   i  zInternal Server Error)r   r   N)	Z
ParcelTyperA   rB   r   r   r(   r   r^   r_   )r   r   ZallparceltypesZallparceltypes_datar   rd   r$   r$   r%   r     s    
zGetParcelTypes.getN)r   r   r   r   r$   r$   r$   r%   r5    s   r5  c               @   s   e Zd Zdd ZdS )OngoingRequestsExtraTestc          *   C   s  t d|j y@|jjd}|s.tdddS |jjd}|sBd}tjj|dj }|r<tjj|j	d	j }|r*t d
 t
jj|dj }|rt d tjjddj }|r|j}nd}tjj|ddjd}	|	rt d t t|	 g }
g }x&|	D ]}|j|
k r|
j|j  qW xj|
D ]`}g }xH|	D ]>}|j|kr8ydtd|j  }W n0 tk
r } zt | d}W Y dd}~X nX |jsd}nttj|jj }i }d}d}tjj|dj }|rd}d}|jdkr|jdkrd}nz|jdkr|jdkrd}n\|jdkr8|jdkr8d}n>|jdkrV|jdkrVd}n |jdkrv|jdkrvd}d}|jdkr^|jjjsd}nttj|jjj }|j |jj|jj!|jj|jj|d d}|j|j"|j#|j$|j%|j&|j'|j(|j)|j*|||j|||||j+|j,d nB|j|j"|j#|j$|j%|j&|j'|j(|j)|j*|||j||||jd |d kr8|j| g }q8W |j| q&W |dkrg }xf|D ]^}g }xB|D ]:}||d! ks||d" ks||d# kr|j| qW |r|j| qW |}td$||d%d&S td$g d%d'S ntdg dd'S ntd(g d)d'S W n4 tk
r } zt | td*d+dS d}~X nX dS ),z4 This API method is used to get profile data of userzdata is  : r   i  zUser not logged in)r   r   r  r   )r   )r(   rt  )r   rD  F)r   )rw   r   z-idro  zAWB-i'  N)rg   TzDriver have not yet Started JobzDriver Started Jobz!Driver Arrived,Waiting For Pickupz#Out For Delivery,Start Drop Off JobzArrived At Drop Off LocationZ	Delivered)
drivernamedrivercountrycodedriverphoner'  driverimage)r   r   r   r   r   r   r  r   r  parcelimage	awbnumberr%  driverexistparcelpickeddriverdetailsr   Z
isDisabledcomment)r   r   r   r   r   r   r  r   r  r;  r<  r%  r=  r>  r?  zSame Package Idr   r   r   r   r   r   )r   r   support_phoner   )r   r   r   i  zUser not logged in.i  zInternal Server Error)-r_   r   r   r   r   rA   rB   rC   r   r   r   SupportDetailphonerj   r  r
  rf   r   r!   r(   r^   r   r   r  r   rk   r   arrived_at_pickupparcel_picked_by_driverarrived_atDropOffLocationr  r)   r4  countrycoder   r   r   r   r   r   r   r   r   r  Zcomment_of_Parcel)r   r   r   r  r   r   r   supportdetail_objrA  r   uniqueall_data_main_listjobIDs	unique_idongoingcustomerjobs_datar  r<  rd   r;  driverjob_datar=  r>  r  r   r:  r{   all_datarz   r   r$   r$   r%   r   )  s    







*zOngoingRequestsExtraTest.getN)r   r   r   r   r$   r$   r$   r%   r6  '  s   r6  c               @   s   e Zd Zdd ZdS )OngoingRequestsc          &   C   s  t d|j y|jjd}|s.tdddS g }tjj|dj }|rtjj|j	dj }|rt d t
jj|d	j }|rvt d
 tjjddj }|r|j}nd}tjj|djd}	|	rdt d t t|	 x|	D ]z}
ydtd|
j  }W n0 tk
r0 } zt | d}W Y dd}~X nX |
js@d}nttj|
jj }i }d}d}tjj|
dj }|r"d}|jrd}|jdkr`|jjjsd}nttj|jjj }|j|jj|jj|jj|jj|d d}|j|
j|
j|
j |
j!|
j"|
j#|
j$|
j%|
j&|||
j|||d q|j|
j|
j|
j |
j!|
j"|
j#|
j$|
j%|
j&|||
j|||d qW td||ddS tdg ddS ntdg ddS ntdg ddS W n4 tk
r } zt | tdddS d}~X nX dS ) z4 This API method is used to get profile data of userzdata is  : r   i  zUser not logged in)r   r   )r   )r(   rt  )r   rD  F)r   r   )rw   z-idro  zAWB-i'  N)rg   T)r7  r8  r9  r'  r:  )r   r   r   r   r   r   r  r   r  r;  r<  r%  r=  r>  r?  r   r   )r   r   rA  r   )r   r   r   i  zUser not logged in.i  zInternal Server Error)'r_   r   r   r   r   rA   rB   rC   r   r   r   rB  rC  rj   r  r
  r!   r(   r^   r   r   r  r   rk   r   r  r)   r4  rG  r   r   r   r   r   r   r   r   r   r   )r   r   r   rM  r   r   r   rH  rA  r   r  r<  rd   r;  rN  r=  r>  r  r:  r$   r$   r%   r     s    
zOngoingRequests.getN)r   r   r   r   r$   r$   r$   r%   rP    s   rP  c               @   s   e Zd Zdd ZdS )OngoingRequestsTestc          '   C   s,  t d|j yt d |jjd}|s6tdddS tjjddj }|rT|j}nd	}g }t	jj|d
j }|rt
jj|jdj }|rt d tjj|dj }|rt d tjj|ddjd}	|	rx|	D ]}
g }tjj|
|djd}|rt d t t| x|D ]|}ydtd|j  }W n0 tk
rf } zt | d	}W Y dd}~X nX |jsvd	}nttj|jj }i }d}d}tjj|dj }|rXd}|jrd}|jdkr|jjjsd	}nttj|jjj }|j|jj|jj|jj|jj|d d}|j|j|j |j!|j"|j#|j$|j%|j&|j'|||j|||d n>|j|j|j |j!|j"|j#|j$|j%|j&|j'|||j|||d qW |j| qW td||ddS tdg ddS ntdg d	dS ntdg d dS W n4 tk
r& } zt | td!d"dS d}~X nX dS )#z4 This API method is used to get profile data of userzdata is  : zOngoingRequestsTest - in getr   i  zUser not logged in)r   r   F)r   r   )r   )r(   rt  )r   rD  r   )rw   r   z-id)r   rw   ro  zAWB-i'  N)rg   T)r7  r8  r9  r'  r:  )r   r   r   r   r   r   r  r   r  r;  r<  r%  r=  r>  r?  r   r   )r   r   rA  r   )r   r   r   i  zUser not logged in.i  zInternal Server Error)(r_   r   r   r   rB  rA   rB   rC   rC  r   r   r   r   r   r  rj   r
  r!   r(   r^   r   r   r  r   rk   r   r  r)   r4  rG  r   r   r   r   r   r   r   r   r   r   )r   r   r   rH  rA  rM  r   r   r   r   r   
order_datar   r  r<  rd   r;  rN  r=  r>  r  r:  r$   r$   r%   r   8  s    
zOngoingRequestsTest.getN)r   r   r   r   r$   r$   r$   r%   rQ  6  s   rQ  c               @   s   e Zd Zdd ZdS )CompletedRequestsExtraTestc          "   C   sf  t d|j y|jjd}|s.tdddS |jjd}|sBd}g }tjj|dj }|rtjj|j	d	j }|rt d
 t
jj|dj }|rt d g }tjjddj }	|	r|	j}
nd}
tjj|djd}|rjg }x"|D ]}|j|kr|j|j qW t d t t| xJ|D ]@}g }x"|D ]}|j|kr6ydtd|j  }W n0 tk
r } zt | d}W Y dd}~X nX |jsd}nttj|jj }i }d}tjj|dj }|r0d}|jr0|j|jj|jj|jj|jjd d}|j|j|j|j |j!|j"|||j||d
 |dkr6|r6|j| g }q6W |r$|j| q$W |dkrg }xf|D ]^}g }xB|D ]:}||d ks||d ks||d kr|j| qW |r~|j| q~W |}td||
ddS tdg dd S ntdg dd S ntd!g d"d S W n4 tk
r` } zt | td#d$dS d}~X nX dS )%z4 This API method is used to get profile data of userzdata is  : r   i  zUser not logged in)r   r   r  r   )r   )r(   rt  )r   rD  F)r   )rw   z-idro  zAWB-i'  N)rg   T)r7  r8  r9  r'  )
r   r   r  r   r  r;  r<  r%  r=  r?  r   r   r   r   r   r   )r   r   rA  r   )r   r   r   i  zUser not logged in.i  zInternal Server Error)#r_   r   r   r   r   rA   rB   rC   r   r   r   rB  rC  rj   r  rf   r   r
  r!   r(   r^   r   r   r  r   rk   r  r4  r)   rG  r   r   r   r   r   )r   r   r   r  completedcustomerjobs_datar   r   r   rJ  rH  rA  r   rI  rK  rL  r  r<  rd   r;  rN  r=  r  r{   rO  rz   r   r$   r$   r%   r     s    








*zCompletedRequestsExtraTest.getN)r   r   r   r   r$   r$   r$   r%   rS    s   rS  c               @   s   e Zd Zdd ZdS )CompletedRequestsc          !   C   sP  t d|j y|jjd}|s.tdddS g }tjj|dj }|rtjj|j	dj }|rt d t
jj|d	j }|rt d
 tjjddj }|r|j}nd}tjj|djd}	|	rt d t t|	 x|	D ]}
ydtd|
j  }W n0 tk
r, } zt | d}W Y dd}~X nX |
js<d}nttj|
jj }i }d}tjj|
dj }|rd}|jr|j|jj|jj|jj|jjd d}|j|
j|
j|
j|
j |
j!|||
j||d
 qW td||ddS tdg ddS ntdg ddS ntdg ddS W n4 tk
rJ } zt | tdddS d}~X nX dS ) z4 This API method is used to get profile data of userzdata is  : r   i  zUser not logged in)r   r   )r   )r(   rt  )r   rD  F)r   r   )rw   z-idro  zAWB-i'  N)rg   T)r7  r8  r9  r'  )
r   r   r  r   r  r;  r<  r%  r=  r?  r   r   )r   r   rA  r   )r   r   r   i  zUser not logged in.i  zInternal Server Error)"r_   r   r   r   r   rA   rB   rC   r   r   r   rB  rC  rj   r  r
  r!   r(   r^   r   r   r  r   rk   r  r4  r)   rG  r   r   r   r   r   r   )r   r   r   rT  r   r   r   rH  rA  r   r  r<  rd   r;  rN  r=  r  r$   r$   r%   r   !  sz    
zCompletedRequests.getN)r   r   r   r   r$   r$   r$   r%   rU    s   rU  c               @   s   e Zd Zdd ZdS )CompletedRequestsTestc          "   C   s  t d|j yLt d |jjd}|s6tdddS tjjddj }|rT|j}nd	}g }t	jj|d
j }|rHt
jj|jdj }|r6t d tjj|dj }|r$t d tjj|ddjd}	|	rx<|	D ]2}
g }tjj|d}|rt d t t| x|D ]}ydtd|j  }W n0 tk
r\ } zt | d	}W Y dd}~X nX |jsld	}nttj|jj }i }d}tjj|dj }|rd}|jr|j|jj|jj|jj|jjd d}|j|j|j|j |j!|j"|||j||d
 qW |j| qW td||ddS tdg ddS ntdg d	dS ntdg d dS W n4 tk
r } zt | td!d"dS d}~X nX dS )#z4 This API method is used to get profile data of userzdata is  : zCompletedRequestsTest - in getr   i  zUser not logged in)r   r   F)r   r   )r   )r(   rt  )r   rD  r'   )rw   r   z-id)rw   ro  zAWB-i'  N)rg   T)r7  r8  r9  r'  )
r   r   r  r   r  r;  r<  r%  r=  r?  r   r   )r   r   rA  r   )r   r   r   i  zUser not logged in.i  zInternal Server Error)#r_   r   r   r   rB  rA   rB   rC   rC  r   r   r   r   r   r  rj   r
  r!   r(   r^   r   r   r  r   rk   r  r4  r)   rG  r   r   r   r   r   r   )r   r   r   rH  rA  rT  r   r   r   r   r   rR  r   r  r<  rd   r;  rN  r=  r  r$   r$   r%   r   p  s    
zCompletedRequestsTest.getN)r   r   r   r   r$   r$   r$   r%   rV  n  s   rV  c               @   s   e Zd Zdd ZdS )AllRequestsc             C   s  t d|j y|jjd}|s.tdddS g }tjj|dj }|rtjj|j	dj }|rt d t
jj|d	j }|rt d
 tjjddj }|r|j}nd}tjj|d}	|	rtt d t t|	 x|	D ]}
|
jsd}nttj|
jj }i }d}tjj|
dj }|rF|j|jj|jj|jj|jjd d}|j|
j|
j|
j|
j|
j||
j||d	 qW td||ddS tdg ddS ntdg ddS ntdg ddS W n4 tk
r } zt | tdddS d}~X nX dS )z4 This API method is used to get profile data of userzdata is  : r   i  zUser not logged in)r   r   )r   )r(   rt  )r   rD  F)r   r   )rw   ro  )rg   )r7  r8  r9  r'  T)	r   r   r  r   r  r;  r%  r=  r?  r   r   )r   r   rA  r   )r   r   r   i  zUser not logged in.i  zInternal Server ErrorN) r_   r   r   r   r   rA   rB   rC   r   r   r   rB  rC  rj   r
  r   r!   r   r  r   rk   r4  r)   rG  r(   r   r   r   r   r   r   r^   )r   r   r   Zallcustomerjobs_datar   r   r   rH  rA  r   r  r;  rN  r=  r  rd   r$   r$   r%   r     sj    
zAllRequests.getN)r   r   r   r   r$   r$   r$   r%   rW    s   rW  c               @   s   e Zd Zdd ZdS )InvoiceScreenDetailc             C   s  t d|j yB|jjd}|jjd}|s:tdddS |sLtdddS i }tjj|dj }|r>tjj|j	d	j }|r,t
jj|d
j }|rtjj|d	j }|r*d}	|jrttj|jj }
nd}
|j|jjt|jdt|	tt|jd|
dd td|ddS ntdg ddS ntdg ddS ntdg ddS W n4 tk
r } zt | tdddS d}~X nX dS )z4 This API method is used to get profile data of userzdata is  : r   r%  i  zUser not logged in)r   r   zCustomerJob id is required)r   )r(   )r   g        r   r   u   €)r   fareextrachargesZtotalchargesparcelpdf_linkrx  r   r   )r   r   r   i  zUser not logged in.i  zInternal Server ErrorN)r_   r   r   r   r   rA   rB   rC   r   r   r   rj   	parcelpdfr!   r   r  r   r4  r   r,  r   r^   )r   r   r   r+  customerjob_datar   r   r   r   rZ  r[  rd   r$   r$   r%   r     sF    

zInvoiceScreenDetail.getN)r   r   r   r   r$   r$   r$   r%   rX    s   rX  c               @   s   e Zd Zdd ZdS )CustomerJobDetailc       6   O   C   sj  t d|j y"|jjd}|jjd}|s:tdddS |sLtdddS i }tjj|dj }t d	 tjj|d
j }t d |r.t d |j	sd}n|j	}|j
sd}n|j
}|jsd}	nttj|jj }	|jsd}
nttj|jj }
|jrttj|jj }nd}t | |jjdkr.d}n|jjdkr@d}d}d}d-\}}}tjj|jddj }|r~d}|j}|j}tjj|dj }d.\}}}}|r|j}|j}|j}|j}|j}yd/\}}}}d}|jdkrtjj|jd}x|D ]}tjj|dj }|r|j dkrR|j }|j!}yttj|j"j }W n   d}Y nX nV|j dkr|j }|j#}y|j	d |j$ }W n   d}Y nX n|j } | dk	r|j }qW W n, t%k
r }! zt |! W Y dd}!~!X nX d0\}"}#}$}%d1\}&}'}(})tjj|dj }*|*r|*j&dkr:|*j&}"|*j'}#ttj|*j(j }%n0|*j&dkrd|*j&}"|j)}#|j
d |j* }$n|*j&}"|*j dkr|*j }&|*j!}'ttj|*j"j })n0|*j dkr|*j }&|j#}'|j	d |j$ }(n|*j }&y2t+jj|dj }+|+rd}|+j,j}nd}d}W n   d}d}Y nX d},d}-i }.t-jj|dj }/d}0|/r|/j.dkrFd}0|/j/dkrVd}0|/j0dkrfd}0|/j1dkrvd}0|/j2dkrd }0|/j3dkrd!}0|/j4dkrd"}0d}1d}2t5jj|/|d#j }3|j6dkrd}1|3rttj|3j7j }2|/rb|/j.rd}-t8jj|/j9jd
j }4|4jr.ttj|4jj }5nd}5|.j:|/j9j|/j9j;|/j9j<|5|/j9j|/j|0d$ d},|j:|j#||j$|j=|j>|j?|j@|jA|jB|j)||j*|jC|jD|jE|jF|jG|jH||1|2|jI|jJ|jK|jL|jM|jN|jOjtP|jQd|jR|
||	|jd%td&|j  |,|-|.|||||"|#|$|%|||||d'3 td(|d)d*S W n4 t%k
rd }! zt |! td+d,dS d}!~!X nX dS )2z4 This API method is used to get profile data of userzdata is  : r   r%  i  zUser not logged in)r   r   zCustomerJob id is required)r   z	last true)r(   z	before ifzin ifr   r'   zSingle-Dropr   z
Multi-DropFr   r)   )r%  r$  T)r  )rf   	signaturer  rh   N)rg   r*   r+   r,   r   c   )Z
driver_jobrg   )r7  r8  r9  r:  r'  Zdriverjobiddriver_job_statuszAWB-i'  )3r   r   r   r  r   r   r   rm   r   r   r   r   r  r   r   ro   r   r   itemspickup_datetimedelivery_safe_statussafe_image_proofr  r   r   r   r   r   r   rY  r   r;  r[  rO  r%  r<  r=  r>  r?  r(  feedbackfeedbackgivenr   delivery_proof_methoddelivery_toperson_namedelivery_toperson_phonedelivery_toperson_signaturepickup_proof_methodpickup_fromperson_namepickup_fromperson_phonepickup_fromperson_signatureitemsdelivered_datetimer   r   )r   r   r   i  zInternal Server Error)r   r   F)r   r   r   r   )r   r   r   r   )r   r   r   r   )r   r   r   r   )Sr_   r   r   r   r   rA   rB   rC   rj   r   r   rO  r!   r   MEDIA_BASE_URLr   r   r\  r  r   r   r*  r(   r(  r)  r  r  r  ro  deliveryfailed_datetimerf   ZCustomerJobDeliveryExtraDetailsrk  rl  rn  r   r   r^   rg  rh  rj  r   r   ZCustomerJobDeliveryFailedZdeliveryfailed_imagerk   r   rD  rE  Zstart_DropOffrF  r  ZdeliveryfailedZDriverDropSafePalacer  Z	safeplacer@   r)   r4  rG  rC  r   r   r   r   rm   r   r   r   r   ro   r   r   r  r   r   r   r   r   r   r,  r   r   )6r   r   r   r+  r]  r   r   r   r   rO  r;  r[  r   Zdelivery_failed_statusZfailed_image_proofr(  re  rf  Zuserrating_objr  r  r  ro  rq  rb  Zpickup_proof_method_newZpickup_fromperson_name_newZpickup_fromperson_phone_newZpickup_fromperson_signature_newZall_customer_jobZalZcustomer_deatils_allZpickup_proof_method_temprd   rg  rh  ri  rj  rk  rl  rm  rn  Z#customerjobdeliveryextradetails_objZcustomerdeliveryfailed_objr=  r>  rN  r  ra  rc  rd  ZsafepalceImagerb   r:  r$   r$   r%   r   H  s   







zCustomerJobDetail.getN)r   r   r   r   r$   r$   r$   r%   r^  F  s   r^  c               @   s   e Zd ZdZdd ZdS )LoginzBThis class is used for login process for company or customer usersc             O   s  yt d |jjd}|jjd}|jjd}|sBtdddS |jjd}|s`tdd	dS |srtdd
dS |stdddS t||d}|d k	rtjj|d\}	}
|dks|dkr|dkrtjj	|ddj
 }n|dk rtjj	|ddj
 }|r|jdkrtdddS |jr0tdddS ||_|j  t|j\}}|dkr`t | n|dkrrt | |jsd}nttj|jj }tdd|j|j|j||	j|dd	S tdddS tdddS W n> tk
r } z t d| tdd t| dS d }~X nX d S )!NzCustomerLogin API - in postr  r   r  i  zUser Role is required)r   r   r  zFcm token is requiredzEmail address is requiredzPassword is required)r  r  )r   rw   r   )r   r   Fo   zPlease verify your email first.ru  z(Your account has been disabled by Admin.r   r  r   r   zcustomer login successfull)	r   r   r   rG  rC  r   tokenr  r   i  zInvalid Credentials.zerror isi  zException occurred : )r_   r   r   r   r   r   rA   get_or_creater   rB   rC   r  r  r  r]   r   r(   r   r!   r   r  r   rG  rC  r   r^   )r   r   r   r   r  r   password_valfcmtoken_valr   rt  r   r   r  r  r   r  r$   r$   r%   r   [  sV    




$
z
Login.postN)r   r   r   r   r   r$   r$   r$   r%   rr  Y  s   rr  c               @   s   e Zd ZdZdd ZdS )RegisterzEThis API sends the OTP on customer mobile at the time of registrationc             O   s  yt d t d|j |jjd}|jjd}|jjd}|jjd}|jjd}|jjd}	|srtd	d
dS |std	ddS |std	ddS |std	ddS |std	ddS |	std	ddS |dkr6|jjd}
|jjd}|jjd}|
std	ddS |s"td	ddS |s6td	ddS |dkr|jjd}|jjd}|jjd}|jjd}|jjd}|jjd}tjj|dj }|r4yZtjj|d d!}|rtd"d#dS tjj|d$d!}|rtd%d&dS td"d'dS W n4 t	k
r. } zt | td"d(dS d }~X nX nXtjj
|||	d)}d*jd+d, td-D }d.| d/ t|j d0 | }ttj| }d1| }y,t | td2|d3t|gd d4}t | W n, t	k
r } zt | W Y d d }~X nX |d5kr$tjj||||||d6}|rtd%d7dS nh|dkr~tjj|||||||d8}|rtjj|||||||d9}|rtd%d7dS ntd	d:dS W n4 t	k
r } zt | td;d<dS d }~X nX d S )=NzRegister API - in postzdata is  : r  r   r   rG  rC  r  i  zUser Role is required)r   r   zName is requiredzEmail Address is requiredzCountrycode is requiredzPhone number is requiredzPassword is requiredr)   r   vehiclenumberpreferredareazVehicle Type is requiredzVehicle Number is requiredzPreferred Area is requiredr   	job_titlecompany_namecompany_websitemonthly_delivery_volumeregistration_numberindustry)r  T)r   r  i  zUser already exists.Fr   z_A verification link has been sent to your email address earlier. Please search your mail inbox.z0A driver with this email address already exists.zUser exists.)r  r   r  r   c             S   s   g | ]}t jtjtj qS r$   )r9  r:  r;  r<  r=  )r>  r?  r$   r$   r%   r@    s    z!Register.post.<locals>.<listcomp>r   z/user/z/verify/r   z-
Verify your account through following link:
zEmail verification:ztmpython4esf@gmail.com)r  rw   )r   r   r   rG  rC  emailverificationlinkz8A verification link has been sent to your email address.)r   r   r   r   rG  rC  r  )rw   r{  r   websiter~  r  r  zUser Role is not definedi  zInternal Server Error)r_   r   r   r   r   rA   rB   rC   r   r^   create_userrH  rI  r!   r   r   r  r   r   r  )r   r   r   r   r  name_valr   countrycode_val	phone_valrv  r  vehiclenumber_valpreferredarea_valr{  r|  r}  r~  r  r  r   Zcustomer_emailverified_objZcustomer_emailnotverified_objrd   rP  baselinkcompletelinkr  r#   r   r  r$   r$   r%   r     s    



zRegister.postN)r   r   r   r   r   r$   r$   r$   r%   rx    s   rx  c               @   s   e Zd Zdd ZdS )
GetProfilec             C   s<  t d|j y|jjd}|s.tdddS tjj|dj }|rtjj|j	dj }|rt
jj|dj }|ri }|jd	krtjj|d
j }|r|j|j|j|j|j|j|j|jd |jjsd}nttj|jj }|jdd}|j sd}	n|j}	|jsd}
n|j}
i }yLtjjd|jdjtd}t | t |d  |d s^d}n|d }W n0 t k
r } zt | d}W Y dd}~X nX |j|j|j!|
|j"|	|||d td|ddS tdi ddS ntdi ddS ntdi ddS W n4 t k
r6 } zt | tdddS d}~X nX dS )z4 This API method is used to get profile data of userzdata is  : r   i  zUser not logged in)r   r   )r   )r(   )r   r   )rw   )r{  r   r  r~  r  r  r   r   z:9999rw   )r$  r&  r(  Zrating__avgg        N)r   r   rG  rC  r  r   ratingscompanydetail_datar   r   )r   r   r   i  zInternal Server Error)#r_   r   r   r   r   rA   rB   rC   r   r   r   r   r  r4  r{  r   r  r~  r  r  r   r   r!   r   r  r    r  rG  r*  r(   	aggregater   r^   r   rC  )r   r   r   r   r   r   r  r  r   r  rG  r   Zrating_customerr  rd   r$   r$   r%   r     sx    


zGetProfile.getN)r   r   r   r   r$   r$   r$   r%   r    s   r  c               @   s   e Zd Zdd ZdS )UpdateProfilec       8   ,      s  t d ydidd}|jjd}|jjd}|jjd}|jjd}|jjd	}	|jjd
}
|jjd}|s|tdddS |stdddS |stdddS |stdddS |	stdddS tjj|dj }|r tjj|j	dj }|r t
jj|dj }|r ||_||_||_|
|_|j  |rZd| }t d |||jd t d |jdkr|jjd}|jjd}|jjd}|jjd}|jjd }|jjd!}tjj|d"j||||||d#}yt|jd$d%d&d' W n, tk
r } zt | W Y d d }~X nX td(d)dS W n4 tk
rV } zt | td*d+dS d }~X nX |jjd,}|sxtd-d.dS |d/krtjj|td0}n|d	krtjj|td1}y|r>|d- j}|d- j}t | t | tjj }t | tjd2}t d3 |j|}t | t d4 t d5 t d6 ||kr.||k r.d-d7l m!} |j"jd8}|r|j} t d9 t |  t d9 | j#d:} t$| dj }!d-d l%}"|"j&|j' }#t d6 t |# |j(|#}$t d< d-d l) d-d l*d=j+ fd>d?t,d@D }%t-jj. }&t dA x|&D ]x}t |j/|j0 |j(|#}$|$j1t2|j/t2|j0g|j3}'|$jt$t4j5dB t$|j/ dC t$|j0 dD |% d: |! }'qW |j(|#}$|$jt$t4j5dE |% d: |!  |%d: |! } t |  |jjdF}(|(std-dGdS dH|( }(|jjd}|std-dIdS |jjdJ})|)s0td-dKdS |jjdL}*|jjdM}+|+s\td-dNdS |jjdO},|,s|td-dPdS |jjdQ}-|-std-dRdS |jjdS}.|.std-dTdS |jjdU}/|/std-dVdS yB|/j#dW}/t$|/d; dW t$|/d-  dW t$|/dX  }/t6|/}0W n   td-dYdS t |0 |rltjj|dZj| |(||)|*|+|,|-|.|0d[
 n&tjj|dZj|(||)|*|+|,|-|.|0d\	 tjj|dZ}1|1d- j}2t$t4j7dE |1d- j8j }t |2 d=}3d=}4t d] t$t4j9}5d^d%d_d`d'da}6t:|5dbj;|2|3|4|6dc}7t |7 t dd td(de|dfS td-dgdS ntd-dhdS W n0 tk
r~ } ztd-t$|dS d }~X nX d S )kNzUpdateProfile - in postc:\c                sV  t | t d t d | jd}t d |d }t d |jd}t d t | t|d	 }t d
 |d	 }t d tj|}t d t|}t d ddlm}	 dd ldd l	dd l
t d |	j|}
t d tjj|d}djfddtdD }tjj }ttjd t|j d t|jj  jj rz fddj D }x$|D ]}j| qdW n
j  xl|D ]d}|	j|}
|
jt|jt|j g|	j!}|
j" d t|j d t|j  d | d | }qW |	j|}
|
j" d | d |  dt|j d t|jj d | d | }||_#|j"  dS )Nz

rt  z;base64,rD  r   ro  r   rp  r'   r~  r  67)r   89)r(   r   c                s   g | ]} j jj qS r$   )r:  r<  r=  )r>  r?  )r9  r;  r$   r%   r@  Y  s    zAUpdateProfile.post.<locals>.getI420FromBase64.<locals>.<listcomp>r   z/media/Users/Customers/_c                s   g | ]}j j |qS r$   )rK  rH  )r>  rU  )rQ  rG  r$   r%   r@  ]  s    r	   rh   .z
/original-)$r_   rn   r!   rV  rW  r   rX  r   r;  r9  rG  rY  r   rA   r   rH  rI  rZ  r   r   rJ  r(   r   r   rK  rL  r[  r\  r  r]  r"   r   r   r^  r]   r   )r_  r   r`  ra  rb  rc  rd  re  rf  r   rg  r   rP  rh  ri  rU  objrj  rS  r$   )rQ  rG  r9  r;  r%   rk  ?  sT    




(



<
.z-UpdateProfile.post.<locals>.getI420FromBase64r   r   rG  rC  r   r  r  i  zUser not logged in)r   r  zName is requiredzCountrycode is required)r   r   zPhone Number is requiredzEmail is required)r   )r(   )r   zdata:image/png;base64,zbefore function call)r   zafter function callr   r{  r|  r}  r~  r  r  )rw   )r{  r   r  r~  r  r  rw   Zprofiler  z$Your profile is updated successfullyr   zprofile updated successfullyi  zInternal Server ErrorZotponr   zotpon Emptymobile)rt  Z	mobileOTP)rt  ZupdateprofileOTPzAsia/Kolkatart  rD  ro  rp  )r   r   r  r  r'   r~  r   c                s   g | ]} j jj qS r$   )r:  r<  r=  )r>  r?  )r9  r;  r$   r%   r@    s    z&UpdateProfile.post.<locals>.<listcomp>r   zbeforee resizingz/media/r	   rh   z/media/original-Zcountry_codezCountry code is required+zMobile number is requiredadd1zAddress line 1 is requiredadd2countryzCountry is requiredstatezState is requiredcityzCity is required
postalcodezPostal code is requireddobzDate of birth is requiredr   r   z+Date of birth format should be (mm/dd/yyyy))rt  )
r   rG  rC  addressline1addressline2r  r  r  r  dateofbirth)	rG  rC  r  r  r  r  r  r  r  z####ZnormalnoZAirdely)appr  Z
sendparceltitler  )r   )Zregistration_idmessage_titlemessage_bodydata_messagezprofile updatedzProfile updated successfully)r   r  r   zOTP has expiredzInvalid OTP)r  )<r_   r   r   r   r   rA   rB   rC   r   r   r   r   rG  rC  r  r]   r(   r   r  r4  r   r  r^   MainUserr  ZupdateprofileOTP_starttimeZupdateprofileOTP_expiretimer  r  r  r  localizerX  r   FILESrn   r!   ior   readrY  r9  r;  rH  rI  rZ  r   r   r   r]  r"   r^  r   rJ  parseZBASE_URLr   FIREBASE_SERVER_KEYr   Znotify_single_device)8r   r   r   r   rk  r   r  r  r  r   address_valr  r   r   r   r_  r{  r|  r}  r~  r  r  r  rd   Zotponon_valr  r  r  r  utcr   r   rS  rd  r  rf  rg  rP  rh  rj  Zcountry_code_valr  r  r  r  r  r  Zdob_valr  main_user_objZmain_user_obj_fcmtokenr  r  Z
server_keyr  r  r$   )r9  r;  r%   r   ;  s@   
. 











B
 
,*&

zUpdateProfile.postN)r   r   r   r   r$   r$   r$   r%   r  9  s   r  c               @   s   e Zd Zdd ZdS )ForgotPasswordc             O   s  t d t d|j y|jjd}|jjd}|sBtdddS |sTtddd	S tjj|d
j }|rt d |dkrt d tjj|dj }nJ|dkrt d t	jj|ddj }n$|dkrt d t	jj|ddj }|rt d dj
dd tdD }d| d t|j d | }	ttj|	 }
d|
 }|	|_|j  t d td|dt|gd d! t d" td#d$dS tdd%dS ntdd&dS W n8 tk
r } zt | td't|d	S d }~X nX d S )(Nz



zdata is  : r  r   i  zUser Role is required)r   r   zEmail Address is required)r   r  )r   zfirst-0r)   zfirst-0-driver)r   rw   zfirst-0-customer)r   r   r   zfirst-0-companyzfirst-0-2.0r   c             S   s   g | ]}t jtjtj qS r$   )r9  r:  r;  r<  r=  )r>  r?  r$   r$   r%   r@  E  s    z'ForgotPassword.post.<locals>.<listcomp>r   z/user/z/forgot/r   z,
Forgot your Password click following link:
zfirst-3zForgot Password:ztestdemotest11@gmail.comT)r  zfirst-4r   zLink sent on email addresszNot find any UserzUser does not existi  )r_   r   r   r   r   rA   rB   rC   r@   r   rH  rI  r!   r   r   r  Zforgot_password_linkr]   r   r^   )r   r   r   r   r  r   r   Zuserrole_objZran_numr  r  r  rd   r$   r$   r%   r   ,  sL    zForgotPassword.postN)r   r   r   r   r$   r$   r$   r%   r  *  s   r  c               @   s   e Zd Zdd ZdS )UpdatePasswordc             O   s  t d t d|j y\|jjd}|jjd}|jjd}|jjd}|sZtddd	S |sltdd
d	S |s~tddd	S |stddd	S tjj|dj }|rb|dkrtddd	S |dkrtddd	S |	d jdk rt d tddd	S |	d jdkrpt d t	j
|}
t |
 tjj|d}	|	rR|	j|
d tddd	S tddd	S ntddd	S W n8 tk
r } zt | tdt|d	S d }~X nX d S )Nz



zdata is  : r  r   r  r  r   zUser Role is required)r   r  zEmail is requiredzOTP is requiredzNew password is required)r   rw   z%User is disabled. Contact SuperAdmin.r   rt  zUser is not registered with us.rD  )r  r   zPassword updated successfullyzPassword not updatedzInvalid OTP)r_   r   r   r   r   rA   rB   rC   r   handlerhashr  r4  r^   r!   )r   r   r   r   r  r   r  r  r   r  Znew_password_valrd   r$   r$   r%   r   \  sJ    
zUpdatePassword.postN)r   r   r   r   r$   r$   r$   r%   r  Y  s   r  c                   s,   e Zd ZdZdZdd Z fddZ  ZS )CustomerRegistrationzJThis API class saves the registration details of customer or company userszcustomer_registration.htmlc             O   s  yt d|j |jjd}|s.tdddS |jjd}|sLtdddS |jjd}|sjtdd	dS |jjd
}|stdddS |jjd}|stdddS d|krd| }|jjd}	|	stdddS |jjd}
|
 stdddS |jjd}|stdddS |dkr|jjd}|s>tdddS |jjd}|s^tdddS |jjd}|stdddS nJ|dkr|jjd}|stdddS |jjd}|stdd dS t d! tjj|d"j }|rtdd#dS |jjd$}|stdd%dS tjj||	 d&|d'j }|rzt	j	j
tjd(}t | t |j t |j ||jkrj||jkrjd)|_|j  tjj|||
||d*}|r\|d+krtjj|||	|d,}|r\td-d.dS n|dkrtjj|||	|||d/}|r\td-d.dS nH|dkrNtjj|||	||||d0}|r\td-d.dS ntdd1dS tdd2dS tdd3dS ntdd4dS W n8 tk
r } zt | tdt|dS d }~X nX d S )5Nzdata is  : r  r   zUser Role is required)r   r   Z	firstnamezFirst Name is requiredlastnamezLast Name is requiredr   zEmail Address is requiredrG  zCountrycode is requiredr  rC  zPhone number is requiredr  zPassword is requiredr  zAddress is requiredr)   r   zVehicle Type is requiredry  zVehicle Number is requiredrz  zPreferred Area is requiredr   ZcompanynamezCompany Name is required	tinnumberzTIN Number is requiredrt  )r  zUser exists.r  zOTP is requiredr  )r  r  r  UTCT)r  r   r  Z
first_name	last_namerw   )r   rG  rC  r  r   zRecord added successfully.)r   rG  rC  r  r   r  )r   rG  rC  r  r   ry  rz  zRecord not created.zSome backend error occurred.zOTP has been expired.zInvalid OTP.)r_   r   r   r   r   rA   rB   rC   r  r  r  r  r  r  r  r  r]   r  r   r   ZCompanyr@   r^   r!   )r   r   r   r   r  Zfirstname_valZlastname_valr   r  r  rv  r  r  r  r  Zcompanyname_valZtinnumber_valr   r  r  Zcurrentdatetimer   Zcompany_objrb   rd   r$   r$   r%   r     s    






zCustomerRegistration.postc                s   t t| jf |}td |S )NzCustomerRegistration-in get )superr  get_context_datar_   )r   r   r  )	__class__r$   r%   r    s    z%CustomerRegistration.get_context_data)r   r   r   r   template_namer   r  __classcell__r$   r$   )r  r%   r    s   Zr  c               @   s   e Zd ZdZdd ZdS )GetFareszMThis class is being used to return fares according to different vehicle typesc       #      O   s  yJt d |jjd}|jjd}|jjd}|jjd}|jjd}|jjd}	|jjd}
|jjd	}|jjd
}|jjd}|jjd}|jjd}|jjd}|jjd}|jjd}|jjd}|stdddS |stdddS |stdddS |stdddS |s,tdddS |	s@tdddS |
sTtdddS |shtdddS |s|tdddS |stdddS |stdddS |stdddS g }yJd }|jd!d"}|jd#d"}|jd!d"}|jd#d"}|}|}d$}t | t |d% | d& | d' |  tj|d% | d& | d' | }|j }t | t d( |d) d*krd+}t|d, d- d. d- d/ d0 | }t | tj	j
d1d2}|rxN|D ]4}|}||jkr|j} nz|j} t d( t |j t |  ||j }t | |t|kr(t|d3 }n|}t | t |j | ||j  } t |  ttj}!|jd4krt|!d57 }!nV|jd6kr|!d77 }!n@|jd8kr|!d97 }!n*|jd:kr|!d97 }!n|jd;kr|!d<7 }!|j|jttt| d=|j|!d> qW ntdd?dS W n4 tk
r< }" zt |" tdd?dS d }"~"X nX td@dA|dBS  tk
r }" zt |" tdCdDdS d }"~"X nX d S )ENzGetFaresTest API- in post r   r   r   r   r   r   r   r   r   r   r   r  r   r   r   r  i  zUser not logged in.)r   r   zsendername_val is requiredzSender countrycode is requiredzSender phone number is requiredzpickupaddress_val is requiredzsendercity_val is requiredznoofparcels_val is requiredzparceltype_val is requiredzrecipientname_val is requiredz!recipient countrycode is requiredzrecipientphone_val is requiredzdropaddress_val is required'AIzaSyCZt3wR3ItaSSmIhWnRy4hy6FnqmEM81oYr   r   r   z9https://maps.googleapis.com/maps/api/distancematrix/json?zorigins=z&destinations=z&key=r  r   r!  gobyp\D?r"  r   r#  r  r$  r  )r  r'   r%  z/static/images/bike.pngr&  z/static/images/car.jpgr'  z/static/images/smallvan.pngr(  r)  z/static/images/largevan.jpgr   )r   r   rx  r   zEnter valid addressr   zSuccess.)r   r   r   i  zInternal Server Error)r_   r   r   r   r    r+  r  r  r  rA   rB   r  r  r   r"   r  r!   r   r  r   r,  rx  r^   )#r   r   r   r   r   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r   r   r/  rR  r  r0  r1  r2  r  vehicler  r  r   rd   r$   r$   r%   r     s     "$







.zGetFares.postN)r   r   r   r   r   r$   r$   r$   r%   r    s   r  c               @   s   e Zd ZdZdd ZdS )GetFaresTestzMThis class is being used to return fares according to different vehicle typesc       $      O   s  yt d t d dd }dd }|jjd}|jjd}t d	 t t| tj|}t d
 t | d}ttj}	g }
d}x|D ]}t d y|d dkr|d7 }W n* t	k
r } zt | W Y d d }~X nX |d }|d }|d }|d }|d }|d }t
jj||||ddj }|r:t d |j}nlt d |d d |d  }|d d |d  }|||d\}}}t ||| |dkr|}ntddd S tjjdd!d"j }tjjdd!d"}|rBxn|D ]d}||jkr|j}nr|j}t d t |j t | ||j }|t|kr8t|d }n|}t | t |j |||j  }t | ttj}|jd#kr|d$7 }nV|jd%kr|d&7 }n@|jd'kr|d(7 }n*|jd)kr|d(7 }n|jd*kr|d+7 }t|
|k r|
j|jtt|d,||jd- n0x.|
D ]&} | d. |jkr| d/  |7  < qW qW t |
 qW tjjd0d1j }!|!rn|!j}"nd2}"||" }#tdd3|
|#d4S  t	k
r } zt | td5d6d S d }~X nX d S )7NzGetFaresTest API- in post z

c             S   sh  y6t tj}d}| r\|r\t|d |  d | d |  tj|d |  d | d | }|j }t| td |d dkr2d}t|d	 d
 d d
 d d | }t | jdd
 }t | jdd }	t |jdd
 }
t |jdd }t	||	|
||d|d	 d
 d d
 d d d}|j
  dd|fS dS W n* tk
rb } zt| dS d }~X nX d S )Nz9https://maps.googleapis.com/maps/api/distancematrix/json?zorigins=z&destinations=z&key=r  r   r!  gobyp\D?r"  r   r#  r  r$  r4  r'   r  duration)r   r   r   r   r  r  r  r   r     Enter valid addressr   )r  r  r   )r  r  r   )r!   r   r*  r_   r+  r   r  r  rn   r  r]   r^   )r-  r.  r   rR  r  r0  r1  r2  r   r   r   r   r  rd   r$   r$   r%   getdistancebetweentwolocations  s.    
 "$.
z9GetFaresTest.post.<locals>.getdistancebetweentwolocationsc             S   s   g }y~t jjd|dj }|rp| }||jkr4|j}n<|j}||j }|t|kr^t|d }n|}|||j  }ddtt	|dfS  t
k
r } zt| dd|fS d }~X nX d S )	Nr  )r  r   r'   r   r   r   i  zEnter valid address)r  rA   rB   rC   r  r  r"   r  r,  r  r^   r_   )r2  r  r   r  r  r  rd   r$   r$   r%   'calculatefarefromdistanceforvehicletype  s"    

zBGetFaresTest.post.<locals>.calculatefarefromdistanceforvehicletyperl  r   rt  rD  g        r   r  r   r  r'   r   r  r   r   r   r   r  )r   r   r   r   r  zdistance found in DistanceTablez#distance not found in DistanceTabler4  )r-  r.  r   i  z1Please select same country for pickup and dropoff)r   r   F)r  r   r%  z/static/images/bike.pngr&  z/static/images/car.jpgz	Small Vanz/static/images/smallvan.pngz
Medium Vanz	Large Vanz/static/images/largevan.jpgr   )r   r   r   rx  r   r   zSpecial Booking Charges)r   r0   zSuccess.)r   r   r   rZ  i  zInternal Server Error)r_   r   r   r  r  r  r!   r   r*  r^   r  rA   rB   rC   r  r   r  r  r  r  r   r"   r  r  r
  r   r,  r  rx  r   r   )$r   r   r   r   r  r  rl  r  Ztotal_pricer   r   Znoofparcels_forspecialbookingr  rd   r  r  r  r  r  r  r  r  r-  r.  r   r   r2  Zvehicle_countr  r  r  r   itemr   ZspecialbookingchargesrZ  r$   r$   r%   r     s    "










$
zGetFaresTest.postN)r   r   r   r   r   r$   r$   r$   r%   r    s   r  c               @   s   e Zd ZdZdd ZdS )
PlaceOrderzQThis class is being used to save the customer job request details in the databasec       .   C   O   sT  t d t d ydd }dadd}|jjd}|jjd	}|jjd
}|jjd}	|jjd}
|jjd}|jjd}|jjd}|jjd}|jjd}|jjd}|jjd}|jjd}|jjd}|jjd}|jjd}|jjd}|jjd}|jjd}|jjd}|jjd}|jjd}|jjd}|jjd}|jjd }|sftd!d"d#S |sztd!d$d#S |	std!d%d#S |
std!d&d#S |std!d'd#S |std!d(d#S |std!d)d#S |std!d*d#S |std!d+d#S |std!d,d#S |s.td!d-d#S |sBtd!d.d#S |sVtd!d/d#S |sjtd!d0d#S |ry:t | d1t_tjjtt	|d2 d3d4|d5}t | W n. t
k
r }  zt d6|  W Y d d } ~ X nX d7}!t d8 tjj|d9j }"t d: |"rt d; |"j}#tjj|#d<j }$t d= |$rt d> tjj|d?j }%|%rt d@ tjj||	|
|||||||||!|||||$|%|dA}&|r||&_||&_||&_||&_|&j  y8tjj|&jdBdCdDdEdF tjj|"j|&jdBdCdGdEdH W n, t
k
r }  zt |  W Y d d } ~ X nX yt|$jdIdJdKdL W n, t
k
r\ }  zt |  W Y d d } ~ X nX |rdM| }'t dN ||'|&jdO t dP y||&jdO t dP W n, t
k
r }  zt |  W Y d d } ~ X nX tdQdR|&jdSS ntd!d"d#S tdTdUd#S |std!d"d#S tjj }"tjjtdWj }(|(r
tjj|(dBdXj }$|$rtjjdYt dZj! })|)r|)j"}*|)j#}+t |* t |+ t$t%j&},t'j'j(t)j*|,}-t |- |-|*kr|-|+k rdB|)_+|)j  tdQd[d#S td\d]d#S ntd\d^d#S ntd\d_d#S ntd`d"d#S W n4 t
k
rN }  zt |  tdTdUd#S d } ~ X nX d S )bNz

zPlaceOrder API - in postc       	      S   s   t |  dd l}dd l}dd l}tjj| d}djdd tdD }t	t
jd t	|j }|jj|rln
|j| |jdt	|  d	}|j|d
 dd dt	|j d
 }||_|j  dS )Nr   )r(   r   c             S   s   g | ]}t jtjtj qS r$   )r9  r:  r;  r<  r=  )r>  r?  r$   r$   r%   r@  :  s    z;PlaceOrder.post.<locals>.generateqrcode.<locals>.<listcomp>r   z/media/CustomerJobs/zAWB-)rB  z/qrcode.pngr.   )rC  rD  )r_   rE  rF  rG  rj   rA   r   rH  rI  r!   r   rJ  r(   rK  rL  r  r   rO  r]   )	r   rE  rF  rG  r   rP  rQ  rR  rS  r$   r$   r%   r   5  s    
z'PlaceOrder.post.<locals>.generateqrcodec:\c                sp  t | | jd}|d }|jd}t|d }|d }tj|}t|}ddlm}	 dd ldd l	dd l
|	j|}
tjj|d}djfdd	td
D }tjj }ttjd t|j  jj r fdd	j D }x"|D ]}j| qW n
j  |	j|}
|
jddg|	j}|
j d d | }dt|j d d | }||_|j  dS )Nz;base64,r   r   r'   )r   )r(   r   c                s   g | ]} j jj qS r$   )r:  r<  r=  )r>  r?  )r9  r;  r$   r%   r@  W  s    z>PlaceOrder.post.<locals>.getI420FromBase64.<locals>.<listcomp>r   z/media/CustomerJobs/c                s   g | ]}j j |qS r$   )rK  rH  )r>  rU  )rQ  rG  r$   r%   r@  [  s    i  zparcelimage.rD  )r_   rn   r!   rV  rW  r   rX  r   r;  r9  rG  rY  rj   rA   r   rH  rI  rZ  r   r   rJ  r(   rK  rL  r[  r\  r  r]  r^  r]   r   )r_  r   r`  ra  rb  rc  rd  re  rf  r   rg  r   rP  rh  ri  rU  rj  rS  r$   )rQ  rG  r9  r;  r%   rk  J  s6    







z*PlaceOrder.post.<locals>.getI420FromBase64r   rm  r   r   r   r   r   r   r   r   r   r   r   r   r  r   r   r   r  r  r   r   r   r   r  i  zUser not logged in.)r   r   zsendername_val is requiredzSender countrycode is requiredz"Sender senderphone_val is requiredzpickupaddress_val is requiredzsendercity_val is requiredznoofparcels_val is requiredzparceltype_val is requiredzrecipientname_val is requiredz!recipient countrycode is requiredzrecipientphone_val is requiredzdropaddress_val is requiredzvehicletype_val is requiredzprice_val is requiredr  ru  ZeurzParcel Payment)rw  rx  ry  r   zException in creating charge = r'   rt  )r   rD  ro  )r  rp  r~  )r   r  )r   r   r   r   r   r   r   r   r   r   r   r  r   r   r   r   rw   r   r   TzParcel Job Createdz"You have created one parcel order.r  )r%  r  r  r  r   z&Customer has created one parcel order.)r   r%  r  r  r  r   rw   r  r  z*Your parcel details are saved successfullyzdata:image/png;base64,zbefore function call)r   zafter function callr   zSuccess.)r   r   r  i  zInternal Server Errorzraheja@yopmail.com)r  )r   r  r  )r  r  zUser registered successfully.r   zOTP has expired 1zInvalid OTPzCustomer exists.i  )r  ),r_   r   r   r   r   r   r  r   r"   r  r^   r   rA   rB   rC   r   r   r  rj   r   r   r   r   r]   r  r(   r   r   r  r   r   r  r  r  r  r  r!   r   r  r  r  r  r  r  ).r   r   r   r   r   rk  r   rm  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rd   r  r   r   r   r  r   r_  r   r  r  r  r  r  r$   r$   r%   r   .  s   
!2   

zPlaceOrder.postN)r   r   r   r   r   r$   r$   r$   r%   r  +  s   r  c               @   s   e Zd Zedd ZdS )	SignUpOTPc             O   s\  t d yt d|j |jjd}|s6tdddS |jjd}|sTtdddS |jjd	}|srtdd
dS d|krd| }|jjd}|stdddS |jjd}|stdddS |jjd}	|	stdddS t | t | tjj|dj }
|
rtdddS tjj|||d}
t	jj|
dd}|rHtdddS t	jj
|
|||	d}|rd}d}x,tdD ] }||tjtj d  7 }qtW t d| tjj }tjj tdd }t d  d!}tjj
|||||d"}t d# td$d%dS tdd&dS t d' td$d$d(S W n8 tk
rV } zt | tdt|dS d }~X nX d S ))Nz



zdata is  : r   r   zName is required)r   r   r   zEmail Address is requiredrG  zcountrycode is requiredr  rC  zPhone number is requiredr  zPassword is requiredr  zAddress is required)r  zUser exists.)r  r   r  T)r   r  zCustomer exists.)r   rG  rC  r  
0123456789r   r,   r0   zOTP of 5 digits:r4   )minutesrD  r  )Zcontent_objectr  r  r  r  ro  r   zOTP sent on phone.zRegisteration not successfull.rp  )r   r   )r_   r   r   r   r   rA   rB   rC   r  r   r   rI  r   floorr9  r  r  r
   r  r^   r!   )r   r   r   r   r  r   r  r  rv  r  r   r   r=  r  r  
start_timeZexpire_timer  r  rd   r$   r$   r%   r     sh     

zSignUpOTP.postN)r   r   r   r   r   r$   r$   r$   r%   r    s   r  c               @   s   e Zd Zedd ZdS )SignUpc             O   s  t d t d|j yX|jjd}|s6tdddS |jjd}|sTtdddS |jjd	}|srtdd
dS tjj|dj }|r^tjj|ddj }|rNt	jjd|dj
 }	|	r>|	j}
|	j}t |
 t | ttj}tjjtj|}t | ||
kr.||k r.d|	_|	j  tdddS tdddS ntdddS ntdddS ntdddS W n@ tk
r } z"t | tdt|dt|dS d }~X nX d S )Nz



zdata is  : r   r   zEmail Address is required)r   r   r  zOTP is requiredr  zfcmtoken is required)r  F)r   r  r  )r  r  Tr   zUser registered successfully.zOTP has expired 1zInvalid OTPzCustomer exists.zOTP has expired)r   r  r   r   )r_   r   r   r   r   rA   rB   rC   r   r  r  r  r  r!   r   r  r  r  r  r  r  r]   r^   )r   r   r   r   r   r  rw  r   r   r  r  r  r  r  rd   r$   r$   r%   r   c  sH    
zSignUp.postN)r   r   r   r   r   r$   r$   r$   r%   r  _  s   r  )iZdjango.shortcutsr   Zrest_framework.viewsr   django.httpr   django.views.decorators.csrfr   django.contrib.auth.modelsr   django.contrib.authr   Zrest_framework.authtoken.modelsr   ZCustomer.modelsZDriver.modelsZAdminApp.modelsr   r9  r  r  r;  r
   django.confr   django.core.mailr   rV  r  r   rX  r   r+  r  ZCustomer.commonfunctionsr   r   r   r   ZAdminApp.adminfunctionsr   Zpyfcmr   Zdjango.contrib.auth.hashersr   r   sysdjango.db.modelsr   r   r&   re   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r#  r-  r2  r7  r8  r  r  r  r  r  r  r  r  r  r  r  r5  r6  rP  rQ  rS  rU  rV  rW  rX  r^  rr  rx  r  r  r  r  r  r  r  r  r  r  r$   r$   r$   r%   <module>   s   (>,F>$<,, !}h.$1)  K  6    T      +&!d qzoOWH9  4\P r/8d  $ nG