U
    d                     @   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 ]F\}} t|}d}t| dkrrd}||t	| |t
| }|| qNd|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   s   | ]}t |V  qd S N)r   ).0cellr   r   E/tmp/pip-unpacked-wheel-rwywncvq/openpyxl/worksheet/datavalidation.py	<genexpr>(   s     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   s   | ]}t |V  qd S r   )r   )r   rsr   r   r   r   B   s     z%expand_cell_ranges.<locals>.<genexpr>c                 s   s   | ]}t | V  qd S r   r   )r   r&   r   r   r   r   C   s     )splitsetr   )Zrange_stringZrowsr$   r   r   r   expand_cell_ranges;   s    r.   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)r6   r3   )Zwholedecimalr   datetime
textLengthZcustom)values)stopwarningZ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 k	r0|}|| _|| _|| _|| _	|	| _
|
| _|| _|| _|| _d S r   )r4   r7   imeModeoperatorformula1formula2r8   showErrorMessageshowInputMessagerD   promptTitle
errorStyleerrorprompt
errorTitle)selfrD   rG   rH   rI   rJ   r7   r8   r4   rK   rL   rM   rN   rO   rE   rF   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hasattrrS   r4   rP   r   r   r   r   add   s    
zDataValidation.addc                 C   s   t |dr|j}|| jkS )NrS   rT   rV   r   r   r   __contains__   s    
zDataValidation.__contains__)NNNFFFFr   NNNNNNNF)#__name__
__module____qualname__tagnamer   r/   r4   r   r$   r%   r   r7   Zhide_drop_downrJ   rI   r8   rQ   r	   rO   rM   rK   rN   r   strrG   rH   r   rD   rL   rE   rF   Zvalidation_typerR   rW   rX   r   r   r   r   r0   J   sP   












                
%r0   c                       sx   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dataValidationsTr5   r2   )r1   )disablePromptsxWindowyWindowcountNr   c                 C   s   || _ || _|| _|| _d S r   )r_   r`   ra   r1   )rP   r_   r`   ra   rb   r1   r   r   r   rR      s    zDataValidationList.__init__c                 C   s   t | S r   )r   rP   r   r   r   rb      s    zDataValidationList.countc                 C   s
   t | jS r   )r   r1   rc   r   r   r   __len__   s    zDataValidationList.__len__c                 C   s   | j | d S r   )r1   r   )rP   Zdvr   r   r   r      s    zDataValidationList.appendc                    s2   | j }dd | j D | _ tt| |}|| _ |S )zC
        Need to skip validations that have no cell ranges
        c                 S   s   g | ]}t |jr|qS r   )boolr4   )r   r)   r   r   r   
<listcomp>   s     
 z.DataValidationList.to_tree.<locals>.<listcomp>)r1   superr^   to_tree)rP   r\   r%   xml	__class__r   r   rh      s
    zDataValidationList.to_tree)NNNNr   )N)rY   rZ   r[   r\   r   r_   r   r`   ra   r
   r0   r1   Z__elements__	__attrs__rR   propertyrb   rd   r   rh   __classcell__r   r   rj   r   r^      s$   



     

r^   N)r   )collectionsr   	itertoolsr   rF   r   Z!openpyxl.descriptors.serialisabler   Zopenpyxl.descriptorsr   r   r	   r
   r   r   r   Zopenpyxl.descriptors.nestedr   Zopenpyxl.utilsr   r   r   r*   r.   Z
cell_ranger/   r0   r^   r   r   r   r   <module>   s   $	
!R