§
    æ˜ºhê   ã                   óª   — 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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dS )
é    N)ÚBytesIO)ÚListÚOptionalÚSequence)ÚElementTree)ÚDocument)Ú
BaseLoaderé@   c                   óh  — e Zd ZdZ	 ddedede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dS ) Ú
QuipLoaderz_Load `Quip` pages.

    Port of https://github.com/quip/quip-api/tree/master/samples/baqup
    é<   Úapi_urlÚaccess_tokenÚrequest_timeoutc                 óv   — 	 ddl m} n# t          $ r t          d¦  «        ‚w xY w ||||¬¦  «        | _        dS )a9  
        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.
        r   )Ú
QuipClientz?`quip_api` package not found, please run `pip install quip_api`)r   Úbase_urlr   N)Úquip_api.quipr   ÚImportErrorÚquip_client)Úselfr   r   r   r   s        úq/var/www/html/services/rag-service/venv/lib/python3.11/site-packages/langchain_community/document_loaders/quip.pyÚ__init__zQuipLoader.__init__   st   € ð	Ø0Ð0Ð0Ð0Ð0Ð0Ð0øÝð 	ð 	ð 	ÝØTñô ð ð	øøøð
 &˜:Ø%°Èð
ñ 
ô 
ˆÔÐÐs   ‚	 ‰#Néè  FÚ
folder_idsÚ
thread_idsÚmax_docsÚinclude_all_foldersÚinclude_commentsÚinclude_imagesÚreturnc                 ó   — |s|s|st          d¦  «        ‚|pg }|r|D ]}|                      |d|¦  «         Œ|r[| j                             ¦   «         }d|v r|                      |d         d|¦  «         d|v r|                      |d         d|¦  «         t	          t          |d|…         ¦  «        ¦  «        }|                      |||¦  «        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)Ú
ValueErrorÚ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ˆ
àð 	KØ'ð Kð K�	Ø×0Ò0°¸A¸zÑJÔJÐJÐJàð 		ØÔ#×:Ò:Ñ<Ô<ˆDØ! TÐ)Ð)Ø×0Ò0ØÐ+Ô,¨a°ñô ð ð # dÐ*Ð*Ø×0Ò0ØÐ,Ô-¨q°*ñô ð õ �#˜j¨¨(¨Ô3Ñ4Ô4Ñ5Ô5ˆ
Ø×#Ò# J°Ð@PÑQÔQÐQó    r+   Údepthc           	      óz  — ddl m}m} 	 | j                             |¦  «        }nŽ# |$ rV}|j        dk    rt          j        d|› d|› d|› �¦  «         n"t          j        d|› d|› d|j        › �¦  «         Y d	}~d	S d	}~w|$ r-}t          j        d|› d|› d
|j        › �¦  «         Y d	}~d	S d	}~ww xY w|d                              dd|z  ¦  «        }t          j	        d|› d|› �¦  «         |d         D ]F}	d|	v r!|  
                    |	d         |dz   |¦  «         Œ'd|	v r|                     |	d         ¦  «         ŒGd	S )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   r1   r2   r   Ú
get_folderÚcodeÚloggingÚwarningÚgetÚinfor&   Úappend)
r   r+   r/   r   r1   r2   r3   Úer4   Úchilds
             r   r&   z&QuipLoader.get_thread_ids_by_folder_idZ   s  € ð 	7Ð6Ð6Ð6Ð6Ð6Ð6Ð6ð	ØÔ%×0Ò0°Ñ;Ô;ˆFˆFøØð 
	ð 
	ð 
	ØŒv˜Š}ˆ}Ý”ØU˜UÐUÐUÀYÐUÐUÐRSÐUÐUñô ð ð õ ”ð5˜Uð 5ð 5¸)ð 5ð 5Ø,-¬Fð5ð 5ñô ð ð ˆFˆFˆFˆFˆFøøøøØð 	ð 	ð 	ÝŒOð.˜ð .ð .°ið .ð .Ø%&¤Vð.ð .ñô ð ð ˆFˆFˆFˆFˆFøøøøð	øøøð �xÔ ×$Ò$ W¨k¸IÑ.EÑFÔFˆåŒÐ@˜eÐ@Ð@¸Ð@Ð@ÑAÔAÐAØ˜JÔ'ð 	6ð 	6ˆEØ˜eÐ#Ð#Ø×0Ò0Ø˜+Ô&¨°©	°:ñô ð ð ð  Ð%Ð%Ø×!Ò! %¨Ô"4Ñ5Ô5Ð5øð	6ð 	6s!   Š% ¥B0ªAA;Á;B0Â"B+Â+B0Úinclude_messagesc                 óp   — g }|D ]0}|                       |||¦  «        }|�|                     |¦  «         Œ1|S )z2Process a list of thread into a list of documents.)Úprocess_threadr>   )r   r   r    rA   Údocsr7   Údocs          r   r*   zQuipLoader.process_threads   sM   € ð ˆØ#ð 	!ð 	!ˆIØ×%Ò% i°ÐAQÑRÔRˆCØˆØ—’˜CÑ Ô Ð øØˆr.   r7   c           
      ó¸  — | j                              |¦  «        }|d         d         }|d         d         }|d         d         }|d         d         }t                               |¦  «        }t                               d|› d|› d|› d	|› �¦  «         d
