o
    Dkhd~                     @   s  d dl Z d dlmZmZ d dlmZmZmZmZm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mZ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$m%Z%m&Z& ddl'm(Z(m)Z) ddl*m+Z+m,Z,m-Z-m.Z. G dd deZ/G dd deZ0G dd deZ1G dd deZ2G dd deZ3G dd deZ4G dd  d eZ5G d!d" d"eZ6d dl7Z7d#d$ Z8dS )%    N)datetime	timedelta)parse_qsquote	urlencodeurlparse
urlunparse)settingsstatus)ValidationError)PageNumberPagination)AllowAnyIsAuthenticated)Response)APIView)ViewSet)JWTAuthentication)RefreshToken)extract_product_info   )ProductScrapeTaskUser)ProductScrapeTaskSerializerUserSerializer)run_1688_scrapperrun_alibaba_scraperrun_made_in_china_scraperscrape_imagesc                   @   s(   e Zd ZdZdZdZdZdZdd ZdS )	StandardPaginationz!
    Global pagination class
       limitd   current_pagec              	   C   sZ   t | dstddg dtjdS tdd|| jj| | j| jjj	| jjj
dd	tjdS )
NrequestFzInternal Server Errorsuccessmessagedatar
   TzData fetched successfullyr#   r!   counttotal_pages)r&   r'   r(   
pagination)hasattrr   r   HTTP_500_INTERNAL_SERVER_ERRORpagenumberget_page_sizer$   	paginatorr*   	num_pagesHTTP_200_OK)selfr(    r6   $/var/www/Befach/backend/bot/views.pyget_paginated_response"   s(   


z)StandardPagination.get_paginated_responseN)	__name__
__module____qualname____doc__	page_sizepage_size_query_parammax_page_sizepage_query_paramr8   r6   r6   r6   r7   r      s    r   c                   @   s8   e Zd ZegZegZdd Zdd Zdd Z	dd Z
d	S )
ScraperViewc              
   C   s   z:|j d}|stdddddW S | dkr| |W S |dd	}| d
kr1| |W S tdddddW S  tyW } ztdt|dddW  Y d }~S d }~ww )NsourceFzSource is required.r&   r'   i  r
   alibaba  madeinchinazUnsupported source.i  )	r(   getr   lowerscrape_alibabareplacescrape_made_in_china	Exceptionstr)r5   r$   rB   er6   r6   r7   post:   s   "zScraperView.postc              
   C   s  zi }|j }|d}|stdddtjdW S |d}d}|dr+|d |d< |d	r7t|d	 }nd
}|drEt|d }nd}t|dkrXtdddtjdW S |d
 }	|	d7 }	d
}
||
 d }||
 }|| |
 d |
 }	|drd|d< |drd|d< |drd|d< |drd|d< |d}|dv rt||d< |drd|d< |d }|rt||d!< |d"}|rt||d#< |d$}|rd%| |d&< |d'}|r||d(< |d)}|r	t|trd*	|}t
|d*d+|d,< nt
|d*d+|d,< |d-}|r-t|tr%d*	|}t
|d*d+|d.< nt
|d*d+|d.< |d/}|rQt|trId*	|}t
|d*d+|d0< nt
|d*d+|d0< t|}t|j}|| d1d2 | D }t|d3d4}t|j|j|jd5|d5f}tjj|j||d6d7}t|||j|jj|	||| td3d8t|j d9tjdW S  ty } zdd l}t d: |!  tdt|dtj"dW  Y d }~S d }~ww );NqueryFMissing query in request body.rC   r
   rB   %https://www.alibaba.com/trade/search?
