
    ir-                     r    d dl mZ d dl d dlmZ d dlmZ d dlmZ d dl	  G d dej                        Z
y)	    )TemporaryDirectory)*)cmf_project_import)
parse_file)AttachmentLoggerc                        e Zd ZU ej                  j
                  g dz   ZdZeed<   e	d        Z
 fdZddefdZddZdd	Zd
 Zd Zd Z fdZddZddZd Zd Zd Zed fd	       Z xZS )CmfProjectImport)get_columnsget_column_valuesvalidaterunux_check_permN_attachment_loggerc                 B    t         j                  j                  |       S )N)parent)modelsCmfAttachmentgetselfs    ../modules/project/models/cmf_project_import.pyfilezCmfProjectImport.file   s    ##''t'44    c                 (    t         |          dgz   S )Nstatus)supersave_preload_fields)r   	__class__s    r   r   z$CmfProjectImport.save_preload_fields   s    w*,z99r   returnc                 x    | j                   #t        d| j                   ddd| |      | _         | j                   S )uL   Возвращает логгер для импорта с ротацией.project_import__   
   )prefixmax_size_mb	max_files
parent_objbase_log_name)r   r   id)r   r)   s     r   
get_loggerzCmfProjectImport.get_logger   sG    ""* '7(	3+'D# &&&r   c                 X     t        | j                         j                  |      |       y)u7   Логирование процесса импорта.N)getattrr+   logger)r   messagelevels      r   logzCmfProjectImport.log)   s     0!((%09r   c                     | j                         j                  | d|        |r |||fi |j                          yy)uR   Логируем ошибки для совместимости с CmfImportPluginz: N)r+   errorsave)r   msg
error_codeerror_modelkwargss        r   	log_errorzCmfProjectImport.log_error-   sB    :,b 67Z262779 r   c                     | j                   r<| j                   j                          | j                   j                          d| _         yy)u^   Сохраняет текущий лог как аттач и закрывает логгер.N)r   flush_to_s3closer   s    r   save_import_logsz!CmfProjectImport.save_import_logs4   s<    ""##//1##))+&*D# #r   c                 `   ddl }ddl}ddlm} dd| gg dg}t        j
                  j                  |      syt        j
                  j                  |      }t        |      dk(  r|d   S t               5 }|j                  j                  |d	| j                  j                   d
      }t        j                  | dd      }|j                          |j                  |d      5 }	|D ]I  }
|
j!                         }|j#                         }|	j%                  ||
j&                  j                         K 	 ddd       t        |d      5 }|j)                  |ddd       ddd       |D ]  }
|
j+                  d        	 ddd       |S # 1 sw Y   WxY w# 1 sw Y   9xY w# 1 sw Y   S xY w)u   Архивирует все лог-файлы импорта в tar.gz или оставляет единственный файл как есть.r   N)configr   ==)	file_typer@   .log)filter   import_logs_z.tar.gzzimport_logs.tar.gz.gz)r   namerA   zw:gz)arcnamerbF)make_previewbackup
mark_dirtyT)force)tarfileoscmfr?   r   r   countlistlenr   pathjoinr*   valuer4   open	get_rfiletmp_readonly_pathaddrG   upload_stream_filedelete)r   rN   rO   r?   _filterlog_attachmentstmp_dir_namearchive_patharchive_attachmenttar
attachment	cmf_rfile	file_pathfs                 r   zip_all_logszCmfProjectImport.zip_all_logs;   s   dD)+FG##)))9 ..33 4 
 1$"1%%! 	.\77<<TWW]]OSZ6[\L!'!5!5) "6 "
 ##%lF3 Fs"1 FJ * 4 4 6I ) ; ; =IGGIz/D/DGEFF
 lD) mQ"55aeTYfk5lm . .
!!!-.'	., "!F F
m m	., "!s>   6A/F#%AF5F#	F!F#F	F#F 	F##F-c           	         | j                   j                  xs i }|j                  dd      }|j                  dd      }|j                  dd      }|j                  dd      }d| d| d| d	| d
	}t        j                  j                  | ddddggdg      }d}|r'd|j
                   d|j                  j                   d}d}	t        | d      r9| j                  j                  dk(  r d| j                  j                   d}
d|
 d}	| | |	 }t        j                  j                  | | j                  d|d       y )N
total_rowsr   created_countskipped_counterror_countub   
        <strong>Статистика импорта:</strong><br>
        Всего строк: u   <br>
        Создано: u!   <br>
        Пропущено: u   <br>
        Ошибок: z	
        rA   INrB   rF   url)r   rC   fields z<br><br><a href="u   ">Скачать отчет (z)</a>entity_typetaskz$%5B%27cmf_import%27,%20%27%3D%27,%20z%5Dz<br><br><a href="/filter?ubql=uH   ">Просмотреть импортированные задачи</a>u   Импорт завершёнT)objpersonrG   r5   force_notify_current_person)import_statsrV   r   r   r   rn   rG   hasattrrq   r*   	CmfNotifyplace_notify
cmf_author)r   statstotalcreatedskippederrors
stats_textlog_filelog_link
tasks_linkfilter_ubqlr5   s               r   send_completion_notificationz-CmfProjectImport.send_completion_notificationb   s    !!''-2		,*))OQ/))OQ/=!,  %w ' 	 "$I &h 	
 ''++77 , 
 *8<<.8UV^VcVcViViUjjopH 
