U
    ,ncci                  	   @   s  d Z 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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mZ ejejeZededede ejd	 d
d Ze  ddlmZ G dd dZe Ze  ddl T ddl!Z!dej"kre#e$ ddl%m&Z& e&'  ddl(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0 ddl1m2Z2m3Z3m4Z4 dd Z5dd Z6dd Z7dd Z8dd Z9dd Z:dd l(m;Z; d!d" Z<d#d$ Z=d%d& Z>d?d(d)Z?d*d+ Z@d,d- ZAd.d/ ZBd@d0d1ZCd2d3 ZDd4d5 ZEd6d7 ZFd8d9 ZGeHd:d;d<ZId=d> ZJdS )Au   Magage.py занимается построением аппликейшена и не переопределяет функции и не создает функции в апп    N)OrderedDict)fields)init_system_datazrunning:inz	from cwd:filec                  C   s@   t jt  d} t jt  d}t j| s<t||  d S )Nzcustom/config.pyzcustom/config.py.example)ospathjoingetcwdexistsshutilcopy)Zconfig_pathZexample_path r   2/opt/eva_deploy/var/repos/active_crm/cmf/manage.pycheck_config   s    r   Pathc                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	WorkModelFileu  
    Почему бы не создать целый класс для одного файла, гг?
    Захотел прибить гвоздями весь код, работающий с ним в одно место, а не размазывать по manage.py
    c                 C   s(   t t d | _t t d | _d S )Nz__autogen_models_tmp.pyz__autogen_models.py)r   r   r   filepath	orig_path)selfr   r   r   __init__,   s    zWorkModelFile.__init__c              	   C   s&   t | jd}|d W 5 Q R X dS )u    Зануляем файл чтобы иметь объект модуля-заглушки для Чёрной Магии (тм) wz# cleanN)openr   write)r   fpr   r   r   clean0   s    zWorkModelFile.cleanc              
   C   s   | j  std td nnt| j T}| j| jj dt  }t|d}|	|
  W 5 Q R X || j W 5 Q R X t| dS )uw  
        Закидываем в заглушку настоящую модель (тупо копируем всё из __autogen в __autogen_tmp) и реимпортим в память
        _models, а не models чтобы ясно было что его на момент объявления ещё нет и он передаётся аргументом
        u   WARNING: Разработчик! Вызови `python3 manage.py autogen`, воссоздай удалённые тобой моделиu6   Хотя скорее всего он и вызван..r   N)r   r   printr   r   	with_namenamer   getpidr   readrename	importlibreload)r   Z_modelsZmodels_origZtmp_file_pathfdr   r   r   fill5   s    

zWorkModelFile.fillN)__name__
__module____qualname____doc__r   r   r(   r   r   r   r   r   '   s   r   )*autogen)RelationCache)APPcmf_contextapp_init_aclspawn_task_workerspawn_task_schedulerspawn_messenger_socketio_clientspawn_whatsapp_socketio_clientspawn_server_event_listener)init_dsinit_dbrollback_all_dsc                   C   s$   t   tjd t  t  tS )Nzcmf/config_load.py)install_traceback_email_notifyr0   configfrom_pyfilestart_views	CMF_CACHEflushallr   r   r   r   uwsgi`   s
    rA   c                  O   s\   t   tjtjtjtd  t	
t t  t  t  t  tdddg d S )N/config_load.pyZworkerz--poolgevent)r;   r0   r<   r=   r   r	   dirnameabspath__file__socketioinit_appr>   r8   r2   r4   Z
celery_appZworker_main)_args_kwargsr   r   r   start_celery_workerj   s    
rK   c                  O   s   t   tjtjtjtd  dt_	t
t t  i }d|d< d| krXd|d< d}d| krhd}d}d| krxd}d}| D ]}d	|krt|d
d }qt  t  tjrdtjd< |rt  t  t
jtfd||d| d S )NrB   FZuse_reloaderz--auto-reloadTz--no-debuggerz--with-celeryi  z--port=   1ZSOCKETIOz0.0.0.0)hostportdebug)r;   r0   r<   r=   r   r	   rD   rE   rF   Zdisable_permissionsrG   rH   r>   intsplitr?   r@   r8   ZWHATSAPP_MESSENGER_URLenvironr3   r4   run)argskwargsoptionsrQ   Zwith_celeryrP   argr   r   r   startx   s:    

