U
    Mg(                    @   s   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 dZG d	d
 d
ZG dd dejZdd ZdS )    N)defaultdict)Optional)*)CmfActiveEntity)cmf_licensec                   @   s   e Zd ZedZedZ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
d2eeeejeeed$d%d&Zd'd( ZG d)d* d*eZd+d, Zed3d.d/Zed0d1 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                        )r   r   r   r   r   r   r   r   r   r	   r
   r   r   r   r   r   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                 C   s@   || _ |	| _|
| _|| _|| _|| _|| _|| _|| _|| _	d S N
regnumcs_match
reg_formatr%   r&   r'   r(   r)   r*   r+   )selfr%   r&   r'   r(   r)   r*   r+   r.   r/   r0    r2   (./modules/settings/models/cmf_license.py__init__O   s    
zRegNum.__init__c              	      sB   ddddddddd	g	}d
  fdd|D } jj d| dS )Nr.   r%   r&   r'   r(   r)   r*   r+   r/   , c                 3   s0   | ](}t  |d k	r| dt  | V  qd S N=getattr.0Zparamr1   r2   r3   	<genexpr>i   s     z"RegNum.__repr__.<locals>.<genexpr>()join	__class____name__r1   paramsZ
params_strr2   r<   r3   __repr__e   s           zRegNum.__repr__c                   @   s   e Zd ZdZdS )zRegNum.ParseErroru=   Неверный формат кода регистрацииNrC   
__module____qualname____doc__r2   r2   r2   r3   
ParseErrorm   s   rK   c                 C   s  d| _ d| _| jsd| _| j s$d| _ | jd kr4d| _| js@d| _| jsLd| _| jsXd| _| jstj	 }|j
}|j}|dkrd}|d	7 }|d	7 }t||d	tjd	d
 | _| jd}| jd}| jdk rtd| jnr| jdkr| j}n`| jdkrd| jd  }nD| jdkr$d| jd  }n(| jdkr@d| jd  }ntd| jd| d}| j| jkrrtd| j| j| j }t|dd  d | d}	tt|d }
| j | jkrtd| j | j| j  }| j| jkrtd| j| j| j }| j| jkrtd| j| j| j }|d > |d!> B |B }|| jd" A d#A d}| | |	 |
 | }| |}| d$| d$|	 d$|
 d$| d$| | _| jS )%Nr   2   r
   i90  r    r"      r   r   daysz%y%mZ06dr&     i'  
   i< p  d   iX> X       04dr'   M    r)   ZperiodZ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_csr.   )r1   r`   ra   rb   yymmZd1r&   Zd2Z
product_idZd3Zd4	type_codeperiod_codedeploy_codeZ	type_packZd5cs_strZd6r2   r2   r3   generatep   sr    





(zRegNum.generateTc                    s  d fdd} fdd} fdd} fdd} fd	d
}d d d d | j rdtd dd d d d  d  d  d  }d }	n| jr>dtd dd d d d d  d  d  d  d  }d }	n d ||	k}
|rp|
sp d| }| }| }| \}}} |
||||||d
S )Nc                    s   |    S r,   )match)Zexp)rs   r.   r2   r3   check_match   s    
z!RegNum.parse.<locals>.check_matchc                     sh   t dkr ddt  } | dkr:| d d } n*| dkrP| d d } n| dkrd| d d } | S )	NrV   r   rT   rU   rR   rS   rP   rQ   )rg   rK   )limit)clsob_user_limitr.   r2   r3   deob_user_limit   s    z%RegNum.parse.<locals>.deob_user_limitc                     sL   dkrd } nd } t d |  }| jkrB d| j| S )N5rQ   rU   rY   r   )rg   rf   rK   )Zcontract_id_partproduct_code)rv   r%   
ob_productr0   r.   r2   r3   deob_product   s    

z"RegNum.parse.<locals>.deob_productc                     s   d krdS t d A dA } | d@ }| d@ d? }| d@ d? }| jkrX d	|| jkrp d|| jkr d
| j|  j|  j| fS )N)r   r    r"   r[   r\      p   r   i  r   r   r   )rg   ri   rK   rj   rk   )Zdeobrn   ro   rp   )rv   r%   ob_typer.   r2   r3   	deob_type   s    


zRegNum.parse.<locals>.deob_typec                     sz   t d } d| d  }| d }|dk s4|r4|dkrD d|||dkrXd}|d7 }|d7 }t||dtjdd	 S )
NrZ     rS   i  rM   r   r   r   rN   )rg   rK   r^   r_   rc   )rm   ZyyyyZmm)rv   ob_yymmr.   r2   r3   	deob_yymm   s    zRegNum.parse.<locals>.deob_yymmry   r   rQ   r   r   r   r   6r   r   r   r-   )_REGNUM_5_RErg   _REGNUM_6_RErK   rl   )rv   r.   check_csrt   rx   r|   r   r   rq   csr/   r&   r'   r(   r)   r*   r+   r2   )	rv   r%   rs   r{   r   rw   r   r0   r.   r3   parse   s^    
$
,
       zRegNum.parsec                 C   s4   t |   }t| }|ddd }|S )NZ08dr   r   hashlibmd5encodeZ	hexdigestzlibcrc32sr   r   r   r2   r2   r3   rl   ,  s    zRegNum._calc_cs)
