o
    Ɲh                     @   s  d dl mZmZmZmZmZmZmZmZ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 d dlmZmZ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$ d d
l%m%Z% 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/m0Z0 d dl1m2Z2m3Z3 ee4Z5ee5j6ddde5_6e5j!7e" g dZ8e(j9e(j:d e(;e4Z<e=e5 e$e5eZ>e Z?e?=e5 de?_@i ZAe5B  eCddD ]ZDe eDeAeD< qW d   n1 sw   Y  e5j!d re.jEe5j!d d e?jFdd ZGdd ZHdddZIe5Jddd  ZKe5jJd!d"d#gd$d%d ZLe5Jd&ed'd( ZMe5Jd)ed*d+ ZNe5Jd,ed-d. ZOe5jJd/d"d#gd$ed0d1 ZPe5jJd2d"d#gd$ed3d4 ZQe5Jd5ed6d7 ZRe5jJd8d"d#gd$ed9d: ZSe5jJd;d#gd$ed<d= ZTe5jJd>d#gd$ed?d@ ZUe5jJdAd"d#gd$edBdC ZVe5JdDedEdF ZWe5jJdGd#gd$edHdI ZXe5jJdJd#gd$edKdL ZYe5jJdMd#gd$edNdO ZZe5jJdPd#gd$edQdR Z[e5jJdSd#gd$edTdU Z\e5JdVedWdX Z]e5jJdYd#gd$edZd[ Z^e5jJd\d"d#gd$ed]d^ Z_e5Jd_ed`da Z`e5jJdbd"d#gd$edcdd Zae5Jdeedfdg Zbe5jJdhd"d#gd$edidj Zce5Jdkedldm Zde5Jdnedodp Zee5Jdqedrds Zfe5Jdtedudv Zge5jJdwd#gd$edxdy Zhe5jJdzd#gd$ed{d| Zie5jJd}d#gd$ed~d Zje5jJdd#gd$edd Zke5Jdedd Zle5Jdedd Zme5jJdd#gd$edd Zne5Jdedd ZodS )    )	Flaskrender_templaterequestredirecturl_forflashjsonify	send_fileabort)LoginManager
login_userlogout_userlogin_requiredcurrent_user)ProxyFix)generate_password_hashcheck_password_hash)secure_filename)or_funcand_)dbUserArtworkArtistcreate_gallery_client_table)Config)Migrate)datetimeN)Response)Presentation)InchesPt   )Zx_prefixZx_for)	ZFranceZUSAZUKZGermanyZJapanZChinaZBrazilZUAEZOther)levellogin   ZGEMINI_API_KEY)Zapi_keyc                 C   s   t jt| S )N)r   querygetint)user_id r+   )/var/www/html/figdemos/bartoux_crm/app.py	load_user,   s   r-   c                 C   s    d| v o|  ddd  dv S )N.r#   >   ZjpegZjpg)rsplitlower)filenamer+   r+   r,   allowed_file0   s    r2   SCORINGc                 C   s   zSt tjtjdddd}| }W d    n1 sw   Y  d|   d}d}||}|dkr8W d	S |||t	| }|dkrM||d  W S ||| W S  t
yb   td
 Y d	S w )Ngemini_instructions.txtrutf-8encoding[z INSTRUCTIONS]z
[ z,Fichier gemini_instructions.txt introuvable.)openospathjoinappstatic_folderreadupperfindlenFileNotFoundErrorloggererror)typefcontentZstart_markerZ
end_markerZstart_index	end_indexr+   r+   r,   get_instructions3   s   

$
rM   /c                   C   s   t dS )Nz
index.html)r   r+   r+   r+   r,   indexA   s   rO   z/loginGETPOST)methodsc                  C   s   t jdkr=tjjt jd d } | r9t| jt jd r9t	|  | j
dkr+ttdS | j
dv r9ttd| jdS td	 td
S )NrQ   usernamerS   passwordadmin)manager
commercialgallery_hub
gallery_idz*Nom d'utilisateur ou mot de passe invalidez
login.html)r   methodr   r'   	filter_byformfirstr   rU   r   roler   r   r[   r   r   )userr+   r+   r,   r%   E   s   


z/logoutc                   C   s   t   ttdS )NrO   )r   r   r   r+   r+   r+   r,   logoutT   s   rb   z/adminc                   C   s   t jdkr	td tdS )NrV     zadmin_hub.html)r   r`   r
   r   r+   r+   r+   r,   rV   ^   s   
rV   z/dossiers_artistesc                  C   s0   t jdkr	td tjtj } td| dS )NrV   rc   zdossiers_artistes.htmlartists)	r   r`   r
   r   r'   order_bynameallr   )artists_from_dbr+   r+   r,   dossiers_artistese   s   rj   z/instructionsc                  C   sv  t jdkr	td tjtjd} tj	dkrVtj
