U
    Lk7gF                     @   s   d dl Z d dlZd dlmZ d dlmZmZmZ d dlm	Z	 d dl
mZ d dlmZmZmZmZ dZG dd	 d	eZG d
d deZG dd deZG dd deZdS )    N)_document_registry)	BaseFieldComplexBaseFieldObjectIdField_import_class)InvalidDocumentError)
DO_NOTHINGDoesNotExistMultipleObjectsReturnedQuerySetManager)DocumentMetaclassTopLevelDocumentMetaclassc                       sD   e Zd ZdZ fddZedd Zedd Zedd	 Z  Z	S )
r   zMetaclass for all documents.c                    s  |  |}t j}|d}|r8t|tr8|| |||S |dd|d< g |d< d|krf|d|d< d|krt }|d d d D ]2}t|dr|	|j
 qt|dr|	|j q||d< d|d d< |d d	rtd
}	|	 |d< i }
|d d d D ]v}t|dr|
|j t|dsi }|j D ]6\}}t|tsHq0||_|js\||_|||< q0|
| qi }| D ]N\}}t|tsq||_|js||_||
|< ||jdd ||j< qdd | D }|rdd| }t||
|d< dd |
 D |d< dd |d  D |d< tdd tdd |
 D D |d< d}|g}|D ]p}t|ddst|di dds||j t|drl|jd	}|sl|jdsltd|j qld d |D }|r|d j}||d jf7 }d!t |}||d"< ||d#< |f|d$< |d$ |d%< || |||}|D ]*}||j!krr| j!|f7  _!|j!|_"qR| # \}}}}t||rd |_$|t%|j< |j D ]2}|}|j&d kr||_&t|d&t'}t||rt||rtd'|j(r|)  |j*j+| t|t,rvt|d(rvt|j-d&t'}t||rp|t'krpd)|j.j|jf }t||j-}|t'krt||rd*|j }t||j*/||j| |jrt||jr||0 krd+|j }t|q|S ),Nmy_metaclass_is_documentF_cached_reference_fieldsmeta_metaabstractallow_inheritanceStringField_cls_fieldsr      c                 S   s   g | ]\}}|d kr|qS )r    .0kvr   r   @/tmp/pip-unpacked-wheel-n1etwkgt/mongoengine/base/metaclasses.py
<listcomp>b   s      z-DocumentMetaclass.__new__.<locals>.<listcomp>z#Multiple db_fields defined for: %s z, c                 S   s   i | ]\}}|t |d |qS db_field)getattrr   r   r   r    
<dictcomp>i   s     z-DocumentMetaclass.__new__.<locals>.<dictcomp>_db_field_mapc                 S   s   i | ]\}}||qS r   r   r   r   r   r    r%   l   s     _reverse_db_field_mapc                 s   s   | ]}|d  V  qdS )r   Nr   )r   ir   r   r    	<genexpr>p   s   z,DocumentMetaclass.__new__.<locals>.<genexpr>c                 s   s   | ]}|j |jfV  qd S N)Zcreation_counternamer   r   r   r   r    r)   r   s     _fields_orderedr   _is_base_clsTzeDocument %s may not be subclassed. To enable inheritance, use the "allow_inheritance" meta attribute.c                 S   s   g | ]}t |d r|qS )_class_name)hasattrr   br   r   r    r!      s     
 .r/   _superclasses_subclasses_typesZreverse_delete_rulez9CachedReferenceFields is not allowed in EmbeddedDocumentsfieldz9Reverse delete rules are not supported for %s (field: %s)zHReverse delete rules are not supported for EmbeddedDocuments (field: %s)z2%s is a document method and not a valid field name)1
_get_basessuper__new__get
issubclassr   popMetaDictr0   merger   r   r   updater   __dict__items
isinstancer   r+   r#   joinr   tuplesortedvaluesr$   append__name__
ValueErrorr4   r/   reversedr5   r6   _import_classesZ_collectionr   Zowner_documentr	   Z	auto_syncZstart_listenerZdocument_typer   r   r7   	__class__Zregister_delete_rulemro)mcsr+   basesattrsflattened_bases	super_new	metaclassr   baser   Z
doc_fieldsZbase_fields	attr_name
attr_valuefield_namesZduplicate_db_fieldsmsgZsuperclasses
class_namer   Zdocument_basesr   	new_classDocumentEmbeddedDocument	DictFieldCachedReferenceFieldr7   fZdelete_rulerM   r   r    r:      s    








   






zDocumentMetaclass.__new__c                    s6   t |tr|S g  | |} fdd|D }t|S )Nc                 3   s$   | ]}| ks  |s|V  qd S r*   )rH   r1   seenr   r    r)      s      
 z/DocumentMetaclass._get_bases.<locals>.<genexpr>)rC   
BasesTuple_DocumentMetaclass__get_bases)rO   rP   Zunique_basesr   rb   r    r8      s    

zDocumentMetaclass._get_basesc                 c   s0   |D ]&}|t krq|V  | |jE d H  qd S r*   )objectre   	__bases__)rO   rP   rU   r   r   r    Z__get_bases   s
    zDocumentMetaclass.__get_basesc                 C   s,   t d}t d}t d}t d}||||fS )Nr\   r]   r^   r_   r   )rO   r\   r]   r^   r_   r   r   r    rL      s
    z!DocumentMetaclass._import_classes)