NNNNNNNNNN)T)rC   rH   rI   recompiler   r   rf   ri   rj   rk   rg   rh   r^   r_   r4   rF   re   rK   rr   classmethodr   staticmethodrl   r2   r2   r2   r3   r      s   

            Irr   c                   @   s   e Zd ZedZdeeeej	eeedddZ
dd ZG dd	 d	eZG d
d deZdZdZdZedddZedd ZdS )ActivationCodez:^(\d{6,})-(\d{6})-(\d{5})-(\d{5})-(\d{5})-(\d{5})-(\d{4})$Nr$   c                 C   sX   |	| _ || _|| _|| _|| _|| _|| _|| _|| _|
| _	|| _
|| _|| _|| _d S r,   )r/   r.   r%   r&   r'   r(   r)   r*   r+   scs1scs2scs3scs4activation_code)r1   r%   r&   r'   r(   r)   r*   r+   r.   r/   r   r   r   r   r   r2   r2   r3   r4   B  s    zActivationCode.__init__c                    sL   ddddddddd	d
ddddg}d  fdd|D } jj d| dS )Nr   r   r   r   r   r.   r%   r&   r'   r(   r)   r*   r+   r/   r5   c                 3   s0   | ](}t  |d k	r| dt  | V  qd S r6   r8   r:   r<   r2   r3   r=   e  s     z*ActivationCode.__repr__.<locals>.<genexpr>r>   r?   r@   rD   r2   r<   r3   rF   `  s&               zActivationCode.__repr__c                   @   s   e Zd ZdZdS )zActivationCode.ParseError9   Неверный формат кода активацииNrG   r2   r2   r2   r3   rK   i  s   rK   c                   @   s   e Zd ZdZdS )z"ActivationCode.RegnumMismatchErrorr   NrG   r2   r2   r2   r3   RegnumMismatchErrorl  s   r   )r   	   r   r   r   r   r      r   r   r   rQ   rM   )r   r   r   rQ   r   r   r}         r   r   rM   r   r   r   r   )rM   r   r   rQ   r   r      r      r}   r   r   r   r   r      r   r   r   Tc           "         sB  |st  }t|tr t|} j|}|s< |dt	|d d|rf|j
krf ||d|d }|d }|d }|d }	|d }
|d  |d  |d  |d  |d  |d  | }|d	 } ||k}|r|s |d fd
d}||}|r&|j|kr& ||d||}|d? d@ }|d@ }|tjkrZ |dtj| }|r|j|kr ||d|d7 }tjd|d  d|d  ddtjdd }|r|j|kr؈ ||d||}|d? d@ }|d? d	@ }|d	@ }|s |s |s d }d }d }n|tjkr8 |dtj| }|rb|j|krb ||d|tjkrz |dtj| }|r|j|kr ||d|tjkr |dtj| }|r|j|kr ||d	||	}|d? }|d@ }||
}|d? } |d@ }! |o"|j||||| |!||||||dS )Nr   r   rQ   r   r   r   r   r   r   c                    s  t | d}t| dkrN j}|dk s,td|d A dA }|dk stdnt| dkr j}|dk sptd	|d A d
A }|dk stdnVt| dkrֈ j}|dk std|d A dA }|dk stdntdt|  d}tt|D ] }|d|> @ r|d|| > O }q|S )NrQ   r   r[   Zob_int_val_4i  Z	int_val_4r   i   Zob_int_val_5il  Z	int_val_5r   i   Zob_int_val_6i Z	int_val_6Z	deob_int_r   r   )rg   len_m13AssertionError_m16_m19re   range)r   Z
ob_int_valtableZint_valresultbrv   r%   r2   r3   deob_int  s,    
z&ActivationCode.parse.<locals>.deob_intr}   i  r   rM   )ra   rb   ZdayrN   r      )r.   r/   r   r   r   r   r   r%   r&   r'   r(   r)   r*   r+   )
CmfLicenseget_activation_hwid
isinstancerh   r   r   _ACT_CODE_RErs   rK   rg   r%   r   rl   r&   rf   r'   r^   r_   rc   r(   ri   r)   rj   r*   rk   r+   r.   )"rv   r   r.   activation_hwidr   rs   rw   Zob_product_monthsZob_type_period_deployZob_scs12Zob_scs34rq   r   r/   r   r&   Zproduct_monthsrz   Zmonthsr'   r(   Ztype_period_deployrn   ro   rp   r)   r*   r+   Zscs12r   r   Zscs34r   r   r2   r   r3   r   s  s    

8
,



          zActivationCode.parsec                 C   s4   t |   }t| }|ddd  }|S )NrW   r   r   r2   r2   r3   rl     s    zActivationCode._calc_cs)NNNNNNNNNNNNNN)NNT)rC   rH   rI   r   r   r   rg   rh   r^   r_   r4   rF   re   rK   r   r   r   r   r   r   r   rl   r2   r2   r2   r3   r   4  sD   
                  	vr   c                       s@  e Zd ZU dZeZeZejjddddg Ze	d e
