a
    !fa9                     @   s   d Z ddlmZ ddlmZ ddlmZmZmZm	Z	m
Z
 ddlmZ ddlmZ ddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZ ddlmZmZm Z m!Z!m"Z"m#Z#m$Z$ ddl%m&Z& e$rddl'm(Z( G dd deZ)dS )a  Client for interacting with the Google Cloud Firestore API.

This is the base from which all interactions with the API occur.

In the hierarchy of API concepts

* a :class:`~google.cloud.firestore_v1.client.Client` owns a
  :class:`~google.cloud.firestore_v1.collection.CollectionReference`
* a :class:`~google.cloud.firestore_v1.client.Client` owns a
  :class:`~google.cloud.firestore_v1.document.DocumentReference`
    )gapic_v1)retry)
BaseClientDEFAULT_DATABASE_CLIENT_INFO_parse_batch_get_path_helper)CollectionGroup
WriteBatch)CollectionReference)DocumentReference)	FieldPathTransaction)client)grpc)Any	GeneratorIterableListOptionalUnionTYPE_CHECKING)DocumentSnapshot)
BulkWriterc                
       sN  e Zd ZdZddeedfdd fddZedd Zedd	 Z	e
ed
ddZe
edddZe
edddZddejjdfeee
 eejeeeedf dddZejjdfejeeeedf dddZdddeeef e d e e! e!dddZ"ddd eeef de e! e e! e!d!d"d#Z#e$dd$d%Z%edd&d'Z&  Z'S )(Clienta:  Client for interacting with Google Cloud Firestore API.

    .. note::

        Since the Cloud Firestore API requires the gRPC transport, no
        ``_http`` argument is accepted by this class.

    Args:
        project (Optional[str]): The project which the client acts on behalf
            of. If not passed, falls back to the default inferred
            from the environment.
        credentials (Optional[~google.auth.credentials.Credentials]): The
            OAuth2 Credentials to use for this client. If not passed, falls
            back to the default inferred from the environment.
        database (Optional[str]): The database name that the client targets.
            For now, :attr:`DEFAULT_DATABASE` (the default value) is the
            only valid database.
        client_info (Optional[google.api_core.gapic_v1.client_info.ClientInfo]):
            The client info used to send a user-agent string along with API
            requests. If ``None``, then default info will be used. Generally,
            you only need to set this if you're developing your own library
            or partner tool.
        client_options (Union[dict, google.api_core.client_options.ClientOptions]):
            Client options used to set user options on the client. API Endpoint
            should be set through client_options.
    N)returnc                    s   t t| j|||||d d S )N)projectcredentialsdatabaseclient_infoclient_options)superr   __init__)selfr   r   r    r!   r"   	__class__ a/var/www/html/python-backend/venv/lib/python3.9/site-packages/google/cloud/firestore_v1/client.pyr$   U   s    
