3
gkb                 @   s  d dl 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 d dlmZ d dl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 d ddZdd Zdd Zdd ZG dd dZ G dd deZ!G dd deZ"G dd dZ#dS )!    N)contextmanager)	AppConfig)Appsapps)settings)models)RECURSIVE_RELATIONSHIP_CONSTANT)DEFAULT_NAMESnormalize_together)make_model_tuple)cached_property)import_string)get_docs_version   )InvalidBasesError c             C   sJ   t | tr6| jdd}t|dkr*t|S ||d fS | jj| jjfS d S )N.r      r   )
isinstancestrsplitlentuple_meta	app_label
model_name)modelr   r    r   X/var/www/tester-filtro-web/env/lib/python3.6/site-packages/django/db/migrations/state.py_get_app_label_and_model_name   s    
 r   c             C   s   dd | j  D }t }xN| jjdddD ]:}|jr*|jdk	r*t|jt r*|j|j	 |j
|j q*W | j}|jr| |kr|j
|j |S )zEReturn all models that have a direct relationship to the given model.c             S   s   g | ]}t |tjr|qS r   )
issubclassr   Model).0subclassr   r   r   
<listcomp>   s    z'_get_related_models.<locals>.<listcomp>T)Zinclude_parentsZinclude_hiddenN)__subclasses__setr   Z
get_fieldsis_relationrelated_modelr   r   addr   appendproxyZconcrete_model)mrelated_modelsZrelated_fields_modelsfoptsr   r   r   _get_related_models   s    r0   c             C   s   dd t | D S )zq
    Return a list of typical (app_label, model_name) tuples for all related
    models for the given model.
    c             S   s   h | ]}|j j|j jfqS r   )r   r   r   )r"   rel_modr   r   r   	<setcomp>2   s   z,get_related_models_tuples.<locals>.<setcomp>)r0   )r   r   r   r   get_related_models_tuples-   s    r3   c             C   sn   t  }t| }xH|D ]@}|jj|jj }}||f|kr8q|j||f |jt| qW || jj| jjfh S )a  
    Return all models that have a direct or indirect relationship
    to the given model.

    Relationships are either defined by explicit relational fields, like
    ForeignKey, ManyToManyField or OneToOneField, or by inheriting from another
    model (a superclass is related to its subclasses, but not vice versa). Note,
    however, that a model inheriting from a concrete model is also related to
    its superclass through the implicit *_ptr OneToOneField on the subclass.
    )r&   r0   r   r   r   r)   extend)r   seenqueuer1   rel_app_labelrel_model_namer   r   r   get_related_models_recursive8   s    
r9   c               @   s   e Zd ZdZdddZdd Zdd Zd d
dZd!ddZd"ddZ	dd Z
dd Zdd Zedd Zedd Zedd Zdd ZdS )#ProjectStatez
    Represent the entire project's overall state. This is the item that is
    passed around - do it here rather than at the app level so that cross-app
    FKs/etc. resolve properly.
    Nc             C   s   |pi | _ |pg | _d| _d S )NF)r   	real_apps
is_delayed)selfr   r;   r   r   r   __init__U   s    

zProjectState.__init__c             C   s6   |j |j }}|| j||f< d| jkr2| j|| d S )Nr   )r   
name_lowerr   __dict__reload_model)r=   model_stater   r   r   r   r   	add_model[   s    
zProjectState.add_modelc             C   s2   | j ||f= d| jkr.| jj|| | jj  d S )Nr   )r   r@   r   unregister_modelclear_cache)r=   r   r   r   r   r   remove_modela   s    
zProjectState.remove_modelFc             C   s&  |r
d| _ t }y| jj||}W n tk
r6   Y nX |rFt|}nt|}| j||f }t }xH|jj	 D ]:}|j
rn|jjtkrqnt|j|\}	}
|j|	|
j f qnW |j| x\|D ]T\}	}
y| jj|	|
}W n tk
r   Y qX |r|jt| q|jt| qW |j||f |S )NT)r<   r&   r   	get_modelLookupErrorr3   r9   r   fieldsvaluesr'   remote_fieldr   r   r   r(   r)   lowerupdate)r=   r   r   delayr-   Z	old_modelrB   Zdirect_related_modelsfieldr7   r8   Z	rel_modelr   r   r   _find_reload_modeli   s:    

zProjectState._find_reload_modelc             C   s&   d| j kr"| j|||}| j| d S )Nr   )r@   rP   _reload)r=   r   r   rN   r-   r   r   r   rA      s    
zProjectState.reload_modelTc             C   sD   d| j kr@t }x$|D ]\}}|j| j||| qW | j| d S )Nr   )r@   r&   rM   rP   rQ   )r=   r   rN   r-   r   r   r   r   r   reload_models   s
    
