
    ch                         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mZ d dlZd dlZd dlT d dlmZ d	Zd
Zeez  ZdZdZ G d d          ZdS )    N)Path)TemporaryDirectory)Dict)parse)datetime)*)RFilei  i  gHzG?100%c                      e Zd ZdZg dZdedefdZdefdZdefdZ	d	edefd
Z
ededefd            Zededefd            Zed             ZdefdZdDdZedEd            Zedefd            Zd ZdEdZed             ZdEdZedEd            ZedEd            Zed	ededefd            Zd	edefdZdedefdZeded eddfd!            Zed"ededdfd#            Zd$ededdfd%Zd&ed$eddfd'Z ded(eddfd)Z!dEd*Z"ed+ed,ed-eddfd.            Z#dFd+ed-ed0edefd1Z$edFd+ed-ed2ed0edef
d3            Z%ed4edefd5            Z&defd6Z'd7 Z(d8 Z)d9 Z*defd:Z+e,d;             Z-edDdefd<            Z.dGd>Z/e e0d?d@d=A          dB                         Z1e e0d?d@d=A          dC                         Z2dS )HCmfPluginConvertMixinuO   
    Используется в классах CmfDocument, CmfAttachment
    )save_to_pdfsave_to_docxexport_to_docxexport_to_pdfexport_obj_list_to_pdfexport_tree_to_pdfcontent	extensionc                 r   ddl m} |                    | j        j         d| j                    d| }t                              t          j	        |          }|
                                5  |                                 ddd           n# 1 swxY w Y   |                    |d           |j        S )	up  
        Метод сохраняет файл директорию объекта и возвращает путь для скачивания
        :param content: Контент в байт
        :param extension: Расширение файла
        :return: file_path: Строка пути с кодированием символов для URL
        r   )cmfutil_.parentnameNF)make_preview)cmf.utilr   translit_stripr   valuecodemodelsCmfAttachmentgcurrent_userdisable_aclsaveupload_fileurl)selfr   r   r   	file_name
attachments         +./common/models/cmf_plugin_convert_mixin.py_save_export_filez'CmfPluginConvertMixin._save_export_file'   s     	%$$$$$--.N.N49.N.NOO]]R[]]	))i)PP
  "" 	 	OO	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	wU;;;~s   /BBBreturnc                     t          d           |                                 }|                     t          |d          dd          }|                     |dd          }|                     |d          }|S )	u   
        Сохраняет HTML -> PDF
        Используется преобразование через DOCX, из-за этого нет разрыва страниц.

        :return: Данные pdf в виде строки base64
        !   УСТАРЕВШАЯ ВЕРСИЯutf-8encoding.htmldocx:MS Word 2007 XML.docxpdf:writer_pdf_Exportpdf	cmf_alert_handle_htmlobj_to_formatbytesr-   )r)   argskwargshtml
docx_bytes	pdf_bytesurl_file_paths          r,   r   z!CmfPluginConvertMixin.save_to_pdf9   s|     	5666  ""''dW(E(E(EwPghh
&&z7<STT	..y%@@    c                     t          d           |                                 }|                     t          |d          dd          }|                     |d          }|S )uu   
        Сохраняет HTML -> DOCX

        :return: Данные docx в виде строки base64
        r0   r1   r2   r4   r5   docxr9   )r)   r>   r?   r@   rA   rC   s         r,   r   z"CmfPluginConvertMixin.save_to_docxI   sd     	5666  ""''dW(E(E(EwPghh
..z6BBrD   	html_textc                    ddl m} ddlm}  |            } |            }t	                      5 }|                     ||          }|                    ||           t          j                    }|	                    |           |
                    d           |                                cddd           S # 1 swxY w Y   dS )ud   
        Преобразует HTML -> DOCX

        :return: Данные в байтах
        r   )Document)
HtmlToDocxN)rF   rI   htmldocxrJ   r   _handle_view_htmladd_html_to_documentioBytesIOr&   seekgetvalue)	r)   rG   rI   rJ   document
new_parsertmp_dir_namer@   	docx_files	            r,   html_to_docxz"CmfPluginConvertMixin.html_to_docxW   s    	"!!!!!''''''8::Z\\
!! 	(\)))\BBD++D(;;;
IMM)$$$NN1%%''	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	(s   A=B99B= B=c                 N    t          j        |                                           S )up   
        Преобразует байты в строку base64

        :return: Строка base64
        )base64	b64encodedecode)r   s    r,   _get_base64z!CmfPluginConvertMixin._get_base64k   s!     ((//111rD   r   c                 L   |                      d          rAt          dz  t          |                                                     dd                    z  }n|                      d          rFt          |                                                     dd                    t
          z  t          z  }nr|                      d          r>t          |                                                     dd                    t          z  }nt          d          t
          z  t          z  }|S )u?  
        Метод масштабирует значение ширины под формат А4 и переводит его в пиксели
        :param value: Строка значения ширины в % или пикселях
        :return: pixels: Число с плавающей точкой
        %d    ptpx)endswithA4_PAGE_WIDTH_PXfloatstripreplacePT_TO_PXSCALE_A4)r   pixelss     r,   _get_value_in_pixelsz*CmfPluginConvertMixin._get_value_in_pixelst   s     >># 	6%+eEKKMM4I4I#r4R4R.S.SSFF^^D!! 	6EKKMM11$;;<<xG8SFF^^D!! 	65;;==00r::;;hFFF 3ZZ(*X5FrD   c                    | j                             d          r| j                             d          sdS t          | j                             d                                                              dd                    }t          | j                             d                                                              dd                    }||k    r)||z  }|dz
  }| d| j         d<   ||z   d| j         d<   dS dS )u   
        Метод масштабирует изображение под ширину ячейки таблицы
        :param img: Тег изображения
        :param cell_width: Ширина ячейки
        widthheightNra   r_   g)\(@)attrsgetrd   re   rf   )img
