
    K:g[                        d dl mZm Z  d dlmZmZ d dlmZ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 d dlmZ d dlmZmZmZmZ d d	lmZmZmZm Z m!Z!m"Z" erd d
l#m$Z$ e" G d d             Z% G d de      Z& G d de      Z' G d de      Z( G d de      Z) G d de      Z* G d de      Z+ e e,              y)    )datedatetime)cached_propertypartialmethod)	TYPE_CHECKINGAnyDictIterableIteratorListLiteralOptionalUnionN)Self)AirtableModelrebuild_models)AuditLogResponse)EnterpriseInfoNestedId	UserGroupUserInfo)Url
UrlBuildercache_unless_forcedcoerce_iso_strcoerce_list_strenterprise_only)Apic                      e Zd ZdZ G d de      Z ee      ZdddefdZ	e
ddd	d
ededefd       Zd>dededefdZdddddeded
ededef
dZdddddee   ded
ededee   f
dZdddddddddddddee   dee   dee   dee   dee   deeeeef      deeeeef      d eeeee   f      d!eeeee   f      d"eeeee   f      d#eeeee   f      dee   fd$Z	 d?dd%d ed&ee   dedd'fd(Zd)eeed*   f   dd+fd,Z d-ee   dd.fd/Z!d)eeef   dd+fd0Z"d)eeef   dd+fd1Z#d2ed3   d)eeeef      dd+fd4Z$d5ede%fd6Z&d7ee   d8eee%f   dd9fd:Z'd;ee   d8eee%f   dd<fd=Z(y)@
Enterprisez
    Represents an Airtable enterprise account.

    >>> enterprise = api.enterprise("entUBq2RGdihxl3vU")
    >>> enterprise.info().workspace_ids
    ['wspmhESAta6clCCwF', ...]
    c                       e Zd Z ed      Zedz  Z ed      Zedz  Zedz  Zedz  Z	edz  Z
edz  Zd	ed
efdZded
efdZded   d
efdZd	ed
efdZ eed      Z eed      Zy)Enterprise._urlszmeta/enterpriseAccounts/{id}userszmeta/groupszclaim/usersauditLogEventsdescendants
moveGroupsmoveWorkspacesuser_idreturnc                      | j                   |z  S )zM
            URL for retrieving information about a single user.
            r#   selfr(   s     V/var/www/html/lionshead/venv/lib/python3.12/site-packages/pyairtable/api/enterprise.pyuserzEnterprise._urls.userE   s     ::''    group_idc                      | j                   |z  S )zS
            URL for retrieving information about a single user group.
            )groups)r-   r1   s     r.   groupzEnterprise._urls.groupK   s     ;;))r0   actiongrantrevokec                 (    | j                   d| dz  S )zY
            URL for granting or revoking admin access to one or more users.
            zusers/AdminAccess)meta)r-   r5   s     r.   admin_accesszEnterprise._urls.admin_accessQ   s     99x{;;;r0   c                 *    | j                  |      dz  S )zF
            URL for removing a user from the enterprise.
            remove)r/   r,   s     r.   remove_userzEnterprise._urls.remove_userW   s     99W%00r0   r7   r8   N)__name__
