
    Rkh*                        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mZmZmZmZ d dlmZ d d	lmZmZ d d
lmZmZmZ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%m&Z&m'Z' d dl(m)Z) d dlm	Z	 	 	 	 	 d'dedede*de*de'e+   de,de&fdZ-d(de.fdZ/d Z0dede*defdZ1dededefdZ2dede*dedefdZ3dede*ddfdZ4ded e+fd!Z5ded"e'e+   de&e*e f   fd#Z6dede*d$e'e*   fd%Z7dede*fd&Z8y))    )datetime)UUID)Session)HTTPExceptionstatus)APIException)QueryPaginator)funccastIntegerand_or_)	WordAlias)	WorkGroupWorkGroupWebCrawler)WorkGroupCreateSchemaWorkGroupOutputSchemaWorkGroupUpdateSchemaWorkGroupFilterSchema!WorkGroupWebCrawlerAdditionSchemaWorkGroupWebCrawlerUpdateSchemaWorkGroupWebCrawlerOutputSchema)
WebCrawler)API_PREFIXES)settings)DictList)	nullslastNdbpayloadpageper_pagesort_by	paginatedreturnc           
         K   	 | j                  t              j                  t        j                  j	                  d            }t        ||      }t        |      }|r |j                  | }n6|j                  t        t        j                  j                                     }|s3|j                         }|D 	cg c]  }	t        j                  |	       c}	S |dz
  |z  }
t        |t        dj                  t!        t#        j$                               t&        j(                  g      |
|d      }|j+                         S c c}	w # t,        $ r-}t/        ddt!        |      it0        j2                  d	      d}~ww xY ww)
zc
    Get all work groups with pagination and filtering.
    Returns all if paginated is False.
    N    T)queryschemaurloffsetlimituse_ormget_all_work_groups_service	exceptionzFailed to get all work groupsmoduleerrorstatus_codemessage)r)   r   filter
deleted_atis_apply_work_group_search_filterbuild_work_group_sort_queryorder_byr   nameascallr   model_validater	   joinstrr   api_base_urlr   
WORK_GROUPpaginate	Exceptionr   r   HTTP_500_INTERNAL_SERVER_ERROR)r   r    r!   r"   r#   r$   r)   
sort_queryrecordsitr,   	paginatores                b/var/www/html/wine-match-dev/backend/winematch-backend/src/apps/web_crawler/services/work_group.pyr/   r/      sI    #
#**9+?+?+C+CD+IJ /ug> 19
"ENNJ/ENN9Y^^-?-?-A#BCEiikGGNO)88<OO(h&"(X2245|7N7NOP
	 !!## P  
0A'==3	
 	

sH   E>B6E :E E E>A&E ?E> E 	E;(E66E;;E>c                    g }| r| ndg}|D ]  }	 |j                  dd      }|dv rLt        t        |      }|j                  d      r|j	                         }|j                  t        |             n!t        dd| dt        j                  d	       |S # t        $ r" t        dd| dt        j                  d	      w xY w)
Nr<   -r(   )r<   
created_at
updated_atidr/   z&Cannot sort with unidentified column ''zError retrieving work groups.r1   )replacegetattrr   
startswithdescappendr   r   r   HTTP_422_UNPROCESSABLE_ENTITYAttributeError)r#   rG   sort_fieldsscol
sort_orders         rL   r:   r:   M   s    J$'6(K 	))C$C@@$Y4
<<$!+!2J!!)J"78"8B1#QG & D D;	  9,   	4>qcC"@@7	 	s   BB+Cc                     t        |d      rJ|j                  r>d|j                   d}| j                  t        j                  j                  |            } | S )z1
    Apply search filter to WorkGroup query.
    search%)hasattrr_   r6   r   r<   ilike)r)   r    search_terms      rL   r9   r9   i   sI     w!gnn'..)+Y^^11+>?L    work_group_idc                   K   	 | j                  t              j                  t        j                  |k(  t        j                  j                  d            j                         }|st        dd|it        j                  d      |S # t        $ r-}t        ddt        |      it        j                  d      d}~ww xY ww)zK
    Get a work group by its ID.
    Raises APIException if not found.
    Nget_work_group_by_id_servicere   zWork group not foundr1   r0   zFailed to get work group by ID)r)   r   r6   rQ   r7   r8   firstr   r   HTTP_404_NOT_FOUNDrE   rA   rF   r   re   
work_grouprK   s       rL   rg   rg   r   s     
XXi(//	0MyOcOcOgOghlOmnttv
5&6"55.	   
1A'==4	
 	

s)   CBB C	B>(B99B>>Cc                 (  K   t        | |j                         d{    t        | |j                         d{   }	 t	        |j                        }| j                  |       | j                          t        | |j                  t        |j                                      d{    | j                  |       t        j                  |      S 7 7 7 .# t        $ r-}t        ddt!        |      it"        j$                  d      d}~ww xY ww)z"
    Create a new work group.
    N)r<   create_work_group_servicer0   Failed to create work groupr1   )check_duplicate_work_group_namer<   !fetch_web_crawlers_for_work_groupretailer_codesr   addcommit&associate_web_crawlers_with_work_grouprQ   listkeysrefreshr   r?   rE   r   rA   r   rF   )r   r    web_crawler_map	new_grouprK   s        rL   rm   rm      s      *"gll
;;; >b'BXBXYYO

	 	y
		 5RtOL`L`LbGcddd


