
    f5                        d dl 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
 d dlmZmZ d dlmZ  G d d	e          Z G d
 d          Z G d dee          Z G d d          Z G d deej                  Z G d d          Z G d deej                  Z G d d          Z G d dee          Z G d d          Z G d deej                  Z G d dej                  Z G d  d!          Z G d" d#eej                  ZdS )$    N)ObjectDoesNotExist)
connectionmodels)
LOOKUP_SEP)OneToOneFieldOneToOneRel)ModelIterableQuerySet)Joinc                       e Zd Zd ZdS )InheritanceIterablec           
   #     K   | j         }t          |          }t          |dd          rt          |j        j                                                  }t          |j        t          d          }|D ]}d }|D ]}|
                    ||          }|r n|s|}t          |dd          r)|j        D ]!}t          ||t          ||                     "|D ]!}t          ||t          ||                     "|V  d S |E d {V  d S )N
subclassesFT)keyreverse
_annotated)querysetr	   getattrtuplequeryextrakeyssortedr   len_get_sub_obj_recurser   setattr)	selfr   iterextrasr   objsub_objsks	            J/var/www/equiseq/venv/lib/python3.11/site-packages/model_utils/managers.py__iter__zInheritanceIterable.__iter__   sW     =X&&8\511 	8>/446677F   3dKKKJ  #  A&;;CCCG  "!G8\599 =%0 = =GCOO<<<< 9 9AGQQ8888! $ OOOOOOOOO    N)__name__
__module____qualname__r%    r&   r$   r   r      s#            r&   r   c                   `     e Zd Z fdZd Z fdZd fd	Z fdZddZdd	Z	d
 Z
d Z xZS )InheritanceQuerySetMixinc                 R     t                      j        |i | t          | _        d S N)super__init__r   _iterable_classr   argskwargs	__class__s      r$   r0   z!InheritanceQuerySetMixin.__init__*   s-    $)&)))2r&   c           	         d }|                      | j        |          }|s|}ng }|D ]}|| j        u rt          |t          f          s|                     ||          }||v r|                    |           St          d                    |d                    |                              |}|r | j	        | }n| }||_
        |S )Nlevelsz3{!r} is not in the discovered subclasses, tried: {}z, )_get_subclasses_recursemodel
isinstancestr_get_ancestors_pathappend
ValueErrorformatjoinselect_relatedr   )r   r   r8   calculated_subclassesverified_subclassessubclassnew_qss          r$   select_subclassesz*InheritanceQuerySetMixin.select_subclasses.   s$    $ < <Jv != !' !'  	-.JJ"$&   tz))!(SF33 1#77   8  1  1H 444'..x8888$MTT$dii0E&F&FH H   -J 	(T(*5FFF&r&   c                     i }dD ]%}t          | |          rt          | |          ||<   & t                      j        di |}|j                            |           |S )Nr   r   r*   )hasattrr   r/   _chain__dict__update)r   r4   rM   namechainedr5   s        r$   rK   zInheritanceQuerySetMixin._chainR   st    0 	3 	3DtT"" 3&tT22t %''.**6**'''r&   NFc           	          t                                                      }dD ]1}t          | |          rt          ||t	          | |                     2|S )NrI   )r/   _clonerJ   r   r   )r   klasssetupr4   qsrN   r5   s         r$   rQ   zInheritanceQuerySetMixin._clone\   sY    WW^^0 	7 	7DtT"" 7D'$"5"5666	r&   c                      t                      j        |i |}d |D             t          |                                          z   |_        |S )Nc                     g | ]	}|j         
S r*   )default_alias).0as     r$   
<listcomp>z5InheritanceQuerySetMixin.annotate.<locals>.<listcomp>e   s    999q1?999r&   )r/   annotatelistr   r   )r   r3   r4   qsetr5   s       r$   r[   z!InheritanceQuerySetMixin.annotatec   sM    uww00099D999D<O<OOr&   c                    d j                                         D             }fd|D             }g }|r|dz  }|D ]}|s|V|                     |j        j        |          D ]4}|                    |                                t          z   |z              5|                    |                                           |S )z
        Given a Model class, find all related objects, exploring children
        recursively, returning a `list` of strings representing the
        relations for select_related
        c                 <    g | ]}t          |t                    |S r*   )r;   r   )rX   fs     r$   rZ   zDInheritanceQuerySetMixin._get_subclasses_recurse.<locals>.<listcomp>n   s8     + + +![))++ + +r&   c                     g | ]M}t          |j        t                    r1t          |j        j                  r|j        j        uD|j        K|NS r*   )r;   fieldr   