__module____qualname__r   r;   r#   r3   claim_users	audit_logr%   move_groupsmove_workspacesstrr/   r4   r   r<   r?   r   grant_adminrevoke_admin r0   r.   _urlsr"   ,   s    12 w ]# ]* ++	 ]* \) !11	( 	( 	(	*# 	*# 	*	<w/@'A 	<c 	<	1s 	1s 	1 $L': %\8<r0   rK   apir   workspace_idc                 .    || _         || _        d | _        y N)rL   id_info)r-   rL   rM   s      r.   __init__zEnterprise.__init__e   s    /3
r0   F)
aggregatedr%   rS   r%   r)   c                    g }|r|j                  d       |r|j                  d       d|i}| j                  j                  | j                  j                  |      }t        j                  || j                        S )ax  
        Retrieve basic information about the enterprise, caching the result.
        Calls `Get enterprise <https://airtable.com/developers/web/api/get-enterprise>`__.

        Args:
            aggregated: if ``True``, include aggregated values across the enterprise.
            descendants: if ``True``, include information about the enterprise's descendant orgs.
        rS   r%   includeparams)appendrL   geturlsr;   r   from_api)r-   rS   r%   rU   rW   responses         r.   infozEnterprise.infoj   sf     NN<(NN=)W%88<<		v<>&&x::r0   Tr1   collaborationsc                     d|rdgng i}| j                   j                  | j                  j                  |      |      }t	        j
                  |      S )a4  
        Retrieve information on a single user group with the given ID.

        Args:
            group_id: A user group ID (``grpQBq2RGdihxl3vU``).
            collaborations: If ``False``, no collaboration data will be requested
                from Airtable. This may result in faster responses.
        rU   r^   rV   )rL   rY   rZ   r4   r   model_validate)r-   r1   r^   rW   payloads        r.   r4   zEnterprise.group   sJ     >./rJ((,,tyyx8,H''00r0   r^   rS   r%   id_or_emailc                8    | j                  |g|||      }|d   S )ae  
        Retrieve information on a single user with the given ID or email.

        Args:
            id_or_email: A user ID (``usrQBq2RGdihxl3vU``) or email address.
            collaborations: If ``False``, no collaboration data will be requested
                from Airtable. This may result in faster responses.
            aggregated: If ``True``, includes the user's aggregated values
                across this enterprise account and its descendants.
            descendants: If ``True``, includes information about the user
                in a ``dict`` keyed per descendant enterprise account.
        rb   r   r+   )r-   rc   r^   rS   r%   r#   s         r.   r/   zEnterprise.user   s0    ( 

M)!#	  
 Qxr0   ids_or_emailsc                   g }g }|D ]  }d|v r|n|j                  |        g }|r|j                  d       |r|j                  d       |r|j                  d       | j                  j                  | j                  j                  |||d      }	|	d   D 
ci c]3  }
t        j                  |
| j                  |       x}r|j                  |5 }}
t        |j                               S c c}
w )	a  
        Retrieve information on the users with the given IDs or emails.

        Read more at `Get users by ID or email <https://airtable.com/developers/web/api/get-users-by-id-or-email>`__.

        Args:
            ids_or_emails: A sequence of user IDs (``usrQBq2RGdihxl3vU``)
                or email addresses (or both).
            collaborations: If ``False``, no collaboration data will be requested
                from Airtable. This may result in faster responses.
            aggregated: If ``True``, includes the user's aggregated values
                across this enterprise account and its descendants.
            descendants: If ``True``, includes information about the user
                in a ``dict`` keyed per descendant enterprise account.
        @r^   rS   r%   )rP   emailrU   )urlrW   r#   context)
rX   rL   rY   rZ   r#   r   r[   rP   listvalues)r-   re   r^   rS   r%   user_idsemailsvaluerU   r\   user_objr]   r#   s                r.   r#   zEnterprise.users   s    . !"Ee|V99%@ # NN+,NN<(NN=)88<<		"   
 %W-
- ))(DHHdKKK GGTM- 	 

 ELLN##
s   8C-N)	page_size
page_limitsort_ascpreviousnext
start_timeend_timer(   
event_typemodel_idcategoryrr   rs   rt   ru   rv   rw   rx   r(   ry   rz   r{   c             #     K   t        |      }t        |      }t        |      }t        |	      }	t        |
      }
t        |      }||||	|
|||rdnd||d
}|j                         D ci c]  \  }}|s	|| }}}|rdnd}| j                  j	                  d| j
                  j                  ||      }t        |d	      D ]6  \  }}t        j                  |      }| |j                  s y
|0||k\  s6 y
 y