cell_width	img_width
img_heightproportion_ratios        r,   _auto_size_img_for_cellz-CmfPluginConvertMixin._auto_size_img_for_cell   s     y}}W%% 	SY]]8-D-D 	F#)--006688@@rJJKK	39==2288::BB4LLMM
z!!(:5"T)I$-!1!1!1CIg%.1A%A"E"E"ECIh	 "!rD   c                 r   |                                  }|                    d          D ]*}|                    |                    d                     +|                    d          D ]B}t	          |j                  dk     r(|                    |                    d                     C|                     |           |                     |           | 	                    |           | 
                    |           |                     |           |                     |           |                     |           |                    dd          }|                    d	d
          }d|_        |                    d|                    d                     |j                            |                    dd                     |j                            |           |                    |                    d                     |j                            |           t%          |          S )u   
        Обработка страницы html для сохранения

        :param html_text: Страница html
        :return: Обработанная страница html
        spoiler-iconclass_p   brr@   zru-RU)langstyletext/csstypea  
        @page { size: 21.0cm 29.7cm; margin: 1cm }
        body {
            font-family: Arial, Helvetica, FreeSans, 'Liberation Sans', sans-serif;
            font-size: 10pt;
            line-height: 1.2;
        }
        td { page-break-inside: avoid !important; }
        tr { page-break-after: avoid !important; }
        td p { margin-top: 0.2cm; margin-bottom: 0.2cm }
        r   headmetazUTF-8)charsetbody)handle_include_pagefind_allreplace_withnew_taglencontentsappend_handle_html_card_preview_handle_html_svg_to_png_handle_html_img_handle_html_infopanel_handle_html_layout_handle_html_table_handle_html_cleanstringinsertr   r   str)r)   soupspanrz   r@   r~   s         r,   r;   z"CmfPluginConvertMixin._handle_html   s    ''))MMM88 	1 	1Ddll3//0000 s## 	- 	-A1:""d++,,,&&t,,,$$T***d#####D)))  &&&%%%%%% ||F|11W:66
 	At||F++,,,	fg>>???	DLL(()))	4yyrD   Nc                 J   ddl m} |t                      }|                     dg           | j        j        r| j        j        nd} ||d          }|}|                    | j        j                   |                    d          D ]}|j	        
                    d	          }|rf||vrbt          j        
                    |
          }|r+|                    |          }	|                    |	           o|                                 |                                 |S )u  
        Подгружает html text из Include страницы
        :param parent_pages: ID родителей страницы для проверки на зацикливание
        :return: bs4.BeautifulSoup soup: Объект библиотеки
        r   BeautifulSoupNtext_renderr_   html.parserzmacros-include-pagerx   zdata-param-pageid)id)bs4r   setload_fieldsr   r   addr   r   rn   ro   r!   CmfDocumentr   r   	decompose)
r)   parent_pagesr   rG   r   pagesinclude_pagepage_idinclude_documentinclude_htmls
             r,   r   z)CmfPluginConvertMixin.handle_include_page   sD    	&%%%%%55L-))).2.>.DLD$**"	}Y66		$'-    MM1FMGG 	) 	)L"(,,-@AAG )7%//#)#5#9#9W#9#E#E # -#3#G#G#N#NL --l;;;; **,,,,&&((((rD   c                 <   |                      d          D ]}|                    d          }d|j        d<   |                    d                              |                     d                    }|                    d                              |                     d                    }|                     d          }|                    |           |                    |           |                    |           |                    |           d	S )