|v rÃ	 | j                              |d
         ¦  «        }	nJ# t          j        j	        j
        $ r.}
t                               d|› d|› d|
› �¦  «         Y d }
~
d S d }
~
ww xY w||||dœ}d}|r|                      |	¦  «        }|r|dz   |                      |¦  «        z   }t          |d
         |z   |¬¦  «        S d S )NÚthreadÚidr4   ÚlinkÚupdated_useczprocessing thread z title z link z update_ts ÚhtmlzError parsing thread ú z, skipping, )r4   Ú	update_tsrH   Ú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   r7   r    rA   rG   r4   rI   rM   Úsanitized_titleÚtreer?   rQ   Útexts                r   rC   zQuipLoader.process_threadŠ   sÒ  € ð Ô!×,Ò,¨YÑ7Ô7ˆØ˜8Ô$ TÔ*ˆ	Ø�xÔ  Ô)ˆØ�hÔ Ô'ˆØ˜8Ô$ ^Ô4ˆ	Ý$×4Ò4°UÑ;Ô;ˆå�Šð1 ð 1ð 1°?ð 1ð 1Øð1ð 1Ø%.ð1ð 1ñ	
ô 	
ð 	
ð
 �VÐÐðØÔ'×;Ò;¸FÀ6¼NÑKÔK��øÝ”9Ô)Ô4ð ð ð Ý—’ÐW°UÐWÐW¸YÐWÐWÐTUÐWÐWÑXÔXÐXØ�t�t�t�t�tøøøøðøøøð
 )Ø&ØØð	ð ˆHð ˆDØð 8Ø×1Ò1°$Ñ7Ô7�àð MØ˜d‘{ T×%AÒ%AÀ)Ñ%LÔ%LÑL�åØ# Fœ^¨dÑ2Ø!ðñ ô ð ð ˆts   Â B9 Â9D Ã#C;Ã;D r^   c                 óV  — d}	 ddl m} ddlm} n# t          $ r t          d¦  «        ‚w xY w|                     d¦  «        D ]å}|                     d¦  «        }|r|                     d¦  «        sŒ/|                     d	¦  «        \  }}}}	| j         	                    ||	¦  «        }
	 | 
                    t          |
                     ¦   «         ¦  «        ¦  «        }|d
