
    h                     n   d Z ddlmZmZmZ ddlmZ ddlmZ ddlZddlm	Z	m
Z
mZmZ ddlmZ  ej        ej                  Zdadag Zej         d	Zd
 Zedefd            Zd Zd Zed             Zedededefd            Zede	j        dede fd            Z!ede	j"        de fd            Z#ed             Z$de	j%        fdZ&dAdZ'dBde	j(        fdZ)dBde	j(        fd Z*edBde	j(        fd!            Z+	 dBdede	j(        d"e	j,        d#efd$Z-d% Z.dBd&e	j(        pe	j%        fd'Z/dBd&e	j(        pe	j%        d(efd)Z0	 dBdede	j(        d*e	j1        d+efd,Z2	 dBdede	j(        d*e	j1        d+efd-Z3de	j(        d.e	j4        d/efd0Z5d1ed2e	j6        d.e	j4        pdde	j(        d3e	j7        pdf
d4Z8d1e	j9        de fd5Z:eded6efd7            Z;d8 Z<ed9             Z=eded6ed:e	j>        fd;            Z?eded6ed:e	j>        fd<            Z@eded=eAfd>            ZBeded6ed:e	j>        d?e	jC        d2e	j6        f
d@            ZDdS )Cu7  
Изначальная постановка:
    1. Найти по email CmfPerson
    2. Создать проект P
    3. Создать внутри проекта P список L
    4. Создать внутри списка L задачу T
    5. Выставить задаче T kanban-статус S

projects:
 project:
  folder: # входящие - сразу канбан, в работе — папка с канбанами.
   kanban:
    status:
     task:
      comment1

