Searching feature is fixed. Now it can search for entries properly.

* /search/ url matched mapped to query() view.
    * model filtering process has taken from the query() view fnc. to a distinct fnc. in order to provide reusability.
This commit is contained in:
Mustafa Arıcı 2011-06-12 12:14:57 +00:00
parent 66269276e5
commit ffb123c184
6 changed files with 213 additions and 53 deletions

View File

@ -4,6 +4,7 @@
from django import forms
from captcha.fields import CaptchaField
from datetime import date
from django.contrib.admin import widgets
class ContactForm(forms.Form):
@ -21,5 +22,11 @@ class QueryForm(forms.Form):
q_author_surname = forms.CharField(max_length=25, required = False, label = 'Soyadı')
q_text = forms.CharField(required = False, label = 'Aradığınız metin', widget = forms.widgets.Textarea() )
q_label_personal = forms.BooleanField(required = False, label = 'Kişisel Günlükler', initial = True)
q_label_lkd = forms.BooleanField(required = False, label = 'LKD Günlükleri', initial = True)
q_label_community = forms.BooleanField(required = False, label = 'Topluluk Günlükleri')
q_label_eng = forms.BooleanField(required = False, label = 'İngilizce Günlükler')
q_date = forms.DateField(required = False, initial=date.today,label = "Tarih",widget = forms.widgets.DateInput(format="%d-%m-%Y"), help_text="Örn: 21-11-2010")
q_date_from = forms.DateField(required = False, initial=date.today,label = "Şurdan",widget = widgets.AdminDateWidget() )
q_date_till = forms.DateField(required = False, initial=date.today,label = "Şuraya",widget = widgets.AdminDateWidget() )

View File

@ -115,7 +115,52 @@ def list_members(request):
return render_response(request, 'main/members.html', {'members': authors, 'BASE_URL': BASE_URL,'info_area' : info_area })
def __search(cleaned_data):
cdata = cleaned_data
q_author_name = cdata.get('q_author_name','')
q_author_surname = cdata.get('q_author_surname','')
q_text = cdata.get('q_text','')
q_date_from = cdata.get('q_date_from','')
q_date_till = cdata.get('q_date_till','')
q_label_personal = cdata.get('q_label_personal','')
q_label_community = cdata.get('q_label_community','')
q_label_lkd = cdata.get('q_label_lkd','')
q_label_eng = cdata.get('q_label_eng','')
entries_list = Entries.objects.select_related()
# Name - surname queries.
if(q_author_name):
entries_list = entries_list.filter(entry_id__author_name__iexact = q_author_name)
if(q_author_surname):
entries_list = entries_list.filter(entry_id__author_surname__iexact = q_author_surname)
# Label based queries.
if(q_label_personal == True):
entries_list = entries_list.filter(entry_id__label_personal = 1)
if(q_label_community == True):
entries_list = entries_list.filter(entry_id__label_community = 1)
if(q_label_lkd == True):
entries_list = entries_list.filter(entry_id__label_lkd = 1)
if(q_label_eng == True):
entries_list = entries_list.filter(entry_id__label_eng = 1)
# Text search.
if(q_text):
entries_list = entries_list.filter(content_text__icontains = q_text)
# Date based queries.
if(q_date_from and q_date_till):
entries_list = entries_list.filter(date__range = (q_date_from,q_date_till))
return entries_list
def query(request):
# Determine if method is POST.
if (request.method == 'POST'):
## If Yes:
@ -124,52 +169,60 @@ def query(request):
# Determine if all of them were valid.
if (form.is_valid()):
cdata = form.cleaned_data
entries_list = __search(cdata)
p_entries_list = entries_list
truncate_words = 250
items_per_page = 25
#get the last run time
run_time = RunTime.objects.all()[0]
info_area = 'search'
# Pagination
elements_in_a_page = 25 # This determines, how many elements will be displayed in a paginator page.
paginator = Paginator(entries_list,elements_in_a_page)
# Validation for page number if it is not int return first page.
try:
page = int(request.GET.get('page', '1'))
except ValueError:
page = 1
# If page request is out of range, return last page .
try:
p_entries_list = paginator.page(page)
except (EmptyPage, InvalidPage):
p_entries_list = paginator.page(paginator.num_pages)
#--
## If Yes:
#q_author_name = request.POST.get('q_author_name','')
q_author_name = cdata.get('q_author_name','')
q_author_surname = cdata.get('q_author_surname','')
q_text = cdata.get('q_text','')
q_date = cdata.get('q_date','')
if (q_date != None):
q_date_year = str(q_date.year)
q_date_month = str(q_date.month)
q_date_day = str(q_date.day)
else:
q_date_year,q_date_month,q_date_day = None,None,None
return render_to_response('main/searchresult.html' ,{
'entries_list':entries_list,
'p_entries_list':p_entries_list,
'truncate_words':truncate_words,
'items_per_page':repr(items_per_page),
'run_time':run_time,
'info_area':info_area,
#'q_author_name':q_author_name,
#'q_author_surname':q_author_surname,
#'q_text':q_text,
'BASE_URL':BASE_URL,
})
# Redirect or call /archive/ view with the existing POST arguments.
#++ Complex string operations in order to form needed target_url.
args_part = "?q_author_name=%s&q_author_surname=%s&q_text=%s" % (q_author_name,q_author_surname,q_text)
date_part = ''
if (q_date_year):
date_part = q_date_year
if(q_date_month):
date_part += "/" + q_date_month
if(q_date_day):
date_part += "/" + q_date_day + "/"
target_url = BASE_URL+"/archive/" + date_part + args_part
#--
return HttpResponseRedirect(target_url)
else:
"""else:
# Issue an error message and show the form again.
form = QueryForm()
form = SearchForm(request.POST)
info_area = "query"
return render_to_response('main/query.html', {'q_form': form, 'BASE_URL': BASE_URL,'info_area':info_area})
return render_to_response('main/query.html', {'q_form': form, 'BASE_URL': BASE_URL,'info_area':info_area})"""
else:
# Show the form.
info_area = 'query'
form = QueryForm()
info_area = "query"
return render_to_response('main/query.html', {'q_form': form, 'BASE_URL': BASE_URL,'info_area':info_area})