z   |                     |¦  «        z   }Œµ# t          $ r$}t                               d|› �¦  «         |‚d }~ww xY w|S )NrO   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, )ÚPILra   rb   r   Úiterr<   Ú
startswithÚsplitr   Úget_blobÚopenr   ÚreadÚimage_to_stringÚOSErrorrT   rZ   )r   r^   r_   ra   rb   rc   rd   Ú_r7   Úblob_idÚblob_responseÚimager?   s                r   r[   z QuipLoader.process_thread_images¶   sn  € Øˆð	Ø!Ð!Ð!Ð!Ð!Ð!Ø/Ð/Ð/Ð/Ð/Ð/Ð/øÝð 	ð 	ð 	ÝðDñô ð ð	øøøð —9’9˜UÑ#Ô#ð 	ð 	ˆCØ—'’'˜%‘.”.ˆCØð ˜cŸnšn¨WÑ5Ô5ð ØØ'*§y¢y°¡~¤~Ñ$ˆAˆq�)˜WØ Ô,×5Ò5°iÀÑIÔIˆMðØŸ
š
¥7¨=×+=Ò+=Ñ+?Ô+?Ñ#@Ô#@ÑAÔA�Ø˜d‘{ [×%@Ò%@ÀÑ%GÔ%GÑG��øÝð ð ð Ý—’ÐDÀÐDÐDÑEÔEÐEØ�øøøøðøøøð ˆs!   „ ‘+Â(AC8Ã8
D&ÄD!Ä!D&c                 ó  — d }g }	 | j                              ||d¬¦  «        }|                     |¦  «         |r|d         d         dz
  }nnŒH|                     ¦   «          d„ |D ¦   «         }d                     |¦  «        S )	NTéd   )Úmax_created_usecÚcountéÿÿÿÿÚcreated_usecr6   c                 ó   — g | ]
}|d          ‘ŒS )r_   © )Ú.0Úmessages     r   ú
<listcomp>z6QuipLoader.process_thread_messages.<locals>.<listcomp>ß   s   € Ð9Ð9Ð9 W�˜”Ð9Ð9Ð9r.   rf   )r   Úget_messagesÚextendÚreverseÚjoin)r   r7   rv   ÚmessagesÚchunkÚtextss         r   r\   z"QuipLoader.process_thread_messagesÑ   s«   € ØÐØˆð	ØÔ$×1Ò1ØÐ,<ÀCð 2ñ ô ˆEð �OŠO˜EÑ"Ô"Ð"Øð Ø#(¨¤9¨^Ô#<¸qÑ#@Ð Ð àð	ð 	×ÒÑÔÐà9Ð9°Ð9Ñ9Ô9ˆà�yŠy˜ÑÔÐr.   r4   c                 ó¬   — t          j        dd| ¦  «        }t          j        dd|¦  «        }t          |¦  «        t          k    r|d t          …         }|S )Nz\srL   z(?u)[^- \w.]rO   )ÚreÚsubÚlenÚ_MAXIMUM_TITLE_LENGTH)r4   r]   s     r   rS   zQuipLoader._sanitize_titleã   sS   € åœ& ¨¨UÑ3Ô3ˆÝœ& °"°oÑFÔFˆÝˆÑÔÕ"7Ò7Ð7Ø-Ð.DÕ/DÐ.DÔEˆOØÐr.   )r   )NNr   FFF)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ústrr   Úintr   r   Úboolr   r-   r&   r   r*   rC   r   r[   r\   ÚstaticmethodrS   r{   r.   r   r   r      s  € € € € € ðð ð QSð
ð 
Øð
Ø*-ð
Ø@HÈÄð
ð 
ð 
ð 
ð. +/Ø*.Ø"&Ø$)Ø!&Ø$ð+Rð +Rà˜T #œYÔ'ð+Rð ˜T #œYÔ'ð+Rð ˜3”-ð	+Rð
 "ð+Rð ð+Rð ð+Rð 
ˆhŒð+Rð +Rð +Rð +RðZ#6Øð#6Ø%(ð#6Ø6:¸3´ið#6à	ð#6ð #6ð #6ð #6ðJ	Ø" 3œ-ð	Ø9=ð	ØQUð	à	ˆhŒð	ð 	ð 	ð 	ð*Øð*Ø.2ð*ØFJð*à	�(Ô	ð*ð *ð *ð *ðX¨+ð ¸#ð ð ð ð ð6 °ð  ¸ð  ð  ð  ð  ð$ ð˜sð  sð ð ð ñ „\ðð ð r.   r   )r:   r‡   Úxml.etree.cElementTreerV   Úxml.sax.saxutilsÚior   Útypingr   r   r   Úxml.etree.ElementTreer   Úlangchain_core.documentsr   Ú)langchain_community.document_loaders.baser	   Ú	getLoggerr‹   rT   rŠ   r   r{   r.   r   ú<module>r›      së   ðØ €€€Ø 	€	€	€	Ø Ð Ð Ð Ø Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø +Ð +Ð +Ð +Ð +Ð +Ð +Ð +Ð +Ð +Ø -Ð -Ð -Ð -Ð -Ð -à -Ð -Ð -Ð -Ð -Ð -à @Ð @Ð @Ð @Ð @Ð @à	ˆÔ	˜8Ñ	$Ô	$€àÐ ðWð Wð Wð Wð W�ñ Wô Wð Wð Wð Wr.   