u  
        Метод парсит DIV вложения и оставляет в нем только нужные теги: изображение, имя файла и дата

        :param bs4.BeautifulSoup soup: Объект библиотеки
        zapp-tinymce-card-previewrx   rp   150pxrl   zapp-tinymce-file-name-viewdivzapp-tinymce-file-create-viewN)r   findrn   wrapr   r   r   )r   previewrp   r*   file_creater   s         r,   r   z/CmfPluginConvertMixin._handle_html_card_preview   s    }},F}GG 	& 	&G,,u%%C!(CIg,HIINNt||\aObObccI!,,.L,MMRRSWS_S_`eSfSfggK,,u%%CJJsOOOJJy!!!JJ{###  %%%%	& 	&rD   c                    |                      dd          }|D ]l}|                    dd          }|rQ|                     d          }|                    t	          |j                             |                    |           m| S )uq   
        Метод очищает markdown макрос от лишних тегов для libreoffice
        r   zmacros-panel wikimarkdownrx   zbody-previewrz   )r   r   r   extendlistr   r   )r   macros_panelspanelpreview_divnew_ps        r,   _handle_html_markdownz+CmfPluginConvertMixin._handle_html_markdown   s    
 e4OPP" 	* 	*E**U>*BBK *S))T+"677888""5)))rD   c           	      R   ddl }ddlm} |                    d          D ]}	 d}|                    d          x}rT|j                            d          }dd	d
| j        j        gdd
| dgg}t          j
                            |dg          }|r#|                    d|j        j                  }	n|j                            d          }
|j                            d          }|j                            d          }|r4|                                }|d         |j        d<   |d         |j        d<   d}|                    dt                              |          i          D ]B}|j                            d          }d}t                              |||          |j        d<   C|                    t%          |                    }|                     |          }|
r|s1|                    t+          j        |                    }	|	j        \  }
}|                    dd| t%          |
          t%          |                    }	|                    |	           J# t2          $ r0 dt%          |           }t4                              |           Y w xY wdS )ud  
        Метод заменяет тег SVG тегом IMG с изображением в PNG.
        Конвертирует SVG в PNG, если SVG в диаграммах DrawIO, то сначала пытается найти готовый PNG диаграммы
        :param bs4.BeautifulSoup soup: Объект библиотеки
        r   NImagesvgzdrawio-contentrx   zdata-drawio-titleAND	parent_id==r   z.pngr(   filterfieldsrp   )srcrl   rm   viewbox      z"rgb\((\d+)[\s,]+(\d+)[\s,]+(\d+)\)fillrn   zrgb(\1, \2, \3))
bytestringzdata:image/png;base64,)r   rl   rm   u3   Не удалось заменить SVG на PNG: )cairosvgPILr   r   find_parentrn   ro   r   r   r!   r"   r   r(   splitrecompilesubsvg2pngr   r[   openrN   rO   sizer   	Exceptionlogging	exception)r)   r   r   r   r   r+   drawiodrawio_titler   rp   rl   rm   r   svg_sizepatterntag_with_fillrgbreplimg_byte
img_base64err_msgs                        r,   r   z-CmfPluginConvertMixin._handle_html_svg_to_png  s    	=='' $	+ $	+C#+!
 __4D_EEE6 Y#)<#3#34G#H#HL#k4%G&RV[gXmXmXmInoF!'!5!9!9QVPW!9!X!XJ M,,u*.2F,GGCCIMM'22E Y]]844F!immI66G :#*==??-5a[	'*.6qk	(+CG),VRZZPWEXEX<Y)Z)Z Q Q+155f==168ffWdC6P6P+F33'//3s88/DDH!%!1!1(!;!;J  1 1#jjH)=)=>>(+v,,u2W:2W2W-0ZZF ' M MC  %%%% + + +ZPSTWPXPXZZ!!'*****+E$	+ $	+s   II**6J$#J$c           
         ddl m} ddl}|                                5 }|                    d          D ]}|j                            d          }|j                            d          }|rt                              dd|	                    d	d
                    }|
                    d          r/t          dz  t          |	                    dd                    z  }nt          |          }|rt                              dd|	                    d	d
                    }|
                    d          r/t          dz  t          |	                    dd                    z  }nt          |          }|j                            d          }|s_|                    dt          j                   s#|                    dt          j         d          rG|	                    dt          j         d          }|	                    dt          j         dd          }|                    d          s|                    d          r
|j                            d          }	|	                    dd          }t!          j        |          }
t!          j        |
j                  }|	r#t(          j                            |	dg          }n2ddd|gdd|
j        gg}t(          j                            |dg          }|rt-          |j                  }n-t-          |	                    dt          j                            }|                                st-          t          j                  dz  }	 |                    |          }|j        \  }}t7          |d          5 }|                     |                                          }|j                                         }d| d| |j        d<   ddd           n# 1 swxY w Y   nI# tB          $ r< |"                    |j#                   tH          %                    d | d!           Y w xY w|                    d"          r	 tM          j        |d#$          }|j'        d%k    sJ d&|j'                     ||(                    d
          d'z   d         }|d(vrd)}|                     |j)                  }d| d| |j        d<   t-          | d*tU          j+                    d+d
|           }t7          |d,          5 }|,                    |j)                   ddd           n# 1 swxY w Y   |                    |          }|j        \  }}n~# tB          $ rq}|-                    d-          }d.d/i|_        d0|_.        |"                    |           tH          %                    d1           t_          d2|            Y d}~d}~ww xY w|                    d3          r	 t                              d4d|          }ta          j1        |          }|                    te          j3        |                    }|j        \  }}n~# tB          $ rq}|-                    d-          }d.d/i|_        d0|_.        |"                    |           tH          %                    d5           t_          d6|            Y d}~d}~ww xY w|r|s
||z  }||z  }|r|s
||z  }||z  }|s|s|}|}||z  }|th          z  }||z  }|tj          k    s|dk    r'|r
tj          |z  nd'}tj          }|tm          |          z  }| d7|j        d<   | d7|j        d<   |                    d.          r^d8|d.         v rT|-                    d9d:;          }  |j-        	 d<i |j        }!| 7                    |!           |"                    |            	 ddd           dS # 1 swxY w Y   dS )=u#  
        Метод заменяет адрес картинки на base64 и масштабирует размер изображения под формат А4 относительно исходного

        :param bs4.BeautifulSoup soup: Объект библиотеки
        r   r   Nrp   rl   rm   z[^0-9|%|\.]r_   ,r   r]   r^   r   zhttps://zhttp://z:8080/z	files/objzdata-attach-idz%25r   )r   r   ORr(   r   r   /files/common/static/file-outline.pngrbdata:image/z;base64,u	   Файл u/    не является изображениемhttp)r{      )timeout   u2   Код статуса ответа сервера r{   )pngbmpgiftifftifjpegjpgz/imgz%Y%m%d-%H%M%Szwb+rz   r~   z0color: red; font-style: italic; font-size: 10pt;u?   Не удалось отобразить изображениеuL   Не удалось скачать изображения документаuN   Не удалось скачать изображения документа: 
data:imagez^data:image/.+;base64,uG   Не удалось конвертировать изображениеuI   Не удалось конвертировать изображение: ra   zmargin-left: auto;r   z text-align: center; width: 100%;r~   )rp   )8r   r   tempfiler   r   rn   ro   r   r   rf   rb   WEB_PAGE_WIDTH_PXrd   
startswithconfigAPP_FQDNr   urlparseunquotepathr!   r"   r   full_path_file
UPLOAD_DIRexistsPROJECT_DIRr   r   r[   readformatlowerr   r   r   r   r   requestsstatus_coderfindr   r   nowwriter   r   r:   rX   	b64decoderN   rO   rh   rc   absr   )"r)   r   r   r   tmp_dirimg_tagrl   rm   r   	attach_idr(   url_path_unquoter+   _filterattach_pathrp   width_originalheight_originalattachment_byteattach_base64	mime_typeresextension_img	file_pathfpetag_iimg_base64_dataimg_byte_datascalert   coefficientimg_wrapper	clone_imgs"                                     r,   r   z&CmfPluginConvertMixin._handle_html_img>  sm	    	((** @	6g==// 6 6))'22 **844 -FF>2u}}S#7N7NOOE~~c** - 1C 7%cSU@V@V:W:W W %e /VVNBsC8P8PQQFs++ /!2S!85PSUWAXAX;Y;Y!Y!&vm''.. >>">V_">">?? L3>>Rr\b\kRrRrRrCsCs L++&B&B&BBGGC++&F&F&F&FKKC>>#&& !#..*E*E ! ' 1 12B C CI++eS11C.--C',}SX'>'>$  \%+%9%=%=TWSX%=%Y%Y

#'%7G)H5RVX[X`Ja"b%+%9%=%=WVYUZ%=%[%[
! c&*:+D&E&E&*+;+C+CIvO`+a+a&b&b&--// b&*6+=&>&>Aa&a!#jj55:=(7!+t44 d,0,<,<_=Q=Q=S=S,T,TM(+
(8(8(:(:I3c3c3cTa3c3cGM%0d d d d d d d d d d d d d d d % ! ! !,,[-=>>>))*rk*r*r*rsss !
 >>&)) !!&l3???"#5557}lol{7}7}555(+CIIcNN1,<,=,=(>(0\\\,1M(,(8(8(E(E/c]/c/cTa/c/ce,$(G)g)g)g)g)gXe)g)g$h$h	!)U33 2rHHS[1112 2 2 2 2 2 2 2 2 2 2 2 2 2 2#jj33:=(7$ ! ! ! $S 1 1'.0b&c'h,,U333))*yzzz!"vst"v"vwww ! >>,// !!*,&&1JBPS*T*T(.(8(I(I#jjM)B)BCC:=(7$ ! ! ! $S 1 1'.0b&c'h,,U333))*sttt!"qno"q"qrrr !  5 5!N2E,u4F 3% 3"_4E*U2E -V -*E,F#(6> (!11+++uzz>C"J"2U":":K,Ec+...F,1g&-3---h';;w'' 6,@GGDT,T,T"&,,v=_,"`"`K ,! !!-! !I  &&y111((5556@	6 @	6 @	6 @	6 @	6 @	6 @	6 @	6 @	6 @	6 @	6 @	6 @	6 @	6 @	6 @	6 @	6 @	6s   M_;4/P#AP 4P PPPP_;AQ_;Q_;,B<U:(UU:UU:U"U:9_;:
W5A&W0*_;0W55_;A!Y0/_;0
[+:A&[& _;&[++D_;;_?_?c                 F   |                      d          D ]}|                     dddd          }|j                            d          }|dk    rd	|j        d
<   nT|dk    rd|j        d
<   nC|dk    rd|j        d
<   n2|dk    rd|j        d
<   n!|dk    rd|j        d
<   n|dk    r
d|j        d
<   |                    |                     dd                     |j                            |                     ddd                     |                    d          }|K|j        rDd|j        j        d<   d|j        j        d<   |j        j        	                    |j        d g           |                    d!          }|                     ddd"          }|                     d#d$d%&          }|	                    d' |j
        D                        |	                    |g           |j        	                    |g           |                    |           
