Last active
August 29, 2015 14:08
-
-
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.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<!--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> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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', ) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{% 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 }}&page={{ page.previous_page_number }}">«</a></li> | |
{% else %} | |
<li class="arrow unavailable"><a href="">«</a></li> | |
{% endif %} | |
{% for page_num in paginator.page_range %} | |
<li {% if page_num == page.number %} class="current" {% endif %} ><a href="?q={{ query }}&page={{ page_num }}">{{ page_num }}</a></li> | |
{% endfor %} | |
{% if page.has_next %} | |
<li class="arrow"><a href="?q={{ query }}&page={{ page.next_page_number }}">»</a></li> | |
{% else %} | |
<li class="arrow unavailable"><a href="">»</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: '<Ant', | |
nextText: 'Sig>', | |
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ércoles','Jueves','Viernes','Sábado'], | |
dayNamesShort: ['Dom','Lun','Mar','Mié','Juv','Vie','Sáb'], | |
dayNamesMin: ['Do','Lu','Ma','Mi','Ju','Vi','Sá'], | |
weekHeader: 'Sm', | |
firstDay: 1, | |
isRTL: false, | |
showMonthAfterYear: false, | |
yearSuffix: '', | |
changeMonth: true, | |
changeYear: true | |
}); | |
} | |
}); | |
</script> | |
{% endblock %} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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()) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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'), | |
) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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