
    Nh                     ^   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	jD                  de fd       Z#ed        Z$de	jJ                  fdZ&d@dZ'dAde	jP                  fdZ)dAde	jP                  fdZ*edAde	jP                  fd        Z+	 dAdede	jP                  d!e	jX                  d"efd#Z-d$ Z.dAd%e	jP                  xs e	jJ                  fd&Z/dAd%e	jP                  xs e	jJ                  d'efd(Z0	 dAdede	jP                  d)e	jb                  d*efd+Z2	 dAdede	jP                  d)e	jb                  d*efd,Z3de	jP                  d-e	jh                  d.efd/Z5d0ed1e	jl                  d-e	jh                  xs dde	jP                  d2e	jn                  xs df
d3Z8d0e	jr                  de fd4Z:eded5efd6       Z;d7 Z<ed8        Z=eded5ed9e	j|                  fd:       Z?eded5ed9e	j|                  fd;       Z@eded<eAfd=       ZBeded5ed9e	j|                  d>e	j                  d1e	jl                  f
d?       ZDy)Bu7  
Изначальная постановка:
    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            
      x    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.   sT     	\!"!D64&6(!<=D#F#
     )r   r   s   ` r   tracer   (   s     Nr   emailc           
         ddl m}m} ddlm} |j                          |j                          t        j                  j                  dd| gt        j                        }|sJ d| z   dz          t        |       t        j                  j                  g d	
      }|||_        |j                  d       t        j                   j                  dd|j"                  g
      }|s$t        j                   |      j                          t%        t&        j(                   d      5 }t+        j,                  |j/                               }ddd       j                  dt1                     }	|	D ]  }
t3        |
|	|
           |j                  dt1                     }|D ]  }
t3        |
||
   d        |j                  dt1                     j5                         D ]-  \  }}|d   j5                         D ]  \  }}t7        |||        / |j                  dt1                     j5                         D ]  \  }}t9        ||        |j                  dt1                     j5                         D ]  \  }}t        j:                  |      }|j                          |j                  d      rt=        |       |j                  d      rZt>        jA                  |j"                  jB                          |j                  dt1                     j5                         D ]  \  }}tE        ||        |j                  d      j5                         D ]   \  }}tG        |||      }t        jH                  |d   d         }|j                          |d   j                  dd      s)t>        jA                  |j"                  jB                         t        jJ                  |d    d   |d    d!   |||"      j                         }|d    j                  dd      s)t>        jA                  |j"                  jB                         |j                  dt1                     j5                         D ]^  \  }}t        jL                  jO                  |j"                  jB                  #      }|D ]   }|jP                  d   jS                  |       " ` |j                  d$g       D ]s  }t        jT                  j                  |j                  d%            }t        jV                  j                  d&d|j                  d'd(      g
      }tY        ||d||       u  t[                t%        t&        j\                  d)      5 } | j_                  t+        j`                  t>                     ddd       y# 1 sw Y   axY w# 1 sw Y   yxY w)*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.%%'  $(>sG`G` aE  O9EA  EO  O  O5u$$((0Q(RL$

T
"$$((dEHH0M(NJ5)..0	##$$?@	A %Rzz"'')$% xx($&1H  >h|&<=> 88FDF#D Ed<&8)DE  88J7==? 2i(4::< 	2OE8$y1	22 "4df=CCE '&'"&((+;TV"D"J"J"L 4w%%=9;;}%$X.{{?+  !2!234 "&*:DF!C!I!I!K /./ !%)C D J J L >	9iLAmm+P!QRZ![\
>?CCOUZ[  .~~/0:K_A`aoAp S::>$& 	 -.22?EJ  /(}}Z@FFH 	5OE8&&//699??/KD# 5A++G45	5 MM."5 	>D''++.1I+JG%%))&$SU@V1W)XFvtWf=	>>& I	f""D	) +Q	

