
    NwgG                       d dl mZ d dlZd dlmZmZmZmZmZm	Z	m
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  ed
ej4                  d      Zerd dlmZ d dlmZ d-dZer G d dee         Z n G d de      Z  G d dee         Z! G d de!e   ee         Z" G d dee         Z# G d de#e   ejH                  e         Z% G d dee         Z& G d de&e   ejH                  e         Z' G d d ee         Z( G d! d"e(e   ee         Z) G d# d$ee         Z* G d% d&e*e   ejH                  e         Z+ G d' d(ej.                  e         Z,es G d) d*      Z- G d+ d,e-      Z.yy).    )annotationsN)TYPE_CHECKINGAnyGenericSequenceTypeVarcastoverload)ObjectDoesNotExist)
connectionmodels)
LOOKUP_SEP)OneToOneFieldOneToOneRel)ModelIterableQuerySet)JoinModelTT)bound	covariant)Iterator)BaseIterablec           
   #    K   t        |       }t        | d      rt        | d      sJ t        | j                  j                  j                               }t        | j                  t        d      }|D ]{  }d }|D ]  }| j                  ||      }|s n |s|}t        | d      r(| j                  D ]  }t        ||t        ||              |D ]  }t        ||t        ||              | } y |E d {    y 7 w)N
subclasses_get_sub_obj_recurseT)keyreverse
_annotated)r   hasattrtuplequeryextrakeyssortedr   lenr   r   setattrgetattr)querysetiterextrasr   objsub_objsks           K/var/www/horilla/myenv/lib/python3.12/site-packages/model_utils/managers.py_iter_inheritance_querysetr0      s    "/"9Dx&x!7888x~~++0023 H//S$G
 	CG "77Q? x.!,, 9AGQQ89  5GCO45 M!	$ s   BC?A%C?7C=8C?c                  (    e Zd ZU ded<   ddZddZy)InheritanceIterableQuerySet[ModelT]r(   c                     y N )selfr(   argskwargss       r/   __init__zInheritanceIterable.__init__6           c                     y r5   r6   r7   s    r/   __iter__zInheritanceIterable.__iter__9   r;   r<   N)r(   r3   r8   r   r9   r   )returnIterator[ModelT])__name__
__module____qualname____annotations__r:   r?   r6   r<   r/   r2   r2   3   s    ""		r<   r2   c                      e Zd Zd Zy)r2   c                ,    t        | j                        S r5   )r0   r(   r>   s    r/   r?   zInheritanceIterable.__iter__>   s    -dmm<<r<   N)rB   rC   rD   r?   r6   r<   r/   r2   r2   =   s    	=r<   c                       e Zd ZU ded<   ded<   d fdZddZd fdZd fdZd fd	Zdd
Z	ddZ
ddZddZ xZS )InheritanceQuerySetMixintype[ModelT]modelSequence[str]r   c                :    t        |   |i | t        | _        y r5   )superr:   r2   _iterable_classr7   r8   r9   	__class__s      r/   r:   z!InheritanceQuerySetMixin.__init__G   s    $)&);Nr<   c           	     r   | j                   }| j                  |      }|s|}npg }|D ]g  }||u rt        |t              s| j	                  |      }||v r|j                  |       ?t        dj                  |dj                  |                   |}t        d|       }|r |j                  | }||_        |S )Nz3{!r} is not in the discovered subclasses, tried: {}z, InheritanceQuerySet[ModelT])rK   _get_subclasses_recurse
isinstancestr_get_ancestors_pathappend
ValueErrorformatjoinr	   select_relatedr   )r7   r   rK   calculated_subclassesselected_subclassesverified_subclassessubclassnew_qss           r/   select_subclassesz*InheritanceQuerySetMixin.select_subclassesK   s    "jj $ < <U C"7-/&  u$!(C0#77AH44'..x8$MTT$dii0E&FH " #63T:*V**,?@F/r<   c                    i }dD ]  }t        | |      st        | |      ||<     t        |   di |}|j                  j                  |       |S )Nr   r   r6   )r   r'   rN   _chain__dict__update)r7   r9   rg   namechainedrQ   s        r/   re   zInheritanceQuerySetMixin._chainl   s]    0 	3DtT"&tT2t	3
 '.*6*'r<   c           	     z    t         |          }dD ]&  }t        | |      st        ||t	        | |             ( |S )Nrd   )rN   _cloner   r&   r'   )r7   qsrh   rQ   s      r/   rk   zInheritanceQuerySetMixin._clonew   sB    W^0 	7DtT"D'$"56	7 	r<   c                     t        t        t           t                     j                  |i |}|D cg c]  }|j
                   c}t        |j                               z   |_        |S c c}w r5   )	r	   r   r   rN   annotatedefault_aliaslistr#   r   )r7   r8   r9   qsetarQ   s        r/   rn   z!InheritanceQuerySetMixin.annotate   sX    7tHV$eg.77HH489q1??9D<OO :s   A,c                X   |j                   j                         D cg c]  }t        |t              r| }}|D cg c]b  }t        |j                  t
              rFt        |j                  j                  |      r&||j                  j                  ur|j                  r|d }}g }|D ]t  }| j                  |j                  j                        D ]+  }|j                  |j                         t        z   |z          - |j                  |j                                v |S c c}w c c}w )z
        Given a Model class, find all related objects, exploring children
        recursively, returning a `list` of strings representing the
        relations for select_related
        )_meta
