
    Y~h                        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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)r
   r   r   r   r   r   r   r   r   r   r   r   r   r    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,   r0   r1   r2   s              (./modules/settings/models/cmf_license.py__init__zRegNum.__init__O   sR     &,(0)3*5-;*59I'/)3)3    c                 r     g d}d                      fd|D                       } j        j         d| dS )N)	r0   r&   r'   r(   r)   r*   r+   r,   r1   , c              3   b   K   | ])}t          |          | dt          |           V  *d S N=getattr.0paramr3   s     r4   	<genexpr>z"RegNum.__repr__.<locals>.<genexpr>i   X        g  g27WTSXEYEYEeu--wtU++--EeEeEeEe g  gr6   ()join	__class____name__r3   params
params_strs   `  r4   __repr__zRegNum.__repr__e   sw    @ @ @ YY  g  g  g  g;A g  g  g h h
.)99J9999r6   c                       e Zd ZdZdS )RegNum.ParseErroru=   Неверный формат кода регистрацииNrH   
__module____qualname____doc__ r6   r4   
ParseErrorrN   m   s        KKKKr6   rT   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_csr0   )r3   rm   rn   ro   yymmd1r'   d2
product_idd3d4	type_codeperiod_codedeploy_code	type_packd5cs_strd6s                     r4   generatezRegNum.generatep   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{r6   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   r0   s    r4   check_matchz!RegNum.parse.<locals>.check_match   s     IIf%%ELr6   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 )	Nra   r
   r_   r`   r]   r^   r[   r\   )rt   rT   )limitclsob_user_limitr0   s    r4   deob_user_limitz%RegNum.parse.<locals>.deob_user_limit   s    =!!D((nnVQ///3}---E t||-,+Lr6   c                      dk    rdz  } ndz  } t                    dz
  | z
  }|j        vr                    d|          j        |         S )N5r\   r`   rd   r   )rt   rs   rT   )contract_id_partproduct_coder   r&   
ob_productr2   r0   s     r4   deob_productz"RegNum.parse.<locals>.deob_product   so    S  #.#3  #.#5 z??T14DDL3#444nnVQ===$\22r6   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$   rh   ri      p   r   i  r   r   r   )rt   rv   rT   rw   rx   )deobr   r   r   r   r&   ob_typer0   s       r4   	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jr6   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 )
Nre     r^   i  rW   r   r   r
   rX   )rt   rT   rk   rl   rp   )rz   yyyymmr   ob_yymmr0   s      r4   	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Jr6   r   r
   r\   r   r   r   r   6r   r   r   r/   )_REGNUM_5_RErt   _REGNUM_6_RErT   ry   )r   r0   check_csr   r   r   r   r   r   csr1   r'   r(   r)   r*   r+   r,   r&   r   r   r   r   r   r2   s   ``               @@@@@@@r4   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r6   c                     t          j        |                                                                           }t	          j        |                                          }|ddd         }|S )N08dr   r   hashlibmd5encode	hexdigestzlibcrc32sr   r   r   s       r4   ry   zRegNum._calc_cs,  sS    k!((**%%//11
3::<<((^^AaC 	r6   )
NNNNNNNNNNT)rH   rP   rQ   recompiler   r   rs   rv   rw   rx   rt   ru   rk   rl   r5   rL   rr   rT   r   classmethodr   staticmethodry   rS   r6   r4   r	   r	      s       ::KLLL::STTL	9 	
< 	
8	
 	
 	
8 	
9 	
: 	
8 	1 	a 	! 	! 	!  	1!" 	A#$ 	!%M, ! 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   \  r6   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.   )r1   r0   r&   r'   r(   r)   r*   r+   r,   scs1scs2scs3scs4activation_code)r3   r&   r'   r(   r)   r*   r+   r,   r0   r1   r   r   r   r   r   s                  r4   r5   zActivationCode.__init__B  sq     )1%+*5-;*59I'/)3)3#'	#'	#'	#'	.=r6   c                 r     g d}d                      fd|D                       } j        j         d| dS )N)r   r   r   r   r   r0   r&   r'   r(   r)   r*   r+   r,   r1   r8   c              3   b   K   | ])}t          |          | dt          |           V  *d S r:   r<   r>   s     r4   rA   z*ActivationCode.__repr__.<locals>.<genexpr>e  rB   r6   rC   rD   rE   rI   s   `  r4   rL   zActivationCode.__repr__`  sw    @ @ @ YY  g  g  g  g;A g  g  g h h
.)99J9999r6   c                       e Zd ZdZdS )ActivationCode.ParseError9   Неверный формат кода активацииNrO   rS   r6   r4   rT   r   i          GGGGr6   rT   c                       e Zd ZdZdS )"ActivationCode.RegnumMismatchErrorr   NrO   rS   r6   r4   RegnumMismatchErrorr   l  r   r6   r   )r   	   r   r
   r   r   r      r   r   r   r\   rW   )r   r   r   r\   r   r   r         r   r   rW   r   r
   r   r   )rW   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   rh   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
   )rt   len_m13_m16_m19rr   range)r   
ob_int_valtableint_valresultbr   r&   s         r4   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Mr6   r   i  r   rW   )rn   ro   dayrX   r      )r0   r1   r   r   r   r   r   r&   r'   r(   r)   r*   r+   r,   )
CmfLicenseget_activation_hwid
isinstanceru   r	   r   _ACT_CODE_REr   rT   rt   r&   r   ry   r'   rs   r(   rk   rl   rp   r)   rv   r*   rw   r+   rx   r,   r0   )#r   r   r0   activation_hwidr   r   r   ob_product_monthsob_type_period_deployob_scs12ob_scs34r   r   r1   r   r'   product_monthsr   monthsr(   r)   type_period_deployr   r   r   r*   r+   r,   scs12r   r   scs34r   r   r&   s#   `                                 @r4   r   zActivationCode.parses  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r6   c                     t          j        |                                                                           }t	          j        |                                          }|ddd          }|S )Nrb   r   r   s       r4   ry   zActivationCode._calc_cs  sS    k!((**%%//11
3::<<((^^BCC 	r6   )NNNNNNNNNNNNNN)NNT)rH   rP   rQ   r   r   r   rt   ru   rk   rl   r5   rL   rr   rT   r   r   r   r   r   r   r   ry   rS   r6   r4   r   r   4  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   \  r6   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d             ZedDd            Z ed             Z!e"#                    d          Z$edEd            Z%ed             Z&edFd            Z'edFd            Z(edFd             Z)ed!             Z*d" Z+d# Z,d$ Z-d% Z.d& Z/d' Z0 G d( d)e1          Z2edEd*            Z3ed+             Z4ed,             Z5ed-             Z6d. Z7 fd/Z8 fd0Z9 fd1Z:e e;ddd2d34          d5                         Z<d6d7d8d9d:d;d<d=Z=ed>             Z>ed?             Z?ed@             Z@edA             ZAedB             ZBedC             ZC xZDS )Gr   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)rH   rP   rQ   dataclassesfieldtimer  float__annotations__r  ru   r  r  listr  setr  r  r  dictr	  r
  boolr  r  r  rt   r  r  r  rS   r6   r4   _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%%%%%r6   r  CmfLicense:changed)channelc                  8    t                                            d S r.   )r   _clear_cache)_kwargss    r4   on_license_changedzCmfLicense.on_license_changed#  s     	!!!!!r6   N
_lic_cachec                     d t           _        d S r.   )r   r!  r   s    r4   r  zCmfLicense._clear_cache+  s     !%
r6   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    r4   _check_is_cloudzCmfLicense._check_is_cloud0  sL    z~~k**e3 C
011[@C1]B	Cr6   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 rS   )r3  id)r?   lic	lic_groups      r4   	<setcomp>z*CmfLicense._check_cache.<locals>.<setcomp>I  sC     $
 $
 $
 _$
 $
  L$
 $
 $
 $
r6   )r   r   r   r   r   r   r   c                     i | ]
}|j         |S rS   r(   r?   r8  s     r4   
<dictcomp>z+CmfLicense._check_cache.<locals>.<dictcomp>Q  s     P P P## P P Pr6   r   c                 2    h | ]}|j         d k    |j        S )active)r/  r(   r=  s     r4   r:  z*CmfLicense._check_cache.<locals>.<setcomp>V  s'     e e eScj\dNdNdNdNdNdr6   c                     h | ]	}|j         
S rS   r<  r=  s     r4   r:  z*CmfLicense._check_cache.<locals>.<setcomp>Z  s    DDDc#/DDDr6   r   r   userr      adminr\   rV   )codeLIKEz%eva%T)filterinclude_deleteddisabledfullcompatF))r!  r  r  r  r  ru   modelsCmfPersonGroupadmin_groupr7  slistr  r  r  r  updater  rk   rl   rm   r2  r*   rY   r  appendr(   r  r  minr  r  r  r-  r   countr  
_LOCK_DATEr	  r
  _USER_WARN_DATE_ADMIN_WARN_DATE)
r   cacheeco_productsproductrm   r8  	time_leftr  is_cloudis_news
             r4   _check_cachezCmfLicense._check_cache6  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~%%$(!$(!!,,,$*!$)!!---$+!$)!!$(!$)!( !&
r6   c                 x   t           j        }| j                                        D ]}t	          ||          r dS |                                 }|j        t           j        v rdS |j        dk    rdS |j        dk    r9|j	        sdS |j
        r+t          j                                        | j        k     rdS d S d S d S )NTrI  rK  )gcurrent_userPERSON_LIC_FIELDSvaluesr=   r]  r  current_person__member_ofr  r  r  rk   rl   rm   _UNLIM_DATE)r   rB  	lic_fieldrW  s       r4   license_ui_accesszCmfLicense.license_ui_access  s    
 ~.5577 	 	ItY'' tt   ""1#>>>4:##4:!!> t$ )<)<)>)>)P)Pt "!
 )P)Pr6   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 )NrI  Q rJ  z+CmfLicenseUser.license_api_notify__lic_req_1TexnxrK  FrD  rB  z*CmfLicenseUser.license_api_notify__no_lic_uE   Требуется установить лицензию. После %d.%m.%Yu{    функционал продукта будет ограничен. Обратитесь к Администратору.z'CmfLicenseUser.license_api_notify__act_uG   До окончания срока активации лицензий r8   u    осталось u@    дней. Обратитесь к Администратору.z'CmfLicenseUser.license_api_notify__exp_r   u+   Срок действия лицензий u    завершён. Пожалуйста, обратитесь к Администратору для продления лицензии.u4   До окончания срока лицензий )r_  r`  
user_localr]  r  r  r  rc  APPREDIS_DBredisr  r7  api_license_requiredr	  	cmf_alertrT  r  rF   r  r  r  r  r  )r   rW  notify_periodwarns       r4   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r6   c                    |j         dvrd S t                              dd|d|j        d|j        d|j        d|j        d|j        o|j        j                    |                                 }d	}	 t          j
        s|j        rd
}nt          j        j        sd}n|j        dk    rd}n|j        dk    r+|j        j                                        | j        k     rd}nt%          |t&          j                  rb|j        rW|j        dk    r|                     d           n6|j        dk    r|                     d           n|                     d           d}nt%          |t&          j                  r	 t%          |j        j        t&          j                  sd}n|j        j        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}nG# t:          $ rI d|j        vr |j        r3|                    dd|j        gdd|j        gg dg          d k    r d!}nd}Y nw xY wt%          |t&          j                   r|                     d           d}nt%          |t&          j!                  ro	 |                     d           d}n# t:          $ rI d|j        vr
d|j        vr |j        r*|                    dd|j        gg dg          d"k    r d#}nd}Y n:w xY wt%          |tD                    rd$}ntG          d%tI          |          |          t                              dd|d&|            d S # t:          $ r}|j%        d'         }tL          j        '                                }|j        dk    r|| j(        k     rd(}|| j)        k    r|j*        t          j+        v rd}|| j,        k    rd}|rtZ          j.        j/        0                    d)| d*t          j        j         d+d,d-          r{||j        vrt7          d.| d/| j(        d0d1           nU||j1        vrt7          d2| d3| j(        d0d1           n/t7          d4| d/te          | j(        | j3                  d0d1           t          4                    dd|d5|           n|j        dk    r||j1        v r|| j3        k     r{tZ          j.        j/        0                    d)| d*t          j        j         d+d,d-          rt7          d4| d/| j3        d0d1           t          4                    dd|d5|           n(t          4                    dd|d6|            Y d }~d S Y d }~d S d }~wtj          $ r'}t          4                    dd|d7|             d }~ww xY w)8N)
CmfProjectCmfListCmfTaskCmfDocument%szcheck_license(obj=z): obj.is_new=z, obj.system=z, obj.parent=z, obj.project=z, project_logic_prefix=UnknownsystempublicrI  rK  legacyzproject.servicedeskr   zproject.wikir   r   OKznot project taskr   uw   Объект доступен только для чтения. В рамках бесплатной лицензии "u`   " редактирование разрешено только Владельцу проектаTabortprojectr;   parent)r~  r;   FrG  r^   z	Allow 100   zAllow 20otheruP   Неверный тип объекта для контроля лицензий.z): result=Success, reason r   Fz%CmfLicenseUser.check_license__compat__ri  rh  rj  uE   Не установлена лицензия для продукта u   . После rm  um   г. функционал будет ограничен. Обратитесь к администратору.u)   Лицензии для продукта u!    не активна. После uF   Вам не выделена лицензия для продукта z):  result=Warning, product=z):  result=Fail, product=z):  result=Fail-Abort, error: )6
class_namelogginginfor\  r~  r  r  logic_prefixr]  r_  is_system_contextr`  rn  r  cmf_created_atvaluerl   _NO_LICENSE_DATEr   rL  rx  check_product_licenserz  r  r*   r7  cmf_owner_idrs  nameCmfLicenseErrorr  rS  ry  r{  r   	TypeErrortypeargsrk   rm   rT  rV  r  rc  rU  ro  rp  rq  r  r  maxrd  warningCmfAbortError)	r   objrW  reasonlicense_erY  rm   ru  s	            r4   check_licensezCmfLicense.check_license  sB    >!TTTFPS P Pcj P PSZ P PCJ P PSVS^ P P%([%MS[5MP P	Q 	Q 	Q   ""O	 " YDcj YD!^. VD!z))# x''C,>,D,I,I,K,KcNb,b,b!C!233 LD: @'+@@@112BCCCC)^;;11)<<<<11,???C00 BD&&%cj&68IJJ &!315JJJ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%.S[$A%-sCK$@$:$:$:(< % = = @C	C C
 "!, "&'&* C00 D)),777C!344 D&--i888!FF& 
& 
& 
&#5>99>NV[Vd>d>dz &99ick-JLbLbLb,c9ddgiii!!+ "&
& 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   5DN! >B7H7 5N! 7AJ
N! 	J

AN! K2 1N! 2AMN! MAN! !W6,H
WW6"W11W6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 (rD   F)r  r  )	error_cls
error_argsrY  raise_errors     r4   return_errorz6CmfLicense.check_product_license.<locals>.return_error  sE    OOD"Z7"Z"Zi"Z"Z"Z[[[ -i,,5r6   r@  r|  r  z): TrueT)r]  r  CmfLicenseAbsentErrorr  r  r1  CmfLicenseExpiredErrorr0  CmfLicenseNotActivatedErrorCmfLicenseNotActiveErrorr   ra  r*  r=   r_  r`  CmfLicenseUserAbsentErrorr  r  )r   rY  r  r  rW  
simple_licre  s    ``    r4   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tr6   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 )NrC  rX   ="  r   deadliner   c                     i | ]}|S rS   rS   )r?   rY  demo_days_lefts     r4   r>  z/CmfLicense.new_license_info.<locals>.<dictcomp>  s1       ^  r6   )r   r   r   r   r   r   )r1  r(   r*   lic_org_namer4  r   r@  )demo_availabledemo_org_name)_check_adminrk   rp   _CmfLicense__lic_st_getrl   rm   r*  fromisoformatr  rY   rL  r   rO  r*   r  r(   r  r1  )r   demo_periodqstaterm   deadline_strr  demo_productsr  org_namer8  del_productr  s               @r4   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
 
 	
r6   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 rV   rC  rX   r   r$   )r&   r(   r'   r)   r*   r,   )r  )r  r   ru   r	   rs   rr   _org_name_replace_resublowerr   sha1r   digestrt   
from_bytesrk   rl   rm   rp   r   r   )r   rY  r  r  org_name_strorg_name_hashr&   r0   s           r4   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Er6   c                     t           j        t           j        k    rdS |                                 }|j        t           j        v rdS t          d          )NTud   Действия с лицензиями доступны только администратору.)r_  r`  system_userr]  r  rc  CmfPermissionError)r   rW  s     r4   r  zCmfLicense._check_admin  sZ     >Q]**4  ""1#>>>4   "H  I  I  	Ir6   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   rC  rX   r  registerr  u+   Срок Демо-периода истёкr#   r   log)rk   r0   rV   i  r
   u   Бессрочнаяrm  u%   Истёк срок лицензии(u5   ). Пожалуйста, получите новую.r(   r;   z***rG  r5  uZ   Количество пользователей существующей лицензии(uI   ), превышает ограничение новой лицензии(u   ). Нужно уменьшить количество пользователей лицензии, до активации новой.u   Не ограниченоuo   Демо версия успешно активирована. Срок действия демо версии u
    дней.uJ   Регистрационный номер успешно применён.rg_member_ofINrn  r;   Tr8   c              3   ,   K   | ]}d |j          d V  dS )"N)r  )r?   groups     r4   rA   z*CmfLicense.apply_regnum.<locals>.<genexpr>  s0      '_'_e(9EJ(9(9(9'_'_'_'_'_'_r6   rK  u
   У Вас u.    пользователей в группах u    лицензии "uH   ". Что превышает ограничение лицензии в u    пользователей. Часть пользователей смогут использовать функционал продукта только до u   г. Пожалуйста, измените количество пользователей в соответствии с текущей лицензией до указанной даты.u    пользователей. Пожалуйста, измените количество пользователей в соответствии с текущей лицензией.)1r  _compat_regnumrs  r	   r   rT   r(   rS  r*   rk   rp   r  rl   rm   r*  	isoformatr  r+   rr   rY   rQ  now_CmfLicense__lic_st_setr)   r'   rq   
user_countclonecmfutildisable_acldeleter,   ru   lic_user_limit_strr&   r  
lic_regnumr2  lic_end_date_strsaverL  	CmfPersonr3  r]  rF   r  rd  _new_license_menu_fixr7  )r   r0   r  r  
new_regnumparsed_regnumr  r  r  r  rm   r  r2  r  old_licensenew_licenseperson_countrW  
groups_strs                      r4   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)rH  r
   )rS  landing_page2license)r   rE  s     r4   r  z CmfLicense._new_license_menu_fix  s=    99T9**a//$$T***** 0/r6   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   r4  r   r   r   )eva24evawiki
evaprojectTF)rL  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   rE  global_settingscode_mappings       r4   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   r4  )rL  r  r*  r  )r   r  s     r4   patch_global_settingsz CmfLicense.patch_global_settings  s:     !266se6DDR 	r6   c                 ~    | j         t          j        j                                        k     r	d| _        d S d| _        d S )Nexpiredr@  )r2  cmfr5  CmfDater  r1  r3   s    r4   _calc_lic_statuszCmfLicense._calc_lic_status?  s7    sz1557777'DOOO&DOOOr6   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   r@  )r   r0   r   u9   Лицензия успешно активирована.u.   Неверный ключ активации: r  )r0  r  
is_changedr   r   r*   r  stripr   r   rs  rT   r   r  )r3   _activation_coder  r  s       r4   _calc_activation_statusz"CmfLicense._calc_activation_statusF  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  r@  
activation	corrupted<   rX   )r  r  r  r   )r  rk   rl   rm   r0  r(   r  r  rp   r  r  r  rY   )r3   r  r  rm   r  s        r4   _calc_activation_days_leftz%CmfLicense._calc_activation_days_leftb  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%%%r6   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 )Nr@  Tr   r   rX   Freadonly)
r1  r*   rk   rl   rm   r2  rp   r0  r  r/  )r3   not_expiredactivation_oks      r4   _calc_statuszCmfLicense._calc_statusw  s    ?h&&KK]f$$)<)<)>)>ARU]UgmoUpUpUpAp)p)pKKK.(:Wd>W 	%= 	%"DKKK$DKKKr6   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}|	                    || 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)r   r   r   r   r   r   r    CLBOX)r%   r$   ri  120)r!   r"   r#   AUNLIMr   r    r#   rj   )r(   r  r+   r'   r*   r,   lic_coder  load_fieldsrQ  rF   )r3   partsrs   rv   rx   rw   s         r4   _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			r6   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 ( rD   uE   , свидетельство 2023662166, номер 18285 в ЕРРП)textr(   r  r'   r+   r+  r*   )r3   	prog_nameedu_txtproduct_name
user_limit
unlim_textperpetual_texts          r4   
_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 				r6   c                       e Zd ZdZdS )CmfLicense.StateErroru   Ошибка состоянияNrO   rS   r6   r4   
StateErrorr:    s        ----r6   r;  c                    ddl m} |                    | d d         |j        | dd                    }t	          |t
                    r|                    |          S t	          |t
                    r|                    |          S d S )Nr   )AESr   i)Crypto.Cipherr=  newMODE_CFBr   bytesencryptdecrypt)kior=  crypts        r4   	__st_convzCmfLicense.__st_conv  s    %%%%%%#2#ag66a 	$==###5!! 	$==###	$ 	$r6   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r5  TECHCOM_nocachegs_idanonymous@evateam.rurE  rH  rM  validater
   rF  r   F)r  r  r  )r  r  r   )rL  r  r*  fix_gsidr7  rJ  rK  r  r   r  r   r  base64	b64decoder  rr   r;  _CmfLicense__st_convjsonloads)
r   r   gsrO  p_idkey	encrypted	decrypteddatar  s
             r4   __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  rJ  rK  TrL  rN  r
   rP  rQ  )rE  	only_data)rL  r  r*  rU  r7  rJ  r  r   r  r   r  rY  dumpsrX  rV  	b64encodedecoderK  r  r  r  )	r   r   r`  r[  rO  r\  r]  data_strr^  s	            r4   __lic_st_setzCmfLicense.__lic_st_set   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  )rt   r  )ds    r4   	bytes2intz1CmfLicense.get_activation_hwid.<locals>.bytes2int6  s    >>!Xe><<<r6   r   r   05drj   r   r   )	rL  r  rU  r+  r,  r   r  r   r  )r   rm  rO  r   
hash_byteshwids         r4   r   zCmfLicense.get_activation_hwid2  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r6   c                     | j         r| j        t          j        k    r,|                                 | _         t          j        | _        d S d S r.   )r   
lic_domainr+  r,  r   r  s    r4   _calc_activation_hwidz CmfLicense._calc_activation_hwid?  sH    # 	@t&:['['[#'#;#;#=#=D $?DOOO (\'[r6   c                 N    t                                                      g dz   S )N)r1  r0  r/  r  r+  r2  r3  r   r1  r(   rr  r'   r+   r  r*   )supersave_preload_fields)r3   rG   s    r4   rv  zCmfLicense.save_preload_fieldsD  s4    ww**,, 0P 0P 0P P 	Pr6   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   r0  r.  r8  rs  r  r  r  r  r\  r3  rQ  rL  rM  
user_grouplic_start_dater  r'   schedule_deferred_jobr   recalc_users_countsru  r  r/  cmf_emit_server_event)r3   r  kwargsretrG   s       r4   r  zCmfLicense.saveJ  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=== 
r6   c                     g | _         t          t          j        j                    t                      j        di | t          dd            d S )Nr  rS   )r3  rz  rL  r   r{  ru  r  r|  )r3   r}  rG   s     r4   r  zCmfLicense.deletek  sR    f/CDDD     2D99999r6   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   r4   bulk_commitz3CmfLicense.recalc_users_counts.<locals>.bulk_commit{  s3    " 2%** +*r6   )r  r3  r(   r/  r2  r'   r4  r   r`   r  )does_not_workr;   Fr  r  )rG  r5  sliceorder_byc              3   8   K   | ]}t          |          V  d S r.   r<   r?   re  s_persons     r4   rA   z1CmfLicense.recalc_users_counts.<locals>.<genexpr>  s-      mm) < <mmmmmmr6   r
   c              3   8   K   | ]}t          |          V  d S r.   r<   r  s     r4   rA   z1CmfLicense.recalc_users_counts.<locals>.<genexpr>  s-      #q#qYGHi$@$@#q#q#q#q#q#qr6   FT)r7  recalc_users_counts(): %szClear Ecoz license on rc  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
   Trc  r  Add  license to , count /r   zInvalid productzLicense(z) user limit(z) exceeded on )ra  r*  r=   r  r'   r  r  r  setattrrb  rr   r   r(   )re  
lic_field2r   licensepersonrY  s     r4   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r6   )r7  r5  N) rL  r   r   r  r  ru   r(   r3  rE  addrt   r  rO  ra  rb  r   r  r*  rP  allrQ  anyextenditemsr=   r7  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_licensere  r  takenr  r   r  r  rY  r  s                     @@@@@@r4   r{  zCmfLicense.recalc_users_countsq  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 r6   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]  r7  r  )r   r  rW  s      r4   is_license_groupzCmfLicense.is_license_group  s#      ""x5333r6   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    функционал продукта будет ограничен.rK  u2    функционал продукта после rm  u    будет ограничен.uI   Превышен лимит пользователей лицензии "z". u;    Необходимо расширить лицензию .)r_  
api_methodrs  loginr(   r]  r  rk   rl   rm   rd  )rW  limit_date_infor   r  rB  s     r4   user_limit_alertz6CmfLicense.take_user_license.<locals>.user_limit_alert  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r6   r3  EXISTSr7  r;   )r  r'   r(   r  rn  r  r   c              3   :   K   | ]}t          |           V  d S r.   r<   r?   re  rB  s     r4   rA   z/CmfLicense.take_user_license.<locals>.<genexpr>'  s0      eeGD)444eeeeeer6   Tr
   rc  ztake_user_license(): %sr  r  r  r  )r  r7  r,  ra  rb  rn  r  r  r(   r  r  r'   r  r  r  r  r=   rz  rL  r   r{  )r   rB  r  r  r  was_changedre  r  s   ``     @r4   take_user_licensezCmfLicense.take_user_license  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Dr6   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 )Nr3  r  r7  r;   )r  r(   r'   r  r   c              3   8   K   | ]}t          |          V  d S r.   r<   r  s     r4   rA   z2CmfLicense.release_user_license.<locals>.<genexpr>Q  s-      aaYi00aaaaaar6   r
   Trc  Fzrelease_user_license(): %szRemove EvaEco license from r  r  Remove  license from )r  r7  r,  ra  rb  r  r(   r  r  r  r  r  r  r'   r=   rz  rL  r   r{  )r   rB  r  r  r  r  re  s    `     r4   release_user_licensezCmfLicense.release_user_licenseF  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Dr6   c                    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     r4   rA   z7CmfLicense.release_all_user_licenses.<locals>.<genexpr>n  s-      ]]GD),,]]]]]]r6   )r3  r  r(   r4  r   r
   Fzrelease_all_user_licenses(): %sr  r  r  r  )r  ra  rb  r  r(   r  r  r  r  r  r'   r*  r=   )r   rB  r  r  re  s    `   r4   release_all_user_licensesz$CmfLicense.release_all_user_licensesi  s   
 ]]]]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r6   c                     d S r.   rS   )r   _argsr  s      r4   r   z!CmfLicense.public_list_hack_empty  s	     	r6   c                 X   d                     g d          }t          j        d                                                                          }t          j        |d          }|                     ||          }t          	                    |          }|
                    |          S )Nr  )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A+p6V7I=zRegMapEncKey__cvvnsdfjh4!4566TrR  rT  )rF   r   r  r   r  rV  rW  rX  rY  rZ  r*  )r   r0   rmr]  reg_map_encryptedreg_map_binreg_maps          r4   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"""r6   r   )NNr.   )ErH   rP   rQ   rR   r	   r   r   r   api_methodsremoverk   rl   rV  rU  rT  r  rd  r  	dataclassr  r   on_server_eventr   r!  r  r   r  r-  r]  rf  rv  r  r  r   r   r   r  r   r  r   r  r  r  r  r  r  r  r.  r8  	Exceptionr;  rX  r  r  r   rs  rv  r  r  cmf_deferred_jobr{  ra  r  r  r  r  r   r  __classcell__)rG   s   @r4   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
 ~ ~ [~@   [4 BD BD [BDH ` ` [`D    [8 ,
 ,
 [,
\ ::&abbF F F [F, I I [I }# }# }# [}#~ + + + [+ ?  ?  ?  [? B L L [L\' ' '6 6 68[ [ [*% % %"<" <" <"|%X %X %XN. . . . .Y . . . $ $ $ \$ $
 $
 [$
L $ $ [$" 
 
 [
@ @ @
P P P P P    B: : : : : STUUU| | VU \|@ ' .    4 4 [4 AE AE [AEF  E  E [ ED Q Q [Q@   [ C# C# kC# C# C# C# C#r6   r   c                     | dk    rd S d S )Nr  rS   )license_codes    r4   r  r    s    y   ! r6   )rV  r  rk   r   r  r   collectionsr   typingr   cmf.includecommon.models.cmf_active_entityr   modules.settings.fieldsr   r	   r   r   r  rS   r6   r4   <module>r     sC            # # # # # #           ; ; ; ; ; ; / / / / / /a a a a a a a aH	{ { { { { { { {|a# a# a# a# a#' a# a# a#H5    r6   