
    t1i                        d dl Z d dlZd dlZd dlZd dlZd dlZd dlmZ d dlm	Z	 d dl
T d dlmZ d dlmZ  G d d          Z G d	 d
          Z G d dej                  Zd ZdS )    N)defaultdict)Optional)*)CmfActiveEntity)cmf_licensec                      e Zd Ze                    d          Ze                    d          Zi ddddddd	d
ddddddddddddddd
d	ddddddddZi ddddddd	ddddddddddddddddd	ddddddddZdddddddZ	dd ddd!Z
	 	 	 	 	 	 	 	 d2d#ed$ed%ed&ej        d'ed(ed)efd*Zd+ Z G d, d-e          Zd. Zed3d0            Zed1             Zd"S )4RegNumz*^(\d{6,})-(\d{4})-(\d{4})-(\d{4})-(\d{4})$z2^(\d{6,})-(\d{4})-(\d{4})-(\d{4})-(\d{4})-(\d{4})$   EvaWiki   
EvaProject   EvaEco   EvaServiceDesk   EvaGit   EvaTest   EvaCI/CD   EvaRMSstandardbusinesspremium
enterprisedemofree	educationstartmonthlyannual	perpetual)r
   r   r   r"   r#   r$   boxcloud)r
   r   r%   r&   Ncontract_idlic_user_limitlic_productlic_sup_end_datelic_type
lic_period
lic_deployc                     || _         |	| _        |
| _        || _        || _        || _        || _        || _        || _        || _	        d S N
regnumcs_match
reg_formatr'   r(   r)   r*   r+   r,   r-   )selfr'   r(   r)   r*   r+   r,   r-   r1   r2   r3   s              (./modules/settings/models/cmf_license.py__init__zRegNum.__init__Q   sR     &,(0)3*5-;*59I'/)3)3    c                 r     g d}d                      fd|D                       } j        j         d| dS )N)	r1   r'   r(   r)   r*   r+   r,   r-   r2   , c              3   b   K   | ])}t          |          | dt          |           V  *d S N=getattr.0paramr4   s     r5   	<genexpr>z"RegNum.__repr__.<locals>.<genexpr>k   X        g  g27WTSXEYEYEeu--wtU++--EeEeEeEe g  gr7   ()join	__class____name__r4   params
params_strs   `  r5   __repr__zRegNum.__repr__g   sw    @ @ @ YY  g  g  g  g;A g  g  g h h
.)99J9999r7   c                       e Zd ZdZdS )RegNum.ParseErroru=   Неверный формат кода регистрацииNrI   
__module____qualname____doc__ r7   r5   
ParseErrorrO   o   s        KKKKr7   rU   c                    d| _         d| _        | j        sd| _        | j         sd| _         | j        d| _        | j        sd| _        | j        sd| _        | j        sd| _        | j        sot          j        	                                }|j
        }|j        }|dk    rd}|d	z  }|d	z  }t          j        ||d	          t          j        d	
          z
  | _        | j                            d          }| j        d}| j        dk     rt          d| j                  | j        dk    r| j        }n`| j        dk    rd| j        dz  z   }nG| j        dk    rd| j        dz  z   }n.| j        dk    rd| j        dz  z   }nt          d| j                  d|z
  d}| j        | j        vrt          d| j                  | j        | j                 }t!          |dd                    dz   |z   d}	t#          t!          |          dz             }
| j         | j        vrt          d| j                   | j        | j                  }| j        | j        vrt          d| j                  | j        | j                 }| j        | j        vrt          d| j                  | j        | j                 }|d z  |d!z  z  |z  }|| j        d"z  z  d#z  d}| | |	 |
 | }|                     |          }| d$| d$|	 d$|
 d$| d$| | _        | j        S )%Nr   2   r   i90  r#   r%      r   r
   daysz%y%m06dr(     i'  
   i< p  d   iX> X       04dr)   M    r+   perioddeployr   r         -)r+   r(   r)   r'   r,   r-   r*   datetimedatetodayyearmonth	timedeltastrftime
ValueErrorproduct_codesintstr
type_codesperiod_codesdeploy_codes_calc_csr1   )r4   rn   ro   rp   yymmd1r(   d2
product_idd3d4	type_codeperiod_codedeploy_code	type_packd5cs_strd6s                     r5   generatezRegNum.generater   s~      	('D} 	#"DM&"$D 	%$D 	'&DO 	$#DO$ 		_M''))E:DKE{{	QJE$,M$q$A$AHDV\]D^D^D^$^D!$--f55 &&""-t/BCCC D((!0NN D((!D$72$==NN E))!D$73$>>NN F**!D$74$??NN-t/BCCC~%++4#555]D,<==='(89
BrssGt#j066T4  =//Z777ODM2	?$"333Xt777'8?$"333Xt777'8 A%+*:;iG	T-45<BB((B((B((]]6""66b6626666R66"66{r7   Tc                 R    d fd} fd} fd} fd} fd}d d d d  | j                   r[dt          d         d          d	         d
         d         d          d	          d
          d          }d         }	n | j                  rkdt          d         d          d	         d
         d         d         d          d	          d
          d          d          }d         }	n                     d                               |          |	k    }
|r|
s                     d           |            } |            } |            } |            \  }}}  |
||||||
  
        S )Nc                 2    |                                S r/   )match)expr   r1   s    r5   check_matchz!RegNum.parse.<locals>.check_match   s     IIf%%ELr7   c                      t                    dk    r                    d          dt                    z
  } | dk    r	| dz  dz  } n| dk    r	| dz  dz  } n| dk    r| dz  dz  } | S )	Nrb   r
   r`   ra   r^   r_   r\   r]   )ru   rU   )limitclsob_user_limitr1   s    r5   deob_user_limitz%RegNum.parse.<locals>.deob_user_limit   s    =!!D((nnVQ///3}---E t||-,+Lr7   c                      dk    rdz  } ndz  } t                    dz
  | z
  }|j        vr                    d|          j        |         S )N5r]   ra   re   r   )ru   rt   rU   )contract_id_partproduct_coder   r'   
ob_productr3   r1   s     r5   deob_productz"RegNum.parse.<locals>.deob_product   so    S  #.#3  #.#5 z??T14DDL3#444nnVQ===$\22r7   c                  r   dS t                    dz  z  dz  } | dz  }| dz  dz	  }| dz  dz	  }|j        vr                    d	|          |j        vr                    d|          |j        vr                    d
|          j        |         j        |         j        |         fS )N)r   r#   r%   ri   rj      p   r   i  r   r   r   )ru   rw   rU   rx   ry   )deobr   r   r   r   r'   ob_typer1   s       r5   	deob_typezRegNum.parse.<locals>.deob_type   s    11w<<;#56=D vI)+1K,.14K..nnVQ	:::#"222nnVQ<<<#"222nnVQ<<<>),c.>{.KSM]^iMjjjr7   c                  
   t                    dz
  } d| dz  z   }| dz  }|dk     s|r|dk    r                    d||          |dk    rd}|dz  }|dz  }t          j        ||d          t          j        d	          z
  S )
Nrf     r_   i  rX   r   r   r
   rY   )ru   rU   rl   rm   rq   )r{   yyyymmr   ob_yymmr1   s      r5   	deob_yymmzRegNum.parse.<locals>.deob_yymm   s    w<<$&D $)#DBd{{"{RnnVQb999Rxx	!GB=r1--0B0J0J0JJJr7   r   r
   r]   r   r   r   r   6r   r   r   r0   )_REGNUM_5_REru   _REGNUM_6_RErU   rz   )r   r1   check_csr   r   r   r   r   r   csr2   r(   r)   r*   r+   r,   r-   r'   r   r   r   r   r   r3   s   ``               @@@@@@@r5   parsezRegNum.parse   s   $(	 	 	 	 	 		 	 	 	 	 	 	$		3 		3 		3 		3 		3 		3 		3 		3 		3	k 	k 	k 	k 	k 	k 	k 	k,	K 	K 	K 	K 	K 	K 	K  
;s'(( 	,JeAh++K!!HMqJAhGa@%(@E!H@eAh@@FqBB[)** 
	,JeAh++K!!HMqJAhGAhGaJ%(JE!HJeAhJaJJFqBB..+++<<''2- 	,H 	,..+++(**"lnn$9;;+49;;(*jsH#NP[-Zdnp p p 	pr7   c                     t          j        |                                                                           }t	          j        |                                          }|ddd         }|S )N08dr   r   hashlibmd5encode	hexdigestzlibcrc32sr   r   r   s       r5   rz   zRegNum._calc_cs.  sS    k!((**%%//11
3::<<((^^AaC 	r7   )
NNNNNNNNNNT)rI   rQ   rR   recompiler   r   rt   rw   rx   ry   ru   rv   rl   rm   r6   rM   rs   rU   r   classmethodr   staticmethodrz   rT   r7   r5   r	   r	      s       ::KLLL::STTL	9 	
< 	
8	
 	
 	
8 	
9 	
: 	
8 	1 	a 	! 	! 	!  	1!" 	A#$ 	!%M(	: 	
: 	
9	
 	
< 	
6 	
6 	
; 	
7 	A 	A 	1 	a 	  	!" 	Q#$ 	%J, 	 	L  L  $"&#.2 ""374 44  4 	4
 'm4 4 4 4 4 4 4,: : :L L L L LZ L L LG G GR pp pp pp [ppd   \  r7   r	   c                       e Zd Ze                    d          Z	 	 	 	 	 	 	 	 	 	 ddedededej	        deded	efd
Z
d Z G d de          Z G d de          ZdZdZdZedd            Zed             ZdS )ActivationCodez:^(\d{6,})-(\d{6})-(\d{5})-(\d{5})-(\d{5})-(\d{5})-(\d{4})$Nr'   r(   r)   r*   r+   r,   r-   c                     |	| _         || _        || _        || _        || _        || _        || _        || _        || _        |
| _	        || _
        || _        || _        || _        d S r/   )r2   r1   r'   r(   r)   r*   r+   r,   r-   scs1scs2scs3scs4activation_code)r4   r'   r(   r)   r*   r+   r,   r-   r1   r2   r   r   r   r   r   s                  r5   r6   zActivationCode.__init__D  sq     )1%+*5-;*59I'/)3)3#'	#'	#'	#'	.=r7   c                 r     g d}d                      fd|D                       } j        j         d| dS )N)r   r   r   r   r   r1   r'   r(   r)   r*   r+   r,   r-   r2   r9   c              3   b   K   | ])}t          |          | dt          |           V  *d S r;   r=   r?   s     r5   rB   z*ActivationCode.__repr__.<locals>.<genexpr>g  rC   r7   rD   rE   rF   rJ   s   `  r5   rM   zActivationCode.__repr__b  sw    @ @ @ YY  g  g  g  g;A g  g  g h h