ddd	Ze
d
dd	Ze
d
dd	Ze
ddd	Ze
d
dd	ZejG dd dZdZeed< edd Zedd Zedd Zedd Zed^ddZedd ZedZed_d d!Z ed"d# Z!ed`d$d%Z"edad&d'Z#ed(d) Z$d*d+ Z%d,d- Z&d.d/ Z'd0d1 Z(d2d3 Z)d4d5 Z*G d6d7 d7e+Z,e-dbd8d9Z.ed:d; Z/ed<d= Z0ed>d? Z1d@dA Z2 fdBdCZ3 fdDdEZ4 fdFdGZ5e-e6dddHdIdJdK Z7dLdMdNdOdPdQdRdSZ8edTdU Z9edVdW Z:edXdY Z;edZd[ Z<ed\d] Z=  Z>S )cr   uA   
    Приобритённые и демо-лицензии
    apply_regnum
apply_demonew_license_infopublic_list_hack_emptyZcreatei  r   r   i  r   r   r   c                   @   s   e Zd ZU ejej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dZeed< dZeed< dZe
ed< ejedZeed< dZeed< dS )zCmfLicense._LicCacheData)default_factory	timestampNmodeadmin_group_idlicensesproductsactive_productsproduct2licensecompat_warncompat_lockactivation_warnactivation_productsactivation_days_leftexpired_warnexpired_productsexpired_days_left)rC   rH   rI   dataclassesZfieldtimer   float__annotations__r   rh   r   r   listr   setr   r   dictr   r   boolr   r   r   rg   r   r   r   r2   r2   r2   r3   _LicCacheData  s   
r   N
_lic_cachec           
      C   s  | j r t | j jd k r | j S |  }| j r6| j jnttj j	|_| j
dddddddgd	|_d
}dd |jD |_d|jkr|D ]}|jd |j|< qdd |jD |_d|jkr|j| dd |jD |_d|jkr|j| tj }|jD ]}|jd krq|j| }d }|jdkr<|jdkr^d}n"|jdk rNd}n|jdkr^d}|r|j|j |dks|js||_|jd k	rt|j|jn|j|_q|jD ]F}|jd krƐq|j|j |jd k	rt|j|jn|j|_q|jd k	r|jdk rd|_n&|jd k	r:|jdk r:d|_nd |_tj !ddkoltj !ddkolt"j#dk}tj$j%ddd gd!d" }	|rd#|_&nx|	rd$|_&njd%|_&tj }|| j'krd |_(d!|_)n@|| j*krd|_(d&|_)n&|| j+kr d|_(d&|_)nd |_(d&|_)|| _ |S )'N<   statusactivation_status
lic_statusr'   r)   lic_end_dater   fields)r	   r   r   r   r   r   r   c                 S   s   i | ]}|j |qS r2   r'   r;   licr2   r2   r3   
<dictcomp>:  s      z+CmfLicense._check_cache.<locals>.<dictcomp>r
   c                 S   s   h | ]}|j d kr|jqS )active)r   r'   r   r2   r2   r3   	<setcomp>?  s     
 z*CmfLicense._check_cache.<locals>.<setcomp>c                 S   s   h | ]
}|j qS r2   r   r   r2   r2   r3   r   C  s     r   r   userr      adminrQ   rL   	containerZlxcZEVA_DEPLOY_TYPEz	cloud-lxcz.evateam.rucodeZLIKEz%eva%T)filterinclude_deleteddisabledfullcompatF),r   r   r   r   r   rh   modelsCmfPersonGroupadmin_groupidslistr   r   r   updater   r^   r_   r`   r   r)   rO   r   appendr'   r   r   minr   r   r   osenvirongetconfigAUTH_SESSION_COOKIE_DOMAINr   countr   
_LOCK_DATEr   r   _USER_WARN_DATE_ADMIN_WARN_DATE)
rv   cacheZeco_productsproductr`   r   Z	time_leftr   Zis_cloudis_newr2   r2   r3   _check_cache%  s    
     








zCmfLicense._check_cachec                 C   s~   t j}| j D ]}t||r dS q|  }|jt jkr>dS |jdkrLdS |jdkrz|j	s`dS |j
rztj | jk rzdS d S )NTr   r   )gcurrent_userPERSON_LIC_FIELDSvaluesr9   r   r   current_person__member_ofr   r   r   r^   r_   r`   _UNLIM_DATE)rv   r   	lic_fieldr   r2   r2   r3   license_ui_access  s    


