U
    Įwh                    @   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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   rQ   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)rC   rH   rI   dataclassesZfieldtimer   float__annotations__r   rh   r   r   listr   setr   r   r   dictr   r   boolr   r   r   rg   r   r   r   r2   r2   r2   r3   _LicCacheData  s    
r   CmfLicense:changed)Zchannelc                  K   s   t   d S r,   )r   _clear_cache)_kwargsr2   r2   r3   on_license_changed#  s    zCmfLicense.on_license_changedN
_lic_cachec                 C   s
   d t _d S r,   )r   r   rv   r2   r2   r3   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   r2   r2   r3   _check_is_cloud0  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 r2   )r   id)r;   licZ	lic_groupr2   r2   r3   	<setcomp>I  s    z*CmfLicense._check_cache.<locals>.<setcomp>)r	   r   r   r   r   r   r   c                 S   s   i | ]}|j |qS r2   r'   r;   r   r2   r2   r3   
<dictcomp>Q  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   r   V  s     
 c                 S   s   h | ]
}|j qS r2   r   r   r2   r2   r3   r   Z  s     r   r   userr      adminrQ   rL   codeZLIKEz%eva%T)filterinclude_deleteddisabledfullcompatF))r   r   r   r   r   rh   modelsCmfPersonGroupZadmin_groupr   slistr   r   r   r   updater   r^   r_   r`   r   r)   rO   r   appendr'   r   r   minr   r   r   r   r   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_cache6  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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   До окончания срока активации лицензий r5   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   rA   r   r   r   r   r   )rv   r  Znotify_periodwarnr2   r2   r3   license_api_notify  s    


  

        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	}zt	j
sl|jrtd
}ndt	jjsd}nT|jdkrd}nB|jdkr|jj | jk rd}nt|tjr|jr|jdkr| d n |jdkr| d n
| d d}nt|tjrzt|jjtjs6d}nj|jj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
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!rz| d d}W nh tk
r   d|jkrvd|jkrv |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r"|| j(k r"d}|| j)krX|j*t	j+krXd}|| j,krhd}|rt-j.j/j0d(| d)t	jj d*d+dd,r||jkrtd-| d.| j(d/d0 nJ||j1krtd1| d2| j(d/d0 n"td3| d.t2| j(| j3d/d0 t4dd|d4| n|jdkr||j1kr|| j3k rt-j.j/j0d(| d)t	jj d*d+dd,rtd3| d.| j3d/d0 t4dd|d4| nt4dd|d5|  W 5 d }~X Y n> t5k
r } zt4dd|d6|   W 5 d }~X Y nX d S )7N)
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 taskr   uw   Объект доступен только для чтения. В рамках бесплатной лицензии "u`   " редактирование разрешено только Владельцу проектаTabortprojectr7   parentFr   rS   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: )6
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  r   r)   r   Zcmf_owner_idr  nameZCmfLicenseErrorr   r   r  r  r   	TypeErrortypeargsr^   r`   r   r  r   r  r  r  r  r  r   r   maxr  warningZCmfAbortError)	rv   objr  reasonZlicense_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+  r6  )Z	error_clsZ
error_argsr  raise_errorr2   r3   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   r9   r  r  ZCmfLicenseUserAbsentErrorr+  r,  )rv   r  r=  r>  r  Z
simple_licr  r2   r<  r3   r0    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   fromisoformatr5  rO   r   r   r   r)   rC  r'   r   r   )rv   demo_periodqstater`   Zdeadline_strr@  Zdemo_productsrD  org_namer   Zdel_productr2   rA  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+   )rK  )rE  r   rh   r   rf   re   _org_name_replace_resublowerr   sha1r   digestrg   
from_bytesr^   r_   r`   rc   r   rr   )rv   r  rK  r   Zorg_name_strZorg_name_hashr%   r.   r2   r2   r3   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)rv   r  r2   r2   r3   rE    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. Вам нужно предварительно удалить лицензии на другие продукты.r7   u  У вас уже есть лицензии EvaEco. Её можно заменить только лицензией на EvaEco, либо предварительно удалить лицензию EvaEco для активации другого продукта.r   r   rN   r?  registerr@  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)r1  )r;   groupr2   r2   r3   r=     s     z*CmfLicense.apply_regnum.<locals>.<genexpr>r   u
   У Вас u.    пользователей в группах u    лицензии "uH   ". Что превышает ограничение лицензии в u    пользователей. Часть пользователей смогут использовать функционал продукта только до u   г. Пожалуйста, измените количество пользователей в соответствии с текущей лицензией до указанной даты.u    пользователей. Пожалуйста, измените количество пользователей в соответствии с текущей лицензией.)1rE  _compat_regnumr  r   r   rK   r'   r   r)   r^   rc   rF  r_   r`   r   	isoformatrG  r*   re   rO   r   now_CmfLicense__lic_st_setr(   r&   rd   
user_countZclonecmfutildisable_acldeleter+   rh   Zlic_user_limit_strr%   rC  
lic_regnumr   lic_end_date_strsaver   	CmfPersonr   r  rA   r   r  _new_license_menu_fixr   )rv   r.   rK  r   Z
new_regnumZparsed_regnumrB  rH  rI  rJ  r`   r@  r   re  Zold_licenseZnew_licenseZperson_countr  Z
groups_strr2   r2   r3   r   )  s    






"



*
 zCmfLicense.apply_regnumc                 C   s   | j dddkr| | d S )NT)r   r   )r   landing_page2license)rv   r   r2   r2   r3   rh    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_mailra  rb  rf  onboarding_tuning)rv   r   global_settingsZcode_mappingr2   r2   r3   ri    sB    
zCmfLicense.landing_page2licensec                 C   s   t jjdgd}|  d S )Nr   r   )r   rk  r   rf  )rv   rm  r2   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CmfDater^  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.   Неверный ключ активации: r"  )r   rd  
is_changedr   r   r)   r.  stripr   r   r  rK   r   r4  )r1   Z_activation_coder9  r#  r2   r2   r3   _calc_activation_statusF  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 )
Nr?  r   
activation	corrupted<   rN   )r@  rU  r@  r   )rF  r^   r_   r`   r   r'   r_  r   rc   r]  r.  rG  rO   )r1   rI  rJ  r`   r@  r2   r2   r3   _calc_activation_days_leftb  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_statusw  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'   rq  r*   r&   r)   r+   lic_coder1  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   Система управления предприятием EvaProjectrL  r   zEducation Editionu1    для образовательных целейr
   zEcoSystem Editionz Editionu    на u    пользователейuT   , без ограничений по количеству пользователейr!   u    бессрочно,uH   Право использования программы для ЭВМ "uI   " на условиях неисключительной лицензииz ( r?   uE   , свидетельство 2023662166, номер 18285 в ЕРРП)textr'   rq  r&   r*   r|  r)   )r1   Z	prog_nameZedu_txtZproduct_nameZ
