
    NgM              
          d Z ddlZddlZddlmZmZmZ ddlmZm	Z	m
Z
mZmZmZmZmZ ddlZddlmZ ddlmZmZmZ dZe G d d	                      Ze G d
 de                      Ze G d de                      Ze G d de                      Ze G d de                      Ze G d de                      Z	 d+dedee         dede	fdZ dedee         defdZ!	 d+de"dedeee	         ee"         f         fdZ#dede"dee$         fdZ%d,de"d e"dee         defd!Z&d e"dee$         fd"Z'd#e$d e"dee$         fd$Z(d%e$d e"dee$         fd&Z)d%e$d'e$d e"dee$         fd(Z* G d) d*e          Z+dS )-zUtil that calls clickup.    N)asdict	dataclassfields)AnyDictListMappingOptionalTupleTypeUnion)get_from_dict_or_env)	BaseModel
ConfigDictmodel_validatorzhttps://api.clickup.com/api/v2c                   B    e Zd ZdZedeeef         dd fd            ZdS )	ComponentzBase class for all components.datareturnc                     t                      N)NotImplementedErrorclsr   s     a/var/www/html/ai-engine/env/lib/python3.11/site-packages/langchain_community/utilities/clickup.py	from_datazComponent.from_data   s    !###    N)	__name__
__module____qualname____doc__classmethodr   strr   r    r   r   r   r      sN        (($T#s(^ $ $ $ $ [$ $ $r   r   c                   @   e Zd ZU dZeed<   eed<   eed<   eed<   eed<   eed<   eed<   eed	<   eeee	f                  ed
<   eeee	f                  ed<   e
e         ed<   e
e         ed<   e
e         ed<   eed<   eed<   eed<   edeee	f         dd fd            ZdS )TaskzClass for a task.idnametext_contentdescriptionstatus
creator_idcreator_usernamecreator_email	assigneeswatchersprioritydue_date
start_datepointsteam_id
project_idr   r   c                    |d         d n|d         d         } | d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         S )Nr1   r'   r(   r)   r*   r+   r,   creatorr-   usernamer.   emailr/   r0   r2   r3   r4   r5   r6   projectr$   r$   )r   r   r1   s      r   r   zTask.from_data-   sZ   
+344j9I*9Us 
 
 
Dzz
f
 n--
 ]++	

 >(++
 It,,
 ")_Z88
 y/'22
 ;''
 *%%
 X
 *%%
 L))
 >>
 OO
  It,,!
 	
r   N)r   r   r    r!   int__annotations__r#   r   r   r   r
   r"   r   r$   r   r   r&   r&      s!        GGG
IIIKKKOOODcN####4S>""""smsmKKKLLLOOO
T#s(^ 
 
 
 
 [
 
 
r   r&   c                       e Zd ZU dZeed<   eed<   dZee         ed<   dZ	ee
         ed<   dZee         ed<   dZee
         ed<   dZee
         ed	<   dZee         ed
<   ededd fd            ZdS )CUListzComponent class for a list.	folder_idr(   Ncontentr2   due_date_timer1   assigneer+   r   r   c                 $    | |d         |d         |                     d          |                     d          |                     d          |                     d          |                     d          |                     d          	          S )
Nr@   r(   rA   r2   rB   r1   rC   r+   )r@   r(   rA   r2   rB   r1   rC   r+   )getr   s     r   r   zCUList.from_dataQ   s    s;'fHHY''XXj))((?33XXj))XXj))88H%%	
 	
 	
 		
r   )r   r   r    r!   floatr=   r#   rA   r
   r2   r<   rB   boolr1   rC   r+   r"   dictr   r$   r   r   r?   r?   D   s         %%
