U o^@sddlmZddlmZddlmZddlmZddlm Z m Z m Z m Z m Z mZmZddlmZddlmZmZmZdd d Zd d Zd dlmZGdddeZGdddeZdS)) defaultdictchain) itemgetter) Serialisable)BoolNoneSetStringSequenceAliasInteger Convertible) NestedText)rows_from_rangecoordinate_to_tupleget_column_letterc Cst|}dd|D}tt}t|tddD]\}}|||q.|D]F\}}t|}d}t|dkrrd}||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). css|]}t|VqdSN)r).0cellrr{/private/var/folders/sd/whlwsn6x1_qgglc0mjv25_695qk2gl/T/pip-install-4zq3fp6i/openpyxl/openpyxl/worksheet/datavalidation.py (sz*collapse_cell_addresses..)keyz {0}{1}:{2}{3}z{0}{1} ) listrsortedrappenditemsrlenformatminmaxjoin) cellsZ input_rangesrangesZ raw_coordsZgrouped_coordsrowcolfmtrrrrcollapse_cell_addressess   r*cCs,dd|D}dd|D}tt|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) css|]}t|VqdSr)r)rrsrrrrBsz%expand_cell_ranges..css|]}t|VqdSrr)rr&rrrrCs)splitsetr)Z range_stringZrowsr$rrrexpand_cell_ranges;sr.r)MultiCellRangec@seZdZdZeedZedZedZ e Z e ddZ edZ e Ze Z e ZedZeddZeddZeddZeddZededZededZed d Zed d Zed d Zed d ZedZdddZ ddZ!ddZ"dS)DataValidationdataValidation expected_typesqrefT allow_none showDropDown allowBlank)r6r3)Zwholedecimalrdatetime textLengthZcustom)values)stopwarningZ information) Z noControloffondisabledZhiraganaZ fullKatakanaZ halfKatakanaZ fullAlphaZ halfAlphaZ fullHangulZ halfHangul)ZbetweenZ notBetweenequalZnotEqualZlessThanZlessThanOrEqualZ greaterThanZgreaterThanOrEqualtypeNFrcCsj| |_||_||_||_||_||_|dk r0|}||_||_||_||_ | |_ | |_ | |_ | |_ ||_dSr)r4r7imeModeoperatorformula1formula2r8showErrorMessageshowInputMessagerD promptTitle errorStyleerrorprompt errorTitle)selfrDrGrH allow_blankrIrJr7r8r4rKrLrMrNrOrErFrrr__init__ks"zDataValidation.__init__cCs"t|dr|j}|j|7_dS)z0Adds a cell or cell coordinate to this validator coordinateNhasattrrSr4rPrrrradds zDataValidation.addcCst|dr|j}||jkS)NrSrTrVrrr __contains__s zDataValidation.__contains__)NNNFTTNNrNNNNNNN)#__name__ __module__ __qualname__tagnamer r/r4r r$r%rrIr7Zhide_drop_downrJr8rQr rOrMrKrNrstrrGrHrrDrLrErFZvalidation_typerRrWrXrrrrr0JsR             %r0csxeZdZdZeddZeddZeddZe e dZ dZ dZ dd d Zed d Zd dZddZdfdd ZZS)DataValidationListZdataValidationsTr5r2)r1)disablePromptsxWindowyWindowcountNrcCs||_||_||_||_dSr)r_r`rar1)rPr_r`rarbr1rrrrRszDataValidationList.__init__cCst|Sr)rrPrrrrbszDataValidationList.countcCs t|jSr)rr1rcrrr__len__szDataValidationList.__len__cCs|j|dSr)r1r)rPZdvrrrrszDataValidationList.appendcs2|j}dd|jD|_tt||}||_|S)zC Need to skip validations that have no cell ranges cSsg|]}t|jr|qSr)boolr4)rr)rrr s z.DataValidationList.to_tree..)r1superr^to_tree)rPr\r%xml __class__rrrhs zDataValidationList.to_tree)NNNNr)N)rYrZr[r\rr_r r`rar r0r1Z __elements__ __attrs__rRpropertyrbrdrrh __classcell__rrrjrr^s$      r^N)r) collectionsr itertoolsrrFrZ!openpyxl.descriptors.serialisablerZopenpyxl.descriptorsrrr r r r r Zopenpyxl.descriptors.nestedrZopenpyxl.utilsrrrr*r.Z cell_ranger/r0r^rrrrs    $  ! S