.)99J9999r7   c                       e Zd ZdZdS )ActivationCode.ParseError9   Неверный формат кода активацииNrP   rT   r7   r5   rU   r   k          GGGGr7   rU   c                       e Zd ZdZdS )"ActivationCode.RegnumMismatchErrorr   NrP   rT   r7   r5   RegnumMismatchErrorr   n  r   r7   r   )r   	   r   r
   r   r   r      r   r   r   r]   rX   )r   r   r   r]   r   r   r         r   r   rX   r   r
   r   r   )rX   r   r   r]   r   r      r
      r   r   r   r   r   r      r   r   r   Tc                    " |st                                           }t          |t                    rt                              |          } j                            |          }|s                     |d          t          |d         d          "|r"|j
        "k    r                     ||d          |d         }|d         }|d         }|d         }	|d         }
|d          |d          |d          |d          |d          |d          | }|d	         }                     |          |k    }|r|s                     |d           "fd
} ||          }|r"|j        |k    r                     ||d           ||          }|dz	  dz  }|dz  }|t          j        vr                     |d          t          j        |         }|r"|j        |k    r                     ||d          |dz  }t!          j        d|dz  z   d|dz  z   d          t!          j        d          z
  }|r"|j        |k    r                     ||d           ||          }|dz	  dz  }|dz	  d	z  }|d	z  }|s|s
|sd }d }d }n|t          j        vr                     |d          t          j        |         }|r"|j        |k    r                     ||d          |t          j        vr                     |d          t          j        |         }|r"|j        |k    r                     ||d          |t          j        vr                     |d          t          j        |         }|r"|j        |k    r                     ||d	           ||	          }|dz	  }|dz  } ||
          }|dz	  } |dz  }!  |o|j        ||||| |!"||||||          S )Nr   r
   r]   r   r   r   r   r   r   c                 x   t          | d          }t          |           dk    r3j        }|dk     s
J d            |dz  z  dz  }|dk     s
J d            nt          |           dk    r3j        }|dk     s
J d	            |dz  z  d
z  }|dk     s
J d            net          |           dk    r3j        }|dk     s
J d            |dz  z  dz  }|dk     s
J d            nt          dt          |                      d}t          t          |                    D ]}|d|z  z  r|d||         z  z  }|S )Nr]   r   ri   ob_int_val_4i  	int_val_4r   i   ob_int_val_5il  	int_val_5r   i   ob_int_val_6i 	int_val_6	deob_int_r   r
   )ru   len_m13_m16_m19rs   range)r   
ob_int_valtableint_valresultbr   r'   s         r5   deob_intz&ActivationCode.parse.<locals>.deob_int  s    QJ1vv{{!D(((.((($d(:;dB~~~{~~~~Q1!E)))>)))$e(;<uDQ1!F***N***$f(<=F''''''' !5SVV!5!5666 F3u::&& . .a1f% .qE!H}-FMr7   r   i  r   rX   )ro   rp   dayrY   r      )r1   r2   r   r   r   r   r   r'   r(   r)   r*   r+   r,   r-   )
CmfLicenseget_activation_hwid
isinstancerv   r	   r   _ACT_CODE_REr   rU   ru   r'   r   rz   r(   rt   r)   rl   rm   rq   r*   rw   r+   rx   r,   ry   r-   r1   )#r   r   r1   activation_hwidr   r   r   ob_product_monthsob_type_period_deployob_scs12ob_scs34r   r   r2   r   r(   product_monthsr   monthsr)   r*   type_period_deployr   r   r   r+   r,   r-   scs12r   r   scs34r   r   r'   s#   `                                 @r5   r   zActivationCode.parseu  s    	?(<<>>Ofc"" 	*\\&))F &&77 	5..!444%(B'' 	Ff(K77))/61EEEa!!H %a88!HaeAhaaa%(aE!HaeAhaP_aa1X <<''2- 	5H 	5..!444	 	 	 	 	 	: "-00 	Ff+~==))/61EEE ""344&",3%'v333..!444*<8 	Ff(K77))/61EEE 	!#=d62:oQvby[VWXXX[c[mst[u[u[uu 	Ff-1AAA))/61EEE &X&;<<'1,3	)Q.#5(3. 	J 	J[ 	JHJJJ 111nn_a888(3H J&/X55--ovqIII&"555nn_a888,[9J J&+z99--ovqIII&"555nn_a888,[9J J&+z99--ovqIII ""zt|""zt|s+fmhP_Dt$#NP[-Zdn	p p p 	pr7   c                     t          j        |                                                                           }t	          j        |                                          }|ddd          }|S )Nrc   r   r   s       r5   rz   zActivationCode._calc_cs  sS    k!((**%%//11
3::<<((^^BCC 	r7   )NNNNNNNNNNNNNN)NNT)rI   rQ   rR   r   r   r   ru   rv   rl   rm   r6   rM   rs   rU   r   r   r   r   r   r   r   rz   rT   r7   r5   r   r   6  sm        ::[\\L  $"&#.2 """&26 > >>  > 	>
 'm> > > > > > ><: : :H H H H HZ H H HH H H H Hj H H H 6DADMDtp tp tp [tpl   \  r7   r   c                       e Zd ZU dZeZeZej        j        g dz   Ze	                    d            e
j        ddd          Z e
j        ddd          Z e
j        ddd          Z e
j        dd	d          Z e
j        dd
d          Zej         G d d                      Ze ed          d                         ZdZeed<   ed             Zed             Zed             Zed             Zed             ZedGdHd            Zed             Z edId            Z!ed             Z"e#$                    d          Z%edJd            Z&ed              Z'edGd!            Z(edGd"            Z)edGd#            Z*ed$             Z+d% Z,d& Z-d' Z.d( Z/d) Z0d* Z1 G d+ d,e2          Z3edJd-            Z4ed.             Z5ed/             Z6ed0             Z7d1 Z8 fd2Z9 fd3Z: fd4Z;e e<ddd5d67          d8                         Z=d9d:d;d<d=d>d?d@Z>edA             Z?edB             Z@edC             ZAedD             ZBedE             ZCedF             ZD xZES )Kr   uA   
    Приобритённые и демо-лицензии
    )apply_regnum
