
    *`mh                     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} |                                 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t+                                }|D ]}	t-          |	||	                    |                    dt+                                }
|
D ]}	t-          |	|
|	         d           |                    dt+                                                                D ]6\  }}|d                                         D ]\  }}t1          |||           7|                    dt+                                                                D ]\  }}t3          ||           |                    dt+                                                                D ]\  }}t	          j        |          }|                                 |                    d          rt7          |           |                    d          s$t8                              |j        j                   |                    dt+                                                                D ]\  }}t?          ||           |                    d                                          D ].\  }}tA          |||          }t	          j!        |d         d                   }|                                 |d                             dd          s$t8                              |j        j                   t	          j"        |d         d         |d         d          |||!                                          }|d                             dd          s$t8                              |j        j                   |                    dt+                                                                D ]T\  }}t          j#        $                    |j        j        "          }|D ]"}|j%        d         &                    |           #U|                    d#g           D ]}t          j'                            |                    d$                    }t          j(                            d%d|                    d&d'          g	          }tS          ||d
||           0tU                       t          t           j+        d(          5 }|,                    t%          j-        t8                               d
d
d
           d
S # 1 swxY w Y   d
S ))uK   
    Точка входа
    :param email: учётка админа
    r   )	CMF_CACHEcmf_pycharm_debug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+).cmf.includer!   r"   flushdbr   	CmfPersongetr   current_person_fieldsr   
CmfCompanyr6   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"   adminmain_company
person_varfddataprojectsr:   wikichat	chat_datatopicr0   productcostpipeline_nameoptionspipeliner6   company_data	user_name	user_datar-   r7   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$   '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   rE   rA   r	   current_personrF   r~   rT   rD   )object_person_varss     r   rR   rR      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(   rU   replacerD   )objs    r   demo_fix_namer      sL    &&&)?)?r)R)RR




 '&r   c                     t          j        |                                           |dk    r| }nt          |d         ||          }t          j        |||                                           d S )Nr1   u   Менеджерr4   )r(   r6   r-   )r   rX   rD   _create_contactrY   )re   r7   job_datarf   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: имя по которому ищем группу чатов
    r0   r\   zexecutors.name)r'   	executorsc                     g | ]	}|j         
S r   r1   ).0executors     r   
<listcomp>z!_create_topic.<locals>.<listcomp>   s    &T&T&Tx}&T&T&Tr   Tr*   r3   FN)r   rZ   listr   r(   rD   rA   rS   rT   rF   rU   __add_or_create_topic)r(   r   r   r0   rl   s        r   rO   rO      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   rl   r0   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CmfChatTopicrD   load_add_comments)rl   r   r0   rn   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   rn   c                     |D ]J}|                      |          }t          j        t          j        ||                                            Kd S )N)r-   message
chat_topic)r]   r   CmfChatTopicUnreadMessager	   r   rD   )rn   r0   rx   
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   Канбан1r1   T)	recursiveu   Документ1)r   	CmfNotifyclose_open_notifiesCmfListr   deleteCmfDocument)kanbandocs     r   ra   ra      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_allrA   rG   rH   r   CmfAttachmentupload_filerK   rD   rF   rU   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*	rz   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_defaultFr2   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_inmemoryr3   folderstasksganttr   )rA   r   r^   CmfLogicType
logic_typerD   r   rG   r
   rH   rK   descr_documentr   
text_draft
do_publishrR   rS   rT   rF   rU   _create_folders_create_tasks_create_gantt_relation)r(   project_dictr   r   r   r2   r   r   r   r   r   rz   logic_type_coder   rh   textr   r3   r   r   s                       r   rM   rM      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_namer1   out_task_name)in_linkout_linkrelation_type)rN   r   CmfRelationTyperA   CmfTaskCmfRelationOptionrD   )
rz   r   r3   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(   rz   zEpic r   titler   )r(   r   r   )r   parent_taskr(   )r   r	   r   rN   r   r_   rA   r   CmfComponentr   r   listsrT   fix_versionsr  
componentsr   r   r;   responsiblerD   rS   rF   rU   op_gantt_taskr   r   )#rz   r   r3   r   r  status_name_tasksr;   ry   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   9  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 у проекта )r9   BacklogSprintsEpicsReleases   КомпонентыRoadmapsr(   r(   rz   tree_parentu   СпискиN)rN   _create_documentsr   r   rA   rF   _create_documents_new	CmfFolderrD   _create_kanban_newCmfRegistry_create_registry_list)rz   r   r3   r(   ri   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   r2  r4  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   r3   )r>   r
   rA   rG   rH   rK   r   r   rD   rS   rT   rF   rU   )
r(   rz   r2  r4  r3   r   r
   filenamerh   r   s
             r   r.  r.    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   r9  r:  )r   r>   r
   r   r   rU   r   rA   r(   rF   r   rD   r   )r   r   r   r
   r   macrosesmacrosdocument_names           r   _create_document_includer>    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   r6  orderno
child_docsFinclude_parentfull_screenworkflowgreetings_docr3   mdmarkdownMarkdownr   r$   r(   r)   )r(   r(  rC  zdocument.approve:defaultr   r=   )r>   r
   rN   rA   rG   rH   rK   endswithrG  rI  convertr   r   rF   r@  r>  r   r   CmfWorkflowrD  rD   r   GREETINGS_DOC_ID_PATHrc   rU   r*  rS   rT   )r   r   r3   r
   rF  r  	documentsr7  r@  rA  rB  rC  rD  rE  rh   rI  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   r3   /rF  rG  rH  r   r$   r(   r)   )r(   r   r(  rE  r=   )r>   r
   rN   rA   rG   rH   r7  rK   rJ  rG  rI  rK  r   r   rF   rD   r   rM  rc   rU   rS   rT   )r   r   r3   r
   rF  r  settingsrh   rI  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	r/  r1  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   r6  r   )r(   rz   r(  	list_typer   r      daysr%  r'  r&  r#  ztask.epic:default)r   r(  r(   r   r   r2   r3   )r(   rA   r   r   r   r>   r
   rG   rH   rK   r   TODAYplan_start_dater   plan_end_daterD   do_startr  
CmfRoadmapr   rS   rT   rF   rU   rR   )r(   rz   r/  r1  r3   structure_objectfolder_namer   r   rT  r
   r7  rh   r   r2   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(   rz   r(  rU  zproject.agilezlist.agile_sprint:defaultTr   r2   Fr3   r   )r   r   r   r   rA   r   rD   rS   rT   rF   rU   rR   _add_tasks_to_kanban)r(   rz   r/  r1  r3   r   r   r2   s           r   _create_kanbanrb  k  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   )
isinstancerL   r   rN   r   r_   rA   r`   )rz   r   r   r
  r  r;   ry   s          r   ra  ra    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   ry   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<   contentr0   picturesr   rW     )r  