SearchTextnum_products0   skipr     Maximum products length is 1000r   trade_assuranceytaverified_suppliertrueassessmentCompanyverified_pro1verifiedPromerge_by_suppliermergeResultreview_score4z4.55reviewScorepaid_sample
freeSample	min_pricepricef	max_pricepricetmoqMOQTmoqtsupplier_country_regioncountryexported_to,safeexportCountrymanagement_certificatecompanyAuthTagproduct_certificateproductAuthTagc                 S   (   i | ]\}}|t |tr|n|d  qS r   
isinstancerN   .0kvr6   r6   r7   
<dictcomp>      ( z.ScraperView.scrape_alibaba.<locals>.<dictcomp>TdoseqrF   IN_PROGRESSusersearch_paramsrB   r   Scrapping Started Successfullyr%   zException occurred:      )#r(   rH   r   r   HTTP_400_BAD_REQUESTintrN   r   listjoinr   r   r   rQ   updateitemsr   r   schemenetlocpathr   objectscreater   r   delayidr   r4   rM   	tracebackprint	print_excr.   r5   r$   paramsfilterssearch_namerB   urlrU   skip_productsr3   products_per_page
start_pageskip_in_pagere   rl   rn   rp   rt   export_countriesjoined	mgmt_cert	prod_certparsedoriginal_query
flat_query	new_query	final_urlscrape_taskrO   r   r6   r6   r7   rJ   L   s   






















$zScraperView.scrape_alibabac              
   C   6  zp|j }|d}|stdddtjdW S |d}|dr't|d }nd}|d	r5t|d	 }nd
}t|dkrHtdddtjdW S |}tjj|j	||dd}t
||j|j	j||| tddt|j dtjdW S  ty }	 zd
d l}
td |
  tdt|	dtjdW  Y d }	~	S d }	~	ww NrQ   FrR   rC   r
   rB   rU      rW   r   rX   rY   r   r   Tr   r%   Exception occurred:)r(   rH   r   r   r   r   r   r   r   r   r   r   r   r   r4   rM   r   r   r   rN   r.   r5   r$   r   r   rB   rU   r   r   r   rO   r   r6   r6   r7   rL      `   




$z ScraperView.scrape_made_in_chinac              
   C   r   r   )r(   rH   r   r   r   r   r   r   r   r   r   r   r   r   r4   rM   r   r   r   rN   r.   r   r6   r6   r7   scrape_1688%  r   zScraperView.scrape_1688N)r9   r:   r;   r   permission_classesr   authentication_classesrP   rJ   rL   r   r6   r6   r6   r7   rA   6   s     ErA   c                   @       e Zd ZegZegZdd ZdS )AlibabaScrapperViewc              
   C   s  zi }|j }|d}t|d |s tdddtjdW S |d}|dkr+d}|d	kr2d}nd
}|dr?|d |d< |drKt|d }nd}|drYt|d }nd}t|dkrltdddtjdW S |d }	|	d7 }	d}
||
 d }||
 }|| |
 d |
 }	|drd|d< |drd|d< |drd|d< |drd|d< |d}|dv rt||d < |d!rd|d"< |d#}|rt||d$< |d%}|rt||d&< |d'}|rd(| |d)< |d*}|r||d+< |d,}|rt|t	rd-
|}t|d-d.|d/< nt|d-d.|d/< |d0}|rAt|t	r9d-
|}t|d-d.|d1< nt|d-d.|d1< |d2}|ret|t	r]d-
|}t|d-d.|d3< nt|d-d.|d3< t|}t|j}|| d4d5 | D }t|d6d7}t|j|j|jd8|d8f}tjj|j||d9d:}t|||j|jj|	||| td6d;t|j d<tjdW S  ty } zdd l }td= |!  tdt|dtj"dW  Y d }~S d }~ww )>NrQ   rB   FrR   rC   r
   1688z7https://s.1688.com/selloffer/offer_search.htm?keywords=zMADE IN CHINArS   rT   rU   rV   rW   r   rX   rY   r   rZ   r[   r\   r]   r^   r_   r`   ra   rb   rc   rd   re   rf   ri   rj   rk   rl   rm   rn   ro   rp   rq   rr   rs   rt   ru   rv   rw   ry   rz   r{   r|   r}   c                 S   r~   r   r   r   r6   r6   r7   r     r   z,AlibabaScrapperView.post.<locals>.<dictcomp>Tr   rF   r   r   r   r%   r   )#r(   rH   r   r   r   r   r   rN   r   r   r   r   r   r   rQ   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r4   rM   r   r   r.   r   r6   r6   r7   rP   o  s   






















