o
    g                     @   s   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 d dlmZmZmZ dd	d
Zdd ZddlmZ G dd deZG dd deZdS )    )defaultdictchain)
itemgetter)Serialisable)BoolNoneSetStringSequenceAliasIntegerConvertible)
NestedText)rows_from_rangecoordinate_to_tupleget_column_letter c           	      C   s   t |}dd | D }tt }t|tddD ]\}}|| | q| D ]#\}} t|}d}t| dkr9d}||t	| |t
| }|| q'd|S )ax   Collapse a collection of cell co-ordinates down into an optimal
        range or collection of ranges.

        E.g. Cells A1, A2, A3, B1, B2 and B3 should have the data-validation
        object applied, attempt to collapse down to a single range, A1:B3.

        Currently only collapsing contiguous vertical ranges (i.e. above
        example results in A1:A3 B1:B3).
    c                 s       | ]}t |V  qd S N)r   ).0cellr   r   [/var/www/html/api-tag/env/lib/python3.10/site-packages/openpyxl/worksheet/datavalidation.py	<genexpr>(       z*collapse_cell_addresses.<locals>.<genexpr>   )keyz{0}{1}:{2}{3}z{0}{1} )listr   sortedr   appenditemsr   lenformatminmaxjoin)	cellsinput_rangesranges
raw_coordsgrouped_coordsrowcolfmtrr   r   r   collapse_cell_addresses   s   
r/   c                 C   s,   dd |   D }dd |D }tt| S )z
    Expand cell ranges to a sequence of addresses.
    Reverse of collapse_cell_addresses
    Eg. converts "A1:A2 B1:B2" to (A1, A2, B1, B2)
    c                 s   r   r   )r   )r   rsr   r   r   r   B   r   z%expand_cell_ranges.<locals>.<genexpr>c                 s   s    | ]}t | V  qd S r   r   )r   r+   r   r   r   r   C   r   )splitsetr   )range_stringrowsr&   r   r   r   expand_cell_ranges;   s   r5   r   )MultiCellRangec                   @   s  e Zd ZdZeedZedZedZ	e
ddZedZe
ddZe
ddZe
ddZedZeddZeddZeddZeddZededZededZed	d
Zedd
Zedd
Zedd
ZedZ																dddZ dd Z!dd Z"dS )DataValidationdataValidationexpected_typesqrefT
allow_noneshowDropDown
allowBlank)r=   r:   )wholedecimalr   datetime
textLengthcustom)values)stopwarninginformation)	noControloffondisabledhiraganafullKatakanahalfKatakana	fullAlpha	halfAlpha
fullHangul
halfHangul)between
notBetweenequalnotEquallessThanlessThanOrEqualgreaterThangreaterThanOrEqualtypeNFr   c                 C   sj   || _ || _|| _|| _|| _|| _|d ur|}|| _|| _|| _|| _	|	| _
|
| _|| _|| _|| _d S r   )r;   r>   imeModeoperatorformula1formula2r?   showErrorMessageshowInputMessager]   promptTitle
errorStyleerrorprompt
errorTitle)selfr]   r`   ra   rb   rc   r>   r?   r;   rd   re   rf   rg   rh   r^   r_   allow_blankr   r   r   __init__j   s"   
zDataValidation.__init__c                 C   s"   t |dr|j}|  j|7  _dS )z0Adds a cell or cell coordinate to this validator
coordinateNhasattrrl   r;   ri   r   r   r   r   add   s   
zDataValidation.addc                 C   s   t |dr|j}|| jv S )Nrl   rm   ro   r   r   r   __contains__   s   

zDataValidation.__contains__)NNNFFFFr   NNNNNNNN)#__name__
__module____qualname__tagnamer   r6   r;   r   r&   r(   r   r>   hide_drop_downrc   rb   r?   rj   r	   rh   rf   rd   rg   r   strr`   ra   r   r]   re   r^   r_   validation_typerk   rp   rq   r   r   r   r   r7   J   sR    













%r7   c                       s   e Zd ZdZeddZeddZeddZe	e
dZdZdZ					dd	d
Zedd Zdd Zdd Zd fdd	Z  ZS )DataValidationListdataValidationsTr<   r9   )r8   )disablePromptsxWindowyWindowcountNr   c                 C   s   || _ || _|| _|| _d S r   )r{   r|   r}   r8   )ri   r{   r|   r}   r~   r8   r   r   r   rk      s   
zDataValidationList.__init__c                 C   s   t | S r   )r!   ri   r   r   r   r~      s   zDataValidationList.countc                 C   s
   t | jS r   )r!   r8   r   r   r   r   __len__   s   
zDataValidationList.__len__c                 C   s   | j | d S r   )r8   r   )ri   dvr   r   r   r      s   zDataValidationList.appendc                    s.   | j }dd | j D | _ t |}|| _ |S )zC
        Need to skip validations that have no cell ranges
        c                 S   s   g | ]	}t |jr|qS r   )boolr;   )r   r.   r   r   r   
<listcomp>   s    z.DataValidationList.to_tree.<locals>.<listcomp>)r8   superto_tree)ri   ru   r(   xml	__class__r   r   r      s
   zDataValidationList.to_tree)NNNNr   r   )rr   rs   rt   ru   r   r{   r   r|   r}   r
   r7   r8   __elements__	__attrs__rk   propertyr~   r   r   r   __classcell__r   r   r   r   ry      s&    





ry   N)r   )collectionsr   	itertoolsr   r_   r   !openpyxl.descriptors.serialisabler   openpyxl.descriptorsr   r   r	   r
   r   r   r   openpyxl.descriptors.nestedr   openpyxl.utilsr   r   r   r/   r5   
cell_ranger6   r7   ry   r   r   r   r   <module>   s   $	
!R