
 X"                @   s  d  d l  m 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 d  d l m Z m Z m Z m Z m Z m Z d  d l m Z 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' m( Z( m) Z) d  d l* m+ Z+ d  d l, m- Z- d  d l. m/ Z/ d  d l0 m1 Z1 d  d l2 m3 Z3 d  d l4 m5 Z5 d  d l6 m7 Z7 m8 Z8 m9 Z9 d  d l: m; Z; d  d l< m= Z= d  d l> m? Z? m@ Z@ d  d lA mB ZC d  d lD mE ZE e9 Gd d   d eF   ZG eG   ZH d d d  ZI Gd d   d eJ  ZK Gd  d!   d! eF  ZL Gd" d#   d# e3 jM eK   ZN d d$ d%  ZO d& d'   ZP d( d)   ZQ d* d+   ZR d, eR _S d- d.   ZT d S)/    )unicode_literalsN)chain)apps)settings)checks)NON_FIELD_ERRORSFieldDoesNotExist
FieldErrorMultipleObjectsReturnedObjectDoesNotExistValidationError)DEFAULT_DB_ALIASDJANGO_VERSION_PICKLE_KEYDatabaseErrorconnectionsroutertransaction)signals)
LOOKUP_SEP)CASCADE	Collector)	AutoField)ForeignObjectRelManyToOneRelOneToOneFieldlazy_related_operationresolve_relation)Manager)Options)Q)make_model_tuple)six)RemovedInDjango20Warning)	force_str
force_textpython_2_unicode_compatible)curry)zip)capfirstget_text_list)ugettext_lazy)get_versionc               @   s(   e  Z d  Z d d   Z d d   Z d S)Deferredc             C   s
   t  d  S)Nz<Deferred field>)str)self r/   C/home/ubuntu/projects/ifolica/build/django/django/db/models/base.py__repr__-   s    zDeferred.__repr__c             C   s
   t  d  S)Nz<Deferred field>)r-   )r.   r/   r/   r0   __str__0   s    zDeferred.__str__N)__name__
__module____qualname__r1   r2   r/   r/   r/   r0   r,   +   s   r,   c                sa   i | d 6}   d k	 rQ    f d d   } d d   } | | d <| | d <n  t   | |  S)	a  
    Create exception subclass. Used by ModelBase below.

    If 'attached_to' is supplied, the exception will be created in a way that
    allows it to be pickled, assuming the returned exception class will be added
    as an attribute to the 'attached_to' class.
    r4   Nc                s   t     f |  j f S)N)unpickle_inner_exceptionargs)r.   )attached_tonamer/   r0   
__reduce__@   s    z&subclass_exception.<locals>.__reduce__c             S   s   | |  _  d  S)N)r7   )r.   r7   r/   r/   r0   __setstate__E   s    z(subclass_exception.<locals>.__setstate__r:   r;   )type)r9   parentsmoduler8   Z
class_dictr:   r;   r/   )r8   r9   r0   subclass_exception6   s    
r?   c                   sp   e  Z d  Z d Z   f d d   Z d d   Z d d   Z d d	   Z e d
 d    Z	 e d d    Z
   S)	ModelBasez#
    Metaclass for all models.
    c                s  t  t |   j } d d   | D } | s> | |  | | |  S| j d  } | |  | | i | d 6 } | j d d   } t | d d  }	 | s t | d d   }
 n | }
 t | d d   } d  } t j |  } t |
 d d   d  k r'| d  k r|	 s$t d	 | | f   q$q'| j } n  | j	 d t
 |
 |   |	 s&| j	 d
 t t d
  t d d   | D  pzt f | d |  | j	 d t t d  t d d   | D  pt f | d |  | r&| j r&t |
 d  s| j | j _ n  t |
 d  s#| j | j _ q#q&n  | j j } | rc| rc| j rct d | | j f   n  x* | j   D] \ } } | j	 | |  qpWt | j j | j j | j j  } d d   | D } | rd  } x d d   | D D]w } | j j r| j j rt d |   qqn  | d  k r3| } q| j j | j j k	 rt d |   qqW| d  k rt d |   n  | j j |  | j j | j _ n | | j _ i  } x t  | g |  D] } t | d  sqn  | | k r| j j rqn  xK | j j D]= } t! | t"  rt# | | j$ j%  } | | t& |  <qqWqWt'   } x| j(   D]} | | k st | d  r| t' | j) j*    O} qnn  | j j | j j } | j j sxO | D]G } | j+ | k rt, d | j+ | | j- f   q| j. | j+  qW| j j } t& |  } | | k rT| | } n | sd | j j/ } t" | d t0 d | d d d d } | | k rt, d  | | | j- f   n  t | |  s| j	 | |  qn d  } | | j j1 | <n | j j1 j2   } x | D] } | j+ | k r| j+ | j) k r| j+ | k rt2 j3 |  } | j	 | j+ |  | j4 rx6 | j   D]% \ } } | | k r~| | | <q~q~WqqqW| j j1 j5 |  xp | j j D]b } | j+ | k r| j j s3t, d | j+ | | j- f   q3q| j	 | j+ t2 j3 |   qWqnW|	 rWd | _ | | _6 | S| j7   | j j j8 | j j9 |  | S)!Nc             S   s%   g  |  ] } t  | t  r |  q Sr/   )
