
    gA                       U 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mZ d dlmZ d dlmZ d dlmZ d d	lmZmZ d d
lmZmZmZmZmZ d dlmZ d dlm Z! d dl"m#Z$ d dl%m&Z& d dl'm(Z(m)Z) d dl*m+Z+m,Z,m-Z-m.Z. d dl/m0Z0m1Z1 erd dl2m3Z3 d dl4m5Z5 e	e1e0e6e	e1e0f      df   Z7de8d<   	 	 	 	 ddZ9e G d d             Z: G d d      Z;y)    )annotations)	dataclass)dedent)TYPE_CHECKINGLiteralUnioncastoverload)	TypeAlias)config)normalize_upload_file_type)current_form_id)check_widget_policiesmaybe_raise_label_warnings)KeyLabelVisibilitycompute_and_register_element_id get_label_visibility_proto_valueto_key)FileUploaderState)UploadedFileInfo)FileUploader)gather_metrics)ScriptRunContextget_script_run_ctx)
WidgetArgsWidgetCallbackWidgetKwargsregister_widget)DeletedFileUploadedFile)Sequence)DeltaGeneratorNr   SomeUploadedFilesc                   | g S t               }|g S | j                  }t        |      dk(  rg S |j                  j	                  |j
                  |D cg c]  }|j                   c}      }|D ci c]  }|j                  | }}g }|D ]k  }|j                  |j                        }|(t        ||j                        }|j                  |       H|j                  t        |j                               m |S c c}w c c}w )Nr   )
session_idfile_ids)r   uploaded_file_infolenuploaded_file_mgr	get_filesr&   file_idgetr!   	file_urlsappendr    )	widget_valuectxr(   ffile_recs_list	file_recscollected_filesmaybe_file_recuploaded_files	            ]/var/www/openai/venv/lib/python3.12/site-packages/streamlit/elements/widgets/file_uploader.py_get_upload_filesr9   ?   s    	

C
{	%88
!#	**44>>%78%7!))%78 5 N
 (66~!A~I68:O"qyy1%(EM""=1"";qyy#9:    9 7s   C<
2Dc                  4    e Zd ZU ded<   	 	 	 	 	 	 ddZddZy)FileUploaderSerdeboolaccept_multiple_filesc                    t        |      }t        |      dk(  r| j                  rg }|S d }|S | j                  r|n|d   }|S )Nr   )r9   r)   r=   )selfui_value	widget_idupload_filesreturn_values        r8   deserializezFileUploaderSerde.deserializee   sa     )2|!484N4NbL
  UYL
  !% : :Q      c                \   t               }|s|S t        |t              s|g}|D ]  }t        |t              r|j                  j                         }|j                  |_        |j                  |_        |j                  |_        |j                  j                  |j                          |S N)FileUploaderStateProto