dS )(u   
        Подменяет инфопанели. Создает панели в виде table вместо div
        :param bs4.BeautifulSoup soup: Объект библиотеки
        :return:
        zak-editor-panelrx   tabler
   0)rl   cellpaddingcellspacingzdata-panel-typenotez/background: #eae6ff; border: none; padding: 0cmr~   infoz/background: #deebff; border: none; padding: 0cmsuccessz/background: #e3fcef; border: none; padding: 0cmalarmz/background: #feece5; border: none; padding: 0cmerrorwarningz/background: #fffae6; border: none; padding: 0cmtrzbackground: transparentr   tdtopz1width: 36px; orphans: 0; widows: 0; margin: 0.2cm)valignr~   zak-editor-panel__iconN	absmiddlealignborder zak-editor-panel__contentz$orphans: 0; widows: 0; margin: 0.2cmfont3zfont-size: 12pt)r   r~   c                     g | ]
}|d k    |S )
 ).0r   s     r,   
<listcomp>z@CmfPluginConvertMixin._handle_html_infopanel.<locals>.<listcomp>  s    LLL1!t))Q)))rD   )r   r   rn   ro   r   r/  r   rp   r0  r   r   r   )r   r   r%  
panel_typeiconpanel_contenttd_tagtag_fonts           r,   r   z,CmfPluginConvertMixin._handle_html_infopanel  sV    ]]*;]<< "	& "	&ELLCUXLYYE):;;JV##'XG$$v%%'XG$$y(('XG$$w&&'XG$$w&&'XG$$y(('XG$LLd2KLLMMMHOODLLe/b ) d d e e e ::%<:==DDH*5w'+.x(""DHc?333!JJ.HJIIM\\$u<b\ccF||F<M|NNHOOLL(>LLLMMMMM8*%%%HOOVH%%%u%%%%E"	& "	&rD   c           	      F   dd l }	 i dddddddd	d
dddddddddddddddddddddd d!d"d#d$d%d&}|                    d'          D ]J}i }|                    d(d)*          }|r|                    |           |                    d+d,                              d-          D ]E}|rA|                    d.          \  }}	|	                                ||                                <   F|                    d/          r|                    d/d,          t          k    rU|                    d/t                    }
|                    d/t                    t          k    r|
|d/<   nt           |d/<   d,|d+<   |                    d0          sd1|d0<   |                    d2          sd1|d2<   |                    d3          sd4|d3<   |                    d5          s|                    d5d6          |d5<   i }|j	        g }| 
                    |                    d/                    }
t          |j	                            d7                    }t          |j	        j        d89          D ]\  }}i }t          ||j        j                  s"|j                            d+d,                              d-          D ]E}|rA|                    d.          \  }}	|	                                ||                                <   F|                    d/          x}	r | 
                    |	          }|||<   |
|z  }
d ||<   |                    |           t          |          dk    r|
t          |          z  }|D ]}|||<   |j	                                         t)          t+          |                                                    }|                    d:          D ]}d8}d}| 
                    |                    d/                    }
|                    d;d<g          D ]}i }d=|d3<   |                    d>          r2|j                            d>          }|                    |          |d?<   |                    d+d,                              d-          D ]E}|rA|                    d.          \  }}	|	                                ||                                <   F|t          k    rd@}n|sB|                    d/          p|                    d/          x}r| 
                    |          }n|                    |          }|                    dA          }|rN|rLt1          |d8z   t3          |          |z             D ]}||k    r n|||         z  }|t3          |          z  }n|d8z  }|r{|                                }dB}|D ]%}|j        rt7          |j                  dCk    r|} n&| dD|d/<   |
|z  }
|                    dE          D ]}|                     ||           |d8z  }|dk    rW|
|z  }|                    d;d/d iF          D ]8}| dD|d/<   |                    dE          D ]}|                     ||           9Ld S )GNr   zLight greenz#e3fcefz
Light tealz#e6fcffBluez#b3d4ffzLight yellowz#fffae6z	Light redz#feece5zLight purplez#eae6ffz
Light grayz#f4f5f7Tealz#b3f5ffGreenz#abf5d1zDark yellowz#ffc400Yellowz#fff0b3Redz#ffbdadPurplez#c0b6f2Grayz#b3bac5z	Dark Bluez#4c9affz	Dark tealz#79e2f2z
Dark greenz#57d9a3z#ff8f73z#998dd9)zDark redzDark purpler%  r   ztableView-content-wraprx   r~   r_   ;:rl   r'  r&  r(  bordercolorz#eeeeeer5  1colr{   )startr/  r0  thnonezdata-highlight-colorbgcolor   colspan
   z[<br/>]ra   rp   r   )r   r   r   r   ro   r   re   FULL_SCREEN_VALUErc   colgrouprj   r   	enumeratechildren
isinstanceelementTagrn   r   r   roundsumvalueshas_attrrangeintr   r   ru   ) r)   r   r   cell_colorsr%  style_table_dictr   paramsr   r   table_width
cols_widthcol_without_width	col_countcol_numrO  style_col_dictwidth_pxccols_sumr/  	nums_cols
table_celltd_styletable_cell_color_nametd_widthrU  itable_cell_childrentable_cell_widthtable_cell_childrp   s                                    r,   r   z(CmfPluginConvertMixin._handle_html_table  s   


	
9
)
 I
 I	

 
 I
 )
 I
 Y
 9
 i
 9
 i
 I
 
  !
