Ë
    ¹2Úiç!  ã                   óú   — d Z ddlZddl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  e«       Zd„ Z G d„ d	«      Z G d
„ de«      Z G d„ d«      Z G d„ de«      Z G d„ de«      Z G d„ de«      Z G d„ de«      Zy)zºBase material for download middlewares.

Download middlewares capture :py:class:`django_downloadview.DownloadResponse`
responses and may replace them with optimized download responses.

é    N)Úsettings)ÚImproperlyConfigured)ÚDownloadResponse)Úimport_memberc                 ó"   — t        | t        «      S )zÇReturn ``True`` if ``response`` is a download response.

    Current implementation returns True if ``response`` is an instance of
    :py:class:`django_downloadview.response.DownloadResponse`.

    )Ú
isinstancer   )Úresponses    úV/var/www/html/acx/venv/lib/python3.12/site-packages/django_downloadview/middlewares.pyÚis_download_responser      s   € ô �hÔ 0Ó1Ð1ó    c                   ó.   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ Zy)ÚBaseDownloadMiddlewarez˜Base (abstract) Django middleware that handles download responses.

    Subclasses **must** implement :py:meth:`process_download_response` method.

    c                 ó   — || _         y ©N)Úget_response)Úselfr   s     r
   Ú__init__zBaseDownloadMiddleware.__init__'   s
   € Ø(ˆÕr   c                 óH   — | j                  |«      }| j                  ||«      S r   )r   Úprocess_response©r   Úrequestr	   s      r
   Ú__call__zBaseDownloadMiddleware.__call__*   s%   € Ø×$Ñ$ WÓ-ˆØ×$Ñ$ W¨hÓ7Ð7r   c                 ó   — t        |«      S )zúReturn True if ``response`` can be considered as a file download.

        By default, this method uses
        :py:func:`django_downloadview.middlewares.is_download_response`.
        Override this method if you want a different behaviour.

        )r   )r   r	   s     r
   r   z+BaseDownloadMiddleware.is_download_response.   s   € ô $ HÓ-Ð-r   c                 óL   — | j                  |«      r| j                  ||«      S |S )z?Call `process_download_response()` if ``response`` is download.)r   Úprocess_download_responser   s      r
   r   z'BaseDownloadMiddleware.process_response8   s(   € à×$Ñ$ XÔ.Ø×1Ñ1°'¸8ÓDÐDØˆr   c                 ó   — t        «       ‚)zHandle file download response.)ÚNotImplementedErrorr   s      r
   r   z0BaseDownloadMiddleware.process_download_response>   s   € ä!Ó#Ð#r   N)	Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r   © r   r
   r   r   !   s    „ ñò
)ò8ò.òó$r   r   c                   ó"   ‡ — e Zd ZdZˆ fd„Zˆ xZS )ÚRealDownloadMiddlewarez5Download middleware that cannot handle virtual files.c                 ó¨   •— t         t        | �  |«      r/	 |j                  j                  xs |j                  j
                  S y# t        $ r Y yw xY w)a   Return True for DownloadResponse, except for "virtual" files.

        This implementation cannot handle files that live in memory or which
        are to be dynamically iterated over. So, we capture only responses
        whose file attribute have either an URL or a file name.

        F)Úsuperr$   r   ÚfileÚurlÚnameÚAttributeError)r   r	   Ú	__class__s     €r
   r   z+RealDownloadMiddleware.is_download_responseF   sR   ø€ ô Ô'¨ÑCÀHÔMðØ—}‘}×(Ñ(Ò>¨H¯M©M×,>Ñ,>Ð>ð
 øô	 "ò Ùðús   –-A Á	AÁA)r   r   r    r!   r   Ú__classcell__©r+   s   @r
   r$   r$   C   s   ø„ Ù?÷ð r   r$   c                   ó"   — e Zd Zefd„Zd„ Zd„ Zy)ÚDownloadDispatcherc                 óX   — || _         | j                   t        u r| j                  «        y y r   )ÚmiddlewaresÚAUTO_CONFIGUREÚauto_configure_middlewares)r   r1   s     r
   r   zDownloadDispatcher.__init__Y   s)   € à&ˆÔØ×Ñœ~Ñ-Ø×+Ñ+Õ-ð .r   c                 ó˜   — t        t        dg «      D ]6  \  }}}t        |«      } |di |¤Ž}| j                  j	                  ||f«       Œ8 y)zPPopulate :attr:`middlewares` from
        ``settings.DOWNLOADVIEW_MIDDLEWARES``.ÚDOWNLOADVIEW_MIDDLEWARESNr"   )Úgetattrr   r   r1   Úappend)r   ÚkeyÚimport_stringÚkwargsÚfactoryÚ
