
    i%              	          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
mZmZ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 m!Z! d dl"m#Z# d dl$m%Z% dZ& ee'          Z(de)de)fdZ*de)de)fdZ+de)de)dz  de)dz  de)fdZ,de)fdZ-de)de)de.fdZ/de)ddfdZ0de
d edefd!Z1	 	 d$d"e)de)dz  de)dz  de2fd#Z3dS )%    N)Path)datetime)ZoneInfo)BackgroundTasksHTTPException
UploadFilestatus)FileResponse)Image)	FONT_NAMEOUT_FONT_DIR)run_pipeline)cleanup_dir)PipelineInputError)
get_logger)upload_buffer)download_image_to_filevalidate_jpeg_file)JPEG_ONLY_MESSAGE)settingsi   prefixreturnc                 h    t          j                    j        }t          j        |  d| d          S )N_r   )uuiduuid4hextempfilemkdtemp)r   	random_ids     )/code/app/services/handwriting/service.py_create_work_dirr#      s5    
 If#;#;y#;#;#;<<<<    valuec                 \    d                     d | D                       }|r
|d d         ndS )N c              3   J   K   | ]}|                                 s|d v |V  dS ))-r   N)isalnum).0chs     r"   	<genexpr>z_safe_token.<locals>.<genexpr>!   s9      MMRBJJLLMB*<L<Lb<L<L<L<LMMr$   @   req)join)r%   cleaneds     r"   _safe_tokenr2       s9    ggMM5MMMMMG"-73B3<<-r$   
request_iduser_idc                 T   t          j                    j        }| g}|r%|                    dt	          |                      |r%|                    dt	          |                      |                    |           t          j        d                    |          dz             S )Nzuser-zreq-r   r   )r   r   r   appendr2   r   r    r0   )r   r3   r4   r!   partss        r"   _create_work_dir_with_idsr8   %   s     
 IHE 53[1133444 75K
3355666	LL388E??S#89999r$   c                  ~    t          j        t          t          j                                                d          S )Nz%Y-%m-%d)r   nowr   r   APP_TIMEZONEstrftime r$   r"   _current_app_date_strr>   1   s+    <!67788AA*MMMr$   work_dirr	   c                    t           j        sdS t           j        pd}t          j                            ||t                                }t          j        |d           t          j                            |t          j                            |                     }	 t          j
        | |           t                              d|           dS # t          $ r&}t                              d|           Y d }~dS d }~ww xY w)NFz/tmpT)exist_okzPreserved work dir: %szFailed to preserve work dir: %s)r   HANDWRITING_PRESERVE_WORK_DIRHANDWRITING_PRESERVE_DIRospathr0   r>   makedirsbasenameshutilmoveloggerinfo	Exceptionerror)r?   r	   target_root
target_dirtarget_pathexcs         r"   _maybe_preserve_work_dirrR   4   s    1 u3=vKk63H3J3JKKJK
T****',,z27+;+;H+E+EFFKHk***,k:::t   6<<<uuuuus   0C 
D C;;D c                 H    t          | d          st          |            d S d S )Nsuccess)rR   r   )r?   s    r"   _finalize_success_work_dirrU   D   s2    #Hi88 H r$   background_tasksfilec                   K   |j         st          t          j        d          |j        r|j                                        dvr t          t          j        t                    |j                                                             d          st          t          j        d          t          d          }t          |j                   j
        }t          j                            ||          }	 d}t          |d          5 }|                    d	           d {V x}rj|                    |           |t#          |          z  }|t$          k    rt          t          j        d
          |                    d	           d {V x}jd d d            n# 1 swxY w Y   |dk    rt          t          j        d          	 t)          j        |                                           n)# t,          $ r t          t          j        d          w xY wt/          ||           t          j                            |t0          t2           d          }t          j                            |          st          t          j        d          |                     t:          |           t=          |dt2           dddi          |                                 d {V  S # t          $ r! tA          |d          stC          |            tD          $ r%}	tA          |d          stC          |            d }	~	wt,          $ r%}	tA          |d          stC          |            d }	~	ww xY w# |                                 d {V  w xY w)NzMissing filename.status_codedetail>   	image/jpg
