o
    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u r|  S qd S )NF)	__bases__
issubclassr   r   Model)clsrequire_modelbase r   T/var/www/html/ndineBlogger/venv/lib/python3.10/site-packages/wagtail/search/index.pyindexed_get_parent   s   


zIndexed.indexed_get_parentc                 C   s:   | j jd | j  }|  }|r| }|d | S |S N_)_meta	app_label__name__lowerr   indexed_get_content_type)r   content_typeparentparent_content_typer   r   r   r      s   z Indexed.indexed_get_content_typec                 C   s*   |   }|r
| S | jjd | j  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      dd |   D S )Nc                 S      g | ]	}t |tr|qS r   )
isinstanceSearchField.0r&   r   r   r   
<listcomp>;   
    
z8Indexed.get_searchable_search_fields.<locals>.<listcomp>r'   r   r   r   r   get_searchable_search_fields9      z$Indexed.get_searchable_search_fieldsc                 C   r(   )Nc                 S   r)   r   )r*   AutocompleteFieldr,   r   r   r   r.   A   s    z:Indexed.get_autocomplete_search_fields.<locals>.<listcomp>r0   r1   r   r   r   get_autocomplete_search_fields?   s   z&Indexed.get_autocomplete_search_fieldsc                 C   r(   )Nc                 S   r)   r   )r*   FilterFieldr,   r   r   r   r.   I   r/   z8Indexed.get_filterable_search_fields.<locals>.<listcomp>r0   r1   r   r   r   get_filterable_search_fieldsG   r3   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   s0   z	| j | W dS  ty   t| | Y S w )NT)r   	get_fieldr   hasattr)r   namer   r   r   
_has_field_   s   zIndexed._has_fieldc                    s,   t  jdi |}|| jdi | |S )Nr   )supercheckextend_check_search_fields)r   kwargserrors	__class__r   r   rF   g   s   zIndexed.checkc                 K   sJ   g }|   D ]}d}| |js"|tj|j| j|jd| dd q|S )Nz:{model}.search_fields contains non-existent field '{name}')modelrC   zwagtailsearch.W004)objid)r'   rD   r#   appendr   Warningformatr   )r   rI   rJ   r&   messager   r   r   rH   m   s   zIndexed._check_search_fieldsT)r   
__module____qualname__classmethodr   r   r   r'   r2   r5   r7   r=   r@   rD   rF   rH   r!   __classcell__r   r   rK   r   r      s2    

	







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-   rM   r   r   r   r.      s    z&get_indexed_models.<locals>.<listcomp>)r   
get_modelsr   r   r   r   get_indexed_models   s   r[   c                 C   s&   t | tot | tjo| jj o| jS r    )r   r   r   r   r   rY   r!   r1   r   r   r   class_is_indexed   s   

r\   Tc                 C   s:   |   }|d u r
d S |rt| j|jd sd S |S )N)pk)r@   r"   r=   filterr]   exists)instancecheck_existsindexed_instancer   r   r   r@      s   r@   c              	   C   s^   t | }|r+tddD ]!\}}z|| W q ty*   td|| |js( Y qw d S d S )NTwith_auto_updatez=Exception raised while adding %r into the '%s' search backend)r@   r
   add	Exceptionlogger	exceptioncatch_indexing_errorsr`   rb   backend_namebackendr   r   r   insert_or_update_object   s&   rm   c              	   C   sb   t | dd}|r-tddD ]!\}}z|| W q ty,   td|| |js* Y qw d S d S )NF)ra   Trc   z?Exception raised while deleting %r from the '%s' search backend)r@   r
   deleterf   rg   rh   ri   rj   r   r   r   remove_object   s&   ro   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      || _ || _d S r    )r#   rI   )r?   r#   rI   r   r   r   __init__      
zBaseField.__init__c                 C      |j | jS r    r   rA   r#   r?   r   r   r   r   rA         zBaseField.get_fieldc                 C   s,   z	|  |}|jW S  ty   | j Y S w r    )rA   attnamer   r#   r?   r   r&   r   r   r   get_attname   s   

zBaseField.get_attnamec                 C   sP   z	|  |}|jW S  ty'   t|D ]}| j|jv r#|   Y S qY d S w r    )rA   rM   r   inspectgetmror#   __dict__)r?   r   r&   base_clsr   r   r   get_definition_model   s   
zBaseField.get_definition_modelc                 C   sX   d| j v r
| j d S z| |}t|tr|j}t|ts| W S  ty+   Y dS w )Nr"   	CharField)rI   rA   r*   r   target_fieldget_internal_typer   ry   r   r   r   get_type   s   





zBaseField.get_typec                 C   s   ddl m} zB| |j}||}t|dr||}|W S t||r(	 |W S t|trF|}t|tr<|j	}t|ts4t|drF||}|W S  t
yb   t|| jd }t|dr^| }| Y S w )Nr   )TaggableManagerget_searchable_content__call__)taggit.managersr   rA   rL   value_from_objectrB   r   r*   r   r   r   getattrr#   )r?   rN   r   r&   valueremote_fieldr   r   r   	get_value  s0   









zBaseField.get_valuec                 C   s   d| j j d| j dS )N<z: >)rL   r   r#   r>   r   r   r   __repr__#  s   zBaseField.__repr__N)
r   rU   rV   rr   rA   rz   r   r   r   r   r   r   r   r   rp      s    
rp   c                       s   e Zd Zd fdd	Z  ZS )r+   Nc                    s   t  j|fi | || _d S r    )rE   rr   boost)r?   r#   r   rI   rK   r   r   rr   (  s   
zSearchField.__init__r    )r   rU   rV   rr   rX   r   r   rK   r   r+   '  s    r+   c                   @      e Zd ZdS )r4   Nr   rU   rV   r   r   r   r   r4   -      r4   c                   @   r   )r6   Nr   r   r   r   r   r6   1  r   r6   c                   @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )r:   c                 C   rq   r    )r#   fields)r?   r#   r   r   r   r   rr   6  rs   zRelatedFields.__init__c                 C   rt   r    ru   rv   r   r   r   rA   :  rw   zRelatedFields.get_fieldc                 C   s   |  |}|jS r    )rA   rM   ry   r   r   r   r   =  s   
z"RelatedFields.get_definition_modelc                 C   s*   |  |j}t|ttfrt|| jS d S r    )rA   rL   r*   r   r   r   r#   )r?   rN   r&   r   r   r   r   A  s   zRelatedFields.get_valuec                 C   s   z|  |j}W n ty   | Y S w t|tr:t|ts:|js$|jr,|| j	}|S |j
s2|jr8|| j	}|S t|trRt|trL|| j	}|S || 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
        )rA   rM   r   r*   r   r	   many_to_one
one_to_oneselect_relatedr#   one_to_manymany_to_manyprefetch_relatedr   r   )r?   r<   r&   r   r   r   r;   G  s(   	

z RelatedFields.select_on_querysetN)r   rU   rV   rr   rA   r   r   r;   r   r   r   r   r:   5  s    r:   rT   )r{   loggingdjango.appsr   django.corer   django.core.exceptionsr   	django.dbr   django.db.models.fields.relatedr   r   r   modelcluster.fieldsr	   wagtail.search.backendsr
   	getLoggerrg   r   r[   r\   r@   rm   ro   rp   r+   r4   r6   r:   r   r   r   r   <module>   s*    
o

	P