middlewares         r
   r3   z-DownloadDispatcher.auto_configure_middlewares_   sY   € ô -4ÜÐ0°"ó-
ò 	7Ñ(ˆS�- ô $ MÓ2ˆGÙ Ñ* 6Ñ*ˆJØ×Ñ×#Ñ# S¨*Ð$5Õ6ñ	7r   c                 óR   — | j                   D ]  \  }}|j                  ||«      }Œ |S )z'Dispatches job to children middlewares.)r1   r   )r   r   r	   r8   r<   s        r
   ÚdispatchzDownloadDispatcher.dispatchi   s5   € à!%×!1Ñ!1ò 	FÑˆS�*Ø!×2Ñ2°7¸HÓE‰Hð	Fàˆr   N)r   r   r    r2   r   r3   r>   r"   r   r
   r/   r/   X   s   „ Ø#1ó .ò7ór   r/   c                   ó,   ‡ — e Zd ZdZefˆ fd„	Zd„ Zˆ xZS )ÚDownloadDispatcherMiddlewarezHDownload middleware that dispatches job to several middleware instances.c                 óL   •— t         t        | �  |«       t        |«      | _        y r   )r&   r@   r   r/   Ú
dispatcher)r   r   r1   r+   s      €r
   r   z%DownloadDispatcherMiddleware.__init__s   s   ø€ ÜÔ*¨DÑ:¸<ÔHÜ,¨[Ó9ˆ�r   c                 ó:   — | j                   j                  ||«      S r   )rB   r>   r   s      r
   r   z6DownloadDispatcherMiddleware.process_download_responsew   s   € Ø�‰×'Ñ'¨°Ó:Ð:r   )r   r   r    r!   r2   r   r   r,   r-   s   @r
   r@   r@   p   s   ø„ ÙNà1?õ :ö;r   r@   c                   ó4   ‡ — e Zd ZdZeefˆ fd„	Zd„ Zd„ Zˆ xZS )ÚSmartDownloadMiddlewarez&Easy to configure download middleware.c                 óÖ   •— t         t        | �  |g ¬«       || _        | j                  t        u r| j                  «        || _        | j                  t        u r| j                  «        yy)úConstructor.)r1   N)r&   rE   r   Úbackend_factoryr2   Úauto_configure_backend_factoryÚbackend_optionsÚauto_configure_backend_options)r   r   rH   rJ   r+   s       €r
   r   z SmartDownloadMiddleware.__init__~   sh   ø€ ô 	Ô% tÑ5°lÐPRÐ5ÔSð  /ˆÔØ×Ñ¤>Ñ1Ø×/Ñ/Ô1ð  /ˆÔØ×Ñ¤>Ñ1Ø×/Ñ/Õ1ð 2r   c                 ór   — 	 t        t        j                  «      | _        y# t        $ r t        d«      ‚w xY w)zEAssign :attr:`backend_factory` from ``settings.DOWNLOADVIEW_BACKEND``z>SmartDownloadMiddleware requires settings.DOWNLOADVIEW_BACKENDN)r   r   ÚDOWNLOADVIEW_BACKENDrH   r*   r   )r   s    r
   rI   z6SmartDownloadMiddleware.auto_configure_backend_factory‘   s9   € ð	Ü#0´×1NÑ1NÓ#OˆDÕ øÜò 	Ü&ØSóð ð	ús   ‚! ¡6c                 óž  — 	 t        j                  t        j                  «      }t        |«      D ]ƒ  \  }}g }i }t        |t        j                  j                  «      r|}n|}d|v rt        |d   «      }|d= n| j                  } ||i |¤Ž}| j                  j                  j                  ||f«       Œ… y# t        $ r t        d«      ‚w xY w)z^Populate :attr:`dispatcher` using :attr:`factory` and
        ``settings.DOWNLOADVIEW_RULES``.z<SmartDownloadMiddleware requires settings.DOWNLOADVIEW_RULESÚbackendN)ÚcopyÚdeepcopyr   ÚDOWNLOADVIEW_RULESr*   r   Ú	enumerater   ÚcollectionsÚabcÚMappingr   rH   rB   r1   r7   )r   Úoptions_listr8   ÚoptionsÚargsr:   r;   Úmiddleware_instances           r
   rK   z6SmartDownloadMiddleware.auto_configure_backend_optionsš   sØ   € ð	ÜŸ=™=¬×)DÑ)DÓEˆLô
 & lÓ3ò 	K‰LˆC�ØˆDØˆFÜ˜'¤;§?¡?×#:Ñ#:Ô;Ø ‘à�Ø˜FÑ"Ü'¨¨yÑ(9Ó:�Ø˜9Ñ%à×.Ñ.�Ù")¨4Ð":°6Ñ":ÐØ�O‰O×'Ñ'×.Ñ.°Ð5HÐ/IÕJñ	Køô	 ò 	Ü&ØQóð ð	ús   ‚#B7 Â7C)	r   r   r    r!   r2   r   rI   rK   r,   r-   s   @r
   rE   rE   {   s   ø„ Ù0ð
 'Ø&õ	2ò&öKr   rE   c                   ó   — e Zd ZdZy)ÚNoRedirectionMatchz1Response object does not match redirection rules.N)r   r   r    r!   r"   r   r
   r\   r\   ³   s   „ Ú;r   r\   c                   ó,   ‡ — e Zd ZdZ	 dˆ fd„	Zd„ Zˆ xZS )ÚProxiedDownloadMiddlewarezEBase class for middlewares that use optimizations of reverse proxies.c                 óV   •— t         t        | �  |«       || _        || _        || _        y)rG   N)r&   r^   r   Ú
