o
    <g                     @   sp   d dl Z d dlmZmZmZ d dlmZ d dlmZ G dd deZ	G dd de	Z
d	d
 Zdd Zdd ZdS )    N)BytesIOStringIOUnsupportedOperation)FileProxyMixin)cached_propertyc                   @   s   e Zd ZdZdddZdd Zdd Zd	d
 Zdd Ze	dd Z
dddZdddZdd Zdd Zdd ZdddZdd ZdS )Filei   Nc                 C   s:   || _ |d u rt|dd }|| _t|dr|j| _d S d S )Nnamemode)filegetattrr   hasattrr	   )selfr
   r    r   I/var/www/html/venv/lib/python3.10/site-packages/django/core/files/base.py__init__   s   
zFile.__init__c                 C   s
   | j pdS )N r   r   r   r   r   __str__      
zFile.__str__c                 C   s   d| j j| pdf S )Nz<%s: %s>None)	__class____name__r   r   r   r   __repr__   s   zFile.__repr__c                 C   s
   t | jS N)boolr   r   r   r   r   __bool__   r   zFile.__bool__c                 C   s   | j S r   )sizer   r   r   r   __len__   s   zFile.__len__c              	   C   s   t | jdr
| jjS t | jdr%z	tj| jjW S  ttfy$   Y nw t | jdrKt | jdrK| j	 }| j
dtj | j	 }| j
| |S td)Nr   r   tellseekr   z$Unable to determine the file's size.)r   r
   r   ospathgetsizer   OSError	TypeErrorr   r    SEEK_ENDAttributeError)r   posr   r   r   r   r      s   

z	File.sizec              	   c   sN    |p| j }z| d W n ttfy   Y nw 	 | |}|s#dS |V  q)z{
        Read the file and yield chunks of ``chunk_size`` bytes (defaults to
        ``File.DEFAULT_CHUNK_SIZE``).
        r   TN)DEFAULT_CHUNK_SIZEr    r'   r   read)r   
chunk_sizedatar   r   r   chunks0   s   

zFile.chunksc                 C   s   | j |p| jkS )z
        Return ``True`` if you can expect multiple chunks.

        NB: If a particular file representation is in memory, subclasses should
        always return ``False`` -- there's no good reason to read from memory in
        chunks.
        )r   r)   )r   r+   r   r   r   multiple_chunksA   s   zFile.multiple_chunksc                 c   sv    d }|   D ](}|dD ] }|r$t|rt|s|V  n|| }d }t|r,|V  q|}qq|d ur9|V  d S d S NT)r-   
splitlinesendswith_cr	equals_lfendswith_lf)r   buffer_chunkliner   r   r   __iter__K   s    
zFile.__iter__c                 C   s   | S r   r   r   r   r   r   	__enter__f      zFile.__enter__c                 C   s   |    d S r   )close)r   exc_type	exc_valuetbr   r   r   __exit__i   s   zFile.__exit__c                 O   sV   | j s
| d | S | jr'tj| jr't| j|p| jg|R i || _| S t	d)Nr   zThe file cannot be reopened.)
closedr    r   r!   r"   existsopenr	   r
   
ValueError)r   r	   argskwargsr   r   r   rA   l   s   
"z	File.openc                 C   s   | j   d S r   )r
   r:   r   r   r   r   r:   u   s   z
File.closer   )r   
__module____qualname__r)   r   r   r   r   r   r   r   r-   r.   r7   r8   r>   rA   r:   r   r   r   r   r      s     





	r   c                       sL   e Zd ZdZd fdd	Zdd Zdd Zdd	d
Zdd Zdd Z	  Z
S )ContentFilezU
    A File-like object that takes just raw content, rather than an actual file.
    Nc                    s4   t |trtnt}t j|||d t|| _d S )Nr   )
isinstancestrr   r   superr   lenr   )r   contentr   stream_classr   r   r   r   ~   s   zContentFile.__init__c                 C      dS )NzRaw contentr   r   r   r   r   r      r9   zContentFile.__str__c                 C   rO   r/   r   r   r   r   r   r      r9   zContentFile.__bool__c                 C   s   |  d | S )Nr   )r    )r   r	   r   r   r   rA      s   
zContentFile.openc                 C   s   d S r   r   r   r   r   r   r:      r9   zContentFile.closec                 C   s   | j dd  | j|S )Nr   )__dict__popr
   write)r   r,   r   r   r   rR      s   zContentFile.writer   )r   rE   rF   __doc__r   r   r   rA   r:   rR   __classcell__r   r   rN   r   rG   y   s    
rG   c                 C      |  t| tr
dS dS )z9Return True if line (a text or bytestring) ends with ''.   endswithrH   rI   r6   r   r   r   r1         r1   c                 C   rU   )z9Return True if line (a text or bytestring) ends with '
'.
   
rX   rZ   r   r   r   r3      r[   r3   c                 C   s   | t | tr	dkS dkS )z6Return True if line (a text or bytestring) equals '
'.r\   r]   )rH   rI   rZ   r   r   r   r2      s   r2   )r!   ior   r   r   django.core.files.utilsr   django.utils.functionalr   r   rG   r1   r3   r2   r   r   r   r   <module>   s    q