zClient.__init__c                 C   s   |  tjtjtS )zLazy-loading getter GAPIC Firestore API.
        Returns:
            :class:`~google.cloud.gapic.firestore.v1`.firestore_client.FirestoreClient:
            The GAPIC client with the credentials of the current client.
        )Z_firestore_api_helperfirestore_grpc_transportZFirestoreGrpcTransportfirestore_clientFirestoreClientr%   r(   r(   r)   _firestore_apie   s
    zClient._firestore_apic                 C   s   |  tjS )zReturn the target (where the API is).
        Eg. "firestore.googleapis.com"

        Returns:
            str: The location of the API.
        )Z_target_helperr+   r,   r-   r(   r(   r)   _targetr   s    zClient._target)collection_pathr   c                 G   s   t t|d| iS )a  Get a reference to a collection.

        For a top-level collection:

        .. code-block:: python

            >>> client.collection('top')

        For a sub-collection:

        .. code-block:: python

            >>> client.collection('mydocs/doc/subcol')
            >>> # is the same as
            >>> client.collection('mydocs', 'doc', 'subcol')

        Sub-collections can be nested deeper in a similar fashion.

        Args:
            collection_path: Can either be

                * A single ``/``-delimited path to a collection
                * A tuple of collection path segments

        Returns:
            :class:`~google.cloud.firestore_v1.collection.CollectionReference`:
            A reference to a collection in the Firestore database.
        r   )r   r   )r%   r0   r(   r(   r)   
collection|   s    zClient.collection)collection_idr   c                 C   s   t | |S )a  
        Creates and returns a new Query that includes all documents in the
        database that are contained in a collection or subcollection with the
        given collection_id.

        .. code-block:: python

            >>> query = client.collection_group('mygroup')

        Args:
            collection_id (str) Identifies the collections to query over.

                Every collection or subcollection with this ID as the last segment of its
                path will be included. Cannot contain a slash.

        Returns:
            :class:`~google.cloud.firestore_v1.query.CollectionGroup`:
            The created Query.
        )r	   Z_get_collection_reference)r%   r2   r(   r(   r)   collection_group   s    zClient.collection_group)document_pathr   c                 G   s   t | j| d| iS )a}  Get a reference to a document in a collection.

        For a top-level document:

        .. code-block:: python

            >>> client.document('collek/shun')
            >>> # is the same as
            >>> client.document('collek', 'shun')

        For a document in a sub-collection:

        .. code-block:: python

            >>> client.document('mydocs/doc/subcol/child')
            >>> # is the same as
            >>> client.document('mydocs', 'doc', 'subcol', 'child')

        Documents in sub-collections can be nested deeper in a similar fashion.

        Args:
            document_path): Can either be

                * A single ``/``-delimited path to a document
                * A tuple of document path segments

        Returns:
            :class:`~google.cloud.firestore_v1.document.DocumentReference`:
            A reference to a document in a collection.
        r   )r   Z_document_path_helper)r%   r4   r(   r(   r)   document   s
    zClient.document)
referencesfield_pathstransactionr   timeoutr   c                 c   sN   |  |||||\}}}| jjf || jd|}	|	D ]}
t|
|| V  q6dS )a  Retrieve a batch of documents.

        .. note::

           Documents returned by this method are not guaranteed to be
           returned in the same order that they are given in ``references``.

        .. note::

           If multiple ``references`` refer to the same document, the server
           will only return one result.

        See :meth:`~google.cloud.firestore_v1.client.Client.field_path` for
        more information on **field paths**.

        If a ``transaction`` is used and it already has write operations
        added, this method cannot be used (i.e. read-after-write is not
        allowed).

        Args:
            references (List[.DocumentReference, ...]): Iterable of document
                references to be retrieved.
            field_paths (Optional[Iterable[str, ...]]): An iterable of field
                paths (``.``-delimited list of field names) to use as a
                projection of document fields in the returned results. If
                no value is provided, all fields will be returned.
            transaction (Optional[:class:`~google.cloud.firestore_v1.transaction.Transaction`]):
                An existing transaction that these ``references`` will be
                retrieved in.
            retry (google.api_core.retry.Retry): Designation of what errors, if any,
                should be retried.  Defaults to a system-specified policy.
            timeout (float): The timeout for this request.  Defaults to a
                system-specified value.

        Yields:
            .DocumentSnapshot: The next document snapshot that fulfills the
            query, or :data:`None` if the document does not exist.
        requestmetadataN)Z_prep_get_allr.   Zbatch_get_documents_rpc_metadatar   )r%   r6   r7   r8   r   r9   r;   Zreference_mapkwargsZresponse_iteratorZget_doc_responser(   r(   r)   get_all   s    .

zClient.get_all)r   r9   r   c                 c   sD   |  ||\}}| jjf || jd|}|D ]}| |V  q.dS )a  List top-level collections of the client's database.

        Args:
            retry (google.api_core.retry.Retry): Designation of what errors, if any,
                should be retried.  Defaults to a system-specified policy.
            timeout (float): The timeout for this request.  Defaults to a
                system-specified value.

        Returns:
            Sequence[:class:`~google.cloud.firestore_v1.collection.CollectionReference`]:
                iterator of subcollections of the current document.
        r:   N)Z_prep_collectionsr.   Zlist_collection_idsr=   r1   )r%   r   r9   r;   r>   iteratorr2   r(   r(   r)   collections  s    zClient.collectionsi  )bulk_writer