dd}tj
dd}d|  d	|  }t| d
dd}|| W d    n1 sGw   Y  td ttdS zPt| ddd}| }W d    n1 smw   Y  d}d}||}||}|dkr|dkr||t| |  }	||t| d   }
nd}	d}
W n ty   d}	d}
Y nw td|	|
dS )NrV   rc   r4   rQ   scoring_instructionsr;   email_instructionsz[SCORING INSTRUCTIONS]
z

[EMAIL INSTRUCTIONS]
wr6   r7   u"   Instructions Gemini sauvegardées.instructionsr5   z[SCORING INSTRUCTIONS]z[EMAIL INSTRUCTIONS]r:   z,Marqueur [SCORING INSTRUCTIONS] introuvable.z*Marqueur [EMAIL INSTRUCTIONS] introuvable.zinstructions.html)rk   rl   )r   r`   r
   r=   r>   r?   r@   rA   r   r\   r^   r(   stripr<   writer   r   r   rB   rD   rE   rF   r   )Zinstructions_pathZscoring_contentZemail_contentZfull_contentrJ   Zscoring_markerZemail_markerZscoring_part_startZemail_part_startrk   rl   r+   r+   r,   rn   l   sB   



rn   z/admin/add_artworkc                  C   s  t jdkr	td tjdkrtjd} | r| jdkr$td t	tj
S t| jrt| j}tjtjd |}tjtjd dd	 | | tjd
 }tjttjt| k }|svt| d}tj| td| d tjd }t jj!|d }|rtd| d t	tj
S t tjd tjd tjd||tjdtjdtjjdt"dpd tjjdt"dpd tjjdt"dpd tjd d
}|j#r|j# rdnd|_$tj| tj%  td t	t&dS tj'tj( }	d d! |	D }
t)d"|
d#S )$NrV   rc   rQ   imager;   u"   Aucun fichier image sélectionné.UPLOAD_FOLDERTexist_okartist_namerg   Nouvel artiste "
   " ajouté.cegidry   z	Le CEGID u    est déjà utilisé.titlezstatic/uploadsrI   price_rangewidth_cmrI   	height_cmdepth_cm
commentary)
ry   r{   
image_pathru   rI   r|   r}   r   r   r   okpendingu   Oeuvre ajoutée avec succès !list_artworksc                 S      g | ]}|j qS r+   rv   .0artistr+   r+   r,   
<listcomp>       zadd_artwork.<locals>.<listcomp>zadd_artwork_form.htmlrd   )*r   r`   r
   r   r\   filesr(   r1   r   r   urlr2   r   r=   r>   r?   r@   configmakedirssaver^   r   r'   filterr   r0   rg   ro   r_   r   sessionaddr   r]   r)   r   statuscommitr   rf   rh   r   )filer1   filepathru   existing_artist
new_artistry   Zexisting_artworkartworkri   artist_namesr+   r+   r,   add_artwork   sN   





&

	
r   z/admin/artworksc                  C   s   t jdkr	td tjdd} tjdd}tj}|dkr$|jdd}| rAd|  d}|	t
tj|tj|tj|}|tj  }td	|d| |d
S )NrV   rc   qr;   r   r   r   %list_artworks_editable.html)artworks	user_typer'   filter_mode)r   r`   r
   r   argsr(   r   r'   r]   r   r   r{   ilikeru   ry   rf   
created_atdescrh   r   )r'   r   
base_querysearch_termr   r+   r+   r,   r      s   *r   z$/admin/edit_artwork/<int:artwork_id>c                 C   st  t jdkr	td tj| }tjdkrtjd }t	j
tt	jt| k }|sCt	| d}tj| td| d tjd |_tjd	 |_||_tjd
 |_tjd|_tjjdtdphd |_tjjdtdpsd |_tjjdtdp~d |_tjd |_|jr|j rdnd|_tj   td t!t"dS t	j#t	j$ }dd |D }t%d||ddS )NrV   rc   rQ   ru   rv   rw   rx   ry   r{   rI   r|   r}   r~   r   r   r   r   r   "   Oeuvre mise à jour avec succès !r   c                 S   r   r+   rv   r   r+   r+   r,   r      r   z edit_artwork.<locals>.<listcomp>edit_artwork_form.html)r   re   r   )&r   r`   r
   r   r'   
get_or_404r   r\   r^   r   r   r   r0   rg   ro   r_   r   r   r   r   ry   r{   ru   rI   r(   r|   r)   r}   r   r   r   r   r   r   r   rf   rh   r   )
artwork_idr   ru   r   r   ri   r   r+   r+   r,   edit_artwork   s2   

&
r   z&/admin/artwork/<int:artwork_id>/deletec              
   C   s   t jdkr	td tj| }|jrGztj	t
j|j}tj|r't| W n tyF } ztd|j d|  W Y d }~nd }~ww tj| tj  tdd ttdS )NrV   rc   /Erreur lors de la suppression du fichier image :     Oeuvre supprimée avec succès !successr   )r   r`   r
   r   r'   r   r   r=   r>   r?   r@   	root_pathexistsremove	ExceptionrG   rH   r   r   deleter   r   r   r   )r   r   full_image_pather+   r+   r,   delete_artwork   s    