isinstancer@   ).0br/   r/   r0   
<listcomp>W   s   	 z%ModelBase.__new__.<locals>.<listcomp>r4   MetaabstractF_meta	app_labelzfModel class %s.%s doesn't declare an explicit app_label and isn't in an application in INSTALLED_APPS.DoesNotExistc             s   s4   |  ]* } t  | d   r | j j r | j Vq d S)rG   N)hasattrrG   rF   rI   )rB   xr/   r/   r0   	<genexpr>~   s    z$ModelBase.__new__.<locals>.<genexpr>r8   r
   c             s   s4   |  ]* } t  | d   r | j j r | j Vq d S)rG   N)rJ   rG   rF   r
   )rB   rK   r/   r/   r0   rL      s    orderingget_latest_byz'%s cannot proxy the swapped model '%s'.c             S   s   h  |  ] } | j   q Sr/   )r9   )rB   fr/   r/   r0   	<setcomp>   s   	 z$ModelBase.__new__.<locals>.<setcomp>c             S   s%   g  |  ] } t  | d   r |  q S)rG   )rJ   )rB   Zklsr/   r/   r0   rD      s   	 zOAbstract base class containing model fields not permitted for proxy model '%s'.zAProxy model '%s' has more than one non-abstract model base class.z6Proxy model '%s' has no non-abstract model base class.zRLocal field %r in class %r clashes with field of the same name from base class %r.z%s_ptrZ	on_deleter9   auto_createdTparent_linkztAuto-generated field '%s' in class %r for parent_link to base class %r clashes with declared field of the same name.):superr@   __new__popgetattrr   Zget_containing_app_configRuntimeErrorlabeladd_to_classr   r?   r-   tupler   r
   rF   rJ   rM   rG   rN   proxyswapped	TypeErroritemsr   local_fieldslocal_many_to_manyZprivate_fieldsfieldsconcrete_modelZsetup_proxyreversedrA   r   r   remote_fieldmodelr    setmro__dict__keysr9   r	   r3   add
model_namer   r=   copydeepcopyZ
one_to_oneupdaterE   _prepareZregister_modelrH   )clsr9   basesattrsZ	super_newr=   r>   	new_classZ	attr_metarF   meta	base_metarH   Z
app_configZis_proxyZobj_nameobj
new_fieldsfield_namesbaseparentZparent_linksfieldrelatedZinherited_attributesZparent_fieldsZbase_key	attr_nameZbase_parentsZ	new_fieldrR   )	__class__r/   r0   rT   R   s*   	
	
						$		
zModelBase.__new__c             C   sF   t  j |  r2 t | d  r2 | j |  |  n t |  | |  d  S)Ncontribute_to_class)inspectZisclassrJ   r   setattr)rp   r9   valuer/   r/   r0   rY   9  s    zModelBase.add_to_classc             C   sy  |  j  } | j |   | j r t |  j d d |  _ t |  j d d |  _ | j j r | j } | j j } t	 t
 |  |  q n  |  j d k r d |  j d j d d   | j D  f |  _ n  t j j | j  } | r t |  d	 |  n  | j s|  j   rbt d
 d   | j D  r=t d |  j   n  t   } d | _ |  j d |  n  t j j d |   d S)zJ
        Creates some methods once self._meta has been populated.
        is_nextTFNz%s(%s)z, c             s   s   |  ] } | j  Vq d  S)N)r9   )rB   rO   r/   r/   r0   rL   W  s    z%ModelBase._prepare.<locals>.<genexpr>Zget_absolute_urlc             s   s   |  ] } | j  d  k Vq d S)objectsN)r9   )rB   rO   r/   r/   r0   rL   ^  s    zOModel %s must specify a custom Manager, because it has a field named 'objects'.r   sender)rG   ro   order_with_respect_tor&   _get_next_or_previous_in_orderZget_next_in_orderZget_previous_in_orderrd   re   r   make_foreign_order_accessors__doc__r3   joinra   r   ZABSOLUTE_URL_OVERRIDESgetZlabel_lowerr   managers _requires_legacy_default_managerany
ValueErrorr   rQ   rY   r   Zclass_preparedsend)rp   optsZwrtZremoteZget_absolute_url_overridemanagerr/   r/   r0   ro   @  s.    			2		zModelBase._preparec             C   sH  |  j  } | j r d S| j } x"| j D] } | j } |  | k s\ |  j  j s\ | j  j r) | |  j k	 r | j r t	 j
 d j d |  j d | j d | j d | j j  j d | j d | j j  j  t d	  | j | _ | j   n  Pq) q) W| j s@t	 j
 d
 j d |  j d | j d | j d | j j  j  t d	  n  d Sd  S)NFa  Managers from concrete parents will soon qualify as default managers if they appear before any other managers in the MRO. As a result, '{legacy_default_manager}' declared on '{legacy_default_manager_model}' will no longer be the default manager for '{model}' in favor of '{future_default_manager}' declared on '{future_default_manager_model}'. You can redeclare '{legacy_default_manager}' on '{cls}' to keep things the way they are or you can switch to the new behavior right away by setting `Meta.manager_inheritance_from_future` to `True`.rp   re   Zlegacy_default_managerZlegacy_default_manager_modelfuture_default_managerZfuture_default_manager_model   a  Managers from concrete parents will soon qualify as default managers. As a result, the 'objects' manager won't be created (or recreated) automatically anymore on '{model}' and '{future_default_manager}' declared on '{future_default_manager_model}' will be promoted to default manager. You can declare explicitly `objects = models.Manager()` on '{cls}' to keep things the way they are or you can switch to the new behavior right away by setting `Meta.manager_inheritance_from_future` to `True`.T)rG   Zmanager_inheritance_from_futuredefault_managerr   Z_originating_modelr[   rF   _default_managerZdefault_manager_namewarningswarnformatr3   rX   r9   r"   Z_expire_cacherQ   )rp   r   r   r   Zoriginating_modelr/   r/   r0   r   i  s<    									

		
			z*ModelBase._requires_legacy_default_managerc             C   s
   |  j  j S)N)rG   Zbase_manager)rp   r/   r/   r0   _base_manager  s    zModelBase._base_managerc             C   s
   |  j  j S)N)rG   r   )rp   r/   r/   r0   r     s    zModelBase._default_manager)r3   r4   r5   r   rT   rY   ro   r   propertyr   r   r/   r/   )r~   r0   r@   N   s   )Ir@   c               @   s%   e  Z d  Z d Z d d d  Z d S)