user_limitZ
unlim_textZperpetual_textr2   r2   r3   
_calc_text  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 )Nr?  cmf_ver_cookie
cmf_cookieTr   TECHCOM_nocachegs_idanonymous@evateam.rur   r   r  Zvalidater   r  r   F)rU  r@  rV  )ru  rt  r   )r   rk  r   fix_gsidr   r  r  rg  r   rR  r   rS  base64	b64decoder.  re   r  _CmfLicense__st_convjsonloads)
rv   r   gsr  p_idkey	encryptedZ	decrypteddataru  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 )Nr?  r  r  Tr  r  r   r  r  )r  Z	only_data)r   rk  r   r  r   r  rg  r   rR  r   rS  r  dumpsr  r  Z	b64encodedecoder  ra  rb  rf  )	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 )NrM  FrN  )rg   rT  )dr2   r2   r3   	bytes2int6  s    z1CmfLicense.get_activation_hwid.<locals>.bytes2intr   r   Z05dr]   r   r   )	r   rk  r  r   r   r   rR  r   rS  )rv   r  r  r   Z
hash_bytesZhwidr2   r2   r3   r   2  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-  r|  r   r   r   r  r'   r  r&   r*   r   )supersave_preload_fieldsr<   rB   r2   r3   r  D  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 )Nrp  r   )rd  rq  r   r   r  r  r  ro  rs  rw  ry  r  r   r   r   r   Z
user_groupZlic_start_dater^  r&   schedule_deferred_jobr   recalc_users_countsr  rf  r   cmf_emit_server_event)r1   r4  kwargsretr  r2   r3   rf  J  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  rc  r  )r1   r  r  r2   r3   rc  k  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   rQ   r   )
cmf_commitr2   )bulk_commit_countr2   r3   bulk_commit{  s    z3CmfLicense.recalc_users_counts.<locals>.bulk_commitr`  r   r'   r   r   r&   r   r
   rU   r  r7   Tdoes_not_workFrX  r-  )r   r   sliceZorder_byc                 3   s   | ]}t  |V  qd S r,   r8   r;   r  s_personr2   r3   r=     s     z1CmfLicense.recalc_users_counts.<locals>.<genexpr>r   c                 3   s   | ]}t  |V  qd S r,   r8   r  r  r2   r3   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   r9   r`  r&   rf  r+  r,  setattrr
  re   r   r'   )r  Z
lic_field2)rv   licensepersonr  r2   r3   take_license  s,    z4CmfLicense.recalc_users_counts.<locals>.take_license)r   r   N)rX  ) r   r   r   r   r   rh   r'   r   r   addrg   rg  r   r	  r
  r   rX  r   r   allr   anyextenditemsr9   r   r  r+  r,  rf  r  r`  )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takenr2   )r  rv   r  r  r  r  r3   r  q  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   )rv   r[  r  r2   r2   r3   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_   r`   r  )r  Zlimit_date_inforv   r  r   r2   r3   user_limit_alert  s    