III!GXc]!!!"Hhsm"""$(M8D>((("Hhsm""""Hhsm""" FHSM   

T 

h 

 

 

 [

 

 

r   r?   c                   \    e Zd ZU dZeed<   eed<   eed<   eed<   ededd fd            Z	d	S )
MemberzComponent class for a member.r'   r9   r:   initialsr   r   c                      | |d         d         |d         d         |d         d         |d         d                   S )Nuserr'   r9   r:   rK   )r'   r9   r:   rK   r$   r   s     r   r   zMember.from_datah   sK    sF|D!&\*-v,w'&\*-	
 
 
 	
r   N)
r   r   r    r!   r<   r=   r#   r"   r   r   r$   r   r   rJ   rJ   _   sl         ''GGGMMMJJJMMM
T 
h 
 
 
 [
 
 
r   rJ   c                   ^    e Zd ZU dZeed<   eed<   ee         ed<   e	de
dd fd            ZdS )	TeamzComponent class for a team.r'   r(   membersr   r   c                 Z    d |d         D             } | |d         |d         |          S )Nc                 B    g | ]}t                               |          S r$   )rJ   r   ).0member_datas     r   
<listcomp>z"Team.from_data.<locals>.<listcomp>|   s&    TTT[6##K00TTTr   rP   r'   r(   )r'   r(   rP   r$   )r   r   rP   s      r   r   zTeam.from_dataz   s8    TTDOTTTsd4jtF|WEEEEr   N)r   r   r    r!   r<   r=   r#   r   rJ   r"   r   r   r$   r   r   rO   rO   r   sr         %%GGG
III&\FT Ff F F F [F F Fr   rO   c                   |    e Zd ZU dZeed<   eed<   eed<   eee	f         ed<   e
deee	f         dd fd            Zd	S )
SpacezComponent class for a space.r'   r(   privateenabled_featuresr   r   c                     |d         d         }d |d                                          D             } | |d         |d         |d         |          S )	Nspacesr   c                 *    i | ]\  }}|d          ||S )enabledr$   )rS   featurevalues      r   
<dictcomp>z#Space.from_data.<locals>.<dictcomp>   s9     
 
 
Y
U
 
 
r   featuresr'   r(   rX   )r'   r(   rX   rY   )items)r   r   
space_datarY   s       r   r   zSpace.from_data   sv    (^A&

 
",Z"8">">"@"@
 
 

 s$F#y)-	
 
 
 	
r   N)r   r   r    r!   r<   r=   r#   rG   r   r   r"   r   r$   r   r   rW   rW      s         &&GGG
IIIMMM38n$$$
T#s(^ 
 
 
 
 [
 
 
r   rW   Fr   	componentfault_tolerantr   c                     	 t          |                    |                     S # t          $ rG}|r>dt          |            dt          |           d}t	          j        |           | cY d}~S |d}~ww xY w)a  Parse a dictionary by creating
    a component and then turning it back into a dictionary.

    This helps with two things
    1. Extract and format data from a dictionary according to schema
    2. Provide a central place to do this in a fault-tolerant way

    z(Error encountered while trying to parse
: z'
 Falling back to returning input data.N)r   r   	Exceptionr#   warningswarn)r   rd   re   ewarning_strs        r   parse_dict_through_componentrm      s    	i))$//000    	ATA A!ffA A AKM+&&&KKKKKKGs    !$ 
A5:A0(A5.A00A5c                 j    i }t          |          D ] }|j        | v r| |j                 ||j        <   !|S )a"  Extract elements from a dictionary.

    Args:
        data: The dictionary to extract elements from.
        component: The component to extract elements from.

    Returns:
        A dictionary containing the elements from the input dictionary that are also
        in the component.
    )r   r(   )r   rd   output	attributes       r   +extract_dict_elements_from_component_fieldsrq      sF     FI&& : :	>T!!%)).%9F9>"Mr   queryc                     	 t          j        |           dfS # t           j        $ r#}|rddt          |           dfcY d}~S |d}~ww xY w)aD  Parse a JSON string and return the parsed object.

    If parsing fails, returns an error message.

    :param query: The JSON string to parse.
    :return: A tuple containing the parsed object or None and an error message or None.

    Exceptions:
        json.JSONDecodeError: If the input is not a valid JSON string.
    Nz5Input must be a valid JSON. Got the following error: z". 
"Please reformat and try again.)jsonloadsJSONDecodeErrorr#   )rr   re   rk   s      r   
load_queryrw      s    
z%  $&&    	##a&& # # #       Gs    A
AA
AA
keyc                     || v rgt          | |                   dk    rNt          | |                   dk    r!t          j        d| d| |          d           | |         d         d         S dS )z%Fetch the first id from a dictionary.r      zFound multiple rg   z. Defaulting to first.r'   N)lenri   rj   )r   rx   s     r   fetch_first_idr|      st    
d{{s49~~))tCy>>AMTCTT49TTTUUUCy|D!!4r   urlaccess_tokenc                     d|i}t          j        | ||          }|                                 |                                S )zFetch data from a URL.Authorizationheadersparams)requestsrE   raise_for_statusrt   )r}   r~   rr   r   responses        r   
fetch_datar      sB    -G|C???H==??r   c                 V    t            d}t          ||           }t          |d          S )zFetch the team id./teamteamsDEFAULT_URLr   r|   )r~   r}   r   s      r   fetch_team_idr      s/    