apply_demonew_license_infopublic_list_hack_emptycreatei  r   r
   r   r   r   r]   c                   T   e Zd ZU  ej        ej                  Zeed<   dZ	e
ed<   dZe
ed<   dZeed<   dZeed<   dZeed<   dZeed	<   dZeed
<   dZe
ed<   dZeed<   dZe
ed<    ej        e          Zeed<   dZeed<   dZe
ed<    ej        e          Zeed<   dZeed<   dS )CmfLicense._LicCacheData)default_factory	timestampNmodeadmin_group_idlicenseslicense_groups_idsproductsactive_productsproduct2licensecompat_warncompat_lockactivation_warnactivation_productsactivation_days_leftexpired_warnexpired_productsexpired_days_left)rI   rQ   rR   dataclassesfieldtimer  float__annotations__r  rv   r  r  listr  setr  r  r	  dictr
  r  boolr  r  r  ru   r  r  r  rT   r7   r5   _LicCacheDatar     sI        ,;,TYGGG	5GGGc""""$"&C&&&##### $$$$S T   ####$5K$5d$K$K$KTKKK$(c((( c   !2!24!H!H!H$HHH!%3%%%%%r7   r  CmfLicense:changed)channelc                  8    t                                            d S r/   )r   _clear_cache)_kwargss    r5   on_license_changedzCmfLicense.on_license_changed%  s     	!!!!!r7   N
_lic_cachec                     d t           _        d S r/   )r   r"  r   s    r5   r  zCmfLicense._clear_cache-  s     !%
r7   c                     t           j                            d          dk    o2t           j                            d          dk    ot          j        dk    S )N	containerlxcEVA_DEPLOY_TYPEz	cloud-lxcz.evateam.ru)osenvirongetconfigAUTH_SESSION_COOKIE_DOMAINr$  s    r5   _check_is_cloudzCmfLicense._check_is_cloud2  sL    z~~k**e3 C
011[@C1]B	Cr7   c                 j   | j         r+t          j                    | j         j        dz   k     r| j         S |                                 }| j         r| j         j        n/t          t          j                                        j	                  |_        | 
                    g d          |_        d |j        D             |_        d}d |j        D             |_        d|j        v r|D ]}|j        d         |j        |<   d |j        D             |_        d|j        v r|j                            |           d	 |j        D             |_        d|j        v r|j                            |           t"          j                                        }|j        D ]}|j        
|j        |z
  }d }|j        d
k    r|j        dk    rd}n|j        dk     rd}n|j        dk    rd}|r`|j                            |j                   |dk    s|j        s||_        |j        t9          |j        |j                  n|j        |_        |j        D ]V}|j        
|j                            |j                   |j        t9          |j        |j                  n|j        |_        W|j        |j        dk     rd|_        n!|j        |j        dk     rd|_        nd |_        |                                  }t          j!        "                    g dd           }	|rd|_#        n|	rd|_#        nd|_#        t"          j                                        }|| j$        k    rd |_%        d|_&        nB|| j'        k    rd|_%        d|_&        n(|| j(        k    rd|_%        d|_&        nd |_%        d|_&        |tB          _         |S )Nr   )statusactivation_status
lic_statusr)   r+   lic_end_dater  user_groupsfieldsc                 0    h | ]}|j         D ]	}|j        
S rT   )r4  id)r@   lic	lic_groups      r5   	<setcomp>z*CmfLicense._check_cache.<locals>.<setcomp>K  sC     $
 $
 $
 _$
 $
  L$
 $
 $
 $
r7   )r   r   r   r   r   r   r   c                     i | ]
}|j         |S rT   r)   r@   r9  s     r5   
<dictcomp>z+CmfLicense._check_cache.<locals>.<dictcomp>S  s     P P P## P P Pr7   r   c                 2    h | ]}|j         d k    |j        S )active)r0  r)   r>  s     r5   r;  z*CmfLicense._check_cache.<locals>.<setcomp>X  s'     e e eScj\dNdNdNdNdNdr7   c                     h | ]	}|j         
S rT   r=  r>  s     r5   r;  z*CmfLicense._check_cache.<locals>.<setcomp>\  s    DDDc#/DDDr7   r   r   userr      adminr]   rW   )codeLIKEz%eva%T)filterinclude_deleteddisabledfullcompatF))r"  r  r  r  r  rv   modelsCmfPersonGroupadmin_groupr8  slistr  r  r	  r  updater  rl   rm   rn   r3  r+   rZ   r  appendr)   r  r  minr  r  r  r.  r   countr  
_LOCK_DATEr
  r  _USER_WARN_DATE_ADMIN_WARN_DATE)
r   cacheeco_productsproductrn   r9  	time_leftr  is_cloudis_news
             r5   _check_cachezCmfLicense._check_cache8  sD    > 	"dikkCN,Dq,HHH>!!!## ~ Os~<<#&v'<'H'H'J'J'M#N#N 	  +C +C +C D D$
 $
~$
 $
 $
  n P P P P Pu,,,' Q Q161Fx1P%g.. e eEN e e eu,,,!((666DDU^DDDu~%%N!!,/// ##%%> 	O 	OC',/,<u,DIL|v%%>Q&&#)L>A%%#)LL^r))#*L O&--co>>>6))1C))5E&.: +.e.Ey~*V*V*V@I ' > 	X 	XC'/%,,S_===-9 *-U-GIa)b)b)b?B?W &&%1e6PSU6U6U$*E!!'38RUW8W8W$+E!!$(E! &&((&,,4M4M4M_c,ddd  	*#EJJ 	*EJJ "EJM''))Es~%%$(!$(!!,,,$*!$)!!---$+!$)!!$(!$)!( !&
r7   c                     dS NTrT   r$  s    r5   license_ui_accesszCmfLicense.license_ui_access  s	     tr7   c                 d   t           j        j        sd S |                                 }|j        dk    rd S d}|j        dk    r`|j        sY|j        t           j        v rFt          j	        j
                            dt           j        j         d|d          rdt           _        |j        dk    r|j        sd	}|j        d
k    r|j        t           j        v rd}|j        dk    rd}|rSt          j	        j
                            dt           j        j         d|d          rt          d| j        dd           d	}|j        d
k    r|j        t           j        v rd}|j        dk    rd}|rmt          j	        j
                            dt           j        j         d|d          r3t          dd                    |j                   d|j         d           d	}|j        d
k    r|j        t           j        v rd}|j        dk    rd}|rt          j	        j
                            dt           j        j         d|d          ro|j        dk     r-t          dd                    |j                   d           d S t          dd                    |j                   d|j         d           d S d S d S )NrJ  Q rK  z+CmfLicenseUser.license_api_notify__lic_req_1TexnxrL  FrE  rC  z*CmfLicenseUser.license_api_notify__no_lic_uE   Требуется установить лицензию. После %d.%m.%Yu{    функционал продукта будет ограничен. Обратитесь к Администратору.z'CmfLicenseUser.license_api_notify__act_uG   До окончания срока активации лицензий r9   u    осталось u@    дней. Обратитесь к Администратору.z'CmfLicenseUser.license_api_notify__exp_r   u+   Срок действия лицензий u    завершён. Пожалуйста, обратитесь к Администратору для продления лицензии.u4   До окончания срока лицензий )gcurrent_user
user_localr^  r  r  r  current_person__member_ofAPPREDIS_DBredisr  r8  api_license_requiredr
  	cmf_alertrU  r  rG   r  r  r  r  r  )r   rX  notify_periodwarns       r5   license_api_notifyzCmfLicense.license_api_notify  s    ~( 	F  "":##F " :> .,0KKK*..YanFWYY[^(T / 3 3 L *.& :!!> S$//E4HALg4g4gD$..D SCL.22XQ^EVXXZ](T 3 3 3 S R'*~  FR R RS S S  G++0DHc0c0cD F**D 	CCL&**M!.:KMMsWdim + o o 	CBZ^ZcZcdid}Z~Z~ B B%*%?B B BC C C
 ((U-AQE`-`-`D''D 		DCL&**M!.:KMMsWdim + o o 		D&**O$))ELbBcBc O O OP P P P P C499UZUkKlKl C C).)@C C CD D D D D		D 		D 		D 		Dr7   rC  models.CmfPersonc                     |t           j        }| j                                        D ]}t	          ||          r dS d S r`  )ri  rj  PERSON_LIC_FIELDSvaluesr>   )r   rC  	lic_fields      r5   	is_editorzCmfLicense.is_editor  sT    <>D.5577 	 	ItY'' tt	 	r7   c                    |j         dvrd S t                              dd|d|j        d|j        d|j        d|j        d|j                    |                                 }d	}	 t          j
        s|j        rd
}nt          j        j        sd}nt          j        dk    rd}n|j        dk    rd}n|j        dk    r+|j        j                                        | j        k     rd}nkt'          |t(          j                  rb|j        rW|j        dk    r|                     d           n6|j        dk    r|                     d           n|                     d           d}nt'          |t(          j                  re	 |j        }|s@|j        r9t2                              |j                  j        }|rt7          d| d           t'          |j        j        t(          j                  sd}n|dk    ri|                     d           |j        d         }|j        dk    r9t          j        j        |j        j         k    rt7          d|j!         dd           d}n|                     d           d}n# tD          $ r_ d|j#        vr | $                                s |j        r3|%                    dd|j        gd d|j        gg d!g"          d#k    r d$}nd}Y nsw xY wt'          |t(          j&                  r|                     d           d}n<t'          |t(          j'                  r	 |                     d           d}n# tD          $ r |j        st|j(        rm|j        rc|%                    d%d|j(        gg d!g"          }|j(        t          j        j        k    r	|d&k    rd'}nh| $                                r	|d(k    rd)}nK d}nGd|j#        v s	d|j#        v r4|j        r*|%                    dd|j        gg d!g"          d(k    r d)}nd}n Y n:w xY wt'          |tR                    rd*}ntU          d+tW          |          |          t                              dd|d,|            d S # tD          $ r}|j,        d-         }tZ          j        .                                }	|j        dk    r|	| j/        k     rd.}
|	| j0        k    r|j1        t          j2        v rd}
|	| j3        k    rd}
|
rt2          j4        j5        6                    d/| d0t          j        j         d1d2d3          r{||j#        vrt7          d4| d5| j/        d6d7           nU||j7        vrt7          d8| d9| j/        d6d7           n/t7          d:| d5tq          | j/        | j9                  d6d7           t          :                    dd|d;|           n|j        dk    r||j7        v r|	| j9        k     r{t2          j4        j5        6                    d/| d0t          j        j         d1d2d3          rt7          d:| d5| j9        d6d7           t          :                    dd|d;|           n(t          :                    dd|d<|            Y d }~d S Y d }~d S d }~wtv          $ r'}t          :                    dd|d=|             d }~ww xY w)>N)
CmfProjectCmfListCmfTaskCmfDocument%szcheck_license(obj=z): obj.is_new=z, obj.system=z, obj.parent=z, obj.project_id=z, project_logic_prefix=Unknownsystempublicsd_apirJ  rL  legacyzproject.servicedeskr   zproject.wikir   r   OKu   DEV: ошибка! У u;    не рассчиталось поле parent_logic_prefixznot project taskr   uw   Объект доступен только для чтения. В рамках бесплатной лицензии "u`   " редактирование разрешено только Владельцу проектаTabort
project_idr<   parent)r  r<   FrH  r_   z	Allow 100	parent_idr   zAllow 5   zAllow 20otheruP   Неверный тип объекта для контроля лицензий.z): result=Success, reason r   Fz%CmfLicenseUser.check_license__compat__rd  rc  re  uE   Не установлена лицензия для продукта u   . После rh  um   г. функционал будет ограничен. Обратитесь к администратору.u)   Лицензии для продукта u!    не активна. После uF   Вам не выделена лицензия для продукта z):  result=Warning, product=z):  result=Fail, product=z):  result=Fail-Abort, error: )<
class_namelogginginfor]  r  r  r  parent_logic_prefixr^  ri  is_system_contextrj  rk  	api_scoper  cmf_created_atvaluerm   _NO_LICENSE_DATEr   rM  r|  logic_prefixcheck_product_licenser~  rm  get_cache_projectrq  r	  r+   r8  projectcmf_owner_idnameCmfLicenseErrorr  rz  rT  r}  r  r  r   	TypeErrortypeargsrl   rn   rU  rW  r  rl  rV  rn  ro  r  r  max_UNLIM_DATEwarningCmfAbortError)r   objrX  reasonr  license_	obj_counterZ  rn   rs  s              r5   check_licensezCmfLicense.check_license%  sL	    >!TTTF?S ? ?cj ? ?SZ ? ?CJ ? ?SVSa ? ?%(%<? ?	@ 	@ 	@   ""s	 " }Dcj }D!^. zD! ((!z))# x''C,>,D,I,I,K,KcNb,b,b!C!233 kD: @'+@@@112BCCCC)^;;11)<<<<11,???C00 aD1&*-*A'. A3> A.1.C.CCN.S.S.`+. A%&s&&&  A  A  A%cj&68IJJ &!3,0EEE112BCCC#(#89I#J $,661>;LPSP[Ph;h;h%!C[c[h!C !C !C KOP P P P "&11,???!%& & & & !66 ==?? z 
&99%13$G%-sCN$C$:$:$:(< % = = @C	C C
 "!, "&1&4 C00 ,D)),777C!344 (D!--i888!FF&   
 > cm : *(+		;S]:[]s]s]s9t	(u(uI"}0AAAiSTnn)2!$ &Y"__)3 % &*FF &77;Ku~;];]: *"yy,S^1TVlVlVl0mynnqsss %%/FF &*FF =@ C11 D    rtxy|t}t}  @C  D  D  DLLXXXPVXXYYYYY +	 +	 +	fQiGM''))EzX%%%#.*@*@C000U5IQMh5h5hDC///D WCL.22]]]!.J[]]_b$ 3 / / W en44!Vdk V V+.>{V V VW W W W !(===!V V V+.>{V V VW W W W
 "Vel V V+.s~s+O+O  RV V VW W W &[s&[&[QX&[&[\\\\ x''Gu7L,L,LQVY\YhQhQh<%))]]]!.J[]]_b$ * / / S Rah R R'*xR R RS S S &[s&[&[QX&[&[\\\\&Xs&X&Xg&X&XYYY ]\\\\\ ]\\\\\
  	 	 	OOD"Z3"Z"ZWX"Z"Z[[[	ss   )DQ< C6I> <Q< >A%K'#Q< &K''AQ< 8M Q< CP Q< P  AQ< <[H
Z[*"[[Tc                    fd}|                                  }|j        vr |t                    S |j        vrV|j                 }|j        dk    r |t                    S |j        dk    r |t                    S  |t                    S t          j                                      }t          t          j        |          s |t                     S t"                              dd d           dS )Nc                 Z    t                               dd d|  d           r | | dS )Nr  check_product_license(z
): False (rE   F)r  r  )	error_cls
error_argsrZ  raise_errors     r5   return_errorz6CmfLicense.check_product_license.<locals>.return_error  sE    OOD"Z7"Z"Zi"Z"Z"Z[[[ -i,,5r7   rA  r  r  z): TrueT)r^  r  CmfLicenseAbsentErrorr  r	  r2  CmfLicenseExpiredErrorr1  CmfLicenseNotActivatedErrorCmfLicenseNotActiveErrorr   rw  r+  r>   ri  rj  CmfLicenseUserAbsentErrorr  r  )r   rZ  r  r  rX  
simple_licry  s    ``    r5   r  z CmfLicense.check_product_license  s(   	 	 	 	 	 	   ""%.((< 5w???%///.w7J$00#|$:GDDD+x77#|$?III< 8'BBB044W==	q~y11 	D< 97CCCTDGDDDEEEtr7   c                    |                                   t          j        d          }d}|                     |          }t          j                                        }|d                             d          }|r8t          j                            |          }t          d||z
  j	                  n|j	        fddD             }d }d }	t          j                            g d	
          D ]k}
|
j        dk    r|
j        }n|
j        }	|
j        dk    r!t!          |          D ]}||
j        k    r||= nd|v r|d= |
j        dk    r|
j        |v r||
j        = l||p|	dS )NrD  rY   ="  r   deadliner   c                     i | ]}|S rT   rT   )r@   rZ  demo_days_lefts     r5   r?  z/CmfLicense.new_license_info.<locals>.<dictcomp>  s1       ^  r7   )r   r   r   r   r   r   )r2  r)   r+   lic_org_namer5  r   rA  )demo_availabledemo_org_name)_check_adminrl   rq   _CmfLicense__lic_st_getrm   rn   r+  fromisoformatr  rZ   rM  r   rP  r+   r  r)   r  r2  )r   demo_periodqstatern   deadline_strr  demo_productsr  org_namer9  del_productr  s               @r5   r   zCmfLicense.new_license_info	  s    	 (b111  ####%%V}((44 	.}22<@@H X%5$;<<NN(-N   e   $**2k2k2k*ll 	3 	3C|v%% # 0+(**#'#6#6 7 7K"co55)+67 },,%h/~))co.N.N!#/2 ,*6h
 
 	
r7   u8   (\b(ао|ооо|зао|оао|ип)\b)|([^a-zа-я0-9]+)c           	         |                                   t          |t                    r|t          j        v st          |          | j                            d|pd                                          }t          j
        |                                                                          }t                              |dd          dz  }|dk     r|dz  }t          ||dt          j                                        t          j        d	          z   d
d          }|                     |                                |          S )N littleFsignedi i rW   rD  rY   r   r%   )r'   r)   r(   r*   r+   r-   )r  )r  r   rv   r	   rt   rs   _org_name_replace_resublowerr   sha1r   digestru   
from_bytesrl   rm   rn   rq   r   r   )r   rZ  r  r   org_name_strorg_name_hashr'   r1   s           r5   r   zCmfLicense.apply_demo:  s/   '3'' 	&Gv7K,K,KW%%% /33BR8N8N8P8PQQ  \%8%8%:%:;;BBDDnn]HUnKKkY##:%K#0C0C0E0EHZ`bHcHcHc0c	/ / /
  1 1HEEEr7   c                     t           j        t           j        k    rdS |                                 }|j        t           j        v rdS t          d          )NTud   Действия с лицензиями доступны только администратору.)ri  rj  system_userr^  r  rl  CmfPermissionError)r   rX  s     r5   r  zCmfLicense._check_adminQ  sZ     >Q]**4  ""1#>>>4   "H  I  I  	Ir7   c                    |                                   |                     |          }|rt          d|            |}	 t                              |d          }n(# t          j        $ r t          d| d            w xY w|j        dk    r*|                     g d          rt          d	d           n)|                     g d
          rt          dd           d }|j        dk    rt          j
        d          }d}|                     |          }	t          j                                        }
|	d                             d          s|
                                |	d         d<   |	d                             d          s |
|z                                   |	d         d<   t          j                            |	d         d                   }|
|k    rt          dd           |j        dk    rt%          |d          ||
z
  j        }|	d         d                             t          j	                                                                        |d           |                     ||	           ||_        d|_        |j        dk    rt          j        ddd          }d}n|j        }|                    d          }|t          j                                        k     rt          d|ddd           |                     dd|j        gd g!          }|r|j        |j        k    r"t          d"|j         d#|j         d$d           |                                }t8                                          5  |                                 d d d            n# 1 swxY w Y   n
 |             }|j        |_        |j        |_        |j        |_        |j        |_        |j        |_        |j        rtA          |j                  nd%|_!        |ptA          |j"                  |_#        ||_$        ||_%        |j        |_        ||_&        t8                                          5  |'                                 d d d            n# 1 swxY w Y   |j        dk    rt          d&| d'           nt          d(           |j        rtP          j)                            d)d*|j*        gg d+g          }||j        k    r| +                                }d,,                    d- |j*        D                       }|j-        d.k    rWt          j                                        | j.        k     r0t          d/| d0| d1|j         d2|j         d3| j.        dd4           n&t          d/| d0| d1|j         d2|j         d5	           | /                    |j                   tA          |j0                  S )6Nue   Ваш регистрационный номер преобразован в новый формат T)r   u9   Некорректный ключ регистрации r  r   )r)   z!=r   r  u   Для активации лицензии EvaEco. Вам нужно предварительно удалить лицензии на другие продукты.)r)   r<   r   u  У вас уже есть лицензии EvaEco. Её можно заменить только лицензией на EvaEco, либо предварительно удалить лицензию EvaEco для активации другого продукта.r   rD  rY   r  registerr  u+   Срок Демо-периода истёкr$   r   log)rl   r1   rW   i  r
   u   Бессрочнаяrh  u%   Истёк срок лицензии(u5   ). Пожалуйста, получите новую.r)   r<   z***rH  r6  uZ   Количество пользователей существующей лицензии(uI   ), превышает ограничение новой лицензии(u   ). Нужно уменьшить количество пользователей лицензии, до активации новой.u   Не ограниченоuo   Демо версия успешно активирована. Срок действия демо версии u
    дней.uJ   Регистрационный номер успешно применён.rg_member_ofINrk  r<   Tr9   c              3   ,   K   | ]}d |j          d V  dS )"N)r  )r@   groups     r5   rB   z*CmfLicense.apply_regnum.<locals>.<genexpr>  s0      '_'_e(9EJ(9(9(9'_'_'_'_'_'_r7   rL  u
   У Вас u.    пользователей в группах u    лицензии "uH   ". Что превышает ограничение лицензии в u    пользователей. Часть пользователей смогут использовать функционал продукта только до u   г. Пожалуйста, измените количество пользователей в соответствии с текущей лицензией до указанной даты.u    пользователей. Пожалуйста, измените количество пользователей в соответствии с текущей лицензией.)1r  _compat_regnumrq  r	   r   rU   r)   rT  r+   rl   rq   r  rm   rn   r+  	isoformatr  r,   rs   rZ   rR  now_CmfLicense__lic_st_setr*   r(   rr   
user_countclonecmfutildisable_acldeleter-   rv   lic_user_limit_strr'   r  
lic_regnumr3  lic_end_date_strsaverM  	CmfPersonr4  r^  rG   r  r  _new_license_menu_fixr8  )r   r1   r  r   
new_regnumparsed_regnumr  r  r  r  rn   r  r3  r  old_licensenew_licenseperson_countrX  
groups_strs                      r5   r   zCmfLicense.apply_regnum[  s   ''//
 	   K  I  K  K  L  L  LF	"LL$L??MM  	 	 	ZRXZZbfgggg	
 $00yy ? ? ?y@@   }        yy > > >y??  ` 	        !V++","555KA$$Q''EM''))E=$$Z00 >,1OO,=,=fj)=$$Z00 N-2[-@,K,K,M,Mfj)}225=3LMMH  GtTTTT';66 ,,,&.4N&M% ''X5F5J5J5L5L5V5V5X5Xdj(k(klllQ&&&-5M*+-M(#{22#=q!44L5(9L+44Z@@(---////  Kl  K  K  K  K  SW  X  X  X  X
 ggmS-:S%T^c]dgee 	 %(DDD\q|  rH \ \^k^z\ \ \ dhi i i i
 &++--K$$&& % %""$$$% % % % % % % % % % % % % % % #%%K"/";,5!.!9!.!9%2%A"1>1MnC,---Sn 	&#+#Ms=3L/M/M !'#/ '4'E$'7$  "" 	 		 	 	 	 	 	 	 	 	 	 	 	 	 	 	 6))  c  IW  c  c  c  d  d  d  dbccc% 	_!+11{'>?))):+1 , ,L k888((**!YY'_'_{G^'_'_'_``
:))hm.A.A.C.Cco.U.U\  .8 MXMd ala{  "%>	  @ @ @ @ ^\ ^ ^.8^ ^MXMd^ ^ala{^ ^ ^_ _ _ 	!!+"9:::;>"""s0   A %BN&&N*-N*/RRRc                 h    |                      d          dk    r|                     |           d S d S )NT)rI  r
   )rT  landing_page2license)r   rF  s     r5   r  z CmfLicense._new_license_menu_fix  s=    99T9**a//$$T***** 0/r7   c                    t           j                            dg          }dddd}|                    ||          }|dk    r+d|_        d|_        d|_        d|_        d|_        d|_        nw|dk    r2d|_        d|_	        d|_
        d|_        d|_        d|_        d|_        n?d|_        d|_        d|_	        d|_        d|_        d|_        d|_        d|_
        d|_        d|_        d|_        d|_        t                                          5  |                                 d d d            n# 1 swxY w Y   t%          |           d S )	Nr   r5  r   r   r   )eva24evawiki