ModelStatez,
    A class for storing instance state
    Nc             C   s   | |  _  d |  _ d  S)NT)dbadding)r.   r   r/   r/   r0   __init__  s    	zModelState.__init__)r3   r4   r5   r   r   r/   r/   r/   r0   r     s   r   c                   s%  e  Z d  Z   f d d   Z e d d    Z d d   Z d d   Z d	 d
   Z d d   Z	 d d   Z
 d d   Z d d   Z d d d  Z d d   Z e e e  Z d d   Z d d d d  Z d d   Z d d d d d d   Z d! e _ d d d d d d" d#  Z d! e _ d$ d%   Z d d d d d d d& d'  Z d( d)   Z d* d+   Z d d d, d-  Z d! e _ d. d/   Z d0 d1   Z d2 d3   Z d4 d5   Z d6 d7   Z  d d8 d9  Z! d d: d;  Z" d< d=   Z# d> d?   Z$ d@ dA   Z% dB dC   Z& d d! dD dE  Z' d dF dG  Z( e dH dI    Z) e dJ dK    Z* e dL dM    Z+ e dN dO    Z, e dP dQ    Z- e dR dS    Z. e dT dU    Z/ e dV dW    Z0 e dX dY    Z1 e dZ d[    Z2 e d\ d]    Z3 e d^ d_    Z4 e d` da    Z5 e db dc    Z6   S)dModelc       
         s  t  j j d |  j d | d |  t   |  _ t |  } | t |  j j  k ra t	 d   n  | s t
 |  j j  } x t | |  D]1 \ } } | t k r q n  t |  | j |  q Wn t
 |  j j  } x} t | |  D]l \ } } | t k rq n  t |  | j |  | j | j d   t | j t  r | j | j d   q q Wxl| D]d} d } | j | k r| j d  k rqZn  | ret | j t  r+y | j | j  } d } WnI t k
 r	y | j | j  } Wn t k
 r| j   } Yn XYqbX| d  k rb| j rbd  } qbqqy | j | j  } Wqqt k
 ra| j   } YqqXn | j   } | r| t k	 rt |  | j |  qqZ| t k	 rZt |  | j |  qZqZW| rx t |  D] }	 yb t t |  j |	  t  s|  j j |	  r<| |	 t k	 r2t |  |	 | |	  n  | |	 =n  Wqt t f k
 rWYqXqW| rt  d t |  d   qn  t! t" |   j#   t  j$ j d |  j d	 |   d  S)
Nr   r7   kwargsz'Number of args exceeds number of fieldsFTz5'%s' is an invalid keyword argument for this functionr   instance)%r   Zpre_initr   r~   r   _statelenrG   concrete_fields
IndexErroriterr'   DEFERREDr   attnamera   rU   r9   rA   rd   r   columnr   KeyErrorZget_defaultnulllistrV   r   	get_fieldAttributeErrorr   r]   rS   r   r   Z	post_init)
r.   r7   r   Zargs_lenZfields_itervalr{   Zis_related_objectZrel_objprop)r~   r/   r0   r     sv    "
	 zModel.__init__c                s   t    t  |  j j  k rY t     j      f d d   |  j j D  n  |     } d | j _ | | j _ | S)Nc                s1   g  |  ]' } | j    k r'  j   n t  q Sr/   )r   rU   r   )rB   rO   )rx   valuesr/   r0   rD   4  s   	 z!Model.from_db.<locals>.<listcomp>F)r   rG   r   r   reverser   r   r   )rp   r   rx   r   newr/   )rx   r   r0   from_db/  s    
%zModel.from_dbc             C   sN   y t  j |   } Wn t t f k
 r3 d } Yn Xt d |  j j | f  S)Nz[Bad Unicode data]z<%s: %s>)r!   	text_typeUnicodeEncodeErrorUnicodeDecodeErrorr#   r~   r3   )r.   ur/   r/   r0   r1   :  s
    zModel.__repr__c             C   s?   t  j r+ t |  d  r+ t |   j d  St d |  j j  S)NZ__unicode__zutf-8z	%s object)r!   PY2rJ   r$   encoder-   r~   r3   )r.   r/   r/   r0   r2   A  s    zModel.__str__c             C   sa   t  | t  s d S|  j j | j j k r/ d S|  j   } | d  k rQ |  | k S| | j   k S)NF)rA   r   rG   rb   _get_pk_val)r.   otherZmy_pkr/   r/   r0   __eq__F  s    
zModel.__eq__c             C   s   |  j  |  S)N)r   )r.   r   r/   r/   r0   __ne__P  s    zModel.__ne__c             C   s1   |  j    d  k r! t d   n  t |  j     S)Nz8Model instances without primary key value are unhashable)r   r]   hash)r.   r/   r/   r0   __hash__S  s    zModel.__hash__c             C   s>   |  j  } t   | t <|  j j |  j j f } t | f | f S)a;  
        Provides pickling support. Normally, this just dispatches to Python's
        standard handling. However, for models with deferred field loading, we
        need to do things manually, as they're dynamically created classes and
        only module-level classes can be pickled by the default path.
        )rh   r+   r   rG   rH   object_namemodel_unpickle)r.   dataZclass_idr/   r/   r0   r:   X  s    	zModel.__reduce__c             C   s   d  } | j  t  } | rF t   } | | k rL d | | f } qL n d } | rk t j | t d d n  |  j j |  d  S)NzQPickled model instance's Django version %s does not match the current version %s.z9Pickled model instance's Django version is not specified.