$

r   z/api/artist/createc            	   
   C   s  t jdkr	td tjd} | r|  s tdd tt	dS t
jtt
jt|  k }|rDtd|  dd	 tt	dS zbd }tjd
}|r}t|jr}t|j}tjtjd d}tj|dd tj||}|| tjd|}t
|  tjddtjdd|d}tj| tj  td|  dd W n$ t y } ztj!  t"#d|  tdd W Y d }~nd }~ww tt	dS )NrV   rc   rg   u+   Le nom de l'artiste ne peut pas être vide.dangerrj   L'artiste 'u   ' existe déjà.warningrq   rr   re   Trs   static/uploads/artistsdescription_frr;   description_en)rg   descriptionr   r      ' a été créé avec succès.r   u*   Erreur lors de la création de l'artiste: zUne erreur est survenue.)$r   r`   r
   r   r^   r(   ro   r   r   r   r   r'   r   r   r0   rg   r_   r   r2   r1   r   r=   r>   r?   r@   r   r   r   r   r   r   r   r   ZrollbackrG   rH   )	rg   r   r   rq   r1   artist_upload_folderr   r   r   r+   r+   r,   create_artist   s<   
&

(

r   z"/admin/edit_artist/<int:artist_id>c                 C   s:  t jdkr	td tj| }tjdkrtj	d|j
|_
tj	d|j|_tj	d|j|_tj	d}|rt|jr|jrXtjtjtj|jrXttjtj|j t|j}tjtjd d	}tj|d
d tj||}|| tjd||_tj  td|j
 dd t t!dS t"d|dS )NrV   rc   rQ   rg   r   r   rq   rr   re   Trs   r   r      ' a été mis à jour.r   rj   zedit_artist_form.html)r   )#r   r`   r
   r   r'   r   r   r\   r^   r(   rg   r   r   r   r2   r1   r   r=   r>   r   r?   r@   r   r   r   r   r   r   r   r   r   r   r   r   r   )Z	artist_idr   rq   r1   r   r   r+   r+   r,   edit_artist  s(   
 


r   z/admin/managementc                     s   t jdkr	td tjjddtj } tjjddtjtj	 }dd | D   fdd	t
d
dD }td| ||dS )NrV   rc   rW   )r`   rX   c                 S   s   h | ]}|j qS r+   rZ   )r   rW   r+   r+   r,   	<setcomp>;  r   zmanagement.<locals>.<setcomp>c                    s   g | ]}| vr|qS r+   r+   )r   gZmanaged_galleriesr+   r,   r   <  s    zmanagement.<locals>.<listcomp>r#   r&   zmanagement.htmlZmanagerscommercialsZavailable_galleries)r   r`   r
   r   r'   r]   rf   r[   rh   rS   ranger   r   r+   r   r,   
management2  s   r   z/admin/user/createc                  C   s   t jdkr	td tjd} tjd}tjjdtd}t| ||gs/tdd t	t
d	S tjj| d
 }|rEtdd t	t
d	S t| t||dd}tj| tj  td|  dd t	t
d	S )NrV   rc   rS   rU   r[   r~   zTous les champs sont requis.r   r   rT   %   Ce nom d'utilisateur est déjà pris.rX   )rS   rU   r[   r`   Le commercial 'r   r   )r   r`   r
   r   r^   r(   r)   rh   r   r   r   r   r'   r]   r_   r   r   r   r   r   )rS   rU   r[   Zexisting_userZnew_userr+   r+   r,   create_commercial@  s*   


r   z /admin/user/update/<int:user_id>c           	         s<  t jdkr	td tj| }|jdkrtdd ttdS t	j
d}t	j
jdtd	}||jkrFtjj|d
 rFtdd ttdS ||_|r||jkrt|j }t| }|jj|jd }|D ]   fdd jjD }|di |}tj| tj  qe||_tj  td|j dd ttdS )NrV   rc   rX      Action non autorisée.r   r   rS   r[   r~   rT   r   commercial_idc                    s&   i | ]}|j d vr|j t |j qS )id)rg   getattrr   cZ
old_clientr+   r,   
<dictcomp>z     & z%update_commercial.<locals>.<dictcomp>r   r   r   r+   )r   r`   r
   r   r'   r   r   r   r   r   r^   r(   r)   rS   r]   r_   r[   gallery_clientsr   rh   Z	__table__columnsr   r   r   r   r   )	r*   ra   new_usernameZnew_gallery_idZOldClientTableZNewClientTableZclients_to_moveZnew_client_data