issubclassr:   parent_link)rX   relr:   s     r$   rZ   zDInheritanceQuerySetMixin._get_subclasses_recurse.<locals>.<listcomp>r   sl     
 
 
#)]33
 39?E22
 SY_,, -  -,,r&      Nr7   )_meta
get_fieldsr9   rb   r:   r>   get_accessor_namer   )r   r:   r8   related_objectsrelsr   re   rE   s    `      r$   r9   z0InheritanceQuerySetMixin._get_subclasses_recurseh   s   + +{--//+ + +
 
 
 
*
 
 
 
 	aKF 	7 	7C I $ < <	 != !8 !8 I IH%%--//*<xGI I I Ic33556666r&   c                    t          || j                  st          |d| j                  g }|j                            | j                  }|r|dz  }|^|j        }|                    d|                                           |s|'|j        }|j                            | j                  }nd}|^t          j	        |          S )z
        Serves as an opposite to _get_subclasses_recurse, instead walking from
        the Model class up the Model's ancestry and constructing the desired
        select_related string backwards.
        z is not a subclass of rf   Nr   )
rc   r:   r?   rg   get_ancestor_linkremote_fieldinsertri   r   rA   )r   r:   r8   ancestryrd   relatedparent_models          r$   r=   z,InheritanceQuerySetMixin._get_ancestors_path   s     %,, 	B@@$*@@B B B k33DJ?? 	aKF%!.GOOAw88::;;; #&}*0BBJ    # % x(((r&   c                     |                     t                    \  }}}	 t          ||          }n# t          $ r Y d S w xY w|r|                     ||          }|S |S r.   )	partitionr   r   r   r   )r   r    r"   re   _nodechilds          r$   r   z-InheritanceQuerySetMixin._get_sub_obj_recurse   sx    KK
++	Q	3$$DD! 	 	 	44	 	--dA66ELKs   1 
??c                 @     |                                  j        |i |S r.   )rG   getr   r3   r4   s      r$   get_subclassz%InheritanceQuerySetMixin.get_subclass   s&    +t%%''+T<V<<<r&   )NFr.   )r'   r(   r)   r0   rG   rK   rQ   r[   r9   r=   r   r{   __classcell__r5   s   @r$   r,   r,   )   s        3 3 3 3 3" " "H             
   <) ) ) )4  = = = = = = =r&   r,   c                       e Zd Zd ZdS )InheritanceQuerySetc           	      "   g }|D ]X|                     dd                    fdj        j                                        D                       z   dz              Y | j        |                     d                    |          g          S )zQ
        Fetch only objects that are instances of the provided model(s).
        (z AND c                 Z    g | ]'}d                      j        j        |j                  (S )z"{}"."{}" IS NOT NULL)r@   rg   db_tableattname)rX   rb   r:   s     r$   rZ   z3InheritanceQuerySet.instance_of.<locals>.<listcomp>   sH     5 5 5  (..K(M 5 5 5r&   )z OR )where)r>   rA   rg   parentsvaluesrG   r   )r   r   where_queriesr:   s      @r$   instance_ofzInheritanceQuerySet.instance_of   s      	 	E  w|| 5 5 5 5  %{299;;	5 5 5 ( ( "
 "     &t%v.44FKK<V<V;W4XXXr&   N)r'   r(   r)   r   r*   r&   r$   r   r      s(        Y Y Y Y Yr&   r   c                   *    e Zd ZeZd Zd Zd Zd ZdS )InheritanceManagerMixinc                 6    |                      | j                  S r.   )_queryset_classr:   r   s    r$   get_querysetz$InheritanceManagerMixin.get_queryset   s    ##DJ///r&   c                 :     |                                  j        | S r.   )r   rG   )r   r   s     r$   rG   z)InheritanceManagerMixin.select_subclasses   s    4t  ""4jAAr&   c                 @     |                                  j        |i |S r.   )r   r{   rz   s      r$   r{   z$InheritanceManagerMixin.get_subclass   s&    /t  ""/@@@@r&   c                 :     |                                  j        | S r.   )r   r   )r   r   s     r$   r   z#InheritanceManagerMixin.instance_of   s    .t  "".77r&   N)	r'   r(   r)   r   r   r   rG   r{   r   r*   r&   r$   r   r      s[        )O0 0 0B B BA A A8 8 8 8 8r&   r   c                       e Zd ZdS )InheritanceManagerNr'   r(   r)   r*   r&   r$   r   r              Dr&   r   c                   .     e Zd Z fdZd Z fdZ xZS )QueryManagerMixinc                     |r|d         | _         nt          j        di || _         d | _        t	                                                       d S )Nr   r*   )_qr   Q	_order_byr/   r0   r2   s      r$   r0   zQueryManagerMixin.__init__   sR     	)1gDGGh((((DGr&   c                     || _         | S r.   )r   )r   r3   s     r$   order_byzQueryManagerMixin.order_by   s    r&   c                     t                                                                          | j                  }| j         |j        | j         S |S r.   )r/   r   filterr   r   r   )r   rT   r5   s     r$   r   zQueryManagerMixin.get_queryset   sF    WW!!##**4733>%2;//	r&   )r'   r(   r)   r0   r   r   r|   r}   s   @r$   r   r      s`                      r&   r   c                       e Zd ZdS )QueryManagerNr   r*   r&   r$   r   r      r   r&   r   c                       e Zd ZdZd ZdS )SoftDeletableQuerySetMixinzr
    QuerySet for SoftDeletableModel. Instead of removing instance sets
    its ``is_removed`` field to True.
    c                 2    |                      d           dS )zd
        Soft delete objects from queryset (set their ``is_removed``
        field to True)
        T
