o
    e                     @   s   d dl Z d dlmZ d dlmZmZmZ d dlmZ d dl	m
Z
mZ d dlmZmZ G dd deZG d	d
 d
eZdd Zdd ZdddZdS )    N)warn)StringAliasSequence)Serialisable)REL_NS
PKG_REL_NS)Element
fromstringc                   @   sX   e Zd ZdZd Ze Ze ZedZ	eddZ
eddZedZ					d	ddZdS )
Relationshipz'Represents many kinds of relationships.TargetT)
allow_noneIdNc                 C   s0   |dur
d t|}|| _|| _|| _|| _dS )z
        `type` can be used as a shorthand with the default relationships namespace
        otherwise the `Type` must be a fully qualified URL
        Nz{0}/{1})formatr   Typer   
TargetModer   )selfr   r   typer   r    r   R/var/www/html/venv/lib/python3.10/site-packages/openpyxl/packaging/relationship.py__init__!   s   
zRelationship.__init__)NNNNN)__name__
__module____qualname____doc__tagnamer   r   r   r   targetr   r   idr   r   r   r   r   r      s    

r   c                   @   sT   e Zd ZdZeedZdddZdd Zdd	 Zd
d Z	dd Z
dd Zdd ZdS )RelationshipListRelationships)expected_typer   c                 C   s
   || _ d S N)r   )r   r   r   r   r   r   ;      
zRelationshipList.__init__c                 C   s8   | j d d  }|| |jsdt||_|| _ d S )NrId{0})r   appendr   r   len)r   valuevaluesr   r   r   r$   ?   s
   

zRelationshipList.appendc                 C   
   t | jS r!   )r%   r   r   r   r   r   __len__G   r"   zRelationshipList.__len__c                 C   r(   r!   )boolr   r)   r   r   r   __bool__K   r"   zRelationshipList.__bool__c                 c   s"    | j D ]
}|j|kr|V  qdS )z
        Find relationships by content-type
        NB. these content-types namespaced objects and different to the MIME-types
        in the package manifest :-(
        N)r   r   )r   content_typerr   r   r   findO   s   

zRelationshipList.findc                 C   s,   | j D ]}|j|kr|  S qtd|)NzUnknown relationship: {0})r   r   KeyErrorr   )r   keyr.   r   r   r   __getitem__Z   s
   

zRelationshipList.__getitem__c                 C   sF   t dtd}t| jdD ]\}}|jsd||_||  q|S )Nr   )xmlns   r#   )r	   r   	enumerater   r   r   r$   to_tree)r   treeidxrelr   r   r   r6   a   s   zRelationshipList.to_treeN)r   )r   r   r   r   r   r   r   r$   r*   r,   r/   r2   r6   r   r   r   r   r   4   s    

r   c                 C   s&   t | \}}t |dd|}|S )z
    Convert relative path to absolutes that can be loaded from a zip
    archive.
    The path to be passed in is that of containing object (workbook,
    worksheet, etc.)
    _relsz{0}.rels)	posixpathsplitjoinr   )pathfolderobjfilenamer   r   r   get_rels_pathk   s   rB   c           
      C   s   |  |}t|}zt|}W n ty%   d|}t| t }Y nw t|}t	|d }|j
D ]$}|jdkr=q5|jdrL|jdd |_q5t||j}	t|	|_q5|S )zl
    Normalise dependency file paths to absolute ones

    Relative paths are relative to parent object
    z+{0} contains invalid dependency definitionsr   External/r4   N)readr
   r   	from_tree	TypeErrorr   r   r;   dirnamer<   r   r   r   
startswithr=   normpath)
archiverA   srcnoderelsmsgr?   parentr.   pthr   r   r   get_dependentsw   s&   





rR   c           
      C   s   t ||gs
td|dur|| }nz
t||j}W n
 ty'   Y dS w |j}| |}t|}|	|}t
|}	z	t| |	|_W |S  tyS   g |_Y |S w )z4
    Get related object based on id or rel_type
    z.Either the id or the content type are requiredN)any
ValueErrornextr/   rel_typeStopIterationr   rE   r
   rF   rB   rR   depsr0   )
rK   rX   r   clsr9   r>   rL   r7   r@   	rels_pathr   r   r   get_rel   s*   


r[   )NN)r;   warningsr   openpyxl.descriptorsr   r   r   !openpyxl.descriptors.serialisabler   openpyxl.xml.constantsr   r   openpyxl.xml.functionsr	   r
   r   r   rB   rR   r[   r   r   r   r   <module>   s    7