a
    Cg{D                     @   sf  d dl mZ d dlZd dlmZ d dlmZmZmZ d dl	m
Z
mZmZmZ 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 Z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eeeeeeeeeeeeed(Zd)d* Z G d+d, d,Z!G d-d. d.e!Z"G d/d0 d0e!Z#G d1d2 d2e!Z$G d3d4 d4e!Z%G d5d6 d6e&Z'dS )7    )unicode_literalsN)FieldDoesNotExist)ModelQprefetch_related_objects) NullRelationshipValueEncounteredextract_field_valueget_model_fieldsort_by_fieldsc                    sd   t tr:jd u r& fdd}|S  fdd}|S n&t|  }| fdd}|S d S )Nc                    s,   zt |  }W n ty"   Y dS 0 |u S NFr   r   objZother_valueattribute_namevalue T/var/www/lab.imftr.de/x/nb_venv/lib/python3.9/site-packages/modelcluster/queryset.py_test   s
    ztest_exact.<locals>._testc                    sH   zt |  }W n ty"   Y dS 0 j|jkoFt|jpFt|jS r   )r   r   pk
isinstance	__class__r   r   r   r   r      s    
c                    s,   zt |  }W n ty"   Y dS 0 |kS r   r   r   )r   typed_valuer   r   r   .   s
    )r   r   r   r	   	to_python)modelr   r   r   fieldr   )r   r   r   r   
test_exact   s    




r   c                    sD   t |  }|d u r* fdd}n  fdd}|S )Nc                    s,   zt |  }W n ty"   Y dS 0 |d u S r   r   r   val)r   r   r   r   >   s
    ztest_iexact.<locals>._testc                    s8   zt |  }W n ty"   Y dS 0 |d uo6| kS r   r   r   upperr   r   match_valuer   r   r   G   s
    r	   r   r    )r   r   r"   r   r   r   r!   r   test_iexact8   s    

r$   c                    s&   t |  }|| fdd}|S )Nc                    s4   zt |  }W n ty"   Y dS 0 |d uo2|v S r   r   r   r!   r   r   r   U   s
    ztest_contains.<locals>._testr	   r   r   r   r   r   r   r   r!   r   test_containsQ   s    

r'   c                    s*   t |  }||  fdd}|S )Nc                    s8   zt |  }W n ty"   Y dS 0 |d uo6| v S r   r   r   r!   r   r   r   c   s
    ztest_icontains.<locals>._testr#   r&   r   r!   r   test_icontains_   s    
r(   c                    s&   t |  }|| fdd}|S )Nc                    s4   zt |  }W n ty"   Y dS 0 |d uo2|k S r   r   r   r!   r   r   r   q   s
    ztest_lt.<locals>._testr%   r&   r   r!   r   test_ltm   s    

r)   c                    s&   t |  }|| fdd}|S )Nc                    s4   zt |  }W n ty"   Y dS 0 |d uo2|kS r   r   r   r!   r   r   r      s
    ztest_lte.<locals>._testr%   r&   r   r!   r   test_lte{   s    

r*   c                    s&   t |  }|| fdd}|S )Nc                    s4   zt |  }W n ty"   Y dS 0 |d uo2|kS r   r   r   r!   r   r   r      s
    ztest_gt.<locals>._testr%   r&   r   r!   r   test_gt   s    

r+   c                    s&   t |  }|| fdd}|S )Nc                    s4   zt |  }W n ty"   Y dS 0 |d uo2|kS r   r   r   r!   r   r   r      s
    ztest_gte.<locals>._testr%   r&   r   r!   r   test_gte   s    

r,   c                    s2   t |  tfdd|D  fdd}|S )Nc                 3   s   | ]}  |V  qd S N)r   ).0r   )r   r   r   	<genexpr>       ztest_in.<locals>.<genexpr>c                    s,   zt |  }W n ty"   Y dS 0 |v S r   r   r   )r   match_valuesr   r   r      s
    ztest_in.<locals>._test)r	   set)r   r   Z
value_listr   r   )r   r   r1   r   test_in   s    
r3   c                    s&   t |  }|| fdd}|S )Nc                    s6   zt |  }W n ty"   Y dS 0 |d uo4|S r   )r   r   
startswithr   r!   r   r   r      s
    ztest_startswith.<locals>._testr%   r&   r   r!   r   test_startswith   s    

