Skip to content

Commit

Permalink
Merge branch 'bug-549014' into development
Browse files Browse the repository at this point in the history
  • Loading branch information
James Socol committed Mar 1, 2010
2 parents b90fc3c + c19ce56 commit 2eb53c3
Show file tree
Hide file tree
Showing 7 changed files with 200 additions and 80 deletions.
43 changes: 43 additions & 0 deletions apps/search/templates/results.html
@@ -0,0 +1,43 @@
{% extends "common/base.html" %}
{% set title = _("Search") %}
{% set styles = ('css/search.css',) %}

{% block content %}
<div id="basic-search" class="search-refine">
<form role="search" method="get" action="search">
<input type="hidden" value="{% if w %}{{ w }}{% else %}3{% endif %}" name="w">
<input type="hidden" value="{{ locale }}" name="locale">
<input type="text" class="search-query search-refine-query" value="{{ q }}" name="q">
<input type="submit" class="search-refine-submit btn-large" value="{% print _("Search") %}">
</form>
</div>

<div class="search-count">
{% print _("About {num_results} search results for {q} in {lang_name}")|f(num_results=num_results, q=q, lang_name='English') %}
</div>

<div class="search-results">

{{ pages|paginator }}


{% for doc in results %}
<div class="oneresult">
<a class="searchresultlink" href="{{ doc.get_url() }}">{{ doc.name }}</a>
<p>
<a class="blacklink" href="{{ doc.get_url() }}">
{{ doc.search_summary }}
...
</a>
</p>
</div>
<div class="oneresulthr"></div>
{% endfor %}


{{ pages|paginator }}

</div>

<p>Can't find what you're looking for? <a href="/kb/Ask+a+question">Ask a support question instead!</a></p>
{% endblock %}
11 changes: 8 additions & 3 deletions apps/search/views.py
Expand Up @@ -4,6 +4,7 @@

import jingo

from sumo.utils import paginate
from sumo.models import ForumThread, WikiPage

from .clients import ForumClient, WikiClient
Expand All @@ -22,7 +23,9 @@ def search(request):

where = int(request.GET.get('w', WHERE_ALL))

offset = int(request.GET.get('offset', 0))
page = int(request.GET.get('page', 1))
page = max(page, 1)
offset = (page-1)*settings.SEARCH_RESULTS_PER_PAGE

documents = []

Expand Down Expand Up @@ -87,6 +90,8 @@ def search(request):

documents += fc.query(q, filters_f)

pages = paginate(request, documents, settings.SEARCH_RESULTS_PER_PAGE)

results = []
for i in range(offset, offset + settings.SEARCH_RESULTS_PER_PAGE):
try:
Expand All @@ -99,6 +104,6 @@ def search(request):
except (WikiPage.DoesNotExist, ForumThread.DoesNotExist):
continue

return jingo.render(request, 'search/results.html',
return jingo.render(request, 'results.html',
{'num_results': len(documents), 'results': results, 'q': q,
'locale': request.LANGUAGE_CODE, 'w': where})
'locale': request.LANGUAGE_CODE, 'pages': pages})
69 changes: 69 additions & 0 deletions apps/sumo/helpers.py
@@ -0,0 +1,69 @@
import cgi
import urllib
import urlparse

import jinja2

from jingo import register, env


@register.filter
def paginator(pager):
return Paginator(pager).render()


@register.filter
def urlparams(url_, hash=None, **query):
"""
Add a fragment and/or query paramaters to a URL.
New query params will be appended to exising parameters, except duplicate
names, which will be replaced.
"""
url = urlparse.urlparse(url_)
fragment = hash if hash is not None else url.fragment

query_dict = dict(cgi.parse_qsl(url.query)) if url.query else {}
query_dict.update((k, v) for k, v in query.items() if v is not None)

query_string = urllib.urlencode(query_dict.items())
new = urlparse.ParseResult(url.scheme, url.netloc, url.path, url.params,
query_string, fragment)
return jinja2.Markup(new.geturl())


class Paginator(object):