9$33I>>! < Z 	e  
.A'==1	
 	

sV   DCDCD A(C (C))C DDC 	D"(D

DDc                   K   	 t        | |       d{   }|j                  r7|j                  |j                  k7  rt        | |j                         d{    |j                  r|j                  |_        | j                          t	        | |j
                         d{   }t        | |       d{    t        | |t        |j                                      d{    | j                  |       t        j                  |      S 7 7 7 n7 \7 2# t        $ r-}t        ddt        |      it         j"                  d      d}~ww xY ww)z(
    Update an existing work group.
    Nupdate_work_group_servicer0   zFailed to update work groupr1   )rg   r<   ro   rs   rp   rq   )clear_work_group_web_crawler_associationsrt   ru   rv   rw   r   r?   rE   r   rA   r   rF   )r   re   r    rk   rx   rK   s         rL   r{   r{      s$    
7MJJ
 <<GLLJOO;1"gllCCC <<%llJO
		 A"gF\F\ ]] 8MJJJ 5R_MaMaMcHdeee


:$33J??- K D ^ 	K 	f  
.A'==1	
 	

s   ED DAD DA
D !D"D 5D6+D !D")D ED D D D D 	E(EEEc                    K   	 t        | |       d{   }t        j                         |_        | j	                          i S 7 /# t
        $ r-}t        ddt        |      it        j                  d      d}~ww xY ww)z-
    Soft delete a work group by its ID.
    Ndelete_work_group_servicer0   zFailed to delete work groupr1   )
rg   r   utcnowr7   rs   rE   r   rA   r   rF   rj   s       rL   r~   r~      sv     
7MJJ
 ( 1

			 K  
.A'==1	
 	

s8   A>A A.A A>A 	A;(A66A;;A>r<   c                   K   	 | j                  t              j                  t        j                  |k(  t        j                  j                  d            j                         }|rt        dd|it        j                  d      y# t        $ r-}t        ddt        |      it        j                  d      d}~ww xY ww)zr
    Check if a work group with the given name already exists.
    Raises APIException if duplicate is found.
    Nrm   r<   z(Work group with this name already existsr1   r0   rn   )r)   r   r6   r<   r7   r8   rh   r   r   HTTP_409_CONFLICTrE   rA   rF   )r   r<   existing_grouprK   s       rL   ro   ro      s     

),33INNd4JIL`L`LdLdeiLjkqqs2tn"44B	    
.A'==1	
 	

s)   C BB C 	B=(B88B==C rq   c                   K   	 | j                  t              j                  t        j                  j	                  |r|ng       t        j
                  j                  d            j                         }|D ci c]  }|j                  | c}S c c}w # t        $ r-}t        ddt        |      it        j                  d      d}~ww xY ww)zv
    Fetch web crawlers by retailer codes and return a map of id to WebCrawler.
    Raises APIException on error.
    Nrm   r0   z/Failed to fetch web crawlers for the work groupr1   )r)   r   r6   codein_r7   r8   r>   rQ   rE   r   rA   r   rF   )r   rq   web_crawlerswcrK   s        rL   rp   rp     s     

xx
+22OO.bI!!%%d+
 #% 	 %11br	111 
.A'==E	
 	

s;   CA5B 9BB CB 	C(CCCweb_crawler_idsc                    K   	 |D ]   }t        ||      }| j                  |       " | j                          y# t        $ r-}t	        ddt        |      it        j                  d      d}~ww xY ww)zf
    Create associations between a work group and web crawlers.
    Raises APIException on error.
    )re   web_crawler_idrm   r0   z4Failed to associate web crawlers with the work groupr1   N)r   rr   rs   rE   r   rA   r   rF   )r   re   r   wc_idassociationrK   s         rL   rt   rt     sz     

$ 	 E-+$K FF;	  			 
.A'==J	
 	

s%   A35: A3	A0(A++A00A3c                 &  K   	 | j                  t              j                  t        j                  |k(        j	                          | j                          y# t        $ r-}t        ddt        |      it        j                  d      d}~ww xY ww)zo
    Delete all WorkGroupWebCrawler associations for a given work group.
    Raises APIException on error.
    r{   r0   z3Failed to clear work group web crawler associationsr1   N)r)   r   r6   re   deleters   rE   r   rA   r   rF   )r   re   rK   s      rL   r|   r|   +  sy     
	

$%,,-@-N-NR_-_`ggi
		 
.A'==I	
 	

s)   BAA B	B!(B		BB)r'   
   NT)N)9r   uuidr   sqlalchemy.ormr   fastapir   r   src.core.exceptionsr   src.utils.paginationr	   
sqlalchemyr
   r   r   r   r   *src.apps.wine.word_alias.models.word_aliasr   *src.apps.wine.validation.models.validationr   r   'src.apps.web_crawler.schemas.work_groupr   r   r   r   r   r   r   'src.apps.web_crawler.models.web_crawlerr   src.utils.constantsr   src.core.configr   typingr   r   sqlalchemy.sql.expressionr   intrA   boolr/   ru   r:   r9   rg   rm   r{   r~   ro   rp   rt   r|    rd   rL   <module>r      s     " ) , / 3 3 @ U   ? , $  / , /
/
"/
 /
 	/

 #Y/
 /
 
/
d 8


 
4

"
 
B'
'
'
 #'
 	'
T


 

,
g 
S 
,
 
c 
W[\_ak\kWl 
&
W 
S 
cghkcl 
*
 
PS 
rd   