r5   c                    s*   t |  }||  fdd}|S )Nc                    s:   zt |  }W n ty"   Y dS 0 |d uo8| S r   )r   r   r    r4   r   r!   r   r   r      s
    ztest_istartswith.<locals>._testr#   r&   r   r!   r   test_istartswith   s    
r6   c                    s&   t |  }|| fdd}|S )Nc                    s6   zt |  }W n ty"   Y dS 0 |d uo4|S r   )r   r   endswithr   r!   r   r   r      s
    ztest_endswith.<locals>._testr%   r&   r   r!   r   test_endswith   s    

r8   c                    s*   t |  }||  fdd}|S )Nc                    s:   zt |  }W n ty"   Y dS 0 |d uo8| S r   )r   r   r    r7   r   r!   r   r   r      s
    ztest_iendswith.<locals>._testr#   r&   r   r!   r   test_iendswith   s    
r9   c                    s:   t |  }||d ||d  fdd}|S )Nr      c                    s<   zt |  }W n ty"   Y dS 0 |d uo:|ko:|kS r   r   r   r   Zend_valZ	start_valr   r   r      s
    ztest_range.<locals>._testr%   )r   r   Z	range_valr   r   r   r;   r   
test_range   s
    
r<   c                    s    fdd}|S )Nc                    s<   zt |  }W n ty"   Y dS 0 r0|d u S |d uS d S r   r   r   r   senser   r   r      s    ztest_isnull.<locals>._testr   )r   r   r>   r   r   r=   r   test_isnull   s    
r?   c                    s   t | fdd}|S )Nc                    s6   zt |  }W n ty"   Y dS 0 |d uo4|S r   r   r   searchr   r   regexr   r   r     s
    ztest_regex.<locals>._test)recompiler   r   Zregex_stringr   r   rB   r   
test_regex  s    
rG   c                    s    t |t j fdd}|S )Nc                    s6   zt |  }W n ty"   Y dS 0 |d uo4|S r   r@   r   rB   r   r   r     s
    ztest_iregex.<locals>._test)rD   rE   IrF   r   rB   r   test_iregex  s    rI   )exactZiexactcontainsZ	icontainsltZltegtZgteinr4   Zistartswithr7   Z	iendswithrangeZisnullrC   Ziregexc                 C   sh   zt | d| W n ty*   d}Y n0 d}|sN|d tv rNt|  }nt}d|}|| ||S )N__FT)r	   joinr   FILTER_EXPRESSION_TOKENSpopr   )r   key_clausesr   Zfield_match_foundconstructorr   r   r   r    _build_test_function_from_filter7  s    

rW   c                   @   s   e Zd Zdd ZdS )FakeQuerySetIterablec                 C   s
   || _ d S r-   )queryset)selfrY   r   r   r   __init__M  s    zFakeQuerySetIterable.__init__N)__name__
__module____qualname__r[   r   r   r   r   rX   L  s   rX   c                   @   s   e Zd Zdd ZdS )ModelIterablec                 c   s   | j jE d H  d S r-   )rY   resultsrZ   r   r   r   __iter__R  s    zModelIterable.__iter__Nr\   r]   r^   rb   r   r   r   r   r_   Q  s   r_   c                   @   s   e Zd Zdd ZdS )DictIterablec                 #   sD   | j jpdd | j jjjD }| j jD ]  fdd|D V  q&d S )Nc                 S   s   g | ]
}|j qS r   namer.   r   r   r   r   
<listcomp>X  r0   z)DictIterable.__iter__.<locals>.<listcomp>c              
      s    i | ]}|t  |d d d dqS TZpk_onlyZsuppress_fielddoesnotexistZ)suppress_nullrelationshipvalueencounteredr   r.   
