mirror of
https://github.com/reddit-archive/reddit.git
synced 2026-01-29 08:48:18 -05:00
Add simple date drop down to search
This commit is contained in:
@@ -776,11 +776,12 @@ class FrontController(RedditController, OAuth2ResourceController):
|
||||
@base_listing
|
||||
@validate(query=VLength('q', max_length=512),
|
||||
sort=VMenu('sort', SearchSortMenu, remember=False),
|
||||
recent=VMenu('t', TimeMenu, remember=False),
|
||||
restrict_sr=VBoolean('restrict_sr', default=False),
|
||||
syntax=VOneOf('syntax', options=SearchQuery.known_syntaxes))
|
||||
@api_doc(api_section.search, extensions=['json', 'xml'])
|
||||
def GET_search(self, query, num, reverse, after, count, sort, restrict_sr,
|
||||
syntax):
|
||||
def GET_search(self, query, num, reverse, after, count, sort, recent,
|
||||
restrict_sr, syntax):
|
||||
"""Search links page."""
|
||||
if query and '.' in query:
|
||||
url = sanitize_url(query, require_scheme = True)
|
||||
@@ -798,7 +799,8 @@ class FrontController(RedditController, OAuth2ResourceController):
|
||||
try:
|
||||
cleanup_message = None
|
||||
try:
|
||||
q = SearchQuery(query, site, sort, syntax=syntax)
|
||||
q = SearchQuery(query, site, sort,
|
||||
recent=recent, syntax=syntax)
|
||||
results, etime, spane = self._search(q, num=num, after=after,
|
||||
reverse=reverse,
|
||||
count=count)
|
||||
@@ -810,7 +812,7 @@ class FrontController(RedditController, OAuth2ResourceController):
|
||||
cleaned = re.sub("[^\w\s]+", " ", query)
|
||||
cleaned = cleaned.lower().strip()
|
||||
|
||||
q = SearchQuery(cleaned, site, sort)
|
||||
q = SearchQuery(cleaned, site, sort, recent=recent)
|
||||
results, etime, spane = self._search(q, num=num,
|
||||
after=after,
|
||||
reverse=reverse,
|
||||
@@ -828,8 +830,9 @@ class FrontController(RedditController, OAuth2ResourceController):
|
||||
|
||||
res = SearchPage(_('search results'), query, etime, results.hits,
|
||||
content=spane,
|
||||
nav_menus=[SearchSortMenu(default=sort)],
|
||||
search_params=dict(sort=sort),
|
||||
nav_menus=[SearchSortMenu(default=sort),
|
||||
TimeMenu(default=recent)],
|
||||
search_params=dict(sort=sort, t=recent),
|
||||
infotext=cleanup_message,
|
||||
simple=False, site=c.site,
|
||||
restrict_sr=restrict_sr,
|
||||
@@ -837,6 +840,7 @@ class FrontController(RedditController, OAuth2ResourceController):
|
||||
converted_data=q.converted_data,
|
||||
facets=results.subreddit_facets,
|
||||
sort=sort,
|
||||
recent=recent,
|
||||
).render()
|
||||
|
||||
return res
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
|
||||
import collections
|
||||
import cPickle as pickle
|
||||
from datetime import datetime
|
||||
from datetime import datetime, timedelta
|
||||
import functools
|
||||
import httplib
|
||||
import json
|
||||
@@ -36,6 +36,7 @@ import l2cs
|
||||
|
||||
from r2.lib import amqp, filters
|
||||
from r2.lib.db.operators import desc
|
||||
from r2.lib.db.sorts import epoch_seconds
|
||||
import r2.lib.utils as r2utils
|
||||
from r2.models import (Account, Link, Subreddit, Thing, All, DefaultSR,
|
||||
MultiReddit, DomainSR, Friends, ModContribSR,
|
||||
@@ -797,12 +798,13 @@ class CloudSearchQuery(object):
|
||||
search_api = None
|
||||
sorts = {}
|
||||
sorts_menu_mapping = {}
|
||||
recents = {None: None}
|
||||
known_syntaxes = ("cloudsearch", "lucene", "plain")
|
||||
default_syntax = "plain"
|
||||
lucene_parser = None
|
||||
|
||||
def __init__(self, query, sr=None, sort=None, syntax=None, raw_sort=None,
|
||||
faceting=None):
|
||||
faceting=None, recent=None):
|
||||
if syntax is None:
|
||||
syntax = self.default_syntax
|
||||
elif syntax not in self.known_syntaxes:
|
||||
@@ -816,6 +818,8 @@ class CloudSearchQuery(object):
|
||||
self.sort = raw_sort
|
||||
else:
|
||||
self.sort = self.sorts[sort]
|
||||
self._recent = recent
|
||||
self.recent = self.recents[recent]
|
||||
self.faceting = faceting
|
||||
self.bq = u''
|
||||
self.results = None
|
||||
@@ -936,7 +940,14 @@ class LinkSearchQuery(CloudSearchQuery):
|
||||
'top': 4,
|
||||
'comments': 5,
|
||||
}
|
||||
|
||||
recents = {
|
||||
'hour': timedelta(hours=1),
|
||||
'day': timedelta(days=1),
|
||||
'week': timedelta(days=7),
|
||||
'month': timedelta(days=31),
|
||||
'year': timedelta(days=366),
|
||||
'all': None,
|
||||
}
|
||||
schema = l2cs.make_schema(LinkFields.lucene_fieldnames())
|
||||
lucene_parser = l2cs.make_parser(
|
||||
int_fields=LinkFields.lucene_fieldnames(type_=int),
|
||||
@@ -946,29 +957,30 @@ class LinkSearchQuery(CloudSearchQuery):
|
||||
default_syntax = "lucene"
|
||||
|
||||
def customize_query(self, bq):
|
||||
queries = [bq]
|
||||
subreddit_query = self._get_sr_restriction(self.sr)
|
||||
return self.create_boolean_query(bq, subreddit_query)
|
||||
if subreddit_query:
|
||||
queries.append(subreddit_query)
|
||||
if self.recent:
|
||||
recent_query = self._restrict_recent(self.recent)
|
||||
queries.append(recent_query)
|
||||
return self.create_boolean_query(queries)
|
||||
|
||||
@classmethod
|
||||
def create_boolean_query(cls, query, subreddit_query):
|
||||
'''Join a (user-entered) text query with the generated subreddit query
|
||||
|
||||
Input:
|
||||
base_query: user input from the search textbox
|
||||
subreddit_query: output from _get_sr_restriction(sr)
|
||||
|
||||
Test cases:
|
||||
base_query: simple, simple with quotes, boolean, boolean w/ parens
|
||||
subreddit_query: None, in parens '(or sr_id:1 sr_id:2 ...)',
|
||||
without parens "author:'foo'"
|
||||
|
||||
'''
|
||||
if subreddit_query:
|
||||
bq = "(and %s %s)" % (query, subreddit_query)
|
||||
def create_boolean_query(cls, queries):
|
||||
'''Return an AND clause combining all queries'''
|
||||
if len(queries) > 1:
|
||||
bq = '(and ' + ' '.join(queries) + ')'
|
||||
else:
|
||||
bq = query
|
||||
bq = queries[0]
|
||||
return bq
|
||||
|
||||
@staticmethod
|
||||
def _restrict_recent(recent):
|
||||
now = datetime.now(g.tz)
|
||||
since = epoch_seconds(now - recent)
|
||||
return 'timestamp:%i..' % since
|
||||
|
||||
@staticmethod
|
||||
def _get_sr_restriction(sr):
|
||||
'''Return a cloudsearch appropriate query string that restricts
|
||||
|
||||
@@ -922,6 +922,7 @@ class SearchPage(BoringPage):
|
||||
num_results, search_params={},
|
||||
simple=False, restrict_sr=False, site=None,
|
||||
syntax=None, converted_data=None, facets={}, sort=None,
|
||||
recent=None,
|
||||
*a, **kw):
|
||||
self.searchbar = SearchBar(prev_search=prev_search,
|
||||
elapsed_time=elapsed_time,
|
||||
@@ -930,7 +931,7 @@ class SearchPage(BoringPage):
|
||||
show_feedback=True, site=site,
|
||||
simple=simple, restrict_sr=restrict_sr,
|
||||
syntax=syntax, converted_data=converted_data,
|
||||
facets=facets, sort=sort)
|
||||
facets=facets, sort=sort, recent=recent)
|
||||
BoringPage.__init__(self, pagename, robots='noindex', *a, **kw)
|
||||
|
||||
def content(self):
|
||||
@@ -1939,7 +1940,7 @@ class SearchBar(Templated):
|
||||
elapsed_time=0, search_params={}, show_feedback=False,
|
||||
simple=False, restrict_sr=False, site=None, syntax=None,
|
||||
subreddit_search=False, converted_data=None, facets={},
|
||||
sort=None, **kw):
|
||||
sort=None, recent=None, **kw):
|
||||
if header is None:
|
||||
header = _("previous search")
|
||||
self.header = header
|
||||
@@ -1959,7 +1960,7 @@ class SearchBar(Templated):
|
||||
site=site, syntax=syntax,
|
||||
converted_data=converted_data,
|
||||
subreddit_search=subreddit_search, facets=facets,
|
||||
sort=sort)
|
||||
sort=sort, recent=recent)
|
||||
|
||||
class Frame(Wrapped):
|
||||
"""Frameset for the FrameToolbar used when a user hits /tb/. The
|
||||
|
||||
@@ -516,7 +516,7 @@ def add_attr(attrs, kind, label=None, link=None, cssclass=None, symbol=None):
|
||||
attrs.append( (priority, symbol, cssclass, label, link, img) )
|
||||
|
||||
|
||||
def search_url(query, subreddit, restrict_sr="off", sort=None):
|
||||
def search_url(query, subreddit, restrict_sr="off", sort=None, recent=None):
|
||||
import urllib
|
||||
query = _force_utf8(query)
|
||||
url_query = {"q": query}
|
||||
@@ -524,6 +524,8 @@ def search_url(query, subreddit, restrict_sr="off", sort=None):
|
||||
url_query["restrict_sr"] = restrict_sr
|
||||
if sort:
|
||||
url_query["sort"] = sort
|
||||
if recent:
|
||||
url_query["t"] = recent
|
||||
path = "/r/%s/search?" % subreddit if subreddit else "/search?"
|
||||
path += urllib.urlencode(url_query)
|
||||
return path
|
||||
|
||||
@@ -80,7 +80,7 @@
|
||||
<ol class="list">
|
||||
%for subreddit, count in thing.facets:
|
||||
<li class="searchfacet reddit">
|
||||
<a class="facet title word" href="${search_url(thing.prev_search, subreddit.name, restrict_sr='on', sort=thing.sort)}">/r/${subreddit.name}</a>
|
||||
<a class="facet title word" href="${search_url(thing.prev_search, subreddit.name, restrict_sr='on', sort=thing.sort, recent=thing.recent)}">/r/${subreddit.name}</a>
|
||||
<span class="facet count number">(${count})</span>
|
||||
</li>
|
||||
%endfor
|
||||
|
||||
Reference in New Issue
Block a user