a
    b                     @   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   q/Users/vegardjervell/Documents/master/model/venv/lib/python3.9/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   s   | ]}t |V  qd S 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    r0   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)r8   r5   )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typeNr   c                 C   sj   || _ || _|| _|| _|| _|| _|d ur0|}|| _|| _|| _|| _	|	| _
|
| _|| _|| _|| _d S r   )r6   r9   imeModeoperatorformula1formula2r:   showErrorMessageshowInputMessagerG   promptTitle
errorStyleerrorprompt
errorTitle)selfrG   rJ   rK   rL   rM   r9   r:   r6   rN   rO   rP   rQ   rR   rH   rI   allow_blankr   r   r   __init__k   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hasattrrV   r6   rS   r   r   r   r   add   s    
zDataValidation.addc                 C   s   t |dr|j}|| jv S )NrV   rW   rY   r   r   r   __contains__   s    
zDataValidation.__contains__)NNNTTNNr   NNNNNNNN)#__name__
__module____qualname__tagnamer   r1   r6   r   r%   r&   r   rL   r9   Zhide_drop_downrM   r:   rT   r	   rR   rP   rN   rQ   r   strrJ   rK   r   rG   rO   rH   rI   Zvalidation_typerU   rZ   r[   r   r   r   r   r2   J   sR   









                
%r2   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dataValidationsTr7   r4   )r3   )disablePromptsxWindowyWindowcountNr   c                 C   s   || _ || _|| _|| _d S r   )rb   rc   rd   r3   )rS   rb   rc   rd   re   r3   r   r   r   rU      s    zDataValidationList.__init__c                 C   s   t | S r   )r    rS   r   r   r   re      s    zDataValidationList.countc                 C   s
   t | jS r   )r    r3   rf   r   r   r   __len__   s    zDataValidationList.__len__c                 C   s   | j | d S r   )r3   r   )rS   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   )boolr6   )r   r*   r   r   r   
<listcomp>   r   z.DataValidationList.to_tree.<locals>.<listcomp>)r3   superra   to_tree)rS   r_   r&   xml	__class__r   r   rk      s
    zDataValidationList.to_tree)NNNNr   )N)r\   r]   r^   r_   r   rb   r   rc   rd   r
   r2   r3   Z__elements__	__attrs__rU   propertyre   rg   r   rk   __classcell__r   r   rm   r   ra      s$   



     

ra   N)r   )collectionsr   	itertoolsr   rI   r   Z!openpyxl.descriptors.serialisabler   Zopenpyxl.descriptorsr   r   r	   r
   r   r   r   Zopenpyxl.descriptors.nestedr   Zopenpyxl.utilsr   r   r   r+   r0   Z
cell_ranger1   r2   ra   r   r   r   r   <module>   s   $	
!S