U
    =[h2                    @   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ddZddddddd Z	d!d"ddd#Z
d3eeeejeeed%d&d'Zd(d) ZG d*d+ d+eZd,d- Zed4d/d0Zed1d2 Zd$S )5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start)r   r   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/   r0   r1    r3   (./modules/settings/models/cmf_license.py__init__Q   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,   r0   , c                 3   s0   | ](}t  |d k	r| dt  | V  qd S N=getattr.0Zparamr2   r3   r4   	<genexpr>k   s     z"RegNum.__repr__.<locals>.<genexpr>()join	__class____name__r2   paramsZ
params_strr3   r=   r4   __repr__g   s           zRegNum.__repr__c                   @   s   e Zd ZdZdS )zRegNum.ParseErroru=   Неверный формат кода регистрацииNrD   
__module____qualname____doc__r3   r3   r3   r4   
ParseErroro   s   rL   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/   )r2   ra   rb   rc   yymmZd1r'   Zd2Z
product_idZd3Zd4	type_codeperiod_codedeploy_codeZ	type_packZd5cs_strZd6r3   r3   r4   generater   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)rt   r/   r3   r4   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 )	NrW   r   rU   rV   rS   rT   rQ   rR   )rh   rL   )limit)clsob_user_limitr/   r3   r4   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5rR   rV   rZ   r   )rh   rg   rL   )Zcontract_id_partproduct_code)rw   r&   
ob_productr1   r/   r3   r4   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   )rh   rj   rL   rk   rl   )Zdeobro   rp   rq   )rw   r&   ob_typer/   r3   r4   	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 )
Nr[     rT   i  rN   r   r   r   rO   )rh   rL   r_   r`   rd   )rn   ZyyyyZmm)rw   ob_yymmr/   r3   r4   	deob_yymm   s    zRegNum.parse.<locals>.deob_yymmrz   r   rR   r   r   r   r   6r   r   r   r.   )_REGNUM_5_RErh   _REGNUM_6_RErL   rm   )rw   r/   check_csru   ry   r}   r   r   rr   csr0   r'   r(   r)   r*   r+   r,   r3   )	rw   r&   rt   r|   r   rx   r   r1   r/   r4   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   r3   r3   r4   rm   .  s    zRegNum._calc_cs)
NNNNNNNNNN)T)rD   rI   rJ   recompiler   r   rg   rj   rk   rl   rh   ri   r_   r`   r5   rG   rf   rL   rs   classmethodr   staticmethodrm   r3   r3   r3   r4   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-   )r0   r/   r&   r'   r(   r)   r*   r+   r,   scs1scs2scs3scs4activation_code)r2   r&   r'   r(   r)   r*   r+   r,   r/   r0   r   r   r   r   r   r3   r3   r4   r5   D  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,   r0   r6   c                 3   s0   | ](}t  |d k	r| dt  | V  qd S r7   r9   r;   r=   r3   r4   r>   g  s     z*ActivationCode.__repr__.<locals>.<genexpr>r?   r@   rA   rE   r3   r=   r4   rG   b  s&               zActivationCode.__repr__c                   @   s   e Zd ZdZdS )zActivationCode.ParseError9   Неверный формат кода активацииNrH   r3   r3   r3   r4   rL   k  s   rL   c                   @   s   e Zd ZdZdS )z"ActivationCode.RegnumMismatchErrorr   NrH   r3   r3   r3   r4   RegnumMismatchErrorn  s   r   )r   	   r   r   r   r   r      r   r   r   rR   rN   )r   r   r   rR   r   r   r~         r   r   rN   r   r   r   r   )rN   r   r   rR   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   rR   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 )NrR   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   )rh   len_m13AssertionError_m16_m19rf   range)r   Z
ob_int_valtableZint_valresultbrw   r&   r3   r4   deob_int  s,    
z&ActivationCode.parse.<locals>.deob_intr~   i  r   rN   )rb   rc   ZdayrO   r      )r/   r0   r   r   r   r   r   r&   r'   r(   r)   r*   r+   r,   )
CmfLicenseget_activation_hwid
isinstanceri   r   r   _ACT_CODE_RErt   rL   rh   r&   r   rm   r'   rg   r(   r_   r`   rd   r)   rj   r*   rk   r+   rl   r,   r/   )"rw   r   r/   activation_hwidr   rt   rx   Zob_product_monthsZob_type_period_deployZob_scs12Zob_scs34rr   r   r0   r   r'   Zproduct_monthsr{   Zmonthsr(   r)   Ztype_period_deployro   rp   rq   r*   r+   r,   Zscs12r   r   Zscs34r   r   r3   r   r4   r   u  s    

8
,



          zActivationCode.parsec                 C   s4   t |   }t| }|ddd  }|S )NrX   r   r   r3   r3   r4   rm     s    zActivationCode._calc_cs)NNNNNNNNNNNNNN)NNT)rD   rI   rJ   r   r   r   rh   ri   r_   r`   r5   rG   rf   rL   r   r   r   r   r   r   r   rm   r3   r3   r3   r4   r   6  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eed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 Zed d! Zedkd#d$Z ed%d& Z!e"#d'Z$edld(d)Z%ed*d+ Z&edmd,d-Z'ednd.d/Z(edod0d1Z)ed2d3 Z*d4d5 Z+d6d7 Z,d8d9 Z-d:d; Z.d<d= Z/d>d? Z0G d@dA dAe1Z2edpdBdCZ3edDdE Z4edFdG Z5edHdI Z6dJdK Z7 fdLdMZ8 fdNdOZ9 fdPdQZ:ee;d"d"dRdSdTdUdV Z<dWdXdYdZd[d\d]d^Z=ed_d` Z>edadb Z?edcdd Z@ededf ZAedgdh ZBedidj ZC  ZDS )qr   uA   
    Приобритённые и демо-лицензии
    apply_regnum