evaprojectTF)rM  CmfGlobalSettingsr+  default_show_deskdefault_show_projectdefault_show_kanbandefault_show_filterdefault_show_dashboarddefault_show_planningdefault_show_wikidefault_show_analyticdefault_show_my_companydefault_show_servicedeskdefault_show_helpdeskdefault_show_mailr  r  r  onboarding_tuning)r   rF  global_settingscode_mappings       r5   r  zCmfLicense.landing_page2license  s    266se6DD "*i|\\d++<04O-37O026O/26O/59O248O11Y04O-04O-48O16:O327O/27O/5:O22 15O-37O004O-26O/26O/59O248O148O16:O338005-,1)   "" 	# 	#  """	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	#. 	$s   D55D9<D9c                 p    t           j                            dg          }|                                 d S )Nr   r5  )rM  r  r+  r  )r   r  s     r5   patch_global_settingsz CmfLicense.patch_global_settings"  s:     !266se6DDR 	r7   c                 ~    | j         t          j        j                                        k     r	d| _        d S d| _        d S )NexpiredrA  )r3  cmfr6  CmfDater  r2  r4   s    r5   _calc_lic_statuszCmfLicense._calc_lic_statusq  s7    sz1557777'DOOO&DOOOr7   c                 z   | j         sd| _         | j        j        s| j        j        s| j        j        rd| _         | j        dk    r	d| _         d S | j        r| j        r| j        r| j        j                                        | _        	 t          	                    | j        j        | j        j        | j        j                  }t          d           d| _         d S # t          j        t          j        f$ r<}| j        j        p| j        j        }t          d|j         |           Y d }~d S d }~ww xY wd S d S d S d S )N
not-activer   rA  )r   r1   r   u9   Лицензия успешно активирована.u.   Неверный ключ активации: r  )r1  r  
is_changedr   r   r+   r  stripr   r   rq  rU   r   r  )r4   _activation_coder  r  s       r5   _calc_activation_statusz"CmfLicense._calc_activation_statusx  s   % 	2%1D"?% 	6)=)H 	6DL`Lk 	6%1D"}&& *2&&& 6T%9 6d>R 6'+';'A'G'G'I'I$
6'5';';(,(<(B#4dFZF` (< (b (b$ Z[[[ .6D*** '1>3UV f f f 0;Yt?YEWqvWW_deeeeeeeeeef#	6 	66 6 6 6 6 6s   A
C D261D--D2c                    d}|                      |          }t          j                                        }| j        dk    r<| j        |d         v r$|d         | j        = |                     ||           d | _        d S | j        |d         vrt|d         r	 |t          j        d          z   }|	                                |	                                d|d         | j        j
        <   |                     ||           n6t          j                            |d         | j                 d                   }||k    r
||z
  j        nd	| _        d S )