c c}}w w)a]  
        Retrieve and yield results from the `Audit Log <https://airtable.com/developers/web/api/audit-logs-integration-guide>`__,
        one page of results at a time. Each result is an instance of :class:`~pyairtable.models.audit.AuditLogResponse`
        and contains the pagination IDs returned from the API, as described in the linked documentation.

        By default, the Airtable API will return up to 180 days of audit log events, going backwards from most recent.
        Retrieving all records may take some time, but is as straightforward as:

            >>> enterprise = Enterprise("entYourEnterpriseId")
            >>> events = [
            ...     event
            ...     for page in enterprise.audit_log()
            ...     for event in page.events
            ... ]

        If you are creating a record of all audit log events, you probably want to start with the earliest
        events in the retention window and iterate chronologically. You'll likely have a job running
        periodically in the background, so you'll need some way to persist the pagination IDs retrieved
        from the API in case that job is interrupted and needs to be restarted.

        The sample code below will use a local file to remember the next page's ID, so that if the job is
        interrupted, it will resume where it left off (potentially processing some entries twice).

        .. code-block:: python

            import os
            import shelve
            import pyairtable

            def handle_event(event):
                print(event)

            api = pyairtable.Api(os.environ["AIRTABLE_API_KEY"])
            enterprise = api.enterprise(os.environ["AIRTABLE_ENTERPRISE_ID"])
            persistence = shelve.open("audit_log.db")
            first_page = persistence.get("next", None)

            for page in enterprise.audit_log(sort_asc=True, next=first_page):
                for event in page.events:
                    handle_event(event)
                persistence["next"] = page.pagination.next

        For more information on any of the keyword parameters below, refer to the
        `audit log events <https://airtable.com/developers/web/api/audit-log-events>`__
        API documentation.

        Args:
            page_size: How many events per page to return (maximum 100).
            page_limit: How many pages to return before stopping.
            sort_asc: Whether to sort in ascending order (earliest to latest)
                rather than descending order (latest to earliest).
            previous: Requests the previous page of results from the given ID.
                See the `audit log integration guide <https://airtable.com/developers/web/api/audit-logs-integration-guide>`__
                for more information on pagination parameters.
            next: Requests the next page of results according to the given ID.
                See the `audit log integration guide <https://airtable.com/developers/web/api/audit-logs-integration-guide>`__
                for more information on pagination parameters.
            start_time: Earliest timestamp to retrieve (inclusive).
            end_time: Latest timestamp to retrieve (inclusive).
            originating_user_id: Retrieve audit log events originating
                from the provided user ID or IDs (maximum 100).
            event_type: Retrieve audit log events falling under the provided
                `audit log event type <https://airtable.com/developers/web/api/audit-log-event-types>`__
                or types (maximum 100).
            model_id: Retrieve audit log events taking action on, or involving,
                the provided model ID or IDs (maximum 100).
            category: Retrieve audit log events belonging to the provided
                audit log event category or categories.

        Returns:
            An object representing a single page of audit log results.
        	ascending
descending)
	startTimeendTimeoriginatingUserId	eventTypemodelIdr{   pageSize	sortOrderru   rv   rv   ru   GET)methodri   rW   offset_field   )startN)r   r   itemsrL   iterate_requestsrZ   rD   	enumerater   r`   events)r-   rr   rs   rt   ru   rv   rw   rx   r(   ry   rz   r{   rW   kvr   iter_requestscountr\   parseds                       r.   rD   zEnterprise.audit_log   s    p $J/
!(+!'*$Z0
"8,"8,#!(# !)1+| 
 &,\\^9^6Aqq!Q$^9!)vz11		##%	 2 
  )a@OE8%44X>FL==%%:*=  A :s%   A'D)
C<4C<9A8D2D8
D)r%   replacementUserRemovedc                    | j                   j                  |      }ddi}|r||d<   |rd|d<   | j                  j                  ||      }t        j                  || j                  |       S )a   
        Unshare a user from all enterprise workspaces, bases, and interfaces.
        If applicable, the user will also be removed from as an enterprise admin.

        See `Remove user from enterprise <https://airtable.com/developers/web/api/remove-user-from-enterprise>`__
        for more information.

        Args:
            user_id: The user ID.
            replacement: If the user is the sole owner of any workspaces, you must
                specify a replacement user ID to be added as the new owner of such
                workspaces. If the user is not the sole owner of any workspaces,
                this is optional and will be ignored if provided.
            descendants: If ``True``, removes the user from descendant enterprise accounts.
        isDryRunFreplacementOwnerIdTremoveFromDescendantsjsonrj   )rZ   r?   rL   postr   r[   )r-   r(   r   r%   ri   ra   r\   s          r.   r?   zEnterprise.remove_userY  sp    , ii##G,#-u"5,7G()/3G+,88==7=3##Hdhh#EEr0   r#   )managed	unmanagedManageUsersResponsec           	         d|j                         D cg c]  \  }}d|v rdnd|d|i c}}i}| j                  j                  | j                  j                  |      }t
        j                  || j                  |       S c c}}w )a  
        Batch manage organizations enterprise account users. This endpoint allows you
        to change a user's membership status from being unmanaged to being an
        organization member, and vice versa.

        See `Manage user membership <https://airtable.com/developers/web/api/manage-user-membership>`__
        for more information.

        Args:
            users: A ``dict`` mapping user IDs or emails to the desired state,
                either ``"managed"`` or ``"unmanaged"``.
        r#   rg   rh   rP   stater   rj   )r   rL   r   rZ   rC   r   r[   )r-   r#   keyrp   ra   r\   s         r.   rC   zEnterprise.claim_usersx  s      
 %*KKM
 %2LS% !$s
