
    Nwg>                        d dl Z d dlZd dlZd dl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mZ d dlmZ d dlmZ d dlmZ d d	lmZ d d
lmZmZ dZdZdZ ej<                  e j>                        Z d Z!ddedfdZ" G d de      Z#y)    N)	timedelta)BaseCommandCommandError)close_old_connectionsreset_queries)	force_strsmart_bytes)nowconnections)
NotHandled)SearchQuerySet)haystack_get_modelshaystack_load_apps   )levelc                    t        |       dk7  r!t        j                  d|        t        d      | \
  }}}}}}}}}	}
ddlm} |j                  j                         D ]V  \  }}d|d   vs	 t                t        |j                  t              r|j                  |= nt        |j                  |       X t        |   j                          t        |   j!                         }|j#                  |      }t        |   j%                         }|j'                  |||      }t)        ||||||||	|
	       | S # t        $ r Y w xY w)	N
   z.update_worker received incorrect arguments: %rz*update_worker received incorrect argumentsr   r   sqlite3ENGINEusing
start_dateend_date)lenLOGerror
ValueError	django.dbr   	databasesitemsr   
isinstance_connectionsdictdelattrKeyErrorhaystack_connectionsreset_sessionsget_unified_index	get_indexget_backendbuild_queryset	do_update)argsmodelstartendtotalr   r   r   	verbositycommitmax_retriesr   aliasinfounified_indexindexbackendqss                     `/var/www/horilla/myenv/lib/python3.12/site-packages/haystack/management/commands/update_index.pyupdate_workerr=      sP   
4yB		BDIEFF 	 &",,224 t DN*%'k66=#007K44e< ..0(/AACM##E*E"5)557G			Ej8		TBgub%eYTK  s   ,AD55	E E   Tc
                    |j                         j                  d      }
|	|
j                  |	      d ||z
   }n|
|| }d }t        |      }|r|d   j                  }t        t        d      xr) t        j                         t        j                         k(  }|dk\  r>|rt        d|dz   ||fz         n't        d|dz   ||t        j                         fz         d	}||k  r@	 | j                  |||
       |dk\  r%|r#t        dj                  |dz   ||dz   |             	 t%                |S # t        $ r}|dz  }|dz   |||t        j                         |d}d}|s|dz  }||k\  rt        j                  ||        |dk\  rt        j                  ||d       t!        j"                  d|z         Y d }~nd }~ww xY w||k  r匦)Npk)pk__gtgetppid   z  indexed %s - %d of %d.r>   z)  indexed %s - %d of %d (worker PID: %s).r   r4   z-Completed indexing {} - {}, tried {}/{} times)r0   r1   retriesr5   pidexczPFailed indexing %(start)s - %(end)s (retry %(retries)s/%(max_retries)s): %(exc)sz (pid %(pid)s): %(exc)sT)exc_info)allorder_byfilterlistr@   hasattrosgetpidrC   printupdateformat	Exceptionr   	exceptionwarningtimesleepr   )r:   r9   r;   r0   r1   r2   r3   r4   r5   last_max_pksmall_cache_qs
current_qsmax_pkis_parent_processrF   rH   error_context	error_msgs                     r<   r-   r-   H   s    VVX&&t,N
 #**+*>}uM
#E#.
 Fj!JB""I.N299;"**,3NA~,	3/FFG;19c5"))+67
 G
K
$	#NN5*VN<A~'CJJ	3![
 < OM=  	# qLG "*yy{M kI$66	+%i7aI}tD JJq'z""5	# K
s   $>D/ /	F?8A=F::F?c                   "    e Zd ZdZd Zd Zd Zy)Commandz(Freshens the index for the given app(s).c           	         |j                  ddd       |j                  ddt        d       |j                  d	d
t        t        d       |j                  dddd       |j                  dddd       |j                  dddt        d       |j                  ddddd        |j                  d!d"d#g d$        |j                  d%d&t        d'd(       |j                  d)d*d+d,d-.       |j                  d/d0d1d2t        t        d34       y )5N	app_label*z7App label of an application to update the search index.)nargshelpz-mz	--minutesz/Number of minutes back to consider objects new.)typerf   z-az--agez-Number of hours back to consider objects new.)rg   defaultrf   z-sz--startr   zwThe start date for indexing. Can be any dateutil-parsable string; YYYY-MM-DDTHH:MM:SS is recommended to avoid confusion)destrf   z-ez--endr   zuThe end date for indexing. Can be any dateutil-parsable string; YYYY-MM-DDTHH:MM:SS is recommended to avoid confusionz-bz--batch-size	batchsizez!Number of items to index at once.)ri   rg   rf   z-rz--remove
store_trueFzIRemove objects from the index that are no longer present in the database.)actionrh   rf   z-uz--usingappendzdUpdate only the named backend (can be used multiple times). By default all backends will be updated.z-kz	--workersr   z<Allows for the use multiple workers to parallelize indexing.z
--nocommitstore_falser4   Tz&Will pass commit=False to the backend.)rl   ri   rh   rf   z-tz--max-retriesstorer5   zHMaximum number of attempts to write to the backend when an error occurs.)rl   ri   rg   rh   rf   )add_argumentintDEFAULT_AGEDEFAULT_MAX_RETRIES)selfparsers     r<   add_argumentszCommand.add_arguments   s   J 	 	

 	B	 	 	
 	@ 	 	
 	E	 	 	
 	E	 	 	
 	4 	 	
 	\ 	 	
 	7 	 	
 	O 	 	
 	 9 	 	
 	'[ 	 	
    c                 Z   t        |j                  dd            | _        |j                  dt              | _        d | _        d | _        |j                  dd      | _        |j                  dd      | _        |j                  dd	      | _	        |j                  d
t              | _        |j                  d      | _        | j                  s#t        j                  j                         | _        |j                  dt               }|j                  dt               }|j                  d      }|j                  d      }| j                  dkD  r$t"        j%                  t&        j(                         n2| j                  dkD  r#t"        j%                  t&        j*                         |r|s|r|s|r|rt-        d      |t/               t1        |      z
  | _        |t/               t1        |      z
  | _        |ddlm} 	  ||      | _        |ddlm} 	  ||      | _        |j                  d      xs
 t9               }|D ]&  }| j                  D ]  }		 | j;                  ||	        ( y # t6        $ r Y jw xY w# t6        $ r Y cw xY w# t<        $ r t"        j?                  d||	        w xY w)Nr3   r>   rj   removeFworkersr   r4   Tr5   r   ageminutesr   r   rD   z9Minutes / age / start date options are mutually exclusive)r|   )hours)parserc   zError updating %s using %s ) rq   getr3   DEFAULT_BATCH_SIZErj   r   r   ry   rz   r4   rs   r5   backendsr'   connections_infokeysrr   r   setLevelloggingDEBUGINFOr   r
   r   dateutil.parserr~   r   r   update_backendrT   rU   )
rt   optionsr{   r|   r   r   dateutil_parselabelslabelr   s
             r<   handlezCommand.handle   sF   W[[a89 [2DEkk(E2{{9a0kk(D1";;}6IJG,}}0AAFFHDMkk%-++i5[[.
;;z*>>ALL'^^aLL&ZSZK  !ei&@@DO?!eic&::DO!?"0"< ? .x 8 [)A-?-A 	E ''u5	     ! MM"?Ns0   >I* I9 J*	I65I69	JJ"J*c                 	   t         |   j                         }t         |   j                         }t        |      D ]B  }	 |j	                  |      }| j                  dkD  r
t                |j                  || j                  | j                        }|j                         }| j                  dk\  r=| j                  j                  d|t        |j                   j"                        fz         | j$                  xs |j&                  }	| j                  dkD  rg }
d }t)        d||	      D ]  }t+        ||	z   |      }| j                  dk(  r4t-        ||||||| j                  | j.                  | j0                  |
      }U
j3                  |||||| j                  | j                  | j                  | j.                  | j0                  f
        | j                  dkD  rt5        j6                  | j                        }|j9                  t:        
      }t=        |
      t=        |      k7  re| j>                  j                  dt=        |
      t=        |      fz         |
D ].  }||vs| j>                  j                  d	tA        |      z         0 |jC                          |jE                          | jF                  s| j                  s| j                  s|dk  r<|jI                  |
      jK                  dd      }|D ch c]  }tM        |       }}n)|jK                  dd      D ch c]  }tM        |       }}tO        |jP                  
      jS                  |      j                         }tO        |jP                  
      jS                  |      }|jK                  dd      }tU               }t)        d||	      D ]3  }||	z   }||| D ]$  \  }}tM        |      |vs|jW                  |       & 5 |s| j                  dk\  r'| j                  j                  dt=        |      z         |D ]L  }| j                  dk\  r| j                  j                  d|z         |jG                  || j.                         N E y # t
        $ r1 | j                  dk\  r| j                  j                  d|z         Y w xY wc c}w c c}w )NrD   zSkipping '%s' - no index.r   r   r>   zIndexing %d %s)r3   r4   r5   rY   z%Queued %d tasks but only %d completedzIncomplete task: %s)r   r@   T)flatidz  removing %d stale records.z  removing %s.rE   ),r'   r+   r)   r   r*   r   r3   stdoutwriterz   r   r,   r   r   countr   _metaverbose_name_pluralrj   
batch_sizerangeminr-   r4   r5   rm   multiprocessingPoolmapr=   r   stderrreprclosejoinry   index_querysetvalues_listr	   r   connection_aliasmodelssetadd)rt   r   r   r:   r8   r/   r9   r;   r2   r   ghetto_queuer\   r0   r1   poolsuccessful_tasksir@   database_pksindex_total	index_pksstale_recordsupper_boundrec_ids                           r<   r   zCommand.update_backend-  sz   &u-99;,U3EEG(/ D	CE%//6 ||a &'%%$-- & B HHJE~~"!!$i(G(GHIJ
 =7+=+=J||a!Fq%4 %*,e4<<1$&"&..#{{$($4$4$*F !''!!!! OO MM NN KK ,,#@ ||a&++DLL9#'88M<#H |$,<(==KK%%?|,c2B.CDE * O$44 KK--.Cd1g.MNO 

		{{??dmmuz --E-:FFtRVFWB>@#AKO#AL#A 35..D.2Q$,.B$L $ #)A)ABII%PVVX  +1I1IJQQRWX	%11$=	
 !$"1k:> 6E"'*"4K '0k&B 6
F&r?,>)--f56	6 !~~*)):S=OO #0 C  >>Q. KK--.>.GHvdkkBC}D	C  >>Q&KK%%&AE&IJf $B$s   R=R>'S6R;:R;N)__name__
__module____qualname__rf   rv   r   r    rw   r<   ra   ra      s    5DM
^:xHCrw   ra   )$r   r   rO   rW   datetimer   django.core.management.baser   r   r   r   r   django.utils.encodingr   r	   django.utils.timezoner
   haystackr   r'   haystack.exceptionsr   haystack.queryr   haystack.utils.app_loadingr   r   r   rr   rs   log_to_stderrWARNINGr   r=   r-   ra   r   rw   r<   <module>r      s~      	   A : 8 % 8 * ) N  #o##'//:-n #TnVCk VCrw   