Nr  rA  
activation	corrupted<   rY   )r  r  r  r   )r  rl   rm   rn   r1  r)   r  r  rq   r  r  r  rZ   )r4   r  r  rn   r  s        r5   _calc_activation_days_leftz%CmfLicense._calc_activation_days_left  s]   !!!$$##%%!X--5#666,'(89!!!U+++(,D%%%u\':::%  8#52#>#>#>> ( 2 2 4 4%//BSBS?U ?Ul#D$4$:;!!!U++++#=66u\7J4K[7\]g7hiiCKeCSCSE)9(?(?YZD%%%r7   c                    | j         dk    rd}nM| j        dk    r@t          j                                        | j        t          j        d          z   k     rd}nd}| j        dk    p| j        }|r|r	d| _	        d S d| _	        d S )NrA  Tr   r   rY   Freadonly)
r2  r+   rl   rm   rn   r3  rq   r1  r  r0  )r4   not_expiredactivation_oks      r5   _calc_statuszCmfLicense._calc_status  s    ?h&&KK]f$$)<)<)>)>ARU]UgmoUpUpUpAp)p)pKKK.(:Wd>W 	%= 	%"DKKK$DKKKr7   c           	      &   | j         j        s2| j        j        s&| j        j        s| j        j        s| j        j        sd S | j         sd | _        d | _        d S |                     g d           g }dddddddd	d
}ddddddddd}ddd}dddd}|	                    || j                             | j        r|	                    d| j                    n|	                    d           | j         dk    s| j        dk    r |	                    || j                            |	                    || j                            | j        dk    r |	                    || j                            d 
                    |          | _        | j        | _        d S )!N)r)   r,   r-   r+   r(   zEVA-ECOzEVA-PROJECTzEVA-WIKIzEVA-SERVICEDESKzEVA-GITzEVA-TESTzEVA-CICDzEVA-RMS)r   r   r   r   r   r   r   r   STANDBIZPREMENTDEMOFREEEDUSTART)r   r   r   r   r   r   r    r!   CLBOX)r&   r%   rd  120)r"   r#   r$   AUNLIMr   r    r$   rk   )r)   r  r,   r(   r+   r-   lic_coder  load_fieldsrR  rG   )r4   partsrt   rw   ry   rx   s         r5   _calc_lic_codezCmfLicense._calc_lic_code  s   '	)	 "-	 }'		
 )	 F 	 DMDIFbbbccc'!/!"	
 	
  	
 	

 
 

 
 
 	]4#34555  	"LL2T0223333LL!!!x''4=K+G+G LLDM2333\$/2333?k))LLdo6777M			r7   c                    | j         r2| j        j        s&| j        j        s| j        j        s| j        j        sd S | j        r| j        r| j        s	d | _         d S d}d}| j        dk    rd}d}n| j        dk    rd}n