chunk_sizer   )	referencerB   rC   r   c                C   s    |du r|   }| j|||dS )aU  Deletes documents and their subcollections, regardless of collection
        name.

        Passing a CollectionReference leads to each document in the collection
        getting deleted, as well as all of their descendents.

        Passing a DocumentReference deletes that one document and all of its
        descendents.

        Args:
            reference (Union[
                :class:`@google.cloud.firestore_v1.collection.CollectionReference`,
                :class:`@google.cloud.firestore_v1.document.DocumentReference`,
            ])
                The reference to be deleted.

            bulk_writer (Optional[:class:`@google.cloud.firestore_v1.bulk_writer.BulkWriter`])
                The BulkWriter used to delete all matching documents. Supply this
                if you want to override the default throttling behavior.

        N)rC   )rB   _recursive_delete)r%   rD   rB   rC   r(   r(   r)   recursive_delete+  s    zClient.recursive_deleter   rC   depth)rD   rB   rC   rH   r   c          	      C   s   d}t |trN| t g|D ]"}|D ]}|d7 }||j q0q(nXt |t	r|
 D ]}|| j||||d d7 }q`|d7 }|| ntd|jj |dkr|  |S )z'Recursion helper for `recursive_delete.r      rG   zUnexpected type for reference: )
isinstancer   	recursiveselectr   Zdocument_idZ	_chunkifydeleterD   r   rA   rE   	TypeErrorr'   __name__close)	r%   rD   rB   rC   rH   Znum_deletedchunkZdoc_snapZcol_refr(   r(   r)   rE   P  s6    



zClient._recursive_deletec                 C   s   t | S )zGet a batch instance from this client.

        Returns:
            :class:`~google.cloud.firestore_v1.batch.WriteBatch`:
            A "write" batch to be used for accumulating document changes and
            sending the changes all at once.
        r
   r-   r(   r(   r)   batch~  s    zClient.batchc                 K   s   t | fi |S )aD  Get a transaction that uses this client.

        See :class:`~google.cloud.firestore_v1.transaction.Transaction` for
        more information on transactions and the constructor arguments.

        Args:
            kwargs (Dict[str, Any]): The keyword arguments (other than
                ``client``) to pass along to the
                :class:`~google.cloud.firestore_v1.transaction.Transaction`
                constructor.

        Returns:
            :class:`~google.cloud.firestore_v1.transaction.Transaction`:
            A transaction attached to this client.
        r   )r%   r>   r(   r(   r)   r8     s    zClient.transaction)(rO   
__module____qualname____doc__r   r   r$   propertyr.   r/   strr   r1   r	   r3   r   r5   r   methodDEFAULTlistr   r   retriesRetryfloatr   r   r   r?   rA   r   r   intrF   rE   r   rR   r8   __classcell__r(   r(   r&   r)   r   9   sl   

	&= 
*
.
r   N)*rU   Zgoogle.api_corer   r   r[   Z%google.cloud.firestore_v1.base_clientr   r   r   r   r   Zgoogle.cloud.firestore_v1.queryr	   Zgoogle.cloud.firestore_v1.batchr   Z$google.cloud.firestore_v1.collectionr   Z"google.cloud.firestore_v1.documentr   Z$google.cloud.firestore_v1.field_pathr   Z%google.cloud.firestore_v1.transactionr   Z,google.cloud.firestore_v1.services.firestorer   r+   Z7google.cloud.firestore_v1.services.firestore.transportsr   r*   typingr   r   r   r   r   r   r   Z'google.cloud.firestore_v1.base_documentr   Z%google.cloud.firestore_v1.bulk_writerr   r   r(   r(   r(   r)   <module>   s    $