new_clientr+   r   r,   update_commercial]  s0   




r   z /admin/user/delete/<int:user_id>c                 C   s   t jdkr	td tj| }|jdkrtdd ttdS tjj	|j
dd }|s<td	|j
 d
d ttdS t|j
 }|jj	|jd }|D ]}|j|_qMtj| tj  td|j dd ttdS )NrV   rc   rX   r   r   r   rW   r[   r`   u&   Aucun manager trouvé pour la galerie u)   . Impossible de réattribuer les clients.r   r   uD   ' a été supprimé. Ses clients ont été réattribués au manager.r   )r   r`   r
   r   r'   r   r   r   r   r]   r[   r_   r   r   rh   r   r   r   r   r   rS   )r*   ra   rW   ZClientTableZclients_to_reassignclientr+   r+   r,   delete_commercial  s"   




r   z#/admin/manager/update/<int:user_id>c                 C   s   t jdkr	td tj| }|jdkrtd tjd}||j	kr7tjj
|d r7tdd ttdS ||_	tj  td	|j	 d
d ttdS )NrV   rc   rW   rS   rT   r   r   r   zLe manager 'r   r   )r   r`   r
   r   r'   r   r   r^   r(   rS   r]   r_   r   r   r   r   r   r   )r*   rW   r   r+   r+   r,   update_manager  s   