" )#
$ "$'
 
 
* ]]7++ k	H k	HE!&&u5M&NNF +##E***))GR0066s;; C C C"(,,s"3"3KD%5:[[]]$TZZ\\299W%% $7B)?)?BS)S)S.227<MNN#''1BCCGXXX%0E'NN(8%:E'N!#g99]++ +'*m$99]++ +'*m$99]++ 1'0m$99X&& F"2"6"6x"E"EhJ~)$&!"77		'8J8JKK 7 7 > >??	$-en.EQ$O$O$O : :LGS%'N%c3;?;; ! "%)--"<"<"B"B3"G"G I I! I*0,,s*;*;KD%;@;;==N4::<<8 . 2 27 ; ;;u :#'#<#<U#C#C.6
7+#x/.2
7+)009999())A--*S1B-C-CCH. 1 1(0
1((***S!2!2!4!45566HnnT** 5H 5H	"77		'8J8JKK"$++tTl";"; (' ('J!H06J}-"++,BCC W0:0@0D0DE[0\0\-0;@U0V0V
9-",..""="="C"CC"H"H C C! C*0,,s*;*;KD%5:[[]]HTZZ\\2 #333#%' )'/||G'<'<'W
w@W@WW8 K'+'@'@'J'JH#->>'#:#:",..";";# ) )%*7Q;Gw8N%O%O : :#$y==$)E (JqM 9#s7||3GG#qLG '.8.A.A.C.C++-(0C & &,/8 &SAQAZ=[=[_h=h=h3; 0 %1A.E.E.E
7+#x/#-#6#6u#=#= H HC 88hGGGGH "Q		q==*Y6H&(kk$wok&N&N H H
19ooo
7+#-#6#6u#=#= H HC 88hGGGGHi5Hmk	H k	HrD   c                    ddl m |                     dddi          D ]}d|d<   d|_        |                     d	          }fd
|j        D             }t          |          }t          d|z  d          }|D ]:}d|_        |                    d| d          |d<   |	                    |           ;|	                    |           dS )u   
        Функция добавляет стиль для макета, используем table, так как flex не поддерживается в LibreOffice

        :param bs4.BeautifulSoup soup: Объект библиотеки
        r   )r]  r   zdata-layout-sectiontruer
   rl   r%  r/  c                 4    g | ]}t          |          |S r;  )r[  )r<  elr]  s     r,   r=  z=CmfPluginConvertMixin._handle_html_layout.<locals>.<listcomp>  s(    KKKbz"c7J7JKrKKKrD   r^   r   r0  zdata-column-widthr]   N)
r   r]  r   r   r   rZ  r   r^  ro   r   )r   layoutr/  columnsrp  width_columncolumnr]  s          @r,   r   z)CmfPluginConvertMixin._handle_html_layout~  s     	mmE,A6+JKK 	 	F$F7O!FKd##BKKKKFOKKKGGI y!44L! " """(**-@\BTBTBT"U"Uw		&!!!!MM"	 	rD   c                 d    |                      ddg          D ]}|                                 dS )u   
        Метод очищает HTML от лишних тегов

        :param bs4.BeautifulSoup soup: Объект библиотеки
        ztable-context-menuzcell-dropbox-buttonrx   N)r   r   )r   tags     r,   r   z(CmfPluginConvertMixin._handle_html_clean  sA     ==)=?T(U=VV 	 	CMMOOOO	 	rD   tmp_pathc           	      Z   ddl m}m} ddlm}  ||           }g }|                    d          D ]g}d|j                            dd          v r$|                    t          |d	                     |j                            d
          s