stacklevelr   )r   r   r+   r   r   RuntimeWarningrh   rn   )r.   statemsgZpickled_versioncurrent_versionr/   r/   r0   r;   d  s    	zModel.__setstate__Nc             C   s%   | s |  j  } n  t |  | j j  S)N)rG   rV   pkr   )r.   rt   r/   r/   r0   r   v  s    zModel._get_pk_valc             C   s   t  |  |  j j j |  S)N)r   rG   r   r   )r.   r   r/   r/   r0   _set_pk_val{  s    zModel._set_pk_valc                s     f d d     j  j D S)zV
        Returns a set containing names of deferred fields for this instance.
        c                s+   h  |  ]! } | j    j k r | j   q Sr/   )r   rh   )rB   rO   )r.   r/   r0   rP     s   	 z,Model.get_deferred_fields.<locals>.<setcomp>)rG   r   )r.   r/   )r.   r0   get_deferred_fields  s    zModel.get_deferred_fieldsc                s  | d k	 rQ t  |  d k r" d St d d   | D  rQ t d t   qQ n  | d k	 rc | n	 |  j j } |  j j j |  j	 d |  j
  } |  j     | d k	 r t |  } | j |   } n7   r   f d d   |  j j D } | j |   } n  | j   } | j   } x |  j j D] } | j | k r@q%n  t |  | j t | | j   | j r%| j   |  j k r%t |  | j    } t | | j  }	 | d k rd n t | | j j  }
 |	 |
 k s|	 d k r|
 d k r|  j | j   =qq%q%W| j j |  j _ d S)	aV  
        Reloads field values from the database.

        By default, the reloading happens from the database this instance was
        loaded from, or by the read router if this instance wasn't loaded from
        any database. The using parameter will override the default.

        Fields can be used to specify which fields to reload. The fields
        should be an iterable of field attnames. If fields is None, then
        all non-deferred fields are reloaded.

        When accessing deferred fields of an instance, the deferred loading
        of the field will call this method.
        Nr   c             s   s   |  ] } t  | k Vq d  S)N)r   )rB   rO   r/   r/   r0   rL     s    z(Model.refresh_from_db.<locals>.<genexpr>zRFound "%s" in fields argument. Relations and transforms are not allowed in fields.r   c                s(   g  |  ] } | j    k r | j   q Sr/   )r   )rB   rO   )deferred_fieldsr/   r0   rD     s   	 z)Model.refresh_from_db.<locals>.<listcomp>)r   r   r   r   r   r   r~   r   usingfilterr   r   r   onlyrG   r   r   r   r   rV   is_relationget_cache_namerh   Ztarget_field)r.   r   ra   r   Zdb_instance_qsZdb_instanceZnon_loaded_fieldsr{   Zrel_instanceZ	local_valZrelated_valr/   )r   r0   refresh_from_db  s:    $'$zModel.refresh_from_dbc             C   sH   y |  j  j |  } Wn t k
 r7 t |  |  SYn Xt |  | j  S)a  
        Returns the value of the field name for this instance. If the field is
        a foreign key, returns the id value, instead of the object. If there's
        no Field object with this name on the model, the model attribute's
        value is returned directly.

        Used to serialize a field's value (in the serializer, or form output,
        for example). Normally, you would just access the attribute directly
        and not use this method.
        )rG   r   r   rV   r   )r.   
field_namer{   r/   r/   r0   serializable_value  s
    zModel.serializable_valueFc             C   s~  x |  j  j D] } | j r y t |  | j    Wn t k
 rJ w Yn Xt |  | j d  } | r | j d k r | j j	 s t
 | | j j    n  t d | j   q q q W| p t j |  j d |  } | r | s | r t d   n  |  j   } | d k	 rt |  d k r$d St |  } t   } xU |  j  j D]G } | j sF| j | j  | j | j k r| j | j  qqFqFW| j |  }	 |	 rXt d d j |	    qXn | rX| rX| |  j j k rXt   } xA |  j  j D]3 } | j rt | d  r| j | j  qqW| j |  }
 |
 rXt |
  } qXn  |  j d	 | d
 | d | d |  d S)ab  
        Saves the current instance. Override this in a subclass if you want to
        control the saving process.

        The 'force_insert' and 'force_update' parameters can be used to insist
        that the "save" must be an SQL insert or update (or equivalent for
        non-SQL backends), respectively. Normally, they should not be set.
        NzJsave() prohibited to prevent data loss due to unsaved related object '%s'.r   z6Cannot force both insert and updating in model saving.r   zEThe following fields do not exist in this model or are m2m fields: %sz, throughr   force_insertforce_updateupdate_fields)rG   r   r   rV   r   r   r9   r   rd   multipledelattrr   r   db_for_writer~   r   r   	frozensetrf   ra   primary_keyrj   r   
differencer   r   r   rJ   	save_base)r.   r   r   r   r   r{   rv   r   rx   Znon_model_fieldsZloaded_fieldsr/   r/   r0   save  sR    				z
Model.saveTc       
      C   sv  | p t  j |  j d |  } | o- | p- | s7 t  | d k s[ t |  d k s[ t  |  j } } | j j r | j j } n  | j } | j s t	 j
 j d | d |  d | d | d |  n  t j d | d d	  ? | s |  j | | |  n  |  j | | | | | |  }	 Wd QX| |  j _ d	 |  j _ | j srt	 j j d | d |  d
 |	 d | d | d |  n  d S)aw  
        Handles the parts of saving which should be done only once per save,
        yet need to be done in raw saves, too. This includes some sanity
        checks and signal sending.

        The 'raw' argument is telling save_base not to save any parent
        models and not to do any changes to the values before save. This
        is used by fixture loading.
        r   Nr   r   rawr   r   	savepointFcreated)r   r   r~   AssertionErrorr   rG   r[   rb   rQ   r   pre_saver   r   atomic_save_parents_save_tabler   r   r   Z	post_save)
r.   r   r   r   r   r   rp   originrt   updatedr/   r/   r0   r     s&    $		$
$	zModel.save_basec             C   s  | j  } x| j j   D] \ } } | r t |  | j  j j  d k r t |  | j  d k	 r t |  | j  j j t |  | j   n  |  j d | d | d |  |  j d | d | d |  | r t |  | j |  j	 | j    | j
   } t |  |  rt |  |  qq q Wd S)zF
        Saves all the parents of cls using values from self.
        Nrp   r   r   )rG   r=   r^   rV   r   r   r   r   r   r   r   rJ   r   )r.   rp   r   r   rt   rz   r{   Z
cache_namer/   r/   r0   r   E  s    	$(zModel._save_parentsc                s.  | j  } d d   | j D }  rA  f d d   | D } n   j |  }	 |	 d k r | j j   }	 t  | j j |	  n  |	 d k	 }
 |
 r | s  r t d   n  d } |
 r[| r[| j j	 |  }    f d d   | D }  p | }  j
 | | |	 |  |  } | r<| r<t d   n   r[| r[t d	   q[n  | s*| j r| j } | j   } | j j	 |  j |   j   } |  _ n  | j } |
 sd
 d   | D } n  t | j o|
  }  j | j | | |    } | r*t  | j j |  q*n  | S)zt
        Does the heavy-lifting involved in saving. Updates or inserts the data
        for a single table.
        c             S   s   g  |  ] } | j  s |  q Sr/   )r   )rB   rO   r/   r/   r0   rD   d  s   	 z%Model._save_table.<locals>.<listcomp>c                s4   g  |  ]* } | j    k s* | j   k r |  q Sr/   )r9   r   )rB   rO   )r   r/   r0   rD   g  s   	 Nz5Cannot force an update in save() with no primary key.Fc                sC   g  |  ]9 } | d    r* t   | j  n | j  d  f  q S)NF)rV   r   r   )rB   rO   )r   r.   r/   r0   rD   u  s   	z&Forced update did not affect any rows.z0Save with update_fields did not affect any rows.c             S   s%   g  |  ] } t  | t  s |  q Sr/   )rA   r   )rB   rO   r/   r/   r0   rD     s   	 )rG   Zlocal_concrete_fieldsr   r   Zget_pk_value_on_saver   r   r   r   r   