zCmfLicense.license_ui_accessc                 C   s  t jjsd S |  }|jdkr"d S d}|jdkr<|js<dt _|jdkr|jsd}|jdkrj|jt j	krjd}|jdkrxd}|rt
jjjd	t jj d
|ddrtd| jdd d}|jdkr|jt j	krd}|jdkrd}|r$t
jjjdt jj d
|ddr$tdd|j d|j d d}|jdkrF|jt j	krFd}|jdkrVd}|rt
jjjdt jj d
|ddr|jdk rtdd|j d n tdd|j d|j d d S )Nr   Q r   Tr   Fr   r   z*CmfLicenseUser.license_api_notify__no_lic_1exZnxuE   Требуется установить лицензию. После %d.%m.%Yu{    функционал продукта будет ограничен. Обратитесь к Администратору.z'CmfLicenseUser.license_api_notify__act_uG   До окончания срока активации лицензий r5   u    осталось u@    дней. Обратитесь к Администратору.z'CmfLicenseUser.license_api_notify__exp_r   u+   Срок действия лицензий u    завершён. Пожалуйста, обратитесь к Администратору для продления лицензии.u4   До окончания срока лицензий )r  r  
user_localr   r   r   Zapi_license_requiredr   r   r  APPREDIS_DBredisr   r   	cmf_alertr   r   rA   r   r   r   r   r   )rv   r   Znotify_periodwarnr2   r2   r3   license_api_notify  sr    



  
      zCmfLicense.license_api_notifyc                 C   s  |j dkrd S tdd|d|jd|jd|jd|jd|joH|jj  |  }d	}zXt	j
sl|jrtd
}n&t	jjsd}n|jdkrd}n|jdkr|jj | jk rd}nt|tjr|jr|jdkr| d n |jdkr| d n
| d d}nt|tjrzHt|jjtjs6d}n,|jjdkrT| d d}n| d d}W nf tk
r   d|jkr |jr|jdd|jgdd|jgd
ddggddkr d}nd}Y nX nt|tjr| d d}nt|tjrxz| d d}W nh tk
rt   d|jkr8d|jkr8 |jrl|jdd|jgd
ddggddkrf d}nd}Y nX n"t|trd}ntd t||tdd|d!|  W n tk
r } z|jd" }t j! }|jdkr|| j"k rd}|| j#kr|j$t	j%krd#}|| j&kr*d#}|rt'j(j)j*d$| d%t	jj+ d&d'd#d(r||jkrt,d)| d*| j"d+d, nJ||j-krt,d-| d.| j"d+d, n"t,d/| d*t.| j"| j/d+d, t0dd|d0| n|jdkrd||j-krd|| j/k rdt'j(j)j*d$| d%t	jj+ d&d'd#d(rJt,d/| d*| j/d+d, t0dd|d0| nt0dd|d1|  W 5 d }~X Y nX d S )2N)
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=ZUnknownsystemZpublicr   r   legacyzproject.servicedeskr   zproject.wikir   r	   ZOKznot project taskprojectr7   parentFr   rS   z	Allow 100   zAllow 20otheruP   Неверный тип объекта для контроля лицензий.z): result=Success, reason r   Tz%CmfLicenseUser.check_license__compat__r
  r	  r  uE   Не установлена лицензия для продукта u   . После r  um   г. функционал будет ограничен. Обратитесь к администратору.u)   Лицензии для продукта u!    не активна. После uF   Вам не выделена лицензия для продукта z):  result=Warning, product=z):  result=Fail, product=)1
class_namelogginginfor   r  r  r  Zlogic_prefixr   r  Zis_system_contextr  r  r   cmf_created_atvaluer_   _NO_LICENSE_DATEr   r   r  check_product_licenser  ZCmfLicenseErrorr   r   r  r  r   	TypeErrortypeargsr^   r`   r   r   r   r  r   r  r  r  r   r   r  r   maxr  warning)rv   objr   reasoner   r`   r  r2   r2   r3   check_license  s    
8









$

  $  zCmfLicense.check_licenseTc                    s    fdd}|   } |jkr*|t S  |jkrp|j  }|jdkrR|t S |jdkrf|t S |t	 S t
j }ttj|s|t S tdd  d dS )Nc                    s*   t dd  d|  d r&| | dS )Nr  check_product_license(z
): False (r?   F)r#  r-  )Z	error_clsZ
error_argsr   raise_errorr2   r3   return_error  s    z6CmfLicense.check_product_license.<locals>.return_errorr   r  r2  z): TrueT)r   r   ZCmfLicenseAbsentErrorr   r   r   ZCmfLicenseExpiredErrorr   ZCmfLicenseNotActivatedErrorZCmfLicenseNotActiveErrorr   r  r   r9   r  r  ZCmfLicenseUserAbsentErrorr#  r$  )rv   r   r4  r5  r   Z
simple_licr  r2   r3  r3   r(    s     









z CmfLicense.check_product_licensec                    s  |    tjdd}d}| |}tj }|d d}|r\tj|}td|| j	 n|j	  fddd	D }d }d }	t
jjd
dddgdD ]p}
|
jdkr|
j}n|
j}	|
jdkrt|D ]}||
jkr||= qnd|kr|d= |
jdkr|
j|kr||
j= q||p|	dS )Nr   rN   ="  r   deadliner   c                    s   i | ]} r| qS r2   r2   )r;   r   demo_days_leftr2   r3   r     s    z/CmfLicense.new_license_info.<locals>.<dictcomp>)r   r	   r
   r   r   r   r   r'   r)   lic_org_namer   r
   r   )Zdemo_availabledemo_org_name)_check_adminr^   rc   _CmfLicense__lic_st_getr_   r`   r   fromisoformatr,  rO   r   r   r   r)   r:  r'   r   r   )rv   demo_periodqstater`   Zdeadline_strr7  Zdemo_productsr;  org_namer   Zdel_productr2   r8  r3   r     s<    







