o
    hJE                     @  sx  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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l0m1Z1m2Z2 erd dl3m4Z4 d dl5m6Z6 e	e2e1e7e	e2e1f  df Z8de9d< d!ddZ:eG dd dZ;G dd  d Z<dS )"    )annotations)	dataclass)dedent)TYPE_CHECKINGLiteralUnioncastoverload)	TypeAlias)config)enforce_filename_restriction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
   SomeUploadedFileswidget_valueFileUploaderStateProto | Nonereturn list[UploadedFile | DeletedFile]c           	      C  s   | d u rg S t  }|d u rg S | j}t|dkrg S |jj|jdd |D d}dd |D }g }|D ] }||j}|d urKt||j	}|
| q3|
t|j q3|S )Nr   c                 S  s   g | ]}|j qS  file_id.0fr)   r)   \/var/www/vscode/kcb/lib/python3.10/site-packages/streamlit/elements/widgets/file_uploader.py
<listcomp>R   s    z%_get_upload_files.<locals>.<listcomp>)
session_idfile_idsc                 S  s   i | ]}|j |qS r)   r*   r,   r)   r)   r/   
<dictcomp>U   s    z%_get_upload_files.<locals>.<dictcomp>)r   uploaded_file_infolenuploaded_file_mgr	get_filesr1   getr+   r!   	file_urlsappendr    )	r%   ctxr4   file_recs_list	file_recscollected_filesr.   maybe_file_recuploaded_filer)   r)   r/   _get_upload_filesB   s*   rA   c                   @  s6   e Zd ZU ded< dZded< dddZdddZdS )FileUploaderSerdeboolaccept_multiple_filesNzSequence[str] | Noneallowed_typesui_valuer&   	widget_idstrr'   r$   c                 C  sj   t |}|D ]}t|trq| jrt|j| j qt|dkr*| jr&g }|S d }|S | jr/|n|d }|S )Nr   )rA   
isinstancer    rE   r   namer5   rD   )selfrF   rG   upload_filesfilereturn_valuer)   r)   r/   deserializei   s   

zFileUploaderSerde.deserializefilesFileUploaderStateProtoc                 C  sh   t  }|s|S t|ts|g}|D ] }t|trq|j }|j|_|j|_|j|_|j	
|j q|S N)rQ   rI   listr    r4   addr+   rJ   sizer9   CopyFrom
_file_urls)rK   rP   state_protor.   	file_infor)   r)   r/   	serialize}   s   


zFileUploaderSerde.serialize)rF   r&   rG   rH   r'   r$   )rP   r$   r'   rQ   )__name__
__module____qualname____annotations__rE   rO   rZ   r)   r)   r)   r/   rB   d   s
   
 
rB   c                   @  s   e Zd Ze					d/dddd0ddZe						d1dddd2ddZeddddddddd d3d!dZedddddddddd"	d4d#dZed$							d5dddd6d&dZ							d5dddd'd7d*d+Zed8d-d.ZdS )9FileUploaderMixinNFvisible)disabledlabel_visibilitylabelrH   typestr | Sequence[str] | NonerD   Literal[True]key
Key | Nonehelp
str | None	on_changeWidgetCallback | NoneargsWidgetArgs | NonekwargsWidgetKwargs | Nonera   rC   rb   r   r'   list[UploadedFile] | Nonec	                C     d S rR   r)   rK   rc   rd   rD   rg   ri   rk   rm   ro   ra   rb   r)   r)   r/   file_uploader      zFileUploaderMixin.file_uploaderLiteral[False]UploadedFile | Nonec	                C  rr   rR   r)   rs   r)   r)   r/   rt      ru   )rd   rg   ri   rk   rm   ro   ra   rb   c       	         C  rr   rR   r)   rK   rc   rD   rd   rg   ri   rk   rm   ro   ra   rb   r)   r)   r/   rt      ru   )	rD   rd   rg   ri   rk   rm   ro   ra   rb   c       	         C  rr   rR   r)   rx   r)   r)   r/   rt      ru   rt   (UploadedFile | list[UploadedFile] | Nonec	                C  s&   t  }| j|||||||||	|
|dS )a  Display a file uploader widget.
        By default, uploaded files are limited to 200 MB each. You can
        configure this using the ``server.maxUploadSize`` config option. For
        more information on how to set config options, see |config.toml|_.

        .. |config.toml| replace:: ``config.toml``
        .. _config.toml: 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
            The allowed file extension(s) for uploaded files. This can be one
            of the following types:

            - ``None`` (default): All file extensions are allowed.
            - A string: A single file extension is allowed. For example, to
              only accept CSV files, use ``"csv"``.
            - A sequence of strings: Multiple file extensions are allowed. For
              example, to only accept JPG/JPEG and PNG files, use
              ``["jpg", "jpeg", "png"]``.

        accept_multiple_files : bool
            Whether to accept more than one file in a submission. If this is
            ``False`` (default), the user can only submit one file at a time.
            If this is ``True``, the user can upload multiple files at the same
            time, in which case the return value will be a list of files.

        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, 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   rD   rg   ri   rk   rm   ro   ra   rb   r;   )r   _file_uploader)rK   rc   rd   rD   rg   ri   rk   rm   ro   ra   rb   r;   r)   r)   r/   rt      s    )rb   ra   r;   r;   ScriptRunContext | Nonec	             
   C  s&  t |}t| j||d dd t||	 td|t| j||||d}|r't|}t }||_||_	|d ur6|ng |j