isinstancelistr    r(   addr,   namesizer.   CopyFrom
_file_urls)r?   filesstate_protor2   	file_infos        r8   	serializezFileUploaderSerde.serializer   s    ,.E4(GEA![)/:/M/M/Q/Q/SI !		IVVINVVIN((6  rE   N)r@   FileUploaderStateProto | NonerA   strreturnr$   )rP   r$   rV   rH   )__name__
__module____qualname____annotations__rD   rS    rE   r8   r;   r;   a   s*    5BE	rE   r;   c                     e Zd Ze	 	 	 	 	 dddd	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd       Ze	 	 	 	 	 	 dddd	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd       Zeddddddddd	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd       Zedddddddddd			 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd
       Z ed      	 	 	 	 	 	 	 dddd	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd       Z	 	 	 	 	 	 	 ddddd	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZedd       Zy)FileUploaderMixinNFvisible)disabledlabel_visibilityc	                    y rG   r[   r?   labeltyper=   keyhelp	on_changeargskwargsr_   r`   s              r8   file_uploaderzFileUploaderMixin.file_uploader        %(rE   c	                    y rG   r[   rb   s              r8   rj   zFileUploaderMixin.file_uploader        "rE   )rd   re   rf   rg   rh   ri   r_   r`   c       	             y rG   r[   r?   rc   r=   rd   re   rf   rg   rh   ri   r_   r`   s              r8   rj   zFileUploaderMixin.file_uploader   rk   rE   )	r=   rd   re   rf   rg   rh   ri   r_   r`   c       	             y rG   r[   ro   s              r8   rj   zFileUploaderMixin.file_uploader   rm   rE   rj   c	               N    t               }| j                  |||||||||	|
|      S )a/  Display a file uploader widget.
        By default, uploaded files are limited to 200MB. You can configure
        this using the ``server.maxUploadSize`` config option. For more info
        on how to set config options, see
        https://docs.streamlit.io/develop/api-reference/configuration/config.toml

        Parameters
        ----------
        label : str
            A short label explaining to the user what this file uploader is for.
            The label can optionally contain GitHub-flavored Markdown of the
            following types: Bold, Italics, Strikethroughs, Inline Code, Links,
            and Images. Images display like icons, with a max height equal to
            the font height.

            Unsupported Markdown elements are unwrapped so only their children
            (text contents) render. Display unsupported elements as literal
            characters by backslash-escaping them. E.g.,
            ``"1\. Not an ordered list"``.

            See the ``body`` parameter of |st.markdown|_ for additional,
            supported Markdown directives.

            For accessibility reasons, you should never set an empty label, but
            you can hide it with ``label_visibility`` if needed. In the future,
            we may disallow empty labels by raising an exception.

            .. |st.markdown| replace:: ``st.markdown``
            .. _st.markdown: https://docs.streamlit.io/develop/api-reference/text/st.markdown

        type : str or list of str or None
            Array of allowed extensions. ['png', 'jpg']
            The default is None, which means all extensions are allowed.

        accept_multiple_files : bool
            If True, allows the user to upload multiple files at the same time,
            in which case the return value will be a list of files.
            Default: False

        key : str or int
            An optional string or integer to use as the unique key for the widget.
            If this is omitted, a key will be generated for the widget
            based on its content. No two widgets may have the same key.

        help : str or None
            A tooltip that gets displayed next to the widget label. Streamlit
            only displays the tooltip when ``label_visibility="visible"``. If
            this is ``None`` (default), no tooltip is displayed.

            The tooltip can optionally contain GitHub-flavored Markdown,
            including the Markdown directives described in the ``body``
            parameter of ``st.markdown``.

        on_change : callable
            An optional callback invoked when this file_uploader's value
            changes.

        args : tuple
            An optional tuple of args to pass to the callback.

        kwargs : dict
            An optional dict of kwargs to pass to the callback.

        disabled : bool
            An optional boolean that disables the file uploader if set to
            ``True``. The default is ``False``.

        label_visibility : "visible", "hidden", or "collapsed"
            The visibility of the label. The default is ``"visible"``. If this
            is ``"hidden"``, Streamlit displays an empty spacer instead of the
            label, which can help keep the widget alligned with other widgets.
            If this is ``"collapsed"``, Streamlit displays no label or spacer.

        Returns
        -------
        None or UploadedFile or list of UploadedFile
            - If accept_multiple_files is False, returns either None or
              an UploadedFile object.
            - If accept_multiple_files is True, returns a list with the
              uploaded files as UploadedFile objects. If no files were
              uploaded, returns an empty list.

            The UploadedFile class is a subclass of BytesIO, and therefore is
            "file-like". This means you can pass an instance of it anywhere a
            file is expected.

        Examples
        --------
        Insert a file uploader that accepts a single file at a time:

        >>> import streamlit as st
        >>> import pandas as pd
        >>> from io import StringIO
        >>>
        >>> uploaded_file = st.file_uploader("Choose a file")
        >>> if uploaded_file is not None:
        ...     # To read file as bytes:
        ...     bytes_data = uploaded_file.getvalue()
        ...     st.write(bytes_data)
        >>>
        ...     # To convert to a string based IO:
        ...     stringio = StringIO(uploaded_file.getvalue().decode("utf-8"))
        ...     st.write(stringio)
        >>>
        ...     # To read file as string:
        ...     string_data = stringio.read()
        ...     st.write(string_data)
        >>>
        ...     # Can be used wherever a "file-like" object is accepted:
        ...     dataframe = pd.read_csv(uploaded_file)
        ...     st.write(dataframe)

        Insert a file uploader that accepts multiple files at a time:

        >>> import streamlit as st
        >>>
        >>> uploaded_files = st.file_uploader(
        ...     "Choose a CSV file", accept_multiple_files=True
        ... )
        >>> for uploaded_file in uploaded_files:
        ...     bytes_data = uploaded_file.read()
        ...     st.write("filename:", uploaded_file.name)
        ...     st.write(bytes_data)

        .. output::
           https://doc-file-uploader.streamlit.app/
           height: 375px

        )rc   rd   r=   re   rf   rg   rh   ri   r_   r`   r1   )r   _file_uploader)r?   rc   rd   r=   re   rf   rg   rh   ri   r_   r`   r1   s               r8   rj   zFileUploaderMixin.file_uploader   sF    ` !""""7- # 
 	
rE   )r`   r_   r1   c	          
        t        |      }t        | j                  ||d d       t        ||	       t	        d|t        | j                        ||||      }|rt        |      }t               }||_        ||_	        ||ng |j                  d d  t        j                  d      |_        ||_        t        | j                        |_        |