field_namer   r   r   
<dictcomp>Z  s   z)DictIterable.__iter__.<locals>.<dictcomp>)rY   dict_fieldsr   _metafieldsr`   rZ   field_namesr   rn   r   rb   W  s
    
zDictIterable.__iter__Nrc   r   r   r   r   rd   V  s   rd   c                   @   s   e Zd Zdd ZdS )ValuesListIterablec                 #   sH   | j jpdd | j jjjD }| j jD ] t fdd|D V  q&d S )Nc                 S   s   g | ]
}|j qS r   re   rg   r   r   r   rh   b  r0   z/ValuesListIterable.__iter__.<locals>.<listcomp>c              	      s   g | ]}t  |d d d dqS ri   rk   rl   rn   r   r   rh   d  r0   )rY   tuple_fieldsr   rq   rr   r`   tuplers   r   rn   r   rb   a  s    zValuesListIterable.__iter__Nrc   r   r   r   r   ru   `  s   ru   c                   @   s   e Zd Zdd ZdS )FlatValuesListIterablec                 c   s2   | j jd }| j jD ]}t||ddddV  qd S )Nr   Trj   )rY   rv   r`   r   )rZ   rm   r   r   r   r   rb   h  s    zFlatValuesListIterable.__iter__Nrc   r   r   r   r   rx   g  s   rx   c                   @   s   e Zd Zdd Zdd Z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d Zdd Zdd Zdd Zdd Zd d! Zd"d# Zdd$d%d&Zd'd( Zd)d* Zd+d, Zd-d. ZeeeZd/d0 Zd1d2 Zd3d4 Zd5d6 Zd7d8 Zd9Z dS );FakeQuerySetc                 C   s"   || _ || _g | _g | _t| _d S r-   )r   r`   rp   rv   r_   iterable_class)rZ   r   r`   r   r   r   r[   o  s
    zFakeQuerySet.__init__c                 C   s   | S r-   r   ra   r   r   r   allv  s    zFakeQuerySet.allNc                 C   s6   t | j|d ur|n| j}| j|_| j|_| j|_|S r-   )ry   r   r`   rp   rv   rz   )rZ   r`   newr   r   r   	get_cloney  s
    zFakeQuerySet.get_clonec                    sj   j  g } fdd}jD ]B}t|tr>|| | q|\}}|t| j|d| q||S )Nc                    s    fdd}|S )Nc                    sr   d}t jkr&t fddD }n<t jkrHt fddD }nt fddD dk}jrn| S |S )NFc                    s   g | ]}| qS r   r   r.   testrn   r   r   rh     r0   zSFakeQuerySet.resolve_q_object.<locals>.test.<locals>.test_inner.<locals>.<listcomp>c                    s   g | ]}| qS r   r   r~   rn   r   r   rh     r0   c                    s   g | ]}| qS r   r   r~   rn   r   r   rh     r0   r:   )r   ANDr{   ORanysumZnegated)r   result)	connectorfiltersq_objectrn   r   
test_inner  s    

z?FakeQuerySet.resolve_q_object.<locals>.test.<locals>.test_innerr   )r   r   r   r   r   r   r     s    z+FakeQuerySet.resolve_q_object.<locals>.testrP   )	r   childrenr   r   appendresolve_q_objectrW   r   split)rZ   r   r   r   childrU   r   r   r   r   r     s    

zFakeQuerySet.resolve_q_objectc                 O   sN   g }|D ]}| | | q| D ]"\}}| t| j|d| q&|S )NrP   )r   r   itemsrW   r   r   )rZ   argskwargsr   r   keyr   r   r   r   _get_filters  s    zFakeQuerySet._get_filtersc                    s0   | j |i | | j fdd| jD d}|S )Nc                    s&   g | ] t  fd dD r qS )c                    s   g | ]}| qS r   r   r~   rn   r   r   rh     r0   z2FakeQuerySet.filter.<locals>.<listcomp>.<listcomp>r{   r.   r   rn   r   rh     s   z'FakeQuerySet.filter.<locals>.<listcomp>r`   r   r}   r`   rZ   r   r   cloner   r   r   filter  s
    