Почему YAML, а не тупо восстановление дампа:
- нужно назначить в нужных местах правильного Person, созданного при assign
- восстановление дампа отвалится с первым же рефакторингом схемы.
    )datetime	timedeltatimezone)Path)randomN)modelsgconfigAPP)set_current_person   z/custom/greetings_doc_id.txtc                       fd}|S )u   
    Декоратор для логирования вызова функции и её аргументов
    :param func: функция для вызова
    c            
          t          dt          z   d d|  d| d           t          dz  a | i |}t          dz  a|S )u   
        Косим под bash -x, если захочется — можно где-то тут реализовывать вложенность:
        ++ create
        +++ create_project
        ++++ create_folders
        + (z, )r   )printTRACE_OFFSET)argskwargsresfuncs      ./cmf/demo_data.pywrapperztrace.<locals>.wrapper.   sf     	\!<<D<<4<<6<<<===dD#F##
     )r   r   s   ` r   tracer   (   s#         Nr   emailc           
         ddl m}m} ddlm} |                                 |                                 t          j        	                    dd| gt          j                  }|sJ d| z   dz               t          |           t          j        	                    g d	
          }|||_        |                    d           t          j        	                    dd|j        g
          }|s't          j        |                                           t%          t&          j         d          5 }t+          j        |                                          }ddd           n# 1 swxY w Y   |	                    dt1                                }	|	D ]}
t3          |
|	|
                    |	                    dt1                                }|D ]}
t3          |
||
         d           |	                    dt1                                                                D ]6\  }}|d                                         D ]\  }}t7          |||           7|	                    dt1                                                                D ]\  }}t9          ||           |	                    dt1                                                                D ]\  }}t          j        |          }|                                 |	                    d          rt=          |           |	                    d          s$t>                               |j        j!                   |	                    dt1                                                                D ]\  }}tE          ||           |	                    d                                          D ].\  }}tG          |||          }t          j$        |d         d                   }|                                 |d         	                    dd          s$t>                               |j        j!                   t          j%        |d          d         |d          d!         |||"                                          }|d          	                    dd          s$t>                               |j        j!                   |	                    dt1                                                                D ]T\  }}t          j&        '                    |j        j!        #          }|D ]"}|j(        d         )                    |           #U|	                    d$g           D ]}t          j*        	                    |	                    d%                    }t          j+        	                    d&d|	                    d'd(          g
          }tY          ||d||           0t[                       t%          t&          j.        d)          5 } | /                    t+          j0        t>                               ddd           dS # 1 swxY w Y   dS )*uK   
    Точка входа
    :param email: учётка админа
    r   )	CMF_CACHEcmf_pycharm_debug)REDIS_SETTINGS_MANAGERlogin==filterfieldsu%   Не найден CmfPerson с login=uH   , вероятно init_demo_data запустили ДО acrm_assign.sh)namer%   zdefault.companyr'   NT	only_data	person_id)personz/cmf/contrib/demo_data.jsonu   ПроектыWikisectionu   Чатыcommentsu   Продуктыu   Воронкиr)   is_favoritedemo_dont_delu   Клиентыu   Пользователиu#   Штатное расписание   ИмяFu   Должностьu   Ставка)r)   ratecompanyr.   job)
contact_id   Задачиproject_namer)   status w+)1cmf.includer!   r"   cmf.appr#   
init_redisflushdbr   	CmfPersongetr   current_person_fieldsr   
CmfCompanyr7   saveCmfPersonVaridopenr
   PROJECT_DIRjsonloadsreaddict_create_projectitems_create_topic_create_productCmfPipeline_add_object_to_favoritesDEMO_IDS_LISTappendvalue_create_company_create_userCmfJobCmfRoleCmfChatGroupp2p_chattopicssend_message
CmfProject	CmfStatus_create_taskcleanupDEMO_IDS_FILEwritedumps)!r   r!   r"   r#   adminmain_company
person_varfddataprojectsr;   wikichat	chat_datatopicr1   productcostpipeline_nameoptionspipeliner7   company_data	user_name	user_datar.   r8   rolecommenttaskprojectr<   fs!                                    r   creater   >   s    98888888......%%'''  $(>sG` aaE  O  O9EA  EO  O  O  O  Ou$((0Q0Q0Q(RRL$

T
"""$((dEH0M(NNJ 15)))..000	#@@@	A	A %Rz"''))$$% % % % % % % % % % % % % % % xx($&&11H  > >h|&<====88FDFF##D E Ed<&8)DDDD  88J77==?? 2 2i(4::<< 	2 	2OE8$y1111	2 "4dff==CCEE ' '&&&&"&((+;TVV"D"D"J"J"L"L 4 4w%=999;;}%% 	/$X...{{?++ 	4  !2333!%*:DFF!C!C!I!I!K!K / /.... $)C D D J J L L > >	9iLAAm+P!QRZ![\\\


>?CCOUZ[[ 	/  ...~/0:K_A`aoAp S: : ::>$&& 	 -.22?EJJ 	0  ///(}}Z@@FFHH 	5 	5OE8&//69?/KKD# 5 5A++G44445MM."55 	> 	>D'++.1I1I+JJG%))&$SU@V@V1W)XXFvtWf====	> III	f"D	)	) +Q	
=))***+ + + + + + + + + + + + + + + + + +s$   4'E''E+.E++-Y%%Y),Y)c                     t           j                            ddt          j        j        gdg          }|s
J d            |j                            |            |                                 d S )Nr-   r%   	favoritesr&   uS   У администратора ещё не созданы предпочтения)	r   rH   rD   r	   current_personrI   r   rW   rG   )object_person_varss     r   rU   rU      sr    %))+tQEUEX1Ycnbo)ppKmmmmmm  )))r   c                     d| j         j        v rCd| j         j                            dd          z   | j         _        |                                  d S d S )Nu   (Демо) r=   )r)   rX   replacerG   )objs    r   demo_fix_namer      sL    &&&)?)?r)R)RR




 '&r   c                     t          j        |                                           |dk    r| }nt          |d         ||          }t          j        |||                                           d S )Nr2   u   Менеджерr5   )r)   r7   r.   )r   r[   rG   _create_contactr\   )rh   r8   job_datari   r.   s        r   _create_workerr      ss    
Ms  """
    (!3X|LL
N\&AAAFFHHHHHr   r)   
topic_name
topic_dictc                 t   |d         |         }t           j                            ddg          D ]}|d         d |j        D             v rk| |_        |                    d           |                    d	d
          s$t                              |j	        j
                   t          |||            dS dS )u   
    Находит нужный чат и пишет в первую его тему список сообщений
    :param name: имя по которому ищем группу чатов
    r1   r_   zexecutors.name)r(   	executorsc                     g | ]	}|j         