is_removedN)rM   r   s    r$   deletez!SoftDeletableQuerySetMixin.delete   s    
 	t$$$$$r&   N)r'   r(   r)   __doc__r   r*   r&   r$   r   r      s-         
% % % % %r&   r   c                       e Zd ZdS )SoftDeletableQuerySetNr   r*   r&   r$   r   r     r   r&   r   c                   2     e Zd ZdZeZdd fd
Zd Z xZS )SoftDeletableManagerMixinzf
    Manager that limits the queryset by default to show only not removed
    instances of model.
    F)_emit_deprecation_warningsc                H    || _          t                      j        |i | d S r.   )emit_deprecation_warningsr/   r0   )r   r   r3   r4   r5   s       r$   r0   z"SoftDeletableManagerMixin.__init__  s-    )C&$)&)))))r&   c                     | j         r>d                    | j        j        j                  }t          j        |t                     | j        | j        d}t          | d          r
| j
        |d<    | j        di |                    d          S )zA
        Return queryset limited to not removed entries.
        a  {0}.objects model manager will include soft-deleted objects in an upcoming release; please use {0}.available_objects to continue excluding soft-deleted objects. See https://django-model-utils.readthedocs.io/en/stable/models.html#softdeletablemodel for more information.r:   using_hintshintsFr   r*   )r   r@   r:   r5   r'   warningswarnDeprecationWarning_dbrJ   r   r   r   )r   warning_messager4   s      r$   r   z&SoftDeletableManagerMixin.get_queryset  s    
 ) 	?<
 fTZ)233  M/+=>>>:994"" 	*"kF7O#t#--f--444FFFr&   )	r'   r(   r)   r   r   r   r0   r   r|   r}   s   @r$   r   r     sl          ,O9> * * * * * * *G G G G G G Gr&   r   c                       e Zd ZdS )SoftDeletableManagerNr   r*   r&   r$   r   r   ,  r   r&   r   c                       e Zd Zd ZddZdS )JoinQuerysetc                 p    |                                 \  }}d |D             }t          |          }||z  S )Nc                 H    g | ]}t          |t                    rd | d n| S )')r;   r<   )rX   ps     r$   rZ   z1JoinQueryset.get_quoted_query.<locals>.<listcomp>6  sH     
 
 
  !S!!)JJJJJ'(
 
 
r&   )sql_with_paramsr   )r   r   paramss      r$   get_quoted_queryzJoinQueryset.get_quoted_query2  sN    --//v
 
 
 
 
 vv~r&   Nc                     d|r fd|j         j        j        D             }|r|d         nd} j         j                                         d}|pt          |j         |d          }|st          d          	 |j        n# t          $ r d|j	        j        Y nw xY w|
                              } }n5d 
                              } j         j                                        }d                     |j                  }d                    t!          |          	          }t#          j                    5 }|                    |           ddd           n# 1 swxY w Y    G  fd