d|j        d
<   h|                    d          D ]&}|                    t          |d	                     '|                    d          D ]}|
                                 |                    d          D ]}|
                                 t          |          D ]`\  }}	|	d         }|j                            dd          }
|j                            dd          }|j                            d          }|                    d          r|                    d          \  }}|                    dd          }|                    dd          }t          |          d| d| z  }t!          |d          5 }|                    t%          j        |                     t)          |          |j        d<   ddd           n# 1 swxY w Y   |                    d          rt+          j        |          }t.          j                            ddt2          j        gdg          }|rt          |j                  }n-t          |                    dt2          j                            }|                                r8t)          |          |j        d<   |
s|                    |          }|j        \  }
}d }t=          d                    d! t)          |
          D                                 }|                    d"          r}t          t2          j                   d#z  }|!                    d$          d%k    rtE          |          n|!                    d$          }||!                    d          |         }tG          j        |          }|j$        d&k    rt          |          }|d'| | z  %                                }t!          |d          5 }|                    |j&                   ddd           n# 1 swxY w Y   	 |                    |          }|j        \  }
}t)          |          |j        d<   |r|n|
r|
n|}n9# |$ r t)          |          |j        d<   Y nw xY wt)          |          |j        d<   ||k    r|n|}|ri||z  r||z  nd(}||j        d<   t=          d                    d) t)          |          D                                 } t=          | |z            |j        d<   bt)          |          S )*u   
        Функция заменяет адрес картинки, файла на фактический

        :return: HTML с фактическими адресами картинок, файлов
        r   )r   UnidentifiedImageErrorr   azcmf-fileclassr_   file)objr   hrefrp   imager~   titler  rl   rm   r   r   r   r   z;base64file_r   wbNr   r(   r   r   r   i  c              3   B   K   | ]}|                                 |V  d S Nisdigitr<  r|  s     r,   	<genexpr>z:CmfPluginConvertMixin._handle_view_html.<locals>.<genexpr>  s/      &O&Ob"**,,&Or&O&O&O&O&O&OrD   r   r   ?r   name_r{   c              3   B   K   | ]}|                                 |V  d S r  r  r  s     r,   r  z:CmfPluginConvertMixin._handle_view_html.<locals>.<genexpr>  s/      +U+U2

+UB+U+U+U+U+U+UrD   )'r   r   r  r   r   r   rn   ro   r   dictr   rY  r   r   rf   r   r   r
  rX   r  r   r   r   r!   r"   r   r   r   r  r   rc  joinr  r  r   r  r  resolver   )!rG   r  r   r  r   r   filesr  index_filerl   rm   full_urltype_imgb64data	name_filefile_imgurl_pathr+   attachment_pathrp   width_defaultwidth_valuepath_defaultend_namefile_extensionresponser  filepathr  	width_newr!  height_values!                                    r,   rL   z'CmfPluginConvertMixin._handle_view_html  s+    	65555555%%%%%%}Y''==%% 	' 	'CSY]]7B7777Tc7778889==(( '$&	&!=='' 	6 	6CLL#G4445555==)) 	 	CMMOOOO==)) 	 	CMMOOOO%e,, <	F <	FLE5,CIMM'1--EY]]8Q//Fy}}U++H""<00 6$,NN3$7$7!'#++M2>>#++Ir:: NN-GU-G-GX-G-GG	)T** 6hNN6#3G#<#<==='*9~~CIe$6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ""9-- 1 =22#155eT6K\=]gjfk5ll
 [&*:+D&E&EOO&*8+;+;IvGX+Y+Y&Z&ZO"))++ 1'*?';';CIe$  1#jj99(+vMbgg&O&OCJJ&O&O&OPPQQK""6** 9#F$677:ZZ,4NN3,?,?2,E,E3x===8>>Z]K^K^!)(..*=*=h*F!G#<11'3.."8nnG '*I%*I*I*I IRRTTHh-- 5

8#34445 5 5 5 5 5 5 5 5 5 5 5 5 5 5=#jj22(+v+.x==	%(5@&ikkPUGhuu[h1 = = =+.|+<+<	%(((= (+<'8'8CIe$)4})D)D+I F9B[9PWi+55VW%.	'""277+U+UV+U+U+U#V#VWW&),*D&E&E	(#4yys7   ?I&&I*	-I*	:R!!R%	(R%	-A S..TTc           	         ddl m}m} ddlm} t          j        d||f          }t          j        	                    t          j        
                    t          j                            t                    dd                    }t          j        
                    |ddd	d
dd          } |            }d|_        |                                 |                    dd|           |                    d            ||          }|                    d          D ]}	d|	j        d<   |                    d          D ]}	d|	j        d<   d|	j        d<   t'                      5 }
|                    |                     |                                |
                     t/          |                                          cddd           S # 1 swxY w Y   dS )uw   
        Конвертирует HTML -> PDF

        :return: Возвращает байты PDF файла
        r   )FPDF	HTMLMixinr   	_HTML2PDF)basesz..modulesappassetsfontsz	noto-sanszNotoSans-Regular.ttfr1   NotoSansr_   r%  r
   rl   r0  100rN  rU  N)fpdfr  r  r   r   types	new_classosr   abspathr  dirname__file__core_fonts_encodingadd_pageadd_fontset_fontfindAllrn   r   
write_htmlrL   prettifyr=   output)r)   rG   r  r  r   r  	path_fontr8   r   r  rT   s              r,   html_to_pdfz!CmfPluginConvertMixin.html_to_pdf  s    	)(((((((%%%%%%OKi7HIII	GOOBGLL1J1JDRV$W$WXX	GLLIuhQ\^tuu	ikk")ZY///Z   }Y''<<(( 	( 	(C!'CIg<<%% 	' 	'C!&CIg#&CIi  !! 	'\NN411$--//<PPQQQ&&	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	's   $AGGG	path_docxc                     ddl m} t          j                            |          r<t          |d          5 } ||          }|j        cddd           S # 1 swxY w Y   dS dS )u7   
        Конвертирует DOCX -> HTML
        r   )convert_to_htmlr   N)mammothr  r  r   r  r   r   )r)   r  r  rU   results        r,   docx_to_htmlz"CmfPluginConvertMixin.docx_to_html  s    
 	,+++++7>>)$$ 	$i&& $)(33|$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $	$ 	$s   AAApath_imgrB   c                 0    t          j        | |           dS u5   
        Конвертирует PDF -> PNG
        N)r	   pdf_bytes_to_imgr  rB   s     r,   r  z&CmfPluginConvertMixin.pdf_bytes_to_img%  s    
 	x33333rD   path_pdfc                     dS r  r;  )r  r  s     r,   
pdf_to_imgz CmfPluginConvertMixin.pdf_to_img,  s	     	rD   	path_htmlc                    t           j                            |          rit          |d          5 }|                     |                                          }|                     ||           ddd           dS # 1 swxY w Y   dS dS )u6   
        Конвертирует HTML -> PNG
        rr  N)r  r   r  r   r  r  r  )r)   r  r  	file_htmlrB   s        r,   html_to_imgz!CmfPluginConvertMixin.html_to_img4  s     7>>)$$ 	Ni%% N ,,Y^^-=-=>>	%%x9%MMMN N N N N N N N N N N N N N N N N N	N 	Ns   ?A<<B B 	path_xlsxc                 *    ddl m }  |||           dS )u7   
        Конвертирует XLSX -> HTML
        r   	xlsx2htmlNr  )r)   r  r  r  s       r,   xlsx_to_htmlz"CmfPluginConvertMixin.xlsx_to_html=  s.    
 	('''''	)Y'''''rD   path_pngc                 f    ddl m} |                    |          }|                    |           dS )u<   
        Сохранение в формате PNG
        r   r   N)r   r   r   r&   )r)   r  r  r   rp   s        r,   save_imgzCmfPluginConvertMixin.save_imgE  s?    
 	jj""rD   c                    ddl m} ddlm} ddlm ddlm  ||dd          }|                                }|                                }t          t          |                    D ]}|
                    ||                   }	|dk    r|j        }
||         |
_        n|                    ||                   }
|	j        D ](}|\  }}}}|
                    |d	z   ||d	z   |
           )fdt          |	j                  D ]K}|
                    fd|	                    ||	                    |                    D                        L|                    |           dS )u6   
        Конвертирует XLS -> XLSX
        r   )workbook)open_workbook)XL_CELL_DATE)xldate_as_tupleT)formatting_inforagged_rows)r  r{   )	start_rowend_rowstart_column
end_columnc                     | j         }| j        k    r: |d          }|dd         dk    rt          j        |dd           }n	t          | }|S )Nr   r   )r   r   r   )r   ctyper   time)cellr   datetime_tupr  r  s      r,   _get_xlrd_cell_valuez?CmfPluginConvertMixin.xls_to_xlsx.<locals>._get_xlrd_cell_valueh  sb    
:--#2?5!#<#<L#AaC(I55 (|ABB/? @ (, 7rD   c              3   .   K   | ]} |          V  d S r  r;  )r<  r  r  s     r,   r  z4CmfPluginConvertMixin.xls_to_xlsx.<locals>.<genexpr>s  sB       # # )(..# # # # # #rD   )end_colxN)openpyxlr  xlrdr  r  r  Workbooksheet_namesrb  r   sheet_by_nameactiver  create_sheetmerged_cellsmerge_cellsnrowsr   	row_slicerow_lenr&   )r)   path_xlsr  r  r  book_xls	book_xlsxr  sheet_index	sheet_xls
sheet_xlsxcrangerlorhiclochirowr  r  r  s                    @@@r,   xls_to_xlsxz!CmfPluginConvertMixin.xls_to_xlsxN  s   
 	&%%%%%&&&&&&%%%%%%(((((( =4TRRR%%''	**,, [!1!122 	 	K ..{;/GHHIa&-
#.{#;
  &33+k:R3SS
#0 O O%+"S#s&&q#47!G ' O O O O      Y_--  !! # # # # ) 3 3C)BSBSTWBXBX 3 Y Y# # #    
 	y!!!!!rD   dataoutput_pathsuffixc                     dS )u(  
        Конвертация данных в PDF через libreoffice
        :param data: Данные файла в виде байт
        :param output_path: Путь сохранения итогового pdf файла
        :param suffix: Расширение файла
        Nr;  )r  r  r  s      r,   
obj_to_pdfz CmfPluginConvertMixin.obj_to_pdfy  s	     	rD   r_   mimetypec                    ddl }ddlm} |                     ||d|          }|                                5 }t          |          dz  }t          |d          5 }	|	                    |           |                     t          |                    }
ddd           n# 1 swxY w Y   ddd           n# 1 swxY w Y   |
                    |
d                              d	d
          }|                    dd          } ||          }|                    d          }|r|                    d          }|r|                                }|                    d          D ]}|                    dd          }d}|d         D ]j}|                    d|           }|||d                             d          z   dz   }|||d                             d          z   }||||         z  }k|| z   |d<   t          |          S )u  
        Конвертация данных в HTML через libreoffice

        :param data: Данные файла источника в виде байт
        :param suffix: Расширение файла источника

        :return: Строка HTML
        r   Nr   r@   z	file.htmlr  ignore)errors u   �u   r_   r   r~   Trx   r  r   {r{   })r   r   r   r<   r   r   r   r
  get_encoding_typer   rZ   rf   r   get_textr   ro   )r)   r  r  r  r   r   
bytes_htmlr  full_path_htmlr  r3   rG   r   r   r~   
style_textr  	style_tagstyle_class	class_tagstart_pos_classstyle_start	style_ends                          r,   obj_to_htmlz!CmfPluginConvertMixin.obj_to_html  s    	%%%%%%''ffhGG
((** 	Gh!(^^k9Nnd++ Gy
+++11#n2E2EFFG G G G G G G G G G G G G G G	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G %%hx%@@HHQYZZ	%%h33	}Y''yy   	@IIg&&E 
@"^^--
===55 @ @C # 4 4I"$K%(\ I I	*4///i//*J*J&5
?CSCS8T8Y8YZ]8^8^&^ab&b$3jAQAQ6R6W6WX[6\6\$\	#z+i2G'HH#,+/?#?CLL4yys5   #B58BB5B"	"B5%B"	&B55B9<B9	to_formatc                     	 t          j        | |||          }n-# t          $ r }t                              |            d}~ww xY w|S )u*  
        Конвертация данных в HTML через libreoffice
        :param data: Данные файла в виде байт
        :param suffix: Расширение файла
        :param to_format: Формат файла который хотим получить
        N)r	   r<   r   r#   debug)r  r  r*  r  converted_dataerrs         r,   r<   z#CmfPluginConvertMixin.obj_to_format  sX    	"0vy(SSNN 	 	 	GGCLLL	 s    
A?A	path_filec                 @   ddl m}  |            }t          | d          5 }|D ]:}|                    |           |j        r|j                            d          r n;|                                 ddd           n# 1 swxY w Y   |j                            d          }|sxg d}|D ]q}	 t          j        | d|          5 }|	                                 |
                    d           |}	 ddd            n# 1 swxY w Y   `# t          $ r d	}Y nw xY w|S )