def __init__(self, pager):
self.pager = pager

self.max = 10
self.span = (self.max - 1) / 2

self.page = pager.number
self.num_pages = pager.paginator.num_pages
self.count = pager.paginator.count

pager.page_range = self.range()
pager.dotted_upper = self.count not in pager.page_range
pager.dotted_lower = 1 not in pager.page_range

def range(self):
"""Return a list of page numbers to show in the paginator."""
page, total, span = self.page, self.num_pages, self.span
if total < self.max:
lower, upper = 0, total
elif page < span + 1:
lower, upper = 0, span * 2
elif page > total - span:
lower, upper = total - span * 2, total
else:
lower, upper = page - span, page + span - 1
return range(max(lower + 1, 1), min(total, upper) + 1)

def render(self):
c = {'pager': self.pager, 'num_pages': self.num_pages,
'count': self.count}
t = env.get_template('layout/paginator.html').render(**c)
return jinja2.Markup(t)

25 changes: 25 additions & 0 deletions apps/sumo/utils.py
@@ -0,0 +1,25 @@
import functools
import urllib

from django.core import paginator


def paginate(request, queryset, per_page=20):
"""Get a Paginator, abstracting some common paging actions."""
p = paginator.Paginator(queryset, per_page)

# Get the page from the request, make sure it's an int.
try:
page = int(request.GET.get('page', 1))
except ValueError:
page = 1

# Get a page of results, or the first page if there's a problem.
try:
paginated = p.page(page)
except (paginator.EmptyPage, paginator.InvalidPage):
paginated = p.page(1)

base = request.build_absolute_uri(request.path)
paginated.url = u'%s?%s' % (base, urllib.urlencode(request.GET.items()))
return paginated
22 changes: 16 additions & 6 deletions media/css/search.css
@@ -1,3 +1,7 @@
.search-results {
font-size: 110%;
}

.search-query {
border: 1px solid #E16601;
width: 270px;
Expand All @@ -7,17 +11,23 @@
text-transform: none;
}

.pager {
padding: 10px 20px;
/* Paginators */
ol.pagination {
margin: .5em auto 1em;
text-align: center;
}

.pager li {
float: left;
ol.pagination > li {
display: inline;
padding: 0 4px;
}

ol.pagination > li.selected a {
color: #000;
}

.pager a, .pager span {
padding: 0 4px;
div.num-results {
clear: left;
}

div.search-count {
Expand Down
39 changes: 39 additions & 0 deletions templates/layout/paginator.html
@@ -0,0 +1,39 @@
{% if num_pages > 1 %}
<ol class="pagination">
{% if pager.has_previous() %}
<li rel="prev">
<a href="{{ pager.url|urlparams(page=pager.previous_page_number()) }}">
{{ _('‹ Previous') }}
</a>
</li>
{% endif %}
{% if pager.dotted_lower %}
<li><a href="{{ pager.url|urlparams(page=1) }}">{{ 1 }}</a></li>
<li class="skip">&hellip;</li>
{% endif %}
{% for x in pager.page_range %}
<li {{ x|class_selected(pager.number) }}>
<a href="{{ pager.url|urlparams(page=x) }}">{{ x }}</a>
</li>
{% endfor %}
{% if pager.dotted_upper %}
<li class="skip">&hellip;</li>
<li><a href="{{ pager.url|urlparams(page=num_pages) }}">{{ num_pages }}</a></li>
{% endif %}
{% if pager.has_next() %}
<li rel="next">
<a href="{{ pager.url|urlparams(page=pager.next_page_number()) }}">
{{ _('Next ›') }}
</a>
</li>
{% endif %}
</ol>
<div class="num-results">
{% trans begin=pager.start_index(), end=pager.end_index() %}
Results <strong>{{ begin }}</strong>&ndash;<strong>{{ end }}</strong>
of {{ count }}
{% endtrans %}
</div>
{% endif %}


71 changes: 0 additions & 71 deletions templates/search/results.html

This file was deleted.

0 comments on commit 2eb53c3

Please sign in to comment.