r   z'/admin/manager/replace/<int:gallery_id>c                 C   s   t jdkr	td tjjdtd}|stdd tt	dS t
jj| dd	 }t
j|}|r5|j| kr@td
d tt	dS |rEd|_d|_tj  td|j d|  dd tt	dS )NrV   rc   r   r~   u1   Aucun commercial sélectionné pour la promotion.r   r   rW   r   u:   Commercial invalide ou n'appartenant pas à cette galerie.rX   'z'' est le nouveau manager de la galerie r.   r   )r   r`   r
   r   r^   r(   r)   r   r   r   r   r'   r]   r_   r[   r   r   r   rS   )r[   Zcommercial_to_promote_idZcurrent_managerZcommercial_to_promoter+   r+   r,   replace_manager  s    


r   z/gallery<int:gallery_id>c                 C   s   t j| kr	td td| dS )Nrc   zgallery_hub.htmlrZ   )r   r[   r
   r   rZ   r+   r+   r,   rY     s   rY   z8/gallery<int:gallery_id>/artwork/<int:artwork_id>/deletec              
   C   s   t j| kr	td tj|}|jrGztj	t
j|j}tj|r't| W n tyF } ztd|j d|  W Y d }~nd }~ww tj| tj  tdd ttd| dS )Nrc   r   r   r   r   gallery_cataloguerZ   )r   r[   r
   r   r'   r   r   r=   r>   r?   r@   r   r   r   r   rG   rH   r   r   r   r   r   r   r   )r[   r   r   r   r   r+   r+   r,   gallery_delete_artwork  s    
$

r   z'/gallery<int:gallery_id>/ajouter_clientc                 C   s  t j| kr	td tjdkrt|  }tjd}|r?| r?|j	
t|jt| k r?td| dd ttjS |tjd tjd |rN| nd tjd	tjd
tjdtjdtjdddtjv dtjv tjdtjdrttjd d nd tjdd}tj| tj  td|j d|j dd ttd| dS tj	tj  }dd |D }t!d| |t"dS ) Nrc   rQ   emailzL'adresse e-mail 'u   ' est déjà utilisée.r   
first_name	last_namephone_numbernationalitylanguagefavorite_artistsr   r;   
newsletterpotential_hautrelance_statusrelance_date%Y-%m-%dnegotiation_status)r   r   r   r   r   r   r   r   r   r   r   r   r   Client  u	    ajouté.r   edit_client_listrZ   c                 S   r   r+   rv   r   r+   r+   r,   r     r   z"ajouter_client.<locals>.<listcomp>zadd_client_form.html)r[   re   	countries)#r   r[   r
   r   r\   r   r^   r(   ro   r'   r   r   r0   r   r_   r   r   r   getlistr   strptimedater   r   r   r   r   r   r   r   rf   rg   rh   r   COUNTRY_LIST)r[   GalleryClientr   r   ri   r   r+   r+   r,   ajouter_client  s8   
&



$

r   z /gallery<int:gallery_id>/clientsc              
   C   s  t j| kr	td tjdd}tjdd}tjdd}tjdd}t|  }|j}|r4|j|d}|r<|j|d}|d	krF|jd
d}|r^d| d}|	t
|j||j|}||j  }tj|j 	|jd  }	dd |	D }
td|| ||
|||dS )Nrc   r   r;   rX   r   Z	potential)commercial_namer   ZhautTr   r   c                 S      g | ]}|d  qS r   r+   r   r+   r+   r,   r         z$edit_client_list.<locals>.<listcomp>zedit_client_list.html)clientsr[   r'   commercial_namescommercial_filterrelance_filterpotential_filter)r   r[   r
   r   r   r(   r   r'   r]   r   r   r   r   r   rf   
updated_atr   rh   r   r   r   distinctisnotr   )r[   r'   r  r	  r
  r   r   r   r  commercials_queryr  r+   r+   r,   r   	  s(    $r   z4/gallery<int:gallery_id>/edit_client/<int:client_id>c                 C   sf  t j| kr	td t|  }|j|}tjdkrtjd |_	tjd |_
tjd |_tjd |_tjd |_tjd |_tjd	 |_tjd
|_tjdd|_dtjv |_dtjv |_tjd|_tjdruttjd d nd |_tjd|_tj  td|j	 d|j
 dd t t!d| dS t"j#t"j$% }dd |D }t&d|| |t'dS )Nrc   rQ   r   r   r   r   r   r   r   r   r   r;   r   r   r   r   r   r   r   r   u    mis à jour.r   r   rZ   c                 S   r   r+   rv   r   r+   r+   r,   r   :  r   zedit_client.<locals>.<listcomp>zedit_client_form.html)r   r[   re   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   rf   rg   rh   r   r   )r[   	client_idr   r   ri   r   r+   r+   r,   edit_client!  s0   
(
r  z"/gallery<int:gallery_id>/cataloguec                 C   s   t j| kr	td tjdd}tjdd}tj}|dkr$|jdd}|rAd| d}|	t
tj|tj|tj|}|tj  }td|d	| ||d
S )Nrc   r   r;   r   r   r   r   r   gallery)r   r   r[   r'   r   )r   r[   r
   r   r   r(   r   r'   r]   r   r   r{   r   ru   ry   rf   r   r   rh   r   )r[   r'   r   r   r   r   r+   r+   r,   r   =  s   *r   z6/gallery<int:gallery_id>/edit_artwork/<int:artwork_id>c                 C   sz  t j| kr	td tj|}tjdkrtjd }t	j
tt	jt| k }|sCt	| d}tj| td| d tjd |_tjd |_||_tjd	 |_tjd
|_tjjdtdphd |_tjjdtdpsd |_tjjdtdp~d |_tjd |_|jr|j rdnd|_tj   td t!t"d| dS t	j#t	j$ }dd |D }t%d||| ddS )Nrc   rQ   ru   rv   rw   rx   ry   r{   rI   r|   r}   r~   r   r   r   r   r   r   r   rZ   c                 S   r   r+   rv   r   r+   r+   r,   r   f  r   z(gallery_edit_artwork.<locals>.<listcomp>r   r  )r   re   r[   r   )&r   r[   r
   r   r'   r   r   r\   r^   r   r   r   r0   rg   ro   r_   r   r   r   r   ry   r{   ru   rI   r(   r|   r)   r}   r   r   r   r   r   r   r   rf   rh   r   )r[   r   r   ru   r   r   ri   r   r+   r+   r,   gallery_edit_artworkL  s2   

&
r  z$/gallery<int:gallery_id>/start_matchc                 C   s   t j| krttdS t|  }tj|j	 
|jd |j }dd |D }tjtj }dd |D }td| ||dS )NrO   c                 S   r  r  r+   r   r+   r+   r,   r   o  r  zstart_match.<locals>.<listcomp>c                 S   r   r+   rv   r   r+   r+   r,   r   q  r   zstart_match_form.html)r[   re   r   )r   r[   r   r   r   r   r   r'   r   r  r   r  rf   rh   r   rg   r   )r[   r   r  r  ri   r   r+   r+   r,   start_matchi  s   ,r  z(/api/gallery<int:gallery_id>/check_emailc                 C   sr   t j| krtddidfS tjdd}|stddiS t|  }|jt	
|jt	
|k }tdt|iS )NrH   Unauthorizedrc   r   r;   r   F)r   r[   r   r   r   r(   r   r'   r   r   r0   r   r_   bool)r[   r   r   Zexisting_clientr+   r+   r,   check_emailt  s   
"r  z+/api/gallery<int:gallery_id>/search_clientsc              
   C   s  t jdd}td td| d t|dk r!td tg S t|  }d| d}td	| d z8|jt	|j
||j|d
 }tdt|  dd |D }|rctd|  td t|W S  ty } ztd|  tddidfW  Y d }~S d }~ww )Nr   r;   u)   
--- Début de la recherche de client ---u   Terme de recherche reçu : 'r      u&   Recherche annulée : terme trop court.r   z"Terme de recherche SQL (ilike) : '
   u6   Nombre de clients trouvés dans la base de données : c                 S   s&   g | ]}|j |j d |j dqS )r   )r   rg   r   r   r   r   r+   r+   r,   r     r   z"search_clients.<locals>.<listcomp>u!   Résultats qui seront envoyés : z&--- Fin de la recherche de client ---
u   ERREUR PENDANT LA REQUÊTE : rH   zUne erreur s'est produite  )r   r   r(   printrE   r   r   r'   r   r   r   r   r   limitrh   r   )r[   r'   r   r   r  resultsr   r+   r+   r,   search_clients  s:   



r  z/search_artistsc                  C   sf   t jdd } t| dk rtg S d|  d}tjtj	
|d }dd |D }t|S )Nr   r;   r  r   r  c                 S   r   r+   rv   r   r+   r+   r,   r     r   z"search_artists.<locals>.<listcomp>)r   r   r(   r0   rE   r   r   r'   r   rg   r   r  rh   )r'   r   re   r  r+   r+   r,   search_artists  s   r  z*/gallery<int:gallery_id>/update_commentaryc                 C   s   t j| krtddidfS tj}|dg }|dd}t|  }|j|j	
| }|D ]}|rGt d}|jp=dd| d	|  |_q.tj  td
dt| diS )NrH   r  rc   
client_idsmatch_reasonr;   r   z

[Match Context - z]: messagezCommentary updated for z	 clients.)r   r[   r   r   jsonr(   r   r'   r   r   in_rh   r   nowstrftimer   r   r   r   rE   )r[   datar   r!  r   r  r   	timestampr+   r+   r,   update_commentary  s   
r)  z./gallery<int:gallery_id>/save_email_commentaryc           	      C   s   t j| krtddidfS tj}|d}|d}|r|s&tddidfS t|  }|j|}|s:tddid	fS t	 
d
}d}d| d| d| d| }|jpUd| |_tj  tddiS )NrH   r  rc   r  
email_textzMissing data  zClient not found  z%Y-%m-%d %H:%M******************************

u   
[Email envoyé - z]:

r;   r"  zCommentary saved successfully.)r   r[   r   r   r#  r(   r   r'   r   r%  r&  r   r   r   r   )	r[   r'  r  r*  r   r   r(  	separatorZupdate_textr+   r+   r,   save_email_commentary  s"   



r1  z+/api/gallery<int:gallery_id>/filter_clientsc           	      C   s.  t j| krtddidfS tj}|dd}t|  }|j}|dkr9|dg }|s-tg S ||j	
| }nS|dg }|rJ||j
|}|d	kr\||j d
 }n0|dkro|jdd|j  }n|dkr|jdd|j  }n
||j  }dd |D }t|S )NrH   r  rc   criteriarh   Zspecificr   r   Zlatest_5   Zrelance_onlyu   À relancerr  Zhaut_potentiel_onlyTr  c                 S   s   g | ]}|j |j|jd qS )r  r  r   r+   r+   r,   r     s    z"filter_clients.<locals>.<listcomp>)r   r[   r   r   r#  r(   r   r'   r   r   r$  rh   r   rf   r   r   r  r]   r  )	r[   r'  r2  r   r'   r   r  r   Zclient_listr+   r+   r,   filter_clients  s.   
r4  z/gallery<int:gallery_id>/matchc                 C   sp  t j| krtddidfS tj}|dg }|dg }|dg }t|  }|j|j	
| }tjjdd}|rD|tj
|}|rng }|D ]}	|tjd	|	 d	 |tjd	|	 d	 qJ|t| }| }
|
szti d
fS td}|stddidfS i }dd |
D }ztd}|D ]}|jdd  }d|j d|j d|jrdnd dd|jpg  d| 
}g }|
D ]}d|j d|j d|j d|j d|j  d |j! d!|j" d"|j }| d#| d#| }z/|#|}|j$ %d$d%%d&d%}t&|}t'|d'd(}|d)kr$||j	|d* W q t(yH } zt)*d+|j	 d,|j	 d-|  W Y d }~qd }~ww |rt+|d.d/ dd0}|j d|j g d1||j	< |D ](}||d2 }|r||j	 d3 |j	|j|j|j|j,t-|d' d4d5 qfqW t|S  t(y } zt)*d6|  tdd7idfW  Y d }~S d }~ww )8NrH   r  rc   r   Zpreferred_artistsrequired_keywordsT)Zis_availabler      r3   #Fichier d'instructions introuvable.r  c                 S   s   i | ]}|j |qS r+   r   )r   artr+   r+   r,   r   '  r  z"match_artworks.<locals>.<dictcomp>zgemini-1.5-pror-  r   "PROFIL CLIENT:
            - Nom: r   z
            - Potentiel: u   ÉlevéZStandardz!
            - Artistes Favoris: z, .   
            - Commentaires et Préférences: u1   DÉTAILS DE L'ŒUVRE:
                - Artiste: 
                - Titre: 
                - CEGID: 
                - Type: !
                - Dimensions: H: L: P:z1 cm
                - Commentaire de la galerie: r.  z```jsonr;   z```scoreg        g      ?)r   rA  u(   Erreur d'évaluation Gemini pour client u
    / œuvre r   c                 S   s   | d S )NrA  r+   )xr+   r+   r,   <lambda>M  s    z match_artworks.<locals>.<lambda>)keyreverse)client_namematchesr   rG     )r   r{   ry   ru   r   rA  u$   Erreur générale lors du matching: z6Une erreur est survenue lors du processus de matching.).r   r[   r   r   r#  r(   r   r'   r   r   r$  rh   r   r]   ru   appendr{   r   r   r   rM   genaiGenerativeModelsplitro   r   r   r   r?   r   ry   rI   r   r}   r   generate_contenttextreplaceloadsfloatr   rG   rH   sortedr   round)r[   r'  r   Zselected_artistsr5  r   r  Zbase_artwork_queryZkeyword_conditionskeywordr   rk   Zstructured_resultsZartwork_details_mapmodelr   Zclean_commentaryclient_profileZclient_matchesr8  Zartwork_detailspromptresponseZ	json_textZ
score_datarA  r   Zsorted_matchesmatchr   r+   r+   r,   match_artworks  s   



,2rZ  z/get_artwork_by_cegidc               	   C   sv   t jdd} | stddidfS tjj| d }|s$tddidfS |j|j	|j
|j|j|j|j|jd	}t|S )
Nry   r;   rH   zCEGID manquantr+  rz   u   Oeuvre non trouvéer,  )r   r{   ru   r   r   r}   r   ry   )r   r   r(   r   r   r'   r]   r_   r   r{   ru   r   r   r}   r   ry   )ry   r   resultr+   r+   r,   get_artwork_by_cegid`  s    
r\  z+/gallery<int:gallery_id>/export_clients.csvc              
   C   s$  t j| krttdS t|  }|j }t|dd d}t	 }t