u   
        Определяем кодировку файла

        :param path_file: Путь к файлу
        :return: Кодировка файла
        r   )UniversalDetectorr   r3   N)r1   zwindows-1251zwindows-1250zwindows-1252asciiz
iso-8859-1latin1r  r2   r1   )chardet.universaldetectorr1  r   feeddoner  ro   closerN   	readlinesrP   UnicodeDecodeError)r/  r1  detectorr  liner3   	encodingsformat_encodings           r,   r  z'CmfPluginConvertMixin.get_encoding_type  s    	@?????$$&&)T"" 	d  d###= X_%8%8%D%D ENN	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ?&&z22 	'rrrI#, 	' 	''C/JJJ d(((		!#2	                
 * ' ' '&HHH' sH   AA??BB/D-D 3D D	DD	DDDc                    ddl m} |                     dg            || j        j        pd          }|                    d          }|                    dd          }d	|_        |j                            d|           |j        j	        
                    |           |                    d
          D ]*}|                    |                    d                     +|                    d          D ]B}t          |j                  dk     r(|
                    |                    d                     C|                     |           |                     |           |                     |           |                     |           |                     |           |                     |           |                     |           |                     |           t/          |          S )Nr   r   r   <p></p>r   r~   r   r   zg@page { size: 21.0cm 29.7cm } td,th { padding: 0.45cm; } td p,th p { margin: 0;word-break: break-all; }rw   rx   rz   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   head_tagr#  r   rz   s          r,   prepare_document_to_docxz.CmfPluginConvertMixin.prepare_document_to_docx  s   %%%%%%-)))}T-3@yAA <<''LLzL::	 E		H%%%	i(((MMM88 	1 	1Ddll3//0000 s## 	- 	-A1:""d++,,,&&t,,,""4((($$T***d#####D)))  &&&%%%%%%4yyrD   c                 f    |                      dg           | j        rt          dd           d S d S )Nperm_encryptu`   Зашифрованный документ не может быть экспортирован.T)abort)r   rC  r:   )r)   s    r,   check_encryptz#CmfPluginConvertMixin.check_encrypt   sb    .)*** 	Fx  AE  F  F  F  F  F  F	F 	FrD   c                     |                                   |                                 }|                     t          |d          dd          }|                     |dd          }|                     |d          }|S )Nr1   r2   r4   r5   r6   r7   r8   rE  rA  r<   r=   r-   )r)   prepared_htmlrA   rB   rC   s        r,   r   z#CmfPluginConvertMixin.export_to_pdf  s~    5577''mg(N(N(NPWYpqq
&&z7<STT	..y%@@rD   c                     |                                   |                                 }|                     t          |d          dd          }|                     |d          }|S )Nr1   r2   r4   r5   rF   rG  )r)   rH  rA   rC   s       r,   r   z$CmfPluginConvertMixin.export_to_docx  sf    5577''mg(N(N(NPWYpqq
..z6BBrD   c                    |                      ddg           ddlm}  || j        j        pdd          }|                    d          }| j        j        |_        |                    d|           | 	                    |           |                    dd	d
i          }|
                    |           t          |          S )Nr   projectr   r   r?  r   h1r   r~   zpage-break-after: always;r   )r   r   r   r   r   r   r   r   r   r   r   r   )r)   r   r   name_tag	break_tags        r,   prepare_document_to_exportz0CmfPluginConvertMixin.prepare_document_to_export  s    -3444%%%%%%}T-3@y-PP<<%%)/Ax   d###LLw8S.TLUU	I4yyrD   c                 h   dg}|D ]}t          |          }d |                                D             }|D ]y}t          |d          5 }|                                }|                    d          }	||	_        |j        j                            |	           d d d            n# 1 swxY w Y   z|S )Nz&/opt/eva-app/dist/cmf-angular/tinymce/c                 p    g | ]3}t          |                              d           $t          |          4S )z.css)r   rb   )r<  css_files     r,   r=  z:CmfPluginConvertMixin._append_css_tags.<locals>.<listcomp>+  s8    iii(#h--J`J`agJhJhiHiiirD   r  r~   )	r   iterdirr   r  r   r   r@   r   r   )