rZ   c               	   C   sL   t d8 ddlm}  t  t  t  t  |   t	  W 5 Q R X d S )N/r   before_request)
r0   test_request_contextcmf.appr]   r>   r8   r9   r?   r@   r   r\   r   r   r   cmf_init_db   s    r`   c                  C   sj   t tdd rftd ddlm}  ddlm} ddlm	} | t
tjd}||j}|tj || d S )N
SENTRY_DSNzInstall sentry hookr   )Sentry)SentryHandler)setup_logging)Zdsn)getattrr<   logginginfoZraven.contrib.flaskrb   Zraven.handlers.loggingrc   Z
raven.confrd   r0   ra   ZclientsetLevelERROR)rb   rc   rd   ZsentryZ	l_handlerr   r   r   install_sentry_hook   s    

rj   c                     s   dd } t tdd sd S td tjtttfs>tdt tdd sRtdtj	 t tdd sltd	tj
 fd
d}tt| |t_d S )Nc                 S   s   d S Nr   )xr   r   r   <lambda>       z0install_traceback_email_notify.<locals>.<lambda>TRACEBACK_EMAIL_NOTIFYzInstall traceback email notifyuC   Параметр TRACEBACK_EMAIL_NOTIFY - это список emailTRACEBACK_EMAIL_NOTIFY_FROMu*   Укажите TRACEBACK_EMAIL_NOTIFY_FROM%TRACEBACK_EMAIL_NOTIFY_SUBJECT_PREFIXu4   Укажите TRACEBACK_EMAIL_NOTIFY_SUBJECT_PREFIXc              
      sz  dd l }ddlm} ddlm} ddlm} ddlm} d	|j
|j}dt| dd	| g}|d
 |d |d	 |j}t| }	|	D ]}
|d|
||
f  qd
|d
 }|d}||d<  |d< d|d< |d}|| ||}|| z|ddd}W n8 tk
rR } zt| | W Y d S d }~X Y nX |  | |  |  d S )Nr   )request)SMTP)MIMEMultipart)MIMETextz{} Cmf traceback {} {}u,   Проблема на веб-сервере:z
Traceback:zP================================================================================
zRequest Information:z%s: %srelatedZSubjectZFromz, ZToalternativezsmtp.carbonsoft.ru:25251   )timeout)	tracebackZflaskrr   Zsmtplibrs   Zemail.mime.multipartrt   Zemail.mime.textru   formatmethodurlstr
format_excappendrT   sortedkeysgetr
   attachOSErrorr   ZehloZsendmail	as_stringquit)	exceptionr{   Z	__requestrs   rt   ru   subjectZmsg_contentsrT   ZenvironkeyskeybodyZmsg_rootZmsg_alternativeplainZsmtpeZ	mail_fromZmail_toZsubject_prefixr   r   traceback_exception   sP      




z;install_traceback_email_notify.<locals>.traceback_exception)re   r<   rf   rg   ro   
isinstancelisttupleAssertionErrorrp   rq   r0   Zregister_error_handler	Exceptioncmf_exception_mail)r   r   r   r   r   r;      s<    
     0r;   )CustomJSONEncoderc                  C   s   t d tjdr$t d d S d} tj| rTt| }t |j dk rTd S t d t	j
ddgt	jd	}| d
 d}t |  | dkrtd  t|   d S )Nu:   Проверяем, нужно ли подпулить cmfz./cmf/.cmf_need_updatez+Cmf need update! Run ./manage.py cmf_updatez./cmf/.cmf_last_check_updatei  u<   Проверяем, нужно ли cmf обновитьсяz ./cmf/bin/git_check_need_pull.shz./cmfstdoutr   UTF-8zNeed to pull)rf   rQ   r   r	   r   rg   stattimest_mtime
subprocessPopenPIPEcommunicatedecodestripr   touch)Zlast_check_filenameZstatbufprocessoutputr   r   r   check_cmf_need_update  s&    



 r   c                   C   s   dS )u   Не нужно сейчас.
     Считаем, что когда в проект будут копироваться сложные файлы, которые нужно обновлять - доделаемNr   r   r   r   r   check_project_need_update_cmf  s    r   c                  C   sR   t d tjdgtjd} |  d d}t | tj	drNt
d d S )Nu   Обновляем cmfz./cmf/bin/cmf_update.shr   r   r   z./.cmf_need_update)rf   rg   r   r   r   r   r   r   r	   r   remove)r   r   r   r   r   
cmf_updateC  s    

r   Tc              	   C   sr  t jt jdd t  t j tdd< ddlm} ddlm	} ddl
m} dd l}dd l}dd l}|j}	t |jj |s| stj }|rt|t t  n| rVtjd	}
|
fd
d}tj|
rt|
 t| t d t d t d t d t d t!t"#t j$ dt%_&t'dtj(d |j)t d |  nt'dtj(d W 5 Q R X d S )Nz:%(asctime)s %(process)d %(name)s %(levelname)s %(message)s)levelr|   TZinit_views_and_dsr   r:   commit_with_eventtimeitz~/.cmf_historyc                 S   s   t |  d S rk   )readlinewrite_history_file)Zhistory_pathr   r   r   save_historye  s    zcmf_shell.<locals>.save_historyztab: completezset show-all-if-ambiguous onzset show-all-if-unmodified onzset completion-query-items 200z set colored-completion-prefix onshell#!!! Use commit() to commit changes.r   )localzNothing to exec)*rf   basicConfigINFO	getLoggerrh   r1   cmf.data_providers.baser:   r_   r   cmf.cmf_profiler   codecmf.includepprintlocalsupdateinclude__dict__sysstdinr#   execglobalsr   r	   
expanduserr   r   read_history_fileatexitregisterparse_and_bindZset_completerrlcompleterZ	CompleterZcompleteginteractive_shellr   stderrZinteract)interactivescriptrV   rollbackcommitr   Z__codecmfr   ppZ__history_pathr   r   r   r   	cmf_shellL  s@    







r   c               	      s   ddl m}  ddlm} ddlm  ddlm} ddlm	} dd l
} fdd}|j
}| }d	|j_td
d* dt_tdtjd | |d    W 5 Q R X d S )Nr   )embed)
get_configr   r   r   c                      s"      t tjtjftj d S rk   )r   execvr   
executableargvr   r   r   r   r&     s    zipython.<locals>.reloadZneutralTr   ishellr   r   )r<   )ZIPythonr   Ztraitlets.configr   r   r:   r_   r   r   r   r   ZInteractiveShellEmbedZcolorsr1   r   r   r   r   r   )r   r   r   r   r   r&   r   cr   r   r   ipythonz  s    
r   c              	   C   s8   t d& dtjd< ddlm} ||  W 5 Q R X dS )u|   
    :param email: почта админа созданная на этапе acrm_assign.sh --admin=test@carbonsoft.ru
    TrN   NO_CACHEr   )	demo_dataN)r1   r   rT   r   r   create)emailr   r   r   r   init_demo_data  s    

r   c                  C   s   ddl m}  |   }|d }|d }| rBtd| d d S ddlm} |d}|	|
d	 |	| 
d	 d S )
Nr   r   Zjwt_rsazjwt_rsa.pubZFilezalready exists)RSAi   ZPEM)pathlibr   resolver   r   absoluteZCrypto.PublicKeyr   Zgeneratewrite_bytesZ
export_keyZ	publickey)r   Zproj_dirZrsa_private_pathZrsa_public_pathr   r   r   r   r   generate_rsa_keypair  s    

r   c              	   C   s   dt jd< t  t  g }ttD ]V}|dkr0q"tt| }t|sHq"t|t	jj
sXq"d|jkrnd|jkrnq"|| q"t }|D ]}||}q| rt| d}|tj|tdd W 5 Q R X nttj|tdd d S )	NrN   r   )ZCmfRFilerightleftw+   )clsindent)r   rT   r>   r8   varsmodelsinspectisclass
issubclassr   Z	BaseModelr   r   r   Zdump_data_dictr   r   jsondumpsr   r   )	file_pathZ
all_models
model_namemodelresfr   r   r   dump_db  s,    

"r   c              	      sZ   dt jd< t  t  t| d}t|  W 5 Q R X d fdd	}|  |d d S )	NrN   r   rFc                    s   D ]}zt t| }W n   t| d Y qY nX d } | D ]}td |j|j}||jj|d k }|rtd |d }| sqFntd |dd}|D ]}|d	krtd
 q|	|ddkrqt
||std| d| d qt||}tt|tjsq|	|d kr2|js2qt|tjs^t|tjrf|js^|jrf| sfqt|tjr|| D ]|}	zPtj|	d }
|
j|
j}||
jj|	d k }|r||d  W n$   td|	d   Y q|Y nX q|qt|tjr|	|d sqqt|tjr|js<|jrzt||jd d ||  W n.   td| d|j d|j  Y qY nX qt|tjr|| d krq||| |_q|| |_q|	ddd kr|dkrtd|j  qF|jdd qF|r|j   qd S )Nu    больше нетz&======================================idZ	HHHHHHHHHr   zHHHHHHHHH newT)emptyZis_newu+   WARNING: служебное поле is_newu   WARNING: Поля u    нет в модели !u3   Не возможно создать связь с Z_idu,   WARNING не удалось задать FK z = u    для обьекта r   z-1CmfTasku%   WARNING задача без кода )Z	only_data)!r   r   r   dpZquery_deprecatedZdp_modelfilterr   allr   hasattrre   r   typer   ZCmfTypenullabler   Z
CmfRelBaseZCmfTUUIDforeign_keyforeign_keysZ
CmfM2MBaseZget_cls_by_tuuid_strr   ZCmfRelationBasesetattr
class_name_valueZCmfDateTimecastsaver   )Zwith_relr   r   inst	inst_dictqZinstsr   fielditemZ
list_modelr   r   r   r     s    





zrestore_db.<locals>.processT)F)r   rT   r>   r8   r   r   loadsr#   )r   r   r   r   r  r   
restore_db  s    
Rr  c               	      s   dt jd< t  t  t  ddlm  ddlm}  t	d |   t
jjdd}t
jjd	d} fd
d}| }tdD ]T}|j| |  |d tdt|jjd d |j| |  |d q||  W 5 Q R X d S )NrN   r   r   r   r\   r[   z
DEV-004234)r   z/cmfproject-6597795c-95ce-11ea-9023-6f4fdd48682bc                     s0      d fdd	} fdd| _ | S )N c                    s   t |       d S rk   r   )s)nowr   r   r   wrap;  s    z&prod_test.<locals>.timer.<locals>.wrapc                      s   t d   S )Nendr  r   )rZ   r   r   r   rm   @  rn   z*prod_test.<locals>.timer.<locals>.<lambda>)r  )r!  )r   r  )r  rZ   r   timer7  s
    zprod_test.<locals>.timer
   r   
all_nested)r  r   )r   rT   r>   r8   r9   r   r_   r]   r0   r^   r   r  r   Z
CmfProjectrangeZ	executorsr   Z_test_save_commitr   lenr$  r   r!  )r]   taskZprojectr"  tir   r  r   	prod_test)  s*    

r*  c                 C   sZ   |  dd } tj dtj d d|  d}ttj d| t	d|  d S )N _/patch/z
%Y%m%d%H%M.pyz/cmf/contrib/patch-example.py#   Сгенерирован файл: )
replacelowerr<   PROJECT_DIRdatetimer  strftimer   r   r   )r!   r   r   r   r   	new_patchU  s    $r5  c               	      s    fdd} t   g }tjtj ds0dS ttj dD ]$}t	d|rB|
|dd  qB|  |std dS td	d
N tjjdgdgd}|s|d  |   n|D ]  |jjkr|   qW 5 Q R X dS )u?   
    Накладываем патчи по очереди
    c              
      s   dt j d|  d}tj d  zPt|ddddd\}}}td  d	|  td  d
|  tjj  W n4 t	k
r } zt
d |  |W 5 d }~X Y nX d S )Nz(cd z; python3 -m patch.)r!   FT)ZsudoZseparate_out_and_errZdo_raiseZ	do_decodezPatch z	 stdout: z	 stderr: uI   Произошла ошибка накатывания патча %s (%s))r<   r2  r   CmfPatchr  Zrun_bash_commandr   r  r   r   rf   r   )Z
patch_namecmdZerrcodeouterrr   r7  r   r   apply_patch`  s     zpatch.<locals>.apply_patchr-  Nz[0-9]+_.*\.pyr   r   u0   Не найдено ни одного патчаTr   z-namer-   )order_byr   r  )r?   r@   r   r	   r   r<   r2  listdirrematchr   rS   sortr   r1   r   r8  r   r!   value)r<  ZpatchesfilenameZ
last_patchr   r7  r   patch\  s(    
rD  r7  c              	   C   s   i }t tjtjdg}||d< t jf |}tj dtj	 
d d}t|d$}|d}||d| i W 5 Q R X td	|  d S )
Nzcmf/contribloaderz/tests/test_z%Y%m%d%H%M%Sr.  r   ztest.py.tmplr!   r/  )Zjinja2ZFileSystemLoaderr   r	   r
   r<   r2  ZEnvironmentr3  r  r4  r   get_templater   renderr   )r!   _optionsZ_loaderZ
