U
    {h.                     @   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kr|  S qd S )NF)	__bases__
issubclassr   r   Model)clsZrequire_modelbase r   \/var/www/dating/data/www/fatepal.com/env/lib/python3.8/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   )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   s6   z| j | W dS  tk
r0   t| | Y S X d S )NT)r   	get_fieldr   hasattr)r   namer   r   r   
_has_field_   s
    zIndexed._has_fieldc                    s$   t  jf |}|| jf | |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   rC   rD   r$   messager   r   r   rB   m   s    zIndexed._check_search_fields)T)r   
__module____qualname__classmethodr   r   r   r%   r-   r/   r1   r7   r:   r>   r@   rB   r   __classcell__r   r   rE   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)   rG   r   r   r   r*      s
   
z&get_indexed_models.<locals>.<listcomp>)r   Z
get_modelsr   r   r   r   get_indexed_models   s    rS   c                 C   s&   t | to$t | tjo$| jj o$| jS r   )r   r   r   r   r   rR   r   r,   r   r   r   class_is_indexed   s    

rT   Tc                 C   s:   |   }|d krd S |r6t| j|jd s6d S |S )N)pk)r:   r    r7   filterrU   exists)instancecheck_existsindexed_instancer   r   r   r:      s    r:   c              	   C   s^   t | }|rZtddD ]B\}}z|| W q tk
rV   td|| |jsR Y qX qd S )NTZwith_auto_updatez=Exception raised while adding %r into the '%s' search backend)r:   r
   add	Exceptionlogger	exceptioncatch_indexing_errorsrX   rZ   backend_namebackendr   r   r   insert_or_update_object   s    rd   c              	   C   sb   t | dd}|r^tddD ]B\}}z|| W q tk
rZ   td|| |jsV Y qX qd S )NF)rY   Tr[   z?Exception raised while deleting %r from the '%s' search backend)r:   r
   deleter]   r^   r_   r`   ra   r   r   r   remove_object   s    rf   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!   rC   )r9   r!   rC   r   r   r   __init__   s    zBaseField.__init__c                 C   s   |j | jS r   r   r;   r!   r9   r   r   r   r   r;      s    zBaseField.get_fieldc                 C   s2   z|  |}|jW S  tk
r,   | j Y S X d S r   )r;   Zattnamer   r!   r9   r   r$   r   r   r   get_attname   s
    
zBaseField.get_attnamec                 C   sT   z|  |}|jW S  tk
rN   t|D ]}| j|jkr,|   Y S q,Y nX d S r   )r;   rG   r   inspectgetmror!   __dict__)r9   r   r$   Zbase_clsr   r   r   get_definition_model   s    
zBaseField.get_definition_modelc                 C   sV   d| j kr| j d S z&| |}t|tr2|j}q | W S  tk
rP   Y dS X d S )Nr    Z	CharField)rC   r;   r&   r   target_fieldZget_internal_typer   rk   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
k
r   t|| jd }t|dr| }| Y S X d S )Nr   )TaggableManagerget_searchable_content__call__)Ztaggit.managersrs   r;   rF   Zvalue_from_objectr<   rt   r&   r   rq   r   getattrr!   )r9   rH   rs   r$   valueZremote_fieldr   r   r   	get_value  s(    







zBaseField.get_valuec                 C   s   d| j j d| j dS )N<z: >)rF   r   r!   r8   r   r   r   __repr__#  s    zBaseField.__repr__N)
r   rN   rO   rh   r;   rl   rp   rr   rx   r{   r   r   r   r   rg      s   
rg   c                       s   e Zd Zd fdd	Z  ZS )r'   Nc                    s   t  j|f| || _d S r   )r?   rh   boost)r9   r!   r|   rC   rE   r   r   rh   (  s    zSearchField.__init__)N)r   rN   rO   rh   rQ   r   r   rE   r   r'   '  s   r'   c                   @   s   e Zd ZdS )r.   Nr   rN   rO   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 )r4   c                 C   s   || _ || _d S r   )r!   fields)r9   r!   r~   r   r   r   rh   6  s    zRelatedFields.__init__c                 C   s   |j | jS r   ri   rj   r   r   r   r;   :  s    zRelatedFields.get_fieldc                 C   s   |  |}|jS r   )r;   rG   rk   r   r   r   rp   =  s    
z"RelatedFields.get_definition_modelc                 C   s*   |  |j}t|ttfr&t|| jS d S r   )r;   rF   r&   r   r   rv   r!   )r9   rH   r$   r   r   r   rx   A  s    zRelatedFields.get_valuec                 C   s   z|  |j}W n tk
r(   | Y S X t|trrt|tsr|jsJ|jrX|| j	}q|j
sd|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;   rG   r   r&   r   r	   Zmany_to_oneZ
one_to_oneZselect_relatedr!   Zone_to_manyZmany_to_manyZprefetch_relatedr   r   )r9   r6   r$   r   r   r   r5   G  s"    	
 

z RelatedFields.select_on_querysetN)r   rN   rO   rh   r;   rp   rx   r5   r   r   r   r   r4   5  s
   r4   )T)rm   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   rS   rT   r:   rd   rf   rg   r'   r.   r0   r4   r   r   r   r   <module>   s(   
o
	
P