$zAlibabaScrapperView.postN)r9   r:   r;   r   r   r   r   rP   r6   r6   r6   r7   r   k      r   c                   @      e Zd ZegZg Zdd ZdS )LoginAPIViewc              
   C   sd  |j d}|j d}|r|stdddtjdS zZtjj|d}||rjt	|}tdd	t
|j d
tjd}t tdd }|jdt|j|dddd t tdd }|jdt||dddd |W S tdddtjdW S  tjy   tdddtjd Y S  ty }	 zdd l}
td |
  tdt|	dtjdW  Y d }	~	S d }	~	ww )NemailpasswordFz Email and password are required.rC   r
   )r   TzLogin successful.r%      )daysaccess_tokenLax)keyvalueexpireshttponlysecuresamesite   refresh_tokenzInvalid credentials.zUser not found.r   z Exception occurred during login:)r(   rH   r   r   r   r   r   check_passwordr   for_userr   r4   r   utcnowr   
set_cookierN   r   HTTP_401_UNAUTHORIZEDDoesNotExistHTTP_404_NOT_FOUNDrM   r   r   r   r.   )r5   r$   r   r   r   refreshresponseexpiryrefresh_expiryrO   r   r6   r6   r7   rP     sX   


$zLoginAPIView.postN)r9   r:   r;   r   r   r   rP   r6   r6   r6   r7   r   
      r   c                   @   r   )VerifyUserAPIViewc                 C   sB   |j }|jr|jrtddt|jdtjdS tdddtjdS )NTzUser is authenticatedr%   r
   FzUser is not authenticatedrC   )	r   is_authenticatedis_staffr   r   r(   r   r4   r   )r5   r$   r   r6   r6   r7   rH   E  s   zVerifyUserAPIView.getN)r9   r:   r;   r   r   r   r   rH   r6   r6   r6   r7   r   A  r   r   c                   @   s@   e Zd ZegZegZeZdd Z	d
ddZ
d
ddZdd	 ZdS )ProductScrapeTaskViewSetc                 C   s   |j }tjj|dd}|  }d }z|||}W n ty/   tddg dt	j
d Y S w |d ur@t|ddj}||S t|ddj}||S )	N)r   z-started_atFzPage not foundr%   r
   T)many)r   r   r   filterorder_bypagination_classpaginate_querysetrM   r   r   r4   r   r(   r8   )r5   r$   r   r(   r2   r/   serialized_datar6   r6   r7   r   X  s(   


zProductScrapeTaskViewSet.listNc              	      s  zJ|st dddtjdW S tjj|d}g }i }|jr9|jjr9|jj}t	
|}|tjd tjd tj d i} fdd|jD |_d|jv rV|d d	d
 |d< |jd}|r|  }|d dj j|}	|d dj j|}
||	|
B  }|jd}|jd}d|jv r|d urzt|}||d t|k }W n ty   tddiw |d urzt|}||d t|k }W n ty   tddiw |jdd}|jdd}zt|}t|}|dkr|dksJ W n ttfy   tdddw t|}|d | }|| }|j|| }|jdd}||||| d | d}t ddt |j!||dd tj"dW S  tj#y]   t dd!d Y S w )"NFTask id is RequiredrC   r
   )pkc                    s   g | ]}  |qS r6   )format_header)r   colr5   r6   r7   