| j         d}| j        rd	| j         d
}d}nd}d}| j        dk    rd}nd}d| d| d| | d| j         d| | d| _         d S )NuG   Система управления предприятием EvaProjectr  r    zEducation Editionu1    для образовательных целейr   zEcoSystem Editionz Editionu    на u    пользователейuT   , без ограничений по количеству пользователейr$   u    бессрочно,uH   Право использования программы для ЭВМ "uI   " на условиях неисключительной лицензииz ( rE   uE   , свидетельство 2023662166, номер 18285 в ЕРРП)textr)   r  r(   r,   r8  r+   )r4   	prog_nameedu_txtproduct_name
user_limit
unlim_textperpetual_texts          r5   
_calc_textzCmfLicense._calc_text  s   9 	 +	&1	 ?-	 =+		
 F  	T_ 	 	DIF ^	=K''.LIGG)).LL".888L 	pR$"5RRRJJJJoJ?k))3NNNXYb X XX XX!+X X.2mX X>LXNXX X X 				r7   c                       e Zd ZdZdS )CmfLicense.StateErroru   Ошибка состоянияNrP   rT   r7   r5   
StateErrorrG     s        ----r7   rH  c                    ddl m} |                    | d d         |j        | dd                    }t	          |t
                    r|                    |          S t	          |t
                    r|                    |          S d S )Nr   )AESr   i)Crypto.CipherrJ  newMODE_CFBr   bytesencryptdecrypt)kiorJ  crypts        r5   	__st_convzCmfLicense.__st_conv#  s    %%%%%%#2#ag66a 	$==###5!! 	$==###	$ 	$r7   c                    |dk    rd S t           j                            ddgd          }t           j                            |j                  }|j        r|j        rt           j                            ddd          j        }t          j	        | | |j         
                                                                          }	 t          j        |j        j        d	          }n## t          $ r |                     d
          w xY w|                     ||          }	 t$                              |          }|S # t          $ r |                     d          w xY wd}	|j        d}	|	i d d g ddS )Nr  cmf_ver_cookie
cmf_cookieTr6  TECHCOM_nocachegs_idanonymous@evateam.rurF  rI  rZ  validater
   rS  r   F)r  r  r  )r!  r   r   )rM  r  r+  fix_gsidr8  rW  rX  r  r   r  r   r  base64	b64decoder  rs   rH  _CmfLicense__st_convjsonloads)