=)*+ +c% %b+ +s   '$V*8)V7*V47W c                     t         j                  j                  ddt        j                  j
                  gdg      }|sJ d       |j                  j                  |        |j                          y )Nr-   r%   	favoritesr&   uS   У администратора ещё не созданы предпочтения)	r   rH   rD   r	   current_personrI   r   rW   rG   )object_person_varss     r   rU   rU      sb    %%))+tQEUEUEXEX1Ycnbo)pKmmm;  )r   c                     d| j                   j                  v rId| j                   j                  j                  dd      z   | j                   _        | j                          y y )Nu   (Демо) r=   )r)   rX   replacerG   )objs    r   demo_fix_namer      sE    &&)?)?r)RR
 'r   c                     t        j                  |      j                          |dk(  r| }nt        |d   ||      }t        j                  |||      j                          y )Nr2   u   Менеджерr5   )r)   r7   r.   )r   r[   rG   _create_contactr\   )rh   r8   job_datari   r.   s        r   _create_workerr      sQ    
MMs  "
   (!3X|L
NN\&AFFHr   r)   
topic_name
topic_dictc                    |d   |   }t         j                  j                  ddg      D ]  }|d   |j                  D cg c]  }|j                   c}v s-| |_        |j                  d       |j                  dd	      s)t        j                  |j                  j                         t        |||        y
 y
c c}w )u   
    Находит нужный чат и пишет в первую его тему список сообщений
    :param name: имя по которому ищем группу чатов
    r1   r_   zexecutors.name)r(   	executorsTr+   r4   FN)r   r]   listr   r)   rG   rD   rV   rW   rI   rX   __add_or_create_topic)r)   r   r   r1   ro   executors         r   rR   rR      s     *%j1H##((;K0L(M k"T^^&Tx}}&TTDIIII%>>/59$$TWW]]3!$
H=&Ts    B=ro   r1   c                 :   |dk(  r| j                   d   }|sxJ d       t        j                  j                         }|sJ d       t        j                  || |g      j                         }| j                   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)))u%%002SSSu##4E7SXXZ%o%u%"Lr   rq   c                     |D ]G  }| j                  |      }t        j                  t        j                  ||       j                          I y )N)r.   message
chat_topic)r`   r   CmfChatTopicUnreadMessager	   r   rG   )rq   r1   r{   
message_ids       r   r   r      sE     o''0
((0@0@*afgllnor   c                     t         j                  j                          t         j                  j	                  d      D ]  } | j                  d        t         j                  j	                  d      D ]  }|j                  d        y )Nu   Канбан1r2   T)	recursiveu   Документ1)r   	CmfNotifyclose_open_notifiesCmfListr   deleteCmfDocument)kanbandocs     r   rd   rd      sw     ((*..%%?%; &%&!!&&,?&@ #

T
"#r   r   c                 ~   dd l }ddlm} |j                  |d      }|j	                  ddddd      }|D ]  }|j                  d      }|st        |j                   d	| d
      5 }t        j                  | |      }	|	j                  |j                                |	j                          d d d        	j                  j                  |d<   |	j                  |d<    |j	                  dddddd      }
|
D ]  }|j                  d      }|st        |j                   d	| d
      5 }t        j                  | d|       }	|	j                  |j                                |	j                          d d d        	j                  j                  |d<    t!        |      }|S # 1 sw Y   xY w# 1 sw Y   =xY w)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   "Y6D]]54DY](^]_F .IIe$	++,,CI;OQUV &Zb!'!5!5Sy!Q**8==?;##%& '5&7&7&=&=E"#)--E%L. ]]5d`dx|  JN  1O]  PN  ?jj!45++,,CK=QSWX &\g!'!5!5SI]^i]jGk!l**;+;+;+=>##%& (6'8'8'>'>F#$? IM'& && &s   (AF'-A
F3'F0	3F<	r}   c           
         |j                  dd      }|j                  dd      }|j                  dd      }|j                  d      }|j                  d|      }|j                  dd      }|j                  d	d      }	|j                  d
d      }
t        j                  j                   d| |||d|}|st        j                  d| |||||
d|}| d}t        j                  j                  |d      }|r||_        |j                          |	rd|_        |j                          |rst        t        j                   |       5 }|j                         }ddd       |j                  }t        |      |_        |j                          |j                          |rt        |       |j                  dd      }|s)t         j#                  |j$                  j&                         t)        ||d   |       |j                  dd      }|rt+        ||d   |       |j                  dd      }|rt-        ||d   |       |S # 1 sw Y   xY w)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      sK   
 !!,6J""=%8K##NNCL#''(:;##NLAL
