~ubuntu-branches/ubuntu/natty/moin/natty-updates

« back to all changes in this revision

Viewing changes to MoinMoin/action/fullsearch.py

  • Committer: Bazaar Package Importer
  • Author(s): Jonas Smedegaard
  • Date: 2008-06-22 21:17:13 UTC
  • mto: This revision was merged to the branch mainline in revision 18.
  • Revision ID: james.westby@ubuntu.com-20080622211713-inlv5k4eifxckelr
ImportĀ upstreamĀ versionĀ 1.7.0

Show diffs side-by-side

added added

removed removed

Lines of Context:
11
11
import re, time
12
12
from MoinMoin.Page import Page
13
13
from MoinMoin import wikiutil
14
 
from parsedatetime.parsedatetime import Calendar
15
 
from MoinMoin.web.utils import check_surge_protect
 
14
from MoinMoin.support.parsedatetime.parsedatetime import Calendar
16
15
 
17
16
def checkTitleSearch(request):
18
17
    """ Return 1 for title search, 0 for full text search, -1 for idiot spammer
23
22
    'fullsearch' with localized string. If both missing, default to
24
23
    True (might happen with Safari) if this isn't an advanced search.
25
24
"""
26
 
    form = request.values
 
25
    form = request.form
27
26
    if 'titlesearch' in form and 'fullsearch' in form:
28
27
        ret = -1 # spammer / bot
29
28
    else:
30
29
        try:
31
 
            ret = int(form['titlesearch'])
 
30
            ret = int(form['titlesearch'][0])
32
31
        except ValueError:
33
32
            ret = 1
34
33
        except KeyError:
38
37
def isAdvancedSearch(request):
39
38
    """ Return True if advanced search is requested """
40
39
    try:
41
 
        return int(request.values['advancedsearch'])
 
40
        return int(request.form['advancedsearch'][0])
42
41
    except KeyError:
43
42
        return False
44
43
 
61
60
    _ = request.getText
62
61
    titlesearch = checkTitleSearch(request)
63
62
    if titlesearch < 0:
64
 
        check_surge_protect(request, kick=True) # get rid of spammer
 
63
        request.makeForbidden403()
 
64
        request.surge_protect(kick_him=True) # get rid of spammer
65
65
        return
66
66
 
67
67
    advancedsearch = isAdvancedSearch(request)
68
68
 
69
 
    form = request.values
70
 
 
71
69
    # context is relevant only for full search
72
70
    if titlesearch:
73
71
        context = 0
74
72
    elif advancedsearch:
75
73
        context = 180 # XXX: hardcoded context count for advancedsearch
76
74
    else:
77
 
        context = int(form.get('context', 0))
 
75
        context = int(request.form.get('context', [0])[0])
78
76
 
79
77
    # Get other form parameters
80
 
    needle = form.get(fieldname, '')
81
 
    case = int(form.get('case', 0))
82
 
    regex = int(form.get('regex', 0)) # no interface currently
83
 
    hitsFrom = int(form.get('from', 0))
 
78
    needle = request.form.get(fieldname, [''])[0]
 
79
    case = int(request.form.get('case', [0])[0])
 
80
    regex = int(request.form.get('regex', [0])[0]) # no interface currently
 
81
    hitsFrom = int(request.form.get('from', [0])[0])
84
82
    mtime = None
85
83
    msg = ''
86
84
    historysearch = 0
87
85
 
88
86
    # if advanced search is enabled we construct our own search query
89
87
    if advancedsearch:
90
 
        and_terms = form.get('and_terms', '').strip()
91
 
        or_terms = form.get('or_terms', '').strip()
92
 
        not_terms = form.get('not_terms', '').strip()
93
 
        #xor_terms = form.get('xor_terms', '').strip()
94
 
        categories = form.getlist('categories') or ['']
95
 
        timeframe = form.get('time', '').strip()
96
 
        language = form.getlist('language') or ['']
97
 
        mimetype = form.getlist('mimetype') or [0]
98
 
        excludeunderlay = form.get('excludeunderlay', 0)
99
 
        nosystemitems = form.get('nosystemitems', 0)
100
 
        historysearch = form.get('historysearch', 0)
 
88
        and_terms = request.form.get('and_terms', [''])[0].strip()
 
89
        or_terms = request.form.get('or_terms', [''])[0].strip()
 
90
        not_terms = request.form.get('not_terms', [''])[0].strip()
 
91
        #xor_terms = request.form.get('xor_terms', [''])[0].strip()
 