_do_updater   r   get_filter_kwargs_for_objectr   count_orderboolZhas_auto_field
_do_insert)r.   r   rp   r   r   r   r   rt   Znon_pkspk_valZpk_setr   base_qsr   forced_updater{   filter_argsZorder_valuera   	update_pkresultr/   )r   r.   r   r0   r   ]  sJ    	
			!	zModel._save_tablec             C   s   | j  d |  } | s. | d k	 p- | j   S|  j j rs | rs | j   rl | j |  d k pk | j   Sd Sn  | j |  d k S)z
        This method will try to update the model. If the model was updated (in
        the sense that an update query was done and a matching row was found
        from the DB) the method will return True.
        r   Nr   F)r   existsrG   Zselect_on_save_update)r.   r   r   r   r   r   r   Zfilteredr/   r/   r0   r     s    zModel._do_updatec          
   C   s(   | j  |  g d | d | d | d | S)zx
        Do an INSERT. If update_pk is defined then this method should return
        the new pk for the model.
        ra   Z	return_idr   r   )Z_insert)r.   r   r   ra   r   r   r/   r/   r0   r     s    zModel._do_insertc             C   s   | p t  j |  j d |  } |  j   d  k	 sU t d |  j j |  j j j f   t	 d |  } | j
 |  g d | | j   S)Nr   zC%s object can't be deleted because its %s attribute is set to None.r   keep_parents)r   r   r~   r   r   rG   r   r   r   r   Zcollectdelete)r.   r   r   Z	collectorr/   r/   r0   r     s    zModel.deletec             C   s7   t  |  | j  } t t | j  j | |  d d S)NZstrings_onlyT)rV   r   r$   dictZflatchoicesr   )r.   r{   r   r/   r/   r0   _get_FIELD_display  s    zModel._get_FIELD_displayc       	      K   s'  |  j  s t d   n  | r$ d n d } | r6 d n d } t t |  | j   } t i | d | j | f 6  } | t i | | j 6|  j  d | 6  B} |  j j j	 |  j
 j  j |   j |  j d | | j f d	 |  } y | d
 SWn. t k
 r"|  j d |  j j j   Yn Xd  S)Nz8get_next/get_previous cannot be used on unsaved objects.gtlt -z%s__%szpk__%sz%s%sz%spkr   z!%s matching query does not exist.)r   r   r$   rV   r   r   r9   r~   r   r   r   r   r   order_byr   rI   rG   r   )	r.   r{   r   r   oporderparamqqsr/   r/   r0   _get_next_or_previous_by_FIELD  s    	 (-z$Model._get_next_or_previous_by_FIELDc             C   s   d | } t  |  |  s | r% d n d } | r7 d n d } |  j j } | j |   } |  j j j |   j i |  j j j d  j i |  j |  j j j	 6  d | 6  j
 |  d  d  j   } t |  | |  n  t |  |  S)Nz__%s_order_cacher   r   r   z-_orderz
_order__%s   )rJ   rG   r   r   r~   r   r   r   r   r9   r  r   r   rV   )r.   r   Z	cachenamer  r  Zorder_fieldr   rv   r/   r/   r0   r     s    
$z$Model._get_next_or_previous_in_orderc             C   s;   |  j  d  k r" t d |    n  t |  | j j   j  S)Nz9Unsaved model instance %r cannot be used in an ORM query.)r   r   rV   rd   Zget_related_fieldr   )r.   r{   r/   r/   r0   prepare_database_save  s    zModel.prepare_database_savec             C   s   d S)aI  
        Hook for doing any extra model-wide validation after clean() has been
        called on every field by self.clean_fields. Any ValidationError raised
        by this method will not be associated with a particular field; it will
        have a special-case association with the field defined by NON_FIELD_ERRORS.
        Nr/   )r.   r/   r/   r0   clean  s    zModel.cleanc             C   s   |  j  d |  \ } } |  j |  } |  j |  } x3 | j   D]% \ } } | j | g   j |  qC W| r t |   n  d S)zn
        Checks unique constraints on the model and raises ``ValidationError``
        if any failed.
        excludeN)_get_unique_checks_perform_unique_checks_perform_date_checksr^   