apply_demonew_license_infopublic_list_hack_emptyZcreatei  r   r   r   r   r   rR   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< 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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)rD   rI   rJ   dataclassesZfieldtimer   float__annotations__r   ri   r   r   listr   setr   r   r   dictr   r   boolr   r   r   rh   r   r   r   r3   r3   r3   r4   _LicCacheData  s    
r   CmfLicense:changed)Zchannelc                  K   s   t   d S r-   )r   _clear_cache)_kwargsr3   r3   r4   on_license_changed%  s    zCmfLicense.on_license_changedN
_lic_cachec                 C   s
   d t _d S r-   )r   r   rw   r3   r3   r4   r   -  s    zCmfLicense._clear_cachec                 C   s*   t jddko(t jddko(tjdkS )N	containerZlxcZEVA_DEPLOY_TYPEz	cloud-lxcz.evateam.ru)osenvirongetconfigAUTH_SESSION_COOKIE_DOMAINr   r3   r3   r4   _check_is_cloud2  s
    zCmfLicense._check_is_cloudc           
   	   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d	gd
|_dd |j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rT|jdkrvd}n"|jdk rfd}n|jdkrvd}|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	r
t|j|jn|j|_q|jd k	r6|jdk r6d|_n&|jd k	rV|jdk rVd|_nd |_|   }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rd|_%d#|_&nd |_%d#|_&|t!_ |S )$Nr   statusactivation_status
lic_statusr(   r*   lic_end_dater   user_groupsfieldsc                 S   s   h | ]}|j D ]
}|jqqS r3   )r   id)r<   licZ	lic_groupr3   r3   r4   	<setcomp>K  s    z*CmfLicense._check_cache.<locals>.<setcomp>)r	   r   r   r   r   r   r   c                 S   s   i | ]}|j |qS r3   r(   r<   r   r3   r3   r4   
<dictcomp>S  s      z+CmfLicense._check_cache.<locals>.<dictcomp>r
   c                 S   s   h | ]}|j d kr|jqS )active)r   r(   r   r3   r3   r4   r   X  s     
 c                 S   s   h | ]
}|j qS r3   r   r   r3   r3   r4   r   \  s     r   r   userr      adminrR   rM   codeZLIKEz%eva%T)filterinclude_deleteddisabledfullcompatF))r   r   r   r   r   ri   modelsCmfPersonGroupZadmin_groupr   slistr   r   r   r   updater   r_   r`   ra   r   r*   rP   r   appendr(   r   r   minr   r   r   r   r   countr   
_LOCK_DATEr   r   _USER_WARN_DATE_ADMIN_WARN_DATE)
rw   cacheZeco_productsproductra   r   Z	time_leftr   Zis_cloudis_newr3   r3   r4   _check_cache8  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valuesr:   r  r   current_person__member_ofr   r   r   r_   r`   ra   _UNLIM_DATE)rw   r   	lic_fieldr  r3   r3   r4   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rh|jsh|jt jkrhtj	j
jdt jj d|ddrhdt _|jdkr|jsd	}|jd
kr|jt jkrd}|jdkrd}|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r
d}|rRtj	j
jdt jj d|ddrRtdd|j d|j d d	}|jd
krt|jt jkrtd}|jdkrd}|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   z+CmfLicenseUser.license_api_notify__lic_req_1TexZnxr   Fr   r   z*CmfLicenseUser.license_api_notify__no_lic_uE   Требуется установить лицензию. После %d.%m.%Yu{    функционал продукта будет ограничен. Обратитесь к Администратору.z'CmfLicenseUser.license_api_notify__act_uG   До окончания срока активации лицензий r6   u    осталось u@    дней. Обратитесь к Администратору.z'CmfLicenseUser.license_api_notify__exp_r   u+   Срок действия лицензий u    завершён. Пожалуйста, обратитесь к Администратору для продления лицензии.u4   До окончания срока лицензий )r  r	  
user_localr  r   r   r   r  APPREDIS_DBredisr   r   Zapi_license_requiredr   	cmf_alertr  r   rB   r   r   r   r   r   )rw   r  Znotify_periodwarnr3   r3   r4   license_api_notify  s    


  

        zCmfLicense.license_api_notifyc           
      C   s8  |j dkrd S tdd|d|jd|jd|jd|jd|j  |  }d	}zt	j