4'D,<,<,B,Bf,L@sSK9+  GO  PJ XJzl3 	%%??0(, 	& 	
r   c                     d}| j                   sV| j                  j                  |v r>d}|D ]7  }t        | |      st	        | |      j
                  s't        d| dd       9 t        |    di | y)	u|   Переопределяем сохранение для защиты настроек во время выполнения.)
validatingin_progress)json_settingsfield_mappingvalue_mappingskip_on_errordefault_task_typerq   r   projectu'   Нельзя изменять поле u5    во время выполнения импорта.TabortN )	is_newr   oldrw   r-   
is_changed	cmf_alertr   r4   )r   r8   locked_statusesprotected_fieldsfieldr   s        r   r4   zCmfProjectImport.save   s     8{{t{{/A h * R4'GD%,@,K,K Gw  OD  E  MQ  RR 	vr   c           	      T   | j                  ddg       | j                  st        dd       | j                  j                  xs i }|j                  dd      }g }t        t        | j                  fi |      D ]o  \  }}|dk(  s|r8t        |      D 	cg c]!  \  }}	|t        |	      j                         d# }}}	Ft        t        |            D cg c]  }|d	|d
z    d }}q |D ]*  }
| j                  |
d   |      }d|
d<   |s |d   d   |
d<   , d|iS c c}	}w c c}w )u   Возвращает заголовки столбцов файла в формате {"columns": [{"index": i, "name": name}, ...]}.r   r   #   Файл не прикреплён.Tr   	first_rowr   )indexrG   u   Колонка rD   r   Nvaluescolumncolumns)load_fieldsr   r   r   rV   r   	enumerater   strstriprangerS   r   )r   values_limitr8   settingsfirst_row_is_headerr   irowidxvalcolcolumn_valuess               r   r
   zCmfProjectImport.get_columns   sH   &/23yy;4H%%++1r&ll;=
499 A AB 	mFAsAv&XabeXfgHCQTc#hnn6FGgGg ]bbefibj\klUXAw6OPlGl	m  	BC 223w<NM CM -h 7 AH		B
 7## h ms   &DD%c                    | j                  ddg       | j                  st        dd       | j                  j                  xs i }|j                  dd      }t               }t        t        | j                  fi |      D ]Z  \  }}|dk(  r|r|t        |      k  r/||   }	|	r(|j                  t        |	      j                                t        |      |k\  sZ n d|t        |      d	| d
iS )u   Возвращает уникальные значения из указанного столбца в формате {"column": {"index": column_index, "values": [...]}}.r   r   r   Tr   r   r   r   N)r   r   )r   r   r   r   rV   r   setr   r   rS   rZ   r   r   rR   )
r   column_indexlimitr8   r   r   r   r   r   r   s
             r   r   z"CmfProjectImport.get_column_values   s    &/23yy;4H%%++1r&ll;=
499 A AB 	FAsAv-c#h&,'JJs3x~~/06{e#	 LDL%<PQRRr   c                 R    | j                   j                  d| j                          y )N
PPP-IMPORTrs   )r   check_project_role_accessr   s    r   _check_accesszCmfProjectImport._check_access   s    --l-Lr   c                     | j                          d| _        | j                          t                t	        | j
                  j                         dddS )u8   Запуск проверки файла (deferred job).r   oku!   Проверка запущенаr   r/   )r   r   r4   
cmf_commitvalidate_importr*   rV   r   r8   s     r   r   zCmfProjectImport.validate   sA     	"		&+NOOr   c                 J   | j                   j                         dvrt        dd       | j                          d| _         dddddd| _        | j                          t                | j                  d       t        t        d	| j                  j                  i
       dddS )u+   Запуск импорта (deferred job).)readyclosedclosed_with_errorsr3   u>   Сначала выполните проверку файла.Tr   r   r   )ri   processed_rowsrj   rk   rl   run_data_log	import_id)r8   r   u   Импорт запущенr   )r   loadr   r   rv   r4   r   r+   schedule_deferred_job
run_importr*   rV   r   s     r   r   zCmfProjectImport.run   s     ;;%WWV^bc# 
 			'j+dggmm1LM+HIIr   c                     	 |dk(  rSt         j                  |      }|r|j                  dk7  rt        d| d       t	               |j                  d|      S 	 t        |   ||||      S # t        $ r Y yw xY w)	Nr   
CmfProjectu&   Не указан проект parent=Tr   r   r   F)cmfutilget_obj_by_id
class_namer   CmfPermissionErrorr   r   r   )clsrs   
field_namepermr   r   s        r   r   zCmfProjectImport.ux_check_perm   s    		u} ..v6!2!2l!B FvhOW[\,..77&7QQ  w$S*dFCC " 		s   AA. .	A:9A:)data_log)info)zERR-0001N)r$   )NNupdateN)__name__
__module____qualname__r   r	   api_methodsr   r   __annotations__propertyr   r   r+   r1   r9   r=   rg   r   r4   r
   r   r   r   r   classmethodr   __classcell__)r   s   @r   r	   r	   	   s    $55AA E K ,0(/5 5:'6F '::+%"N-
^$0S,M	PJ. D Dr   r	   N)tempfiler   cmf.includemodules.project.fieldsr   common.utils.csv_import_utilsr   common.utils.attachment_loggerr   8modules.project.models.workers.cmf_project_import_workerr	   r   r   r   <module>r      s.    '  5 4 ; FuD):: uDr   