d d < td|_||_t| j|_|
|_t|	|j_|d ur^t||_t||d}t|j||||j|j|dd}| jd| t|jtrd S t|jtrd	d
 |jD S |jS )NF)default_valuewrites_allowedrt   )user_keyform_idrc   rd   rD   ri   zserver.maxUploadSize)rE   file_uploader_state_value)on_change_handlerrm   ro   deserializer
serializerr;   
value_typec                 S  s   g | ]	}t |ts|qS r)   )rI   r    r,   r)   r)   r/   r0     s    z4FileUploaderMixin._file_uploader.<locals>.<listcomp>)r   r   dgr   r   r   r   FileUploaderProtoidrc   rd   r   
get_optionmax_upload_size_mbmultiple_filesr   ra   r   rb   valuer   ri   rB   r   rO   rZ   _enqueuerI   r    rS   )rK   rc   rd   rD   rg   ri   rk   rm   ro   rb   ra   r;   
element_idfile_uploader_protoserdewidget_stater)   r)   r/   rz     sh   


z FileUploaderMixin._file_uploaderr#   c                 C  s
   t d| S )zGet our DeltaGenerator.r#   )r   )rK   r)   r)   r/   r     s   
zFileUploaderMixin.dg)NNNNN)rc   rH   rd   re   rD   rf   rg   rh   ri   rj   rk   rl   rm   rn   ro   rp   ra   rC   rb   r   r'   rq   )FNNNNN)rc   rH   rd   re   rD   rv   rg   rh   ri   rj   rk   rl   rm   rn   ro   rp   ra   rC   rb   r   r'   rw   )rc   rH   rD   rf   rd   re   rg   rh   ri   rj   rk   rl   rm   rn   ro   rp   ra   rC   rb   r   r'   rq   )rc   rH   rD   rv   rd   re   rg   rh   ri   rj   rk   rl   rm   rn   ro   rp   ra   rC   rb   r   r'   rw   )NFNNNNN)rc   rH   rd   re   rD   rC   rg   rh   ri   rj   rk   rl   rm   rn   ro   rp   ra   rC   rb   r   r'   ry   )rc   rH   rd   re   rD   rC   rg   rh   ri   rj   rk   rl   rm   rn   ro   rp   rb   r   ra   rC   r;   r{   r'   ry   )r'   r#   )	r[   r\   r]   r	   rt   r   rz   propertyr   r)   r)   r)   r/   r_      s     ,Qr_   )r%   r&   r'   r(   )=
__future__r   dataclassesr   textwrapr   typingr   r   r   r   r	   typing_extensionsr
   	streamlitr   *streamlit.elements.lib.file_uploader_utilsr   r   !streamlit.elements.lib.form_utilsr   streamlit.elements.lib.policiesr   r   streamlit.elements.lib.utilsr   r   r   r   r   streamlit.proto.Common_pb2r   rQ   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#   rS   r$   r^   rA   rB   r_   r)   r)   r)   r/   <module>   s>   
",