|_        t#        |	      |j$                  _        |t)        |      |_        t-        |      }t/        |j                  ||||j0                  |j2                  |d      }| j                  j5                  d|       t7        |j&                  t8              ry t7        |j&                  t:              r+|j&                  D cg c]  }t7        |t8              r| c}S |j&                  S c c}w )NF)default_valuewrites_allowedrj   )user_keyform_idrc   rd   r=   rf   zserver.maxUploadSizefile_uploader_state_value)on_change_handlerrh   ri   deserializer
serializerr1   
value_type)r   r   dgr   r   r   r   FileUploaderProtoidrc   rd   r   
get_optionmax_upload_size_mbmultiple_filesrw   r_   r   r`   valuer   rf   r;   r   rD   rS   _enqueuerI   r    rJ   )r?   rc   rd   r=   re   rf   rg   rh   ri   r`   r_   r1   
element_idfile_uploader_protoserdewidget_stater2   s                    r8   rr   z FileUploaderMixin._file_uploader}  s    SkGG 	
 	#5*:;4#DGG,"7

 -d3D/1!+$)!.2.>dB  #171B1B"2
. .C*&5dgg&>#'/$5U6
,,2 '-d|$!"78
 '""'**2	
 	*=>l((+6**D1+11T1!A{9SA1TT!!! Us   G.Gc                    t        d|       S )zGet our DeltaGenerator.r#   )r	   )r?   s    r8   r}   zFileUploaderMixin.dg  s     $d++rE   )NNNNN)rc   rU   rd   str | Sequence[str] | Noner=   Literal[True]re   
Key | Nonerf   
str | Nonerg   WidgetCallback | Nonerh   WidgetArgs | Noneri   WidgetKwargs | Noner_   r<   r`   r   rV   list[UploadedFile] | None)FNNNNN)rc   rU   rd   r   r=   Literal[False]re   r   rf   r   rg   r   rh   r   ri   r   r_   r<   r`   r   rV   UploadedFile | None)rc   rU   r=   r   rd   r   re   r   rf   r   rg   r   rh   r   ri   r   r_   r<   r`   r   rV   r   )rc   rU   r=   r   rd   r   re   r   rf   r   rg   r   rh   r   ri   r   r_   r<   r`   r   rV   r   )NFNNNNN)rc   rU   rd   r   r=   r<   re   r   rf   r   rg   r   rh   r   ri   r   r_   r<   r`   r   rV   (UploadedFile | list[UploadedFile] | None)rc   rU   rd   r   r=   r<   re   r   rf   r   rg   r   rh   r   ri   r   r`   r   r_   r<   r1   zScriptRunContext | NonerV   r   )rV   r#   )	rW   rX   rY   r
   rj   r   rr   propertyr}   r[   rE   r8   r]   r]      s     +/"&&*( ,5(( )(  -	(
 ( ( )(  ( $( ( *( 
#( (" 
 16+/"&&*" ,5"" )"  .	"
 " " )"  " $" " *" 
" ",  ,0+/"&&*,5((  -	(
 )( ( ( )(  ( $( ( *( 
#( (" 
 16+/+/"&&*,5""  .	"
 )" " " )"  " $" " *" 
" " O$ ,0&++/"&&*\
 ,5\
\
 )\
  $	\

 \
 \
 )\
  \
 $\
 \
 *\
 
2\
 %\
B ,0&++/"&&*O" -6'+O"O" )O"  $	O"
 O" O" )O"  O" $O" *O" O" %O" 
2O"b , ,rE   r]   )r0   rT   rV   z list[UploadedFile | DeletedFile])<
__future__r   dataclassesr   textwrapr   typingr   r   r   r	   r
   typing_extensionsr   	streamlitr   *streamlit.elements.lib.file_uploader_utilsr   !streamlit.elements.lib.form_utilsr   streamlit.elements.lib.policiesr   r   streamlit.elements.lib.utilsr   r   r   r   r   streamlit.proto.Common_pb2r   rH   r   UploadedFileInfoProto streamlit.proto.FileUploader_pb2r   r~   streamlit.runtime.metrics_utilr   streamlit.runtime.scriptrunnerr   r   streamlit.runtime.stater   r   r   r   'streamlit.runtime.uploaded_file_managerr    r!   collections.abcr"   streamlit.delta_generatorr#   rJ   r$   rZ   r9   r;   r]   r[   rE   r8   <module>r      s    # !  @ @ '  Q =  S P N 9 O  N(8$|[(	)*
  9 /%D ! ! !HK, K,rE   