Cc<((D$(((r   r5   c                 d    t            d|  d}t          ||ddi          }t          |d          S )zFetch the space id./team//spacearchivedfalserr   r[   r   )r5   r~   r}   r   s       r   fetch_space_idr      sA    
/
/
/
/
/Cc<
G/DEEED$)))r   space_idc                 d    t            d|  d}t          ||ddi          }t          |d          S )zFetch the folder id./space//folderr   r   r   foldersr   )r   r~   r}   r   s       r   fetch_folder_idr      sA    
2
2
2
2
2Cc<
G/DEEED$	***r   r@   c                     |rt            d| d}nt            d|  d}t          ||ddi          }|rd|v r|d         S t          |d          S )	zFetch the list id./folder//listr   r   r   r   r'   listsr   )r   r@   r~   r}   r   s        r   fetch_list_idr     s}     566i66644X444c<
G/DEEED  -TT\\DzdG,,,r   c            
          e Zd ZU dZdZee         ed<   dZee         ed<   dZ	ee         ed<   dZ
ee         ed<   dZee         ed<    ed	          Ze	 d+dededefd            Zededededee         fd            Z ed          ededefd                        Zdedeeee         f         fdZdeeeeef         f         fdZdefdZdeeef         fdZdefdZd,dededefdZ defd Z!dedefd!Z"defd"Z#dedefd#Z$dedefd$Z%dedefd%Z&dedefd&Z'dedefd'Z(dedefd(Z)d)ededefd*Z*dS )-ClickupAPIWrapperzWrapper for Clickup API.Nr~   r5   r   r@   list_idforbid)extrahttps://google.comoauth_client_idredirect_urir   c                     d| }| d| S )z"Get the URL to get an access code.z&https://app.clickup.com/api?client_id=z&redirect_uri=r$   )r   r   r   r}   s       r   get_access_code_urlz%ClickupAPIWrapper.get_access_code_url!  s&    
 IHH33\333r   oauth_client_secretcodec                 0   t            d}|||d}t          j        ||          }|                                }d|vrQt	          d|            d|v r9|d         dk    r-t
                              |          }t	          dd	|            d
S |d         S )zGet the access token.z/oauth/token)	client_idclient_secretr   )r   r~   zError: ECODE	OAUTH_014z4You already used this code once. Generate a new one.z1Our best guess for the url to get a new code is:
N)r   r   postrt   printr   r   )r   r   r   r   r}   r   r   r   s           r   get_access_tokenz"ClickupAPIWrapper.get_access_token)  s    
 *** )0
 
 =V444}}%%"D""###$4=K#?#?';;OLLJNNN   4N##r   before)modevaluesc                 &   t          |dd          |d<   t          |d                   |d<   t          |d         |d                   |d<   t          |d         |d                   |d<   t	          |d         |d         |d                   |d<   |S )z?Validate that api key and python package exists in environment.r~   CLICKUP_ACCESS_TOKENr5   r   r@   r   )r   r   r   r   r   )r   r   s     r   validate_environmentz&ClickupAPIWrapper.validate_environmentE  s     "6N$:"
 "
~ *&*@AAy+F9,=vn?UVVz-:~ 6
 
{ *:{ 3VN5K
 
y r   
input_dictc                     dg i}|d         D ]c}	 t          |t          d          }|d                             |           6# t          $ r!}t	          j        d|            Y d}~\d}~ww xY w|S )z1Parse appropriate content from the list of teams.r   Fre   zError parsing a team N)rm   rO   appendrh   ri   rj   )selfr   parsed_teamsteamrk   s        r   attempt_parse_teamsz%ClickupAPIWrapper.attempt_parse_teamsW  s    /6mw' 	; 	;D;3D$uUUUW%,,T2222 ; ; ;9a99::::::::; s   2A
A.A))A.c                     t          | j        t                    st          d| j         d          t          | j                  dd}|S )z Get the headers for the request.zAccess Token: z, must be str.zapplication/json)r   zContent-Type)
isinstancer~   r#   	TypeError)r   r   s     r   get_headerszClickupAPIWrapper.get_headersc  s]     $+S11 	PNT->NNNOOO !!233.
 
 r   c                 
    ddiS )Nr   r   r$   )r   s    r   get_default_paramsz$ClickupAPIWrapper.get_default_paramsp  s    G$$r   c                     t            d}t          j        ||                                           }|                                }|                     |          }|S )zGet all teams for the user.r   )r   )r   r   rE   r   rt   r   )r   r}   r   r   r   s        r   get_authorized_teamsz&ClickupAPIWrapper.get_authorized_teamss  sV    ###<T-=-=-?-?@@@}}//55r   c                     t            dt          | j                  z   dz   }|                                 }t	          j        ||                                 |          }d|iS )z3
        Get all the folders for the team.
        r   r   r   r   )r   r#   r5   r   r   rE   r   r   r}   r   r   s       r   get_folderszClickupAPIWrapper.get_folders~  sd     $$$s4<'8'888C((**<T-=-=-?-?OOOH%%r   Trr   re   c                    t          |d          \  }}|d|iS t           d|d          }d| j        dd}t          j        ||                                 |	          }|                                }t          |t          |          }|S )