E2H##NE:L""=$7K## QLU_5EQIOQG## RLZVb-;RJPR *N(3((,,/RV,W
!+G#'G LLN++,XJ78 !Bwwy!((C9#tDCNHHJNN ) $$_e<MWZZ--.G\)4mDWe,Eg|G4mDWe,EwW(=}MN-! !s   	IIc                    |j                         D ]  \  }}t        j                  j                  |      }|s
J d|        |D ]  }t        j                  j                  |j                  d            }t        j                  j                  |j                  d            }|sd|sgt        j
                  |||      }	|	j                            y )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    $)KKM ' y..222FY I-YY}! 		'Hnn((hll>.J(KG~~))x||O/L)MH8"(":":#%"/#
  $$&		''r   c           	      .	  " "fd}ddl m " t        j                  }|j                         D ]e  \  }}t        j
                  j                  dd|g      }|s
J d|z          |D ]*  }|j                  dd       }	|j                  d	d       }
|j                  d
d       }|j                  dd       }|j                  dd       }|j                  dd       }|j                  dd       }|j                  dd       }|j                  dd       }|j                  dd       }t        j                  j                  |	|       }t        j                  j                  |
|       }t        j                  j                  ||       }t        j                  j                  d| |       }t        j                  j                  ||       }t        j                  j                  |      }t	        j                  |j                  d      |j                  d      |       }|r|j                  j                  |       |r|j                  j                  |       |r||_        |r|j                  j                  |       |r|j                  j                  |       |r||_        ||_        ||_        ||_        |j)                         }t*        j                  |j,                  j.                         |j0                  }|r ||      |_        |r ||      |_        |j)                          t*        j                  |j,                  j.                         |s|j                         D ]&  \  }}t        j
                  j                  dd|g      }|s