zCmfLicense.new_license_infou8   (\b(ао|ооо|зао|оао|ип)\b)|([^a-zа-я0-9]+)c                 K   s   |    t|tr|tjks$t|| jd|p2d }t	
|  }tj|dddd }|dk rp|d7 }t||dtj tjdd	 d
dd}| j| |dS )N littleFZsignedi i rL   r   rN   r   r"   )r%   r'   r&   r(   r)   r+   )rB  )r<  r   rh   r   rf   re   _org_name_replace_resublowerr   sha1r   digestrg   
from_bytesr^   r_   r`   rc   r   rr   )rv   r   rB  _kwargsZorg_name_strZorg_name_hashr%   r.   r2   r2   r3   r     s"       zCmfLicense.apply_democ                 C   s6   t jt jkrdS ttj jt jkr*dS t	dd S )NTud   Действия с лицензиями доступны только администратору.)
r  r  Zsystem_userrh   r   r   r   r   r  ZCmfPermissionError)rv   r2   r2   r3   r<    s
    zCmfLicense._check_adminc                 K   s  |    | |}|r(td|  |}ztj|dd}W n* tjk
rd   td| dd  Y nX |jdkr| jdddgd	rtd
dd n| jdddgd	rtddd d }|jdkrt	j
dd}d}| |}	t	j }
|	d ds|
 |	d d< |	d ds&|
|  |	d d< t	j|	d d }|
|krPtddd |jdkrft|d||
 j}|	d d t	j	  |d | ||	 ||_d|_|jdkrt	ddd}d}n|j}|d}|t	j k r td|dddd | jdd|jgdgd }|rp|j|jkrJtd!|j d"|j d#dd | }t  |  W 5 Q R X n|  }|j|_|j|_|j|_|j|_|j|_|jrt |jnd$|_!|pt |j"|_#||_$||_%|j|_||_&t  |'  W 5 Q R X |jdkrtd%| d& ntd' |jrt(j)jd(d)|j*gd*ddggd	}||jkr| + }d+,d,d- |j*D }|j-d.krt	j | j.k rtd/| d0| d1|j d2|j d3| j.dd4 n&td/| d0| d1|j d2|j d5	 t |j/S )6Nue   Ваш регистрационный номер преобразован в новый формат T)r   u9   Некорректный ключ регистрации abortr
   r'   z!=r  u   Для активации лицензии EvaEco. Вам нужно предварительно удалить лицензии на другие продукты.r7   u  У вас уже есть лицензии EvaEco. Её можно заменить только лицензией на EvaEco, либо предварительно удалить лицензию EvaEco для активации другого продукта.r   r   rN   r6  registerr7  u+   Срок Демо-периода истёкr!   r   log)r^   r.   rL   i  r   u   Бессрочнаяr  u%   Истёк срок лицензии(u5   ). Пожалуйста, получите новую.z***r   r   uZ   Количество пользователей существующей лицензии(uI   ), превышает ограничение новой лицензии(u   ). Нужно уменьшить количество пользователей лицензии, до активации новой.u   Не ограниченоuo   Демо версия успешно активирована. Срок действия демо версии u
    дней.uJ   Регистрационный номер успешно применён.rg_member_ofINr  r5   c                 s   s   | ]}d |j  d V  qdS )"N)name)r;   groupr2   r2   r3   r=   i  s     z*CmfLicense.apply_regnum.<locals>.<genexpr>r   u
   У Вас u.    пользователей в группах u    лицензии "uH   ". Что превышает ограничение лицензии в u    пользователей. Часть пользователей смогут использовать функционал продукта только до u   г. Пожалуйста, измените количество пользователей в соответствии с текущей лицензией до указанной даты.u    пользователей. Пожалуйста, измените количество пользователей в соответствии с текущей лицензией.)0r<  _compat_regnumr  r   r   rK   r'   r   r)   r^   rc   r=  r_   r`   r   	isoformatr>  r*   re   rO   r   now_CmfLicense__lic_st_setr(   r&   rd   
user_countZclonecmfutildisable_acldeleter+   rh   Zlic_user_limit_strr%   r:  
lic_regnumr   lic_end_date_strsaver   	CmfPersonuser_groupsr   rA   r   r  r   )rv   r.   rB  rL  Z
new_regnumZparsed_regnumr9  r?  r@  rA  r`   r7  r   r`  Zold_licenseZnew_licenseZperson_countr   Z
groups_strr2   r2   r3   r      s    






"



