Ë
    µŒjó#  ã                   óž   — d dl Z d dlZd dlZd dlmZ d dlmZmZm	Z	 d dl
mZ d dlmZ d dlmZ  e j                   e«      ZdZ G d„ d	e«      Zy)
é    N)ÚBytesIO)ÚListÚOptionalÚSequence)ÚElementTree)ÚDocument)Ú
BaseLoaderé@   c                   ó(  — e Zd ZdZ	 dddœdededee   defd„Z	 	 	 	 	 	 dd
ee	e      dee	e      dee   dededede	e
   fd„Zdedede	e   dd	fd„Zdee   dedede	e
   fd„Zdedededee
   fd„Zdedefd„Zdedefd„Zededefd„«       Zy	) Ú
QuipLoaderz_Load `Quip` pages.

    Port of https://github.com/quip/quip-api/tree/master/samples/baqup
    F)Úallow_dangerous_xml_parsingÚapi_urlÚaccess_tokenÚrequest_timeoutr   c                ó|   — 	 ddl m}  ||||¬«      | _        |st	        d«      ‚y# t        $ r t        d«      ‚w xY w)a•  
        Args:
            api_url: https://platform.quip.com
            access_token: token of access quip API. Please refer:
                https://quip.com/dev/automation/documentation/current#section/Authentication/Get-Access-to-Quip's-APIs
            request_timeout: timeout of request, default 60s.
            allow_dangerous_xml_parsing: Allow dangerous XML parsing, defaults to False
        r   )Ú
QuipClientz?`quip_api` package not found, please run `pip install quip_api`)r   Úbase_urlr   ac  The quip client uses the built-in XML parser which may causesecurity issues when parsing XML data in some cases. Please see https://docs.python.org/3/library/xml.html#xml-vulnerabilities For more information, set `allow_dangerous_xml_parsing` as True if you are sure that your distribution of the standard library is not vulnerable to XML vulnerabilities.N)Úquip_api.quipr   ÚImportErrorÚquip_clientÚ
ValueError)Úselfr   r   r   r   r   s         ús/var/www/html/Fitness-lenito-AI-main/venv/lib/python3.12/site-packages/langchain_community/document_loaders/quip.pyÚ__init__zQuipLoader.__init__   s]   € ð 	Ý0ñ &Ø%°Èô
ˆÔñ +Üð<óð ð +øô ò 	ÜØQóð ð	ús   ‚& ¦;NÚ
folder_idsÚ
thread_idsÚmax_docsÚinclude_all_foldersÚinclude_commentsÚinclude_imagesÚreturnc                 ó\  — |s|s|st        d«      ‚|xs g }|r|D ]  }| j                  |d|«       Œ |rN| j                  j                  «       }d|v r| j                  |d   d|«       d|v r| j                  |d   d|«       t	        t        |d| «      «      }| j                  |||«      S )aA  
        Args:
            :param folder_ids: List of specific folder IDs to load, defaults to None
            :param thread_ids: List of specific thread IDs to load, defaults to None
            :param max_docs: Maximum number of docs to retrieve in total, defaults 1000
            :param include_all_folders: Include all folders that your access_token
                   can access, but doesn't include your private folder
            :param include_comments: Include comments, defaults to False
            :param include_images: Include images, defaults to False
        z_Must specify at least one among `folder_ids`, `thread_ids` or set `include_all`_folders as Truer   Úgroup_folder_idsÚshared_folder_idsN)r   Úget_thread_ids_by_folder_idr   Úget_authenticated_userÚlistÚsetÚprocess_threads)	r   r   r   r   r   r   r    Ú	folder_idÚusers	            r   ÚloadzQuipLoader.load=   sØ   € ñ& ¡*Ñ5HÜð7óð ð
  Ò% 2ˆ
áÛ'�	Ø×0Ñ0°¸A¸zÕJð (ñ Ø×#Ñ#×:Ñ:Ó<ˆDØ! TÑ)Ø×0Ñ0ØÐ+Ñ,¨a°ôð # dÑ*Ø×0Ñ0ØÐ,Ñ-¨q°*ôô œ#˜j¨¨(Ð3Ó4Ó5ˆ
Ø×#Ñ# J°Ð@PÓQÐQó    r*   Údepthc           	      ón  — ddl m}m} 	 | j                  j	                  |«      }|d   j                  dd|z  «      }t        j                  d|› d|› �«       |d   D ]9  }	d|	v r| j                  |	d   |dz   |«       Œ!d|	v sŒ&|j                  |	d   «       Œ; y	# |$ r`}|j
                  dk(  rt        j                  d|› d|› d|› �«       n(t        j                  d|› d|› d|j
                  › �«       Y d	}~y	d	}~w|$ r2}t        j                  d|› d|› d
