a
    Dg.                     @   s   d dl Z d dl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mZ d dlmZ d dlmZ ed	ZG d
d dZdd Zdd Zd!ddZdd Zdd ZG dd dZG dd deZG dd deZG dd deZG dd  d ZdS )"    N)apps)checks)FieldDoesNotExist)models)ForeignObjectRelOneToOneRelRelatedField)ParentalManyToManyField)get_search_backends_with_namezwagtail.search.indexc                       s   e Zd ZedddZedd Zedd Zedd	 Zed
d Zedd Z	edd Z
edd Zdd Zedd Ze fddZedd Zg Z  ZS )IndexedTc                 C   s6   | j D ]*}t|trt|tjs(|du r|  S qd S )NF)	__bases__
issubclassr   r   Model)clsZrequire_modelbase r   S/var/www/lab.imftr.de/x/nb_venv/lib/python3.9/site-packages/wagtail/search/index.pyindexed_get_parent   s    


zIndexed.indexed_get_parentc                 C   s>   | j jd | j  }|  }|r6| }|d | S |S d S N_)_meta	app_label__name__lowerr   indexed_get_content_type)r   content_typeparentZparent_content_typer   r   r   r      s    z Indexed.indexed_get_content_typec                 C   s.   |   }|r| S | jjd | j  S d S r   )r   r   r   r   r   r   )r   r   r   r   r   !indexed_get_toplevel_content_type&   s    z)Indexed.indexed_get_toplevel_content_typec                 C   s.   i }| j D ]}||t||jf< q
t| S N)search_fieldstype
field_namelistvalues)r   r   fieldr   r   r   get_search_fields0   s    
zIndexed.get_search_fieldsc                 C   s   dd |   D S )Nc                 S   s   g | ]}t |tr|qS r   )
isinstanceSearchField.0r$   r   r   r   
<listcomp>;   s   z8Indexed.get_searchable_search_fields.<locals>.<listcomp>r%   r   r   r   r   get_searchable_search_fields9   s    z$Indexed.get_searchable_search_fieldsc                 C   s   dd |   D S )Nc                 S   s   g | ]}t |tr|qS r   )r&   AutocompleteFieldr(   r   r   r   r*   A   s   
z:Indexed.get_autocomplete_search_fields.<locals>.<listcomp>r+   r,   r   r   r   get_autocomplete_search_fields?   s    z&Indexed.get_autocomplete_search_fieldsc                 C   s   dd |   D S )Nc                 S   s   g | ]}t |tr|qS r   )r&   FilterFieldr(   r   r   r   r*   I   s   z8Indexed.get_filterable_search_fields.<locals>.<listcomp>r+   r,   r   r   r   get_filterable_search_fieldsG   s    z$Indexed.get_filterable_search_fieldsc                 C   s0   | j  }|  D ]}t|tr||}q|S r   )Zobjectsallr%   r&   RelatedFieldsselect_on_queryset)r   querysetr$   r   r   r   get_indexed_objectsM   s
    

zIndexed.get_indexed_objectsc                 C   s   | S )z
        If the indexed model uses multi table inheritance, override this method
        to return the instance in its most specific class so it reindexes properly.
        r   selfr   r   r   get_indexed_instanceX   s    zIndexed.get_indexed_instancec                 C   s4   z| j | W dS  ty.   t| | Y S 0 d S )NT)r   	get_fieldr   hasattr)r   namer   r   r   
_has_field_   s
    zIndexed._has_fieldc                    s,   t  jf i |}|| jf i | |S r   )supercheckextend_check_search_fields)r   kwargserrors	__class__r   r   r?   g   s    zIndexed.checkc                 K   sJ   g }|   D ]8}d}| |js|tj|j| j|jd| dd q|S )Nz:{model}.search_fields contains non-existent field '{name}')modelr<   zwagtailsearch.W004)objid)r%   r=   r!   appendr   Warningformatr   )r   rB   rC   r$   messager   r   r   rA   m   s    zIndexed._check_search_fields)T)r   
__module____qualname__classmethodr   r   r   r%   r-   r/   r1   r6   r9   r=   r?   rA   r   __classcell__r   r   rD   r   r      s0   

	







r   c                   C   s   dd t  D S )Nc                 S   s(   g | ] }t |tr|jjs|jr|qS r   )r   r   r   abstractr   )r)   rF   r   r   r   r*      s
   
z&get_indexed_models.<locals>.<listcomp>)r   Z
get_modelsr   r   r   r   get_indexed_models   s    rR   c                 C   s&   t | to$t | tjo$| jj o$| jS r   )r   r   r   r   r   rQ   r   r,   r   r   r   class_is_indexed   s    

