
    i%              
          d Z ddlZddlmZ ddlmZ ddlmZ ddlm	Z	m
Z
mZmZmZ ddlZddlmZ  ed	       G d
 d             Zdededeee   ef   fdZdedej,                  fdZdedej,                  fdZdej,                  dee   fdZde
ee	f   dee   defdZde
ee	f   dee   dedee   fdZde
ee	f   dee   dede
ee	f   fdZde	dededee   fdZy)z7Parse batch task files (CSV/Excel) into runnable tasks.    N)	dataclass)BytesIO)Path)AnyDictListOptionalTuple)ValidationErrorT)frozenc                   V    e Zd ZU eed<   ee   ed<   eed<   ee   ed<   eee	f   ed<   y)	BatchTask	row_indextask_idtask_promptattachment_pathsvars_overrideN)
__name__
__module____qualname__int__annotations__r	   strr   r   r        I/Users/bowang/.openclaw/workspace/ChatDev/server/services/batch_parser.pyr   r      s/    Nc]3iS>!r   r   contentfilenamereturnc                    t        |xs d      j                  j                         }|dvrt        dd      |dk(  rt	        |       }nt        |       }t        |      j                  xs d}t        |      }|st        dd      ||fS )	zBParse a CSV/Excel batch file and return tasks plus file base name. >   .xls.xlsx.csvz1Unsupported file type; must be .csv or .xlsx/.xlsfilefieldr$   batchzBatch file contains no tasks)r   suffixlowerr   	_read_csv_read_excelstem_parse_dataframe)r   r   r)   df	file_basetaskss         r   parse_batch_filer2      s    (.b!((..0F..QY_``w!X##.wIR E<FKK)r   c                    	 dd l }d}|r&|j                  |       }|j                  d      xs |}	 t	        j
                  t        |       |      S # t        $ r d }Y Xw xY w# t        $ r}t        d| d      d }~ww xY w)Nr   zutf-8encoding)r4   zFailed to read CSV: r%   r&   )chardet	Exceptiondetectgetpdread_csvr   r   )r   r5   r4   detectedexcs        r   r+   r+   )   s     H>>'*<<
+7xJ{{77+h??    J 4SE:&IIJs(   A A" AA"	B +A;;B c                     	 t        j                  t        |             S # t        $ r}t	        d| d      d }~ww xY w)NzFailed to read Excel file: r%   r&   )r9   
read_excelr   r6   r   )r   r<   s     r   r,   r,   8   sC    Q}}WW-.. Q ;C5APPQs     	>9>r/   c           
         | j                   D ci c]*  }t        |      j                         j                         |, }}|j	                  d      }|j	                  d      }|j	                  d      }|j	                  d      }g }t               }t        | j                  d      d      D ]  \  }	}
t        |
|      }t        |
||	      }t        |
||	      }|s|st        d	d
|	i      t        |
|      }|r%||v rt        d|	|d      |j                  |       |j                  t        |	|xs d |||              |S c c}w )Nidtaskattachmentsvarsrecords)orient   )startz)Task and attachments cannot both be emptyr   detailszDuplicate ID in batch file)r   r   )r   r   r   r   r   )columnsr   stripr*   r8   set	enumerateto_dict_get_cell_text_parse_json_list_parse_json_dictr   addappendr   )r/   col
column_mapid_coltask_colattachments_colvars_colr1   seen_idsr   rowr   r   r   r   s                  r   r.   r.   ?   sS   ;=::F:C#c(.."((*C/:JF^^D!F~~f%H nn]3O~~f%HEH#BJJiJ$@J	3$S(3+C)L(h	B#3!;$i0 
 !f-("%0*3H  LL!#4'!1+	
) K: LM Gs   /Er[   columnc                     |sy| j                  |      }|yt        |t              rt        j                  |      ryt        j                  |      ryt        |      j                         S )Nr!   )r8   
isinstancefloatr9   isnar   rK   )r[   r\   values      r   rO   rO   i   sU    GGFOE}%BGGEN	wwu~u:r   r   c                    |sg S | j                  |      }|%t        |t              rt        j                  |      rg S t        |t
              rt        ||d      S t        |t              r5|j                         sg S 	 t        j                  |      }t        ||d      S t        dd|i      # t        j                  $ r}t        d| d|i      d }~ww xY w)NAttachmentszInvalid JSON in Attachments: r   rH   zAttachments must be a JSON list)r8   r^   r_   r9   r`   list_ensure_string_listr   rK   jsonloadsJSONDecodeErrorr   r[   r\   r   	raw_valueparsedr<   s         r   rP   rP   v   s    
 	IZ	59bggi>P	)T""9iGG)S! I	ZZ	*F #69mDD
)i(  ## 	!/u5$i0 	s   ?B0 0CCCc                    |si S | j                  |      }|%t        |t              rt        j                  |      ri S t        |t
              r|S t        |t              rI|j                         si S 	 t        j                  |      }t        |t
              st        dd|i      |S t        dd|i      # t        j                  $ r}t        d| d|i      d }~ww xY w)NzInvalid JSON in Vars: r   rH   zVars must be a JSON object)r8   r^   r_   r9   r`   dictr   rK   rf   rg   rh   r   ri   s         r   rQ   rQ      s    
 	IZ	59bggi>P	)T")S! I	ZZ	*F &$'!,$i0  
$i(  ## 	!(.$i0 	s   4B9 9C#CC#ra   r'   c                     t        | t              st        | dd|i      g }| D ]D  }|%t        |t              rt	        j
                  |      r+|j                  t        |             F |S )Nz must be a JSON listr   rH   )r^   rd   r   r_   r9   r`   rS   r   )ra   r   r'   resultitems        r   re   re      so    eT"g)* ),
 	
 F<JtU3c$i   Mr   )__doc__rf   dataclassesr   ior   pathlibr   typingr   r   r   r	   r
   pandasr9   utils.exceptionsr   r   bytesr   r2   	DataFramer+   r,   r.   rO   r   rP   rQ   re   r   r   r   <module>rz      sx   =  !   3 3  , $" " "e s uT)_c=Q7R $Ju J JQ Q2<< Q' '$y/ 'T
S#X 
 
# 
	c3hSM  
#Y	:	c3hSM  
#s(^	Ds s 3 49 r   