*
 zCmfLicense.apply_regnumc                 C   s   t | d S r,   )onboarding_tuning)rv   r   r2   r2   r3   landing_page2license  s    zCmfLicense.landing_page2licensec                 C   s   t jjdgd}|  d S )Nr   r   )r   CmfGlobalSettingsr   ra  )rv   Zglobal_settingsr2   r2   r3   patch_global_settings  s    Iz CmfLicense.patch_global_settingsc                 C   s$   | j tjj k rd| _nd| _d S )NZexpiredr   )r   Zcmfr   ZCmfDaterY  r   r<   r2   r2   r3   _calc_lic_status  s    zCmfLicense._calc_lic_statusc              
   C   s   | j sd| _ | jjs$| jjs$| jjrd| _ | jdkr<d| _ n| jr| jr| jr| jj | _z(tj	| jj| jj| jjd}t
d W nN tjtjfk
r } z(| jjp| jj}t
d|j |d W 5 d }~X Y nX d| _ d S )N
not-activer   r   )r   r.   r   u9   Лицензия успешно активирована.u.   Неверный ключ активации: rM  )r   r_  
is_changedr   r   r)   r&  stripr   r   r  rK   r   r+  )r1   Z_activation_coder0  rN  r2   r2   r3   _calc_activation_status  s&    
 &z"CmfLicense._calc_activation_statusc                 C   s   d}|  |}tj }| jdkrP| j|d krH|d | j= | || d | _n| j|d kr|d rf|tjdd }|	 |	 d|d | jj
< | || ntj|d | j d }||kr|| jnd	| _d S )
Nr6  r   
activation	corruptedr   rN   )r7  rO  r7  r   )r=  r^   r_   r`   r   r'   rZ  r   rc   rX  r&  r>  rO   )r1   r@  rA  r`   r7  r2   r2   r3   _calc_activation_days_left	  s"    


 z%CmfLicense._calc_activation_days_leftc                 C   sj   | j dkrd}n0| jdkr<tj | jtjdd k r<d}nd}| jdkpN| j}|r`|r`d| _	nd| _	d S )Nr   Tr   r   rN   Freadonly)