source_dirÚ
source_urlÚdestination_url)r   r   r`   ra   rb   r+   s        €r
   r   z"ProxiedDownloadMiddleware.__init__º   s+   ø€ ô 	Ô'¨Ñ7¸ÔEà$ˆŒØ$ˆŒØ.ˆÕr   c                 óô  — d}d}| j                   rM	 |j                  j                  }|j                  | j                   «      r|t	        | j                   «      d }|}	 d}|€“| j                  r‡	 |j                  j                  }|j                  | j                  «      rUt        j                  j                  || j                  «      }|j                  t        j                  j                  d«      }	 |€)d| j                   || j                  |dœz  }t        |«      ‚dj                  | j                  j!                  d«      |j#                  d«      f«      S # t
        $ r Y �Œ	w xY w# t
        $ r Y Œ�w xY w)z3Return redirect URL for file wrapped into response.NÚ ú/zÃCouldn't capture/convert file attributes into a redirection. ``source_url`` is "%(source_url)s", file's URL is "%(file_url)s". ``source_dir`` is "%(source_dir)s", file's name is "%(file_name)s". )ra   Úfile_urlr`   Ú	file_name)ra   r'   r(   Ú
startswithÚlenr*   r`   r)   ÚosÚpathÚrelpathÚreplaceÚsepr\   Újoinrb   ÚrstripÚlstrip)r   r	   r(   rf   rg   Úmessages         r
   Úget_redirect_urlz*ProxiedDownloadMiddleware.get_redirect_urlÄ   sQ  € àˆØˆØ�?Š?ð#Ø#Ÿ=™=×,Ñ,�ð ×&Ñ& t§¡Ô7Ø'¬¨D¯O©OÓ(<Ð(>Ð?�HØ"‘CØˆ	Øˆ;˜4Ÿ?š?ð>Ø$ŸM™M×.Ñ.�	ð ×'Ñ'¨¯©Ô8Ü "§¡§¡°	¸4¿?¹?Ó K�IØ#×+Ñ+¬B¯G©G¯K©K¸Ó=‘CØˆ;ð7ð #'§/¡/Ø (Ø"&§/¡/Ø!*ñ	ñð ô % WÓ-Ð-Ø�x‰x˜×-Ñ-×4Ñ4°SÓ9¸3¿:¹:Àc»?ÐKÓLÐLøôA "ò Úðûô "ò Ùðús#   ’E Á/E+ Å	E(Å'E(Å+	E7Å6E7)NNN)r   r   r    r!   r   rs   r,   r-   s   @r
   r^   r^   ·   s   ø„ ÙOð OSõ/ö'Mr   r^   )r!   Úcollections.abcrT   rP   rj   Údjango.confr   Údjango.core.exceptionsr   Údjango_downloadview.responser   Údjango_downloadview.utilsr   Úobjectr2   r   r   r$   r/   r@   rE   Ú	Exceptionr\   r^   r"   r   r
   ú<module>r{      s‰   ðñó Û Û 	å  Ý 7å 9Ý 3ñ
 “€ò2÷$ñ $ôDÐ3ô ÷*ñ ô0;Ð#9ô ;ô5KÐ:ô 5Kôp<˜ô <ô4MÐ 6õ 4Mr   