92
        categories = request.form.get('categories', [''])
 
93
        timeframe = request.form.get('time', [''])[0].strip()
 
94
        language = request.form.get('language', [''])
 
95
        mimetype = request.form.get('mimetype', [0])
 
96
        excludeunderlay = request.form.get('excludeunderlay', [0])[0]
 
97
        nosystemitems = request.form.get('nosystemitems', [0])[0]
 
98
        historysearch = request.form.get('historysearch', [0])[0]
101
99
 
102
 
        mtime = form.get('mtime', '')
 
100
        mtime = request.form.get('mtime', [''])[0]
103
101
        if mtime:
104
102
            mtime_parsed = None
105
103
 
119
117
            else:
120
118
                # didn't work, let's try parsedatetime
121
119
                cal = Calendar()
122
 
                mtime_parsed, parsed_what = cal.parse(mtime)
 
120
                mtime_parsed, invalid_flag = cal.parse(mtime)
123
121
                # XXX it is unclear if usage of localtime here and in parsedatetime module is correct.
124
122
                # time.localtime is the SERVER's local time and of no relevance to the user (being
125
123
                # somewhere in the world)
126
124
                # mktime is reverse function for localtime, so this maybe fixes it again!?
127
 
                if parsed_what > 0 and mtime_parsed <= time.localtime():
 
125
                if not invalid_flag and mtime_parsed <= time.localtime():
128
126
                    mtime = time.mktime(mtime_parsed)
129
127
                else:
130
128
                    mtime_parsed = None # we don't use invalid stuff
181
179
        sort = 'weight'
182
180
 
183
181
    # search the pages
184
 
    from MoinMoin.search import searchPages, QueryParser, QueryError
 
182
    from MoinMoin.search import searchPages, QueryParser
185
183
    try:
186
184
        query = QueryParser(case=case, regex=regex,
187
185
                titlesearch=titlesearch).parse_query(needle)
188
 
    except QueryError: # catch errors in the search query
 
186
        results = searchPages(request, query, sort, mtime, historysearch)
 
187
    except ValueError: # catch errors in the search query
189
188
        request.theme.add_msg(_('Your search query {{{"%s"}}} is invalid. Please refer to '
190
189
                'HelpOnSearching for more information.', wiki=True, percent=True) % wikiutil.escape(needle), "error")
191
190
        Page(request, pagename).send_page()
192
191
        return
193
192
 
194
 
    results = searchPages(request, query, sort, mtime, historysearch)
195
 
 
196
 
    # directly show a single hit for title searches
197
 
    # this is the "quick jump" functionality if you don't remember
198
 
    # the pagename exactly, but just some parts of it
199
 
    if titlesearch and len(results.hits) == 1:
 
193
    # directly show a single hit
 
194
    # Note: can't work with attachment search
 
195
    # improve if we have one...
 
196
    if len(results.hits) == 1:
200
197
        page = results.hits[0]
201
198
        if not page.attachment: # we did not find an attachment
202
199
            page = Page(request, page.page_name)
208
205
            url = page.url(request, querystr=querydict)
209
206
            request.http_redirect(url)
210
207
            return
211
 
    if not results.hits: # no hits?
 
208
    elif not results.hits: # no hits?
212
209
        f = request.formatter
213
 
        querydict = dict(wikiutil.parseQueryString(request.query_string))
 
210
        querydict = wikiutil.parseQueryString(request.query_string)
214
211
        querydict.update({'titlesearch': 0})
215
212
 
216
213
        request.theme.add_msg(_('Your search query {{{"%s"}}} didn\'t return any results. '
226
223
        Page(request, pagename).send_page()
227
224
        return
228
225
 
 
226
    request.emit_http_headers()
 
227
 
229
228
    # This action generates data using the user language
230
229
    request.setContentLanguage(request.lang)
231
230
 
232
 
    request.theme.send_title(title % needle, pagename=pagename)
 
231
    request.theme.send_title(title % needle, form=request.form, pagename=pagename)
233
232
 
234
233
    # Start content (important for RTL support)
235
234
    request.write(request.formatter.startContent("content"))
239
238
    hints = []
240
239
 
241
240
    if titlesearch:
242
 
        querydict = dict(wikiutil.parseQueryString(request.query_string))
 
241
        querydict = wikiutil.parseQueryString(request.query_string)
243
242
        querydict.update({'titlesearch': 0})
244
243
 
245
244
        hints.append(''.join([