sd|jrld
}nt	jjs|d}n|jdkrd}nt|jdkr|jj | jk rd}nPt|tjr|jr|jdkr| d n |jdkr| d n
| d d}nt|tjr6z|j}|sL|jrLt|jj}|rLtd| d t|jjtjsdd}nf|dkr| d |jd }|jdkrt	jj|jjkrtd|j  ddd d}n| d d}W nf t!k
r2   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$rT| d d}nt|tj%rz| d d}W nh t!k
r   d|j"krd|j"kr |jr|j#dd|jgd
dd ggd!d$kr΂ 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rL|| j,k rLd }	|| j-kr|j.t	j/krd}	|| j0krd}	|	r2tj1j2j3d*| d+t	jj d,d-dd.r2||j"krtd/| d0| j,d1d2 nJ||j4krtd3| d4| j,d1d2 n"td5| d0t5| j,| j6d1d2 t7dd|d6| n|jdkr||j4kr|| j6k rtj1j2j3d*| d+t	jj d,d-dd.rtd5| d0| j6d1d2 t7dd|d6| nt7dd|d7|  W 5 d }~X Y n> t8k
r2 } zt7dd|d8|   W 5 d }~X Y nX d S )9N)
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=ZUnknownsystemZpublicr   r   legacyzproject.servicedeskr   zproject.wikir   r	   ZOKu   DEV: ошибка! У u;    не рассчиталось поле parent_logic_prefixznot project taskr   uw   Объект доступен только для чтения. В рамках бесплатной лицензии "u`   " редактирование разрешено только Владельцу проектаTabort
project_idr8   parentFr   rT   z	Allow 100   zAllow 20otheruP   Неверный тип объекта для контроля лицензий.z): result=Success, reason r   z%CmfLicenseUser.check_license__compat__r  r  r  uE   Не установлена лицензия для продукта u   . После r  um   г. функционал будет ограничен. Обратитесь к администратору.u)   Лицензии для продукта u!    не активна. После uF   Вам не выделена лицензия для продукта z):  result=Warning, product=z):  result=Fail, product=z):  result=Fail-Abort, error: )9
class_namelogginginfor  r!  r&  r%  parent_logic_prefixr  r  Zis_system_contextr	  r  r   cmf_created_atvaluer`   _NO_LICENSE_DATEr   r   r  Zlogic_prefixcheck_product_licenser  r  Zget_cache_projectr  r   r*   r   ZprojectZcmf_owner_idnameZCmfLicenseErrorr   r   r  r  r   	TypeErrortypeargsr_   ra   r  r  r   r  r  r  r  r   r   maxr  warningZCmfAbortError)
rw   objr  reasonr.  Zlicense_er  ra   r  r3   r3   r4   check_license  s    
0











$

  $  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,  r8  )Z	error_clsZ
error_argsr  raise_errorr3   r4   return_error  s    z6CmfLicense.check_product_license.<locals>.return_errorr   r   r=  z): TrueT)r  r   ZCmfLicenseAbsentErrorr   r   r   ZCmfLicenseExpiredErrorr   ZCmfLicenseNotActivatedErrorZCmfLicenseNotActiveErrorr   r
  r   r:   r  r	  ZCmfLicenseUserAbsentErrorr,  r-  )rw   r  r?  r@  r  Z
simple_licr  r3   r>  r4   r2    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   rO   ="  r   deadliner   c                    s   i | ]} r| qS r3   r3   )r<   r  demo_days_leftr3   r4   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_   rd   _CmfLicense__lic_st_getr`   ra   r   fromisoformatr7  rP   r   r   r   r*   rE  r(   r   r   )rw   demo_periodqstatera   Zdeadline_strrB  Zdemo_productsrF  org_namer   Zdel_productr3   rC  r4   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 rM   r   rO   r   r#   )r&   r(   r'   r)   r*   r,   )rM  )rG  r   ri   r   rg   rf   _org_name_replace_resublowerr   sha1r   digestrh   
from_bytesr_   r`   ra   rd   r   rs   )rw   r  rM  r   Zorg_name_strZorg_name_hashr&   r/   r3   r3   r4   r     s"       zCmfLicense.apply_democ                 C   s4   t jt jkrdS |  }|jt jkr(dS tdd S )NTud   Действия с лицензиями доступны только администратору.)r  r	  Zsystem_userr  r   r  ZCmfPermissionError)rw   r  r3   r3   r4   rG  '  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	 | /|j t |j0S )6Nue   Ваш регистрационный номер преобразован в новый формат T)r   u9   Некорректный ключ регистрации r#  r
   r(   z!=r'  u   Для активации лицензии EvaEco. Вам нужно предварительно удалить лицензии на другие продукты.r8   u  У вас уже есть лицензии EvaEco. Её можно заменить только лицензией на EvaEco, либо предварительно удалить лицензию EvaEco для активации другого продукта.r   r   rO   rA  registerrB  u+   Срок Демо-периода истёкr"   r   log)r_   r/   rM   i  r   u   Бессрочнаяr  u%   Истёк срок лицензии(u5   ). Пожалуйста, получите новую.z***r   r   uZ   Количество пользователей существующей лицензии(uI   ), превышает ограничение новой лицензии(u   ). Нужно уменьшить количество пользователей лицензии, до активации новой.u   Не ограниченоuo   Демо версия успешно активирована. Срок действия демо версии u
    дней.uJ   Регистрационный номер успешно применён.rg_member_ofINr  r6   c                 s   s   | ]}d |j  d V  qdS )"N)r3  )r<   groupr3   r3   r4   r>     s     z*CmfLicense.apply_regnum.<locals>.<genexpr>r   u
   У Вас u.    пользователей в группах u    лицензии "uH   ". Что превышает ограничение лицензии в u    пользователей. Часть пользователей смогут использовать функционал продукта только до u   г. Пожалуйста, измените количество пользователей в соответствии с текущей лицензией до указанной даты.u    пользователей. Пожалуйста, измените количество пользователей в соответствии с текущей лицензией.)1rG  _compat_regnumr  r   r   rL   r(   r   r*   r_   rd   rH  r`   ra   r   	isoformatrI  r+   rf   rP   r   now_CmfLicense__lic_st_setr)   r'   re   
