
    h1                         d dl mZ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mZ d dlmZmZmZmZ d dlmZ  G d d	      Zy
)    )SONDBRef)BaseDictBaseListEmbeddedDocumentListTopLevelDocumentMetaclassget_document)LazyReference)get_db)DocumentEmbeddedDocument)	DictField	ListFieldMapFieldReferenceField)QuerySetc                   ,    e Zd ZddZddZddZd	dZy)
DeReferenceNc                   	
 |t        |t              r|S t        |t              r|D cg c]  }| }}|| _        d	|rt        |t        t
        t        f      r|j                  j                  |      	t        	d      r	j                  	t        	d      rt        	t              r	
	j                  	t        |d       }|rt        	fd|D              r|S |s$t        	fd|j                         D              r|S 
j                  s+
fd
fdt        |d      s	 |      }n |      }| j!                  |      | _        | j%                  	      | _        | j)                  |d	||      S c c}w )
aL  
        Cheaply dereferences the items to a set depth.
        Also handles the conversion of complex data types.

        :param items: The iterable (dict, list, queryset) to be dereferenced.
        :param max_depth: The maximum depth to recurse to
        :param instance: The owning instance used for tracking changes by
            :class:`~mongoengine.base.ComplexBaseField`
        :param name: The name of the field, used for tracking changes by
            :class:`~mongoengine.base.ComplexBaseField`
        :param get: A boolean determining if being called by __get__
        Nfielditemsc              3   <   K   | ]  }|j                   k(    y wN	__class__.0idoc_types     U/var/www/html/eduruby.in/venv/lib/python3.12/site-packages/mongoengine/dereference.py	<genexpr>z'DeReference.__call__.<locals>.<genexpr>;   s     "Jq1;;(#:"J   c              3   <   K   | ]  }|j                   k(    y wr   r   r   s     r    r!   z'DeReference.__call__.<locals>.<genexpr>=   s      )01AKK8+)r"   c                     g }| D ]n  }|}t        |t              r	 |      }n@t        |t              r	 |      }n't        |t        t        f      sj                  |      }|j                  |       p |S r   )
isinstancedictlistr   r   	to_pythonappend)r   	new_itemsvvalue_get_items_from_dict_get_items_from_listr   s       r    r.   z2DeReference.__call__.<locals>._get_items_from_listF   sw    $&	!& 4A$%E)!T2(<Q(?!+At!4(<Q(?%/E83D%E(-(:%,,U34  )(    c                     i }| j                         D ]e  \  }}|}t        |t              r	 |      }n@t        |t              r	 |      }n't        |t        t
        f      sj                  |      }|||<   g |S r   )r   r%   r'   r&   r   r   r(   )r   r*   kr+   r,   r-   r.   r   s        r    r-   z2DeReference.__call__.<locals>._get_items_from_dictS   s|    $&	$)KKM 1DAq$%E)!T2(<Q(?!+At!4(<Q(?%/E83D%E(-(:+0IaL1  )(r/   )r   r   )r%   strr   	max_depthr   r   r   _fieldsgethasattrr   r   document_typeallvaluesdbref_find_referencesreference_map_fetch_objects
object_map_attach_objects)selfr   r3   instancenamer   is_listr-   r.   r   r   s          @@@@r    __call__zDeReference.__call__   sl    =Juc2L eX& %&1Q&E&"
x!13LM
  ''++D1H(G,#>> (G, (N3 #11%eW55s"JE"JJ L S )5:\\^) & !L
)) #5'2 4U ; 4U ;!2259--x-@##E1h=={ 's   	E?c           	         i }|r|| j                   k\  r|S t        |t              r|j                         }n|}|dz  }|D ]  }t        |t        t
        f      r|j                  j                         D ]  \  }}|j                  j                  |d      }t        |t              r4t        |t              r>|j                  |j                  t                     j                  |j                          t        |t        t"        f      rGd|v rC|j                  t%        |d         t                     j                  |d   j                          t        |t        t&        t(        f      s|| j                   k  st+        t+        |dd      dd      }	| j-                  ||      }
|
j                         D ]F  \  }}t        |	t        t.        f      r|	}|j                  |t                     j1                  |       H  t        |t              rt        |t              r?|j                  |j2                  t                     j                  |j                          *t        |t        t"        f      rHd|v rD|j                  t%        |d         t                     j                  |d   j                          t        |t        t&        t(        f      s|dz
  | j                   k  s| j-                  ||dz
        }
|
j                         D ].  \  }}|j                  |t                     j1                  |       0  |S )z
        Recursively finds all db references to be dereferenced

        :param items: The iterable (dict, list, queryset)
        :param depth: The current depth of recursion
           N_ref_clsr   r7   )r3   r%   r&   r9   r   r   r4   r   _datar5   r
   r   
setdefaultr7   setaddidr   r	   r'   tuplegetattrr;   r   update
collection)r@   r   depthr<   iteratoritem
field_namer   r+   	field_cls
referenceskeyrefss                r    r;   zDeReference._find_referencesi   s    /   eT"||~HH 	
 $	FD$+; <=)-););)= N%J