get_fieldsrU   r   fieldr   
issubclassrK   parent_linkrT   rX   get_accessor_namer   )r7   rK   frelated_objectsrelrelsr   r`   s           r/   rT   z0InheritanceQuerySetMixin._get_subclasses_recurse   s    {{--/+![) + +
 +
#))]3399??E2SYY__,	 
 
 
 	7C 88I S!!#"7"7"9J"F"QRSc3356	7 %+
s   D"A'D'c                   t        || j                        st        |d| j                        g }|j                  j	                  | j                        }|`|j
                  }|j                  d|j                                |j                  }|j                  j	                  | j                        }|`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 r   )
rw   rK   rY   rt   get_ancestor_linkremote_fieldinsertry   r   r[   )r7   rK   ancestryrx   relatedparent_models         r/   rW   z,InheritanceQuerySetMixin._get_ancestors_path   s     %,)1$**@B B !kk33DJJ?%!..GOOAw88:;"==L&,,>>tzzJK % x((r<   c                    |j                  t              \  }}}	 t        ||      }|r| j	                  ||      }|S |S # t        $ r Y y w xY wr5   )	partitionr   r'   r   r   )r7   r+   r-   r|   _nodechilds          r/   r   z-InheritanceQuerySetMixin._get_sub_obj_recurse   s\    KK
+	Q	3$D --dA6ELK " 		s   ? 	A
Ac                B     | j                         j                  |i |S r5   )rb   getr7   r8   r9   s      r/   get_subclassz%InheritanceQuerySetMixin.get_subclass   s#    +t%%'++T<V<<r<   )r8   objectr9   r   r   zstr | type[models.Model]r@   rS   )r9   r   r@   rS   r@   rS   r8   r   r9   r   r@   rS   )rK   type[models.Model]r@   z	list[str])rK   r   r@   rV   )r+   zmodels.Modelr-   rV   r@   zModelT | Noner8   r   r9   r   r@   r   )rB   rC   rD   rE   r:   rb   re   rk   rn   rT   rW   r   r   __classcell__rQ   s   @r/   rI   rI   B   s>    OB	
4).=r<   rI   c                      e Zd ZddZy)InheritanceQuerySetc                   g }|D ]  }|j                  ddj                  |j                  j                  j	                         D cg c]2  }dj                  |j                  j                  |j                        4 c}      z   dz           t        d | j                  | j                  dj                  |      g            S c c}w )zQ
        Fetch only objects that are instances of the provided model(s).
        (z AND z"{}"."{}" IS NOT NULL)rS   z OR )where)rX   r[   rt   parentsvaluesrZ   db_tablecolumnr	   rb   r"   )r7   r   where_queriesrK   rv   s        r/   instance_ofzInheritanceQuerySet.instance_of   s      	E  w||  %{{2299;	5  (..KK((LL5 ( "
 " 	 )"D""F+11]9S8T1U
 	
5s   7CNr   rJ   r@   rS   )rB   rC   rD   r   r6   r<   r/   r   r      s    
r<   r   c                  ,   e Zd ZeZerxddlm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$dZd%dZd&dZddZd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y).InheritanceManagerMixinr   )r   c                     y r5   r6   r>   s    r/   nonezInheritanceManagerMixin.none   r;   r<   c                     y r5   r6   r>   s    r/   allzInheritanceManagerMixin.all   r;   r<   c                     y r5   r6   r   s      r/   filterzInheritanceManagerMixin.filter   r;   r<   c                     y r5   r6   r   s      r/   excludezInheritanceManagerMixin.exclude   r;   r<   c                     y r5   r6   )r7   
filter_objs     r/   complex_filterz&InheritanceManagerMixin.complex_filter   r;   r<   .)r   c                    y r5   r6   )r7   r   other_qss      r/   unionzInheritanceManagerMixin.union   r;   r<   c                     y r5   r6   r7   r   s     r/   intersectionz$InheritanceManagerMixin.intersection   r;   r<   c                     y r5   r6   r   s     r/   
differencez"InheritanceManagerMixin.difference  r;   r<   c                     y r5   r6   )r7   nowaitskip_lockedofno_keys        r/   select_for_updatez)InheritanceManagerMixin.select_for_update  s     r<   c                     y r5   r6   r7   fieldss     r/   r\   z&InheritanceManagerMixin.select_related	  r;   r<   c                     y r5   r6   )r7   lookupss     r/   prefetch_relatedz(InheritanceManagerMixin.prefetch_related  r;   r<   c                     y r5   r6   r   s      r/   rn   z InheritanceManagerMixin.annotate  r;   r<   c                     y r5   r6   r   s      r/   aliaszInheritanceManagerMixin.alias  r;   r<   c                     y r5   r6   r7   field_namess     r/   order_byz InheritanceManagerMixin.order_by  r;   r<   c                     y r5   r6   r   s     r/   distinctz InheritanceManagerMixin.distinct  r;   r<   c                     y r5   r6   )r7   selectr   paramstablesr   select_paramss          r/   r"   zInheritanceManagerMixin.extra  s     r<   c                     y r5   r6   r>   s    r/   r   zInheritanceManagerMixin.reverse&  r;   r<   c                     y r5   r6   r   s     r/   deferzInheritanceManagerMixin.defer)  r;   r<   c                     y r5   r6   r   s     r/   onlyzInheritanceManagerMixin.only,  r;   r<   c                     y r5   r6   )r7   r   s     r/   usingzInheritanceManagerMixin.using/  r;   r<   c                <    | j                   }| j                  |      S r5   )rK   _queryset_class)r7   rK   s     r/   get_querysetz$InheritanceManagerMixin.get_queryset2  s    "jj##E**r<   c                <     | j                         j                  | S r5   )r   rb   )r7   r   s     r/   rb   z)InheritanceManagerMixin.select_subclasses6  s      5t  "44jAAr<   c                B     | j                         j                  |i |S r5   )r   r   r   s      r/   r   z$InheritanceManagerMixin.get_subclass;  s#    /t  "//@@@r<   c                <     | j                         j                  | S r5   )r   r   )r7   r   s     r/   r   z#InheritanceManagerMixin.instance_of>  s    .t  "..77r<   Nr   r   )r   r   r@   rS   )r   r   r   boolr@   rS   )r   r   r@   rS   )....)
r   r   r   r   r   rL   r   r   r@   rS   )r   r   r@   rS   )r   r   r@   rS   )r   r   r@   rS   )......)r   zdict[str, Any] | Noner   list[str] | Noner   zlist[Any] | Noner   r   r   zSequence[str] | Noner   zSequence[Any] | Noner@   zInheritanceQuerySet[Any])r   
str | Noner@   rS   r   r   r   ) rB   rC   rD   r   r   r   collections.abcr   r   r   r   r   r   r   r   r   r   r\   r   rn   r   r   r   r"   r   r   r   r   r   rb   r   r   r6   r<   r/   r   r      s%   )O,					 58 			 hk		37	CP	`d	(	
						
 -0&)'*'*-025		)		 $		 %			
 %		 +		 0		 &						+B3B	$B
