

_VL                 @   su  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
 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 d  d l m Z m Z d  d l m Z d  d l m Z Gd d   d e  Z Gd d   d e  Z Gd d   d e  Z  Gd d   d e  Z! Gd d   d e
 e  Z" Gd d   d e   Z# d S)    N)forms)checks)File)	ImageFile)default_storage)signals)Field)six)RemovedInDjango110Warning)	force_str
force_text)func_supports_parameter)ugettext_lazyc                   sH  e  Z d  Z   f d d   Z d d   Z d d   Z d d   Z d	 d
   Z d d   Z d d   Z	 d d   Z
 e e e	 e
  Z d d   Z e e  Z d d   Z e e  Z d d   Z e e  Z d d d  Z d e _ d d d  Z d e _ d d d  Z d e _ d d    Z e e  Z d! d"   Z d# d$   Z   S)%	FieldFilec                sD   t  t |   j d  |  | |  _ | |  _ | j |  _ d |  _ d  S)NT)superr   __init__instancefieldstorage
_committed)selfr   r   name)	__class__ ?/tmp/pip-build-ghmbqnp_/Django/django/db/models/fields/files.pyr      s
    		zFieldFile.__init__c             C   s,   t  | d  r |  j | j k S|  j | k S)Nr   )hasattrr   )r   otherr   r   r   __eq__   s    zFieldFile.__eq__c             C   s   |  j  |  S)N)r   )r   r   r   r   r   __ne__"   s    zFieldFile.__ne__c             C   s   t  |  j  S)N)hashr   )r   r   r   r   __hash__%   s    zFieldFile.__hash__c             C   s#   |  s t  d |  j j   n  d  S)Nz2The '%s' attribute has no file associated with it.)
