
    Nwg                         d dl mZ d dlmZmZ d dlmZ d dlmZ d dl	m
Z
mZ d dlmZ  eedd      Z G d	 d
      ZefdZ G d de      ZddedddfdZy)    )settings)InvalidPage	Paginator)Http404)render)FacetedSearchFormModelSearchForm)EmptySearchQuerySet HAYSTACK_SEARCH_RESULTS_PER_PAGE   c                   v    e Zd ZdZi ZdZ e       ZdZdZ	e
Z	 	 	 	 	 ddZd ZddZd Zd Zd	 Zd
 Zd Zd Zy)
SearchViewsearch/search.html Nc                 n    || _         || _        || _        |t        | _        ||| _        |r|| _        y y N)load_all
form_classsearchquerysetr	   results_per_pagetemplate)selfr   r   r   r   r   s         E/var/www/horilla/myenv/lib/python3.12/site-packages/haystack/views.py__init__zSearchView.__init__   sD     !$,-DO'$4D!$DM     c                     || _         | j                         | _        | j                         | _        | j                         | _        | j                         S )z
        Generates the actual response to the search.

        Relies on internal, overridable methods to construct the response.
        )request
build_formform	get_queryqueryget_resultsresultscreate_response)r   r   s     r   __call__zSearchView.__call__*   sF     OO%	^^%
'')##%%r   c                    d}d| j                   i}|r|j                  |       t        | j                  j                        r| j                  j                  }| j
                  | j
                  |d<    | j                  |fi |S )zY
        Instantiates the form the class should use to process the search query.
        Nr   r   )r   updatelenr   GETr   r   )r   form_kwargsdatakwargss       r   r   zSearchView.build_form8   sz     dmm,MM+&t|| <<##D*'+':':F#$tt.v..r   c                 j    | j                   j                         r| j                   j                  d   S y)zs
        Returns the query provided by the user.

        Returns an empty string if the query is invalid.
        qr   )r   is_validcleaned_datar   s    r   r    zSearchView.get_queryI   s,     9999))#..r   c                 6    | j                   j                         S )zv
        Fetches the results via the form.

        Returns an empty list if there's no query to search with.
        )r   searchr1   s    r   r"   zSearchView.get_resultsT   s     yy!!r   c                    	 t        | j                  j                  j                  dd            }|dk  rt        d      |dz
  | j                  z  }| j                  ||| j                  z     t        | j                  | j                        }	 |j                  |      }||fS # t        t
        f$ r t        d      w xY w# t        $ r t        d      w xY w)z
        Paginates the results appropriately.

        In case someone does not want to use Django's built-in pagination, it
        should be a simple matter to override this method to do what they would
        like.
        page   zNot a valid number for page.zPages should be 1 or greater.zNo such page!)intr   r)   get	TypeError
ValueErrorr   r   r#   r   r5   r   )r   page_nostart_offset	paginatorr5   s        r   
build_pagezSearchView.build_page\   s    	:$,,**..vq9:G Q;9::!t'<'<<\L43H3H$HIdllD,A,AB		+>>'*D 4  ! :& 	:899	:  	+/**	+s   /B% C %C Cc                     i S )zm
        Allows the addition of more context variables as needed.

        Must return a dictionary.
         r1   s    r   extra_contextzSearchView.extra_contextx   s	     	r   c                 \   | j                         \  }}| j                  | j                  ||d d}t        | j                  d      rG| j                  j                  j
                  j                  r| j                  j                         |d<   |j                  | j                                |S )N)r!   r   r5   r=   
suggestionr!   rC   )
r>   r!   r   hasattrr#   backendinclude_spellingget_suggestionr'   rA   )r   r=   r5   contexts       r   get_contextzSearchView.get_context   s     OO-D ZZII"
 DLL'*""**;;$(II$<$<$>GL!t))+,r   c                 d    | j                         }t        | j                  | j                  |      S )zM
        Generates the actual HttpResponse to send back to the user.
        )rI   r   r   r   )r   rH   s     r   r$   zSearchView.create_response   s)    
 ""$dllDMM7;;r   )NTNNNr   )__name__
__module____qualname__r   rA   r!   r
   r#   r   r   RESULTS_PER_PAGEr   r   r%   r   r    r"   r>   rI   r$   r@   r   r   r   r      sg    #HME!#GGD' %*&/"	"!8*<r   r   c                       fd}|S )Nc                        i |       S r   r@   )r   argsr,   
view_classs    r   search_viewz(search_view_factory.<locals>.search_view   s    *z4*6*733r   r@   )rR   rQ   r,   rS   s   ``` r   search_view_factoryrT      s    4 r   c                   4     e Zd Z fdZd fd	Z fdZ xZS )FacetedSearchViewc                 X    |j                  d      	t        |d<   t        |   |i | y )Nr   )r8   r   superr   )r   rQ   r,   	__class__s      r   r   zFacetedSearchView.__init__   s.    ::l#+#4F< $)&)r   c                 z    |i }| j                   j                  j                  d      |d<   t        |   |      S )Nselected_facets)r   r)   getlistrX   r   )r   r*   rY   s     r   r   zFacetedSearchView.build_form   sA    K *.)9)9)A)ABS)T%&w!+..r   c                 |    t         |          }| j                  |d<   | j                  j	                         |d<   |S )Nr   facets)rX   rA   r   r#   facet_counts)r   extrarY   s     r   rA   zFacetedSearchView.extra_context   s9    %'<<i,,335hr   r   )rK   rL   rM   r   r   rA   __classcell__)rY   s   @r   rV   rV      s    */ r   rV   r   TNc                 f   d}t               }| j                  j                  d      rE || j                  ||      }	|	j                         r*|	j                  d   }|	j                         }n
 |||      }	t        ||xs t              }
	 |
j                  t        | j                  j                  dd                  }|	||
|dd}|j                  j                  j                  r|	j                         |d	<   |r|j!                  |       t#        | ||      S # t        $ r t        d      w xY w)
aJ  
    A more traditional view that also demonstrate an alternative
    way to use Haystack.

    Useful as an example of for basing heavily custom views off of.

    Also has the benefit of thread-safety, which the ``SearchView`` class may
    not be.

    Template:: ``search/search.html``
    Context::
        * form
          An instance of the ``form_class``. (default: ``ModelSearchForm``)
        * page
          The current page of search results.
        * paginator
          A paginator instance for the results.
        * query
          The query received by the form.
    r   r.   )r   r   r5   r6   zNo such page of results!N)r   r5   r=   r!   rC   rC   )r
   r)   r8   r/   r0   r3   r   rN   r5   r7   r   r   r!   rE   rF   rG   r'   r   )r   r   r   r   r   rA   r   r!   r#   r   r=   r5   rH   s                r   basic_searchrc      s   : E!#G{{s'++nxX==?%%c*EkkmG(K'#3#G7GHI2~~c'++//&!"<=>
 G }}-- $ 3 3 5}%'8W--#  20112s   4D D0)django.confr   django.core.paginatorr   r   django.httpr   django.shortcutsr   haystack.formsr   r	   haystack.queryr
   getattrrN   r   rT   rV   rc   r@   r   r   <module>rk      sc      8  # = .8%GL P< P<f $. 
 6 ">.r   