r   r)   r^   r_   r`   r   rc   r   r   r   )r1   Znot_expiredZactivation_okr2   r2   r3   _calc_status  s    
&zCmfLicense._calc_statusc              	   C   s6  | j js,| jjs,| jjs,| jjs,| jjs,d S | j sBd | _d | _d S | dddddg 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 )$Nr'   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   ZSTANDZBIZZPREMZENTZDEMOZFREEZEDU)r   r   r   r   r   r   r   ZCLZBOX)r#   r"   r
  Z120)r   r    r!   AZUNLIMr
   r   r!   r]   )r'   rj  r*   r&   r)   r+   lic_coderU  load_fieldsr   rA   )r1   partsrf   ri   rk   rj   r2   r2   r3   _calc_lic_code/  sh    

zCmfLicense._calc_lic_codec                 C   s   | j r*| jjs*| jjs*| jjs*| jjs*d S | jr<| jr<| jsFd | _ d S d}d}| jdkrbd}d}n| jdkrrd}n| j d}| jrd	| j d
}d}nd}d}| jdkrd}nd}d| d| d| | d| j d| | d| _ d S )NuG   Система управления предприятием EvaProjectrC  r   zEducation Editionu1    для образовательных целейr
   zEcoSystem Editionz Editionu    на u    пользователейuT   , без ограничений по количеству пользователейr!   u    бессрочно,uH   Право использования программы для ЭВМ "uI   " на условиях неисключительной лицензииz ( r?   uE   , свидетельство 2023662166, номер 18285 в ЕРРП)textr'   rj  r&   r*   rt  r)   )r1   Z	prog_nameZedu_txtZproduct_nameZ
user_limitZ
unlim_textZperpetual_textr2   r2   r3   
_calc_textm  s>    


,zCmfLicense._calc_textc                   @   s   e Zd ZdZdS )zCmfLicense.StateErroru   Ошибка состоянияNrG   r2   r2   r2   r3   
StateError  s   r{  c                 C   sX   ddl m} || d d |j| dd  }t|tr@||S t|trT||S d S )Nr   )AESr   i)ZCrypto.Cipherr|  newZMODE_CFBr   bytesZencryptZdecrypt)kior|  Zcryptr2   r2   r3   Z	__st_conv  s     


zCmfLicense.__st_convc           
      C   s
  |dkrd S t jjddgdd}t jj|jd}|jr|jrt jjddddj}t	| | |j 
  }ztj|jjdd	}W n tk
r   | d
Y nX | j||d}zt|}|W S  tk
r   | dY nX d}	|jd k	rd}	|	i d d g ddS )Nr6  cmf_ver_cookie
cmf_cookieTr   TECHCOM_nocachegs_idanonymous@evateam.rur   r   r  Zvalidater   r  r   F)rO  r7  rP  )rn  rm  r   )r   rf  r   fix_gsidr   r  r  rb  r   rI  r   rJ  base64	b64decoder&  re   r{  _CmfLicense__st_convjsonloads)
rv   r   gsr  p_idkey	encryptedZ	decrypteddatarn  r2   r2   r3   Z__lic_st_get  s6     

zCmfLicense.__lic_st_getc           	   	   C   s   |dkrd S t jjddgdd}t jj|jd}||jkrNt jjddgdd}|jr^|jd nd|_t jjdddd	j}t| | |j 	 
 }t|	 }| j||d
}t| |_t  |jdd W 5 Q R X d S )Nr6  r  r  Tr  r  r   r  r  )r  Z	only_data)r   rf  r   r  r   r  rb  r   rI  r   rJ  r  dumpsr  r  Z	b64encodedecoder  r\  r]  ra  )	rv   r   r  r  r  r  r  Zdata_strr  r2   r2   r3   Z__lic_st_set  s    
 
zCmfLicense.__lic_st_setc                 C   st   dd }t j }tj | }t|  }||dd dd||dd dd||dd d}|S )	Nc                 S   s   t j| dddS )NrD  FrE  )rg   rK  )dr2   r2   r3   	bytes2int  s    z1CmfLicense.get_activation_hwid.<locals>.bytes2intr   r   Z05dr]   r   r   )	r   rf  r  r   r   r   rI  r   rJ  )rv   r  r  r   Z
hash_bytesZhwidr2   r2   r3   r     s    
>zCmfLicense.get_activation_hwidc                 C   s(   | j r| jtjkr$|  | _ tj| _d S r,   )r   
lic_domainr   r   r   r<   r2   r2   r3   _calc_activation_hwid  s    
z CmfLicense._calc_activation_hwidc                    s*   t   ddddddddd	d
ddddg S )Nr   r   r   r%  rt  r   rc  r   ry  r'   r  r&   r*   r   )supersave_preload_fieldsr<   rB   r2   r3   r    s                zCmfLicense.save_preload_fieldsc                    s   | j jrd | _d| _|   |   |   |   |   | 	  | 
  | jr|| jsj| jtj  | js|| j | _| jjs| jjrttjj t j||}|S )Nri  )r_  rj  r   r   rw  rz  r  rh  rl  ro  rq  r   rc  r   r   r   Z
user_groupZlic_start_daterY  r&   schedule_deferred_jobr   recalc_users_countsr  ra  )r1   r+  kwargsretr  r2   r3   ra    s&    zCmfLicense.savec                    s$   g | _ ttjj t jf | d S r,   )rc  r  r   r   r  r  r^  )r1   r  r  r2   r3   r^    s    zCmfLicense.deletez@daily)Z	only_onceZ
system_jobZschedulec               	      s  d t j fdd} i }tt}jdddddd	gd
D ]6tj|< jD ]}|t|j 	 qVq:d|k}t j
jdddgdj d}tt}g }|D ]t }jD ],}t|t jsq||j}	|	r||	 q|rd|kr:tfddj D r*|d  d7  < q||f nbtfddj D sZqj D ]}
t|
d qdtdd  jdd |   qd}j D ]h\}
|krt|
r|  d7  < nd}n0t|
rt|
d tdd d  qjr0jdd |   |r||f qt  | D ]\| _  qRt  fdd}|D ]:\}d}|D ]| | rd}q|r|   qt  dS )u   
        Запускаем при изменении лицензий и ежесуточно, для пересчёта статусов и актуализации счётчиков.
        r   c                      s    d7   d dkrt   d S )Nr   rQ   r   )
cmf_commitr2   )bulk_commit_countr2   r3   bulk_commit  s    z3CmfLicense.recalc_users_counts.<locals>.bulk_commitr[  rc  r'   r   r   r&   r   r
   r  r7   TrR  rQ  c                 3   s   | ]}t  |V  qd S r,   r8   r;   r  personr2   r3   r=   B  s     z1CmfLicense.recalc_users_counts.<locals>.<genexpr>r   c                 3   s   | ]}t  |V  qd S r,   r8   r  r  r2   r3   r=   G  s     Frecalc_users_counts(): %szClear Eco license on r  zClear z license on c                     s    j } | rt| rdS jjk r jd7  _jdd tdd d dj d	j  | r~t| d n4d
kr j 	 D ]}t|d qnt
dtj jdd dS tddj dj d  d S )NFr   Tr  r  Add  license to , count /r
   zInvalid productzLicense(z) user limit(z) exceeded on )r  r   r9   r[  r&   ra  r#  r$  setattrr  re   r   r'   )r  Z
lic_field2)rv   licenser  r   r2   r3   take_licensei  s,    z4CmfLicense.recalc_users_counts.<locals>.take_licenseN)rR  )r   r   r   r   r   rh   r'   rc  r   addrb  r  r  rg   rR  r   r   r   r   allr   anyr  r#  r$  ra  itemsr9   rj  r  r[  )r  r   Zg2prV  Zis_ecoZperson_listZlic_users_countsZset_license_queueZperson_productsZgroup_productsr  Zneed_licenser  Ztakenr2   )r  rv   r  r  r   r3   r    s    








zCmfLicense.recalc_users_countsZlic_evaprojectZlic_evawikiZlic_evaservicedeskZ
lic_evagitZlic_evatestZlic_evacicdZ
lic_evarms)r	   r   r   r   r   ZEvaCICDr   c                    s   fdd} j dddd|jggddd	gd
}|s:d S  j  j}|D ]jdkrtfdd j D rjj	k r j D ]}t
|d q jd7  _  tddj d dj dj	  n|  qV jj }t|sVjj	k rft
|d  jd7  _  tddj d dj dj	  qV|  qVjr|sjdd ttjj d S )Nc                     s   t jdkr(tdj dj ddd   } dj d}| jd	krptj	  j
k rpdj d
 j
dd}tdj d| d d S )NzCmfPerson.createu@   Невозможно создать учётную запись uK   . Превышен лимит пользователей лицензии "u   ". Необходимо расширить лицензию или ограничить количество пользователей с доступом к лицензии.TrM  u#   Для учётной записи uE    функционал продукта будет ограничен.r   u2    функционал продукта после r  u    будет ограничен.uI   Превышен лимит пользователей лицензии "z". u;    Необходимо расширить лицензию .)r  Z
api_methodr  Zloginr'   r   r   r^   r_   r`   r  )r   Zlimit_date_inforv   r  r   r2   r3   user_limit_alert  s    