S r   r2   ).0executors     r   
<listcomp>z!_create_topic.<locals>.<listcomp>   s    &T&T&Tx}&T&T&Tr   Tr+   r4   FN)r   r]   listr   r)   rG   rD   rV   rW   rI   rX   __add_or_create_topic)r)   r   r   r1   ro   s        r   rR   rR      s     *%j1H#((;K0L(MM  k"&T&TT^&T&T&TTTDIIII%%%>>/599 4$$TW]333!$
H===EE U r   ro   r1   c                 X   |dk    r| j         d         }|s
J d            nyt          j                                        }|s
J d            t          j        || |g                                          }| j                                          |s
J d            t          ||           |S )Nu   Чат группыr   zsomehow not foundu;   Не нашлось группы пользователей)r)   groupr   zcreate failed)r_   r   CmfPersonGroup
user_groupCmfChatTopicrG   load_add_comments)ro   r   r1   rq   userss        r   r   r      s    ***A)))))))%0022SSSSSS#4E7SSSXXZZ%%o%%%%"""Lr   rq   c                     |D ]J}|                      |          }t          j        t          j        ||                                            Kd S )N)r.   message
chat_topic)r`   r   CmfChatTopicUnreadMessager	   r   rG   )rq   r1   r{   
message_ids       r   r   r      s]     o o''00
(0@*afgggllnnnno or   c                  &   t           j                                         t           j                            d          D ]} |                     d           t           j                            d          D ]}|                    d           d S )Nu   Канбан1r2   T)	recursiveu   Документ1)r   	CmfNotifyclose_open_notifiesCmfListr   deleteCmfDocument)kanbandocs     r   rd   rd      s     ((***.%%?%;; & &%%%%!&&,?&@@ # #

T
""""# #r   r   c                    dd l }ddlm} |                    |d          }|                    ddddd          }|D ]}|                    d          }|rt          |j         d	| d
          5 }t          j	        | |          }	|	
                    |                                           |	                                 d d d            n# 1 swxY w Y   |	j        j        |d<   |	j        |d<   |                    dddddd          }
|
D ]}|                    d          }|rt          |j         d	| d
          5 }t          j	        | d|           }	|	
                    |                                           |	                                 d d d            n# 1 swxY w Y   |	j        j        |d<   t!          |          }|S )Nr   r
   html.parserimgT)data-attach-iddata-idsrcattrsr   z/cmf/contrib/demo_data/rbparentr)   r   div)data-drawio-titlezdata-drawio-typer   r   r   u   Диаграмма: )bs4r?   r
   BeautifulSoupfind_allrD   rJ   rK   r   CmfAttachmentupload_filerN   rG   rI   rX   urlstr)r   	html_textr   r
   soupimagesimage	image_srcimg_pathnew_attachmentdrawio_schemesdrawiodrawio_filedrawio_pathmodified_htmls                  r   _create_document_attachmentsr      s   JJJ""""""Y66D]]54DY](^(^]__F . .IIe$$	 	.+OOIOOQUVV &Zb!'!5Sy!Q!Q!Q**8==??;;;##%%%& & & & & & & & & & & & & & & '5&7&=E"#)-E%L ]]5d`dx|  JN  1O  1O]  P  PN  ? ?jj!455 	?+QQKQQSWXX &\g!'!5SGk^iGkGk!l!l!l**;+;+;+=+=>>>##%%%& & & & & & & & & & & & & & & (6'8'>F#$IIMs&   1ACC	C	AF&&F*	-F*	r}   c           
      2   |                     dd          }|                     dd          }|                     dd          }|                     d          }|                     d|          }|                     dd          }|                     d	d          }	|                     d
d          }
t          j        j         d| |||d|}|st          j        d| |||||
d|}| d}t          j                             |d          }|r||_        |                                 |	rd|_        |                                 |rt          t          j	         |           5 }|
                                }ddd           n# 1 swxY w Y   |j        }t          ||          |_        |                                 |                                 |rt          |           |                     dd          }|s$t                               |j        j                   t)          ||d         |           |                     dd          }|rt+          ||d         |           |                     dd          }|rt-          ||d         |           |S )u   
    :param name: название проекта
    :param folders: список папок с задачами и канбанами внутри
    
is_defaultFr3   logic_prefixzproject.basetask_code_prefixproject_typehomepageshow_roadmapdescriptionN)r)   r   r   r   )r)   r   r   r   r   r   z:defaultTcodecache_inmemoryr4   folderstasksganttr   )rD   r   ra   CmfLogicType
logic_typerG   r   rJ   r
   rK   rN   descr_documentr   
text_draft
do_publishrU   rV   rW   rI   rX   _create_folders_create_tasks_create_gantt_relation)r)   project_dictr   r   r   r3   r   r   r   r   r   r}   logic_type_coder   rk   textr   r4   r   r   s                       r   rP   rP      s   
 !!,66J""=%88K##NNCCL#''(:;;##NLAAL