zProjectState.reload_modelsc             C   s   | j j & x|D ]\}}| j j|| qW W d Q R X g }x*| j jD ]}|j|jf|krD|j| qDW xB|D ]:\}}y| j||f }W n tk
r   Y qlX |j| qlW | j j	| d S )N)
r   bulk_updaterD   real_modelsr   r?   r*   r   KeyErrorrender_multiple)r=   r-   r7   r8   Zstates_to_be_renderedrB   r   r   r   rQ      s    zProjectState._reloadc             C   s@   t dd | jj D | jd}d| jkr4| jj |_| j|_|S )z*Return an exact copy of this ProjectState.c             S   s   i | ]\}}|j  |qS r   )clone)r"   kvr   r   r   
<dictcomp>   s    z&ProjectState.clone.<locals>.<dictcomp>)r   r;   r   )r:   r   itemsr;   r@   r   rW   r<   )r=   Z	new_stater   r   r   rW      s    

zProjectState.clonec             C   s   | j rd| jkr| jd= d S )Nr   )r<   r@   )r=   r   r   r   clear_delayed_apps_cache   s    z%ProjectState.clear_delayed_apps_cachec             C   s   t | j| jS )N)	StateAppsr;   r   )r=   r   r   r   r      s    zProjectState.appsc             C   s   t | j| jdd| _| jS )NT)ignore_swappable)r]   r;   r   r   )r=   r   r   r   concrete_apps   s    zProjectState.concrete_appsc             C   s<   i }x.|j ddD ]}tj|}|||j|jf< qW | |S )z3Take an Apps and return a ProjectState matching it.T)Zinclude_swapped)
get_models
ModelState
from_modelr   r?   )clsr   Z
app_modelsr   rB   r   r   r   	from_apps   s
    
zProjectState.from_appsc             C   s    | j |j kot| jt|jkS )N)r   r&   r;   )r=   otherr   r   r   __eq__   s    zProjectState.__eq__)NN)F)F)T)__name__
__module____qualname____doc__r>   rC   rF   rP   rA   rR   rQ   rW   r\   r   r   propertyr_   classmethodrd   rf   r   r   r   r   r:   N   s   

0

	r:   c               @   s    e Zd ZdZdd Zdd ZdS )AppConfigStubzAStub of an AppConfig. Only provides a label and a dict of models.c             C   s   d | _ i | _|| _|| _d S )N)r   r   labelname)r=   rn   r   r   r   r>      s    zAppConfigStub.__init__c             C   s   | j j| j | _d S )N)r   
all_modelsrn   r   )r=   r   r   r   import_models   s    zAppConfigStub.import_modelsN)rg   rh   ri   rj   r>   rq   r   r   r   r   rm      s   	rm   c                   sN   e Zd ZdZd fdd	Zedd Zdd Zd	d
 Zdd Z	dd Z
  ZS )r]   zo
    Subclass of the global Apps registry class to better handle dynamic model
    additions and removals.
    Fc                s   g | _ x>|D ]6}tj|}x&|j D ]}| j jtj|dd q$W qW dd |j D }dd t||D }t	 j
| d | _d | _| j|j | j  ddlm}	 |rttjhnt }
|	| |
d	}|rtd
jdd |D d S )NT)exclude_relsc             S   s   h | ]
}|j qS r   )r   )r"   rB   r   r   r   r2     s    z%StateApps.__init__.<locals>.<setcomp>c             S   s   g | ]}t |qS r   )rm   )r"   rn   r   r   r   r$     s    z&StateApps.__init__.<locals>.<listcomp>r   )_check_lazy_references)ignore
c             s   s   | ]}|j V  qd S )N)msg)r"   errorr   r   r   	<genexpr>  s    z%StateApps.__init__.<locals>.<genexpr>)rT   global_appsZget_app_configr`   r*   ra   rb   rJ   sortedsuperr>   _lockZready_eventrV   Zdjango.core.checks.model_checksrs   r   r   ZAUTH_USER_MODELr&   
ValueErrorjoin)r=   r;   r   r^   r   Zappr   Z
app_labelsapp_configsrs   rt   errors)	__class__r   r   r>      s     

zStateApps.__init__c             c   s,   | j }d| _ z
d V  W d || _ | j  X d S )NF)readyrE   )r=   r   r   r   r   rS     s    
zStateApps.bulk_updatec             C   s   |sd S | j  z |}xn|rg }x:|D ]2}y|j|  W q& tk
rV   |j| Y q&X q&W t|t|kr~td|t f |}qW W d Q R X d S )NzCannot resolve bases for %r
This can happen if you are inheriting models from an app with migrations (e.g. contrib.auth)
 in an app with no migrations; see https://docs.djangoproject.com/en/%s/topics/migrations/#dependencies for more)rS   renderr   r*   r   r   )r=   Zmodel_statesZunrendered_modelsZnew_unrendered_modelsr   r   r   r   rV   #  s     