z48A!!]3 #Au-%001D1DceLPPQRQUQUV#Ac{3!%00ai1H#%PTTfILL $AdE':;@W$+#E7D9?D%	 &*%:%:1e%D
)3)9)9); NIC) )H6O+P  '0)44S#%@GGMN!N, D-0D%(((#%@DDTWWMD4+.6T>((d6l)CSUKOOLOO D4u"56519;V!224C
!+!1!1!3 FIC!,,S#%8??EFG$	FL r/   c           
         i }| j                   j                         D ]  \  }}t        |dd      du}|ra|j                         }|D cg c]  }||f|vs
| }}|j                  j                  |      }	|	j                         D ]  \  }
}||||
f<    yt        |t        t        t        f      r|D cg c]  }||f|vs
| }}|rP|j                         |   j                  dd|ii      }	|	D ]$  }|j                  |      }||||j                  f<   & t               |   j                  dd|ii      }	|	D ]  }d|v rt        |d         j                  |      }nS|@t        dj!                  d |j#                  d      D                    j                  |      }n|j                  |      }||||j                  f<     |S c c}w c c}w )	z:Fetch all references and convert to their document objectsobjectsN_idz$inrH    c              3   <   K   | ]  }|j                           y wr   )
capitalize)r   xs     r    r!   z-DeReference._fetch_objects.<locals>.<genexpr>   s     'V1'Vs   _)r<   r   rO   _get_collection_namer[   in_bulkr%   r   r   r   _get_dbfind	_from_sonrM   r   r	   joinsplit)r@   r   r>   rQ   dbrefsref_document_cls_existscol_namer:   rY   rW   rX   docrefs                r    r=   zDeReference._fetch_objects   s   
"&"4"4":":"< '	?J '.j)T&JRV&V#&%::<'-#(E1B*1TE  (//77=
 * 0 0 2 6HC25J#/6 hIx(HI (.#*e1DJ1VE  !)!1!1!3J!?!D!D."J  * ?&005;>
J#78? "(*!5!:!:EE4=;Q!RJ) 	?!S=".s6{";"E"Ec"JC%-". "'V
@P@PQT@U'V V#'in   #+"4"4S"9C;>
J#78	?='	?P Cs   	GG6GGc                    |sDt        |t        t        f      r|S |r*t        |t              rt        |||      S t        |||      S t        |t        t        f      rd|v r8| j
                  j                  |d   j                  |d   j                  f|      S d|v rrt        |d         j                  |      }|j                  j                  dd      }|d= | j                  |j                  ||d      |_        |||j                  d<   |S t        |d      s<d}t        }t        |t              rt        }t        |t               }	t#        |      }
g }nd}|j%                         }
i }|dz  }|
D ]F  \  }}|r|j'                  |       n|||<   || j
                  v r|s| j
                  |   ||<   Ct        |t(        t*        f      rF|j,                  D ]4  }||   j                  j                  |d      }t        |t.              rC| j
                  j                  |j                  |j                  f|      ||   j                  |<   vt        |t        t        f      rMd|v rI| j
                  j                  |d   j                  |d   j                  f|      ||   j                  |<   t        |t        t0        t         f      s|| j2                  k  s| d| d| }| j                  ||||	      ||   j                  |<   7 t        |t        t0        t         f      r7|| j2                  k  r(|r| d| n|}| j                  ||dz
  ||	      ||<   t        |t.              st        |d
      s| j
                  j                  |j                  |j                  f|      ||<   I |r(|r&|r	rt!        |      S  |||      S t        |||      S |dz  }|S )a  
        Recursively finds all db references to be dereferenced

        :param items: The iterable (dict, list, queryset)
        :param depth: The current depth of recursion
        :param instance: The owning instance used for tracking changes by
            :class:`~mongoengine.base.ComplexBaseField`
        :param name: The name of the field, used for tracking changes by
            :class:`~mongoengine.base.ComplexBaseField`
        rG   rH   Nr   TFrF   .)rA   rB   rM   )r%   r   r   r&   r   r>   r5   rQ   rM   r	   rf   rI   popr?   r6   r   rN   	enumerater   r)   r   r   r4   r   r'   r3   )r@   r   rR   rA   rB   rl   rH   rC   	list_typeas_tuplerS   datar1   r+   rU   	item_names                   r    r?   zDeReference._attach_objects   s    %(H!56eT*#E8T::#E8T::edC[)**6]--uV}/?/?@%  5"5=1;;EByy}}VT2&M 00E3M	#(,CIIf%
ug&G I%!560	!%/H 'HDG{{}HD
 	GDAqAQDOO#G//!,QA*:;<"#)) JQ))*d;A!!U+48OO4G4G\\1440!5Qj1 $Ac{3!48OO4G4GvY111V9<<@!5Qj1 $AdE':;@W'+fAaS*$>	484H4Huxi 5I 5Qj1 AdE238O-1tfAaSMt	..uqy8) / Q Au%'!T*://--q||QTT.BAFQ=	G@ &.uT{SIdHd4SSD(D11
r/   )rF   NN)r   r   )r   NN)__name__
__module____qualname__rD   r;   r=   r?    r/   r    r   r      s    P>d9v+ZVr/   r   N)bsonr   r   mongoengine.baser   r   r   r   r	   mongoengine.base.datastructuresr
   mongoengine.connectionr   mongoengine.documentr   r   mongoengine.fieldsr   r   r   r   mongoengine.querysetr   r   ry   r/   r    <module>r      s8      : ) ;  *Q Qr/   