z+
        Retrieve a specific task.
        Tr   NError/task/task_idtruecustom_task_idsr5   include_subtasksr   )	rw   r   r5   r   rE   r   rt   rm   r&   )	r   rr   re   r   errorr}   r   r   parsed_tasks	            r   get_taskzClickupAPIWrapper.get_task  s    
 #5>>>>U##77F9$577%| &
 

 <T-=-=-?-?OOO}}2$~
 
 
 r   c                     t            d| j         d}|                                 }t          j        ||                                 |          }d|iS )z*
        Get all available lists.
        r   r   r   r   )r   r@   r   r   rE   r   r   s       r   	get_listszClickupAPIWrapper.get_lists  sZ    
 ;;dn;;;((**<T-=-=-?-?OOOH%%r   c                     t          |d          \  }}|d|iS t           d|d          d}|                                 }t          j        ||                                 |          }d	|iS )
z7
        Query tasks that match certain fields
        Tr   Nr   /list/r   /taskr   r   )rw   r   r   r   rE   r   )r   rr   r   r   r}   r   s         r   query_taskszClickupAPIWrapper.query_tasks  s     #5>>>>U##<<F9$5<<<((**<T-=-=-?-?OOOH%%r   c                     t            d| j         d}t          j        ||                                 |                                           }|                                }t          |t          d          }|S )z.
        Get all spaces for the team.
        r   r   r   Tr   )	r   r5   r   rE   r   r   rt   rm   rW   )r   r}   r   r   parsed_spacess        r   
get_spaceszClickupAPIWrapper.get_spaces  s{     88DL888<))++D4K4K4M4M
 
 
 }}4T5QUVVVr   c                    |                      |d          }t          |d          \  }}t          |t                    sd|iS |d         |vr#dd|d          d|                                 diS |d         ||d                  iS ):
        Update an attribute of a specified task.
        Tr   r   attribute_namezattribute_name = z was not 
found in task keys z.. Please call again with one of the key names.)r   rw   r   rH   keys)r   rr   taskr   r   s        r   get_task_attributez$ClickupAPIWrapper.get_task_attribute  s    
 }}U4}88"5>>>&$'' 	$U##"#4// Rv6F/G R RIIKKR R R 
 '($v6F/G*HIIr   c                     t          |d          \  }}|d|iS t           d|d          }d| j        dd}|                                 }|d	         |d
         i}t	          j        ||||          }d|iS )r   Tr   Nr   r   r   r   r   r   r_   r   r   rt   r   )rw   r   r5   r   r   put)	r   rr   
query_dictr   r}   r   r   payloadr   s	            r   update_taskzClickupAPIWrapper.update_task  s     'uTBBB
EU##;;Jy$9;;%| &
 

 ""$$./G1DE<WV'RRRH%%r   c                    t          |d          \  }}|d|iS |d         D ]0}t          |t                    sdd| dt          |           ic S 1t           d|d	          }|                                 }|d
         dk    r|d         g d}n2|d
         dk    rg |d         d}nt          d|d
          dd          d| j        dd}d|i}	t          j	        ||||	          }
d|
iS )z>
        Add or remove assignees of a specified task.
        Tr   Nr   usersz3All users must be integers, not strings!
"Got user z	 if type r   r   	operationadd)r   remr   zInvalid operation (z). zValid options ['add', 'rem'].r   r   r/   r   r   )
rw   r   r<   typer   r   
ValueErrorr5   r   r   )r   rr   r   r   rM   r}   r   assigne_payloadr   r   r   s              r   update_task_assigneesz'ClickupAPIWrapper.update_task_assignees  sv    'uTBBB
EU##w' 	 	DdC((  )) )t**) )    ;;Jy$9;;""$$k"e++&0&9"EEOO$--&(G1DEEOOBj&=BBB/    &| &
 
 0<WV'RRRH%%r   c                 J   t          |d          \  }}|d|iS | j        }t           d| d}d| j        d}t	          |t
                    }|                                 }t          j        ||||	          }	|		                                }
t          |
t
          d          S )