View File

@ -18,6 +18,7 @@
</script>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js" type="text/javascript"></script>
<script src="/djagenmedia/script.js" type="text/javascript"></script>
</head>
{% endblock %}
@ -45,7 +46,7 @@
{% blocktrans %}<li><a href="{{ BASE_URL }}/english">İngilizce Günlükler</a></li>{% endblocktrans %}
<li><a href="#" id="arsiv">Arşiv</a>
<ul class="navlist">
<li><a href="{{ BASE_URL }}/query/">{% trans "Ara" %}</a></li>
<li><a href="{{ BASE_URL }}/search/">{% trans "Ara" %}</a></li>
{% for dt in last_date_li %}
<li><a href="{{ BASE_URL }}/archive/{{ dt|date:"Y/m/d"}}">{{ dt|date:"d.m.Y" }}</a>
{% endfor %}

View File

@ -1,7 +1,7 @@
{% extends "main/base.html" %}
{% block body %}
<form action="{{ BASE_URL }}/query/" method="POST" enctype="multipart/form-data">
<form action="{{ BASE_URL }}/search/" method="POST" enctype="multipart/form-data">
<table border="0px">
{% for field in q_form %}
<tr>
@ -13,18 +13,15 @@
</td>
{% if field.help_text %}
<td>
<span class="small">
{{ field.help_text }}
</span>
</td>
{% endif %}
{% if field.errors %}
{% if field.errors %}
<td>
<span class="error">
{{ field.errors }}
</span>
</td>
{% endif %}
{% endif %}
</div>
@ -32,6 +29,6 @@
{% endfor %}
</table>
<div class="spacer"></div>
<input type="submit" value="Listele" />
<input type="submit" value="Ara!" />
</form>
{% endblock %}

View File