setdefaultextendr   )r.   r  unique_checksdate_checkserrorsZdate_errorskvr/   r/   r0   validate_unique  s    zModel.validate_uniquec             C   s<  | d k r g  } n  g  } |  j  |  j j f g } x? |  j j   D]. } | j j rC | j | | j j f  qC qC Wx_ | D]W \ } } xH | D]@ } x7 | D] } | | k r Pq q W| j | t |  f  q Wq| Wg  }	 |  j  |  j j f g }
 x0 |  j j   D] } |
 j | | j j f  qWx|
 D] \ } } x | D] } | j } | | k rcqBn  | j r| j | | f f  n  | j	 r| j	 | k r|	 j | d | | j	 f  n  | j
 r| j
 | k r|	 j | d | | j
 f  n  | j rB| j | k rB|	 j | d | | j f  qBqBWq/W| |	 f S)a  
        Gather a list of checks to perform. Since validate_unique could be
        called from a ModelForm, some fields may have been excluded; we can't
        perform a unique check on a model that is missing fields involved
        in that check.
        Fields that did not validate should also be excluded, but they need
        to be passed in via the exclude argument.
        Ndateyearmonth)r~   rG   unique_togetherget_parent_listappendrZ   r_   r9   uniqueunique_for_dateZunique_for_yearZunique_for_month)r.   r  r  Zunique_togethersZparent_classmodel_classr  checkr9   r  Zfields_with_classra   rO   r/   r/   r0   r    s>    		 !		'zModel._get_unique_checksc             C   sc  i  } xV| D]N\ } } i  } xp | D]h } |  j  j |  } t |  | j  } | d  k rb q& n  | j r~ |  j j r~ q& n  | | t |  <q& Wt |  t |  k r q n  | j	 j
 |   }	 |  j | j   }
 |  j j r|
 d  k	 r|	 j d |
  }	 n  |	 j   r t |  d k r-| d } n t } | j | g   j |  j | |   q q W| S)Nr   r	  r   )rG   r   rV   r   r   r   r   r-   r   r   r   r   r  r   r   r  r  unique_error_message)r.   r  r  r   unique_checklookup_kwargsr   rO   Zlookup_valuer  Zmodel_class_pkkeyr/   r/   r0   r  7  s.    ,zModel._perform_unique_checksc       
      C   s=  i  } x0| D](\ } } } } i  } t  |  |  } | d  k rF q n  | d k r | j | d | <| j | d | <| j | d | <n t  | |  | d | | f <t  |  |  | | <| j j |   }	 |  j j r |  j d  k	 r |	 j	 d |  j  }	 n  |	 j
   r | j | g   j |  j | | |   q q W| S)Nr  z%s__dayz	%s__monthz%s__yearz%s__%sr   )rV   dayr  r  r   r   r   r   r   r  r   r  r  date_error_message)
r.   r  r  r   lookup_typer{   
unique_forr$  r  r  r/   r/   r0   r  b  s&    zModel._perform_date_checksc             C   s   |  j  } | j |  } t d | j d d d d i |  d 6t j t | j   d 6| d 6| d 6t j t | j   d	 6| d
 6t j t | j |  j   d 6 S)Nmessager  codeparamsre   rk   r(  r{   field_labelZ
date_fieldZdate_field_label)rG   r   r   error_messagesr!   r   r(   verbose_name)r.   r(  r   r)  r   r{   r/   r/   r0   r'    s    	zModel.date_error_messagec                s   | j    i |  d 6| d 6t j t   j   d 6| d 6} t |  d k r   j | d  } t j t | j   | d <t d | j d	 d
 d	 d |  S  f d d   | D } t j t	 | t
 d    | d <t d t
 d  d
 d d |  Sd  S)Nre   r   rk   r#  r	  r   r-  r*  r  r+  r,  c                s(   g  |  ] } t    j |  j   q Sr/   )r(   r   r/  )rB   rO   )r   r/   r0   rD     s   	 z.Model.unique_error_message.<locals>.<listcomp>andfield_labelsz9%(model_name)s with this %(field_labels)s already exists.r  )rG   r!   r   r(   r/  r   r   r   r.  r)   _)r.   r   r#  r,  r{   r1  r/   )r   r0   r"    s&    	
"zModel.unique_error_messagec          ,   C   sc  i  } | d k r g  } n t  |  } y |  j d |  Wn4 t k
 rq } z | j |  } WYd d } ~ Xn Xy |  j   Wn4 t k
 r } z | j |  } WYd d } ~ Xn X| rJx< | j   D]. } | t k r | | k r | j |  q q Wy |  j d |  WqJt k
 rF} z | j |  } WYd d } ~ XqJXn  | r_t |   n  d S)z
        Calls clean_fields, clean, and validate_unique, on the model,
        and raises a ``ValidationError`` for any errors that occurred.
        Nr  )	r   clean_fieldsr   Zupdate_error_dictr  ri   r   r  r  )r.   r  r  r  er9   r/   r/   r0   
full_clean  s,    	""%zModel.full_cleanc             C   s   | d k r g  } n  i  } x |  j  j D] } | j | k rC q( n  t |  | j  } | j rs | | j k rs q( n  y# t |  | j | j | |    Wq( t	 k
 r } z | j
 | | j <WYd d } ~ Xq( Xq( W| r t	 |   n  d S)z
        Cleans all fields and raises a ValidationError containing a dict
        of all validation errors if any occur.
        N)rG   ra   r9   rV   r   ZblankZempty_valuesr   r  r   Z
error_list)r.   r  r  rO   Z	raw_valuer4  r/   r/   r0   r3    s    	#'zModel.clean_fieldsc             K   s	  g  } | j  |  j    | j  |  j    | j  |  j |    |  j j s| j  |  j |    | j  |  j    | j  |  j    |  j	   |  j
   } | j  |  | s | j  |  j    n  | j  |  j    | j  |  j    | j  |  j    n  | S)N)r  _check_swappable_check_model_check_managersrG   r\   _check_fields$_check_m2m_through_same_relationship_check_long_column_names_check_id_field_check_field_name_clashes_check_column_name_clashes_check_index_together_check_unique_together_check_ordering)rp   r   r  Zclash_errorsr/   r/   r0   r!    s     zModel.checkc             C   s   g  } |  j  j r y t j |  j  j  Wq t k
 rc | j t j d |  j  j d d  Yq t	 k
 r |  j  j j
 d  \ } } | j t j d |  j  j | | f d d  Yq Xn  | S)z$ Check if the swapped model exists. z-'%s' is not of the form 'app_label.app_name'.idzmodels.E001.zF'%s' references '%s.%s', which has not been installed, or is abstract.zmodels.E002)rG   r\   r   	get_modelr   r  r   ErrorZ	swappableLookupErrorsplit)rp   r  rH   rk   r/   r/   r0   r6    s"    zModel._check_swappablec             C   sW   g  } |  j  j rS |  j  j s* |  j  j rS | j t j d |  j d d  qS n  | S)Nz'Proxy model '%s' contains model fields.rB  zmodels.E017)rG   r[   r_   r`   r  r   rE  r3   )rp   r  r/   r/   r0   r7    s    zModel._check_modelc             K   s7   g  } x* |  j  j D] } | j | j |    q W| S)z Perform all manager checks. )rG   r   r  r!  )rp   r   r  r   r/   r/   r0   r8  *  s    zModel._check_managersc             K   sj   g  } x* |  j  j D] } | j | j |    q Wx0 |  j  j D]" } | j | j d |  |   q@ W| S)z Perform all field checks. Z
