
    7|hM              
       `   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+y),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                   4    e Zd ZdZedeeef   dd fd       Zy)	ComponentzBase class for all components.datareturnc                     t               N)NotImplementedErrorclsr   s     d/var/www/html/test/engine/venv/lib/python3.12/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      s-    ($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y)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-   s!   
+34j9I*9U 
Dz
f
 n-
 ]+	

 >(+
 It,
 ")_Z8
 y/'2
 ;'
 *%
 
 *%
 L)
 >
 O
  It,!
 	
r   N)r   r   r    r!   int__annotations__r#   r   r   r   r
   r"   r   r$   r   r   r&   r&      s    G
IKODcN##4S>""smsmKLO
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y)CUListzComponent class for a list.	folder_idr(   Ncontentr2   due_date_timer1   assigneer+   r   r   c                      | |d   |d   |j                  d      |j                  d      |j                  d      |j                  d      |j                  d      |j                  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   sf    ;'fHHY'XXj)((?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    %
I!GXc]!"Hhsm"$(M8D>("Hhsm""Hhsm" FHSM 

T 

h 

 

r   r?   c                   T    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	y	)
MemberzComponent class for a member.r'   r9   r:   initialsr   r   c                 J     | |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   s?    F|D!&\*-v,w'&\*-	
 	
r   N)
r   r   r    r!   r<   r=   r#   r"   r   r   r$   r   r   rJ   rJ   _   s9    'GMJM
T 
h 
 
r   rJ   c                   P    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y)	TeamzComponent class for a team.r'   r(   membersr   r   c                 x    |d   D cg c]  }t         j                  |       }} | |d   |d   |      S c c}w )NrP   r'   r(   )r'   r(   rP   )rJ   r   )r   r   member_datarP   s       r   r   zTeam.from_dataz   sA    DHOT[6##K0TTd4jtF|WEE Us   7N)r   r   r    r!   r<   r=   r#   r   rJ   r"   r   r   r$   r   r   rO   rO   r   s=    %G
I&\FT Ff F Fr   rO   c                   h    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y	)
SpacezComponent class for a space.r'   r(   privateenabled_featuresr   r   c                     |d   d   }|d   j                         D ci c]  \  }}|d   r|| }}} | |d   |d   |d   |      S c c}}w )	Nspacesr   featuresenabledr'   r(   rU   )r'   r(   rU   rV   )items)r   r   
space_datafeaturevaluerV   s         r   r   zSpace.from_data   s}    (^A&
 #-Z"8">">"@
Y UN
 

 $F#y)-	
 	

s   A	N)r   r   r    r!   r<   r=   r#   rG   r   r   r"   r   r$   r   r   rT   rT      sJ    &G
IM38n$
T#s(^ 
 
 
r   rT   r   	componentfault_tolerantr   c                     	 t        |j                  |             S # t        $ r@}|r7d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   r_   r`   ewarning_strs        r   parse_dict_through_componentrh      si    	i))$/00 T2c!fX=AKMM+&KGs     	A%3A A%A  A%c                     i }t        |      D ]-  }|j                  | v s| |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   r_   output	attributes       r   +extract_dict_elements_from_component_fieldsrl      sG     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#   )rm   r`   rf   s      r   
load_queryrr      s^    
zz% $&& I#a& R  #  Gs    AAAAAkeyc                     || v rLt        | |         dkD  r;t        | |         dkD  rt        j                  d| d| |    d       | |   d   d   S y)z%Fetch the first id from a dictionary.r      zFound multiple rb   z. Defaulting to first.r'   N)lenrd   re   )r   rs   s     r   fetch_first_idrw      s^    
d{s49~)tCy>AMMOC549+=STUCy|D!!r   urlaccess_tokenc                 z    d|i}t        j                  | ||      }|j                          |j                         S )zFetch data from a URL.Authorizationheadersparams)requestsrE   raise_for_statusro   )rx   ry   rm   r}   responses        r   
fetch_datar      s6    -G||C?H==?r   c                 D    t          d}t        ||       }t        |d      S )zFetch the team id./teamteamsDEFAULT_URLr   rw   )ry   rx   r   s      r   fetch_team_idr      s'    M
Cc<(D$((r   r5   c                 R    t          d|  d}t        ||ddi      }t        |d      S )zFetch the space id./team//spacearchivedfalserm   rX   r   )r5   ry   rx   r   s       r   fetch_space_idr      s4    My
/Cc<
G/DED$))r   space_idc                 R    t          d|  d}t        ||ddi      }t        |d      S )zFetch the folder id./space//folderr   r   r   foldersr   )r   ry   rx   r   s       r   fetch_folder_idr      s4    M
'
2Cc<
G/D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@   ry   rx   r   s        r   fetch_list_idr     s^    Xi[6WXJe4c<
G/D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*y)+ClickupAPIWrapperzWrapper for Clickup API.Nry   r5   r   r@   list_idforbid)extra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   rx   s       r   get_access_code_urlz%ClickupAPIWrapper.get_access_code_url!  s"    
 76GHn\N33r   oauth_client_secretcodec                     t          d}|||d}t        j                  ||      }|j                         }d|vr?t	        d|        d|v r,|d   dk(  r$t
        j                  |      }t	        dd	|        y
