o
    ›¨Êhõ>  ã                   @   sä   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d�Z dd„ Z!ddedfdd„Z"G dd„ deƒZ#dS )é    N)Ú	timedelta)ÚBaseCommandÚCommandError)Úclose_old_connectionsÚreset_queries)Ú	force_strÚsmart_bytes)Únow©Úconnections)Ú
NotHandled)ÚSearchQuerySet)Úhaystack_get_modelsÚhaystack_load_appsé   )Úlevelc              
   C   sþ   t | ƒdkrt d| ¡ tdƒ‚| \
}}}}}}}}}	}
ddlm} |j ¡ D ]*\}}d|d vrQztƒ  t	|j
tƒr@|j
|= nt|j
|ƒ W q' tyP   Y q'w q't|  ¡  t|  ¡ }| |¡}t|  ¡ }|j|||d�}t||||||||	|
ƒ	 | S )	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Úqs© r:   ú[/var/www/html/env/lib/python3.10/site-packages/haystack/management/commands/update_index.pyÚupdate_worker   sF   õ
€ÿù
r<   é   Tc
              
   C   sž  |  ¡  d¡}
|	d ur|
j|	d�d || … }n|
||… }d }t|ƒ}|r+|d j}ttdƒo7t ¡ t ¡ k}|dkrX|rJt	d|d ||f ƒ nt	d|d ||t ¡ f ƒ d	}||k rÊz| j
|||d
� |dkr{|r{t	d |d ||d |¡ƒ W nM tyÅ } z=|d7 }|d |||t ¡ |dœ}d}|s�|d7 }||kr¨t ||¡ ‚ |dkr´tj||dd� t d| ¡ W Y d }~nd }~ww ||k s^tƒ  |S )NÚpk)Úpk__gtéÿÿÿÿÚgetppidé   z  indexed %s - %d of %d.r=   z)  indexed %s - %d of %d (worker PID: %s).r   ©r2   z-Completed indexing {} - {}, tried {}/{} times)r.   r/   Úretriesr3   Ú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ÚgetpidrA   ÚprintÚupdateÚformatÚ	Exceptionr   Ú	exceptionÚwarningÚtimeÚsleepr   )r8   r7   r9   r.   r/   r0   r1   r2   r3   Úlast_max_pkÚsmall_cache_qsÚ
current_qsÚmax_pkÚis_parent_processrD   rF   Úerror_contextÚ	error_msgr:   r:   r;   r+   H   sf   
ÿÿÿÿú	€æõ(r+   c                   @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	ÚCommandz(Freshens the index for the given app(s).c              	   C   sÚ   |j dddd� |j ddtdd� |j d	d
ttdd� |j ddddd� |j ddddd� |j dddtdd� |j dddddd � |j d!d"d#g d$d � |j d%d&td'd(d� |j d)d*d+d,d-d.� |j d/d0d1d2ttd3d4� d S )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.)Útyperb   z-az--agez-Number of hours back to consider objects new.)rc   Údefaultrb   z-sz--startr   zwThe start date for indexing. Can be any dateutil-parsable string; YYYY-MM-DDTHH:MM:SS is recommended to avoid confusion)Údestrb   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.)re   rc   rb   z-rz--removeÚ
store_trueFzIRemove objects from the index that are no longer present in the database.)Úactionrd   rb   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_falser2   Tz&Will pass commit=False to the backend.)rh   re   rd   rb   z-tz--max-retriesÚstorer3   zHMaximum number of attempts to write to the backend when an error occurs.)rh   re   rc   rd   rb   )Úadd_argumentÚintÚDEFAULT_AGEÚDEFAULT_MAX_RETRIES)ÚselfÚparserr:   r:   r;   Úadd_arguments¢   s”   ýüûüüûûûûû
ùzCommand.add_argumentsc           
   
   K   sô  t | dd¡ƒ| _| dt¡| _d | _d | _| dd¡| _| dd¡| _| dd	¡| _	| d
