QJ'i^ddlmZddlmZddlmZmZmZmZm Z m Z ddl m Z ddl mZmZddlmZddlmZmZmZmZmZdd lmZGd d Zd S) ) defaultdict)chain)AnyDictListOptionalTupleUnion)LveCtl)DEFAULTSLimitsDataStorage)DEFAULT_PROVIDER)ENTITY_DEFAULTSENTITY_PACKAGEENTITY_RESELLER ENTITY_USER BaseValidator)EpNprocValidatorceZdZdddddZddiZegZdd iZdd Ze d Z d Z e fdZ dZdZdZdZdZdZdZdZdZe defdZd S)LimitsValidatorzUser(s)z Package(s)z Reseller(s)zDefaults of resellers)userpackageresellerdefaultsrzHoster defaults limitszinherited from Globalzinherited from HosterNc|p t|_|pt|jg|_ddddd|_dS)N) common_msg specific_msgaffected_entity entity_id)r limits_providerr_list_validators message_dict)self_limits_data_storage validatorss )py/cllimits_validator/limits_validator.py__init__zLimitsValidator.__init__2sY3J7H7J7J *! T1 2 2/   #   c|d}|d}|d}|d}|M|K|tkrd}n?|tkrd|d}n-|tkrd |d}n|tkrd |d}n d |d}nd }|d }|d |d |}|S)z Format message string from single message dict. That function should be used for formatting message while validation input limits rrrr Nz"Hoster defaults limits is affectedzDefaults limits of Reseller "z" are affected.zLimits of user with LVE ID "zLimits of Reseller "zLimits of package " )r rrr)msg_dictrrrr msg_about_affect result_msgs r'+_format_message_string_from_single_msg_dictz;LimitsValidator._format_message_string_from_single_msg_dict@sl+ / "#45[)  &9+@H$$#G   O33#]9#]#]#]   K//#\)#\#\#\   O33#T)#T#T#T  #S#S#S#S  !   L"FF%5FF FF r)cg}d}|jD]?}|r|j|i|\}}n|j|i|\}}||z}||@||fS)a Call each validator from validators list and processing results args and kwargs are argumets for calling of validator We validate limits which already are recorded in ve.cfg if only_input_limits is False. We validate limits which we want to set if only_input_limits is True We return aggregated result as bool value and list of messages which explain which limits are wrong and who holds those T)r"validate_input_limitsvalidate_existing_limitsappend) r$only_input_limitsargskwargsmsg_list total_result validatorresultr-s r'#_call_validators_and_process_resultz3LimitsValidator._call_validators_and_process_resultas . & &I  W#B9#BD#SF#S#S #E9#Et#Vv#V#V  F "L OOH % % % %X%%r)c:d}|tkr(jt|}n|tkr6jt |t |}nx|tkr(jt |}nE|tkr8|tkr(jt |}n|}d}nd} d|||\}}fd|D}||fS)NFTc:g|]}|S)r0).0r-r$s r' z9LimitsValidator.validate_input_limits..s(hhhS[DDDXNNhhhr)) rr!get_user_by_uidintr get_package_by_name_and_resellerstrrget_reseller_by_namerr r<) r$ entity_typer input_limitsrcheck_reseller_defaultsvalidated_entityr9r8s ` r'r2z%LimitsValidator.validate_input_limitsws6#( + % %#3CCC NNSS   N * *#3TTUXYbUcUcehiqererss   O + +#3HHYXX   O + +H$$#'#7#L#LSQZ^^#\#\  #, &* # ## !%!I!I    # " "  h ihhh_ghhhX%%r)c`jj}fd|D}|S)Nc<g|]}d|SFr<)r@rr$s r'rAz3LimitsValidator._validate_users..s)ZZZD$::5$GGZZZr))r!usersvalues)r$rOr;s` r'_validate_userszLimitsValidator._validate_userss;$*1133ZZZZTYZZZ r)c`jj}fd|D}|S)Nc<g|]}d|SrMrN)r@rr$s r'rAz6LimitsValidator._validate_packages..s)cccw$::5'JJcccr))r!packagesrP)r$rTr;s` r'_validate_packagesz"LimitsValidator._validate_packagess;'07799ccccZbccc r)c`jj}fd|D}|S)NcJg|]}|j d| SNF)rr<)r@rr$s r'rAz7LimitsValidator._validate_resellers..s<444PX&2::5(KK222r))r! resellersrP)r$rYr;s` r'_validate_resellersz#LimitsValidator._validate_resellerssK(299;; 4444\e444 r)cg}|jjD]c}|jj|t }|t kr|j:||d|d|SrX)r!rkeysrYgetr r4r<)r$r; default_namedefault_entitys r'_validate_defaultsz"LimitsValidator._validate_defaultss 09>>@@ [ [L!1;?? hWWN))n.E.M MM$BB5.YY Z Z Z Z r)cx|jD]\}}|n|||} |S)z[ Replacing some specific messages for improve readability of error message )"dict_of_replaced_specific_messagesitemsreplace)r$r old_spec_msg new_spec_msgs r'_replace_specific_msgsz&LimitsValidator._replace_specific_msgssQ +/*Q*W*W*Y*Y L L &L,#'// lKKLLr)c2||jvr |j|S|S)zY Replacing some ids of entities for improve readability of error message ) dict_of_replaced_ids_of_entities)r$r s r'_replace_ids_of_entitiesz(LimitsValidator._replace_ids_of_entitiess& = = =8C Cr)c2||jvr |j|S|S)z[ Replacing some names of entities for improve readability of error message )"dict_of_replaced_names_of_entities)r$ entity_names r'_replace_names_of_entitiesz*LimitsValidator._replace_names_of_entitiess& $A A A:;G Gr)ctd}d}|D]}|d}||d}||d}||jvrJ||||||dd|D]\}} |dn||d }| D]\} } g} | D]<} | d | d}n| dd | dd }| |=d d t| D} || d| d }|S)zb Format message string from result of execution of validation the existing limits c*ttSN)rlistr?r)r'zLLimitsValidator._format_message_string_for_existing_limits..s D0A0Ar)Nrrr r)r rr+ z ()z, c34K|]}t|VdSrq)rE)r@items r' zMLimitsValidator._format_message_string_for_existing_limits..s(-[-[Dc$ii-[-[-[-[-[-[r)z: ) rrnrjlist_of_deleted_ids_of_entitiesr4rgrcjoinset capitalize)r$total_result_listtotal_result_dict total_msgr- name_of_checktype_of_affected_entityr r entities_dictrGlist_entity_dictsaffected_entities entity_dictrs r'*_format_message_string_for_existing_limitsz:LimitsValidator._format_message_string_for_existing_limitss ((A(ABB *  H$\2M&*&E&EhO`Fa&b&b #55h{6KLLID@@@ m ,-D E L L& $ ; ;H^>K">2:*5k*B-8-E*g*gUcId*g*g*g%,,_====$(II-[-[CHYDZDZ-[-[-[$[$[!([+*@*@*B*B[[FW[[[  \r)cdt||||D}||}|S)Nc&g|]\}}|D]}||Sr?r?)r@r; msg_dict_listr-s r'rAz.sJ   . ,   6      r))rrQrUrZr`r)r$r}rs r'r3z(LimitsValidator.validate_existing_limitss  27$$&&''))((**'')) 33   CCDUVV r)returncHt}|}|d|D]g}|dkr ||} t |ddd}|dkr |dkrdSX#t $rYdwxYwdS)zL Check is Low PMEM limit present :return True/False Frpmem*r+i T)r get_panel_users_uid_list _load_infoget_limits_by_user_idrCrd ValueError)_lvectl_panel_uids_listuidlimitspmem_limit_bytess r'is_low_pmem_limit_presentz)LimitsValidator.is_low_pmem_limit_presents ((";;==5!!!#  Caxx22377F #&vf~'='=c2'F'F#G#G #q((-=@Q-Q-Q44    us5B BB)NN)__name__ __module__ __qualname__rlrir ryrbr( staticmethodr0r<rr2rQrUrZr`rgrjrnrr3boolrr?r)r'rrse !+ **& ,($ '# !8*&     \@&&&,Td&&&&:         )))V   t\r)rN) collectionsr itertoolsrtypingrrrrr r cllimitsr cllimitslib_v2r r clveconfig.ve_config_readerrbaserrrrrep_nproc_validatorrrr?r)r'rs$#####::::::::::::::::66666666888888^^^^^^^^^^^^^^000000YYYYYYYYYYr)