zStateApps.render_multiplec             C   sL   t g i }tj| j|_tj| j|_x|jj D ]
}||_q2W | j|_|S )z Return a clone of this registry.)r]   copydeepcopyrp   r   rJ   r   rT   )r=   rW   Z
app_configr   r   r   rW   =  s    

zStateApps.clonec             C   s`   || j | |jj< || jkr6t|| j|< | | j| _|| j| j|jj< | j| | j  d S )N)	rp   r   r   r   rm   r   r   Zdo_pending_operationsrE   )r=   r   r   r   r   r   register_modelI  s    

zStateApps.register_modelc             C   s8   y| j | |= | j| j|= W n tk
r2   Y nX d S )N)rp   r   r   rU   )r=   r   r   r   r   r   rD   R  s
    zStateApps.unregister_model)F)rg   rh   ri   rj   r>   r   rS   rV   rW   r   rD   __classcell__r   r   )r   r   r]      s   	r]   c               @   sl   e Zd ZdZdddZedd Zed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S )ra   a  
    Represent a Django Model. Don't use the actual Model class as it's not
    designed to have its options changed - instead, mutate this one and then
    render it into a Model as required.

    Note that while you are allowed to mutate .fields, you are not allowed
    to mutate the Field instances inside there themselves - you must instead
    assign new ones, as these are not detached during a clone.
    Nc       	      C   s   || _ || _t|| _|pi | _| jjdg  | jjdg  |pFtjf| _|pPg | _	xj| jj
 D ]\\}}t|dr~td| |jrt|jdrtd| |jr`t|jjdr`td| q`W x$| jd D ]}|jstd| qW d S )	Nindexesconstraintsr   z7ModelState.fields cannot be bound to a model - "%s" is.r   z_ModelState.fields cannot refer to a model class - "%s.to" does. Use a string reference instead.zdModelState.fields cannot refer to a model class - "%s.through" does. Use a string reference instead.zKIndexes passed to ModelState require a name attribute. %r doesn't have one.)r   ro   dictrI   options
setdefaultr   r!   basesmanagersr[   hasattrr}   r'   r(   Zmany_to_manyrK   Zthrough)	r=   r   ro   rI   r   r   r   rO   indexr   r   r   r>   e  s2    




zModelState.__init__c             C   s
   | j j S )N)ro   rL   )r=   r   r   r   r?     s    zModelState.name_lowerFc                sv  g }xj jD ]z}t|ddr$|r$qt|tjr2q|j}y|j||j f W q t	k
r } zt	d|j j
|f W Y dd}~X qX qW |sxfj jD ]Z}|j}y|j||j f W q t	k
r } zt	d|j j|f W Y dd}~X qX qW i }xtD ]}|dkrqn|j jkr|dkrLj jd }tt|||< n|dkrtj jd }	tt|	||< nz|d	krd
d j jD }
x |
D ]}|js|j qW |
|d	< n2|dkrdd j jD |d< nj j| ||< qW |rxDdD ]}||kr ||= q W n$|jddd j jD kr@|d=  fdd tt fddd}tdd |D }tdd |D stjf}g }t }d}xj jD ]}|j|krĐqnb|jrtj|}|j  nF|jks|jkrtj  }|j!|_!|j|_|jkr&|}nq|j"|j |j|j|f qW |d|fgkr\g }| j j#j j||||S )z3Given a model, return a ModelState representing it.rK   Nz'Couldn't reconstruct field %s on %s: %sz+Couldn't reconstruct m2m field %s on %s: %sr   r   unique_togetherindex_togetherr   c             S   s   g | ]}|j  qS r   )rW   )r"   idxr   r   r   r$     s    z)ModelState.from_model.<locals>.<listcomp>r   c             S   s   g | ]}|j  qS r   )rW   )r"   conr   r   r   r$     s    order_with_respect_toc             S   s   h | ]
}|j qS r   )ro   )r"   rO   r   r   r   r2     s    z(ModelState.from_model.<locals>.<setcomp>c                sD   g }x:| j D ]0}t|dr2|jjr2|j | q|j| qW |S )Nr   )	__bases__r   r   Zabstractr4   r*   )r   r   base)flatten_basesr   r   r     s    z,ModelState.from_model.<locals>.flatten_basesc                s    j j| S )N)__mro__r   )x)r   r   r   <lambda>  s    z'ModelState.from_model.<locals>.<lambda>)keyc             s   s$   | ]}t |d r|jjn|V  qdS )r   N)r   r   Zlabel_lower)r"   r   r   r   r   rx     s   z(ModelState.from_model.<locals>.<genexpr>c             s   s$   | ]}t |tpt|tjV  qd S )N)r   r   r    r   r!   )r"   r   r   r   r   rx     s    Zobjects)r   r   )r   r   r   )$r   Zlocal_fieldsgetattrr   r   ZOrderWrtro   r*   rW   	TypeErrorrn   Zlocal_many_to_manyZobject_namer	   Zoriginal_attrsr&   r
   r   Zset_name_with_modelr   getZprivate_fieldsrz   r   anyr!   r   Zuse_in_migrationsr   Z_set_creation_counterZ_base_managerZ_default_managerManagerr   r)   r   )rc   r   rr   rI   rO   ro   er   utitr   r   r   Zflattened_basesr   r   Zmanager_namesZdefault_manager_shimmanagerZnew_managerr   )r   r   r   rb     s      