A8r<   r   c                      e Zd Zy)InheritanceManagerNrB   rC   rD   r6   r<   r/   r   r   B      r<   r   c                  X     e Zd Zedd       Zedd       Zd fdZd	dZd
 fdZ xZS )QueryManagerMixinc                     y r5   r6   r7   r8   s     r/   r:   zQueryManagerMixin.__init__H      r<   c                     y r5   r6   )r7   r9   s     r/   r:   zQueryManagerMixin.__init__L  r   r<   c                ~    |r|d   | _         nt        j                  di || _         d | _        t        |           y )Nr   r6   )_qr   Q	_order_byrN   r:   rP   s      r/   r:   zQueryManagerMixin.__init__P  s6    1gDGhh((DG15r<   c                (    || _         t        d|       S )NQueryManager[ModelT])r   r	   r   s     r/   r   zQueryManagerMixin.order_byX  s    *D11r<   c                    t         |          }|j                  | j                        }| j                   |j
                  | j                   S |S r5   )rN   r   r   r   r   r   )r7   rl   rQ   s     r/   r   zQueryManagerMixin.get_queryset\  sF    W!#YYtww>>%2;;//	r<   )r8   models.Q)r9   r   )r8   r   r9   r   )r8   r   r@   r   )r@   r3   )rB   rC   rD   r
   r:   r   r   r   r   s   @r/   r   r   F  s=       2 r<   r   c                      e Zd Zy)QueryManagerNr   r6   r<   r/   r   r   d  r   r<   r   c                      e Zd ZdZddZy)SoftDeletableQuerySetMixinzr
    QuerySet for SoftDeletableModel. Instead of removing instance sets
    its ``is_removed`` field to True.
    c                    | j                   }t        t        t           |       j	                  d      }||j
                  j                  |ifS )zd
        Soft delete objects from queryset (set their ``is_removed``
        field to True)
        T
