
    K:gr                         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mZ d dlmZmZ d dlmZmZ d dlmZmZ  ed      Zerd dlmZ d d	lmZ  G d
 dee         Z G d deeeef            Zy)    )contextmanager)Path)TYPE_CHECKINGIterableIteratorListOptionalSupportsIndexUnionoverload)SelfTypeVar)AttachmentDictCreateAttachmentDict)ReadonlyFieldErrorUnsavedRecordErrorT)AnyField)Modelc                   l    e Zd ZdZdee   ddddddf fd	Zedee	   fd
       Z
ddZedededdfd       Zededee   ddfd       Zdeeef   deeee   f   ddf fdZdeeef   ddf fdZdeddf fdZdededdf fdZdeddf fdZd fdZdee   ddf fdZddedef fdZ xZS )ChangeTrackingListz
    A list that keeps track of when its contents are modified. This allows us to know
    if any mutations happened to the lists returned from linked record fields.
    argsfieldr   modelr   returnNc                H    t        |   |  || _        || _        d| _        y NT)super__init___field_model_tracking_enabled)selfr   r   r   	__class__s       Q/var/www/html/lionshead/venv/lib/python3.12/site-packages/pyairtable/orm/lists.pyr   zChangeTrackingList.__init__"   s&    $!%    c              #   b   K   | j                   }d| _         	 |  || _         y# || _         w xY ww)z6
        Temporarily disable change tracking.
        FN)r"   )r#   prevs     r%   disable_trackingz#ChangeTrackingList.disable_tracking(   s5     
 %%!&	*J%)D"TD"s   /# /	,/c                     	 | j                   sy 	 d| j                  j                  | j                  j
                  <   y # t        $ r Y y w xY wr   )r"   AttributeErrorr!   _changedr    
field_name)r#   s    r%   
_on_changezChangeTrackingList._on_change4   sL    	)) *
 8<T[[334  		s   > 	A
	A
indexvaluec                     y N )r#   r/   r0   s      r%   __setitem__zChangeTrackingList.__setitem__=       FIr&   keyc                     y r2   r3   )r#   r6   r0   s      r%   r4   zChangeTrackingList.__setitem__@   r5   r&   c                D    | j                          t        | 	  ||      S r2   )r.   r   r4   )r#   r/   r0   r$   s      r%   r4   zChangeTrackingList.__setitem__C   s!     	w"5%00r&   c                 B    | j                          t        | 	  |      S r2   )r.   r   __delitem__)r#   r6   r$   s     r%   r:   zChangeTrackingList.__delitem__L   s    w"3''r&   objectc                 B    | j                          t        | 	  |      S r2   )r.   r   append)r#   r;   r$   s     r%   r=   zChangeTrackingList.appendP   s    w~f%%r&   c                 D    | j                          t        | 	  ||      S r2   )r.   r   insert)r#   r/   r;   r$   s      r%   r?   zChangeTrackingList.insertT   s    w~eV,,r&   c                 B    | j                          t        | 	  |      S r2   )r.   r   remove)r#   r0   r$   s     r%   rA   zChangeTrackingList.removeX   s    w~e$$r&   c                 @    | j                          t        | 	         S r2   )r.   r   clear)r#   r$   s    r%   rC   zChangeTrackingList.clear\   s    w}r&   iterablec                 B    | j                          t        | 	  |      S r2   )r.   r   extend)r#   rD   r$   s     r%   rF   zChangeTrackingList.extend`   s    w~h''r&   c                 B    | j                          t        | 	  |      S r2   )r.   r   pop)r#   r/   r$   s     r%   rH   zChangeTrackingList.popd   s    w{5!!r&   )r   N))__name__
__module____qualname____doc__r   r   r   r   r   r   r)   r.   r   r
   r4   slicer   r:   r=   r?   rA   rC   rF   rH   __classcell__)r$   s   @r%   r   r      s[   
&hqk &* &W &QU & 	*(4. 	* 	*< IIqII IIuIXa[II I1]E)*1 Q^$1
 
1(u]E%9: (t (&Q &4 &-M -1 - -%A %$ %(x{ (t (" " " "r&   r   c            	       J    e Zd Z	 	 ddeeef   deeeef      dee   ddfdZy)AttachmentsListNfilenamecontentcontent_typer   c                 "   | j                   j                  st        d      | j                  j                  rt        d      | j                   j                  j                  j                  | j                   j                  | j                  j                  |||      }t        |d   j                               j                  d      }| j                         5  | j                          | j                  |       ddd       y# 1 sw Y   yxY w)a&  
        Upload an attachment to the Airtable API and refresh the field's values.

        This method will replace the current list with the response from the server,
        which will contain a list of :class:`~pyairtable.api.types.AttachmentDict` for
        all attachments in the field (not just the ones uploaded).

        You do not need to call :meth:`~pyairtable.orm.Model.save`; the new attachment
        will be saved immediately. Note that this means any other unsaved changes to
        this field will be lost.

        Example:
            >>> model.attachments.upload("example.jpg", b"...", "image/jpeg")
            >>> model.attachments[-1]["filename"]
            'example.jpg'
            >>> model.attachments[-1]["url"]
            'https://v5.airtableusercontent.com/...'
        z.cannot upload attachments to an unsaved recordz-cannot upload attachments to a readonly field)rR   rS   rT   fieldsr   N)r!   idr   r    readonlyr   metatableupload_attachmentr-   listvaluesrH   r)   rC   rF   )r#   rR   rS   rT   responseattachmentss         r%   uploadzAttachmentsList.uploadj   s    0 {{~~$%UVV;;$%TUU;;##));;KKNNKK""% < 
 8H-4467;;A>""$JJL KK$	 %$$s   "DD)NN)	rJ   rK   rL   r   strr   r	   bytesr`   r3   r&   r%   rQ   rQ   i   sP     04&*	(%T	"(% %U
+,(% sm	(%
 
(%r&   rQ   N)
contextlibr   pathlibr   typingr   r   r   r   r	   r
   r   r   typing_extensionsr   r   pyairtable.api.typesr   r   pyairtable.exceptionsr   r   r   pyairtable.orm.fieldsr   pyairtable.orm.modelr   r   rQ   r3   r&   r%   <module>rk      si    % 	 	 	 , E HCL .*J"a J"Z)%(~?S/S)TU )%r&   