user_countZclonecmfutildisable_acldeleter,   ri   Zlic_user_limit_strr&   rE  
lic_regnumr   lic_end_date_strsaver   	CmfPersonr   r  rB   r   r  _new_license_menu_fixr   )rw   r/   rM  r   Z
new_regnumZparsed_regnumrD  rJ  rK  rL  ra   rB  r   rg  Zold_licenseZnew_licenseZperson_countr  Z
groups_strr3   r3   r4   r   1  s    






"



*
 zCmfLicense.apply_regnumc                 C   s   | j dddkr| | d S )NT)r   r   )r   landing_page2license)rw   r   r3   r3   r4   rj    s    z CmfLicense._new_license_menu_fixc              	   C   s   t jjdgd}dddd}|||}|dkrVd|_d|_d|_d|_d|_d|_nj|dkrd|_d|_	d|_
d|_d|_d|_d|_n6d|_d|_d|_	d|_d|_d|_d|_d|_
d|_d|_d|_d|_t  |  W 5 Q R X t| d S )	Nr   r   r
   r   r	   )Zeva24evawikiZ
evaprojectTF)r   CmfGlobalSettingsr   Zdefault_show_deskZdefault_show_projectZdefault_show_kanbanZdefault_show_filterZdefault_show_dashboardZdefault_show_planningZdefault_show_wikiZdefault_show_analyticZdefault_show_my_companyZdefault_show_servicedeskZdefault_show_helpdeskZdefault_show_mailrc  rd  rh  onboarding_tuning)rw   r   global_settingsZcode_mappingr3   r3   r4   rk    sB    
zCmfLicense.landing_page2licensec                 C   s   t jjdgd}|  d S )Nr   r   )r   rm  r   rh  )rw   ro  r3   r3   r4   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CmfDater`  r   r=   r3   r3   r4   _calc_lic_statusG  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.   Неверный ключ активации: r#  )r   rf  
is_changedr   r   r*   r0  stripr   r   r  rL   r   r6  )r2   Z_activation_coder;  r$  r3   r3   r4   _calc_activation_statusN  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 )
NrA  r   
activation	corrupted<   rO   )rB  rW  rB  r   )rH  r_   r`   ra   r   r(   ra  r   rd   r_  r0  rI  rP   )r2   rK  rL  ra   rB  r3   r3   r4   _calc_activation_days_leftj  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   rO   Freadonly)
r   r*   r_   r`   ra   r   rd   r   r   r   )r2   Znot_expiredZactivation_okr3   r3   r4   _calc_status  s    
&zCmfLicense._calc_statusc              	   C   s8  | 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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EDUZSTART)r   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(   rs  r+   r'   r*   r,   lic_coder3  load_fieldsr   rB   )r2   partsrg   rj   rl   rk   r3   r3   r4   _calc_lic_code  sj    
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   Система управления предприятием EvaProjectrN  r   zEducation Editionu1    для образовательных целейr
   zEcoSystem Editionz Editionu    на u    пользователейuT   , без ограничений по количеству пользователейr"   u    бессрочно,uH   Право использования программы для ЭВМ "uI   " на условиях неисключительной лицензииz ( r@   uE   , свидетельство 2023662166, номер 18285 в ЕРРП)textr(   rs  r'   r+   r~  r*   )r2   Z	prog_nameZedu_txtZproduct_nameZ
user_limitZ
unlim_textZperpetual_textr3   r3   r4   
_calc_text  s>    


,zCmfLicense._calc_textc                   @   s   e Zd ZdZdS )zCmfLicense.StateErroru   Ошибка состоянияNrH   r3   r3   r3   r4   
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cryptr3   r3   r4   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 )NrA  cmf_ver_cookie
cmf_cookieTr   TECHCOM_nocachegs_idanonymous@evateam.rur   r   r  Zvalidater   r  r   F)rW  rB  rX  )rw  rv  r   )r   rm  r   fix_gsidr   r  r  ri  r   rT  r   rU  base64	b64decoder0  rf   r  _CmfLicense__st_convjsonloads)
rw   r   gsr  p_idkey	encryptedZ	decrypteddatarw  r3   r3   r4   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 )NrA  r  r  Tr  r  r   r  r  )r  Z	only_data)r   rm  r   r  r   r  ri  r   rT  r   rU  r  dumpsr  r  Z	b64encodedecoder  rc  rd  rh  )	rw   r   r  r  r  r  r  Zdata_strr  r3   r3   r4   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 )NrO  FrP  )rh   rV  )dr3   r3   r4   	bytes2int?  s    z1CmfLicense.get_activation_hwid.<locals>.bytes2intr   r   Z05dr^   r   r   )	r   rm  r  r   r   r   rT  r   rU  )rw   r  r  r   Z
hash_bytesZhwidr3   r3   r4   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=   r3   r3   r4   _calc_activation_hwidH  s    
z CmfLicense._calc_activation_hwidc                    s,   t   ddddddddd	d
dddddg S )Nr   r   r   r/  r~  r   r   r   r  r(   r  r'   r+   r   r*   )supersave_preload_fieldsr=   rC   r3   r4   r  M  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||}| jjs| jjrtdd  |S )Nrr  r   )rf  rs  r   r   r  r  r  rq  ru  ry  r{  r  r   r   r   r   Z
user_groupZlic_start_dater`  r'   schedule_deferred_jobr   recalc_users_countsr  rh  r   cmf_emit_server_event)r2   r6  kwargsretr  r3   r4   rh  S  s*    
zCmfLicense.savec                    s.   g | _ ttjj t jf | tdd  d S )Nr   )r   r  r   r   r  r  re  r  )r2   r  r  r3   r4   re  t  s    zCmfLicense.deletez@dailyr   )Z	only_onceZ
system_jobZschedulepriorityc                     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t
}g }d}d}t jjdddgdddggd#j ||| gdgd }	rj|t|	7 }|	D ]t }
jD ]}||j}|r|
| qg }|rd|
krbtfddj D rR|d  d7  < q||
f n0tfddj D sq|j  nrd}j D ]N\}|
krt|r|  d7  < nd}nt|r|| q|r||
f |rt jjjd|D ]}t|d qtdd|rDdn| d  jdd |   qqt  | D ]\| _  qxt  fdd }|D ]T\}
d}t jjjj d!|
D ]| | rd}q|r|   qt  d"S )$u   
        Запускаем при изменении лицензий и ежесуточно, для пересчёта статусов и актуализации счётчиков.
        r   c                      s    d7   d dkrt   d S )Nr   rR   r   )