rS   Tc                 C   s:   |   }|d u rd S |r6t| j|jd s6d S |S )N)pk)r9   r    r6   filterrT   exists)instancecheck_existsindexed_instancer   r   r   r9      s    r9   c              	   C   s\   t | }|rXtddD ]@\}}z|| W q tyT   td|| |jsP Y q0 qd S )NTZwith_auto_updatez=Exception raised while adding %r into the '%s' search backend)r9   r
   add	Exceptionlogger	exceptioncatch_indexing_errorsrW   rY   backend_namebackendr   r   r   insert_or_update_object   s    rc   c              	   C   s`   t | dd}|r\tddD ]@\}}z|| W q tyX   td|| |jsT Y q0 qd S )NF)rX   TrZ   z?Exception raised while deleting %r from the '%s' search backend)r9   r
   deleter\   r]   r^   r_   r`   r   r   r   remove_object   s    re   c                   @   sD   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dS )	BaseFieldc                 K   s   || _ || _d S r   )r!   rB   )r8   r!   rB   r   r   r   __init__   s    zBaseField.__init__c                 C   s   |j | jS r   r   r:   r!   r8   r   r   r   r   r:      s    zBaseField.get_fieldc                 C   s0   z|  |}|jW S  ty*   | j Y S 0 d S r   )r:   Zattnamer   r!   r8   r   r$   r   r   r   get_attname   s
    
zBaseField.get_attnamec                 C   sR   z|  |}|jW S  tyL   t|D ]}| j|jv r*|   Y S q*Y n0 d S r   )r:   rF   r   inspectgetmror!   __dict__)r8   r   r$   Zbase_clsr   r   r   get_definition_model   s    
zBaseField.get_definition_modelc                 C   sT   d| j v r| j d S z&| |}t|tr2|j}q | W S  tyN   Y dS 0 d S )Nr    Z	CharField)rB   r:   r&   r   target_fieldZget_internal_typer   rj   r   r   r   get_type   s    




zBaseField.get_typec                 C   s   ddl m} zr| |j}||}t|dr:||}n@t||rFn4t|trz|}t|trf|j	}qTt|drz||}|W S  t
y   t|| jd }t|dr| }| Y S 0 d S )Nr   )TaggableManagerget_searchable_content__call__)Ztaggit.managersrr   r:   rE   Zvalue_from_objectr;   rs   r&   r   rp   r   getattrr!   )r8   rG   rr   r$   valueZremote_fieldr   r   r   	get_value  s(    







zBaseField.get_valuec                 C   s   d| j j d| j dS )N<z: >)rE   r   r!   r7   r   r   r   __repr__#  s    zBaseField.__repr__N)
r   rM   rN   rg   r:   rk   ro   rq   rw   rz   r   r   r   r   rf      s   
rf   c                       s   e Zd Zd fdd	Z  ZS )r'   Nc                    s   t  j|fi | || _d S r   )r>   rg   boost)r8   r!   r{   rB   rD   r   r   rg   (  s    zSearchField.__init__)N)r   rM   rN   rg   rP   r   r   rD   r   r'   '  s   r'   c                   @   s   e Zd ZdS )r.   Nr   rM   rN   r   r   r   r   r.   -  s   r.   c                   @   s   e Zd ZdS )r0   Nr|   r   r   r   r   r0   1  s   r0   c                   @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )r3   c                 C   s   || _ || _d S r   )r!   fields)r8   r!   r}   r   r   r   rg   6  s    zRelatedFields.__init__c                 C   s   |j | jS r   rh   ri   r   r   r   r:   :  s    zRelatedFields.get_fieldc                 C   s   |  |}|jS r   )r:   rF   rj   r   r   r   ro   =  s    
z"RelatedFields.get_definition_modelc                 C   s*   |  |j}t|ttfr&t|| jS d S r   )r:   rE   r&   r   r   ru   r!   )r8   rG   r$   r   r   r   rw   A  s    zRelatedFields.get_valuec                 C   s   z|  |j}W n ty&   | Y S 0 t|trpt|tsp|jsH|jrV|| j	}q|j
sb|jr|| j	}n.t|trt|tr|| j	}n|| j	}|S )au  
        This method runs either prefetch_related or select_related on the queryset
        to improve indexing speed of the relation.

        It decides which method to call based on the number of related objects:
         - single (eg ForeignKey, OneToOne), it runs select_related
         - multiple (eg ManyToMany, reverse ForeignKey) it runs prefetch_related
        )r:   rF   r   r&   r   r	   Zmany_to_oneZ
one_to_oneZselect_relatedr!   Zone_to_manyZmany_to_manyZprefetch_relatedr   r   )r8   r5   r$   r   r   r   r4   G  s     	


z RelatedFields.select_on_querysetN)r   rM   rN   rg   r:   ro   rw   r4   r   r   r   r   r3   5  s
   r3   )T)rl   loggingZdjango.appsr   Zdjango.corer   Zdjango.core.exceptionsr   Z	django.dbr   Zdjango.db.models.fields.relatedr   r   r   Zmodelcluster.fieldsr	   Zwagtail.search.backendsr
   	getLoggerr]   r   rR   rS   r9   rc   re   rf   r'   r.   r0   r3   r   r   r   r   <module>   s(   
o
	
P