j|dd}g d}|| d }|D ]I}|j|krD|d urD|g  |j}|jrQd|j d	nd
}	|jpWd
|jp[d
|jp_d
|jpcd
|	|jridnd|jpnd
|jprd
|jpvd
g	}
||
 q4| d}t|ddd|  didS )NrO   c                 S   s   | j pd| jpdfS )Nr;   )r   r   )r   r+   r+   r,   rC    r  z$export_clients_csv.<locals>.<lambda>)rD  ;)	delimiter)	Z
CommercialZNomu   PrénomzAdresse mailu   TéléphonezHaut Potentielu   Statut NégociationZLangueu   Nationalitéz=""r;   ZOuiZNonz	utf-8-sigztext/csvzContent-Dispositionz+attachment;filename=export_clients_gallery_z.csv)mimetypeheaders)r   r[   r   r   r   r'   rh   rR  ioStringIOcsvwriterwriterowr   r   r   r   r   r   r   r   r   getvalueencoder   )r[   r   Zall_clientsZsorted_clientsoutputre  headerZcurrent_commercialr   Zphone_number_formattedrowZcsv_datar+   r+   r,   export_clients_csvx  s@   



rl  z+/gallery<int:gallery_id>/generate_materialsc                 C   s  t jdg }t|  }i }|D ]}t|d }t|d }||vr%g ||< || | qtd}|s;tddidfS i }zt	d}	|
 D ]\}}