E22H##NE::L""=$77K# QLU_5EQ QIOQ QG # RLZVb-;R RJPR R *333(,,/RV,WW
 	,!+G 	#'G LLNNN 	+7X7788 !Bwwyy! ! ! ! ! ! ! ! ! ! ! ! ! ! !(C9#tDDCNHHJJJNN * ))) $$_e<<M /WZ-...G\)4mDDDWe,,E Eg|G4mDDDWe,,E NwW(=}MMMNs   %FF
F
Fc                    |                                 D ]\  }}t          j                            |          }|sJ d|             |D ]}t          j                            |                    d                    }t          j                            |                    d                    }|r-|r+t          j        |||          }	|	                                 d S )Nr   u)   Отсутствует тип связи in_task_namer2   out_task_name)in_linkout_linkrelation_type)rQ   r   CmfRelationTyperD   CmfTaskCmfRelationOptionrG   )
r}   r   r4   relation_code	relationsr   relationr   r   relation_options
             r   r   r   ,  s    $)KKMM ' ' y.222FFYYY-YYYYY! 		' 		'Hn((hll>.J.J(KKG~))x||O/L/L)MMH '8 '"(":#%"/# # #
  $$&&&		'' 'r   c           	      	  " "fd}ddl m " t          j        }|                                D ]\  }}t          j                            dd|g          }|sJ d|z               |D ]`}|                    dd           }	|                    d	d           }
|                    d
d           }|                    dd           }|                    dd           }|                    dd           }|                    dd           }|                    dd           }|                    dd           }|                    dd           }t          j                            |	|           }t          j                            |
|           }t          j                            ||           }t          j	                            d| |           }t          j                            ||           }t          j
                            |          }t	          j	        |                    d          |                    d          |           }|r|j                            |           |r|j                            |           |r||_        |r|j                            |           |r|j                            |           |r||_        ||_        ||_        ||_        |                                }t*                              |j        j                   |j        }|r ||          |_        |r ||          |_        |                                 t*                              |j        j                   |rG|                                D ]1\  }}t          j                            dd|g          }|sJ d|z               |D ]}|                    dd           }|                    dd           }|                    dd           }t	          j	        | ||          } |                                 }!t*                              |!j        j                   |!j        }|r ||          |_        |r ||          |_        |                                 t*                              |j        j                   3bd S )Nc                 &     j         | d          S )Nz%Y-%m-%d)strptime)dtr   s    r   to_date_timez#_create_tasks.<locals>.to_date_time=  s     x Z000r   r   )r   r)   r%   r*   #   Не нашлось статуса sprint	componentreleaseepicregistry_listr   sched_start_datesched_finish_datepriority
child_task)r)   r}   zEpic r   titler   )r)   r   r   )r   parent_taskr)   )r   r	   r   rQ   r   rb   rD   r   CmfComponentr   r   listsrW   fix_versionsr  
componentsr  r   r<   responsiblerG   rV   rI   rX   op_gantt_taskr  r  )#r}   r   r4   r   r  status_name_tasksr<   r|   task_sprinttask_componenttask_release	task_epictask_registry_listtask_logic_typetask_sched_start_datetask_sched_finish_datetask_prioritytask_child_tasksr   r   r   r   r   r   _taskr  _child_tasks_child_task_child_task_title_child_task_sched_start_date_child_task_sched_finish_dater  ch_tskr   s#                                     @r   r   r   <  s   1 1 1 1 1 "!!!!!"K${{}} NE NEV!%%fdK-H%IIJJ<{JJJJ K	E K	ED((8T22K!XXk488N88It44L..I!%/4!@!@"hh|T::O$(HH-?$F$F!%)XX.A4%H%H" HHZ66M#xxd;;^''[''JJF+//^W/UUIn((lG(LLG>%%+>9+>+>%PPD"N..4FPW.XXM,00o0FFJ>XXg&&XXm,,  D  *
!!&))) 2!((111 (#'  1
!!-000 2&&y111 . -(DO DK*DIIKKE  000!/M$ U1=>S1T1T.% W2>,?U2V2V/     !1!7888   E1A1G1G1I1I E E-K#-11&$9T1UUF!VV#H;#VVVV'3 E E,7OOGT,J,J)7BGY[_7`7`48CH[]a8b8b5%+^#*(-!2& & &

 ",!2!2%,,VY_===(.(<7 h=I\Jf=g=gM:8 j>JlKh>i>iM;%**,,,%,,]-=-CDDDD%EsK	ENE NEr   c           	      B   |                                 D ]\  }}|dk    r| }t          |||            |dk    rMt          j                            dd| j        gg dg          }|sJ d|              t          |||           s|dv rt          j                            dd| j        gd	d|gg          }|s)t          j        || | 
                                          }|                                 D ]\  }}t          || |||           |dk    rt          j
                            dd| j        gd	d|gg          }	|	s)t          j
        || | 
                                          }	|                                 D ]\  }
}t          |
| |	||           dS )u   
    :param project: ID проекта
    :param folders: список папок с задачами и канбанами внутри
    docs   Документыtree_parent_idr%   )r)   r%   r"  r*   uB   Не нашлась папка sys_type == docs у проекта )r:   BacklogSprintsEpicsReleases   КомпонентыRoadmapsr)   r)   r}   tree_parentu   СпискиN)rQ   _create_documentsr   r   rD   rI   _create_documents_new	CmfFolderrG   _create_kanban_newCmfRegistry_create_registry_list)r}   r   r4   r)   rl   r   folderkanban_namekanban_settingsregistryregistry_nameregistry_settingss               r   r   r     s    mmoo n n