WsU %2
 88==!6!6W=E"++Hdhh+MMs   Bro   DeleteUsersResponsec                     | j                   j                  | j                  j                  dt	        |      i      }t
        j                  || j                   |       S )z
        Delete multiple users by email.

        Args:
            emails: A list or other iterable of email addresses.
        rh   rV   rj   )rL   deleterZ   r#   rl   r   r[   )r-   ro   r\   s      r.   delete_userszEnterprise.delete_users  sG     88??499??GT&\;R?S"++Hdhh+MMr0   c                 &    | j                  d|      S )z
        Grant admin access to one or more users.

        Args:
            users: One or more user IDs, email addresses, or instances of
                :class:`~pyairtable.models.schema.UserInfo`.
        r7   _post_admin_accessr-   r#   s     r.   rH   zEnterprise.grant_admin  s     &&w66r0   c                 &    | j                  d|      S )z
        Revoke admin access to one or more users.

        Args:
            users: One or more user IDs, email addresses, or instances of
                :class:`~pyairtable.models.schema.UserInfo`.
        r8   r   r   s     r.   rI   zEnterprise.revoke_admin  s     &&x77r0   r5   r6   c                 2   | j                   j                  | j                  j                  |      d|D cg c],  }t	        |t
              r|j                  n|}d|v rd|ind|i. c}}i      }t        j                  || j                   |       S c c}}w )Nr#   rg   rh   rP   r   rj   )	rL   r   rZ   r<   
isinstancer   rP   r   r[   )r-   r5   r#   r/   r(   r\   s         r.   r   zEnterprise._post_admin_access  s     88==II""6* % %/9$/IDGGt +..Wg&tWoM % ! 	
 #++Hdhh+MMs   1Bnamec                     | j                   j                  | j                  j                  d|i      }| j	                  | j                   |d         S )a  
        Creates a descendant enterprise account of the enterprise account.
        Descendant enterprise accounts can only be created for root enterprise accounts
        with the Enterprise Hub feature enabled.

        See `Create descendant enterprise <https://airtable.com/developers/web/api/create-descendant-enterprise>`__.

        Args:
            name: The name to give the new account.
        r   r   rP   )rL   r   rZ   r%   	__class__)r-   r   r\   s      r.   create_descendantzEnterprise.create_descendant  sA     88==!6!6fd^=L~~dhh77r0   	group_idstargetMoveGroupsResponsec                     t        |t              r|j                  }| j                  j	                  | j
                  j                  ||d      }t        j                  || j                  |       S )a  
        Move one or more user groups from the current enterprise account
        into a different enterprise account within the same organization.

        See `Move user groups <https://airtable.com/developers/web/api/move-user-groups>`__.

        Args:
            group_ids: User group IDs.
            target: The ID of the target enterprise, or an instance of :class:`~pyairtable.Enterprise`.
        )groupIdstargetEnterpriseAccountIdr   rj   )	r   r    rP   rL   r   rZ   rE   r   r[   )r-   r   r   r\   s       r.   rE   zEnterprise.move_groups  sd     fj)YYF88==II!!%-3 ! 
 "**8TXXt*LLr0   workspace_idsMoveWorkspacesResponsec                     t        |t              r|j                  }| j                  j	                  | j
                  j                  ||d      }t        j                  || j                  |       S )a  
        Move one or more workspaces from the current enterprise account
        into a different enterprise account within the same organization.

        See `Move workspaces <https://airtable.com/developers/web/api/move-workspaces>`__.

        Args:
            workspace_ids: The list of workspace IDs.
            target: The ID of the target enterprise, or an instance of :class:`~pyairtable.Enterprise`.
        )workspaceIdsr   r   rj   )	r   r    rP   rL   r   rZ   rF   r   r[   )r-   r   r   r\   s       r.   rF   zEnterprise.move_workspaces  sd     fj)YYF88==II%% --3 ! 
 &..x4.PPr0   )TrO   ))r@   rA   rB   __doc__r   rK   r   rZ   rG   rR   r   boolr   r]   r   r4   r   r/   r
   r   r#   r   intr   r   r   r   r   rD   r?   r	   r   rC   r   rH   rI   r   r   r   rE   rF   rJ   r0   r.   r    r    "   s   5=
 5=n 5!D4E 4 4
  !!	; ; 	;
 