@ -0,0 +1,102 @@
{% extends "main/base.html" %}
{% block body %}
{% if entries_list|length %}
{% for entry in p_entries_list.object_list|slice:items_per_page %}
{% autoescape off %}
{% ifequal entry.entry_id.is_approved 1 %}
{% ifchanged entry.date.day entry.date.month entry.date.year %}<div class="separator"></div>{% endifchanged %}
{% ifchanged %}<h2 class="date">{{ entry.date|date:"d F Y" }}</h2>{% endifchanged %}
<div class="innercontent">
<a href="{{ entry.entry_id.channel_link }}" title="{{ entry.entry_id.channel_title }}"><img class="face" src="/djagenmedia/images/heads/{{ entry.entry_id.author_face|default:"nobody.png" }}" title="{{ entry.entry_id.author_name }} {{ entry.entry_id.author_surname }}" width="80" height="80" /></a>
<h1 class="title"><a href="{{ entry.link }} ">{{ entry.title }}</a></h1>
<p class="yazaneden">
Yazar:&nbsp;<a href="{{ entry.entry_id.channel_link }}" title="{{ entry.entry_id.channel_title }}">{{ entry.entry_id.author_name }} {{ entry.entry_id.author_surname }}</a>
Tarih:&nbsp;<span class="blogdate">{{ entry.date|date:"d F Y H:i" }}</span>
</p>
<div class="blogcontent">
{{ entry.content_html|truncatewords_html:truncate_words }}
</div>
{% endifequal %}
{% endautoescape %}
</div>
{% endfor %}
<div class="pagination">
<span class="step-links">
{% if q_author_name or q_author_surname or q_text %}
<span class="current">
Sayfa <b>{{ p_entries_list.number }}</b> / <b>{{ p_entries_list.paginator.num_pages }}</b>
</span>
<div class="pagelist" style="text-align:center">
{% if p_entries_list.has_previous %}
<a href="?q_author_name={{ q_author_name }}&q_author_surname={{ q_author_surname }}&q_text={{ q_text }}&page={{ p_entries_list.previous_page_number }}">Geri</a>
{% endif %}
|
{% for pNum in p_entries_list.paginator.page_range %}
{% ifequal pNum p_entries_list.number %}
{{ pNum }}
{% else %}
<a href="?page={{ pNum }}">{{ pNum }}</a>
{% endifequal %}
{% endfor %}
|
{% if p_entries_list.has_next %}
<a href="?q_author_name={{ q_author_name }}&q_author_surname={{ q_author_surname }}&q_text={{ q_text }}&page={{ p_entries_list.next_page_number }}">İleri</a>
{% endif %}
</div>
</span>
</div>
{% else %}
<span class="current">
Sayfa <b>{{ p_entries_list.number }}</b> / <b>{{ p_entries_list.paginator.num_pages }}</b>
</span>
<div class="pagelist" style="text-align:center">
{% if p_entries_list.has_previous %}
<a href="?q_author_name=?page={{ p_entries_list.previous_page_number }}">Geri</a>
{% endif %}
|
{% for pNum in p_entries_list.paginator.page_range %}
{% ifequal pNum p_entries_list.number %}
{{ pNum }}
{% else %}
<a href="?page={{ pNum }}">{{ pNum }}</a>
{% endifequal %}
{% endfor %}
|
{% if p_entries_list.has_next %}
<a href="?page={{ p_entries_list.next_page_number }}">İleri</a>
{% endif %}
</div>
</span>
</div>
{% endif %}
{% else %}
<br>
<br>
<h1><center>Gösterecek veri yok!</center></h1>
<br>
{% endif %}
{% endblock %}

View File

@ -28,7 +28,7 @@ urlpatterns = patterns('',
(r'^archive/(?P<archive_year>\d{4})/$', archive),
(r'^archive/(?P<archive_year>\d{4})/(?P<archive_month>\d{1,2})/$', archive),
(r'^archive/(?P<archive_year>\d{4})/(?P<archive_month>\d{1,2})/(?P<archive_day>\d{1,2})/$', archive),
(r'^query/$',query),
(r'^search/$',query),
)
urlpatterns += patterns('',
url(r'^captcha/', include('captcha.urls')),