d6>>FfdM::::)))'++5EtWZ4XZ~Z~Z~3+  A  AFiii`giiiii!&$>>>>vvv)---tWZ@64QUBVW . Y Y
  f#-4V]^^^cceeF48JJLL e e0K&{GV_Vcdddde ''!-11;KTSZS]:^agimos`t9u1vv j%1tWZabbbggiiH8<

 n n4M#4)-(L]_lmmmm7n nr   r5  r7  c                    d }ddl m} |                    dd          }|rDt          |j         |           5 }|                                }	d d d            n# 1 swxY w Y   t          j        | |||	          }|                                 |                    d|          }|s$t          
                    |j        j                   |S )Nr   r   fileF)r)   r   r+  r   r4   )r?   r
   rD   rJ   rK   rN   r   r   rG   rV   rW   rI   rX   )
r)   r}   r5  r7  r4   r   r
   filenamerk   r   s
             r   r1  r1    s%    M"""""" $$VU33H V'33344 	7799D	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 Ng8$  M %))/=IIM 5]-3444s   AA!Ac                 t   dd l }ddlm} |                    |j        j        d          }|                    ddddd          }|D ]o}|                    d          }|rV|| j        k    rK| j	        j        |d	<   t          |          |_        |                                 |                                 pd S )
Nr   r   r   r   T)zdata-macrosdata-param-page-labeldata-param-pageidr   r<  r=  )r   r?   r
   r   r   rX   r   rD   r)   rI   r   rG   r   )r   r   r   r
   r   macrosesmacrosdocument_names           r   _create_document_includerA    s    JJJ""""""V.4mDDD}}U$Y]tx*y*y}zzH    

#:;; 	 ]ch66*-&,F&' #D		FKKMMM   r   r   c                 X   ddl m} d }|                                D ]\  }}|d         }|                    dd           }|                    dd          }	|                    dd          }
|                    dd          }|                    d	d           }|                    d
d          }|                    d|          }t	          |j         |           5 }|                                }|                    d          s|                    d          r'|ddlm	}  |            }|
                    |          }d d d            n# 1 swxY w Y   t          j                            dd| j        gdd|gg          }|st          j        || |          }|r||_        |
rt          ||            t!          ||          |_        |r't          j                            d          }||_        |                                 |                                 |rLt	          t,          d          5 }|                    |j        j                   d d d            n# 1 swxY w Y   |	rt3          ||	|           |s$t4                              |j        j                   d S )Nr   r   r9  orderno
child_docsFinclude_parentfull_screenworkflowgreetings_docr4   mdmarkdownMarkdownr#  r%   r)   r*   )r)   r+  rF  zdocument.approve:defaultr   r>   )r?   r
   rQ   rD   rJ   rK   rN   endswithrJ  rL  convertr   r   rI   rC  rA  r   r   CmfWorkflowrG  rG   r   GREETINGS_DOC_ID_PATHrf   rX   r-  rV   rW   )r   r   r4   r
   rI  r  	documentsr:  rC  rD  rE  rF  rG  rH  rk   rL  r   wfr~   s                      r   r-  r-    s9   """"""	B JJLL $/ $/yV$--	400]]<77