J d|z          |D ]  }|j                  dd       }|j                  dd       }|j                  dd       }t	        j                  | ||      } | j)                         }!t*        j                  |!j,                  j.                         |!j0                  }|r ||      |_        |r ||      |_        |j)                          t*        j                  |j,                  j.                          ) - h y )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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 """K${{} NEV!!%%fdK-H%IJ<{JJv K	ED((8T2K!XXk48N88It4L.I!%/4!@"hh|T:O$(HH-?$F!%)XX.A4%H" HHZ6M#xxd;^^''[''JF++//^W/UInn((lG(LG>>%%U9++>%PD"NN..4FPW.XM,,00o0FJ>>XXg&XXm,D 

!!&)!!((1#' 

!!-0&&y1 -(DO DK*DIIKE  0!//M$1=>S1T.%2>?U2V/   !1!1!7!78  1A1G1G1I E-K#--11&$9T1UF!V#H;#VV6'3 E,7OOGT,J)7BGY[_7`48CH[]a8b5%+^^#*(-!2&

 ",!2%,,VYY__=(.(<(<7=IJf=gM:8>JKh>iM;%**,%,,]-=-=-C-CD%EEmK	ENEr   c           	         |j                         D ]x  \  }}|dk(  r| }t        |||       |dk(  rKt        j                  j	                  dd| j
                  gg dg      }|s
J d|         t        |||       l|dv rt        j                  j	                  dd| j
                  gd	d|gg      }|s&t        j                  || | 
      j                         }|j                         D ]  \  }}t        || |||        |dk(  st        j                  j	                  dd| j
                  gd	d|gg      }	|	s&t        j                  || | 
      j                         }	|j                         D ]  \  }
}t        |
| |	||        { y)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    mmo n
d6>FfdM:))''++5EtWZZ4XZ~3+  AFi_`g_hii6!&$>vv))---tWZZ@64QUBVW . Y
 #--4V]^cceF48JJL e0K&{GV_Vcde '!--11;KTSZS]S]:^agimos`t9u1v%11tWZabggiH8<

 n4M#4)-(L]_lmn5nr   r2  r4  c                    d }ddl m} |j                  dd      }|r2t        |j                   |       5 }|j                         }	d d d        t        j                  | ||	      }|j                          |j                  d|      }|s)t        j                  |j                  j                         |S # 1 sw Y   qxY w)Nr   r   fileF)r)   r   r(  r   r4   )r?   r
   rD   rJ   rK   rN   r   r   rG   rV   rW   rI   rX   )
r)   r}   r2  r4  r4   r   r
   filenamerk   r   s
             r   r.  r.    s     M" $$VU3HV''(
34 	779D	 NNg8$M %))/=IM]--334	 	s   B77C c                 z   dd l }ddlm} |j                  |j                  j
                  d      }|j                  ddddd      }|D ]o  }|j                  d      }|s|| j                  k(  s'| j                  j
                  |d	<   t        |      |_        |j                          |j                          q y )
Nr   r   r   r   T)zdata-macrosdata-param-page-labeldata-param-pageidr   r9  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_includer>    s    "V..44mDD}}U$Y]tx*y}zH  

#:;]chh6*-&&,,F&' #D	FKKM r   r   c                    ddl m} d }|j                         D ]6  \  }}|d   }|j                  dd       }|j                  dd      }	|j                  dd      }
|j                  dd      }|j                  d	d       }|j                  d
d      }|j                  d|      }t	        |j
                   |       5 }|j                         }|j                  d      s|j                  d      r |ddlm	}  |       }|j                  |      }d d d        t        j                  j                  dd| j                  gdd|gg      }|st        j                  || |      }|r||_        |
rt        ||        t!        ||      |_        |r't        j$                  j                  d      }||_        |j)                          |j+                          |r>t	        t,        d      5 }|j/                  |j                  j0                         d d d        |	rt3        ||	|       |rt4        j7                  |j                  j0                         9 y # 1 sw Y   GxY w# 1 sw Y   VxY w)Nr   r   r6  orderno
child_docsFinclude_parentfull_screenworkflowgreetings_docr4   mdmarkdownMarkdownr   r%   r)   r*   )r)   r(  rC  zdocument.approve:defaultr   r>   )r?   r
   rQ   rD   rJ   rK   rN   endswithrG  rI  convertr   r   rI   r@  r>  r   r   CmfWorkflowrD  rG   r   GREETINGS_DOC_ID_PATHrf   rX   r*  rV   rW   )r   r   r4   r
   rF  r  	documentsr7  r@  rA  rB  rC  rD  rE  rk   rI  r   wfr~   s                      r   r*  r*    s   "	B JJL $/yV$--	40]]<7
"'7?mmM59==T2!ou=!o}EV''(
34 	(779D  &(*;*;J*G:1!Bzz$'	(   $$.>fii-PSY[_afRg,h$i$$%VQ\]C%(f59#tDCN''++1K+L!HHJNN/6 *!GGCFFLL)*%c:}E  .I$/	( 	(,* *s   <AI&&I!I	!I*	r   c                 l   ddl m} d }|j                         D ]  \  }}|j                  d|      }t	        |j
                   dt               5 }|j                         }t        j                  d      st        j                  d      r |ddl	m
}  |       }|j                  |      }t        j                  j                  dd	| j                  gd
d	|gg      }	|	s8t        j                  |||       }	|	j                          |	j!                          |j                  d      r>t	        t"        d      5 }
|
j%                  |	j                  j&                         d d d        |s)t(        j+                  |	j                  j&                         d d d         y # 1 sw Y   @xY w# 1 sw Y   xY w)Nr   r   r4   /rF  rG  rH  r   r%   r)   r*   )r)   r   r(  rE  r>   )r?   r
   rQ   rD   rJ   rK   r7  rN   rJ  rG  rI  rK  r   r   rI   rG   r   rM  rf   rX   rV   rW   )r   r   r4   r
   rF  r  settingsrk   rI  r   r~   s              r   r)  r)    sh   "	B::< 3x _mDV''((45 	3779D  &(*;*;J*G:1!Bzz$' $$((2BD&))1TW]_cejVk0l(mC((eRXY
 ||O,/6 *!GGCFFLL)* $$SVV\\2%	3 	33"* *	3 	3s%   C(F)8&F3F)F&"F))F3	r/  r1  c           	         d }|j                   }|dv r#|j                  dd      }|j                  dd       }|j                  dd      }	|s|j                  }n t        j                  j                  |      }|dk(  rPdd	lm}
 |j                  d
d      }|r6t        |
j                   |       5 }|j                         }d d d        r|}t        j                  | ||d||      }|	r)t        |_        |j                  t        d      z   |_        |j                          |	r|j!                          n|dk(  r)t        j"                  | ||      }|j                          n|dk(  r)t        j$                  | ||      }|j                          n_|dk(  rZ|j                  dd      }t        j&                  ||| |t        j                  j                  d            }|j                          |r\|j                  dd      }|j                  d|      }|s)t(        j+                  |j,                  j.                         |rt1        |       |S # 1 sw Y   xY w)N)r"  r$  r   Fr   launchedr   r"  r   r   r6  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}   r/  r1  r4   structure_objectfolder_namer   r   rT  r
   r7  rk   r   r3   s                  r   r,  r,  "  sY   
 ++K--$((u=
%))->"&&z59 ++J,,00j0AJ)#*&**659HV//0
;< %779D%"&K!>>wFhU`mwy /4,-=-M-MPY_aPb-b*%%'	.	.!..

 		
	"!,,

 			%))-?!>>TX^XkXkXoXo  vIXo  YJ
 	%))-?'++O]K  !1!4!4!:!:;$%56
 g% %s   1IIc                    t        j                  | ||d      }|j                  dk(  r*t         j                  j	                  dd      }|r||_        |j                          |j	                  dd      }|j	                  d	|      }|s)t        j                  |j                  j                         |rt        |       d
|v rt        |||d
          |S )Nr   )r)   r}   r(  rU  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}   r/  r1  r4   r   r   r3   s           r   _create_kanbanrb  n  s     ^^wFV^_F.((,,2M^b,c
 *F
KKM!%%mU;K#''GMVYY__- (/!Wfog.FGMr   r   r   c           	         |J d       t        |t              sJ dt        |      z          |j                         D ]J  \  }}t        j
                  j                  dd|g      }|s
J d|z          |D ]  }t        |||| d        L y)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   ra  ra    s     \\\eT"  F$x{~  @E  |F  %F  F"${{} >V!!%%fdK-H%IJ<{JJv 	>Dvvw=	>>r   r|   r<   r  c                    t        | t              sJ dt        |       z          | j                  dd      }| j                  dd      }| j                  dg       }| j                  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"                        }|j%                  |j'                                |j)                          |d|j*                   dz   }ddd        ||z   |
_        t        |t        j.                        |
_        |
j0                  r|
j2                  j5                  |       n||
_        |
j)                          d|
_        |
j)                          |rt9        |
|       |
j)                          t:        j5                  |
j<                  j>                         y# 1 sw Y   jxY w)u   
    :param task: заголовок задачи
    :param status: статус задачи в CRM
    :param kanban: объект списка в который это надо добавить (или None для входящих)
    :param project: объект проекта
    u@   Передан task не являющийся словарем: r  r=   contentr1   picturesr   rW     )r  
alarm_dater)   r}   r<   r   r   z<p><img src="z"/></p>NF) rd  rO   r   rD   rY  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  rf  r1   rg  ri  task_objcontent_imgr   img_path_objimg_readr   s                   r   rc   rc     s    dD!q#ehklphq#qq!HHWb!Ehhy"%Gxx
B'Hxx
B'HJq)"::
)"44
&&~~JUG\bdH K TF..9:,% 	T#11HYHYZN&&x}}7!%-8J8J7K7(SSK		T 	TT k)HM"66>>:Hf% "!MMO8,MMO**++	T 	Ts   A$H;;I	c                 L   | J d       t        |t              r?|j                         D ]+  \  }}|dk(  s
J d|        || _        | j	                          - nt        |t
              s
J d|        |D ]-  }|dk7  s	t        j                  ||       j	                          / y )Nu:   Передана несуществующая задачаdescu,   Не поддерживаемое поле: uL   Комментарии не являются списком, странно )r   r   )rd  rO   rQ   r   rG   r   r   
CmfComment)r|   r1   keyrX   r   s        r   rl  rl    s    YYY(D!"..* 	JC&=V$PQTPU"VV=DIIIK	
 (D)  	E-y  {C  zD  ,E  	E) =6>45::<=r   rl   c                 .   t        j                  | |j                  dd            j                         }t        j                  |j                  j                         |j                  dt                     j                         D ]  \  }}t        |||        |j                  dt                     j                         D ]  \  }}t         j                  j                  |      }|s
J d|        |j                         D ]  \  }}	t         j                  j                  |j                  |dg	      }
|
s4t        d
|d       t        j                  ||      }
|
j                          t        |
       t        ||	||
j                            y)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90MNSSUG))*!%*<df!E!K!K!M 8w78#'88NDF#C#I#I#K @x%%))})=J:=/JJx"*.."2 	@K%%))x{{^f]g)hC8+G|}))H;O
c"'5(CJJ?	@@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   rz  rz    s    	
YZ
u
vvr   c                 R    |j                         D ]  \  }}t        ||| ||        y N)rQ   _create_deal)r7   r  rv   r<   deal	deal_datas         r   r{  r{  "  s-     ;;= AiT9gx@Ar   r7   c                     || |j                  d      d}t        j                  di |}|j                          t        j                  |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   (  sP     !$,9OPF''F
KKM)Mr   c                 ,   || |j                  d      t        j                  j                         gd}t        j                  di |}|j                          |j                  dd      s)t        j                  |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  sw     D488L3I..::<=?F ''F
KKM88OU+VYY__-Mr   rs   c                     t        j                  | |      }|j                          t        j	                  |j
                  j                         y )N)r)   rs   )r   
CmfProductrG   rV   rW   rI   rX   )r)   rs   rr   s      r   rS   rS   D  s5    T5GLLN))*r   rv   c                    t         j                  j                  |d         }|sJ d|d    d|         |d   s
J d|         t        d |d   j	                         D              \  }}t        j
                  | |||||g      }|j                          t        j                  |j                  j                         y	)
u  
    :param pipeline: воронка продаж, в которой окажется сделка
    :param name: название сделки
    :param data: {
        Контакт: Василий Рыбин,
        Продукт: {
            Пельмени с говядиной: 400
        }
    }
    :param company: компания с которой проводится сделка
    u   Контактr2   u#   Не нашёлся контакт u    для сделки u   Продуктu5   Не указан продукт для сделки c              3   *   K   | ]  \  }}||f  y wr  r   ).0kvs      r   	<genexpr>z_create_deal.<locals>.<genexpr>\  s     LTQ1a&Ls   )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9$?O:P9QQfgkflmm7 !a%Z[_Z`#aa!LT2B-C-I-I-KLLNGU>>D 	IIK'r   )r}   )F)E__doc__r   r   r   pathlibr   r   rL   r?   r   r	   r
   r   r@   r   nowutcrY  rj  r   rV   rK   rM  r   r   r   rU   r   r   rO   rR   r]   r   r   r   r   rd   r   r   rP   ra   r   r   r   r-  r.  r>  r*  r)  r+  r,  rb  r   ra  rb   rC   rc   r   rl  rY   rz  r{  rF   r   rZ   intrS   rT   r  r   r   r   <module>r     s4  * 3 2    . . & 	X\\"!--..JK , H+# H+ H+V I I   $     3 3  PT   o,, o o o # #f&8&8 @5p'F$5$5 ' VE6,, VEv  nV..  n  nH qv
))5;5G5G\`* '/&"3"3"Iv7I7I '/T3f//E63E3E 3T 36 kpI
I))I393C3CIVZIZ kp
))393C3CVZ0>&"3"3 >V^^ >TX > 6,t 6,))6,/46, !++6, %..6$	6,t=6>> =T = @# @T @ @.):X A A
 # T F4E4E   	s 	$ 	1B1B 	 	 +# +S + + ((((.(9(9(EKEWEW(agaqaq( (r   