<listcomp>  s    z5ProductScrapeTaskViewSet.retrieve.<locals>.<listcomp>	image_urlc                 S   s    t | tr| dd  S | S )Nrv   r   )r   rN   splitstrip)xr6   r6   r7   <lambda>  s     z3ProductScrapeTaskViewSet.retrieve.<locals>.<lambda>rQ   titlerF   descriptionrl   rn   pricez min_price must be a valid numberz max_price must be a valid numberr#   r   r!      r   z(page and limit must be positive integersrecords)orientr)   TzDate fetched successfully)objectproductsr,   r%   Task not found)$r   r   r   r   r   rH   result_filer   r   pdread_csvrK   npnaninfcolumnsapplyquery_paramsr   rI   fillnarN   containsfloatastype
ValueErrorr   r   AssertionErrorlenilocto_dictr   r(   r4   r   )r5   r$   r   r(   r   r,   	file_pathdfsearch_query
mask_titlemask_descriptionrl   rn   min_price_valmax_price_valpage_numberr=   total_products	start_idxend_idxpaged_dfr6   r   r7   retrieves  s   



z!ProductScrapeTaskViewSet.retrievec              
   C   s   z4|j jstdddtjdW S |stdddtjdW S tjj||j d}|	  tdddtj
dW S  tjyH   tdd	dtjd Y S  tye } ztdt|dtjdW  Y d }~S d }~ww )
NFzPermission DeniedrC   r
   r   r   r   TTask deleted successfullyr   )r   is_superuserr   r   HTTP_403_FORBIDDENr   r   r   rH   deleter4   r   r   rM   rN   r.   r5   r$   r   taskrO   r6   r6   r7   destroy  sD   
$z ProductScrapeTaskViewSet.destroyc                 C   s   t dd|  S )Nz\W+_)resubr   rI   )r5   headerr6   r6   r7   r     s   z&ProductScrapeTaskViewSet.format_headerN)r9   r:   r;   r   r   r   r   r   r   r   r  r  r   r6   r6   r6   r7   r   S  s    

[r   c                   @   r   )LogoutAPIViewc              
   C   s   zt dddtjd}|d |d |W S  tyA } zdd l}td |  t d	t|dtj	dW  Y d }~S d }~ww )
NTzLogout successful.rC   r
   r   r   r   z!Exception occurred during logout:F)
r   r   r4   delete_cookierM   r   r   r   rN   r.   )r5   r$   r   rO   r   r6   r6   r7   rH     s   

$zLogoutAPIView.getN)r9   r:   r;   r   r   r   rH   r6   r6   r6   r7   r%    r   r%  c                   @   s"   e Zd ZegZegZdddZdS )ProductScrapperDeleteAPIViewNc              
   C   s   z%|st dddtjdW S tjj||jd}|  t dddtjdW S  tj	y9   t dddtj
d Y S  tyV } zt dt|dtjdW  Y d }~S d }~ww )	NFr   rC   r
   r  Tr  r   )r   r   r   r   r   rH   r   r  r4   r   r   rM   rN   r.   r  r6   r6   r7   r    s6   
$z#ProductScrapperDeleteAPIView.deleter$  )r9   r:   r;   r   r   r   r   r  r6   r6   r6   r7   r'    s    r'  c           
      C   s   z	t jj| d}W n t jy   td Y d S w t|j}g }g }|jddD ]$}|j	}|rM|
| t|}|di d}|j}	|
||	d q)t| | d S )N)r   r   F)indexproductimages)
image_urls
product_id)r   r   rH   r   r   r   r   r   
itertuplesURLappendr   IDr   )
task_idr  r  	prod_urlsimages_tasksrowr   resultr*  r,  r6   r6   r7   scrape_images_func  s,   
r6  )9r!  r   r   urllib.parser   r   r   r   r   numpyr   pandasr   django.confr	   rest_frameworkr   rest_framework.exceptionsr   rest_framework.paginationr   rest_framework.permissionsr   r   rest_framework.responser   rest_framework.viewsr   rest_framework.viewsetsr   'rest_framework_simplejwt.authenticationr   rest_framework_simplejwt.tokensr   bot.utils.scrape_detailsr   modelsr   r   serializersr   r   tasksr   r   r   r   r   rA   r   r   r   r   r%  r'  uuidr6  r6   r6   r6   r7   <module>   sB      7  7 