r   r   gsr\  p_idkey	encrypted	decrypteddatar!  s
             r5   __lic_st_getzCmfLicense.__lic_st_get,  s   99F%))2BL1Qcg)hh(111>> 	( 	(#''-CUYko'ppsD,%BBr/@BBIIKKLLSSUUC(",R]-@4PPP		 ( ( (nnQ'''(cY77I(zz),, ( ( (nnQ'''(	( I" !  
 
 	
s    C- - D(E  E$c                 r   |dk    rd S t           j                            ddgd          }t           j                            |j                  }||j        k    r#t           j                            ddgd          }|j        r
|j        dz   nd|_        t           j                            ddd	          j        }t          j        | | |j         	                                          
                                }t                              |          	                                }|                     ||
          }t          j        |                                          |_        t$                                          5  |                    d           d d d            d S # 1 swxY w Y   d S )Nr  rW  rX  TrY  r[  r
   r]  r^  )rR  	only_data)rM  r  r+  rb  r8  rW  r  r   r  r   r  rf  dumpsre  rc  	b64encodedecoderX  r  r  r  )	r   r   rm  rh  r\  ri  rj  data_strrk  s	            r5   __lic_st_setzCmfLicense.__lic_st_setS  s   99F%))2BL1Qcg)hh(111>>BE>>)--6F5Ugk-llB575FMB-11A##)?QUgk#llole>T>2+<>>EEGGHHOOQQ::d##**,,MM#M22	(33::<<  "" 	$ 	$GGdG###	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$s   F,,F03F0c           	      X   d }t           j                                        }t          j         | }t          j        |                                                                          } ||dd                   dd ||dd                   dd ||dd                   d}|S )Nc                 <    t                               | dd          S )Nr  Fr  )ru   r  )ds    r5   	bytes2intz1CmfLicense.get_activation_hwid.<locals>.bytes2inti  s    >>!Xe><<<r7   r   r   05drk   r   r   )	rM  r  rb  r,  r-  r   r  r   r  )r   rz  r\  r   
hash_byteshwids         r5   r   zCmfLicense.get_activation_hwide  s    	= 	= 	= (113309%99\!((**--4466
)JqsO,,ttt99Z!_3M3MtttT]T]^hijklil^mTnTntttr7   c                     | j         r| j        t          j        k    r,|                                 | _         t          j        | _        d S d S r/   )r   
lic_domainr,  r-  r   r  s    r5   _calc_activation_hwidz CmfLicense._calc_activation_hwidr  sH    # 	@t&:['['[#'#;#;#=#=D $?DOOO (\'[r7   c                 N    t                                                      g dz   S )N)r2  r1  r0  r  r8  r3  r4  r   r>  r)   r  r(   r,   r  r+   r  r   )supersave_preload_fields)r4   rH   s    r5   r  zCmfLicense.save_preload_fieldsw  s4    ww**,, 0q 0q 0q q 	qr7   c                    | j         j        rd | _        d| _        |                                  |                                  |                                  |                                  |                                  | 	                                 | 
                                 | j        rb| j        s6| j                            t          j                                                   | j        s| j                                        | _        | j        j        s| j        j        rt)          t          j        j                    t/                      j        |i |}| j        j        s| j        j        rt5          dd            |S )Nr  r  )r  r  r   r1  r;  rE  r  r  r  r#  r(  r]  r4  rR  rM  rN  
user_grouplic_start_dater  r(   schedule_deferred_jobr   recalc_users_countsr  r  r0  cmf_emit_server_event)r4   r  kwargsretrH   s       r5   r  zCmfLicense.save}  sy   ?% 	2#'D %1D"""$$$$$&&&''))); 	@# L ''(=(H(H(J(JKKK& @&*&9&=&=&?&?#& 	I$*=*H 	I!&"3"GHHHegglD+F++;! 	>T%5%@ 	>!"6=== 
r7   c                     g | _         t          t          j        j                    t                      j        di | t          dd            d S )Nr  rT   )r4  r  rM  r   r  r  r  r  )r4   r  rH   s     r5   r  zCmfLicense.delete  sR    f/CDDD     2D99999r7   z@dailyr   )	only_once
system_jobschedulepriorityc                     dt           j        fd} i }t          t                    }                    g d          D ]Rt          j                  |<   j        D ]/}|t          |j                           	                               0Sd|v }t          t                    }g }d}d}t           j                            g dg dgd	gj                                        |||z   gd
g          x}	rz|t          |	          z  }|	D ]t                      }
j        D ]3}|                    |j                  }|r|
                    |           4g }|rd|
v r[t'          fdj                                        D                       r|dxx         dz  cc<   |                    |
f           nt+          fdj                                        D                       s|                    j                                                   nd}j                                        D ]R\  }|
v r$t1          |          r|xx         dz  cc<   *d}-t1          |          r|                    |           S|r|                    |
f           |rt           j                            j                  |D ]}t5          |d           t6                              dd|rdn| d                                d            |              t           j                            g dg dgd	gj                                        |||z   gd
g          x}	zt=                       |                                D ]&\  |         _                                         't=                       fd}|D ]k\  }
d}t           j                            j        g j                                                  |
D ]|          |            rd}|r
 |              lt=                       dS )u   
        Запускаем при изменении лицензий и ежесуточно, для пересчёта статусов и актуализации счётчиков.
        r   c                  D     dz    dz  dk    rt                       d S d S )Nr
   r]   r   )
cmf_commit)bulk_commit_counts   r5   bulk_commitz3CmfLicense.recalc_users_counts.<locals>.bulk_commit  s3    " 2%** +*r7   )r  r4  r)   r0  r3  r(   r5  r   ra   r  )does_not_workr<   Fr  r  )rH  r6  sliceorder_byc              3   8   K   | ]}t          |          V  d S r/   r=   r@   ry  s_persons     r5   rB   z1CmfLicense.recalc_users_counts.<locals>.<genexpr>  s-      mm) < <mmmmmmr7   r
   c              3   8   K   | ]}t          |          V  d S r/   r=   r  s     r5   rB   z1CmfLicense.recalc_users_counts.<locals>.<genexpr>  s-      #q#qYGHi$@$@#q#q#q#q#q#qr7   FT)r8  recalc_users_counts(): %szClear Ecoz license on rp  c                     j                                       } | rt          |           rdS j        j        k     r҉xj        dz  c_                            d           t                              dd d dj         d	j                    | rt          | d           nOd
k    r.j         	                                D ]}t          |d           nt          dt          j                                       d           dS t                              ddj         dj         d            d S )NFr
   Trp  r  Add  license to , count /r   zInvalid productzLicense(z) user limit(z) exceeded on )rw  r+  r>   r  r(   r  r  r  setattrrx  rs   r   r)   )ry  
lic_field2r   licensepersonrZ  s     r5   take_licensez4CmfLicense.recalc_users_counts.<locals>.take_license   s   -11'::I  WVY77 u!G$:::""a'""t,,,/m7mmmm@RmmU\Ukmmo o o  _FIt4444((&)&;&B&B&D&D : :

D9999: %%6A]^^^d+++tLL+k7.kkW=Skkcikkm m m m mr7   )r8  r6  N) rM  r   r   r  r  rv   r)   r4  rF  addru   r  rP  rw  rx  r   r  r+  rQ  allrR  anyextenditemsr>   r8  r  r  r  r  r  r  )r  r  g2pr  is_ecolic_users_countsset_license_queuebulk_offset	bulk_sizeperson_slistperson_productss_groupgroup_productsclear_product_fieldsneed_licensery  r  takenr  r   r  r  rZ  r  s                     @@@@@@r5   r  zCmfLicense.recalc_users_counts  s    	 	 	 	 	 #xxooo   q q 	2 	2G'-..G 'HW , 2 2C
OO$((11112 X%&s++	 %.441113P3P3PQ&H)>)E)E)G)GH"K	$9:FVEW 5 Y Y Yl -	" 3|,,,K( '" '""%%%'4 ? ?G%(WWW\%:%:N% ?'..~>>>')$ N?22mmmmcNcNjNjNlNlmmmnn %,X666!;666$)00(O1LMMMM"#q#q#q#qRURgRnRnRpRp#q#q#qrr %$,33C4I4P4P4R4RSSSS#(L030E0K0K0M0M C C,)"o55&x;; 4 0 9 9 9Q > 9 9 9 9/3$Xy99 C077	BBB# N)00(O1LMMM' "#-11X[1AAF%9 : :		59999LL3`&!J6J``X^``b b b KK$K///KMMM[ %.441113P3P3PQ&H)>)E)E)G)GH"K	$9:FVEW 5 Y Y Yl -	"\ 	 !) 0 0 	 	GW!1'!:GLLNNNN	m 	m 	m 	m 	m 	m 	m 	m4 *; 	 	%HoE%))X[Ab3CXC_C_CaCaAb)ccF* ! !"7+<>> ! E r7   lic_evaprojectlic_evawikilic_evaservicedesk
lic_evagitlic_evatestlic_evacicd
lic_evarms)r   r   r   r   r   EvaCICDr   c                 F    |                                  }|j        |j        v S r/   )r^  r8  r  )r   r  rX  s      r5   is_license_groupzCmfLicense.is_license_group0  s#      ""x5333r7   c                      fd}                      dddd|j        ggg d          }|sd S                     dd	g j                                                   j        rj        rd S j        }|D ]j        d
k    rt          fd j                                        D                       rj
        j        k     r j                                        D ]}t          |d           xj
        dz  c_
                            d           t                              ddj         d dj
         dj                     |              j        j                 }t!          |          sj
        j        k     rot          |d           xj
        dz  c_
                            d           t                              ddj         d dj
         dj                     |             j        r|s                    d           t#          t$          j        j                   d S )Nc                  l   t           j        dk    r"t          dj         dj         dd                                           } dj         d}| j        d	k    r;t          j        	                                j
        k     rdj         d