z6CmfLicense.take_user_license.<locals>.user_limit_alertr   EXISTSr   r7   r`  r&   r'   rW  r  r  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   r  ztake_user_license(): %sr  r  r  r  )r  r  )r   r   r}  r	  r
  r  r  rq  r'   r  r`  r&   r  rf  r+  r,  r9   r  r   r   r  )rv   r   r[  r  r   was_changedr  r2   r  r3   take_user_license  sL    
 
 zCmfLicense.take_user_licensec                    sR  | 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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rB|sB j	dd ttjj d S )Nr   r  r   r7   r`  r'   rW  r
   c                 3   s   | ]}t  |V  qd S r,   r8   r  r  r2   r3   r=   Q  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
  rq  r'   r  r`  rf  r  r+  r,  r&   r9   r  r   r   r  )rv   r   r[  r   r  r  r  r2   r  r3   release_user_licenseF  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=   n  s     z7CmfLicense.release_all_user_licenses.<locals>.<genexpr>r   r`  r'   r   r
   r   Fzrelease_all_user_licenses(): %sr  r  r  r  )r  r	  r
  r   r'   r`  rf  r  r+  r,  r&   r   r9   )rv   r   r   r  r  r2   r  r3   release_all_user_licensesi  s0    
 
 z$CmfLicense.release_all_user_licensesc                 O   s   d S r,   r2   )rv   _argsr   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 )NrL  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A+p6V7I=zRegMapEncKey__cvvnsdfjh4!4566Tr  r  )rA   r   rR  r   rS  r  r  r  r  r  r   )rv   r.   Zrmr  Zreg_map_encryptedZreg_map_binZreg_mapr2   r2   r3   r\    s   3  N
zCmfLicense._compat_regnum)T)NN)N)N)N)NN)ErC   rH   rI   rJ   r   r   r   r   Zapi_methodsremover^   r_   r  r  r   r/  r  r   Z	dataclassr   r   Zon_server_eventr   r   r   r   r   r   r  r  r  r:  r0  r   r   r   rO  r   rE  r   rh  ri  rn  ro  rs  rw  ry  r  r  	Exceptionr  r  rF  r_  r   r  r  rf  rc  Zcmf_deferred_jobr  r	  r  r  r  r  r   r\  __classcell__r2   r2   r  r3   r     s   




 

D
 #
.

	A
N>'
&

! 


C
"
 
r   c                 C   s   | dkrd S )Nrj  r2   )Zlicense_coder2   r2   r3   rl    s    rl  )r  r   r^   r   r   r   collectionsr   typingr   Zcmf.includeZcommon.models.cmf_active_entityr   Zmodules.settings.fieldsr   r   r   r   rl  r2   r2   r2   r3   <module>   s<     & ?             1