zFakeQuerySet.filterc                    s0   | j |i | | j fdd| jD d}|S )Nc                    s&   g | ] t  fd dD s qS )c                    s   g | ]}| qS r   r   r~   rn   r   r   rh     r0   z3FakeQuerySet.exclude.<locals>.<listcomp>.<listcomp>r   r   r   rn   r   rh     s   z(FakeQuerySet.exclude.<locals>.<listcomp>r   r   r   r   r   r   exclude  s
    
zFakeQuerySet.excludec                 O   sp   | j |i |}| }|dkr8| jd| jjj n4|dkrR|D ]
}|  S n| jd| jjj|f d S )Nr   z!%s matching query does not exist.r:   z2get() returned more than one %s -- it returned %s!)r   countr   ZDoesNotExistrq   Zobject_nameZMultipleObjectsReturned)rZ   r   r   r   Zresult_countr   r   r   r   get  s    
zFakeQuerySet.getc                 C   s
   t | jS r-   lenr`   ra   r   r   r   r     s    zFakeQuerySet.countc                 C   s
   t | jS r-   boolr`   ra   r   r   r   exists  s    zFakeQuerySet.existsc                 C   s   | D ]
}|  S d S r-   r   )rZ   r   r   r   r   first  s    zFakeQuerySet.firstc                 C   s,   | j r(| jt| j d}|D ]
}|  S d S Nr   )r`   r}   reversed)rZ   r   r   r   r   r   last  s    zFakeQuerySet.lastc                 G   s   | S r-   r   rZ   r   r   r   r   select_related  s    zFakeQuerySet.select_relatedc                 G   s   t | jg|R   | S r-   )r   r`   r   r   r   r   prefetch_related  s    zFakeQuerySet.prefetch_relatedc                 G   s   | S r-   r   r   r   r   r   only  s    zFakeQuerySet.onlyc                 G   s   | S r-   r   r   r   r   r   defer  s    zFakeQuerySet.deferc                 G   s.   |   }||_|D ]}t| j| qt|_|S r-   )r}   rp   r	   r   rd   rz   )rZ   rr   r   fr   r   r   values  s    zFakeQuerySet.values)flatc                G   sN   |   }||_|D ]}t| j| q|rDt|dkr<tdt|_nt|_|S )Nr:   zH'flat' is not valid when values_list is called with more than one field.)	r}   rv   r	   r   r   	TypeErrorrx   rz   ru   )rZ   r   rr   r   r   r   r   r   values_list  s    zFakeQuerySet.values_listc                 G   s&   | j | jd d  d}t|j| |S r   )r}   r`   r
   )rZ   rr   r   r   r   r   order_by  s    zFakeQuerySet.order_byc                    sl   g }|sdd | j jjD }t }| jD ]6 t fdd|D }||vr(|| |  q(| j|dS )Nc                 S   s   g | ]}|j s|jqS r   )Zprimary_keyrf   rg   r   r   r   rh   	  r0   z)FakeQuerySet.distinct.<locals>.<listcomp>c                 3   s   | ]}t t |V  qd S r-   )strr   rg   r   r   r   r/     r0   z(FakeQuerySet.distinct.<locals>.<genexpr>r   )	r   rq   rr   r2   r`   rw   addr   r}   )rZ   rr   Zunique_resultsZ	seen_keysr   r   r   r   distinct  s    

zFakeQuerySet.distinctc                 C   s   | j S r-   r   ra   r   r   r   _get_result_cache  s    zFakeQuerySet._get_result_cachec                 C   s   t || _d S r-   )listr`   )rZ   r   r   r   r   _set_result_cache  s    zFakeQuerySet._set_result_cachec                 C   s
   | j | S r-   r   )rZ   kr   r   r   __getitem__  s    zFakeQuerySet.__getitem__c                 c   s   |  | }|E d H  d S r-   )rz   )rZ   iteratorr   r   r   rb   !  s    
zFakeQuerySet.__iter__c                 C   s
   t | jS r-   r   ra   r   r   r   __nonzero__%  s    zFakeQuerySet.__nonzero__c                 C   s   t t| S r-   )reprr   ra   r   r   r   __repr__(  s    zFakeQuerySet.__repr__c                 C   s
   t | jS r-   r   ra   r   r   r   __len__+  s    zFakeQuerySet.__len__T)N)!r\   r]   r^   r[   r{   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   propertyZ_result_cacher   rb   r   r   r   Zorderedr   r   r   r   ry   n  s:   
			
ry   )(
__future__r   rD   Zdjango.core.exceptionsr   Zdjango.db.modelsr   r   r   Zmodelcluster.utilsr   r   r	   r
   r   r$   r'   r(   r)   r*   r+   r,   r3   r5   r6   r8   r9   r<   r?   rG   rI   rS   rW   rX   r_   rd   ru   rx   objectry   r   r   r   r   <module>   s\   ,