cmf_commitr3   )bulk_commit_countr3   r4   bulk_commit  s    z3CmfLicense.recalc_users_counts.<locals>.bulk_commitrb  r   r(   r   r   r'   r   r
   rV   r  r8   Tdoes_not_workFrZ  r/  )r   r   sliceZorder_byc                 3   s   | ]}t  |V  qd S r-   r9   r<   r  s_personr3   r4   r>     s     z1CmfLicense.recalc_users_counts.<locals>.<genexpr>r   c                 3   s   | ]}t  |V  qd S r-   r9   r  r  r3   r4   r>     s     )r   recalc_users_counts(): %szClear ZEcoz license on r  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   r:   rb  r'   rh  r,  r-  setattrr  rf   r   r(   )r  Z
lic_field2)rw   licensepersonr  r3   r4   take_license  s,    z4CmfLicense.recalc_users_counts.<locals>.take_license)r   r   N)rZ  ) r   r   r   r   r   ri   r(   r   r   addrh   ri  r   r
  r  r   rZ  r   r   allr   anyextenditemsr:   r   r  r,  r-  rh  r  rb  )r  r   Zg2pr]  Zis_ecoZlic_users_countsZset_license_queueZbulk_offsetZ	bulk_sizeZperson_slistZperson_productsZs_groupZgroup_productsZclear_product_fieldsZneed_licenser  r  Ztakenr3   )r  rw   r  r  r  r  r4   r  z  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                 C   s   |   }|j|jkS r-   )r  r   r   )rw   r]  r  r3   r3   r4   is_license_group  s    zCmfLicense.is_license_groupc                    s   fdd} j dddd|jggddd	gd
}|s:d S d j  jrZjr^d S j}|D ]"jdkrt	fdd j D rj
jk r j D ]}t|d q j
d7  _
jdd tddj d dj
 dj  n|  qh jj }t|shj