|j|}tjtj|
 }|ra|sbqGd	|j d
|j d|j d|j d|j 
}ddd t|D }| d| d| }z|	|}|j}|j d
|j | d||j< W qG ty } z&td|j d|  |j d
|j d|j dd||j< W Y d }~qGd }~ww W t|S  ty } ztd|  tddidfW  Y d }~S d }~ww )NrG  r  r   ZEMAILrH   r7  r  zgemini-1.5-flashr9  r   z
            - Langue: z"
            - Statut de relance: r:  r/  c                 S   sX   g | ](\}}d |d  d|j  d|j d|j d|j d|j d|j d|j d	qS )
u   ŒUVRE r#   z:
                - Artiste: r;  r<  r=  r>  r?  r@  z cm
                )ru   r{   ry   rI   r   r}   r   )r   ir8  r+   r+   r,   r     s$    z&generate_materials.<locals>.<listcomp>r.  )rF  Zemail_draftu6   Erreur de génération d'e-mail Gemini pour le client r   u#   Sujet : Suggestion d'œuvres

Cher u]   ,

(Erreur lors de la génération automatique. Veuillez compléter cet e-mail manuellement.)u3   Erreur lors de l'initialisation du modèle Gemini: u1   Erreur lors de l'initialisation du modèle Gemini)r   r#  r(   r   r)   rI  rM   r   rJ  rK  itemsr'   r   r   r   r$  rh   r   r   r   r   r   r?   	enumeraterM  rN  ro   r   rG   rH   )r[   Zselected_matchesr   Zclients_to_artworksrY  r  r   rl   Zemail_draftsrU  artwork_idsr   r   rV  Zartworks_detailsrW  rX  Zdraftr   r+   r+   r,   generate_materials  sh   


	
& rq  z%/gallery/<int:gallery_id>/export_pptxc           )      C   s  t jjdtd}t jdd}dd |dD }|r|sdS t|  }|j|}tjtj	
| }|r9|s;d	S tjtjd
}t|}t|j}	|	dk rRdS |j}
|j}i }|D ]}|j|vrhg ||j< ||j | q\| D ]2\}}tjj|d }|r&|j|jd }|j|jj _!|j"d }|j#r|j$}|% &| |j'rtj(tjtj)|j'rt*d}t*d}|
| d }t*d}|jj+tjtj)|j'|||d || t*d }nt*d}|j,dkr|j-n|j.p|j-}t*d}|
t*d }|| t*d }|j/||||}|j0}d|_1|2 }|pd|_!t3d|j4_5|D ]}|j|jd }d|j  d|jj _!tjtj)|j'} tj(| rrt*d}|
t*d d }t*d}|jj+| |||d}!|!j6|!j7 t*d }"nt*d}"t*d}|
t*d }t*d}|j/||"||}|j0}|2 }d|j8 d|j9 d |_!t3d|j4_5q(qu|jj:}#t;|#}$|$|	d  }%|$d!|	 }&|#d!d = |%D ]}'|#|' q|&D ]}'|#|' qt<= }(|>|( |(?d" t@|(dd#|jA d$d%d&S )'Nr  r~   rp  r;   c                 S   s   g | ]
}|  rt|qS r+   )isdigitr)   )r   r   r+   r+   r,   r     s    zexport_pptx.<locals>.<listcomp>,)u   Données manquantesr+  )u   Client ou œuvres introuvablesr,  ztemplate.pptx   )z:Erreur: Le template doit contenir au moins 4 diapositives.r  rv   r#   g      @r  g      ?)heightg333333?u	   Françaisg      ?TzAucune description disponible.   r3  r_  g      @r&   g?zDimensions: H:z x L:z cmrH  r   Zproposition_z.pptxzIapplication/vnd.openxmlformats-officedocument.presentationml.presentation)as_attachmentdownload_namer`  )Br   r   r(   r)   rL  r   r'   r   r   r   r$  rh   r=   r>   r?   r@   rA   r    rE   slidesslide_widthslide_heightru   rI  rn  r   r]   r_   Z	add_slideZslide_layoutsrg   Zshapesr{   rN  ZplaceholdersZhas_text_frameelementZ	getparentr   r   r   r   r!   Zadd_picturer   r   r   Zadd_textboxZ
text_frameZ	word_wrapZadd_paragraphr"   Zfontsizetopru  r   r}   Z	_sldIdLstlistrb  BytesIOr   seekr	   r   ))r[   r  Zartwork_ids_strrp  r   r   r   Ztemplate_pathZprsZinitial_slide_countrz  r{  Zartworks_by_artistr8  ru   Zartsr   Zslide_artisteZ
body_shapespZ
img_heightZ	img_widthleftr~  Zdescription_topr   widthru  ZtextboxZtfpZslide_oeuvreZartwork_image_pathZpicZinfo_topry  Zall_slide_idsZgenerated_slidesZtemplate_slides_to_moveZslide_idZfile_streamr+   r+   r,   export_pptx  s   



 "


r  )r3   )pflaskr   r   r   r   r   r   r   r	   r
   Zflask_loginr   r   r   r   r   Zwerkzeug.middleware.proxy_fixr   Zwerkzeug.securityr   r   Zwerkzeug.utilsr   Z
sqlalchemyr   r   r   Zmodelsr   r   r   r   r   r   r   Zflask_migrater   r   r=   r#  loggingrb  rd  r   Zgoogle.generativeaiZgenerativeairJ  Zpptxr    Z	pptx.utilr!   r"   __name__r@   wsgi_appfrom_objectr   basicConfigINFO	getLoggerrG   Zinit_appZmigrateZlogin_managerZ
login_viewr   app_contextr   rm  Z	configureZuser_loaderr-   r2   rM   routerO   r%   rb   rV   rj   rn   r   r   r   r   r   r   r   r   r   r   r   r   rY   r   r   r   r  r   r  r  r  r  r  r)  r1  r4  rZ  r\  rl  rq  r  r+   r+   r+   r,   <module>   s.  , 









 )'	
"	!_03