
    hi                        d Z ddlmZ ddlmZmZmZmZ ddlm	Z	 erddl
mZ  G d deedf                   Z G d	 d          Zd
S )zRelationship-related objects.    )annotations)TYPE_CHECKINGAnyDictcast)CT_Relationships)Partc                       e Zd ZdZd fdZ	 dddZddZd dZd!dZe	d             Z
e	d"d            Z	 dd#dZd$dZe	d"d            Z xZS )%RelationshipszGCollection object for |_Relationship| instances, having list semantics.baseURIstrc                r    t          t          |                                            || _        i | _        d S N)superr   __init___baseURI_target_parts_by_rId)selfr   	__class__s     d/var/www/development/aibuddy-work/election-extract/venv/lib/python3.11/site-packages/docx/opc/rel.pyr   zRelationships.__init__   s4    mT""++---46!!!    Freltypetarget
Part | strrIdis_externalboolreturn'_Relationship'c                X    t          |||| j        |          }|| |<   |s
|| j        |<   |S )z.Return a newly added |_Relationship| instance.)_Relationshipr   r   )r   r   r   r   r   rels         r   add_relationshipzRelationships.add_relationship   s>     C&$-MMS	 	4-3D%c*
r   target_partr	   r!   c                r    |                      ||          }|| j        }|                     |||          }|S )zlReturn relationship of `reltype` to `target_part`, newly added if not already
        present in collection.)_get_matching	_next_rIdr#   )r   r   r$   r"   r   s        r   
get_or_addzRelationships.get_or_add   sA       +66;.C''cBBC
r   
target_refc                    |                      ||d          }| | j        }|                     |||d          }|j        S )z{Return rId of external relationship of `reltype` to `target_ref`, newly added
        if not already present in collection.T)r   )r&   r'   r#   r   )r   r   r)   r"   r   s        r   get_or_add_ext_relz Relationships.get_or_add_ext_rel(   sM       *$ GG;.C''Sd'SSCwr   c                :    |                      |          }|j        S )zReturn target part of rel with matching `reltype`, raising |KeyError| if not
        found and |ValueError| if more than one matching relationship is found.)_get_rel_of_typer$   )r   r   r"   s      r   part_with_reltypezRelationships.part_with_reltype1   s     ##G,,r   c                    | j         S )z_Dict mapping rIds to target parts for all the internal relationships in the
        collection.)r   r   s    r   related_partszRelationships.related_parts7   s     ((r   c                    t          j                    }|                                 D ].}|                    |j        |j        |j        |j                   /|j        S )zoSerialize this relationship collection into XML suitable for storage as a
        .rels file in an OPC package.)	r   newvaluesadd_relr   r   r)   r   xml)r   rels_elmr"   s      r   r6   zRelationships.xml=   sX     $'));;== 	T 	TCSWck3>3?SSSS|r   _Relationship | Nonec                `    dd	}|                                  D ]} |||||          r|c S d
S )zuReturn relationship of matching `reltype`, `target`, and `is_external` from
        collection, or None if not found.r"   r!   r   r   r   r   r   r   c                l    | j         |k    rdS | j        |k    rdS | j        r| j        n| j        }||k    S )NF)r   r   r)   r$   )r"   r   r   r   
rel_targets        r   matchesz,Relationships._get_matching.<locals>.matchesL   sE    {g%%u+--u+.?OJ''r   N)r"   r!   r   r   r   r   r   r   )r4   )r   r   r   r   r<   r"   s         r   r&   zRelationships._get_matchingF   sZ    	( 	( 	( 	( ;;== 	 	CwsGV[99 


tr   c                    fd|                                  D             }t          |          dk    rd}t          |z            t          |          dk    rd}t          |z            |d         S )zReturn single relationship of type `reltype` from the collection.

        Raises |KeyError| if no matching relationship is found. Raises |ValueError| if
        more than one matching relationship is found.
        c                *    g | ]}|j         k    |S  )r   ).0r"   r   s     r   
<listcomp>z2Relationships._get_rel_of_type.<locals>.<listcomp>_   s%    KKKCCK74J4JC4J4J4Jr   r   z*no relationship of type '%s' in collection   z1multiple relationships of type '%s' in collection)r4   lenKeyError
ValueError)r   r   matchingtmpls    `  r   r-   zRelationships._get_rel_of_typeY   s     LKKK4;;==KKKx==A?D4'>***x==1FDTG^,,,{r   c                f    t          dt          |           dz             D ]}d|z  }|| vr|c S dS )zNext available rId in collection, starting from 'rId1' and making use of any
        gaps in numbering, e.g. 'rId2' for rIds ['rId1', 'rId3'].rB      zrId%dN)rangerC   )r   nrId_candidates      r   r'   zRelationships._next_rIdh   sV     q#d))a-(( 	% 	%A#aKMD(($$$$ )	% 	%r   )r   r   F)
r   r   r   r   r   r   r   r   r   r   )r   r   r$   r	   r   r!   )r   r   r)   r   r   r   )r   r   r   r	   r   r   )r   r   r   r   r   r   r   r8   )r   r   )__name__
__module____qualname____doc__r   r#   r(   r+   r.   propertyr1   r6   r&   r-   r'   __classcell__r   s   @r   r   r      s.       QQ7 7 7 7 7 7 OT              ) ) X)
    X EJ    &    % % % X% % % % %r   r   r!   c                       e Zd ZdZ	 dd fdZedd            Zedd            Zedd            Zedd            Z	edd            Z
 xZS )r!   z&Value object for relationship to part.Fr   r   r   r   r   r   externalr   c                    t          t          |                                            || _        || _        || _        || _        t          |          | _        d S r   )	r   r!   r   _rId_reltype_targetr   r   _is_external)r   r   r   r   r   rW   r   s         r   r   z_Relationship.__init__u   sQ     	mT""++---	 NNr   r   c                    | j         S r   )r\   r0   s    r   r   z_Relationship.is_external   s      r   c                    | j         S r   )rZ   r0   s    r   r   z_Relationship.reltype   s
    }r   c                    | j         S r   )rY   r0   s    r   r   z_Relationship.rId   s
    yr   r	   c                X    | j         rt          d          t          d| j                  S )NzOtarget_part property on _Relationship is undefined when target mode is Externalr	   )r\   rE   r   r[   r0   s    r   r$   z_Relationship.target_part   s6     	a   FDL)))r   c                    | j         rt          t          | j                  S t          d| j                  }|j                            | j                  S )Nr	   )r\   r   r   r[   partnamerelative_refr   )r   r   s     r   r)   z_Relationship.target_ref   sH     	?T\***&$,//F?//>>>r   rM   )
r   r   r   r   r   r   r   r   rW   r   )r   r   rN   )r   r	   )rO   rP   rQ   rR   r   rS   r   r   r   r$   r)   rT   rU   s   @r   r!   r!   r   s        00 Z_+ + + + + + + ! ! ! X!    X    X * * * X* ? ? ? X? ? ? ? ?r   N)rR   
__future__r   typingr   r   r   r   docx.opc.oxmlr   docx.opc.partr	   r   r   r!   r?   r   r   <module>rh      s    # # " " " " " " 1 1 1 1 1 1 1 1 1 1 1 1 * * * * * * #""""""b% b% b% b% b%Do-. b% b% b%J'? '? '? '? '? '? '? '? '? '?r   