image/jpeg)z.jpgz.jpegz$Only .jpg/.jpeg files are supported.handwritingr   wbi   zFile too large.zUploaded file is empty.zInvalid image file..ttfFont generation failed.font/ttfzCache-Controlzno-store)
media_typefilenameheadersfailed)#rd   r   r	   HTTP_400_BAD_REQUESTcontent_typelowerr   endswithr#   r   namerD   rE   r0   openreadwritelen	MAX_BYTES!HTTP_413_REQUEST_ENTITY_TOO_LARGEr   verifyrL   r   r   r   existsHTTP_500_INTERNAL_SERVER_ERRORadd_taskrU   r
   closerR   r   r   )
rV   rW   r?   	safe_name
input_pathtotal_bytesout_filechunkttf_pathrQ   s
             r"   process_handwriting_uploadr}   J   sI      = 
3<O
 
 
 	
  
 1 7 7 9 9 B ! ! 3$
 
 
 	
 =  ))*;<< 
39
 
 
 	

  ..HT]##(Ih	22J5*d## 	x!%;!7!77777777% u%%%s5zz)**'$*$L0   	 "&;!7!77777777% 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 !"70   	Jz""))++++ 	 	 	"7,   	 	Z***7<<,98J8J8JKKw~~h'' 	"A0   
 	!!"<hGGG!!'''$j1	
 
 
& jjll    '(;; 	"!!!   '(;; 	"!!!   '(;; 	"!!!
 jjllsn   7K$ 	BFK$ F!!K$ $F!%$K$ 
&G1 0K$ 1&HB2K$ $3M) L77M) M$$M))M, ,Nurlc                    t          d||          }t          j                            |d          }d}	 t	          | |t
                     t          |           t          ||           t          j                            |t          t           d          }t          j        
                    |          st          t          j        d          t          |d          5 }|                                }d d d            n# 1 swxY w Y   dt!          j                    j         d}	t'          |	|d	d
          }
d}|
                    d          |
                    d          d|rt+          |           S S # t          $ r! t-          |d          st/          |            t0          $ rL}t-          |d          st/          |           t          t          j        t5          |                    d }~wt6          $ r%}t-          |d          st/          |            d }~ww xY w# |rt+          |           w w xY w)Nhandwriting_urlz	input.jpgFr`   ra   rY   rbzfonts/rb   zpublic-read)keydatarh   aclTr~   r   )r~   r   rf   )r8   rD   rE   r0   r   rp   r   r   r   r   rs   r   r	   rt   rl   rm   r   r   r   r   getrU   rR   r   r   rg   strrL   )r~   r3   r4   r?   rx   rT   r|   fr   r   upload_resultrQ   s               r"   process_handwriting_urlr      s   
 )):JPPHh44JG)1sJ	::::&&&Z***7<<,98J8J8JKKw~~h'' 	"A0   
 (D!! 	Q6688D	 	 	 	 	 	 	 	 	 	 	 	 	 	 	-tz||'---%#	
 
 
 $((//8I8I%8P8PQQ"  	1&x0000	1!    '(;; 	"!!! 
 
 
'(;; 	"!!!3s88
 
 
 	
    '(;; 	"!!!
  	1&x0000	1sV   B-E< "D7E< DE< 
DAE< <3H(/AG66H( H##H((H+ +H?)NN)4rD   rH   r   r   pathlibr   r   zoneinfor   fastapir   r   r   r	   fastapi.responsesr
   PILr   app.lib.handwriting.configr   r   app.lib.handwriting.pipeliner   app.utils.fsr   app.lib.handwriting.errorsr   app.utils.loggerr   "app.services.storage.spaces_clientr   app.utils.media_ior   r   app.utils.messagesr   app.settingsr   rp   __name__rJ   r   r#   r2   r8   r>   boolrR   rU   r}   dictr   r=   r$   r"   <module>r      s   				                      F F F F F F F F F F F F * * * * * *       > > > > > > > > 5 5 5 5 5 5 $ $ $ $ $ $ 9 9 9 9 9 9 ' ' ' ' ' ' < < < < < < I I I I I I I I 0 0 0 0 0 0 ! ! ! ! ! !		H		=S =S = = = =
.s .s . . . .

:
: 4Z
:25*
:
: 
: 
: 
:Ns N N N Ns C D          O%O
O O O O Oh "11 11	11d
11 4Z11 
	11 11 11 11 11 11r$   