"'7??mmM599==T22!ou==!o}EEV'33344 	(7799D  && ((*;*;J*G*G (:111111!Bzz$''	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	(  $$.>fi-PSY[_afRg,h$ii 	F$%VQ\]]]C &% 6(f5559#tDDCN "'++1K+LL!HHJJJNN */66 *!GGCFL)))* * * * * * * * * * * * * * * F%c:}EEE 	/  ...I$/ $/s%   A&EE	E	8 I$$I(	+I(	r   c                    ddl m} d }|                                D ]\  }}|                    d|          }t	          |j         dt                     5 }|                                }t                              d          st                              d          r'|ddl	m
}  |            }|                    |          }t          j                            dd	| j        gd
d	|gg          }	|	s?t          j        |||           }	|	                                 |	                                 |                    d          rLt	          t"          d          5 }
|
                    |	j        j                   d d d            n# 1 swxY w Y   |s$t(                              |	j        j                   d d d            n# 1 swxY w Y   d S )Nr   r   r4   /rI  rJ  rK  r#  r%   r)   r*   )r)   r   r+  rH  r>   )r?   r
   rQ   rD   rJ   rK   r:  rN   rM  rJ  rL  rN  r   r   rI   rG   r   rP  rf   rX   rV   rW   )r   r   r4   r
   rI  r  settingsrk   rL  r   r~   s              r   r,  r,    sL   """"""	B::<< 3 3x _mDDV'44(4455 	37799D  && ((*;*;J*G*G (:111111!Bzz$'' $((2BD&)1TW]_cejVk0l(mmC !(eRXYYY


   ||O,, */66 *!GGCFL)))* * * * * * * * * * * * * * *  3$$SV\222%	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	33 3s7   DG F?GFGF)GG	G	r2  r4  c           	         d }|j         }|dv rH|                    dd          }|                    dd           }|                    dd          }	|s|j        }n t          j                            |          }|dk    rfdd	lm}
 |                    d
d          }|rHt          |
j         |           5 }|	                                }d d d            n# 1 swxY w Y   |r|}t          j
        | ||d||          }|	r)t          |_        |j        t          d          z   |_        |                                 |	r|                                 n|dk    r,t          j        | ||          }|                                 n|dk    r,t          j        | ||          }|                                 ng|dk    ra|                    dd          }t          j        ||| |t          j                            d                    }|                                 |rc|                    dd          }|                    d|          }|s$t(                              |j        j                   |rt1          |           |S )N)r%  r'  r   Fr   launchedr   r%  r   r   r9  r   )r)   r}   r+  	list_typer   r      daysr(  r*  r)  r&  ztask.epic:default)r   r+  r)   r   r   r3   r4   )r)   rD   r   r   r   r?   r
   rJ   rK   rN   r   TODAYplan_start_dater   plan_end_daterG   do_startr  