is_removed)rK   r	   r   r   rg   rt   label)r7   rK   number_of_deleted_objectss      r/   deletez!SoftDeletableQuerySetMixin.deleten  sI    
 #jj$(&)94$@$G$GSW$G$X!(5;;+<+<>W*XXXr<   N)r@   ztuple[int, dict[str, int]])rB   rC   rD   __doc__r   r6   r<   r/   r   r   h  s    
Yr<   r   c                      e Zd Zy)SoftDeletableQuerySetNr   r6   r<   r/   r  r  x  r   r<   r  c                  L     e Zd ZU dZeZded<   dd	 	 	 	 	 d fdZd	dZ xZ	S )
SoftDeletableManagerMixinzf
    Manager that limits the queryset by default to show only not removed
    instances of model.
    r   _dbF)_emit_deprecation_warningsc               2    || _         t        |   |i | y r5   )emit_deprecation_warningsrN   r:   )r7   r  r8   r9   rQ   s       r/   r:   z"SoftDeletableManagerMixin.__init__  s      *D&$)&)r<   c                B   | j                   }| j                  r?dj                  |j                  j                        }t        j                  |t                | j                  d|| j                  dt        | d      rd| j                  ini j                  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.rK   r   _hintshintsFr   r6   )rK   r  rZ   rQ   rB   warningswarnDeprecationWarningr   r  r   r
  r   )r7   rK   warning_messages      r/   r   z&SoftDeletableManagerMixin.get_queryset  s    
 #jj))<
 fU__--.  MM/+=>#t## 