zModelState.from_modelc             c   sn   t | jdd d}xV|D ]N\}}|j \}}}}}|rNt|}	||	j fV  qt|}
||
||fV  qW dS )z-Deep-clone the managers using deconstruction.c             S   s
   | d j S )Nr   )Zcreation_counter)rY   r   r   r   r     s    z/ModelState.construct_managers.<locals>.<lambda>)r   N)rz   r   deconstructr   
as_manager)r=   Zsorted_managersZmgr_namer   r   Zmanager_pathZqs_pathargskwargsZqs_classZmanager_classr   r   r   construct_managers  s    zModelState.construct_managersc             C   s.   | j | j| jt| jt| j| jt| jdS )z(Return an exact copy of this ModelState.)r   ro   rI   r   r   r   )	r   r   ro   r   rI   r   r   listr   )r=   r   r   r   rW     s    zModelState.clonec                s   | j  d| j}tdf |}yt fdd| jD }W n$ tk
r^   td| jf Y nX dd | jj D }||d< d|d	< |j	| j
  t| j||S )
zACreate a Model object from our current state into the given apps.)r   r   ZMetac             3   s&   | ]}t |tr j|n|V  qd S )N)r   r   rG   )r"   r   )r   r   r   rx   /  s   z$ModelState.render.<locals>.<genexpr>z(Cannot resolve one or more bases from %rc             S   s   i | ]\}}|j  |qS r   )rW   )r"   ro   rO   r   r   r   rZ   5  s    z%ModelState.render.<locals>.<dictcomp>Z__fake__rh   )r   r   typer   r   rH   r   rI   r[   rM   r   ro   )r=   r   Zmeta_contentsmetar   bodyr   )r   r   r   '  s    
zModelState.renderc             C   s8   x | j d D ]}|j|kr|S qW td|| jf d S )Nr   zNo index named %s on model %s)r   ro   r}   )r=   ro   r   r   r   r   get_index_by_name>  s    
zModelState.get_index_by_namec             C   s8   x | j d D ]}|j|kr|S qW td|| jf d S )Nr   z"No constraint named %s on model %s)r   ro   r}   )r=   ro   
constraintr   r   r   get_constraint_by_nameD  s    
z!ModelState.get_constraint_by_namec             C   s   d| j j| j| jf S )Nz<%s: '%s.%s'>)r   rg   r   ro   )r=   r   r   r   __repr__J  s    zModelState.__repr__c             C   s|   | j |j koz| j|jkozt| jt|jkoztdd tt| jj t|jj D oz| j|jkoz| j	|j	koz| j
|j
kS )Nc             s   sB   | ]:\\}}\}}||ko8|j  d d |j  d d kV  qdS )r   N)r   )r"   Zk1f1Zk2f2r   r   r   rx   S  s   z$ModelState.__eq__.<locals>.<genexpr>)r   ro   r   rI   allziprz   r[   r   r   r   )r=   re   r   r   r   rf   M  s    zModelState.__eq__)NNN)F)rg   rh   ri   rj   r>   r   r?   rl   rb   r   rW   r   r   r   r   rf   r   r   r   r   ra   Z  s   	
" ra   )r   )$r   
contextlibr   Zdjango.appsr   Zdjango.apps.registryr   r   ry   Zdjango.confr   Z	django.dbr   Zdjango.db.models.fields.relatedr   Zdjango.db.models.optionsr	   r
   Zdjango.db.models.utilsr   Zdjango.utils.functionalr   Zdjango.utils.module_loadingr   Zdjango.utils.versionr   
exceptionsr   r   r0   r3   r9   r:   rm   r]   ra   r   r   r   r   <module>   s*   
 g