z6CmfLicense.take_user_license.<locals>.user_limit_alertrc  EXISTSr   r7   r[  r&   r'   rQ  r
   c                 3   s   | ]}t  | V  qd S r,   r8   r  r   r2   r3   r=     s     z/CmfLicense.take_user_license.<locals>.<genexpr>Tr   ztake_user_license(): %sr  r  r  r  r  )r   r   ru  r  r  rj  r'   r  r[  r&   r  ra  r#  r$  r9   r  r   r   r  )rv   r   rV  r  r   was_changedr  r2   r  r3   take_user_license  sH    

 
 zCmfLicense.take_user_licensec                    sJ  | j dddd|jggddgd} | j   j}|D ]}|jdkrt fd	d
| j D r| jd8  _|	  | j D ]}t
 |d qtdd  d|j d|j  q<| j|j }t |r<t
 |d | jd8  _|	  tdd|j d  d|j d|j  q< jr:|s: j	dd ttjj d S )Nrc  r  r   r7   r[  r'   rQ  r
   c                 3   s   | ]}t  |V  qd S r,   r8   r  r  r2   r3   r=     s     z2CmfLicense.release_user_license.<locals>.<genexpr>r   Fzrelease_user_license(): %szRemove EvaEco license from r  r  Remove  license from Tr  )r   r   ru  r  r  rj  r'   r  r[  ra  r  r#  r$  r&   r9   r  r   r   r  )rv   r   rV  r   r  r  r  r2   r  r3   release_user_license  s:    

 zCmfLicense.release_user_licensec                    s  t  fdd| j D s d S | jdddgd}|s:d S |D ]}|jdkr| jd8  _|  | j D ]}t |d	 qlt	d
d|j d  d|j d|j
  q>| j|j}t |r>t |d	 | jd8  _|  t	d
d|j d  d|j d|j
  q>d S )Nc                 3   s   | ]}t  |V  qd S r,   r8   r  r  r2   r3   r=     s     z7CmfLicense.release_all_user_licenses.<locals>.<genexpr>rc  r[  r'   r   r
   r   Fzrelease_all_user_licenses(): %sr  r  r  r  )r  r  r  r   r'   r[  ra  r  r#  r$  r&   r   r9   )rv   r   r   r  r  r2   r  r3   release_all_user_licenses  s0    
 
 z$CmfLicense.release_all_user_licensesc                 O   s   d S r,   r2   )rv   _argsrL  r2   r2   r3   r     s    z!CmfLicense.public_list_hack_emptyc                 C   s  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 d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddgˡ}td͠  }tj|ddύ}| j||dЍ}t	|}|
|S )NrC  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A+p6V7I=zRegMapEncKey__cvvnsdfjh4!4566Tr  r  )rA   r   rI  r   rJ  r  r  r  r  r  r   )rv   r.   Zrmr  Zreg_map_encryptedZreg_map_binZreg_mapr2   r2   r3   rW  #  s   3  N
zCmfLicense._compat_regnum)T)NN)N)N)NN)?rC   rH   rI   rJ   r   r   r   r   Zapi_methodsremover^   r_   r   r   r   r'  r  r   Z	dataclassr   r   r   r   r   r  r  r1  r(  r   r   r   rF  r   r<  r   re  rg  rh  rl  ro  rq  rw  rz  	Exceptionr{  r   r  r=  rZ  r   r  r  ra  r^  Zcmf_deferred_jobr  r  r  r  r  r   rW  __classcell__r2   r2   r  r3   r     s   


{

@
 
.

~
N>'
&

x

A
"
 
r   c                 C   sB   | dkr>dddg}t jjdd|gdD ]}d|_|jdd	 q&d S )
NZevawikiu;   (Демо) Разработка веб-приложенияu%   (Демо) Супер продукт1u   Проект пример1rU  rS  r  Tr  )r   r  r   Zcmf_deletedra  )Zlicense_codeZproject_to_deleter  r2   r2   r3   rd  *  s    rd  )r  r   r^   r   r   r   collectionsr   typingr   Zcmf.includeZcommon.models.cmf_active_entityr   Zmodules.settings.fieldsr   r   r   r   rd  r2   r2   r2   r3   <module>   s:     & ?            D