from_model)rG   r_   r  r!  r`   )rp   r   r  r{   r/   r/   r0   r9  3  s     zModel._check_fieldsc             C   s   g  } g  } |  j  j } d d   | D } d d   | D } xw | D]o } | j j |  | j j f } | | k r | j t j d | j j j  j d |  d d  qE | j |  qE W| S)zL Check if no relationship model is used by more than one m2m field.
        c             s   s*   |  ]  } t  | j j t  r | Vq d  S)N)rA   rd   re   r@   )rB   rO   r/   r/   r0   rL   I  s    z=Model._check_m2m_through_same_relationship.<locals>.<genexpr>c             s   s*   |  ]  } t  | j j t  r | Vq d  S)N)rA   rd   r   r@   )rB   rO   r/   r/   r0   rL   L  s    zMThe model has two many-to-many relations through the intermediate model '%s'.rv   rB  zmodels.E003)	rG   r`   rd   re   r   r  r   rE  rX   )rp   r  Zseen_intermediary_signaturesra   rO   	signaturer/   r/   r0   r:  >  s     z*Model._check_m2m_through_same_relationshipc                sr   t    f d d     j j D  } | rj | d j rj   j j j d k rj t j d d   d d g Sg  Sd S)	z' Check if `id` field is a primary key. c             3   s6   |  ], } | j  d  k r |   j j k r | Vq d S)rB  N)r9   rG   r   )rB   rO   )rp   r/   r0   rL   `  s    z(Model._check_id_field.<locals>.<genexpr>r   rB  zP'id' can only be used as a field name if the field also sets 'primary_key=True'.rv   zmodels.E004N)r   rG   r_   r   r   r9   r   rE  )rp   ra   r/   )rp   r0   r<  ]  s    %)
zModel._check_id_fieldc          	   C   s  g  } i  } x |  j  j   D] } x | j  j D] } | j | j  p\ | j | j  p\ d } | r | j t j d | j | j	 j  | j | j	 j  f d |  d d  n  | | | j <| | | j <q/ Wq WxM |  j  j   D]< } x3 | j  j
   D]" } | | k r | | | j <q q Wq Wx |  j  j D] } | j | j  pX| j | j  pXd } | j d k o| o| j d k o| j	 |  k } | r| r| j t j d | j | j | j	 j  f d | d d  n  | | | j <| | | j <q+W| S)z Ref #17673. NzYThe field '%s' from parent model '%s' clashes with the field '%s' from parent model '%s'.rv   rB  zmodels.E005z;The field '%s' clashes with the field '%s' from model '%s'.zmodels.E006)rG   r  r_   r   r9   r   r  r   rE  re   Z
get_fields)rp   r  Zused_fieldsrz   rO   ZclashZid_conflictr/   r/   r0   r=  n  s@    **3zModel._check_field_name_clashesc          
   C   s   g  } g  } x} |  j  j D]o } | j   \ } } | r{ | | k r{ | j t j d | j | f d d d |  d d  q | j |  q W| S)Nz>Field '%s' has column name '%s' that is used by another field.hintz$Specify a 'db_column' for the field.rv   rB  zmodels.E007)rG   r_   get_attname_columnr  r   rE  r9   )rp   Zused_column_namesr  rO   r2  column_namer/   r/   r0   r>    s    z Model._check_column_name_clashesc             C   s   t  |  j j t t f  s7 t j d d |  d d g St d d   |  j j D  rr t j d d |  d d g Sg  } x- |  j j D] } | j |  j	 | d	   q W| Sd
 S)z- Check the value of "index_together" option. z)'index_together' must be a list or tuple.rv   rB  zmodels.E008c             s   s%   |  ] } t  | t t f  Vq d  S)N)rA   rZ   r   )rB   ra   r/   r/   r0   rL     s    z.Model._check_index_together.<locals>.<genexpr>z6All 'index_together' elements must be lists or tuples.zmodels.E009index_togetherN)
rA   rG   rL  rZ   r   r   rE  r   r  _check_local_fields)rp   r  ra   r/   r/   r0   r?    s    

zModel._check_index_togetherc             C   s   t  |  j j t t f  s7 t j d d |  d d g St d d   |  j j D  rr t j d d |  d d g Sg  } x- |  j j D] } | j |  j	 | d	   q W| Sd
 S)z. Check the value of "unique_together" option. z*'unique_together' must be a list or tuple.rv   rB  zmodels.E010c             s   s%   |  ] } t  | t t f  Vq d  S)N)rA   rZ   r   )rB   ra   r/   r/   r0   rL     s    z/Model._check_unique_together.<locals>.<genexpr>z7All 'unique_together' elements must be lists or tuples.zmodels.E011r  N)
rA   rG   r  rZ   r   r   rE  r   r  rM  )rp   r  ra   r/   r/   r0   r@    s    

zModel._check_unique_togetherc             C   s3  d d l  m } d d   |  j j d d  D } g  } x | D] } y | | } Wn> t k
 r | j t j d | | f d |  d	 d
  Yq? Xt | j	 | j
  r | j t j d | | | f d |  d	 d  q? | |  j j k r? | j t j d | | |  j j f d d d |  d	 d  q? q? W| S)Nr   )modelsc             S   s   i  |  ] } | | j   q Sr/   )r9   )rB   r{   r/   r/   r0   
<dictcomp>  s   	 z-Model._check_local_fields.<locals>.<dictcomp>r   Fz+'%s' refers to the non-existent field '%s'.rv   rB  zmodels.E012zV'%s' refers to a ManyToManyField '%s', but ManyToManyFields are not permitted in '%s'.zmodels.E013z;'%s' refers to field '%s' which is not local to model '%s'.rI  z4This issue may be caused by multi-table inheritance.zmodels.E016)	django.dbrN  rG   Z_get_fieldsr   r  r   rE  rA   rd   ZManyToManyRelr_   r   )rp   ra   optionrN  Zforward_fields_mapr  r   r{   r/   r/   r0   rM    s:    "zModel._check_local_fieldsc             C   sf  |  j  j r( t j d d |  d d g S|  j  j sA |  j  j rE g  St |  j  j t t f  s| t j d d |  d d g Sg  } |  j  j } d d   | D } d	 d   | D } d
 d   | D } d d   | D } g  } |  j  } t	 t
 j d d   t
 | j | j  D   } | j | |  x4 | D], } | j t j d | d |  d d  q2W| S)zU Check "ordering" option -- is it a list of strings and do all fields
        exist? z?'ordering' and 'order_with_respect_to' cannot be used together.rv   rB  zmodels.E021zQ'ordering' must be a tuple or list (even if you want to order by only one field).zmodels.E014c             s   s!   |  ] } | d  k r | Vq d S)?Nr/   )rB   rO   r/   r/   r0   rL   D  s    z(Model._check_ordering.<locals>.<genexpr>c             s   s4   |  ]* } | j  d   r( | d d  n | Vq d S)r  r	  N)