dt(          j                  }	t-          |	j        j        |j                                        dd j         j        j        d          }
|j                            |
d           |S )a  
        Join one queryset together with another using a temporary table. If
        no queryset is used, it will use the current queryset and join that
        to itself.

        `Join` either uses the current queryset and effectively does a self-join to
        create a new limited queryset OR it uses a queryset given by the user.

        The model of a given queryset needs to contain a valid foreign key to
        the current queryset to perform a join. A new queryset is then created.
        idc                 H    g | ]}t          |d d          j        k    |S )related_modelN)r   r:   )rX   fkr   s     r$   rZ   z%JoinQueryset.join.<locals>.<listcomp>P  s<       255CC CCCr&   r   N_setz(QuerySet is not related to current model
temp_stuffz
            DROP TABLE IF EXISTS {table_name};
            DROP INDEX IF EXISTS {table_name}_id;
            CREATE TEMPORARY TABLE {table_name} AS {query};
            CREATE INDEX {table_name}_{fk_column} ON {table_name} ({fk_column});
        )
table_name	fk_columnr   c                   j    e Zd Z ej        j        ej                  Z G  fdd          ZdS )$JoinQueryset.join.<locals>.TempModel)	on_delete	db_columnto_fieldc                       e Zd ZdZ ZdS ))JoinQueryset.join.<locals>.TempModel.MetaFN)r'   r(   r)   managedr   )
TABLE_NAMEs   r$   Metar   }  s        %r&   r   N)	r'   r(   r)   r   
ForeignKeyr:   
DO_NOTHINGtemp_keyr   )r   r   r   r   s   r$   	TempModelr   u  sq        (v(
 +#!	  H& & & & & & & & & & & &r&   r   z
INNER JOINF)r   parent_aliastable_alias	join_type
join_fieldnullable)reuse)r:   rg   fieldsr'   lowerr   r?   columnAttributeErrorrb   onlyobjectsallr   r   r@   r<   r   cursorexecuter   Modelr   r   get_initial_aliastempmodel_setre   rA   )r   rT   r   	model_setr   rF   r   sqlr   r   connr   r   r   s   `          @@@r$   rA   zJoinQueryset.joinA  s     	.   X^2  B &A$B:.4466<<<I:)T::C M !KLLL,J		! , , , 	9+, ##BFFI9%%BZ'++--F!
%%bh//
 FjISZZFPP 	    	 FNN3	  	  	  	  	  	  	  	  	  	  	  	  	  	  	 
	& 
	& 
	& 
	& 
	& 
	& 
	& 
	& 
	& 
	& 
	& 
	& 
	&  /7799"z/3
 
 
 	$d+++s$   =B B B E&&E*-E*r.   )r'   r(   r)   r   rA   r*   r&   r$   r   r   0  s=          I I I I I Ir&   r   c                       e Zd ZdZeZd ZdS )JoinManagerMixinze
    Manager that adds a method join. This method allows you to join two
    querysets together.
    c                 D    |                      | j        | j                  S )Nr   )r   r:   r   r   s    r$   r   zJoinManagerMixin.get_queryset  s    ##$*DH#EEEr&   N)r'   r(   r)   r   r   r   r   r*   r&   r$   r   r     s9          #OF F F F Fr&   r   c                       e Zd ZdS )JoinManagerNr   r*   r&   r$   r   r     r   r&   r   )r   django.core.exceptionsr   	django.dbr   r   django.db.models.constantsr   django.db.models.fields.relatedr   r   django.db.models.queryr	   r
   #django.db.models.sql.datastructuresr   r   r,   r   r   Managerr   r   r   r   r   r   r   r   r   r   r*   r&   r$   <module>r      s    5 5 5 5 5 5 ( ( ( ( ( ( ( ( 1 1 1 1 1 1 F F F F F F F F : : : : : : : : 4 4 4 4 4 4    -   <E= E= E= E= E= E= E= E=PY Y Y Y Y2H Y Y Y68 8 8 8 8 8 8 8 	 	 	 	 	0&. 	 	 	       *	 	 	 	 	$fn 	 	 	% % % % % % % %	 	 	 	 	6 	 	 	G G G G G G G GB	 	 	 	 	4fn 	 	 	Z Z Z Z Z6? Z Z ZzF F F F F F F F	 	 	 	 	"FN 	 	 	 	 	r&   