ValueErrorr   r   )r   r   r   r   _require_file,   s    zFieldFile._require_filec             C   sN   |  j    t |  d  s) |  j d  k rG |  j j |  j d  |  _ n  |  j S)N_filerb)r"   r   r#   r   openr   )r   r   r   r   	_get_file0   s    
zFieldFile._get_filec             C   s   | |  _  d  S)N)r#   )r   filer   r   r   	_set_file6   s    zFieldFile._set_filec             C   s
   |  `  d  S)N)r#   )r   r   r   r   	_del_file9   s    zFieldFile._del_filec             C   s   |  j    |  j j |  j  S)N)r"   r   pathr   )r   r   r   r   	_get_path>   s    
zFieldFile._get_pathc             C   s   |  j    |  j j |  j  S)N)r"   r   urlr   )r   r   r   r   _get_urlC   s    
zFieldFile._get_urlc             C   s0   |  j    |  j s |  j j S|  j j |  j  S)N)r"   r   r'   sizer   r   )r   r   r   r   	_get_sizeH   s    
	
zFieldFile._get_sizer$   c             C   s   |  j    |  j j |  d  S)N)r"   r'   r%   )r   moder   r   r   r%   O   s    
zFieldFile.openTc             C   s   |  j  j |  j |  } t |  j j d  rT |  j j | | d |  j  j |  _ n. t j	 d t
 d d |  j j | |  |  _ t |  j |  j  j |  j  | j |  _ d |  _ | r |  j j   n  d  S)N
max_lengthzBackwards compatibility for storage backends without support for the `max_length` argument in Storage.save() will be removed in Django 1.10.
stacklevel   T)r   generate_filenamer   r   r   saver1   r   warningswarnr
   setattrr.   _sizer   )r   r   contentr5   r   r   r   r5   Y   s    '	zFieldFile.savec             C   s   |  s
 d  St  |  d  r, |  j   |  ` n  |  j j |  j  d  |  _ t |  j |  j j |  j  t  |  d  r| |  `	 n  d |  _
 | r |  j j   n  d  S)Nr#   r9   F)r   closer'   r   deleter   r8   r   r   r9   r   r5   )r   r5   r   r   r   r<   r   s    
				zFieldFile.deletec             C   s%   t  |  d d   } | d  k p$ | j S)Nr#   )getattrclosed)r   r'   r   r   r   _get_closed   s    zFieldFile._get_closedc             C   s/   t  |  d d   } | d  k	 r+ | j   n  d  S)Nr#   )r=   r;   )r   r'   r   r   r   r;      s    zFieldFile.closec             C   s#   i |  j  d 6d d 6d d 6d  d 6S)Nr   Fr>   Tr   r#   )r   )r   r   r   r   __getstate__   s    zFieldFile.__getstate__)__name__
__module____qualname__r   r   r   r    r"   r&   r(   r)   propertyr'   r+   r*   r-   r,   r/   r.   r%   Zalters_datar5   r<   r?   r>   r;   r@   r   r   )r   r   r      s2   			r   c               @   s@   e  Z d  Z d Z d d   Z d d d d  Z d d   Z d S)	FileDescriptora  
    The descriptor for the file attribute on the model instance. Returns a
    FieldFile when accessed so you can do stuff like::

        >>> from myapp.models import MyModel
        >>> instance = MyModel.objects.get(pk=1)
        >>> instance.file.size

    Assigns a file object on assignment so you can do::

        >>> with open('/path/to/hello.world', 'r') as f:
        ...     instance.file = File(f)
    c             C   s   | |  _  d  S)N)r   )r   r   r   r   r   r      s    zFileDescriptor.__init__Nc             C   sL  | d  k r. t  d |  j j | j f   n  | j |  j j } t | t j  s_ | d  k r |  j j | |  j |  } | | j |  j j <n t | t	  r t | t
  r |  j j | |  j | j  } | | _ d | _ | | j |  j j <nF t | t
  r;t | d  r;| | _ |  j | _ |  j j | _ n  | j |  j j S)Nz:The '%s' attribute can only be accessed from %s instances.Fr   )AttributeErrorr   r   rA   __dict__
isinstancer	   string_types
attr_classr   r   r'   r   r   r   r   )r   r   ownerr'   attrZ	file_copyr   r   r   __get__   s$    				zFileDescriptor.__get__c             C   s   | | j  |  j j <d  S)N)rG   r   r   )r   r   valuer   r   r   __set__   s    zFileDescriptor.__set__)rA   rB   rC   __doc__r   rM   rO   r   r   r   r   rE      s   4rE   c                   s  e  Z d  Z e Z e Z e d  Z d d d d   f d d  Z	   f d d   Z
 d d	   Z d
 d   Z   f d d   Z d d   Z   f d d   Z   f d d   Z   f d d   Z   f d d   Z d d   Z d d   Z d d   Z d d   Z   f d  d!   Z   S)"	FileFieldr   N c                sl   d | k |  _  d | k |  _ | p' t |  _ | |  _ | j d d  | d <t t |   j | | |  d  S)NZprimary_keyuniquer1   d   )	_primary_key_set_explicitly_unique_set_explicitlyr   r   	upload_togetr   rQ   r   )r   verbose_namer   rW   r   kwargs)r   r   r   r      s    	zFileField.__init__c                sB   t  t |   j |   } | j |  j    | j |  j    | S)N)r   rQ   checkextend_check_unique_check_primary_key)r   rZ   errors)r   r   r   r[      s    zFileField.checkc             C   s=   |  j  r5 t j d |  j j d d  d |  d d g Sg  Sd  S)Nz*'unique' is not a valid argument for a %s.hintobjidzfields.E200)rV   r   Errorr   rA   )r   r   r   r   r]      s    	
zFileField._check_uniquec             C   s=   |  j  r5 t j d |  j j d d  d |  d d g Sg  Sd  S)Nz/'primary_key' is not a valid argument for a %s.r`   ra   rb   zfields.E201)rU   r   rc   r   rA   )r   r   r   r   r^     s    	
zFileField._check_primary_keyc                s|   t  t |   j   \ } } } } | j d  d k r@ | d =n  |  j | d <|  j t k	 rl |  j | d <n  | | | | f S)Nr1   rT   rW   r   )r   rQ   deconstructrX   rW   r   r   )r   r   r*   argsrZ   )r   r   r   rd     s    !
zFileField.deconstructc             C   s   d S)NrQ   r   )r   r   r   r   get_internal_type"  s    zFileField.get_internal_typec                s4   t  | d  r | j } n  t t |   j | |  S)Nr   )r   r   r   rQ   get_prep_lookup)r   Zlookup_typerN   )r   r   r   rg   %  s    zFileField.get_prep_lookupc                s5   t  t |   j |  } | d k r( d St j |  S)z:Returns field's value prepared for saving into a database.N)r   rQ   get_prep_valuer	   	text_type)r   rN   )r   r   r   rh   *  s    zFileField.get_prep_valuec                sK   t  t |   j | |  } | rG | j rG | j | j | d d n  | S)z)Returns field's value just before saving.r5   F)r   rQ   pre_saver   r5   r   )r   Zmodel_instanceaddr'   )r   r   r   rj   2  s    zFileField.pre_savec                s<   t  t |   j | | |  t | |  j |  j |    d  S)N)r   rQ   contribute_to_classr8   r   descriptor_class)r   clsr   rZ   )r   r   r   rl   :  s    zFileField.contribute_to_classc             C   s1   t  j j t t j j   j t |  j     S)N)	osr*   normpathr   datetimenowstrftimer   rW   )r   r   r   r   get_directory_name>  s    zFileField.get_directory_namec             C   s(   t  j j |  j j t  j j |    S)N)ro   r*   rp   r   get_valid_namebasename)r   filenamer   r   r   get_filenameA  s    zFileField.get_filenamec             C   s   t  |  j  rd t j j |  j | |   \ } } |  j j |  } t j j t j j | |   St j j |  j	   |  j
 |   S)N)callablerW   ro   r*   splitr   ru   rp   joinrt   rx   )r   r   rw   Zdirectory_namer   r   r   r4   D  s
    $zFileField.generate_filenamec             C   s5   | d  k	 r1 | s d } n  t  | |  j |  n  d  S)NrR   )r8   r   )r   r   datar   r   r   save_form_dataN  s    	zFileField.save_form_datac                sV   i t  j d 6|  j d 6} d | k r3 d | d <n  | j |  t t |   j |   S)N