; ;.1c 14 19 1"  $ ! 	
   
@  $ !2$}2$ 	2$
 2$ 2$ 
h2$n $($(#("&";?9=7;:>8<8<x C=x SM	x
 4.x 3-x smx U3h#678x 5dH!456x %Xc] 234x U3#567x 5hsm!345x 5hsm!345x 
"	#xz &*F
 "FF c]F
 F 
F>N#w'=>>?N	N6N8C= N5J N7%X"6 7;P 785h#7 8<Q 8N/0N9A%XBV9WN	N8c 8d 8MC=M c4i M 
	M4Q}Q c4i Q 
"	Qr0   r    c                   \    e Zd ZU dZeed<   ded<   ded<    G d de      Z G d	 d
e      Zy)r   z
    Returned from the `Remove user from enterprise <https://airtable.com/developers/web/api/remove-user-from-enterprise>`__
    endpoint.
    was_user_removed_as_adminUserRemoved.SharedsharedUserRemoved.Unsharedunsharedc                   4    e Zd ZU ed   ed<    G d de      Zy)r   UserRemoved.Shared.Workspace
workspacesc                   b    e Zd ZU eed<   eed<   eed<   dZeed<   dZee   ed<   dZ	ee   ed<   y)	r   permission_levelrM   workspace_name r(   Ndeleted_timeenterprise_account_id)
r@   rA   rB   rG   __annotations__r(   r   r   r   r   rJ   r0   r.   	WorkspacezUserRemoved.Shared.Workspace  s<    !!GS/3L(8,337!8C=7r0   r   N)r@   rA   rB   r   r   r   r   rJ   r0   r.   SharedzUserRemoved.Shared  s    788	8 	8r0   r   c                       e Zd ZU ed   ed<   ed   ed<   ed   ed<    G d de      Z G d	 d
e      Z G d de      Zy)r   UserRemoved.Unshared.BasebasesUserRemoved.Unshared.Interface
interfacesUserRemoved.Unshared.Workspacer   c                   ^    e Zd ZU eed<   eed<   eed<   eed<   dZee   ed<   dZee   ed<   y)r   r(   base_id	base_nameformer_permission_levelNr   r   	r@   rA   rB   rG   r   r   r   r   r   rJ   r0   r.   BasezUserRemoved.Unshared.Base  s5    LLN%((/3L(8,337!8C=7r0   r   c                   h    e Zd ZU eed<   eed<   eed<   eed<   eed<   dZee   ed<   dZee   ed<   y)	r   r(   r   interface_idinterface_namer   Nr   r   r   rJ   r0   r.   	InterfacezUserRemoved.Unshared.Interface%  s<    LL%((/3L(8,337!8C=7r0   r   c                   ^    e Zd ZU eed<   eed<   eed<   eed<   dZee   ed<   dZee   ed<   y)r   r(   r   rM   r   Nr   r   r   rJ   r0   r.   r   zUserRemoved.Unshared.Workspace.  s7    L%((/3L(8,337!8C=7r0   r   N)	r@   rA   rB   r   r   r   r   r   r   rJ   r0   r.   UnsharedzUserRemoved.Unshared  sJ    /009::9::	8= 	8	8 	8	8 	8r0   r   N)	r@   rA   rB   r   r   r   r   r   r   rJ   r0   r.   r   r     s3    
  $#  $$	8 	88= 8r0   r   c                   ^    e Zd ZU dZed   ed<   ed   ed<    G d de      Z G d d	e      Zy
)r   z
    Returned from the `Delete users by email <https://airtable.com/developers/web/api/delete-users-by-email>`__
    endpoint.
    DeleteUsersResponse.UserInfodeleted_usersDeleteUsersResponse.Errorerrorsc                   "    e Zd ZU eed<   eed<   y)r   rP   rh   Nr@   rA   rB   rG   r   rJ   r0   r.   r   zDeleteUsersResponse.UserInfo@  s    
r0   r   c                   6    e Zd ZU eed<   eed<   dZee   ed<   y)r   typerh   Nmessage)r@   rA   rB   rG   r   r   r   rJ   r0   r.   ErrorzDeleteUsersResponse.ErrorD  s    	
!%#%r0   r   N)	r@   rA   rB   r   r   r   r   r   r   rJ   r0   r.   r   r   7  s9    
 677,--= & &r0   r   c                   ^    e Zd ZU dZ ej
                  e      Zed   e	d<    G d de
      Zy)r   a>  
    Returned from the `Manage user membership <https://airtable.com/developers/web/api/manage-user-membership>`__,
    `Grant admin access <https://airtable.com/developers/web/api/grant-admin-access>`__, and
    `Revoke admin access <https://airtable.com/developers/web/api/revoke-admin-access>`__
    endpoints.
    default_factoryManageUsersResponse.Errorr   c                   J    e Zd ZU dZee   ed<   dZee   ed<   eed<   eed<   y)r   NrP   rh   r   r   )r@   rA   rB   rP   r   rG   r   rh   rJ   r0   r.   r   zManageUsersResponse.ErrorT  s(     HSM #x}#	r0   r   N)r@   rA   rB   r   pydanticFieldrl   r   r   r   r   r   rJ   r0   r.   r   r   J  s0     1?t0TFD,-T r0   r   c                   ,    e Zd ZU eed<   eed<   eed<   y)	MoveErrorrP   r   r   Nr   rJ   r0   r.   r   r   [  s    G
ILr0   r   c                   ~    e Zd ZU dZ ej
                  e      Zee	   e
d<    ej
                  e      Zee   e
d<   y)r   zf
    Returned by `Move user groups <https://airtable.com/developers/web/api/move-user-groups>`__.
    r   moved_groupsr   N)r@   rA   rB   r   r   r   rl   r   r   r   r   r   r   rJ   r0   r.   r   r   a  s;     $28>>$#GL$x.G,hnnTBFDOBr0   r   c                   ~    e Zd ZU dZ ej
                  e      Zee	   e
d<    ej
                  e      Zee   e
d<   y)r   zd
    Returned by `Move workspaces <https://airtable.com/developers/web/api/move-workspaces>`__.
    r   moved_workspacesr   N)r@   rA   rB   r   r   r   rl   r   r   r   r   r   r   rJ   r0   r.   r   r   j  s<     (6x~~d'Kd8nK,hnnTBFDOBr0   r   )-r   r   	functoolsr   r   typingr   r   r	   r
   r   r   r   r   r   r   typing_extensionsr   pyairtable.models._baser   r   pyairtable.models.auditr   pyairtable.models.schemar   r   r   r   pyairtable.utilsr   r   r   r   r   r   pyairtable.api.apir   r    r   r   r   r   r   r   varsrJ   r0   r.   <module>r     s    # 4
 
 
  " A 4 R R  & ]Q ]Q ]Q@18- 18h&- &&- " C CC] C tv r0   