
    Mwg                         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Zd	 Zd
dlmZ  G d de      Z G d de      Zy)    )defaultdictchain)
itemgetter)Serialisable)BoolNoneSetStringSequenceAliasIntegerConvertible)
NestedText)rows_from_rangecoordinate_to_tupleget_column_letterc           	         t        |      }d | D        }t        t               }t        |t        d            D ]  \  }}||   j	                  |        |j                         D ]Y  \  }} t        |      }d}t        |       dk(  rd}|j                  |t        |       |t        |             }|j	                  |       [ dj                  |      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              3   2   K   | ]  }t        |        y wN)r   ).0cells     X/var/www/horilla/myenv/lib/python3.12/site-packages/openpyxl/worksheet/datavalidation.py	<genexpr>z*collapse_cell_addresses.<locals>.<genexpr>(   s     >%d+>      )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rs	            r   collapse_cell_addressesr0      s     ,F ?>J !&N::a=9 (Ss""3'( %**, 
U$u:?CJJsCJSZ8a 88F    c                 d    d | j                         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              3   2   K   | ]  }t        |        y wr   )r   )r   rss     r   r   z%expand_cell_ranges.<locals>.<genexpr>B   s     ?BOB?r   c              3   ,   K   | ]  }t        |   y wr   r   )r   r,   s     r   r   z%expand_cell_ranges.<locals>.<genexpr>C   s     )SUC[)s   )splitsetr   )range_stringrowsr'   s      r   expand_cell_rangesr:   ;   s1     @,*<*<*>?D)D)Eue}r1   r   )MultiCellRangec                      e Zd ZdZ ee      Z ed      Z ed      Z	 e
d      Z ed      Z e
d      Z e
d      Z e
d      Z ed      Z ed      Z ed      Z ed      Z ed      Z ede      Z ede      Z ed	
      Z ed
      Z ed
      Z ed
      Z ed      Z	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZ d Z!d Z"y)DataValidationdataValidationexpected_typesqrefT
allow_noneshowDropDown
allowBlank)rC   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typeNc                     || _         || _        || _        || _        || _        || _        ||}|| _        || _        || _        || _	        |	| _
        |
| _        || _        || _        || _        y r   )rA   rD   imeModeoperatorformula1formula2rE   showErrorMessageshowInputMessagerc   promptTitle
errorStyleerrorprompt
errorTitle)selfrc   rg   rh   ri   rj   rD   rE   rA   rk   rl   rm   rn   ro   re   rf   allow_blanks                    r   __init__zDataValidation.__init__j   s|    $ 
(   "$J$ 0 0	&$
$r1   c                 ^    t        |d      r|j                  }| xj                  |z  c_        y)z0Adds a cell or cell coordinate to this validator
coordinateNhasattrrt   rA   rp   r   s     r   addzDataValidation.add   s#    4&??D

d
r1   c                 N    t        |d      r|j                  }|| j                  v S )Nrt   ru   rw   s     r   __contains__zDataValidation.__contains__   s$    4&??Dtzz!!r1   )NNNFFFF NNNNNNNN)#__name__
__module____qualname__tagnamer   r;   rA   r   r'   r)   r   rD   hide_drop_downrj   ri   rE   rq   r
   ro   rm   rk   rn   r   strrg   rh   r	   rc   rl   re   rf   validation_typerr   rx   rz   r{   r1   r   r=   r=   J   s(   Gn5E'NE7^F4(L>*Nt,t,&J%KT*J%Ed+K&FT=HT=H 3 4D BCJ : ;G  c dHFmO "'"'#!!  !!"%J"r1   r=   c                        e Zd ZdZ ed      Z ed      Z ed      Z e	e
      ZdZdZ	 	 	 	 	 ddZed        Zd	 Zd
 Zd fd	Z xZS )DataValidationListdataValidationsTrB   r?   )r>   )disablePromptsxWindowyWindowcountc                 <    || _         || _        || _        || _        y r   )r   r   r   r>   )rp   r   r   r   r   r>   s         r   rr   zDataValidationList.__init__   s"     -,r1   c                     t        |       S r   )r"   rp   s    r   r   zDataValidationList.count   s    4yr1   c                 ,    t        | j                        S r   )r"   r>   r   s    r   __len__zDataValidationList.__len__   s    4&&''r1   c                 :    | j                   j                  |       y r   )r>   r    )rp   dvs     r   r    zDataValidationList.append   s    ""2&r1   c                     | j                   }| j                   D cg c]  }t        |j                        s| c}| _         t        |   |      }|| _         |S c c}w )zC
        Need to skip validations that have no cell ranges
        )r>   boolrA   superto_tree)rp   r   r)   r/   xml	__class__s        r   r   zDataValidationList.to_tree   sT     $$*.*=*=OQaggqOgog&$
 Ps
   AA)NNNNr{   r   )r|   r}   r~   r   r   r   r   r   r   r   r=   r>   __elements__	__attrs__rr   propertyr   r   r    r   __classcell__)r   s   @r   r   r      sx    GT*N&G&GN;N&LAI !% "
-  (' r1   r   N)r{   )collectionsr   	itertoolsr   rf   r   !openpyxl.descriptors.serialisabler   openpyxl.descriptorsr   r	   r
   r   r   r   r   openpyxl.descriptors.nestedr   openpyxl.utilsr   r   r   r0   r:   
cell_ranger;   r=   r   r{   r1   r   <module>r      s\    $   :   3 B	 'O"\ O"d. .r1   