CmfRoadmapr   rV   rW   rI   rX   rU   )r)   r}   r2  r4  r4   structure_objectfolder_namer   r   rW  r
   r:  rk   r   r3   s                  r   r/  r/  "  sE   
 +K---$((u==
%))->>"&&z599 	B +JJ,00j0AAJ)##******&**6599H 'V/;;;<< %7799D% % % % % % % % % % % % % % % '"&K!>wFhU`mwy y y  	c/4,-=-MPY_aPbPbPb-b* 	(%%'''	.	.	.!.
 
 

 		
	"	"!,
 
 

 				%))-??!>TX^XkXoXo  vIXo  YJ  YJ
 
 
 	 7%))-??'++O]KK 	<  !1!4!:;;; 	7$%5666
 s   7CCCc                    t          j        | ||d          }|j        dk    r*t           j                            dd          }|r||_        |                                 |                    dd          }|                    d	|          }|s$t                              |j	        j
                   |rt          |           d
|v rt          |||d
                    |S )Nr   )r)   r}   r+  rX  zproject.agilezlist.agile_sprint:defaultTr   r3   Fr4   r   )r   r   r   r   rD   r   rG   rV   rW   rI   rX   rU   _add_tasks_to_kanban)r)   r}   r2  r4  r4   r   r   r3   s           r   _create_kanbanre  n  s     ^wFV^___F..(,,2M^b,cc
 	+ *F
KKMMM!%%mU;;K#''GGM .VY_--- ) (((/!!Wfog.FGGGMr   r   r   c           	      D   |
J d            t          |t                    sJ dt          |          z               |                                D ]O\  }}t          j                            dd|g          }|sJ d|z               |D ]}t          |||| d           PdS )u   
    :param project: проект к которому привязана задача
    :param kanban: список задач (CmfList), в который надо добавить
    :param tasks: список задач (в dict/list)
    Nu;   Почему-то нет объекта для спискаuR   Неожиданные задачи в виде списка без статусаr)   r%   r*   r   )
isinstancerO   r   rQ   r   rb   rD   rc   )r}   r   r   r  r  r<   r|   s          r   rd  rd    s     \eT""  F  F$x{~  @E  |F  |F  %F  F  F  F${{}} > >V!%%fdK-H%IIJJ<{JJJJ 	> 	>Dvvw====	>> >r   r|   r<   r  c                    t          | t                    sJ dt          |           z               |                     dd          }|                     dd          }|                     dg           }|                     dg           }t          }	t
          dk     r*t
          dz  a|	t          t                                z
  }	n|	t          d	          z   }	|st          j	        }t          j        ||	|||
          }
d}|D ]}t          t          j        |z             }t          |d          5 }t          j        |
|j                  }|                    |                                           |                                 |d|j         dz   }ddd           n# 1 swxY w Y   ||z   |
_        t          |t          j                  |
_        |
j        r|
j                            |           n"||
_        |
                                 d|
_        |
                                 |rt9          |
|           |
                                 t:                              |
j        j                   dS )u   
    :param task: заголовок задачи
    :param status: статус задачи в CRM
    :param kanban: объект списка в который это надо добавить (или None для входящих)
    :param project: объект проекта
    u@   Передан task не являющийся словарем: r  r=   contentr1   picturesr   rZ     )r  
alarm_dater)   r}   r<   r   r   z<p><img src="z"/></p>NF) rg  rO   r   rD   r\  MY_TASK_COUNTr   r   r	   r   r   r   r   r
   rK   rJ   r   r)   r   rN   rG   r   r   r   approvedr  rW   r   _create_commentsrV   rI   rX   )r|   r<   r   r}   r  r  ri  r1   rj  rl  task_objcontent_imgr   img_path_objimg_readr   s                   r   rc   rc     s    dD!!qq#ehklphqhq#qqqqHHWb!!Ehhy"%%Gxx
B''Hxx
B''HJq)":":"::

)"4"4"44
 '&~JUG\bd d dH K T TF.9::,%% 	T#1HYZZZN&&x}}777!!!%(S8J(S(S(SSK		T 	T 	T 	T 	T 	T 	T 	T 	T 	T 	T 	T 	T 	T 	T k)HM"66>::H "f%%%% "!MMOOO -8,,,MMOOO*+++++s   0A%F!!F%	(F%	c                    | 
J d            t          |t                    rI|                                D ]3\  }}|dk    sJ d|             || _        |                                  4n"t          |t
                    sJ d|             |D ]0}|dk    r(t          j        ||                                            1d S )Nu:   Передана несуществующая задачаdescu,   Не поддерживаемое поле: uL   Комментарии не являются списком, странно )r   r   )rg  rO   rQ   r   rG   r   r   
CmfComment)r|   r1   keyrX   r   s        r   ro  ro    s
   Y(D!! E"..** 	 	JC&==="VQT"V"V===DIIIKKKK	
 (D))  	E  	E  ,E  {C  ,E  ,E  	E  	E  	E = =6>>4555::<<<= =r   rl   c                 x   t          j        | |                    dd                                                    }t                              |j        j                   |                    dt                                	                                D ]\  }}t          |||           |                    dt                                	                                D ]\  }}t           j                            |          }|sJ d|             |	                                D ]\  }}	t           j                            |j        |dg	          }
|
s;t          d
|d           t          j        ||          }
|
                                 t          |
           t          ||	||
j                   dS )u   
    :param name: Название компании
    :param data: Сделки, Контакты и прочее пока не знаю как организованное
    u   Типr7   )r)   typeu   Контактыu   Сделкиr2   u   Не нашли воронку r<   )work_list_idr)   r(   u    Не нашёлся статусu3   создадим, он нам очень нужен)	work_listr)   N)r   rF   rD   rG   rV   rW   rI   rX   rO   rQ   r   rT   CmfStatusOptr   _init_auto_assign_create_dealsr<   )r)   rl   r7   contactcontact_datart   statusesrv   r  dealsopts              r   rY   rY     s    T90M0MNNNSSUUG)***!%*<dff!E!E!K!K!M!M 8 8w7777#'88NDFF#C#C#I#I#K#K @ @x%))})==JJJ=JJJJJ"*.."2"2 	@ 	@K%))x{^f]g)hhC 8+G|}}})H;OOO


c"""'5(CJ????	@@ @r   c                 >    t          d           t          d          )NuM   Для первичного контакта создаём триггер...u_   Требуется доработка готу Антон DEL cache_status_opt_id use status.id)
r   	Exceptionr   
CmfTriggerrD   rI   r	   r   r)   rG   )r  auto_assigns     r   r}  r}    s     	
YZZZ
u
v
vvr   c                 `    |                                 D ]\  }}t          ||| ||           d S N)rQ   _create_deal)r7   r  rv   r<   deal	deal_datas         r   r~  r~  "  sD     ;;== A AiT9gx@@@@A Ar   r7   c                     || |                     d          d}t          j        di |}|                                 t                              |j        j                   |S )u  
    Наверное contact_data можно сразу кидать как **kwargs + company=cmp, name=name, но лень
    :param name: имя, либо имя-фамилия (по пробелу раздробится и пропишется в нужные поля)
    :param data: набор данных, пока dict из Почта: email@example.com
    :param company: компания, к которой принадлежит человек
    
   Почта)r7   r)   r   r   )rD   r   rC   rG   rV   rW   rI   rX   r)   rl   r7   r   r.   s        r   r   r   (  s_     !$,9O9OPPF''''F
KKMMM)))Mr   c                 2   || |                     d          t          j                                        gd}t          j        di |}|                                 |                     dd          s$t                              |j        j	                   |S )Nr  )r7   r)   r   rg_member_ofr4   Fr   )
rD   r   r   guest_grouprC   rG   rV   rW   rI   rX   r  s        r   rZ   rZ   7  s     D488L3I3I.::<<=? ?F ''''F
KKMMM88OU++ .VY_---Mr   rs   c                     t          j        | |          }|                                 t                              |j        j                   d S )N)r)   rs   )r   
CmfProductrG   rV   rW   rI   rX   )r)   rs   rr   s      r   rS   rS   D  sC    T555GLLNNN)*****r   rv   c                    t           j                            |d                   }|sJ d|d          d|              |d         sJ d|              t          d |d                                         D                       \  }}t          j        | |||||g          }|                                 t                              |j	        j
                   d	S )