_jinja_envr   r   templater   r   r   new_test  s    
rJ  c               	   C   sV  t   t } | jdtdd | jdtdd |  \}}|jdkrJt S |jdkr`t|  n|jdkrvt	|  n|jd	krt
  n|jd
krt  n|jdkrt  n|jdkrtd| n|jdkrtd| nh|jdkrt  nT|jdkr(|jstdt|j n*|jdkr>t  n|jdkrTt|  n|jdkrjt|  n|jdkrddlm} |  n|jdkrttj d|d n|jdkrt|d  }| }W 5 Q R X ttj ||d n\|jdkr
t   nH|j!ds&|j!dr4t"#|j nt$d tj%dtj& t'd! d S )"Ncommandzrun command)r
  helpz--emailu"   Почта (для init_demo_data)rA   rZ   Zcelery_workerr   r9   r*  r5  r+  rJ  rD  r   us   Нужно указать почту владельца CRM для инициализации демо-данныхr   r   r  r.   r   )make__autogen_modelsr   rv   )r   r   r   )r   r   rV   )r   r   zbin.zsbin.u$   Команда не найдена:    )(rj   argparseArgumentParseradd_argumentr   parse_known_argsrK  rA   rZ   rK   r   r`   r*  r5  r
   rJ  rD  r   r   r   r   r   r  Zcmf.make_modelsrM  r   r   r   isattyr   r   r#   r   
startswithr%   import_moduler   r   r   exit)parserrV   Zunknown_argsrM  Zscript_filer   r   r   r   main  s^    















rX  )TNN)N)Kr,   asyncioZcmf.monkey_patchr   r3  r   r   r   r   r   r   r   r   collectionsr   r   Zcmf.system_datar   r	   rD   rE   rF   ZCUR_DIRr   r   r   r   r   r   r   Z
work_modelr   r   rC   r   r(   r   Zcmf.fields.cmf_relation_cacher/   Zbuild_fields_cacher_   r0   r1   r2   r3   r4   r5   r6   r7   r   r8   r9   r:   rA   rK   rZ   r`   rj   r;   r   r   r   r   r   r   r   r   r   r  r*  r5  rD  r   rJ  rX  r   r   r   r   <module>   sf   
(
+J$	
.
_,(