t
¡| _| d¡| _| jsAtj ¡ | _| dt¡}| dt¡}| d¡}| d¡}| jdkrct tj¡ n| jdkrnt tj¡ |rr|sz|rv|sz|r~|r~tdƒ‚|d ur‹tƒ t|d� | _|d ur˜tƒ t|d� | _|d ur³ddlm} z||ƒ| _W n	 ty²   Y nw |d urÎddlm} z||ƒ| _W n	 tyÍ   Y nw | d¡pÕtƒ }|D ]}| jD ]}	z|  ||	¡ W qÝ työ   t d||	¡ ‚ w qØd S )Nr1   r=   rf   ÚremoveFÚworkersr   r2   Tr3   r   ÚageÚminutesr   r   rB   z9Minutes / age / start date options are mutually exclusive)rv   )Úhours)Úparser_   zError updating %s using %s ) rm   Úgetr1   ÚDEFAULT_BATCH_SIZErf   r   r   rs   rt   r2   ro   r3   Úbackendsr%   Úconnections_infoÚkeysrn   r   ÚsetLevelÚloggingÚDEBUGÚINFOr   r	   r   Údateutil.parserrx   r   r   Úupdate_backendrR   rS   )
rp   Úoptionsru   rv   r   r   Údateutil_parseÚlabelsÚlabelr   r:   r:   r;   Úhandleñ   sh   



ÿÿÿ
þýÿzCommand.handlec                 C   s  t |  ¡ }t |  ¡ }t|ƒD �]u}z| |¡}W n ty0   | jdkr.| j d| ¡ Y qw | j	dkr9t
ƒ  |j|| j| jd�}| ¡ }| jdkrZ| j d|t|jjƒf ¡ | jp_|j}	| j	dkrgg }
d }td||	ƒD ]4}t||	 |ƒ}| j	dkr�t||||||| j| j| j|d�
}qo|
 |||||| j| j| j| j| jf
¡ qo| j	dkræt | j	¡}| t|
¡}t|
ƒt|ƒkrÞ| j dt|
ƒt|ƒf ¡ |
D ]}||vrÝ| j d	t |ƒ ¡ qÍ| !¡  | "¡  | j#�r†| jsõ| jsõ|dk�r|j$|d
�j%ddd�}dd„ |D ƒ}ndd„ |j%ddd�D ƒ}t&|j'd
� (|¡ ¡ }t&|j'd
� (|¡}| %dd¡}t)ƒ }td||	ƒD ]}||	 }|||… D ]\}}t*|ƒ|v�rS| +|¡ �qC�q7|�r†| jdk�rj| j dt|ƒ ¡ |D ]}| jdk�r|| j d| ¡ |j#|| jd� �qlqd S )NrB   zSkipping '%s' - no index.r   r   r=   zIndexing %d %s)r1   r2   r3   rW   z%Queued %d tasks but only %d completedzIncomplete task: %s)r   r>   T)Úflatc                 S   ó   h | ]}t |ƒ’qS r:   ©r   ©Ú.0r>   r:   r:   r;   Ú	<setcomp>‡  s    z)Command.update_backend.<locals>.<setcomp>c                 S   rŠ   r:   r‹   rŒ   r:   r:   r;   rŽ   ‰  s    ÿÚidz  removing %d stale records.z  removing %s.rC   ),r%   r)   r'   r   r(   r   r1   ÚstdoutÚwritert   r   r*   r   r   Úcountr   Ú_metaÚverbose_name_pluralrf   Ú
batch_sizeÚrangeÚminr+   r2   r3   ri   ÚmultiprocessingÚPoolÚmapr<   r   ÚstderrÚreprÚcloseÚjoinrs   Úindex_querysetÚvalues_listr   Úconnection_aliasÚmodelsÚsetr   Úadd)rp   r‡   r   r8   r6   r-   r7   r9   r0   r•   Úghetto_queuerZ   r.   r/   ÚpoolÚsuccessful_tasksÚiÚdatabase_pksÚindex_totalÚ	index_pksÚstale_recordsÚupper_boundr>   Úrec_idr:   r:   r;   rƒ   -  sÈ   
ý

ÿ
ÿÿ

ööÿ
ÿÿ€ÿÿ	
€þ
ÿ€ �ûzCommand.update_backendN)Ú__name__Ú
__module__Ú__qualname__rb   rr   rˆ   rƒ   r:   r:   r:   r;   r^   Ÿ   s
    O<r^   )$r   r˜   rM   rU   Ú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   rz   rn   ro   Úlog_to_stderrÚWARNINGr   r<   r+   r^   r:   r:   r:   r;   Ú<module>   s0    7
öW