|d   S )zGet the access token.z/oauth/token)	client_idclient_secretr   )r~   ry   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   postro   printr   r   )r   r   r   r   rx   r~   r   r   s           r   get_access_tokenz"ClickupAPIWrapper.get_access_token)  s    
 \* )0
 ==V4}}%GD6"#$4=K#?';;OLJHN 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.ry   CLICKUP_ACCESS_TOKENr5   r   r@   r   )r   r   r   r   r   )r   r   s     r   validate_environmentz&ClickupAPIWrapper.validate_environmentE  s     "6N$:"
~ *&*@Ay+F9,=vn?UVz-:~ 6
{ *:{ 3VN5K
y r   
input_dictc                     dg i}|d   D ])  }	 t        |t        d      }|d   j                  |       + |S # t        $ r"}t	        j
                  d|        Y d}~Td}~ww xY w)z1Parse appropriate content from the list of teams.r   Fr`   zError parsing a team N)rh   rO   appendrc   rd   re   )selfr   parsed_teamsteamrf   s        r   attempt_parse_teamsz%ClickupAPIWrapper.attempt_parse_teamsW  sv    /6mw' 	;D;3D$uUW%,,T2	;   ; 5aS9::;s   &8	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)
isinstancery   r#   	TypeError)r   r}   s     r   get_headerszClickupAPIWrapper.get_headersc  sP     $++S1nT->->,?~NOO !!2!2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                  || j                               }|j	                         }| j                  |      }|S )zGet all teams for the user.r   )r}   )r   r   rE   r   ro   r   )r   rx   r   r   r   s        r   get_authorized_teamsz&ClickupAPIWrapper.get_authorized_teamss  sH    U#<<T-=-=-?@}}//5r   c                     t          dt        | j                        z   dz   }| j                         }t	        j
                  || j                         |      }d|iS )z3
        Get all the folders for the team.
        r   r   r|   r   )r   r#   r5   r   r   rE   r   r   rx   r~   r   s       r   get_folderszClickupAPIWrapper.get_folders~  sW     V$s4<<'888C((*<<T-=-=-?OH%%r   rm   r`   c                     t        |d      \  }}|d|iS t         d|d    }d| j                  dd}t        j                  || j                         |      }|j                         }t        |t        |      }|S )	z+
        Retrieve a specific task.
        Tr   Error/task/task_idtruecustom_task_idsr5   include_subtasksr|   )	rr   r   r5   r   rE   r   ro   rh   r&   )	r   rm   r`   r~   errorrx   r   r   parsed_tasks	            r   get_taskzClickupAPIWrapper.get_task  s    
 #5>>U##VF9$5#67%|| &

 <<T-=-=-?O}}2$~
 r   c                     t          d| j                   d}| j                         }t        j                  || 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  sO    
 Xdnn%5U;((*<<T-=-=-?OH%%r   c                     t        |d      \  }}|d|iS t         d|d    d}| j                         }t        j                  || j                         |      }d|iS )	z7
        Query tasks that match certain fields
        Tr   r   /list/r   /taskr|   r   )rr   r   r   r   rE   r   )r   rm   r~   r   rx   r   s         r   query_taskszClickupAPIWrapper.query_tasks  sp     #5>>U##VF9$5#6e<((*<<T-=-=-?OH%%r   c                     t          d| j                   d}t        j                  || j	                         | j                               }|j                         }t        |t        d      }|S )z.
        Get all spaces for the team.
        r   r   r|   Tr   )	r   r5   r   rE   r   r   ro   rh   rT   )r   rx   r   r   parsed_spacess        r   
get_spaceszClickupAPIWrapper.get_spaces  sc     VDLL>8<<))+D4K4K4M
 }}4T5QUVr   c                     | j                  |d      }t        |d      \  }}t        |t              sd|iS |d   |vrdd|d    d|j	                          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   rr   r   rH   keys)r   rm   taskr~   r   s        r   get_task_attributez$ClickupAPIWrapper.get_task_attribute  s    
 }}U4}8"5>&$'U##"#4/.v6F/G.H IIIK= NR 
 '($v6F/G*HIIr   c                     t        |d      \  }}|d|iS t         d|d    }d| j                  dd}| j                         }|d   |d	   i}t	        j
                  ||||
      }d|iS )r   Tr   r   r   r   r   r   r   r^   r}   r~   ro   r   )rr   r   r5   r   r   put)	r   rm   
query_dictr   rx   r~   r}   payloadr   s	            r   update_taskzClickupAPIWrapper.update_task  s     'uTB
EU##VJy$9#:;%|| &

 ""$./G1DE<<WV'RH%%r   c                    t        |d      \  }}|d|iS |d   D ]'  }t        |t              rdd| dt        |       ic S  t         d|d    }| j                         }|d	   d
k(  r	|d   g d}n$|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   r   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   )
rr   r   r<   typer   r   
ValueErrorr5   r   r   )r   rm   r   r   rM   rx   r}   assigne_payloadr~   r   r   s              r   update_task_assigneesz'ClickupAPIWrapper.update_task_assignees  s+    'uTB
EU##w' 	DdC( "&	$t*) 	 VJy$9#:;""$k"e+&0&9"EO$-&(G1DEO%j&=%>cB/   &|| &
 0<<WV'RH%%r   c                 2   t        |d      \  }}|d|iS | j                  }t         d| d}d| j                  d}t	        |t
              }| j                         }t        j                  ||||      }	|	j                         }
t        |
t
        d      S )	z%
        Creates a new task.
        Tr   r   r   r   r   )r   r5   )ro   r}   r~   )rr   r   r   r5   rl   r&   r   r   r   ro   rh   )r   rm   r   r   r   rx   r~   r   r}   r   r   s              r   create_taskzClickupAPIWrapper.create_task  s     'uTB
EU##,,VG9E2%+E=j$O""$==7GFS]]_+D$tLLr   c                 b   t        |d      \  }}|d|iS | j                  r| j                  n| j                  }t         d| d}t	        |t
              }| j                         }t        j                  |||      }|j                         }	t        |	t        d      }
d|
v r
|
d   | _        |
S )z%
        Creates a new list.
        Tr   r   r   r   ro   r}   r'   )rr   r@   r   r   rl   r&   r   r   r   ro   rh   r?   r   )r   rm   r   r   locationrx   r   r}   r   r   parsed_lists              r   create_listzClickupAPIWrapper.create_list$  s     'uTB
EU## &*^^4>>XhZu5=j$O""$==7GD}}24PTU;&t,DLr   c                     t        |d      \  }}|d|iS | j                  }t         d| d}d|d   i}| j                         }t	        j
                  |||      }|j                         }	d|	v r
|	d   | _        |	S )	z'
        Creates a new folder.
        Tr   r   r   r   r(   r   r'   )rr   r   r   r   r   r   ro   r   )
r   rm   r   r   r   rx   r   r}   r   r   s
             r   create_folderzClickupAPIWrapper.create_folder<  s    
 'uTB
EU##==WXJg6Jv&
 ""$==7GD}}4<:DLr   r   c                 d   |dk(  r| j                  |      }n|dk(  r| j                  |      }n|dk(  r| j                         }n|dk(  r| j                  |      }n|dk(  r| j	                  |      }n|dk(  r| j                  |      }nx|dk(  r| j                         }nb|dk(  r| j                         }nL|d	k(  r| j                         }n6|d
k(  r| j                  |      }n|dk(  r| j                  |      }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   ro   dumpsrc   r#   )r   r   rm   rj   s       r   runzClickupAPIWrapper.runT  s?   :]]5)F)),,U3F[ ..0F]"%%e,F]"%%e,F_$''.F[ ^^%F]"%%'F\!__&F]"%%e,F,,//6F!%9$q#ABF	::f%% 	v;	s   D D/.D/)zhttps://google.com)T)+r   r   r    r!   ry   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     s2   ""&L(3-&!GXc]!"Hhsm"#Ix}#!GXc]!L 7K4!414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$& & &*%&3 %&4 %&NM M M&  03 4 0 C C r   r   )Fr   ),r!   ro   rd   dataclassesr   r   r   typingr   r   r   r	   r
   r   r   r   r   langchain_core.utilsr   pydanticr   r   r   r   r   r&   r?   rJ   rO   rT   rH   rG   rh   rl   r#   rr   r<   rw   r   r   r   r   r   r   r$   r   r   <module>r     s!      1 1 I I I  5 ; ;. $ $ $ (
9 (
 (
V 
Y 
 
4 
Y 
 
$ 
F9 
F 
F 
I 
 
2 DI
	?<@	.
	?	* (- $
8D>8C=()4 C HSM C s 8D> T ) ) )*C *s *x} *+c + +# +-C -C -s -xPS} - ^	 ^r   