jk rt|d  j
d7  _
jdd tddj d dj
 dj  qh|  qh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   ". Необходимо расширить лицензию или ограничить количество пользователей с доступом к лицензии.Tr#  u#   Для учётной записи uE    функционал продукта будет ограничен.r   u2    функционал продукта после r  u    будет ограничен.uI   Превышен лимит пользователей лицензии "z". u;    Необходимо расширить лицензию .)r  Z
api_methodr  Zloginr(   r  r   r_   r`   ra   r  )r  Zlimit_date_inforw   r  r   r3   r4   user_limit_alert  s    

z6CmfLicense.take_user_license.<locals>.user_limit_alertr   EXISTSr   r8   rb  r'   r(   rY  r  r  r
   c                 3   s   | ]}t  | V  qd S r-   r9   r  r   r3   r4   r>   0  s     z/CmfLicense.take_user_license.<locals>.<genexpr>Tr   r  ztake_user_license(): %sr  r  r  r  )r  r  )r   r   r  r
  r  r  r  rs  r(   r  rb  r'   r  rh  r,  r-  r:   r  r   r   r  )rw   r   r]  r  r   was_changedr  r3   r  r4   take_user_license  sL    
 
 zCmfLicense.take_user_licensec                    sT  | j dddd|jggdddgd} | j   j}|D ]}|jd	krt fd
d| j D r| jd8  _|j	dd | j D ]}t
 |d qtdd  d|j d|j  q>| j|j }t |r>t
 |d | jd8  _|j	dd tdd|j d  d|j d|j  q> jrD|sD j	dd ttjj d S )Nr   r  r   r8   rb  r(   r'   rY  r
   c                 3   s   | ]}t  |V  qd S r-   r9   r  r  r3   r4   r>   Z  s     z2CmfLicense.release_user_license.<locals>.<genexpr>r   Tr  Fzrelease_user_license(): %szRemove EvaEco license from r  r  Remove  license from )r   r   r  r
  r  rs  r(   r  rb  rh  r  r,  r-  r'   r:   r  r   r   r  )rw   r   r]  r   r  r  r  r3   r  r4   release_user_licenseO  s:    

 zCmfLicense.release_user_licensec                    s&    | j  t fdd| j D s2d S | jdddgd}|sLd S |D ]}|jdkr| jd8  _|  | j D ]}t |d	 q~t	
d
d|j d  d|j d|j  qP| j|j}t |rPt |d	 | jd8  _|  t	
d
d|j d  d|j d|j  qPd S )Nc                 3   s   | ]}t  |V  qd S r-   r9   r  r  r3   r4   r>   x  s     z7CmfLicense.release_all_user_licenses.<locals>.<genexpr>r   rb  r(   r   r
   r   Fzrelease_all_user_licenses(): %sr  r  r  r  )r  r
  r  r  r   r(   rb  rh  r  r,  r-  r'   r   r:   )rw   r   r   r  r  r3   r  r4   release_all_user_licensesr  s2    
 
 z$CmfLicense.release_all_user_licensesc                 O   s   d S r-   r3   )rw   _argsr   r3   r3   r4   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 )NrN  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A+p6V7I=zRegMapEncKey__cvvnsdfjh4!4566Tr  r  )rB   r   rT  r   rU  r  r  r  r  r  r   )rw   r/   Zrmr  Zreg_map_encryptedZreg_map_binZreg_mapr3   r3   r4   r^    s   3  N
zCmfLicense._compat_regnum)T)NN)N)N)N)NN)ErD   rI   rJ   rK   r   r   r   r   Zapi_methodsremover_   r`   r  r  r  r1  r  r   Z	dataclassr   r   Zon_server_eventr   r   r   r   r   r   r  r  r  r<  r2  r   r   r   rQ  r   rG  r   rj  rk  rp  rq  ru  ry  r{  r  r  	Exceptionr  r  rH  ra  r   r  r  rh  re  Zcmf_deferred_jobr  r
  r  r  r  r  r   r^  __classcell__r3   r3   r  r4   r     s   




 

D
 )
.

	A
N?'
&

! 


C
"
!
r   c                 C   s   | dkrd S )Nrl  r3   )Zlicense_coder3   r3   r4   rn    s    rn  )r  r   r_   r   r   r   collectionsr   typingr   Zcmf.includeZcommon.models.cmf_active_entityr   Zmodules.settings.fieldsr   r   r   r   rn  r3   r3   r3   r4   <module>   s<     ( ?             9