alarm_dater(   rz   r;   r   r   z<p><img src="z"/></p>NF) rd  rL   r   rA   rY  MY_TASK_COUNTr   r   r	   r   r   r   r   r
   rH   rG   r   r(   r   rK   rD   r   r   r   approvedr  rT   r   _create_commentsrS   rF   rU   )ry   r;   r   rz   r  r  rf  r0   rg  ri  task_objcontent_imgr   img_path_objimg_readr   s                   r   r`   r`     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   )rd  rL   rN   r   rD   r   r   
CmfComment)ry   r0   keyrU   r   s        r   rl  rl    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   ri   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   Типr6   )r(   typeu   Контактыu   Сделкиr1   u   Не нашли воронку r;   )work_list_idr(   r'   u    Не нашёлся статусu3   создадим, он нам очень нужен)	work_listr(   N)r   rC   rA   rD   rS   rT   rF   rU   rL   rN   r   rQ   CmfStatusOptr   _init_auto_assign_create_dealsr;   )r(   ri   r6   contactcontact_datarq   statusesrs   r
  dealsopts              r   rV   rV     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   
CmfTriggerrA   rF   r	   r   r(   rD   )r  auto_assigns     r   rz  rz    s     	
YZZZ
u
v
vvr   c                 `    |                                 D ]\  }}t          ||| ||           d S N)rN   _create_deal)r6   r  rs   r;   deal	deal_datas         r   r{  r{    sD     ;;== A AiT9gx@@@@A Ar   r6   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: компания, к которой принадлежит человек
    
   Почта)r6   r(   r   r   )rA   r   r@   rD   rS   rT   rF   rU   r(   ri   r6   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  )r6   r(   r   rg_member_ofr3   Fr   )
rA   r   r   guest_groupr@   rD   rS   rT   rF   rU   r  s        r   rW   rW   4  s     D488L3I3I.::<<=? ?F ''''F
KKMMM88OU++ .VY_---Mr   rp   c                     t          j        | |          }|                                 t                              |j        j                   d S )N)r(   rp   )r   
CmfProductrD   rS   rT   rF   rU   )r(   rp   ro   s      r   rP   rP   A  sC    T555GLLNNN)*****r   rs   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   Контактr1   u#   Не нашёлся контакт u    для сделки u   Продуктu5   Не указан продукт для сделки c              3   $   K   | ]\  }}||fV  d S r  r   )r   kvs      r   	<genexpr>z_create_deal.<locals>.<genexpr>Y  s*      LLTQ1a&LLLLLLr   )r(   r6   totalrs   r;   contactsN)r   r@   rA   nextrN   CmfDealrD   rS   rT   rF   rU   )	r(   ri   r6   rs   r;   r|  ro   r  r  s	            r   r  r  H  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   )rz   )F)E__doc__r   r   r   pathlibr   r   rI   r>   r   r	   r
   r   cmf.appr   nowutcrY  rj  r   rS   rH   rM  r   r   r|   rR   r   r   rL   rO   rZ   r   r   r   r   ra   r   r   rM   r^   r   r   r   r-  r.  r>  r*  r)  r+  r,  rb  r   ra  r_   r@   r`   r   rl  rV   rz  r{  rC   r   rW   intrP   rQ   r  r   r   r   <module>r     s	   * 3 2 2 2 2 2 2 2 2 2              . . . . . . . . . . . . & & & & & & 	X\""!-KKK   , E+# E+ E+ E+ E+P     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   