startswith)rB   rO   r/   r/   r0   rL   G  s    c             s   s!   |  ] } d  | k r | Vq d S)__Nr/   )rB   rO   r/   r/   r0   rL   K  s    c             S   s"   h  |  ] } | d  k r |  q S)r   r/   )rB   rO   r/   r/   r0   rP   O  s   	 z(Model._check_ordering.<locals>.<setcomp>c             s   sF   |  ]< } | j  o | j s. | j | j f n | j j   f Vq d  S)N)rQ   Zconcreter9   r   r{   Zrelated_query_name)rB   rO   r/   r/   r0   rL   X  s   z1'ordering' refers to the non-existent field '%s'.zmodels.E015)rG   Z_ordering_clashr   rE  r   rM   rA   r   rZ   rf   r   from_iterablera   Zrelated_objectsr  r  )rp   r  ra   Zinvalid_fieldsr   Zvalid_fieldsZinvalid_fieldr/   r/   r0   rA  '  s>    

			
zModel._check_orderingc             C   s  g  } d } d } x t  j j   D] } t j | |   s@ q" n  t | } | j j   } | d k s" | j j	 rw q" q" | d k r | } | } q" | | k  r" | } | } q" q" W| d k r | Sx |  j
 j D]} } | j   \ } }	 | j d k r |	 d k	 r t |	  | k r | j t j d |	 | | f d d d |  d d  q q Wx |  j
 j D] } t | j j t j  rq\n  x | j j j
 j D]} }
 |
 j   \ } } |
 j d k r| d k	 rt |  | k r| j t j d | | | f d d	 d |  d d
  qqWq\W| S)z
        Check that any auto-generated column names are shorter than the limits
        for each database in which the model will be created.
        Nz\Autogenerated column name too long for field "%s". Maximum length is "%s" for database "%s".rI  z/Set the column name manually using 'db_column'.rv   rB  zmodels.E018z`Autogenerated column name too long for M2M field "%s". Maximum length is "%s" for database "%s".z\Use 'through' to create a separate model for M2M and then set column_name using 'db_column'.zmodels.E019)r   Z	DATABASESri   r   Zallow_migrate_modelr   opsmax_name_lengthfeaturesZtruncates_namesrG   r_   rJ  Z	db_columnr   r  r   rE  r`   rA   rd   r   r!   string_types)rp   r  Zallowed_lenZdb_aliasr   
connectionrW  rO   r2  rK  Zm2mZrel_namer/   r/   r0   r;  h  sT    
	--zModel._check_long_column_names)7r3   r4   r5   r   classmethodr   r1   r2   r   r   r   r:   r;   r   r   r   r   r   r   r   r   Zalters_datar   r   r   r   r   r   r   r  r   r
  r  r  r  r  r  r'  r"  r5  r3  r!  r6  r7  r8  r9  r:  r<  r=  r>  r?  r@  rM  rA  r;  r/   r/   )r~   r0   r     sn   f
	4	N	#		3		4+$	:0Ar   c             C   s   | d  k r t  } n  |  j j } | j |  } t j d | d d  D x< t |  D]. \ } } |  j j d | |  j	 d |  qV WWd  QXd  S)Nr   r   Fr   r   )
r   rG   r   get_forward_related_filterr   r   	enumerater   r   rn   )ordered_objr.   Zid_listr   	order_wrtr   ijr/   r/   r0   method_set_order  s    	rb  c             C   sI   |  j  j } | j |  } |  j  j j } |  j j |   j | d d S)NZflatT)rG   r   r\  r   r9   r   r   Zvalues_list)r^  r.   r_  r   Zpk_namer/   r/   r0   method_get_order  s    rc  c             C   sP   t  | d |  j j   t t |    t  | d |  j j   t t |    d  S)Nzget_%s_orderzset_%s_order)r   r3   lowerr&   rc  rb  )re   Zrelated_modelr/   r/   r0   r     s    r   c             C   s4   t  |  t  r! t j |    } n |  } | j |  S)zA
    Used to unpickle Model subclasses with deferred fields.
    )rA   rZ   r   rD  rT   )Zmodel_idre   r/   r/   r0   r     s    r   Tc             C   s   t  |  |  } | j |  S)N)rV   rT   )klassexception_name	exceptionr/   r/   r0   r6     s    r6   )U
__future__r   rl   r   r   	itertoolsr   Zdjango.appsr   Zdjango.confr   Zdjango.corer   Zdjango.core.exceptionsr   r   r	   r
   r   r   rP  r   r   r   r   r   r   Zdjango.db.modelsr   Zdjango.db.models.constantsr   Zdjango.db.models.deletionr   r   Zdjango.db.models.fieldsr   Zdjango.db.models.fields.relatedr   r   r   r   r   Zdjango.db.models.managerr   Zdjango.db.models.optionsr   Zdjango.db.models.queryr   Zdjango.db.models.utilsr    Zdjango.utilsr!   Zdjango.utils.deprecationr"   Zdjango.utils.encodingr#   r$   r%   Zdjango.utils.functionalr&   Zdjango.utils.six.movesr'   Zdjango.utils.textr(   r)   Zdjango.utils.translationr*   r2  Zdjango.utils.versionr+   objectr,   r   r?   r<   r@   r   with_metaclassr   rb  rc  r   r   Z__safe_for_unpickle__r6   r/   r/   r/   r0   <module>   sX   ..(	 n    
	