Skip to content

Instantly share code, notes, and snippets.

@SalahAdDin
Last active August 29, 2015 14:08
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save SalahAdDin/c35434875f4d6f259a0e to your computer and use it in GitHub Desktop.
Save SalahAdDin/c35434875f4d6f259a0e to your computer and use it in GitHub Desktop.
Usando haystack para hacer búsquedas normales y por fechas, y filtrando por tres campos.
<!--Contenido-->
<main>
<div class="row">
<!-- Left Wrapper Seccion listas -->
<div class="show-for-large-up small-1 large-3 columns left-wrapper">
<div class="tabs-content">
{% include 'search/search_menu.html' %}
</div>
</div>
<!--Contenido -->
<div class="small-6 large-9 columns right-content">
<!-- Noticia-->
{% block newscontent %}
{% endblock %}
</div>
</div>
</main>
class DateRangeSearchForm(SearchForm):
i = forms.DateField(required=False, label='Búsqueda',
widget=forms.DateInput(attrs={'type': 'date','class':'datepicker', 'placeholder':'2014-08-01',}))
f = forms.DateField(required=False, label='Búsqueda',
widget=forms.DateInput(attrs={'type': 'date','class':'datepicker', 'placeholder':'2016-01-01',}))
def search(self):
# First, store the SearchQuerySet received from other processing.
sqs = super(DateRangeSearchForm, self).search()
if not self.is_valid():
return self.no_query_found()
# Check to see if a start_date was chosen.
if self.cleaned_data['i']:
sqs = sqs.filter(created_date__gte=self.cleaned_data['i'])
# Check to see if an end_date was chosen.
if self.cleaned_data['f']:
sqs = sqs.filter(created_date__lte=self.cleaned_data['f'])
return sqs
class CustomFacetedSearchForm(DateRangeSearchForm):
q = forms.CharField(required=False, label='Búsqueda',
widget=forms.TextInput(attrs={'type': 'search', 'class':'gn-search', 'placeholder':'Busca y encontrarás!',}))
def __init__(self, *args, **kwargs):
self.selected_facets = kwargs.pop("selected_facets", [])
super(CustomFacetedSearchForm, self).__init__(*args, **kwargs)
def search(self):
sqs = super(CustomFacetedSearchForm, self).search()
# We need to process each facet to ensure that the field name and the
# value are quoted correctly and separately:
for facet in self.selected_facets:
if ":" not in facet:
continue
field, value = facet.split(":", 1)
if value:
sqs = sqs.narrow(u'%s:"%s"' % (field, sqs.query.clean(value)))
return sqs
class New(models.Model):
author = models.ForeignKey(User, verbose_name='Autor', related_name='news')
content = RichTextField(verbose_name='Contenido')
created_date = models.DateTimeField(auto_now_add=True, verbose_name='Fecha y Hora')
is_published = models.BooleanField(verbose_name='Publicada', default=False,) #Nueva, para verificar si se publica o no
keywords = models.ManyToManyField(KeyWord, blank=True, verbose_name='Palabras Clave', related_name='news')
place = models.CharField(max_length=255, verbose_name='Lugar')
source = models.URLField(verbose_name='Fuente', blank=True)
subtopic = models.ForeignKey(Subtopic, verbose_name='Subtema', related_name='news') #Filtramos por Opinion para sacar todas las columnas
times_viewed = models.PositiveIntegerField(default=0, editable=False, verbose_name='Veces Vista' )
title = models.CharField(verbose_name='Título', max_length=255, unique=True)
slug = models.SlugField(verbose_name='Slug', max_length=100, unique=True)
topic = models.ForeignKey(Topic, verbose_name='Tema', related_name='news', )
{% extends 'base_search.html'%}
{% load thumbnail %}
{% load static from staticfiles %}
{% load news %}
{% load highlight %}
{% load more_like_this %}
{% block titlepage %} Búsquedas {% endblock %}
{% block newsa %}{{ meta_author }}{% endblock %}
{% block newsd %} Búsquedas en Tiempo Turco {% endblock %}
{% block newsk %} búsqueda,buscar,{{ meta_today_keys }}{% endblock %}
{% load i18n %}
{% block slidermenu%}
<li id="slider" class="show-for-medium-up news-slider">
<ul id="ulslider" class="example-orbit-content" data-orbit data-options="
pause_on_hover:false;
slide_number_text:de;
timer_show_progress_bar: false;
bullets: false;
slide_number: false">
{% for new in lnews %}
<li data-orbit-slide="headline-{{forloop.counter}}">
<div>
<a class="news-title" href="{% url 'NewsDefaultView' new.created_date|date:'Y' new.created_date|date:'m' new.created_date|date:'d' new.slug %}">
<time datetime="{{ new.created_date|date:'Y-m-d H:i:s' }}">{{ new.created_date|date:'H:i:s' }}</time>
<h2>{{new.title|truncatewords:'8'}}</h2>
</a>
<a class="share-popup gn-icon-other nopadding gn-icon-facebook" href="http://www.facebook.com/sharer.php?u={{ meta_url }}{% url 'NewsDefaultView' new.created_date|date:'Y' new.created_date|date:'m' new.created_date|date:'d' new.slug %}&t={{ news.title }}" target="_blank"></a>
<a class="share-popup gn-icon-other nopadding gn-icon-twitter" href="http://twitter.com/share?url={{ meta_url }}{% url 'NewsDefaultView' new.created_date|date:'Y' new.created_date|date:'m' new.created_date|date:'d' new.slug %}&t={{ new.title }}&text={{ new.title }}" target="_blank"></a>
</div>
</li>
{% empty %}
<p>No hay noticias disponibles.</p>
{% endfor %}
</ul>
</li>
{% endblock %}
{% block newscontent %}
<form class="row articles-news" style="border-bottom: none">
<div class="row" style="margin: 0.625rem 0;">
<div class="large-4 columns"><h1>Búsqueda</h1></div>
<div class="large-8 columns" method="get" action=".">
<div class="row search-bar">
<div class="gn-search-item">
<div class="large-7 columns">
{{ form.q }}
<a class="gn-icon gn-icon-search"><span>Busca y encontrarás!</span></a>
</div>
<div class="large-3 columns">
{{ form.i }}
{{ form.f }}
{#<a class="gn-icon gn-icon-search"><span>Fecha!</span></a>#}
</div>
<div class="large-2 columns"><input id="_search" type="submit" value="Buscar" class="button round" /></div>
</div>
</div>
</div>
</div>
{% if query %}
<h2>Resultados</h2><h3>{{ page.start_index }} - {{ page.end_index }} de {{ page.paginator.count }}.</h3>
<div class="row">
{% for result in page.object_list %}
<article>
<header style="border-bottom: none">
<!-- Cabezera del articulo -->
<div class="row">
<div class="small-8 large-12 columns">
<a href="{{ result.object.get_absolute_url }}">
<h1 style="font-size: 1.5rem; display: inline">{{ result.object.title }}</h1>
</a>
<time datetime="{{ result.object.created_date|date:'Y-m-d H:i:s' }}">{{ result.object.created_date|date:'h:i a, l j \d\e F \d\e Y' }}</time>
</div>
</div>
</header>
<div class="row">
<div class="small-6 large-12 columns">
<section class="row">
<p class="review" style="width: 95%">{% highlight result.object.content with query max_length 500 %}<a href="{{ result.object.get_absolute_url }}">Leer mas...</a></p>
</section>
</div>
</div>
<footer class="row">
</footer>
</article>
{% empty %}
<p> No se encontraron resultados para tu búsqueda.</p>
{% endfor %}
</div>
{% if page.has_previous or page.has_next %}
<div class="pagination-centered">
<ul class="pagination">
{% if page.has_previous %}
<li class="arrow"><a href="?q={{ query }}&amp;page={{ page.previous_page_number }}">&laquo;</a></li>
{% else %}
<li class="arrow unavailable"><a href="">&laquo;</a></li>
{% endif %}
{% for page_num in paginator.page_range %}
<li {% if page_num == page.number %} class="current" {% endif %} ><a href="?q={{ query }}&amp;page={{ page_num }}">{{ page_num }}</a></li>
{% endfor %}
{% if page.has_next %}
<li class="arrow"><a href="?q={{ query }}&amp;page={{ page.next_page_number }}">&raquo;</a></li>
{% else %}
<li class="arrow unavailable"><a href="">&raquo;</a></li>
{% endif %}
</ul>
</div>
{% endif %}
{% else %}
<p>No hay resultados para tu búsqueda, lo sentimos.</p>
{% endif %}
</form>
{% endblock %}
{% block jsplugins %}
<script src="{% static 'tiempo_turco/js/jquery-ui.min.js' %}"></script>
<script>
$(window).on('load',function(){
if(!Modernizr.inputtypes.date) {
$(".datepicker").datepicker({
inline: true,
showOtherMonths: true,
dateFormat: 'yy-mm-dd',
closeText: 'Cerrar',
prevText: '&#x3c;Ant',
nextText: 'Sig&#x3e;',
currentText: 'Hoy',
monthNames: ['Enero','Febrero','Marzo','Abril','Mayo','Junio',
'Julio','Agosto','Septiembre','Octubre','Noviembre','Diciembre'],
monthNamesShort: ['Ene','Feb','Mar','Abr','May','Jun',
'Jul','Ago','Sep','Oct','Nov','Dic'],
dayNames: ['Domingo','Lunes','Martes','Mi&eacute;rcoles','Jueves','Viernes','S&aacute;bado'],
dayNamesShort: ['Dom','Lun','Mar','Mi&eacute;','Juv','Vie','S&aacute;b'],
dayNamesMin: ['Do','Lu','Ma','Mi','Ju','Vi','S&aacute;'],
weekHeader: 'Sm',
firstDay: 1,
isRTL: false,
showMonthAfterYear: false,
yearSuffix: '',
changeMonth: true,
changeYear: true
});
}
});
</script>
{% endblock %}
import datetime
from haystack import indexes
from .models import New
class NewsIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.CharField(document=True, use_template=True )
author = indexes.CharField(model_attr='author', faceted=True)
content = indexes.CharField(model_attr='content')
created_date = indexes.DateTimeField(model_attr='created_date', faceted=True)
place = indexes.CharField(model_attr='place',faceted=True)
title = indexes.CharField(model_attr='title')
times_viewed = indexes.IntegerField(model_attr='times_viewed')
def get_model(self):
return New
def index_queryset(self, using=None):
return self.get_model().objects.filter(created_date__lte=datetime.datetime.now())
{% load news %}
{% if query %}
<h2 style="margin: 0.625rem">Ordenar</h2>
<form id="id_sorts" method="get" action=".">
<select data-name="Ordenar" name="sort">
<option value="v">Relevancia</option>
<option value="t">Título</option>
<option value="d">Fecha</option>
</select>
<input id="_sorts" type="submit" value="Ordenar" class="button round right large-4" style="padding: 0.7rem 1.2rem 0.6rem 1.2rem" />
</form>
<ul class="sorting">
<li><a href="?{% query_update 'sort' 'v' %}">Relevancia</a></li>
<li><a href="?{% query_update 'sort' 't' %}">Título</a></li>
<li><a href="?{% query_update 'sort' 'd' %}">Fecha</a></li>
</ul>
<h2 style="margin: 0.625rem">Filtrar</h2>
<form id="id_facets" method="get" action=".">
<!-- Begin faceting. -->
<div style="margin-right: 0.625rem">
<div>
{% if facets.fields.author %}
<h3>Autores</h3>
{# Provide only the top 5 authors #}
<select data-name="Author">
<option value="">Autor</option>
<option value="">---</option>
{% for author in facets.fields.author|slice:":5" %}
<option value="{{ author.0 }} ({{ author.1 }})" ><a href="{{ request.get_full_path }}&amp;selected_facets=author_exact:{{ author.0|urlencode }}">{{ author.0 }}</a> ({{ author.1 }})</option>
{% endfor %}
</select>
{% else %}
<p>No hay autores.</p>
{% endif %}
</div>
<div>
{% if facets.fields.place %}
<h3>Lugares</h3>
{# Provide only the top 5 authors #}
<select data-name="Place" name="{{ request.get_full_path }}&amp;selected_facets=place_exact:">
<option value="">Lugar</option>
<option value="">---</option>
{% for place in facets.fields.place %}
<option data-name="{{ request.get_full_path }}&amp;selected_facets=place_exact:{{ place.0|urlencode }}" value="{{ place.0|urlencode }}" ><a href="{{ request.get_full_path }}&amp;selected_facets=place_exact:{{ place.0|urlencode }}">{{ place.0 }}</a> ({{ place.1 }})</option>
{% endfor %}
</select>
{% else %}
<p>No hay Lugares.</p>
{% endif %}
<dl>
{% if facets.fields.place %}
<dt>Author</dt>
{# Provide only the top 5 authors #}
{% for place in facets.fields.place|slice:":5" %}
<dd><a href="{{ request.get_full_path }}&amp;selected_facets=place_exact:{{ place.0|urlencode }}">{{ place.0 }}</a> ({{ place.1 }})</dd>
{% endfor %}
{% else %}
<p>No author facets.</p>
{% endif %}
</dl>
</div>
<div>
{% if facets.dates.created_date %}
<h3>Fecha</h3>
{# Provide only the top 5 authors #}
<select data-name="Date">
<option value="">Fecha</option>
<option value="">---</option>
{% for created_date in facets.dates.created_date|slice:":5" %}
<option data-name="" value="{{ created_date.0 }} ({{ created_date.1 }})" ><a href="{{ request.get_full_path }}&amp;selected_facets=created_date_exact:{{ created_date.0|urlencode }}">{{ created_date.0 }}</a> ({{ created_date.1 }})</option>
{% endfor %}
</select>
{% else %}
<p>No hay Fechas concordantes.</p>
{% endif %}
</div>
</div>
<input id="_facets" type="submit" value="Filtrar" class="button round right large-4" style="padding: 0.7rem 1.2rem 0.6rem 1.2rem" />
<!-- End faceting -->
</form>
{% endif %}
today = datetime.date.today()
sqs = SearchQuerySet().facet('place').facet('author').date_facet('created_date', start_date=datetime.date(2014, 4, 20), end_date=today, gap_by='month').order_by('-created_date')
urlpatterns += patterns('haystack.views',
url(r'^search/', search_view_factory(
view_class=SearchNewsView,
searchqueryset=sqs,
form_class=CustomFacetedSearchForm
), name='haystack_search'),
)
class SearchNewsView(FacetedSearchView):
template = 'search/search.html'
def extra_context(self):
today = datetime.date.today()
extra = super(SearchNewsView, self).extra_context()
extra['lnews'] = New.objects.filter(is_published=True).all()[:10] #Mas noticias
return extra
def get_query(self):
#searchqueryset = super(SearchNewsView, self).get_results()
#searchqueryset = searchqueryset.models(New)
sort = self.request.GET.get('sort')
print(sort)
if sort in sort_by.keys():
#searchqueryset = searchqueryset.order_by('%s' % sort_by[sort])
print('%s' % sort_by[sort])
return New.objects.filter().order_by('%s' % sort_by[sort])
else:
#searchqueryset = searchqueryset.order_by('-created_date')
return New.objects.filter().order_by('-creation')
#return searchqueryset
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment