
    oi*                        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
 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y)    N)defaultdict)Optional)*)CmfActiveEntity)cmf_licensec                      e Zd Zej	                  d      Zej	                  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
	 	 	 	 	 	 	 	 d1d#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d2d/       Zed0        Zy")3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                     || _         |	| _        |
| _        || _        || _        || _        || _        || _        || _        || _	        y 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   sN     &,(0)3*5-;*59I'/)3)3    c                 x     g d}dj                   fd|D              } j                  j                   d| dS )N)	r1   r'   r(   r)   r*   r+   r,   r-   r2   , c              3   Z   K   | ]"  }t        |      | dt        |        $ y wN=getattr.0paramr4   s     r5   	<genexpr>z"RegNum.__repr__.<locals>.<genexpr>k   8       g27WTSXEYEeugQwtU+,- g   ++()join	__class____name__r4   params
params_strs   `  r5   __repr__zRegNum.__repr__g   sI    @ YY  g;A g h
..))*!J<q99r7   c                       e Zd ZdZy)RegNum.ParseErroru=   Неверный формат кода регистрацииNrJ   
__module____qualname____doc__ r7   r5   
ParseErrorrP   o   s    Kr7   rV   c                 F   d| _         d| _        | j                  sd| _        | j                   sd| _         | j                  d| _        | j                  sd| _        | j                  sd| _        | j
                  sd| _        | j                  szt        j                  j                         }|j                  }|j                  }|dk(  rd}|d	z  }|d	z  }t        j                  ||d	      t        j                  d	
      z
  | _        | j                  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   }nZ| j                  dk  rd| j                  dz  z   }n8| 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}| | |	 |
 | }| j+                  |      }| 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   ro   rp   rq   yymmd1r(   d2
product_idd3d4	type_codeperiod_codedeploy_code	type_packd5cs_strd6s                     r5   generatezRegNum.generater   ss     'D}}"DM&"$D$D&DO#DO$$MM'')E::DKKE{	QJE$,MM$q$AHDVDV\]D^$^D!$$--f5  %"-t/B/BCC  D(!00N  D(!D$7$72$==N  E)!D$7$73$>>N  F*!D$7$74$??N-t/B/BCC~%c*4#5#55]D,<,<==''(8(89
BrsGt#j05T4 ==/Z77OODMM2	??$"3"33Xt77''8??$"3"33Xt77''8 A%+*:;iG	T--45<SA4tB4tB4(]]6"AbT2$at1RD"6{{r7   c                     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   }	nj | j                        rFdt        d   d      d	   d
   d   d   d    d	    d
    d    d    }d   }	n j                  d       j	                  |      |	k(  }
|r|
s j                  d       |       } |       } |       } |       \  }}}  |
||||||
      S )Nc                 *    | j                        S r/   )match)expr   r1   s    r5   check_matchz!RegNum.parse.<locals>.check_match   s     IIf%ELr7   c                      t              dkD  rj                  d      dt              z
  } | dkD  r
| dz  dz  } | S | dkD  r
| dz  dz  } | S | dkD  r| dz  dz  } | S )	Nrc   r
   ra   rb   r_   r`   r]   r^   )rv   rV   )limitclsob_user_limitr1   s    r5   deob_user_limitz%RegNum.parse.<locals>.deob_user_limit   s    =!D(nnVQ//3}--E t|-
 L	 , L +Lr7   c                      dk(  rdz  } ndz  } t              dz
  | z
  }|j                  vrj                  d|      j                  |   S )N5r^   rb   rf   r   )rv   ru   rV   )contract_id_partproduct_coder   r'   
ob_productr3   r1   s     r5   deob_productz"RegNum.parse.<locals>.deob_product   sg    S #.#3 #.#5 z?T14DDL3#4#44nnVQ==$$\22r7   c                  z   yt              dz  z  dz  } | dz  }| dz  dz	  }| dz  dz	  }|j                  vrj                  d	|      |j                  vrj                  d|      |j                  vrj                  d
|      j                  |   j                  |   j                  |   fS )N)r   r#   r%   rj   rk      p   r   i  r   r   r   )rv   rx   rV   ry   rz   )deobr   r   r   r   r'   ob_typer1   s       r5   	deob_typezRegNum.parse.<locals>.deob_type   s    1w<;#56=D vI)+1K,.14K.nnVQ	::#"2"22nnVQ<<#"2"22nnVQ<<>>),c.>.>{.KSM]M]^iMjjjr7   c                      t              dz
  } d| dz  z   }| dz  }|dk  s|r|dkD  rj                  d||      |dk(  rd}|dz  }|dz  }t        j                  ||d      t        j                  d	      z
  S )
Nrg     r`   i  rY   r   r   r
   rZ   )rv   rV   rm   rn   rr   )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Rx	!GB==r1-0B0B0JJJr7   r   r
   r^   r   r   r   r   6r   r   r   r0   )_REGNUM_5_RErv   _REGNUM_6_RErV   r{   )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	k,	K  
s''(JeAh+K!!HMqJAhGaz%(E!H:eAhZ@FqB))*JeAh+K!!HMqJAhGAhGaz%(E!H:eAhZazJFqB..++<<'2-H..++(*"n$;+4;(*jH#NP[-Zdnp 	pr7   c                     t        j                  | j                               j                         }t	        j
                  |j                               }|ddd }|S )N08dr   r   hashlibmd5encode	hexdigestzlibcrc32sr   r   r   s       r5   r{   zRegNum._calc_cs.  sH    kk!((*%//1

3::<(c{Aa 	r7   )
NNNNNNNNNNT)rJ   rR   rS   recompiler   r   ru   rx   ry   rz   rv   rw   rm   rn   r6   rN   rt   rV   r   classmethodr   staticmethodr{   rU   r7   r5   r	   r	      s   ::KLL::S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
 'mm4 4 4 4,:LZ LGR pp ppd  r7   r	   c                       e Zd Zej	                  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y)ActivationCodez:^(\d{6,})-(\d{6})-(\d{5})-(\d{5})-(\d{5})-(\d{5})-(\d{4})$Nr'   r(   r)   r*   r+   r,   r-   c                     |	| _         || _        || _        || _        || _        || _        || _        || _        || _        |
| _	        || _
        || _        || _        || _        y 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  sk     )1%+*5-;*59I'/)3)3#'	#'	#'	#'	.=r7   c                 x     g d}dj                   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   Z   K   | ]"  }t        |      | dt        |        $ y wr;   r=   r?   s     r5   rB   z*ActivationCode.__repr__.<locals>.<genexpr>g  rC   rD   rE   rF   rG   rK   s   `  r5   rN   zActivationCode.__repr__b  sI    @ YY  g;A g h
..))*!J<q99r7   c                       e Zd ZdZy)ActivationCode.ParseError9   Неверный формат кода активацииNrQ   rU   r7   r5   rV   r   k      Gr7   rV   c                       e Zd ZdZy)"ActivationCode.RegnumMismatchErrorr   NrQ   rU   r7   r5   RegnumMismatchErrorr   n  r   r7   r   )r   	   r   r
   r   r   r      r   r   r   r^   rY   )r   r   r   r^   r   r   r         r   r   rY   r   r
   r   r   )rY   r   r   r^   r   r      r
      r   r   r   r   r   r      r   r   r   c                 (   " |st         j                         }t        |t              rt        j                  |      } j                  j                  |      }|s j                  |d      t        |d   d      "|r"|j                  "k7  r j                  ||d      |d   }|d   }|d   }|d   }	|d   }
|d    |d    |d    |d    |d    |d    | }|d	   } j                  |      |k(  }|r|s j                  |d       "fd
} ||      }|r"|j                  |k7  r j                  ||d       ||      }|dz	  dz  }|dz  }|t        j                  vr j                  |d      t        j                  |   }|r"|j                  |k7  r j                  ||d      |dz  }t!        j"                  d|dz  z   d|dz  z   d      t!        j$                  d      z
  }|r"|j&                  |k7  r j                  ||d       ||      }|dz	  dz  }|dz	  d	z  }|d	z  }|s|s
|sd }d }d }n|t        j(                  vr j                  |d      t        j(                  |   }|r"|j*                  |k7  r j                  ||d      |t        j,                  vr j                  |d      t        j,                  |   }|r"|j.                  |k7  r j                  ||d      |t        j0                  vr j                  |d      t        j0                  |   }|r"|j2                  |k7  r j                  ||d	       ||	      }|dz	  }|dz  } ||
      }|dz	  } |dz  }!  |xr |j4                  ||||| |!"||||||      S )Nr   r
   r^   r   r   r   r   r   r   c                    t        | d      }t        |       dk(  r/j                  }|dk  sJ d       |dz  z  dz  }|dk  sJ d       t        |       dk(  r/j                  }|dk  sJ d	       |dz  z  d
z  }|dk  s[J d       t        |       dk(  r/j                  }|dk  sJ d       |dz  z  dz  }|dk  sJ d       t        dt        |              d}t        t        |            D ]  }|d|z  z  s|d||   z  z  } |S )Nr^   r   rj   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
   )rv   len_m13_m16_m19rt   range)r   
ob_int_valtableint_valresultbr   r'   s         r5   deob_intz&ActivationCode.parse.<locals>.deob_int  sP    QJ1v{!D(8.8($d(:;dB~2{2~Q1!E)9>9)$e(;<uD33Q1!F*:N:*$f(<=F'44' 9SVH!566 F3u:& .a1f%qE!H}-F. Mr7   r   i  r   rY   )rp   rq   dayrZ   r      )r1   r2   r   r   r   r   r   r'   r(   r)   r*   r+   r,   r-   )
CmfLicenseget_activation_hwid
isinstancerw   r	   r   _ACT_CODE_REr   rV   rv   r'   r   r{   r(   ru   r)   rm   rn   rr   r*   rx   r+   ry   r,   rz   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..!44%(B'f((K7))/61EEa!!H %a88!H:eAhZaz%(E!H:eAhZP_O`a1X <<'2-H..!44	: "-0f++~=))/61EE ""34&",3%'v333..!44**<8f((K7))/61EE 	!#==d62:oQvby[VWX[c[m[mst[uuf--1AA))/61EE &&;<'1,3	)Q.#5(3.[HJJ 1 11nn_a88((3H&//X5--ovqII&"5"55nn_a88,,[9J&++z9--ovqII&"5"55nn_a88,,[9J&++z9--ovqII "zt|"zt|+fmmhP_Dt$#NP[-Zdn	p 	pr7   c                     t        j                  | j                               j                         }t	        j
                  |j                               }|ddd  }|S )Nrd   r   r   s       r5   r{   zActivationCode._calc_cs  sH    kk!((*%//1

3::<(c{BC 	r7   )NNNNNNNNNNNNNN)NNT)rJ   rR   rS   r   r   r   rv   rw   rm   rn   r6   rN   rt   rV   r   r   r   r   r   r   r   r{   rU   r7   r5   r   r   6  s     ::[\L  $"&#.2 """&26 >>  > 	>
 'mm> > > ><:HZ HHj H 6DADMD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j                  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dEdFd       Zed        Z edGd       Z!ed        Z"e#jI                  d      Z%edHd       Z&ed        Z'edEd       Z(edEd        Z)edEd!       Z*ed"        Z+d# Z,d$ Z-d% Z.d& Z/d' Z0d( Z1 G d) d*e2      Z3edHd+       Z4ed,        Z5ed-        Z6ed.        Z7d/ Z8 fd0Z9 fd1Z: fd2Z;e e<ddd3d45      d6               Z=d7d8d9d:d;d<d=d>Z>ed?        Z?ed@        Z@edA        ZAedB        ZBedC        ZCedD        ZD xZES )Ir   uA   
    Приобритённые и демо-лицензии
    )apply_regnum
apply_demonew_license_infopublic_list_hack_emptycreatei  r   r
   r   r   r   r^   c                   h   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<   y)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)rJ   rR   rS   dataclassesfieldtimer  float__annotations__r  rw   r  r  listr  setr  r	  r
  dictr  r  boolr  r  r  rv   r  r  r  rU   r7   r5   _LicCacheDatar    s    ,;,,TYYG	5Gc""$"&C&### $$S T ##$5K$5$5d$KTK$(c( c !2!2!24!H$H!%3%r7   r  CmfLicense:changed)channelc                  ,    t         j                          y r/   )r   _clear_cache)_kwargss    r5   on_license_changedzCmfLicense.on_license_changed%  s     	!r7   N
_lic_cachec                     d t         _        y r/   )r   r#  r   s    r5   r   zCmfLicense._clear_cache-  s     !%
r7   c                     t         j                  j                  d      dk(  xr7 t         j                  j                  d      dk(  xr 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  sM    zz~~k*e3 C

01[@C11]B	Cr7   c                 	   | j                   r:t        j                         | j                   j                  dz   k  r| j                   S | j                         }| j                   r| j                   j                  n0t        t        j                  j                         j                        |_        | j                  g d      |_        |j                  D ch c]  }|j                  D ]  }|j                   ! c}}|_        d}|j                  D ci c]  }|j                  | c}|_        d|j                  v r#|D ]  }|j                  d   |j                  |<     |j                  D ch c]  }|j                   dk(  s|j                    c}|_        d|j"                  v r|j"                  j%                  |       |j                  D ch c]  }|j                   c}|_        d|j&                  v r|j&                  j%                  |       t(        j*                  j-                         }|j                  D ]  }|j.                  |j.                  |z
  }d }|j0                  dk(  r|j2                  dk  r&d	}n#|j2                  d
k  rd	}n|j2                  dk  rd}|sh|j4                  j7                  |j                         |d	k(  s|j8                  s||_        |j:                   t=        |j:                  |j2                        n|j2                  |_         |j                  D ]q  }|j>                  |j@                  j7                  |j                         |j>                   t=        |j>                  |j>                        n|j>                  |_        s |j>                  |j>                  dk  rd	|_!        n*|j>                  |j>                  dk  rd|_!        nd |_!        | jE                         }	t        jF                  jI                  g dd       }
|	rd|_%        n|
rd|_%        nd|_%        t(        j*                  j-                         }|| jL                  kD  rd |_'        d|_(        nJ|| jR                  kD  rd	|_'        d|_(        n,|| jT                  kD  rd|_'        d|_(        nd |_'        d|_(        |tF        _         |S c c}}w c c}w c c}w c c}w )Nr   )statusactivation_status
lic_statusr)   r+   lic_end_dater  user_groupsfields)r   r   r   r   r   r   r   r   activer   r   userr      adminr^   rX   )codeLIKEz%eva%T)filterinclude_deleteddisabledfullcompatF)+r#  r  r  r  r  rw   modelsCmfPersonGroupadmin_groupidslistr  r5  r  r)   r
  r1  r	  updater  rm   rn   ro   r4  r+   r[   r  appendr  r  minr  r  r  r/  r   countr  
_LOCK_DATEr  r  _USER_WARN_DATE_ADMIN_WARN_DATE)r   cachelic	lic_groupeco_productsproductro   	time_leftr  is_cloudis_news              r5   _check_cachezCmfLicense._check_cache8  s\    >>diikCNN,D,Dq,HH>>!!!# ~~  #~~<<#&v'<'<'H'H'J'M'M#N 	  +C D ~~$
 __$
  LL$
$
  nAF P##!5 Pu,,,' Q161F1Fx1P%%g.Q =BNN eScjj\dNd eu,,,!!((65:^^Dc#//Du~~%NN!!,/ ##%>> 	OC',/,<,<u,DIL||v%>>Q&#)L>>A%#)L^^r)#*L&&--coo>6)1C1C)5E&..: +.e.E.Ey~~*V@I ''	O. >> 	XC''/%%,,S__=--9 *-U-G-GIaIa)b?B?W?W &		X %%1e6P6PSU6U$*E!''38R8RUW8W$+E!$(E! &&(&&,,4M_c,dd #EJEJ "EJMM'')Es~~%$(!$(!,,,$*!$)!---$+!$)!$(!$)!( !&
Y$
 !Q
 !f Es   $SS/SSS"c                      yNTrU   r%  s    r5   license_ui_accesszCmfLicense.license_ui_access  s     r7   c                    t         j                  j                  sy | j                         }|j                  dk(  ry d}|j                  dk(  r{|j
                  so|j                  t         j                  v rSt        j                  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}|rbt        j                  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}|r}t        j                  j                  j                  dt         j                  j                   d|d      r5t        ddj%                  |j&                         d|j(                   d       d	}|j*                  d
k(  r|j                  t         j                  v rd}|j*                  dk(  rd}|rt        j                  j                  j                  dt         j                  j                   d|d      rn|j,                  dk  r)t        ddj%                  |j.                         d       y t        ddj%                  |j.                         d|j,                   d       y y y )Nr@  Q rA  z+CmfLicenseUser.license_api_notify__lic_req_1TexnxrB  Fr;  r9  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_localrW  r  r  r  current_person__member_ofAPPREDIS_DBredisr  rF  api_license_requiredr  	cmf_alertrL  r  rH   r  r  r  r  r  )r   rO  notify_periodwarns       r5   license_api_notifyzCmfLicense.license_api_notify  s    ~~((  "::# " ::>>,,0K0KK**..EannFWFWEXY[^(T / 3 *.& ::!>>$$/E4H4HALgLg4gD$$.DCLL..22DQ^^EVEVDWXZ](T 3 3 ''*~~h&? @QRS   G+0D0DHcHc0cD  F*DCLL&&**9!..:K:K9LMsWdim + oYZ^ZcZcdid}d}Z~Y$U%?%?$@  AABC
 (U-A-AQE`E`-`D'DCLL&&**9!..:K:K9LMsWdim + o&&*A$))ELbLbBcAd eN OP J499UZUkUkKlJm()@)@(A  BBCDo4r7   c                     |t         j                  }| j                  j                         D ]  }t	        ||      s y y rY  )rb  rc  PERSON_LIC_FIELDSvaluesr>   )r   r9  	lic_fields      r5   	is_editorzCmfLicense.is_editor  s;    <>>D..557 	ItY'	r7   c                    |j                   dvry t        j                  dd|d|j                  d|j                  d|j
                  d|j                  d|j                          | 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(  r5|j                  j                   j#                         | j$                  k  rd}n;t'        |t(        j*                        rc|j                  rS|j,                  dk(  r| j/                  d       n2|j,                  dk(  r| j/                  d       n| j/                  d       d}nt'        |t(        j0                        r	 |j                  }|sF|j                  r:t2        j5                  |j                        j,                  }|rt7        d| d       t'        |j
                  j                   t(        j*                        sd}n|dk(  r~| j/                  d       |j8                  d   }|j:                  dk(  rLt        j                  j<                  |j>                  j@                  k7  rt7        d|jB                   dd       d}n| j/                  d       d}nt'        |t(        jL                        r| j/                  d       d}nXt'        |t(        jN                        r	 | j/                  d       d}n)t'        |tR              rd.}ntU        d/tW        |      |      t        j                  dd|d0|        y # tD        $ ri d|jF                  vr | jI                         s |j                  r8|jK                  dd|j                  gd d|j                  gg d!g"      d#kD  r d$}nd%}Y w xY w# tD        $ r d }|j                  r#|jK                  d&d|jP                  gg d!g"      }|jP                  t        j                  j<                  k(  r0|j                  r!|d'k  rd(}nb| jI                         r|d)k  rd*}nJ d+}nF| jI                         s d|jF                  v sd|jF                  v r|j                  r	|d)k  rd,}n d-}n Y lw xY w# tD        $ r]}|jX                  d1   }tZ        j"                  j]                         }	|j                  dk(  rC|	| j^                  k  r3d2}
|	| j`                  k\  r|jb                  t        jd                  v rd}
|	| jf                  k\  rd}
|
rt2        jh                  jj                  jm                  d3| d4t        j                  j<                   d5d6d7      r||jF                  vrt7        d8| d9| j^                  d:d;       n]||jn                  vrt7        d<| d=| j^                  d:d;       n1t7        d>| d9tq        | j^                  | jr                        d:d;       t        ju                  dd|d?|       n|j                  dk(  r||jn                  v r|	| jr                  k  rt2        jh                  jj                  jm                  d3| d4t        j                  j<                   d5d6d7      rt7        d>| d9| jr                  d:d;       t        ju                  dd|d?|       nt        ju                  dd|d@|        Y d }~y Y d }~y d }~wtv        $ r"}t        ju                  dd|dA|         d }~ww xY w)BN)
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_apir@  rB  legacyzproject.servicedeskr   zproject.wikir   r   OKu   DEV: ошибка! У u;    не рассчиталось поле parent_logic_prefixznot project taskr   uw   Объект доступен только для чтения. В рамках бесплатной лицензии "u`   " редактирование разрешено только Владельцу проектаTabort
project_idr<   parent)rz  r<   Fr>  r`   z	Allow 100zTask edit (Wiki license)	parent_idr   zHome Allow 5   zHome Allow 20z	Home editzAllow 20zDoc edit (Project/SD license)otheruP   Неверный тип объекта для контроля лицензий.z): result=Success, reason r   Fz%CmfLicenseUser.check_license__compat__r]  r\  r^  uE   Не установлена лицензия для продукта u   . После ra  um   г. функционал будет ограничен. Обратитесь к администратору.u)   Лицензии для продукта u!    не активна. После uF   Вам не выделена лицензия для продукта z):  result=Warning, product=z):  result=Fail, product=z):  result=Fail-Abort, error: )<
class_namelogginginforV  rz  r  r  parent_logic_prefixrW  rb  is_system_contextrc  rd  	api_scoper  cmf_created_atvaluern   _NO_LICENSE_DATEr   rC  rt  logic_prefixcheck_product_licenserv  rf  get_cache_projectrj  r
  r+   rF  projectcmf_owner_idnameCmfLicenseErrorr  rr  rK  ru  rw  r  r   	TypeErrortypeargsrm   ro   rL  rN  r  re  rM  rg  rh  r  r	  max_UNLIM_DATEwarningCmfAbortError)r   objrO  reasonr  license_	obj_counterS  ro   rl  s              r5   check_licensezCmfLicense.check_license%  sC    >>!TT!SF/cjj].SZZMCJJ=PbSVSaSaRc d%%(%<%<$=?	@   "z	 ""cjj!^^..! (!z)# x'C,>,>,D,D,I,I,KcNbNb,b!C!2!23::''+@@112BC))^;11)<11,?C01<*-*A*A'.3>>.1.C.CCNN.S.`.`+.%(>seC~&  A%cjj&6&68I8IJ!3,0EE112BC#(#8#89I#J $,,61>>;L;LPSP[P[PhPh;h%#[[c[h[hZi jB!C KOP "&11,?!%6 C0)),7C!3!34(--i8!FP C1    rtxy|t}  @C  D  DLL!4v5OPVxXY_ ' < !6 ==?zz99%13$G%-sCNN$C$:(< % = @C	C
 "!, "<1<D ' %
 !%Izz$'II{C6WYo5pI$q	 }}(9(99::(A~)7!$Y"_)8 %%0F ]]_ &7;Ku~~;]::(B)3 % &EFK%^  +	ffQiGMM'')EzzX%%#..*@C000U5I5IQMhMh5hDC///DCLL..22?y!..J[J[I\]_b$ 3 / enn4!cdkcl m++.>>(*C DUVW !(=(==!Gy Q++.>>(*C DUVW
 "deldm n++.s~~s+OPX*Y ZUVW (;sf<YQXPZ&[\ x'Gu7L7L,LQVY\YhYhQh<<%%))?y!..J[J[I\]_b$ * / `ah`i j''*x&@ AQRS (;sf<YQXPZ&[\(;sf<VgZ&XY ] ]   	OOD$73&8VWXVY"Z[	ss   =ES DN A	S 'O6 :AS A/O30S 2O33S 6CSS SS 
]$I\66]$]]$Tc                    fd}| j                         }|j                  vr |t              S |j                  vrT|j                     }|j
                  dk7  r |t              S |j                  dk7  r |t              S  |t              S t        j                  j                        }t        t        j                  |      s |t               S t"        j%                  dd d       y)Nc                 N    t         j                  dd d|  d       r | | y)Nrx  check_product_license(z
): False (rF   F)r  r  )	error_cls
error_argsrS  raise_errors     r5   return_errorz6CmfLicense.check_product_license.<locals>.return_error  s3    OOD$:7):i[XY"Z[,,r7   r8  rx  r  z): TrueT)rW  r  CmfLicenseAbsentErrorr	  r
  r3  CmfLicenseExpiredErrorr2  CmfLicenseNotActivatedErrorCmfLicenseNotActiveErrorr   ro  r,  r>   rb  rc  CmfLicenseUserAbsentErrorr  r  )r   rS  r  r  rO  
simple_licrq  s    ``    r5   r  z CmfLicense.check_product_license  s    	   "%..( 5w??%///..w7J$$0#$:GDD++x7#$?II 8'BB0044W=	q~~y1 97CCT3G9GDEr7   c                    | j                          t        j                  d      }d}| j                  |      }t        j                  j                         }|d   j                  d      }|r9t        j                  j                  |      }t        d||z
  j                        }n|j                  }dD ci c]  }|r||	 }	}d }
d }t        j                  j                  g d	      D ]  }|j                  dk(  r|j                  }
n|j                  }|j                  d
k(  r$t!        |	      D ]  }||j                  k7  s|	|=  nd
|	v r|	d
= |j"                  dk(  su|j                  |	v s|	|j                  =  |	|
xs |dS c c}w )Nr:  rZ   ="  r   deadliner   )r   r   r   r   r   r   )r3  r)   r+   lic_org_namer6  r   r8  )demo_availabledemo_org_name)_check_adminrm   rr   _CmfLicense__lic_st_getrn   ro   r,  fromisoformatr  r[   rC  r   rG  r+   r  r)   r  r3  )r   demo_periodqstatero   deadline_strr  demo_days_leftrS  demo_productsr  org_namerP  del_products                 r5   r   zCmfLicense.new_license_info  s    	 ((b1  ###%V}((4}}22<@H X%5$;$;<N(--N f ^#  $$**2k*l 	3C||v% # 0 0++(*#'#6 7K"coo5)+67 },%h/~~)coo.N!#//2	3$ ,*6h
 	
/s   7Fu8   (\b(ао|ооо|зао|оао|ип)\b)|([^a-zа-я0-9]+)c           	      N   | j                          t        |t              r|t        j                  v st        |      | j                  j                  d|xs dj                               }t        j                  |j                               j                         }t        j                  |dd      dz  }|dk  r|dz  }t        ||dt        j                   j#                         t        j$                  d	      z   d
d      }| j'                  |j)                         |      S )N littleFsignedi i rX   r:  rZ   r   r%   )r'   r)   r(   r*   r+   r-   )r  )r  r   rw   r	   ru   rt   _org_name_replace_resublowerr   sha1r   digestrv   
from_bytesrm   rn   ro   rr   r   r   )r   rS  r  r!  org_name_strorg_name_hashr'   r1   s           r5   r   zCmfLicense.apply_demoA  s    '3'Gv7K7K,KW%% //33BR8N8N8PQ  \%8%8%:;BBDnn]HUnKkY#:%K#0C0C0EHZHZ`bHc0c	/
  1HEEr7   c                     t         j                  t         j                  k(  ry| j                         }|j                  t         j
                  v ryt        d      )NTud   Действия с лицензиями доступны только администратору.)rb  rc  system_userrW  r  re  CmfPermissionError)r   rO  s     r5   r  zCmfLicense._check_adminX  sQ     >>Q]]*  "1#>#>>   "H  I  	Ir7   c                    | j                          | j                  |      }|rt        d|        |}	 t        j	                  |d      }|j                  dk(  r"| j                  g d      r/t        d	d       n!| j                  g d
      rt        dd       d }|j                  dk(  rct        j                  d      }d}| j                  |      }	t        j                  j                         }
|	d   j                  d      s|
j                         |	d   d<   |	d   j                  d      s|
|z   j                         |	d   d<   t        j                  j!                  |	d   d         }|
|k\  rt        dd       |j"                  dk(  rt%        |d      ||
z
  j&                  }|	d   d   j)                  t        j                  j+                         j                         |d       | j-                  ||	       ||_        d|_        |j"                  dk(  rt        j                  ddd      }d}n|j.                  }|j3                  d      }|t        j                  j                         k  rt        d|ddd       | j                  dd|j                  gd g!      }|r|j4                  |j0                  kD  r(t        d"|j4                   d#|j0                   d$d       |j7                         }t8        j;                         5  |j=                          d d d        n |        }|j                  |_        |j                  |_        |j"                  |_        |j>                  |_        |j0                  |_        |j0                  rtA        |j0                        nd%|_!        |xs tA        |jD                        |_#        ||_$        ||_%        |j.                  |_        ||_&        t8        j;                         5  |jO                          d d d        |j                  dk(  rt        d&| d'       nt        d(       |j0                  rtP        jR                  j                  d)d*|jT                  gg d+g      }||j0                  kD  r| jW                         }d,jY                  d- |jT                  D              }|jZ                  d.k(  rft        j                  j                         | j\                  k  r;t        d/| d0| d1|j                   d2|j0                   d3| j\                  dd4       n,t        d/| d0| d1|j                   d2|j0                   d5	       | j_                  |j                         tA        |j`                        S # t        j
                  $ r t        d| d        w xY w# 1 sw Y   xY w# 1 sw Y   xY w)6Nue   Ваш регистрационный номер преобразован в новый формат T)r   u9   Некорректный ключ регистрации r  r   )r)   z!=r   r  u   Для активации лицензии EvaEco. Вам нужно предварительно удалить лицензии на другие продукты.)r)   r<   r   u  У вас уже есть лицензии EvaEco. Её можно заменить только лицензией на EvaEco, либо предварительно удалить лицензию EvaEco для активации другого продукта.r   r:  rZ   r  registerr  u+   Срок Демо-периода истёкr$   r   log)rm   r1   rX   i  r
   u   Бессрочнаяra  u%   Истёк срок лицензии(u5   ). Пожалуйста, получите новую.r)   r<   z***r>  r7  uZ   Количество пользователей существующей лицензии(uI   ), превышает ограничение новой лицензии(u   ). Нужно уменьшить количество пользователей лицензии, до активации новой.u   Не ограниченоuo   Демо версия успешно активирована. Срок действия демо версии u
    дней.uJ   Регистрационный номер успешно применён.rg_member_ofINrd  r<   Tr9   c              3   <   K   | ]  }d |j                    d   yw)"N)r  )r@   groups     r5   rB   z*CmfLicense.apply_regnum.<locals>.<genexpr>  s     '_e!EJJ<q(9'_s   rB  u
   У Вас u.    пользователей в группах u    лицензии "uH   ". Что превышает ограничение лицензии в u    пользователей. Часть пользователей смогут использовать функционал продукта только до u   г. Пожалуйста, измените количество пользователей в соответствии с текущей лицензией до указанной даты.u    пользователей. Пожалуйста, измените количество пользователей в соответствии с текущей лицензией.)1r  _compat_regnumrj  r	   r   rV   r)   rK  r+   rm   rr   r  rn   ro   r,  	isoformatr  r,   rt   r[   rI  now_CmfLicense__lic_st_setr*   r(   rs   
user_countclonecmfutildisable_acldeleter-   rw   lic_user_limit_strr'   r  
lic_regnumr4  lic_end_date_strsaverC  	CmfPersonr5  rW  rH   r  r  _new_license_menu_fixrF  )r   r1   r  r!  
new_regnumparsed_regnumr  r  r  r  ro   r  r4  r  old_licensenew_licenseperson_countrO  
groups_strs                      r5   r   zCmfLicense.apply_regnumb  s   ''/
}  I  ~J  K  LF	"LL$L?M $$0yy ?y@ |  yy >y?_ 	  !!V+",,"5KA$$Q'EMM'')E=$$Z0,1OO,=fj)=$$Z0-2[-@,K,K,Mfj)}}225=3LMH GtT'';6 ,,&.44N&M% ''X5F5F5J5J5L5V5V5Xdj(klQ&-5M*+-M(##{2#==q!4L5(99L+44Z@(----//=l8=T  UJ  K  SW  X
 ggmS-:S:S%T^c]dge%%(D(DDpq|  rH  rH  qI I^^k^z^z]{ |[\ dhi
 &++-K$$& %""$% % %K"/";";,55!.!9!9!.!9!9%2%A%A"1>1M1MC,,-Sn 	&#+#Ms=3L3L/M !'#/ '4'E'E$'7$  " 		 6)  H  IW  HX  Xb  c  dbc%%!++11{'>'>?):+1 ,L k888((*!YY'_{G^G^'_`
::)hmm.A.A.Ccoo.U$\N 3..8\9L[MdMdLe faala{a{`| }!!$ : ;~	@ $\N 3..8\9L[MdMdLe faala{a{`| }]^_ 	!!+"9"9:;>>""g    	QRXQYZbfg	~% %"	 	s#   V W
W%WWWc                 R    | j                  d      dk(  r| j                  |       y y )NT)r?  r
   )rK  landing_page2license)r   r<  s     r5   r  z CmfLicense._new_license_menu_fix  s(    99T9*a/$$T* 0r7   c                 t   t         j                  j                  dg      }dddd}|j                  ||      }|dk(  r+d|_        d|_        d|_        d|_        d|_        d|_        nv|dk(  r2d|_        d|_	        d|_
        d|_        d|_        d|_        d|_        n?d|_        d|_        d|_	        d|_        d|_        d|_        d|_        d|_
        d|_        d|_        d|_        d|_        t        j!                         5  |j#                          d d d        t%        |       y # 1 sw Y   xY w)	Nr   r6  r   r   r   )eva24evawiki
evaprojectTF)rC  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   r<  global_settingscode_mappings       r5   r  zCmfLicense.landing_page2license  sP    2266se6D "*i|\d+<04O-37O026O/26O/59O248O1Y04O-04O-48O16:O327O/27O/5:O2 15O-37O004O-26O/26O/59O248O148O16:O338005-,1)   " 	#  "	#. 	$/	# 	#s   	D..D7c                 f    t         j                  j                  dg      }|j                          y )Nr   r6  )rC  r  r,  r  )r   r  s     r5   patch_global_settingsz CmfLicense.patch_global_settings)  s.     !2266se6DR 	r7   c                     | j                   t        j                  j                  j	                         k  rd| _        y d| _        y )Nexpiredr8  )r4  cmfr7  CmfDater  r3  r4   s    r5   _calc_lic_statuszCmfLicense._calc_lic_statusx  s1    szz115577'DO&DOr7   c                 J   | j                   sd| _         | j                  j                  s,| j                  j                  s| j                  j                  rd| _         | j
                  dk(  rd| _         y | j                  r| j                  r| j                  r| j                  j                  j                         | _        	 t        j                  | j                  j                  | j                  j                  | j                  j                        }t        d       d| _         y y y y y # t        j                  t        j                  f$ rR}| j                  j                  xs | j                  j                  }t        d|j                   |       Y d }~y d }~ww xY w)N
not-activer   r8  )r   r1   r   u9   Лицензия успешно активирована.u.   Неверный ключ активации: r  )r2  r  
is_changedr   r   r+   r  stripr   r   rj  rV   r   r  )r4   _activation_coder  r  s       r5   _calc_activation_statusz"CmfLicense._calc_activation_status  sZ   %%%1D"??%%)=)=)H)HDL`L`LkLk%1D"}}& *2&T%9%9d>R>R'+';';'A'A'G'G'I$
6'5';';(,(<(<(B(B#44dFZFZF`F` (< (b$  Y[ .6D* ?S%9 Ml" '11>3U3UV f 00;;Yt?Y?YE NqvvhW_deefs   AD- -#F"AFF"c                    d}| j                  |      }t        j                  j                         }| j                  dk(  r;| j
                  |d   v r"|d   | j
                  = | j                  ||       d | _        y | j
                  |d   vrm|d   r	 |t        j                  d      z   }|j                         |j                         d|d   | j
                  j                  <   | j                  ||       n2t        j                  j                  |d   | j
                     d         }||kD  r||z
  j                  nd	| _        y )
Nr  r8  
activation	corrupted<   rZ   )r  r  r  r   )r  rm   rn   ro   r2  r)   r  r  rr   r  r  r  r[   )r4   r  r  ro   r  s        r5   _calc_activation_days_leftz%CmfLicense._calc_activation_days_left  s2   !!!$##%!!X-5#66,'(8(89!!!U+(,D%u\'::% 8#5#52#>> ( 2 2 4%//BS?Ul#D$4$4$:$:;!!!U+#==66u\7J4K[K[7\]g7hiCKeCSE)9(?(?YZD%r7   c                 4   | j                   dk(  rd}nV| j                  dk7  rEt        j                  j	                         | j
                  t        j                  d      z   k  rd}nd}| j                  dk(  xs | j                  }|r
|rd| _	        y d| _	        y )Nr8  Tr   r   rZ   Freadonly)
r3  r+   rm   rn   ro   r4  rr   r2  r  r1  )r4   not_expiredactivation_oks      r5   _calc_statuszCmfLicense._calc_status  s    ??h&K]]f$)<)<)>ARARU]UgUgmoUpAp)pKK..(:Wd>W>W="DK$DKr7   c           	         | j                   j                  sY| j                  j                  sC| j                  j                  s-| j                  j                  s| j
                  j                  sy | j                   sd | _        d | _        y | j                  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                             | j                  r|j                  d| j                          n|j                  d       | j                   dk7  s| j                  dk(  r|j                  || j                            |j                  || j
                            | j                  dk7  r|j                  || j                            d j                  |      | _        | j                  | _        y )!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%   r]  120)r"   r#   r$   AUNLIMr   r    r$   rl   )r)   r  r,   r(   r+   r-   lic_coder  load_fieldsrI  rH   )r4   partsru   rx   rz   ry   s         r5   _calc_lic_codezCmfLicense._calc_lic_code  s   ''))""--}}'')) DMDIbc'!/!"	
  	

 

 
 	]4#3#345 LL1T00123LL!x'4==K+G LLDMM23\$//23??k)LLdoo67MM	r7   c                 P   | j                   rY| j                  j                  sC| j                  j                  s-| j                  j                  s| j
                  j                  sy | j                  r| j                  r| j
                  sd | _         y 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| _         y )NuG   Система управления предприятием EvaProjectr  r    zEducation Editionu1    для образовательных целейr   zEcoSystem Editionz Editionu    на u    пользователейuT   , без ограничений по количеству пользователейr$   u    бессрочно,uH   Право использования программы для ЭВМ "uI   " на условиях неисключительной лицензииz ( rF   uE   , свидетельство 2023662166, номер 18285 в ЕРРП)textr)   r  r(   r,   r/  r+   )r4   	prog_nameedu_txtproduct_name
user_limit
unlim_textperpetual_texts          r5   
_calc_textzCmfLicense._calc_text   s<   99  ++&&11??--==++  T__DI ^	==K'.LIG).L"../x8L!$"5"5!66QRJJJoJ??k)3NN YYbXc  dm	<.Admm_An=Mj\ ZUX 		r7   c                       e Zd ZdZy)CmfLicense.StateErroru   Ошибка состоянияNrQ   rU   r7   r5   
StateErrorr>  '  s    -r7   r?  c                     ddl m} |j                  | d d |j                  | dd        }t	        |t
              r|j                  |      S t	        |t
              r|j                  |      S y )Nr   )AESr   i)Crypto.CipherrA  newMODE_CFBr   bytesencryptdecrypt)kiorA  crypts        r5   	__st_convzCmfLicense.__st_conv*  s^    %#2ag6a==##5!==## "r7   c                    |dk7  ry t         j                  j                  ddgd      }t         j                  j                  |j                        }|j
                  r|j                  rt         j                  j                  ddd      j                  }t        j                  | | |j
                   j                               j                         }	 t        j                  |j                  j                  d	      }| j#                  ||      }	 t$        j'                  |      }|S d}	|j
                  d}	|	i d d g ddS # t        $ r | j!                  d
      w xY w# t        $ r | j!                  d      w xY w)Nr  cmf_ver_cookie
cmf_cookieTr7  TECHCOM_nocachegs_idanonymous@evateam.rur<  r?  rQ  validater
   rJ  r   F)r  r  r  )r  r  r   )rC  r  r,  fix_gsidrF  rN  rO  r  r   r  r   r  base64	b64decoder  rt   r?  _CmfLicense__st_convjsonloads)
r   r   gsrS  p_idkey	encrypted	decrypteddatar  s
             r5   __lic_st_getzCmfLicense.__lic_st_get3  s~   9%%))2BL1Qcg)h((111>##''-CUYko'pssD,,%r/@/@.ABIIKLSSUC(",,R]]-@-@4P	 cY7I(zz), 	( I" ! 
 	
  (nnQ''(  (nnQ''(s   +E
 E( 
E%(Fc                 ^   |dk7  ry t         j                  j                  ddgd      }t         j                  j                  |j                        }||j                  k7  r#t         j                  j                  ddgd      }|j
                  r|j
                  dz   nd|_        t         j                  j                  ddd	      j                  }t        j                  | | |j
                   j                               j                         }t        j                  |      j                         }| j                  ||
      }t        j                  |      j!                         |_        t$        j'                         5  |j)                  d       d d d        y # 1 sw Y   y xY w)Nr  rN  rO  TrP  rR  r
   rT  rU  )rI  	only_data)rC  r  r,  rY  rF  rN  r  r   r  r   r  r]  dumpsr\  rZ  	b64encodedecoderO  r  r  r  )	r   r   rd  r_  rS  r`  ra  data_strrb  s	            r5   __lic_st_setzCmfLicense.__lic_st_setZ  sb   9%%))2BL1Qcg)h((111>BEE>))--6F5Ugk-lB575F5FB--1A##)?QUgk#loolleWTF2+<+<*=>EEGHOOQ::d#**,MM#M2	((3::<  " 	$GGdG#	$ 	$ 	$s   F##F,c           	      "   d }t         j                  j                         }t        j                   | }t        j                  |j                               j                         } ||dd       dd ||dd       dd ||dd       d}|S )Nc                 2    t         j                  | dd      S )Nr  Fr  )rv   r  )ds    r5   	bytes2intz1CmfLicense.get_activation_hwid.<locals>.bytes2intp  s    >>!Xe><<r7   r   r   05drl   r   r   )	rC  r  rY  r-  r.  r   r  r   r  )r   rq  rS  r   
hash_byteshwids         r5   r   zCmfLicense.get_activation_hwidl  s    	= ((113001%9\\!((*-446
JqO,S19Z!_3Mc2RRST]^hijkl^mTnorSstr7   c                     | j                   r| j                  t        j                  k7  r+| j	                         | _         t        j                  | _        y y r/   )r   
lic_domainr-  r.  r   r  s    r5   _calc_activation_hwidz CmfLicense._calc_activation_hwidy  s@    ##t&:[:['[#'#;#;#=D $??DO (\r7   c                 *    t         |          g dz   S )N)r3  r2  r1  r  r/  r4  r5  r   r5  r)   rv  r(   r,   r  r+   r  r   )supersave_preload_fields)r4   rI   s    r5   rz  zCmfLicense.save_preload_fields~  s     w*, 0q q 	qr7   c                 P   | j                   j                  rd | _        d| _        | j	                          | j                          | j                          | j                          | j                          | j                          | j                          | j                  rn| j                  s7| j                  j                  t        j                  j!                                | j"                  s| j"                  j%                         | _        | j                  j                  s| j&                  j                  r#t)        t        j*                  j,                         t/        | `  |i |}| j2                  j                  s| j                  j                  rt5        dd        |S )Nr  r  )r  r  r   r2  r2  r<  rw  r  r  r  r  rV  r5  rI  rC  rD  
user_grouplic_start_dater  r(   schedule_deferred_jobr   recalc_users_countsry  r  r1  cmf_emit_server_event)r4   r  kwargsretrI   s       r5   r  zCmfLicense.save  s6   ??%%#'D %1D"""$$$&'');;##  ''(=(=(H(H(JK&&&*&9&9&=&=&?#&&$*=*=*H*H!&"3"3"G"GHglD+F+;;!!T%5%5%@%@!"6= 
r7   c                     g | _         t        t        j                  j                         t        |   di | t        dd        y )Nr  rU   )r5  r~  rC  r   r  ry  r  r  )r4   r  rI   s     r5   r  zCmfLicense.delete  s9    f//CCD  2D9r7   z@dailyr   )	only_once
system_jobschedulepriorityc                  2   dt         j                  fd} i }t        t              }j	                  g d      D ]T  t        j                        |<   j                  D ])  }|t        |j                           j                         + V d|v }t        t              }g }d}d}t         j                  j                  g dg dgd	gj                  j                         |||z   gd
g      x}	rO|t        |	      z  }|	D ]  t               }
j                   D ]1  }|j#                  |j                        }|s!|
j%                  |       3 g }|rd|
v rNt'        fdj                  j                         D              r|dxx   dz  cc<   |j)                  |
f       nt+        fdj                  j                         D              s|j-                  j                  j                                nxd}j                  j/                         D ]D  \  }|
v rt1        |      r|xx   dz  cc<   $d}'t1        |      s4|j)                  |       F |r|j)                  |
f       |swt         j                  j#                  j2                        |D ]  }t5        |d        t6        j9                  dd|rdn| d        j;                  d        |          t         j                  j                  g dg dgd	gj                  j                         |||z   gd
g      x}	rOt=                |j/                         D ]  \  |   _        j;                          ! t=                fd}|D ]l  \  }
d}t         j                  j#                  j2                  g j                  j                               |
D ]  |    |       sd} |sf |         n t=                y)u   
        Запускаем при изменении лицензий и ежесуточно, для пересчёта статусов и актуализации счётчиков.
        r   c                  6     dz    dz  dk(  rt                y y )Nr
   r^   r   )
cmf_commit)bulk_commit_counts   r5   bulk_commitz3CmfLicense.recalc_users_counts.<locals>.bulk_commit  s%    " 2%* +r7   )r  r5  r)   r1  r4  r(   r6  r   rb   r  )does_not_workr<   Fr  r  )r>  r7  sliceorder_byc              3   6   K   | ]  }t        |        y wr/   r=   r@   rq  s_persons     r5   rB   z1CmfLicense.recalc_users_counts.<locals>.<genexpr>  s     m) <m   r
   c              3   6   K   | ]  }t        |        y wr/   r=   r  s     r5   rB   z1CmfLicense.recalc_users_counts.<locals>.<genexpr>  s     #qYGHi$@#qr  FT)rF  recalc_users_counts(): %szClear Ecoz license on rg  c                     j                   j                        } | rt        |       ryj                  j                  k  r͉xj                  dz  c_        j                  d       t        j                  dd d dj                   d	j                          | rt        | d       nMd
k(  r-j                   j                         D ]  }t        |d        nt        dt        j                         j                  d       yt        j                  ddj                   dj                   d        y )NFr
   Trg  r  Add  license to , count /r   zInvalid productzLicense(z) user limit(z) exceeded on )ro  r,  r>   r  r(   r  r  r  setattrrp  rt   r   r)   )rq  
lic_field2r   licensepersonrS  s     r5   take_licensez4CmfLicense.recalc_users_counts.<locals>.take_license  s<   --11':I WVY7!!G$:$::""a'"t,/7)<xx@R@R?SSTU\UkUkTlmo FIt4(&)&;&;&B&B&D :

D9: %%6A]A]^^d+LL+7../}W=S=S<TTbcibjkmr7   )rF  r7  N) rC  r   r   r  r  rw   r)   r5  r<  addrv   r  rG  ro  rp  r   r  r,  rH  allrI  anyextenditemsr>   rF  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_licenserq  r  takenr  r   r  r  rS  r  s                     @@@@@@r5   r  zCmfLicense.recalc_users_counts  s6    	 #xxo   q 	2G'--.G 'HW ,, 2C

O$((12		2 X%&s+	 %..4413PQ&H)>)>)E)E)GH"K	$9:FVEW 5 Y Yl Y 3|,,K( '""%%'44 ?G%(WWW\\%:N%'..~>? (*$?2mcNcNcNjNjNlmn,X6!;6$)00(O1LM"#qRURgRgRnRnRp#qr$,33C4I4I4P4P4RS#(L030E0E0K0K0M C,)"o5&x; 0 9Q > 9/3$Xy9077	BC $)00(O1LM'#--11X[[1AF%9 :		59:LL3 &6J K<X^W_`b KK$K/MO'" %..4413PQ&H)>)>)E)E)GH"K	$9:FVEW 5 Y Yl Y\ 	 !) 0 	GW!1'!:GLLN	 		m4 *; 	%HoE%%))X[[Ab3CXCXC_C_CaAb)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                 R    | j                         }|j                  |j                  v S r/   )rW  rF  r  )r   r  rO  s      r5   is_license_groupzCmfLicense.is_license_group7  s%      "xx53333r7   c                       fd} j                  dddd|j                  ggg d      }|sy j                  dd	g j                  j	                                j
                  rj                  ry j                  }|D ]  j                  d
k(  rt        fd j                  j	                         D              s@j                  j                  k  r j                  j	                         D ]  }t        |d        xj                  dz  c_
        j                  d       t        j                  ddj                   d dj                   dj                           |         j                  j                     }t!        |      rj                  j                  k  rvt        |d       xj                  dz  c_
        j                  d       t        j                  ddj                   d dj                   dj                           |         j                  r|sj                  d       t#        t$        j&                  j(                         y )Nc                     t         j                  dk(  r(t        dj                   dj                   dd       j                         } dj                   d}| j                  d	k(  rIt        j                  j                         j                  k  rdj                   d
j                  dd}t        dj                   d| d       y )NzCmfPerson.createu@   Невозможно создать учётную запись uK   . Превышен лимит пользователей лицензии "u   ". Необходимо расширить лицензию или ограничить количество пользователей с доступом к лицензии.Tr  u#   Для учётной записи uE    функционал продукта будет ограничен.rB  u2    функционал продукта после ra  u    будет ограничен.uI   Превышен лимит пользователей лицензии "z". u;    Необходимо расширить лицензию .)rb  
api_methodrj  loginr)   rW  r  rm   rn   ro   r  )rO  limit_date_infor   r  r9  s     r5   user_limit_alertz6CmfLicense.take_user_license.<locals>.user_limit_alert?  s     ||11VW[WaWaVb caahatat`u vEF 	  $$&E CDJJ<  PU  VOzzX%==&&(3??:=djj\ J''*x&@@_a $ [\c\o\o[p q#$$_abr7   r5  EXISTSrF  r<   )r  r(   r)   r  rd  r  r   c              3   8   K   | ]  }t        |         y wr/   r=   r@   rq  r9  s     r5   rB   z/CmfLicense.take_user_license.<locals>.<genexpr>a  s     eGD)44es   Tr
   rg  ztake_user_license(): %sr  r  r  r  )r  rF  r0  ro  rp  rd  r  r  r)   r  r  r(   r  r  r  r  r>   r~  rC  r   r  )r   r9  r  r  r  was_changedrq  r  s   ``     @r5   take_user_licensezCmfLicense.take_user_license<  sF   	b. 88!8dC-BCB  D ,Y#:O:O:V:V:XYZ$"4"4oo 	+G""h.ecF[F[FbFbFdef))G,B,BB),)>)>)E)E)G ;I#D)T:;**a/*t45"7#6#6"7|D6 J&&-&8&8%97;Q;Q:RTU
 )*11'2E2EF	tY/))G,B,BBi6**a/*t45"7#6#6"7|D6 J&&-&8&8%97;Q;Q:RTU
 )*5	+: ??;III%f//CCDr7   c                    | j                  dddd|j                  ggg d      }j                  g | j                  j	                                j
                  }|D ]`  }|j                  dk(  rt        fd| j                  j	                         D              s@|xj                  d	z  c_        |j                  d
       | j                  j	                         D ]  }t        |d        t        j                  dd d|j                   d|j                          | j                  |j                     }t        |      st        |d       |xj                  d	z  c_        |j                  d
       t        j                  dd|j                   d d|j                   d|j                          c j
                  r|sj                  d
       t        t         j"                  j$                         y )Nr5  r  rF  r<   )r  r)   r(   r  r   c              3   6   K   | ]  }t        |        y wr/   r=   r  s     r5   rB   z2CmfLicense.release_user_license.<locals>.<genexpr>  s     aYi0ar  r
   Trg  Fzrelease_user_license(): %szRemove EvaEco license from r  r  Remove  license from )r  rF  r0  ro  rp  r  r)   r  r  r  r  r  r  r(   r>   r~  rC  r   r  )r   r9  r  r  r  r  rq  s    `     r5   release_user_licensezCmfLicense.release_user_license  s    88!8dC-BCB  D 	:300779:;oo 	QG""h.a#BWBWB^B^B`ab&&!+&LL4L0%(%:%:%A%A%C 8	i78LL45dV8GDVDVCWWXY`YoYoXpqs  11'2E2EF	4+D)U3&&!+&LL4L0LL4!'"5"5!6nTF K"")"4"4!5Qw7M7M6NPQ!	Q, ??;III%f//CCDr7   c                    j                  g | j                  j                                t        fd| j                  j                         D              sy | j	                  g d      }|sy |D ]H  }|j
                  dk(  r|xj                  dz  c_        |j                          | j                  j                         D ]  }t        |d        t        j                  dd|j
                   d	 d
|j                   d|j                          | j                  j                  |j
                        }t        |      st        |d       |xj                  dz  c_        |j                          t        j                  dd|j
                   d	 d
|j                   d|j                          K y )Nc              3   6   K   | ]  }t        |        y wr/   r=   r  s     r5   rB   z7CmfLicense.release_all_user_licenses.<locals>.<genexpr>  s     ]GD),]r  )r5  r  r)   r6  r   r
   Fzrelease_all_user_licenses(): %sr  r  r  r  )r0  ro  rp  r  r  r)   r  r  r  r  r  r(   r,  r>   )r   r9  r  r  rq  s    `   r5   release_all_user_licensesz$CmfLicense.release_all_user_licenses  s   
 	:300779:;]c>S>S>Z>Z>\]^88#O8P   	QG""h.""a'"!$!6!6!=!=!? 4ID)U345g112. G%00173I3I2JLM
  1155g6I6IJ	4+D)U3&&!+&LLNLL9!'"5"5!6nTF K"")"4"4!5Qw7M7M6NPQ!	Qr7   c                      y r/   rU   )r   _argsr!  s      r5   r   z!CmfLicense.public_list_hack_empty  s     	r7   c                 *   dj                  g d      }t        j                  dj                               j	                         }t        j                  |d      }| j                  ||      }t        j                  |      }|j                  |      S )Nr  )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A+p6V7I=zRegMapEncKey__cvvnsdfjh4!4566TrV  rX  )rH   r   r  r   r  rZ  r[  r\  r]  r^  r,  )r   r1   rmra  reg_map_encryptedreg_map_binreg_maps          r5   r  zCmfLicense._compat_regnum  s    f WW K KZ ll:AACDKKM",,R$?mmC+<m=**[){{6""r7   r/   )r9  zmodels.CmfPersonr   )NN)FrJ   rR   rS   rT   r	   r   r   r   api_methodsremoverm   rn   rN  rM  rL  r  r  r  	dataclassr  r   on_server_eventr"  r#  r  r   r   r/  rW  rZ  rm  rr  r  r  r   r   r   r  r   r  r   r  r  r	  r  r  r  r  r2  r<  	Exceptionr?  r\  r  r  r   rw  rz  r  r  cmf_deferred_jobr  ro  r  r  r  r  r   r  __classcell__)rI   s   @r5   r   r     s    F#N((44 8 K x  %x}}T1a0#hmmD!Q/OtQ*J$x}}T1a0(--b!,K& & &$ 12" 3 " !%J$% % C C
 ~ ~@  < BD BDH   K KZ  8 ,
 ,
\ ::&abF F, I I }# }#~ + + ?  ? B L L\'68[*%"="~%XN.Y . $ $ $
 $
L $ $" 
 
@
qB: STU| V |@ ' .   4 4 AE AEF  E  ED Q QB   C# C#r7   r   c                     | dk(  ry y )Nr  rU   )license_codes    r5   r  r    s    y  !r7   )rZ  r  rm   r   r  r   collectionsr   typingr   cmf.includecommon.models.cmf_active_entityr   modules.settings.fieldsr   r	   r   r   r  rU   r7   r5   <module>r     sZ          #   ; /c cL	{ {|Z#'' Z#z6r7   