j
        dd}t          dj         d| d           d S )NzCmfPerson.createu@   Невозможно создать учётную запись uK   . Превышен лимит пользователей лицензии "u   ". Необходимо расширить лицензию или ограничить количество пользователей с доступом к лицензии.Tr  u#   Для учётной записи uE    функционал продукта будет ограничен.rL  u2    функционал продукта после rh  u    будет ограничен.uI   Превышен лимит пользователей лицензии "z". u;    Необходимо расширить лицензию .)ri  
api_methodrq  loginr)   r^  r  rl   rm   rn   r  )rX  limit_date_infor   r  rC  s     r5   user_limit_alertz6CmfLicense.take_user_license.<locals>.user_limit_alert8  s=    |111FW[Wa F FahatF F F 	        $$&&E VDJ  V  V  VOzX%%=&&((3?::adj a a'*`a a a $ a\c\o a a#a a ab b b b br7   r4  EXISTSr8  r<   )r  r(   r)   r  rk  r  r   c              3   :   K   | ]}t          |           V  d S r/   r=   r@   ry  rC  s     r5   rB   z/CmfLicense.take_user_license.<locals>.<genexpr>Z  s0      eeGD)444eeeeeer7   Tr
   rp  ztake_user_license(): %sr  r  r  r  )r  r8  r9  rw  rx  rk  r  r  r)   r  r  r(   r  r  r  r  r>   r  rM  r   r  )r   rC  r  r  r  was_changedry  r  s   ``     @r5   take_user_licensezCmfLicense.take_user_license5  s(   	b 	b 	b 	b 	b 	b 	b. 88!8dC-BCBBB  D D  	F,Y#:O:V:V:X:XYZZZ 	$"4 	Fo 	+ 	+G"h..eeeecF[FbFbFdFdeeeff +)G,BBB),)>)E)E)G)G ; ;I#D)T::::**a/**t4445T7#6 T TD T T&-&8T T;B;QT TU U U U
 )(***1'2EF	tY// 
+)G,BBBi666**a/**t4445T7#6 T TD T T&-&8T T;B;QT TU U U U
 )(*** ? 	&; 	&III%%%f/CDDDDDr7   c                    |                      dddd|j        ggg d          }                    g | j                                                   j        }|D ]Q}|j        dk    rt          fd| j                                        D                       r|xj        d	z  c_        |	                    d
           | j                                        D ]}t          |d           t                              dd d|j         d|j                    | j        |j                 }t          |          rmt          |d           |xj        d	z  c_        |	                    d
           t                              dd|j         d d|j         d|j                    Sj        r|s	                    d
           t          t           j        j                   d S )Nr4  r  r8  r<   )r  r)   r(   r  r   c              3   8   K   | ]}t          |          V  d S r/   r=   r  s     r5   rB   z2CmfLicense.release_user_license.<locals>.<genexpr>  s-      aaYi00aaaaaar7   r
   Trp  Fzrelease_user_license(): %szRemove EvaEco license from r  r  Remove  license from )r  r8  r9  rw  rx  r  r)   r  r  r  r  r  r  r(   r>   r  rM  r   r  )r   rC  r  r  r  r  ry  s    `     r5   release_user_licensezCmfLicense.release_user_licensey  sa    88!8dC-BCBBB  D D 	:307799:;;;o 	Q 	QG"h..aaaa#BWB^B^B`B`aaabb s&&!+&&LL4L000%(%:%A%A%C%C 8 8	i7777LL4qdqqGDVqqY`Yoqqs s s  1'2EF	4++ QD)U333&&!+&&LL4L000LL4P'"5 P PT P P")"4P P7>7MP PQ Q Q ? 	&; 	&III%%%f/CDDDDDr7   c                 l                        g | j                                                   t          fd| j                                        D                       sd S |                     g d          }|sd S |D ]0}|j        dk    r|xj        dz  c_        |                                 | j                                        D ]}t          |d           t          
                    dd|j         d	 d
|j         d|j                    | j                            |j                  }t          |          rkt          |d           |xj        dz  c_        |                                 t          
                    dd|j         d	 d
|j         d|j                    2d S )Nc              3   8   K   | ]}t          |          V  d S r/   r=   r  s     r5   rB   z7CmfLicense.release_all_user_licenses.<locals>.<genexpr>  s-      ]]GD),,]]]]]]r7   )r4  r  r)   r5  r   r
   Fzrelease_all_user_licenses(): %sr  r  r  r  )r9  rw  rx  r  r  r)   r  r  r  r  r  r(   r+  r>   )r   rC  r  r  ry  s    `   r5   release_all_user_licensesz$CmfLicense.release_all_user_licenses  sA   
 	:307799:;;;]]]]c>S>Z>Z>\>\]]]^^ 	F88#O#O#O8PP 	F   	Q 	QG"h..""a'""!$!6!=!=!?!? 4 4ID)U33335Lg1 L L L L%0L L3:3IL LM M M M
  155g6IJJ	4++ QD)U333&&!+&&LLNNNLL9P'"5 P PT P P")"4P P7>7MP PQ Q Q!	Q 	Qr7   c                     d S r/   rT   )r   _argsr   s      r5   r   z!CmfLicense.public_list_hack_empty  s	     	r7   c                 X   d                     g d          }t          j        d                                                                          }t          j        |d          }|                     ||          }t          	                    |          }|
                    |          S )Nr  )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A+p6V7I=zRegMapEncKey__cvvnsdfjh4!4566Tr_  ra  )rG   r   r  r   r  rc  rd  re  rf  rg  r+  )r   r1   rmrj  reg_map_encryptedreg_map_binreg_maps          r5   r  zCmfLicense._compat_regnum  s    f WW K K K K KZ l:AACCDDKKMM",R$???mmC+<m==**[)){{6"""r7   r/   )rC  ru  r   )NN)FrI   rQ   rR   rS   r	   r   r   r   api_methodsremoverl   rm   rW  rV  rU  r  r  r  	dataclassr  r   on_server_eventr!  r"  r  r   r  r.  r^  ra  rt  rz  r  r  r   r   r   r  r   r  r   r  r  r  r  r  r#  r(  r;  rE  	ExceptionrH  re  r  r  r   r  r  r  r  cmf_deferred_jobr  rw  r  r  r  r  r   r  __classcell__)rH   s   @r5   r   r     s          F#N(4 8 8 8 K x    %x}T1a00#hmD!Q//OtQ**J$x}T1a00(-b!,,K& & & & & & & &$ _1222" " 32 \" !%J$$$% % [% C C [C
 ~ ~ [~@   [< BD BD [BDH     [ D D [DL    [8 ,
 ,
 [,
\ ::&abbF F F [F, I I [I }# }# }# [}#~ + + + [+ ?  ?  ?  [? B L L [L\' ' '6 6 68[ [ [*% % %"=" =" ="~%X %X %XN. . . . .Y . . . $ $ $ \$ $
 $
 [$
L $ $ [$" 
 
 [
@ @ @
q q q q q    B: : : : : STUUU| | VU \|@ ' .    4 4 [4 AE AE [AEF  E  E [ ED Q Q [QB   [ C# C# kC# C# C# C# C#r7   r   c                     | dk    rd S d S )Nr  rT   )license_codes    r5   r  r    s    y   ! r7   )rc  r  rl   r   r  r   collectionsr   typingr   cmf.includecommon.models.cmf_active_entityr   modules.settings.fieldsr   r	   r   r   r  rT   r7   r5   <module>r     sC            # # # # # #           ; ; ; ; ; ; / / / / / /c c c c c c c cL	{ { { { { { { {|S# S# S# S# S#' S# S# S#l6    r7   