o
    ϩZh                     @   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   X/var/www/html/lang_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)	cellsZinput_rangesrangesZ
raw_coordsZ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   )Zrange_stringrowsr&   r   r   r   expand_cell_ranges;   s   r1   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)r9   r6   )Zwholedecimalr   datetime
textLengthZcustom)values)stopwarninginformation)Z	noControloffondisabledZhiraganaZfullKatakanaZhalfKatakanaZ	fullAlphaZ	halfAlphaZ
fullHangulZ
halfHangul)ZbetweenZ
notBetweenequalZnotEqualZlessThanZlessThanOrEqualZgreaterThanZgreaterThanOrEqualtypeNFr   c                 C   sj   || _ || _|| _|| _|| _|| _|d ur|}|| _|| _|| _|| _	|	| _
|
| _|| _|| _|| _d S r   )r7   r:   imeModeoperatorformula1formula2r;   showErrorMessageshowInputMessagerH   promptTitle
errorStyleerrorprompt
errorTitle)selfrH   rK   rL   rM   rN   r:   r;   r7   rO   rP   rQ   rR   rS   rI   rJ   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hasattrrW   r7   rT   r   r   r   r   add   s   
zDataValidation.addc                 C   s   t |dr|j}|| jv S )NrW   rX   rZ   r   r   r   __contains__   s   

zDataValidation.__contains__)NNNFFFFr   NNNNNNNN)#__name__
__module____qualname__tagnamer   r2   r7   r   r&   r'   r   r:   Zhide_drop_downrN   rM   r;   rU   r	   rS   rQ   rO   rR   r   strrK   rL   r   rH   rP   rI   rJ   Zvalidation_typerV   r[   r\   r   r   r   r   r3   J   sR    













%r3   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 )DataValidationListZdataValidationsTr8   r5   )r4   )disablePromptsxWindowyWindowcountNr   c                 C   s   || _ || _|| _|| _d S r   )rc   rd   re   r4   )rT   rc   rd   re   rf   r4   r   r   r   rV      s   
zDataValidationList.__init__c                 C   s   t | S r   )r!   rT   r   r   r   rf      s   zDataValidationList.countc                 C   s
   t | jS r   )r!   r4   rg   r   r   r   __len__   s   
zDataValidationList.__len__c                 C   s   | j | d S r   )r4   r   )rT   Z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   )boolr7   )r   r+   r   r   r   
<listcomp>   s    z.DataValidationList.to_tree.<locals>.<listcomp>)r4   superto_tree)rT   r`   r'   xml	__class__r   r   rl      s
   zDataValidationList.to_tree)NNNNr   r   )r]   r^   r_   r`   r   rc   r   rd   re   r
   r3   r4   Z__elements__	__attrs__rV   propertyrf   rh   r   rl   __classcell__r   r   rn   r   rb      s&    





rb   N)r   )collectionsr   	itertoolsr   rJ   r   Z!openpyxl.descriptors.serialisabler   Zopenpyxl.descriptorsr   r   r	   r
   r   r   r   Zopenpyxl.descriptors.nestedr   Zopenpyxl.utilsr   r   r   r,   r1   Z
cell_ranger2   r3   rb   r   r   r   r   <module>   s   $	
!R