remove use of 1.6.4-compatible 'wrapper'
[gae-samples.git] / search / python / search_demo.py
blob0edd8b94f943c69438c8ce599cb18b820fa4a4c6
1 #!/usr/bin/python
3 # Copyright 2011 Google Inc. All Rights Reserved.
5 """A simple guest book app that demonstrates the App Engine search API."""
8 from cgi import parse_qs
9 from datetime import datetime
10 import os
11 import string
12 import urllib
13 from urlparse import urlparse
15 from google.appengine.api import search
16 from google.appengine.api import users
17 from google.appengine.ext import webapp
18 from google.appengine.ext.webapp import template
19 from google.appengine.ext.webapp.util import run_wsgi_app
22 _INDEX_NAME = 'greeting'
24 _ENCODE_TRANS_TABLE = string.maketrans('-: .@', '_____')
27 class MainPage(webapp.RequestHandler):
28 """Handles search requests for comments."""
30 def get(self):
31 """Handles a get request with a query."""
32 uri = urlparse(self.request.uri)
33 query = ''
34 if uri.query:
35 query = parse_qs(uri.query)
36 query = query['query'][0]
38 # sort results by author descending
39 expr_list = [search.SortExpression(
40 expression='author', default_value='',
41 direction=search.SortExpression.DESCENDING)]
42 # construct the sort options
43 sort_opts = search.SortOptions(
44 expressions=expr_list)
45 query_options = search.QueryOptions(
46 limit=3,
47 sort_options=sort_opts)
48 query_obj = search.Query(query_string=query, options=query_options)
49 results = search.Index(name=_INDEX_NAME).search(query=query_obj)
51 if users.get_current_user():
52 url = users.create_logout_url(self.request.uri)
53 url_linktext = 'Logout'
54 else:
55 url = users.create_login_url(self.request.uri)
56 url_linktext = 'Login'
58 template_values = {
59 'results': results,
60 'number_returned': len(results.results),
61 'url': url,
62 'url_linktext': url_linktext,
65 path = os.path.join(os.path.dirname(__file__), 'index.html')
66 self.response.out.write(template.render(path, template_values))
69 def CreateDocument(author, content):
70 """Creates a search.Document from content written by the author."""
71 if author:
72 nickname = author.nickname().split('@')[0]
73 else:
74 nickname = 'anonymous'
75 # Let the search service supply the document id.
76 return search.Document(
77 fields=[search.TextField(name='author', value=nickname),
78 search.TextField(name='comment', value=content),
79 search.DateField(name='date', value=datetime.now().date())])
82 class Comment(webapp.RequestHandler):
83 """Handles requests to index comments."""
85 def post(self):
86 """Handles a post request."""
87 author = None
88 if users.get_current_user():
89 author = users.get_current_user()
91 content = self.request.get('content')
92 query = self.request.get('search')
93 if content:
94 search.Index(name=_INDEX_NAME).add(CreateDocument(author, content))
95 if query:
96 self.redirect('/?' + urllib.urlencode(
97 #{'query': query}))
98 {'query': query.encode('utf-8')}))
99 else:
100 self.redirect('/')
103 application = webapp.WSGIApplication(
104 [('/', MainPage),
105 ('/sign', Comment)],
106 debug=True)
109 def main():
110 run_wsgi_app(application)
112 if __name__ == '__main__':
113 main()