|j
                  › �«       Y d	}~y	d	}~ww xY w)z4Get thread ids by folder id and update in thread_idsr   )Ú	HTTPErrorÚ	QuipErrori“  zdepth z!, Skipped over restricted folder z, z, Skipped over folder z due to unknown error Nz due to HTTP error ÚfolderÚtitlez	Folder %sz, Processing folder Úchildrenr*   é   Ú	thread_id)r   r0   r1   r   Ú
get_folderÚcodeÚloggingÚwarningÚgetÚinfor%   Úappend)
r   r*   r.   r   r0   r1   r2   Úer3   Úchilds
             r   r%   z&QuipLoader.get_thread_ids_by_folder_idj   s_  € ÷ 	7ð	Ø×%Ñ%×0Ñ0°Ó;ˆFð& �xÑ ×$Ñ$ W¨k¸IÑ.EÓFˆä�‰�v˜e˜WÐ$8¸¸Ð@ÔAØ˜JÔ'ˆEØ˜eÑ#Ø×0Ñ0Ø˜+Ñ&¨°©	°:õð  Ò%Ø×!Ñ! %¨Ñ"4Õ5ñ (øð+ ò 
	Ø�v‰v˜Š}Ü—‘Ø˜U˜GÐ#DÀYÀKÈrÐRSÐQTÐUõô —‘Ø˜U˜GÐ#9¸)¸ð E,Ø,-¯F©F¨8ð5ôô ûØò 	Ü�O‰OØ˜˜Ð5°i°[ð A%Ø%&§V¡V Hð.ôô ûð	ús$   ŠB ÂD4ÂAC:Ã:D4Ä(D/Ä/D4Úinclude_messagesc                 óf   — g }|D ])  }| j                  |||«      }|€Œ|j                  |«       Œ+ |S )z2Process a list of thread into a list of documents.)Úprocess_threadr=   )r   r   r    r@   Údocsr6   Údocs          r   r)   zQuipLoader.process_threads�   s@   € ð ˆÛ#ˆIØ×%Ñ% i°ÐAQÓRˆCØ‰Ø—‘˜CÕ ð $ð ˆr-   r6   c           
      ó`  — | j                   j                  |«      }|d   d   }|d   d   }|d   d   }|d   d   }t        j                  |«      }t        j                  d|› d|› d|› d	|› �«       d
|v rg	 | j                   j                  |d
   «      }	||||dœ}d}|r| j                  |	«      }|r|dz   | j                  |«      z   }t        |d
   |z   |¬«      S y # t        j                  j                  j                  $ r(}
t        j                  d|› d|› d|
› �«       Y d }
~
y d }
~
ww xY w)NÚthreadÚidr3   ÚlinkÚupdated_useczprocessing thread z title z link z update_ts ÚhtmlzError parsing thread Ú z, skipping, )r3   Ú	update_tsrG   ÚsourceÚ z/n)Úpage_contentÚmetadata)r   Ú
get_threadr   Ú_sanitize_titleÚloggerr<   Úparse_document_htmlÚxmlÚetreeÚcElementTreeÚ
ParseErrorÚerrorÚprocess_thread_imagesÚprocess_thread_messagesr   )r   r6   r    r@   rF   r3   rH   rL   Úsanitized_titleÚtreer>   rP   Útexts                r   rB   zQuipLoader.process_threadš   sr  € ð ×!Ñ!×,Ñ,¨YÓ7ˆØ˜8Ñ$ TÑ*ˆ	Ø�xÑ  Ñ)ˆØ�hÑ Ñ'ˆØ˜8Ñ$ ^Ñ4ˆ	Ü$×4Ñ4°UÓ;ˆä�‰Ø   ¨7°?Ð2Cð DØ�6˜ Y Kð1ô	
ð
 �VÑðØ×'Ñ'×;Ñ;¸FÀ6¹NÓK�ð )Ø&ØØñ	ˆHð ˆDÙØ×1Ñ1°$Ó7�áØ˜d‘{ T×%AÑ%AÀ)Ó%LÑL�äØ# F™^¨dÑ2Ø!ôð ð øô/ —9‘9×)Ñ)×4Ñ4ò Ü—‘Ð4°U°G¸1¸Y¸KÀ|ÐTUÐSVÐWÔXÜûðús   Á7C Ã'D-ÄD(Ä(D-r]   c                 ó  — d}	 ddl m} ddlm} |j	                  d«      D ]™  }|j                  d«      }|r|j                  d«      sŒ(|j                  d	«      \  }}}}	| j                  j                  ||	«      }
	 |j                  t        |
j                  «       «      «      }|d
z   |j                  |«      z   }Œ› |S # t        $ r t        d«      ‚w xY w# t        $ r}t        j!                  d|› �«       |‚d }~ww xY w)NrN   r   )ÚImage)Úpytesseractzg`Pillow or pytesseract` package not found, please run `pip install Pillow` or `pip install pytesseract`ÚimgÚsrcz/blobÚ/Ú
z!failed to convert image to text, )ÚPILr`   ra   r   Úiterr;   Ú
startswithÚsplitr   Úget_blobÚopenr   ÚreadÚimage_to_stringÚOSErrorrS   rY   )r   r]   r^   r`   ra   rb   rc   Ú_r6   Úblob_idÚblob_responseÚimager>   s                r   rZ   z QuipLoader.process_thread_imagesÆ   s  € Øˆð	Ý!Ý/ð —9‘9˜UÖ#ˆCØ—'‘'˜%“.ˆCÙ˜cŸn™n¨WÔ5ØØ'*§y¡y°£~Ñ$ˆAˆq�)˜WØ ×,Ñ,×5Ñ5°iÀÓIˆMðØŸ
™
¤7¨=×+=Ñ+=Ó+?Ó#@ÓA�Ø˜d‘{ [×%@Ñ%@ÀÓ%GÑG‘ð $ð ˆøô' ò 	ÜðDóð ð	ûô  ò Ü—‘Ð@ÀÀÐDÔEØ�ûðús#   „B? Á<?CÂ?CÃ	C?Ã C:Ã:C?c                 óú   — d }g }	 | j                   j                  ||d¬«      }|j                  |«       |r|d   d   dz
  }nnŒ?|j                  «        |D �cg c]  }|d   ‘Œ	 }}dj	                  |«      S c c}w )Néd   )Úmax_created_usecÚcountéÿÿÿÿÚcreated_usecr5   r^   re   )r   Úget_messagesÚextendÚreverseÚjoin)r   r6   ru   ÚmessagesÚchunkÚmessageÚtextss          r   r[   z"QuipLoader.process_thread_messagesá   sš   € ØÐØˆØØ×$Ñ$×1Ñ1ØÐ,<ÀCð 2ó ˆEð �O‰O˜EÔ"ÙØ#(¨¡9¨^Ñ#<¸qÑ#@Ñ àð ð 	×ÑÔá08Ó9± W�˜“°ˆÐ9à�y‰y˜ÓÐùò :s   ÁA8r3   c                 ó˜   — t        j                  dd| «      }t        j                  dd|«      }t        |«      t        kD  r	|d t         }|S )Nz\srK   z(?u)[^- \w.]rN   )ÚreÚsubÚlenÚ_MAXIMUM_TITLE_LENGTH)r3   r\   s     r   rR   zQuipLoader._sanitize_titleó   sH   € äŸ&™& ¨¨UÓ3ˆÜŸ&™& °"°oÓFˆÜˆÓÔ"7Ò7Ø-Ð.DÔ/DÐEˆOØÐr-   )é<   )NNiè  FFF)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ústrr   ÚintÚboolr   r   r   r,   r%   r   r)   rB   r   rZ   r[   ÚstaticmethodrR   © r-   r   r   r      s�  „ ñð *,ð	$ð -2ò$àð$ð ð$ð " #™ð	$ð &*ó$ðP +/Ø*.Ø"&Ø$)Ø!&Ø$ñ+Rà˜T #™YÑ'ð+Rð ˜T #™YÑ'ð+Rð ˜3‘-ð	+Rð
 "ð+Rð ð+Rð ð+Rð 
ˆh‰ó+RðZ#6Øð#6Ø%(ð#6Ø6:¸3±ið#6à	ó#6ðJ	Ø" 3™-ð	Ø9=ð	ØQUð	à	ˆh‰ó	ð*Øð*Ø.2ð*ØFJð*à	�(Ñ	ó*ðX¨+ð ¸#ó ð6 °ð  ¸ó  ð$ ð˜sð  sò ó ñr-   r   )r9   r‚   Úxml.etree.cElementTreerU   Úior   Útypingr   r   r   Úxml.etree.ElementTreer   Úlangchain_core.documentsr   Ú)langchain_community.document_loaders.baser	   Ú	getLoggerr‡   rS   r…   r   r�   r-   r   Ú<module>r—      sF   ðÛ Û 	Û Ý ß +Ñ +Ý -å -å @à	ˆ×	Ñ	˜8Ó	$€àÐ ôh�õ hr-   