u  
    :param pipeline: воронка продаж, в которой окажется сделка
    :param name: название сделки
    :param data: {
        Контакт: Василий Рыбин,
        Продукт: {
            Пельмени с говядиной: 400
        }
    }
    :param company: компания с которой проводится сделка
    u   Контактr2   u#   Не нашёлся контакт u    для сделки u   Продуктu5   Не указан продукт для сделки c              3   $   K   | ]\  }}||fV  d S r  r   )r   kvs      r   	<genexpr>z_create_deal.<locals>.<genexpr>\  s*      LLTQ1a&LLLLLLr   )r)   r7   totalrv   r<   contactsN)r   rC   rD   nextrQ   CmfDealrG   rV   rW   rI   rX   )	r)   rl   r7   rv   r<   r  rr   r  r  s	            r   r  r  K  s     ""-=(>"??Gmmm$?O:Pmmgkmmmmm !aa#a[_#a#aaaaLLT2B-C-I-I-K-KLLLLLNGU>  D 	IIKKK'''''r   )r}   )F)E__doc__r   r   r   pathlibr   r   rL   r?   r   r	   r
   r   r@   r   nowutcr\  rm  r   rV   rK   rP  r   r   r   rU   r   r   rO   rR   r]   r   r   r   r   rd   r   r   rP   ra   r   r   r   r0  r1  rA  r-  r,  r.  r/  re  r   rd  rb   rC   rc   r   ro  rY   r}  r~  rF   r   rZ   intrS   rT   r  r   r   r   <module>r     s	   * 3 2 2 2 2 2 2 2 2 2              . . . . . . . . . . . . & & & & & & 	X\""!-KKK   , H+# H+ H+ H+ H+V     I I I   $       3  PT     o, o o o o o # # #f&8    @5 5 5 5p' 'F$5 ' ' ' ' VE VE6, VE VE VE VEv  n  nV.  n  n  n  nH qv 
)5;5G\`   *     '/ '/&"3"Iv7I '/ '/ '/ '/T3 3f/E63E 3T 3 3 3 36 kpI I
I)I393CIVZI I I IZ kp 
)393CVZ   0>&"3 >V^ >TX > > > > 6,t 6,)6,/46, !+6, %.6$	6, 6, 6, 6,t=6> =T = = = = @# @T @ @ @ @.): ): ):X A A A
 # T F4E     	s 	$ 	1B 	 	 	 	 +# +S + + + + ((((.(9(EKEW(agaq( ( ( ( ( (r   