rI   
__module____qualname____doc__r:   classmethodr8   re   rL   __classcell__r   r   ra   r    r      s    D

r   c                       s,   e Zd ZdZ fddZedd Z  ZS )r   zjMetaclass for top-level documents (i.e. documents that have their own
    collection in the database.
    c                    s  |  |}t j}|dtkr^dd d g g d dd d d d
|d< d|d< |d |di  n0|di |d< |d dd|d d< d|d< d|d	< d
|kr|d
 }t|dr|j|d d< d|kr|d= dd |D }|sd n|d }|r0d|di kr0|jdds0d  }t	
|t |d d= |dsL|d dr||rn|jddsnd}t|||  ||S t }	|d d d D ]v}
t|
dr|	|
j nt|
dr|	|
j t|
d	dr|
jds|	dd }t|r||
|	d< q|	|di  tdd |D }|sR|	d dkrR|	d sRtdd|	kr~ddd  D d |	d< |	|d< ||  ||}|j}	||	d |	d< |	d}t|r|||jd< d
t|krt |_|j D ]L\}}|jr|jd}|r"||kr"td|s||jd< ||_q|jds| |\}}||jd< t|d|j|< ||j| _ |j| |_||j!|< ||j"|< |f|j# |_#t$t%f}|d}|D ]F}|j& t' fd d|D p|f}t( |d|i}t)| | q|S )!Nr   TF)
r   Zmax_documentsmax_sizeZorderingindexesid_fieldZindex_background
index_optsZdelete_rulesr   r   r.   r   r   r   objectsqueryset_classc                 S   s   g | ]}|j tkr|qS r   )rM   r   r1   r   r   r    r!   )  s    
 z5TopLevelDocumentMetaclass.__new__.<locals>.<listcomp>r   
collectionz-Trying to set a collection on a subclass (%s)z/Abstract document cannot have non-abstract baser   c                 s   s$   | ]}t |d r|jdV  qdS )r   r   N)r0   r   r;   r1   r   r   r    r)   U  s    
 z4TopLevelDocumentMetaclass.__new__.<locals>.<genexpr>r   zGOnly direct subclasses of Document may set "allow_inheritance" to False c                 s   s"   | ]}|  rd | n|V  qdS )z_%sN)isupper)r   cr   r   r    r)   e  s     _rn   Zindex_specsro   z!Cannot override primary key fieldr"   rh   c                 3   s"   | ]}t | rt| V  qd S r*   )r0   r$   )r   rU   r+   r   r    r)     s    
 )*r8   r9   r:   r;   r   r@   r0   rr   r   warningswarnSyntaxWarningrJ   r>   r?   r   r$   callableallrD   striplowerZ_build_index_specsdirr   rq   r   rB   Zprimary_keyidget_auto_id_namesr   r+   r&   r'   r-   r
   r   rI   rE   typesetattr)rO   r+   rP   rQ   rR   rS   managerZparent_doc_clsrY   r   rU   rs   Zsimple_classr[   
field_namer7   Z
current_pkid_name
id_db_nameZexceptions_to_mergemoduleexcparents	exceptionra   rx   r    r:      s    















z!TopLevelDocumentMetaclass.__new__c           	      C   s   d\}}dd |j D }dd |j  D }||krD||krD||fS d\}}}t D ]<}| d| }| d| }||krV||krV||f  S qVdS )a  Find a name for the automatic ID field for the given new class.

        Return a two-element tuple where the first item is the field name (i.e.
        the attribute name on the object) and the second element is the DB
        field name (i.e. the name of the key stored in MongoDB).

        Defaults to ('id', '_id'), or generates a non-clashing name in the form
        of ('auto_id_X', '_auto_id_X') if the default name is already taken.
        )r   Z_idc                 S   s   h | ]}|qS r   r   )r   r   r   r   r    	<setcomp>  s     z>TopLevelDocumentMetaclass.get_auto_id_names.<locals>.<setcomp>c                 S   s   h | ]
}|j qS r   r"   r,   r   r   r    r     s     )Zauto_idZ_auto_idr   rw   N)r   rG   	itertoolscount)	rO   r[   r   r   Zexisting_fieldsZexisting_db_fieldsZid_basenameZid_db_basenamer(   r   r   r    r     s    
z+TopLevelDocumentMetaclass.get_auto_id_names)rI   rh   ri   rj   r:   rk   r   rl   r   r   ra   r    r      s
    .r   c                   @   s   e Zd ZdZdZdd ZdS )r>   zOCustom dictionary for meta classes.
    Handles the merging of set indexes
    )rn   c                 C   s>   |  D ]0\}}|| jkr0| |g | | |< q|| |< qd S r*   )rB   _merge_optionsr;   )selfnew_optionsr   r   r   r   r    r?     s    
zMetaDict.mergeN)rI   rh   ri   rj   r   r?   r   r   r   r    r>     s   r>   c                   @   s   e Zd ZdZdS )rd   z?Special class to handle introspection of bases tuple in __new__N)rI   rh   ri   rj   r   r   r   r    rd     s   rd   )r   ry   Zmongoengine.base.commonr   Zmongoengine.base.fieldsr   r   r   Zmongoengine.commonr   Zmongoengine.errorsr   Zmongoengine.querysetr	   r
   r   r   __all__r   r   r   dictr>   rE   rd   r   r   r   r    <module>   s    b L