a
    !f'(                     @   s   d Z ddlmZ ddlmZ ddl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mZmZmZmZ dd
lmZ G dd deZdS )zHClasses for representing collections for the Google Cloud Firestore API.    )gapic_v1)retry)BaseCollectionReference_item_to_document_ref)query)aggregation)Watch)document)AnyCallable	GeneratorTupleUnion)Transactionc                       sL  e Zd ZdZdd fddZejdddZej	ddd	Z
dejjdfeeedf ejeedf eeef d
ddZdejjdfeedf ejeedf eeedf dddZedddZdejjdfeedf ejeedf edddZdejjdfeedf ejeedf eejedf dddZ e!e"dddZ#  Z$S )CollectionReferencea  A reference to a collection in a Firestore database.

    The collection may already exist or this class can facilitate creation
    of documents within the collection.

    Args:
        path (Tuple[str, ...]): The components in the collection path.
            This is a series of strings representing each collection and
            sub-collection ID, as well as the document IDs for any documents
            that contain a sub-collection.
        kwargs (dict): The keyword arguments for the constructor. The only
            supported keyword is ``client`` and it must be a
            :class:`~google.cloud.firestore_v1.client.Client` if provided. It
            represents the client that created this collection reference.

    Raises:
        ValueError: if

            * the ``path`` is empty
            * there are an even number of elements
            * a collection ID in ``path`` is not a string
            * a document ID in ``path`` is not a string
        TypeError: If a keyword other than ``client`` is used.
    N)returnc                    s   t t| j|i | d S N)superr   __init__)selfpathkwargs	__class__ e/var/www/html/python-backend/venv/lib/python3.9/site-packages/google/cloud/firestore_v1/collection.pyr   <   s    zCollectionReference.__init__c                 C   s
   t | S )zeQuery factory.

        Returns:
            :class:`~google.cloud.firestore_v1.query.Query`
        )	query_modQueryr   r   r   r   _query?   s    zCollectionReference._queryc                 C   s   t |  S )zAggregationQuery factory.

        Returns:
            :class:`~google.cloud.firestore_v1.aggregation_query.AggregationQuery`
        )r   AggregationQueryr   r   r   r   r   _aggregation_queryG   s    z&CollectionReference._aggregation_query)document_datadocument_idr   timeoutr   c                 C   s0   |  ||||\}}|j|fi |}|j|fS )a  Create a document in the Firestore database with the provided data.

        Args:
            document_data (dict): Property names and values to use for
                creating the document.
            document_id (Optional[str]): The document identifier within the
                current collection. If not provided, an ID will be
                automatically assigned by the server (the assigned ID will be
                a random 20 character string composed of digits,
                uppercase and lowercase letters).
            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:
            Tuple[:class:`google.protobuf.timestamp_pb2.Timestamp`,                 :class:`~google.cloud.firestore_v1.document.DocumentReference`]:
                Pair of

                * The ``update_time`` when the document was created/overwritten.
                * A document reference for the created document.

        Raises:
            :class:`google.cloud.exceptions.Conflict`:
                If ``document_id`` is provided and the document already exists.
        )Z	_prep_addcreateZupdate_time)r   r"   r#   r   r$   Zdocument_refr   Zwrite_resultr   r   r   addO   s    "zCollectionReference.add)	page_sizer   r$   r   c                    sB     |||\}} jjjf | jjd|} fdd|D S )a`  List all subdocuments of the current collection.

        Args:
            page_size (Optional[int]]): The maximum number of documents
                in each page of results from this request. Non-positive values
                are ignored. Defaults to a sensible value set by the API.
            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.DocumentReference`]:
                iterator of subdocuments of the current collection. If the
                collection does not exist at the time of `snapshot`, the
                iterator will be empty
        )requestmetadatac                 3   s   | ]}t  |V  qd S r   )r   ).0ir   r   r   	<genexpr>       z5CollectionReference.list_documents.<locals>.<genexpr>)Z_prep_list_documentsZ_clientZ_firestore_apilist_documentsZ_rpc_metadata)r   r'   r   r$   r(   r   iteratorr   r   r   r.   z   s    
z"CollectionReference.list_documents)
chunk_sizec                 C   s   |   |S r   )r   	_chunkify)r   r0   r   r   r   r1      s    zCollectionReference._chunkify)transactionr   r$   r   c                 C   s$   |  ||\}}|jf d|i|S )a  Read the documents in this collection.

        This sends a ``RunQuery`` RPC and returns a list of documents
        returned in the stream of ``RunQueryResponse`` messages.

        Args:
            transaction
                (Optional[:class:`~google.cloud.firestore_v1.transaction.Transaction`]):
                An existing transaction that this query will run 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.

        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).

        Returns:
            list: The documents in this collection that match the query.
        r2   )_prep_get_or_streamgetr   r2   r   r$   r   r   r   r   r   r4      s    zCollectionReference.getc                 C   s$   |  ||\}}|jf d|i|S )a  Read the documents in this collection.

        This sends a ``RunQuery`` RPC and then returns an iterator which
        consumes each document returned in the stream of ``RunQueryResponse``
        messages.

        .. note::

           The underlying stream of responses will time out after
           the ``max_rpc_timeout_millis`` value set in the GAPIC
           client configuration for the ``RunQuery`` API.  Snapshots
           not consumed from the iterator before that point will be lost.

        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:
            transaction (Optional[:class:`~google.cloud.firestore_v1.transaction.                Transaction`]):
                An existing transaction that the query will run 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:
            :class:`~google.cloud.firestore_v1.document.DocumentSnapshot`:
            The next document that fulfills the query.
        r2   )r3   streamr5   r   r   r   r6      s    $zCollectionReference.stream)callbackr   c                 C   s   |   }t||tjS )a  Monitor the documents in this collection.

        This starts a watch on this collection using a background thread. The
        provided callback is run on the snapshot of the documents.

        Args:
            callback (Callable[[:class:`~google.cloud.firestore.collection.CollectionSnapshot`], NoneType]):
                a callback to run when a change occurs.

        Example:
            from google.cloud import firestore_v1

            db = firestore_v1.Client()
            collection_ref = db.collection(u'users')

            def on_snapshot(collection_snapshot, changes, read_time):
                for doc in collection_snapshot.documents:
                    print(u'{} => {}'.format(doc.id, doc.to_dict()))

            # Watch this collection
            collection_watch = collection_ref.on_snapshot(on_snapshot)

            # Terminate this watch
            collection_watch.unsubscribe()
        )r   r   Z	for_queryr	   DocumentSnapshot)r   r7   r   r   r   r   on_snapshot   s    zCollectionReference.on_snapshot)%__name__
__module____qualname____doc__r   r   r   r   r   r    r!   r   methodDEFAULTdictr   strretriesRetryfloatr   r
   r&   intr   r.   r1   r   listr4   r	   r8   r6   r   r   r9   __classcell__r   r   r   r   r   "   sV   


-

 

!

(r   N)r=   Zgoogle.api_corer   r   rB   Z)google.cloud.firestore_v1.base_collectionr   r   Zgoogle.cloud.firestore_v1r   r   r   Zgoogle.cloud.firestore_v1.watchr   r	   typingr
   r   r   r   r   Z%google.cloud.firestore_v1.transactionr   r   r   r   r   r   <module>   s   