((
 *1x)@%b
 &E&
"		#r<   )r8   r   r  r   r9   r   )r@   zSoftDeletableQuerySet[ModelT])
rB   rC   rD   r   r  r   rE   r:   r   r   r   s   @r/   r  r  |  s?     ,O	O
 ,1** %)* 	*#r<   r  c                      e Zd Zy)SoftDeletableManagerNr   r6   r<   r/   r  r    r   r<   r  c                      e Zd ZdddZy)JoinQuerysetNc                x    d|r|j                   j                  j                  D cg c]  }t        |dd       j                   k(  r|  }}|r|d   nd} j                   j                  j                          d}|xs t        |j                   |d      }|st        d      	 |j                  |j                        } }n7d j                        } j                   j                  j                         }d|j                  j                         \  }}dj                  t!        |      	      }	t#        j$                         5 }
|
j'                  |	|       ddd        G  fd
dt(        j*                        }t-        |j                  j.                  |j                  j1                         dd j                   j2                  j4                  d      }|j                  j7                  |d       |S c c}w # t        $ r d|j                  j                  Y ww xY w# 1 sw Y   xY w)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.
        idrelated_modelNr   _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                      e Zd Z ej                  W j
                  ej                  W W       Z G  fdd      Zy)$JoinQueryset.join.<locals>.TempModel)	on_delete	db_columnto_fieldc                      e Zd ZdZW  Zy))JoinQueryset.join.<locals>.TempModel.MetaFN)rB   rC   rD   managedr   )
TABLE_NAMEs   r/   Metar!    s    %r<   r$  N)	rB   rC   rD   r   
ForeignKeyrK   
DO_NOTHINGtemp_keyr$  )r#  r  r7   r  s   r/   	TempModelr    s5    (v((

 ++#!	H& &r<   r(  z
INNER JOINF)r  parent_aliastable_alias	join_type
join_fieldnullable)reuse)rK   rt   r   r'   rB   lowerrY   r   AttributeErrorrv   r   _default_managerr   r!   sql_with_paramsrZ   rV   r   cursorexecuter   Modelr   r   get_initial_aliastempmodel_setr|   r[   )r7   rl   fkfks	model_setr   ra   r!   r   sqlr3  r(  connr#  r  r  s   `            @@@r/   r[   zJoinQueryset.join  s    XX^^2225C C  QDB::..4467t<I:)T:C !KLL,JJ	
 #BFI9%BZZ00446F!
002v
 FjISZFP 	   	(FNN3'	(
	& 
	& 
	&  //779"zz//33
 	$d+u " , 	99++,*	( 	(s#   #H)H H0!H-,H-0H9r5   )rl   zQuerySet[Any] | Noner@   zQuerySet[Any])rB   rC   rD   r[   r6   r<   r/   r  r    s    Ir<   r  c                      e Zd ZdZd Zy)JoinManagerMixinzq
        Manager that adds a method join. This method allows you to join two
        querysets together.
        c                    t        j                  dt               | j                  | j                  | j
                        S )Nz`JoinManager and JoinManagerMixin are deprecated. Please use 'JoinQueryset.as_manager()' instead.r	  )r  r  r  r   rK   r  r>   s    r/   r   zJoinManagerMixin.get_queryset  s7    MMB"
 ''djj'IIr<   N)rB   rC   rD   r   r   r6   r<   r/   r>  r>    s    	
	Jr<   r>  c                      e Zd Zy)JoinManagerNr   r6   r<   r/   rA  rA    s    r<   rA  )r(   r3   r@   rA   )/
__future__r   r  typingr   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   r5  r   r   r   r   r0   r2   rI   r   r   Managerr   r   r   r   r  r  r  r  r>  rA  r6   r<   r/   <module>rK     s   "  Q Q Q 5 ( 1 F : 4		>(3: mF3 =m =
A=wv A=L
26:HV<L 
<Y8gfo Y8x	08&..:P 	 <	$V,fnnV.D 	Y Y 	6v>@P 	'# '#T	4V<fnnV>T 	K6??3' K\ 
J J& ' r<   