form_classr1   initialFrequired)r   rQ   r1   updater   	formfield)r   rZ   defaults)r   r   r   r   Z  s
    zFileField.formfield)rA   rB   rC   r   rJ   rE   rm   _descriptionr   r[   r]   r^   rd   rf   rg   rh   rj   rl   rt   rx   r4   r}   r   r   r   )r   r   rQ      s$   
	
rQ   c                   s(   e  Z d  Z d Z   f d d   Z   S)ImageFileDescriptorz
    Just like the FileDescriptor, but for ImageFields. The only difference is
    assigning the width/height to the width_field/height_field, if appropriate.
    c                sZ   | j  j |  j j  } t t |   j | |  | d  k	 rV |  j j | d d n  d  S)NforceT)rG   rX   r   r   r   r   rO   update_dimension_fields)r   r   rN   Zprevious_file)r   r   r   rO   l  s    zImageFileDescriptor.__set__)rA   rB   rC   rP   rO   r   r   )r   r   r   g  s   r   c                   s%   e  Z d  Z d   f d d  Z   S)ImageFieldFileTc                s2   t  |  d  r |  ` n  t t |   j |  d  S)N_dimensions_cache)r   r   r   r   r<   )r   r5   )r   r   r   r<   ~  s    	zImageFieldFile.delete)rA   rB   rC   r<   r   r   )r   r   r   }  s   r   c                   s   e  Z d  Z e Z e Z e d  Z d d d d   f d d  Z	   f d d   Z
 d d   Z   f d	 d
   Z   f d d   Z d d d  Z   f d d   Z   S)
ImageFieldImageNc                s3   | | |  _  |  _ t t |   j | | |  d  S)N)width_fieldheight_fieldr   r   r   )r   rY   r   r   r   rZ   )r   r   r   r     s    zImageField.__init__c                s/   t  t |   j |   } | j |  j    | S)N)r   r   r[   r\   _check_image_library_installed)r   rZ   r_   )r   r   r   r[     s    zImageField.checkc             C   sS   y d d l  m } Wn4 t k
 rJ t j d d d d |  d d g SYn Xg  Sd  S)	Nr   )r   z6Cannot use ImageField because Pillow is not installed.r`   zVGet Pillow at https://pypi.python.org/pypi/Pillow or run command "pip install Pillow".ra   rb   zfields.E210)ZPILr   ImportErrorr   rc   )r   r   r   r   r   r     s    z)ImageField._check_image_library_installedc                sc   t  t |   j   \ } } } } |  j r: |  j | d <n  |  j rS |  j | d <n  | | | | f S)Nr   r   )r   r   rd   r   r   )r   r   r*   re   rZ   )r   r   r   rd     s    !		zImageField.deconstructc                sH   t  t |   j | | |  | j j sD t j j |  j d | n  d  S)NZsender)	r   r   rl   Z_metaZabstractr   Z	post_initconnectr   )r   rn   r   rZ   )r   r   r   rl     s    zImageField.contribute_to_classFc       
      O   s   |  j  p |  j } | s d St | |  j  } | r@ | r@ d S|  j  r\ t | |  j   pu |  j ou t | |  j  } | r | r d S| r | j } | j }	 n d } d }	 |  j  r t | |  j  |  n  |  j r t | |  j |	  n  d S)a  
        Updates field's width and height fields, if defined.

        This method is hooked up to model's post_init signal to update
        dimensions after instantiating a model instance.  However, dimensions
        won't be updated if the dimensions fields are already populated.  This
        avoids unnecessary recalculation when loading an object from the
        database.

        Dimensions can be forced to update with force=True, which is how
        ImageFileDescriptor.__set__ calls this method.
        N)r   r   r=   Zattnamewidthheightr8   )
r   r   r   re   rZ   Zhas_dimension_fieldsr'   Zdimension_fields_filledr   r   r   r   r   r     s&    				z"ImageField.update_dimension_fieldsc                s3   i t  j d 6} | j |  t t |   j |   S)Nr~   )r   r   r   r   r   )r   rZ   r   )r   r   r   r     s    zImageField.formfield)rA   rB   rC   r   rJ   r   rm   r   r   r   r[   r   rd   rl   r   r   r   r   )r   r   r     s   		8r   )$rq   ro   r6   Zdjangor   Zdjango.corer   Zdjango.core.files.baser   Zdjango.core.files.imagesr   Zdjango.core.files.storager   Zdjango.db.modelsr   Zdjango.db.models.fieldsr   Zdjango.utilsr	   Zdjango.utils.deprecationr
   Zdjango.utils.encodingr   r   Zdjango.utils.inspectr   Zdjango.utils.translationr   r   r   objectrE   rQ   r   r   r   r   r   r   r   <module>   s(   I