
    >Tf%                         d dl Z d dlZd dlm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 d dlmZ d dlmZ  G d	 d
eej                  ZdS )    N)StringIO)forms)gettext)SyncedDataMixin)CSVDelimiterChoicesImportFormatChoicesImportMethodChoices)CSV_DELIMITERS)	parse_csvc                       e Zd Z ej        ed          Z ej        d ej        ddi           e	d                    Z
 ej         e	d          d	          Z ej        eej        
          Z ej        eej         e	d           e	d          d          ZdZ fdZd Zej        fdZd Zd Z xZS )BulkImportFormF)choicesrequiredclasszfont-monospace)attrsz.Enter object data in CSV, JSON or YAML format.)r   widget	help_textz	Data file)labelr   )r   initialzCSV delimiterzDThe character which delimits CSV fields. Applies only to CSV format.)r   r   r   r   r   datac                    t                                                       | j                            d          pt          j        }| j        d         r1|t          j        k    r!t          j        t          d                    |t          j	        k    rId| _
        | j                            d          }|                                                    d          }n0|t          j        k    r| j        d         j        }n| j        d         }| j        d         t           j        k    r>| j        d         t$          j        k    rt           j        }n#|                     |          }n| j        d         }|t           j        k    rF| j                            dt$          j                  }|                     ||	          | j        d<   d S |t           j        k    r|                     |          | j        d<   d S |t           j        k    r|                     |          | j        d<   d S t          j        t          d
                              |                    )Nimport_methodr   z8Form data must be empty when uploading/selecting a file.upload_filez	utf-8-sig	data_fileformatcsv_delimiter)	delimiterzUnknown data format: {format})r   )supercleancleaned_datagetr	   DIRECTr   ValidationError_UPLOADr   filesreaddecode	DATA_FILEdata_as_stringr   AUTOr   CSV_detect_format
_clean_csvJSON_clean_jsonYAML_clean_yamlr   )selfr   filer   r   r   	__class__s         @/var/www/html/netbox-4.1.3/netbox/utilities/forms/bulk_import.pyr   zBulkImportForm.clean+   s    )--o>>\BUB\ V$ 	g:M:T)T)T'*d(e(efff/666,D:>>-00D99;;%%k22DD1;;;$[1@DD$V,D X&*=*BBB 15H5MMM,0,,T22&x0F (,,,)--o?R?WXXI(,	(R(RDf%%%*///(,(8(8(>(>Df%%%*///(,(8(8(>(>Df%%%'*I(J(J(Q(QY_(Q(`(`aaa    c                    	 |d         dv rt           j        S |                    d          s|                    d          rt           j        S |                    dd          d         t          j                    }t          fd|D                       rt           j        S n# t          $ r Y nw xY wt          j        dt          d	          i          )
z
        Attempt to automatically detect the format (CSV, JSON, or YAML) of the given data, or raise
        a ValidationError.
        r   ){[z---z- 
   c              3       K   | ]}|v V  	d S )N ).0x
first_lines     r6   	<genexpr>z0BulkImportForm._detect_format.<locals>.<genexpr>_   s'      ;;q1
?;;;;;;r7   r   z-Unable to detect data format. Please specify.)r   r/   
startswithr1   splitr
   valuesanyr,   
IndexErrorr   r#   r$   )r3   r   csv_delimitersrA   s      @r6   r-   zBulkImportForm._detect_formatR   s    
	Aw*$$*//u%% 0)>)> 0*//D!,,Q/J+244N;;;;N;;;;; /*../ 	 	 	D	#aGHH%
   	s   B& 5B& AB& &
B32B3c                    |t           j        k    rd                    t          j                              }	 t          j                                        |                                |          }n# t
          j	        $ r t
          j
        }Y nrw xY w|t           j        t           j        fv rt
          j
        }||_        n@|t           j        k    rt
          j        }n#t!          j        dt%          d          i          t'          |                                          }t          j        ||          }t+          |          \  }}|                    dd           || _        |S )z\
        Clean CSV-formatted data. The first row will be treated as column headers.
         )
delimitersr   zInvalid CSV delimiter)dialectidN)r   r+   joinr
   rE   csvSniffersniffstripErrorexcelCOMMA	SEMICOLONr   TAB	excel_tabr   r#   r$   r   readerr   pop_csv_headers)	r3   r   r   rK   rL   streamrY   headersrecordss	            r6   r.   zBulkImportForm._clean_csvg   sN   
 +000 !6!8!899J$+----djjllz-RR9 $ $ $)$.46I6STTTiG )G-111mGG'#:!;!;)    $**,,''FG444$V,, 	D$#s   :A3 3BBc                     	 t          j        |          }t          |          t          ur|g}|S # t           j        j        $ r#}t          j        | j        d| i          d}~ww xY w)zs
        Clean JSON-formatted data. If only a single object is defined, it will be encapsulated as a list.
        zInvalid JSON data: N)	jsonloadstypelistdecoderJSONDecodeErrorr   r#   
data_field)r3   r   errs      r6   r0   zBulkImportForm._clean_json   s    		:d##DDzz%%vK|+ 	 	 	'!<s!<!<)   	s   .1 A(A##A(c                    g }	 t          j        |t           j                  D ]}t          |          t          u r|                    |           .t          |          t          u r|                    |           Zt          j	        | j
        t          d          i          n:# t           j        j        $ r#}t          j	        | j
        d| i          d}~ww xY w|S )z
        Clean YAML-formatted data. Data must be either
          a) A single document comprising a list of dictionaries (each representing an object), or
          b) Multiple documents, separated with the '---' token
        )LoaderzzInvalid YAML data. Data must be in the form of multiple documents, or a single document comprising a list of dictionaries.zInvalid YAML data: N)yamlload_all
SafeLoaderrb   rc   extenddictappendr   r#   rf   r$   error	YAMLError)r3   r   r^   rg   s       r6   r2   zBulkImportForm._clean_yaml   s    	d4?CCC  ::%%NN4(((($ZZ4''NN4((((/A* *1    z# 	 	 	'!<s!<!<)   	
 s   B"B' 'C;CC)__name__
__module____qualname__r   ChoiceFieldr	   r   	CharFieldTextarear$   r   	FileFieldr   r   r+   r   r   r   rf   r   r-   r.   r0   r2   __classcell__)r5   s   @r6   r   r      s       %E%#  M 5?u~W.>$?@@@!DEE  D
 "%/ann  K U##(  F &E%##(a  !Z[[  M J%b %b %b %b %bN  * *=)A    B        r7   r   )rO   r`   ior   rj   djangor   django.utils.translationr   r$   core.forms.mixinsr   netbox.choicesr   r   r	   utilities.constantsr
   utilities.forms.utilsr   Formr   r>   r7   r6   <module>r      s    



               1 1 1 1 1 1 - - - - - - X X X X X X X X X X . . . . . . + + + + + +a a a a a_ej a a a a ar7   