o
    YhQ                     @  s  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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/m0Z0m1Z1m2Z2m3Z3 d dl4m5Z5m6Z6 erd dl7m8Z8 d dl9m:Z: e	e6e5e;e	e6e5f  df Z<de=d< e	e>ed f Z?de=d< d$ddZ@eG d d! d!ZAG d"d# d#ZBdS )%    )annotations)	dataclass)dedent)TYPE_CHECKINGLiteralUnioncastoverload)	TypeAlias)config)enforce_filename_restrictionnormalize_upload_file_type)current_form_id)LayoutConfigWidthWithoutContentvalidate_width)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	directoryAcceptMultipleFiles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.   i/var/www/html/Persson_Maskin/env/lib/python3.10/site-packages/streamlit/elements/widgets/file_uploader.py
<listcomp>]   s    z%_get_upload_files.<locals>.<listcomp>)
session_idfile_idsc                 S  s   i | ]}|j |qS r.   r/   r1   r.   r.   r4   
<dictcomp>`   s    z%_get_upload_files.<locals>.<dictcomp>)r   uploaded_file_infolenuploaded_file_mgr	get_filesr6   getr0   r$   	file_urlsappendr#   )	r*   ctxr9   file_recs_list	file_recscollected_filesr3   maybe_file_recuploaded_filer.   r.   r4   _get_upload_filesM   s*   rF   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 )FileUploaderSerder)   accept_multiple_filesNzSequence[str] | Noneallowed_typesui_valuer+   r,   r'   c                 C  sz   t |}|D ]}t|trq| jrt|j| j q| jdu p"| jdk}t|dkr3|r/g }|S d }|S |r7|n|d }|S )NTr(   r   )rF   
isinstancer#   rI   r   namerH   r:   )selfrJ   upload_filesfileis_multiple_or_directoryreturn_valuer.   r.   r4   deserializet   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)rT   rK   listr#   r9   addr0   rL   sizer>   CopyFrom
_file_urls)rM   rS   state_protor3   	file_infor.   r.   r4   	serialize   s   


zFileUploaderSerde.serialize)rJ   r+   r,   r'   )rS   r'   r,   rT   )__name__
__module____qualname____annotations__rI   rR   r]   r.   r.   r.   r4   rG   o   s
   
 
rG   c                   @  s   e Zd Ze					d3ddddd4ddZe						d5ddddd6d"dZedddddddddd#	d7d$dZeddddddddddd%
d8d&dZed'							d9ddddd:d*dZ							d9ddddd+d;d.d/Zed<d1d2ZdS )=FileUploaderMixinNFvisiblestretch)disabledlabel_visibilitywidthlabelstrtypestr | Sequence[str] | NonerH   Literal[True, 'directory']key
Key | Nonehelp
str | None	on_changeWidgetCallback | NoneargsWidgetArgs | NonekwargsWidgetKwargs | Nonere   boolrf   r   rg   r   r,   list[UploadedFile]c	                C     d S rU   r.   rM   rh   rj   rH   rm   ro   rq   rs   ru   re   rf   rg   r.   r.   r4   file_uploader      zFileUploaderMixin.file_uploaderLiteral[False]UploadedFile | Nonec	                C  ry   rU   r.   rz   r.   r.   r4   r{      r|   )	rj   rm   ro   rq   rs   ru   re   rf   rg   c       
         C  ry   rU   r.   rM   rh   rH   rj   rm   ro   rq   rs   ru   re   rf   rg   r.   r.   r4   r{      r|   )
rH   rj   rm   ro   rq   rs   ru   re   rf   rg   c       
         C  ry   rU   r.   r   r.   r.   r4   r{      r|   r{   r)   (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, 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"]``.

            .. note::
                This is a best-effort check, but doesn't provide a
                security guarantee against users uploading files of other types
                or type extensions. The correct handling of uploaded files is
                part of the app developer's responsibility.

        accept_multiple_files : bool or "directory"
            Whether to accept more than one file in a submission. This can be one
            of the following values:

            - ``False`` (default): The user can only submit one file at a time.
            - ``True``: The user can upload multiple files at the same time.
            - ``"directory"``: The user can select a directory to upload all
              files in the directory and its subdirectories. If ``type`` is
              set, only files matching those type(s) will be uploaded.

            When this is ``True`` or ``"directory"``, the return value will be
            a list and a user can additively select files if they click the
            browse button on the widget multiple times.

        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 : list or tuple
            An optional list or 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 aligned with other widgets.
            If this is ``"collapsed"``, Streamlit displays no label or spacer.

        width : "stretch" or int
            The width of the file uploader widget. This can be one of the
            following:

            - ``"stretch"`` (default): The width of the widget matches the
              width of the parent container.
            - An integer specifying the width in pixels: The widget has a
              fixed width. If the specified width is greater than the width of
              the parent container, the width of the widget matches the width
              of the parent container.

        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`` or ``"directory"``, 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
        --------
        **Example 1: Accept 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)

        **Example 2: Accept multiple files at a time**

        >>> import pandas as pd
        >>> import streamlit as st
        >>>
        >>> uploaded_files = st.file_uploader(
        ...     "Upload data", accept_multiple_files=True, type="csv"
        ... )
        >>> for uploaded_file in uploaded_files:
        ...     df = pd.read_csv(uploaded_file)
        ...     st.write(df)

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

        **Example 3: Accept an entire directory**

        >>> import streamlit as st
        >>>
        >>> uploaded_files = st.file_uploader(
        ...     "Upload images", accept_multiple_files="directory", type=["jpg", "png"]
        ... )
        >>> for uploaded_file in uploaded_files:
        ...     st.image(uploaded_file)

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

        )rh   rj   rH   rm   ro   rq   rs   ru   re   rf   rg   r@   )r   _file_uploader)rM   rh   rj   rH   rm   ro   rq   rs   ru   re   rf   rg   r@   r.   r.   r4   r{      s     C)rf   re   r@   rg   r@   ScriptRunContext | Nonec	             
   C  sT  t |}t| j||d dd t||	 td|| j|||||d}|r&t|nd }t }||_||_|d ur7|ng |j	d d < t
d|_|dk}|du pM||_||_t| j|_|
|_t|	|j_|d urjt||_t||d}t|j||||j|j|d	d
}t| t|d}| jjd||d t|jtrd S t|jt rdd |jD S |jS )NF)default_valuewrites_allowedr{   )user_keydgrh   rj   rH   ro   rg   zserver.maxUploadSizer(   T)rI   file_uploader_state_value)on_change_handlerrs   ru   deserializer
serializerr@   
value_type)rg   )layout_configc                 S  s   g | ]	}t |ts|qS r.   )rK   r#   r1   r.   r.   r4   r5   '  s    z4FileUploaderMixin._file_uploader.<locals>.<listcomp>)!r   r   r   r   r   r   FileUploaderProtoidrh   rj   r   
get_optionmax_upload_size_mbmultiple_filesaccept_directoryr   form_idre   r   rf   valuer   ro   rG   r"   rR   r]   r   r   _enqueuerK   r#   rV   )rM   rh   rj   rH   rm   ro   rq   rs   ru   rf   re   r@   rg   
element_idnormalized_typefile_uploader_protois_directory_uploadserdewidget_stater   r.   r.   r4   r     sx   



z FileUploaderMixin._file_uploaderr&   c                 C  s
   t d| S )zGet our DeltaGenerator.r&   )r   )rM   r.   r.   r4   r   +  s   
zFileUploaderMixin.dg)NNNNN)rh   ri   rj   rk   rH   rl   rm   rn   ro   rp   rq   rr   rs   rt   ru   rv   re   rw   rf   r   rg   r   r,   rx   )FNNNNN)rh   ri   rj   rk   rH   r}   rm   rn   ro   rp   rq   rr   rs   rt   ru   rv   re   rw   rf   r   rg   r   r,   r~   )rh   ri   rH   rl   rj   rk   rm   rn   ro   rp   rq   rr   rs   rt   ru   rv   re   rw   rf   r   rg   r   r,   rx   )rh   ri   rH   r}   rj   rk   rm   rn   ro   rp   rq   rr   rs   rt   ru   rv   re   rw   rf   r   rg   r   r,   r~   )NFNNNNN)rh   ri   rj   rk   rH   r)   rm   rn   ro   rp   rq   rr   rs   rt   ru   rv   re   rw   rf   r   rg   r   r,   r   )rh   ri   rj   rk   rH   r)   rm   rn   ro   rp   rq   rr   rs   rt   ru   rv   rf   r   re   rw   r@   r   rg   r   r,   r   )r,   r&   )	r^   r_   r`   r	   r{   r   r   propertyr   r.   r.   r.   r4   rb      s     U^rb   )r*   r+   r,   r-   )C
__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.layout_utilsr   r   r   streamlit.elements.lib.policiesr   r   streamlit.elements.lib.utilsr   r   r   r   r   streamlit.proto.Common_pb2r   rT   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&   rV   r'   ra   rw   r)   rF   rG   rb   r.   r.   r.   r4   <module>   sB   
".