z%
        Creates a new task.
        Tr   Nr   r   r   r   )r   r5   )rt   r   r   )rw   r   r   r5   rq   r&   r   r   r   rt   rm   )r   rr   r   r   r   r}   r   r   r   r   r   s              r   create_taskzClickupAPIWrapper.create_task  s     'uTBBB
EU##,22G222%+EE=j$OO""$$=7GFSSS]]__+D$tLLLLr   c                 v   t          |d          \  }}|d|iS | j        r| j        n| j        }t           d| d}t	          |t
                    }|                                 }t          j        |||          }|	                                }	t          |	t          d          }
d|
v r|
d         | _        |
S )	z%
        Creates a new list.
        Tr   Nr   r   r   rt   r   r'   )rw   r@   r   r   rq   r&   r   r   r   rt   rm   r?   r   )r   rr   r   r   locationr}   r   r   r   r   parsed_lists              r   create_listzClickupAPIWrapper.create_list$  s     'uTBBB
EU## &*^F4>>55h555=j$OO""$$=7GDDD}}24PTUUU;&t,DLr   c                    t          |d          \  }}|d|iS | j        }t           d| d}d|d         i}|                                 }t	          j        |||          }|                                }	d	|	v r|	d	         | _        |	S )
z'
        Creates a new folder.
        Tr   Nr   r   r   r(   r   r'   )rw   r   r   r   r   r   rt   r   )
r   rr   r   r   r   r}   r   r   r   r   s
             r   create_folderzClickupAPIWrapper.create_folder<  s    
 'uTBBB
EU##=66X666Jv&
 ""$$=7GDDD}}4<<:DLr   r   c                    |dk    r|                      |          }n|dk    r|                     |          }n |dk    r|                                 }n|dk    r|                     |          }n|dk    r|                     |          }n|dk    r|                     |          }n|dk    r|                                 }nv|dk    r|                                 }n[|d	k    r|                                 }n@|d
k    r| 	                    |          }n$|dk    r| 
                    |          }ndd| di}	 t          j        |          S # t          $ r t          |          cY S w xY w)zRun the API.r   r   	get_teamsr   r   r   r   r   r   r   r   	ModeErrorzGot unexpected mode .)r   r   r   r   r   r   r   r   r   r   r   rt   dumpsrh   r#   )r   r   rr   ro   s       r   runzClickupAPIWrapper.runT  s   :]]5))FF))),,U33FF[  ..00FF]""%%e,,FF]""%%e,,FF_$$''..FF[  ^^%%FF]""%%''FF\!!__&&FF]""%%e,,FF,,,//66FF!#A$#A#A#ABF	:f%%% 	 	 	v;;	s   <E E,+E,)r   )T)+r   r   r    r!   r~   r
   r#   r=   r5   r   r@   r   r   model_configr"   r   r   r   r   r   r   rH   r   r   r	   r   bytesr   r   r   r   rG   r   r   r   r   r   r   r   r   r   r   r  r$   r   r   r   r     s        """&L(3-&&&!GXc]!!!"Hhsm"""#Ix}###!GXc]!!!:  L 7K4 4!4144	4 4 4 [4 $!$8;$CF$	#$ $ $ [$6 _(###$ 3    [ $# 
d 
tCdO7L 
 
 
 
	eCJ''	(   %D % % % %	d38n 	 	 	 	&T & & & & c 4 4    .&4 & & & && & & & & &
D 
 
 
 
J J J J J J$& & & & & &*%&3 %&4 %& %& %& %&NM M M M M M&     03 4    0 C C      r   r   )Fr   ),r!   rt   ri   dataclassesr   r   r   typingr   r   r   r	   r
   r   r   r   r   langchain_core.utilsr   pydanticr   r   r   r   r   r&   r?   rJ   rO   rW   rH   rG   rm   rq   r#   rw   r<   r|   r   r   r   r   r   r   r$   r   r   <module>r     s       1 1 1 1 1 1 1 1 1 1 I I I I I I I I I I I I I I I I I I I I  5 5 5 5 5 5 ; ; ; ; ; ; ; ; ; ;. $ $ $ $ $ $ $ $ (
 (
 (
 (
 (
9 (
 (
 (
V 
 
 
 
 
Y 
 
 
4 
 
 
 
 
Y 
 
 
$ 
F 
F 
F 
F 
F9 
F 
F 
F 
 
 
 
 
I 
 
 
2 DI 
	?<@	   .
	?	   * (-  $
8D>8C=()   4 C HSM     C s 8D> T    ) ) ) ) ) )*C *s *x} * * * *+c + +# + + + +-C -C -s -xPS} - - - - ^ ^ ^ ^ ^	 ^ ^ ^ ^ ^r   