B
    P\                  @   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	 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 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 )    )absolute_import)defaultdict)chain)
itemgetter)Serialisable)BoolNoneSetStringSequenceAliasIntegerConvertible)
NestedText)unicode)rows_from_rangecoordinate_to_tupleget_column_letter c       	      C   s   t |}dd | D }tt }x*t|tddD ]\}}|| | q0W xR| D ]F\}} t|}d}t| dkrxd}||t	| |t
| }|| qTW 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   s   | ]}t |V  qd S )N)r   ).0cellr   r   @lib/python3.7/site-packages/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colZfmtrr   r   r   collapse_cell_addresses   s    r)   c             C   s2   g }x|   D ]}|t| qW 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)
    )splitextendr   setr   from_iterable)Zrange_stringr$   Zrsr   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
 Ze
ddZedZe
 Ze
 Ze
 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)r4   r2   )ZwholeZdecimalr   ZdateZtimeZ
textLengthZcustom)values)stopZwarningZinformation)Z	noControlZoffZonZdisabledZhiraganaZfullKatakanaZhalfKatakanaZ	fullAlphaZ	halfAlphaZ
fullHangulZ
halfHangul)ZbetweenZ
notBetweenZequalZnotEqualZlessThanZlessThanOrEqualZgreaterThanZgreaterThanOrEqualtypeNFr   c             C   sj   |	| _ || _|| _|| _|| _|| _|d k	r0|}|| _|| _|| _|| _	|
| _
|| _|| _|| _|| _d S )N)r3   r5   imeModeoperatorformula1formula2r6   showErrorMessageshowInputMessager9   promptTitle
errorStyleerrorprompt
errorTitle)selfr9   r<   r=   allow_blankr>   r?   r5   r6   r3   r@   rA   rB   rC   rD   r:   r;   r   r   r   __init__l   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)hasattrrH   r3   )rE   r   r   r   r   add   s    
zDataValidation.addc             C   s   t |dr|j}|| jkS )NrH   )rI   rH   r3   )rE   r   r   r   r   __contains__   s    
zDataValidation.__contains__)NNNFTTNNr   NNNNNNN)#__name__
__module____qualname__tagnamer   r/   r3   r   r$   r%   r   r>   r5   Zhide_drop_downr?   r6   rF   r	   rD   rB   r@   rC   r   r   r<   r=   r   r9   rA   r:   r;   Zvalidation_typerG   rJ   rK   r   r   r   r   r0   K   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dataValidationsT)r4   )r2   )r1   )disablePromptsxWindowyWindowcountNr   c             C   s   || _ || _|| _|| _d S )N)rQ   rR   rS   r1   )rE   rQ   rR   rS   rT   r1   r   r   r   rG      s    zDataValidationList.__init__c             C   s   t | S )N)r   )rE   r   r   r   rT      s    zDataValidationList.countc             C   s
   t | jS )N)r   r1   )rE   r   r   r   __len__   s    zDataValidationList.__len__c             C   s   | j | d S )N)r1   r   )rE   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   )boolr3   )r   r(   r   r   r   
<listcomp>   s    z.DataValidationList.to_tree.<locals>.<listcomp>)r1   superrP   to_tree)rE   rO   r%   Zxml)	__class__r   r   rY      s
    zDataValidationList.to_tree)NNNNr   )N)rL   rM   rN   rO   r   rQ   r   rR   rS   r
   r0   r1   Z__elements__Z	__attrs__rG   propertyrT   rU   r   rY   __classcell__r   r   )rZ   r   rP      s    



    
rP   N)r   ) Z
__future__r   collectionsr   	itertoolsr   r;   r   Z!openpyxl.descriptors.serialisabler   Zopenpyxl.descriptorsr   r   r	   r
   r   r   r   Zopenpyxl.descriptors.nestedr   Zopenpyxl.compatr   Zopenpyxl.utilsr   r   r   r)   r.   Z
cell_ranger/   r0   rP   r   r   r   r   <module>   s   $	
!S