clsr   foldersfolder_namefoldercss_listrR  r  csscss_tags
             r,   _append_css_tagsz&CmfPluginConvertMixin._append_css_tags&  s    ;>" 
	3 
	3K+&&Fiifnn6F6FiiiH$ 3 3(C(( 3D))++C"ll733G%(GNIN))'2223 3 3 3 3 3 3 3 3 3 3 3 3 3 33 s   	AB%%B),B)c           
         ddl m} dd l}t                                          5  t
          j                            d           t
          j        j        	                                 d d d            n# 1 swxY w Y    || pdd          }|
                    d          }|j                            d|           |
                    ddd	i
          }|j        j                            |           t
          j                            |          }d|j        j        j        d<   t'                      5 }|sd}| d}| d| d}	t)          |d          5 }
|
                    t-          |                     d d d            n# 1 swxY w Y   |                    dddddd|	 | gd          }t
                              t2          j        | d          }t)          |	d          5 }|                    |dd           |                                 d d d            n# 1 swxY w Y   t                                          5  t
          j                            |           d d d            n# 1 swxY w Y   t
          j                            t2          j        d|dd            d d d            d S # 1 swxY w Y   d S )!Nr   r   i,  r?  lxmlr   r   r   r1   r   z%mce-content-body mce-content-readonlyr  exportz/export.htmlr   z.pdfwchromiumz
--headlessz--disable-gpuz--no-pdf-header-footerz--no-sandboxz--print-to-pdf=T)checkr   r   F)backupr   u&   Закончен экспорт в PDFuf   Файл доступен для скачивания в разделе "Фоновые задачи".)personr   r  force_notify_current_personmsg) r   r   
subprocessr   r%   r!   CmfDeferredJobset_estimate_durationdpcommitr   r@   r   r   r   r   r[  r   rn   r   r   r
  r   runr"   r#   r$   upload_stream_filer&   set_result_attachment	CmfNotifyplace_notify)r@   r*   r   rf  r   r@  charset_tagr  html_file_namepdf_file_namer  proc
new_attachfs                 r,   _export_html_to_pdfz)CmfPluginConvertMixin._export_html_to_pdf7  s&   %%%%%%   "" 	. 	.!77<<<!$++---	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. }T.Y77<<'' 		H%%%ll6)W1ElFF	k***!22488(O	W%!! #	W %$	 '555N&88888Mnc** &d

3t99%%%& & & & & & & & & & & & & & & >> #,"5m55%' " " # #D  --Q^YJ\J\J\-]]JmT** "a--aE-RRR!!!" " " " " " " " " " " " " " " $$&& H H%;;JGGGH H H H H H H H H H H H H H H ))~=,0| *   ;#	 #	 #	 #	 #	 #	 #	 #	 #	 #	 #	 #	 #	 #	 #	 #	 #	 #	s   AA33A7:A75"J;#F:J;F
	
J;F
	AJ;,-H%J;%H)	)J;,H)	-J;	 I5)J;5I9	9J;<I9	=1J;;J?J?Fc                    d}|t                      }|r| g| j                                        z   }n| j                                        }t          |d           }t	          |          D ]\  }}|j                            d          s|j                            d          r|j                            d          rT||vr|                    |           no|j                            d          r?	 |                    d           ||	                                z  }n# t          $ r Y nw xY w||                    |	          z  }|S )
Nr_   c                 4    | j                                         S r  )ordernoload)xs    r,   <lambda>z;CmfPluginConvertMixin.collect_html_nested.<locals>.<lambda>~  s    !)..2B2B rD   )keyCmfDocument:z
CmfFolder:zCmfProject:TTEXKOM_skip_failread_audit)	processed)r   
tree_nodesrz  sortedrY  r   r   r   _acl_check_readrO  CmfPermissionErrorcollect_html_nested)r)   export_selfr  	html_bodynodessorted_nodesru  nodes           r,   r  z)CmfPluginConvertMixin.collect_html_nestedt  s~   	I 	+FT_11333EEO((**Ee)B)BCCC .. 	G 	GGAtG&&~66 $':L:L\:Z:Z w))-889$$d####w!!.11 ((D(III!@!@!B!BBII)   D 11I1FFFIIs   7-D%%
D21D2u   Экспорт PDF-файлаT)descriptionshow_bg_progressbar
system_jobc                     t                               |           }|                    d          }t          j                            ||j                   dS )u\   
        Выгружает объект и всех его потомков в pdf
        T)r  )r*   N)r   get_obj_by_idr  r!   r   rv  r   )obj_idr  html_nesteds      r,   r   z(CmfPluginConvertMixin.export_tree_to_pdf  sQ     ##F++--$-??..{ch.OOOOOrD   c                 4   d}| D ]s}|                     d          st                              |          }|r?	 |                    d           ||                                z  }c# t
          $ r Y ow xY wtt          j                            |           dS )u   
        Выгружает все объекты из списка в pdf
        obj_list -- список id выгружаемых объектов
        r_   r~  Tr  N)	r   r   r  r  rO  r  r!   r   rv  )obj_listr@   r  r  s       r,   r   z,CmfPluginConvertMixin.export_obj_list_to_pdf  s      
	 
	F$$^44 ''//C ''4'HHHC::<<<DD)   D	 	..t44444s   -A((
A54A5r  )r.   N)r_   )FN)3__name__
__module____qualname____doc__api_methodsr=   r   r-   r   r   rV   staticmethodr[   rd   rj   ru   r;   r   r   r   r   r   r   r   r   r   rL   r  r  r  r  r  r  r  r  r  r)  r<   r  rA  rE  r   r   rO  classmethodr[  rv  r  cmf_deferred_jobr   r   r;  rD   r,   r   r      s        
 
 
K 3    $c     s    (c (e ( ( ( (( 2U 2s 2 2 2 \2 C E    \" F F \F"0c 0 0 0 0d   B & & & \&& s    \-+ -+ -+^I6 I6 I6 I6V (& (& \(&THH HH HH HHT    \,    \ YS YC YC Y Y Y \Yv'S 'U ' ' ' '>	$c 	$c 	$ 	$ 	$ 	$ 43 45 4T 4 4 4 \4 S C D    \NS NC ND N N N N(c (c (d ( ( ( (      )" )" )" )"V  S # $    \& & &s &c &3 & & & &P  E 3 3 # W\    \ S S    \B!# ! ! ! !FF F F
    #    $   [  : :S : : : \:x       D "AW[hmnnnP P on \P "AW[hmnnn5 5 on \5 5 5rD   r   )rX   hashlibrN   pathlibr   r   r   typingr   urllibr   r   r  r  cmf.includerdiskr	   r   rc   rh   rg   rW  r   r;  rD   r,   <module>r     s     				       ' ' ' ' ' '                                 // [5 [5 [5 [5 [5 [5 [5 [5 [5 [5rD   