def get(self, path, head=False): cache.create_prc() expression = WikiPage.path_to_title(path) parsed_expression = search.parse_expression(expression) scoretable = WikiPage.search(expression) positives = dict([(k, v) for k, v in scoretable.items() if v >= 0.0]) positives = OrderedDict( sorted(positives.iteritems(), key=operator.itemgetter(1), reverse=True)[:20]) negatives = dict([(k, abs(v)) for k, v in scoretable.items() if v < 0.0]) negatives = OrderedDict( sorted(negatives.iteritems(), key=operator.itemgetter(1), reverse=True)[:20]) self.response.headers['Content-Type'] = 'text/html; charset=utf-8' html = template( self.request, 'search.html', { 'expression': expression, 'parsed_expression': parsed_expression, 'positives': positives, 'negatives': negatives }) set_response_body(self.response, html, head)
def get(self, path, head=False): cache.create_prc() query = WikiPage.path_to_title(path) user = get_cur_user() result = WikiPage.wikiquery(query, user) view = self.request.GET.get('view', 'default') restype = get_restype(self.request) if restype == 'default' or restype == 'html': if view == 'bodyonly': html = template(self.request, 'bodyonly.html', { 'title': u'Search: %s ' % query, 'body': obj_to_html(result), }) else: html = template(self.request, 'wikiquery.html', { 'query': query, 'result': obj_to_html(result), }) self.response.headers['Content-Type'] = 'text/html; charset=utf-8' set_response_body(self.response, html, head) elif restype == 'json': self.response.headers[ 'Content-Type'] = 'application/json; charset=utf-8' set_response_body(self.response, json.dumps(result), head) else: self.abort(400, 'Unknown type: %s' % restype)
def put(self, path): cache.create_prc() title = WikiPage.path_to_title(path) user = get_cur_user() page = WikiPage.get_by_title(title) revision = int(self.request.POST['revision']) new_body = self.request.POST['body'] comment = self.request.POST.get('comment', '') preview = self.request.POST.get('preview', '0') if preview == '1': self.response.headers['Content-Type'] = 'text/html; charset=utf-8' html = template(self.request, 'bodyonly.html', { 'title': page.title, 'body': page.preview_rendered_body(new_body) }) set_response_body(self.response, html, False) return if not page.can_write(user): self.response.status = 403 self.response.headers['Content-Type'] = 'text/html; charset=utf-8' html = template(self.request, '403.html', {'page': page}) set_response_body(self.response, html, False) return try: page.update_content(new_body, revision, comment, user) self.response.location = page.absolute_url self.response.headers['X-Message'] = 'Successfully updated.' quoted_path = urllib2.quote(path.replace(' ', '_')) restype = get_restype(self.request) self.response.headers['Location'] = str('/' + quoted_path) if restype != 'default': self.response.headers['Location'] += str('?_type=%s' % restype) self.response.status = 303 except ConflictError as e: self.response.status = 409 self.response.headers['Content-Type'] = 'text/html; charset=utf-8' html = template(self.request, 'wikipage.form.html', { 'page': page, 'conflict': e }) set_response_body(self.response, html, False) except ValueError as e: self.response.status = 406 self.response.headers['Content-Type'] = 'text/html; charset=utf-8' html = template(self.request, 'error_with_messages.html', { 'page': page, 'errors': [e.message] }) set_response_body(self.response, html, False)
def delete(self, path): cache.create_prc() title = WikiPage.path_to_title(path) page = WikiPage.get_by_title(title) user = get_cur_user() try: page.delete(user) self.response.status = 204 except RuntimeError as e: self.response.status = 403 html = template(self.request, 'error_with_messages.html', { 'page': page, 'errors': [e.message] }) set_response_body(self.response, html, False)
def post(self, path): method = self.request.GET.get('_method', 'POST') if method == 'DELETE': return self.delete(path) elif method == 'PUT': return self.put(path) cache.create_prc() title = WikiPage.path_to_title(path) user = get_cur_user() page = WikiPage.get_by_title(title) new_body = self.request.POST['body'] comment = self.request.POST.get('comment', '') if not page.can_write(user): self.response.status = 403 self.response.headers['Content-Type'] = 'text/html; charset=utf-8' html = template(self.request, '403.html', {'page': page}) set_response_body(self.response, html, False) return try: page.update_content(page.body + new_body, page.revision, comment, user) self.response.location = page.absolute_url self.response.headers['X-Message'] = 'Successfully updated.' quoted_path = urllib2.quote(path.replace(' ', '_')) restype = get_restype(self.request) if restype == 'default': self.response.headers['Location'] = str('/' + quoted_path) else: self.response.headers['Location'] = str('/%s?_type=%s' % (quoted_path, restype)) self.response.status = 303 except ValueError as e: self.response.status = 406 self.response.headers['Content-Type'] = 'text/html; charset=utf-8' html = template(self.request, 'error_with_messages.html', { 'page': page, 'errors': [e.message] }) set_response_body(self.response, html, False)
def load(self): expression = WikiPage.path_to_title(self.path) scoretable = WikiPage.search(expression) parsed_expression = search.parse_expression(expression) positives = dict([(k, v) for k, v in scoretable.items() if v >= 0.0]) positives = OrderedDict( sorted(positives.iteritems(), key=operator.itemgetter(1), reverse=True)[:20]) negatives = dict([(k, abs(v)) for k, v in scoretable.items() if v < 0.0]) negatives = OrderedDict( sorted(negatives.iteritems(), key=operator.itemgetter(1), reverse=True)[:20]) return { 'expression': expression, 'parsed_expression': parsed_expression, 'positives': positives, 'negatives': negatives, }
def get(self, path, head=False): cache.create_prc() user = get_cur_user() title = WikiPage.path_to_title(path) if title == u'titles': self.get_titles(user, head) elif title == u'changes': self.get_changes(user, head) elif title == u'index': self.get_index(user, head) elif title == u'posts': self.get_posts(user, head) elif title == u'search': self.get_search(user, head) elif title == u'opensearch': self.get_opensearch(head) elif title == u'randomly update related pages': recent = self.request.GET.get('recent', '0') titles = WikiPage.randomly_update_related_links(50, recent == '1') self.response.headers['Content-Type'] = 'text/plain; charset=utf-8' self.response.write('\n'.join(titles)) elif title == u'preferences': self.get_preferences(user, head) elif title == u'rebuild data index': deferred.defer(WikiPage.rebuild_all_data_index, 0) self.response.headers['Content-Type'] = 'text/plain; charset=utf-8' self.response.write('Done! (queued)') elif title == u'fix suggested pages': self.response.headers['Content-Type'] = 'text/plain; charset=utf-8' index = int(self.request.GET.get('index', '0')) pages = WikiPage.query().fetch(200, offset=index * 200) for page in pages: keys = [ key for key in page.related_links.keys() if key.find('/') != -1 ] if len(keys) == 0: continue else: self.response.write('%s\n' % page.title) for key in keys: del page.related_links[key] self.response.write('%s\n' % key) page.put() elif title == u'fix comment': self.response.headers['Content-Type'] = 'text/plain; charset=utf-8' index = int(self.request.GET.get('index', '0')) pages = WikiPage.query().fetch(100, offset=index * 100) for page in pages: page.comment = '' page.put() elif title == u'gcstest': import cloudstorage as gcs f = gcs.open( '/ecogwiki/test.txt', 'w', content_type='text/plain', retry_params=gcs.RetryParams(backoff_factor=1.1), options={'x-goog-acl': 'public-read'}, ) f.write('Hello') f.close() self.response.write('Done') else: self.abort(404)
def get(self, path, head=False): if path == '': self.response.headers['Location'] = '/Home' if len(self.request.query): self.response.headers['Location'] += '?%s' % self.request.query self.response.status = 303 return elif self.request.path_qs.find('%20') != -1: self.response.headers[ 'Location'] = '%s' % self.request.path_qs.replace('%20', '_') self.response.status = 303 return cache.create_prc() title = WikiPage.path_to_title(path) user = get_cur_user() restype = get_restype(self.request) view = self.request.GET.get('view', 'default') page = WikiPage.get_by_title(title) rev = self.request.GET.get('rev', 'latest') if rev == 'list': self.get_revision_list(restype, page, head) return if rev == 'latest': rev = '%d' % page.revision rev = int(rev) if rev != page.revision: page = page.revisions.filter( WikiPageRevision.revision == rev).get() if not page.can_read(user): self.response.status = 403 self.response.headers['Content-Type'] = 'text/html; charset=utf-8' html = template(self.request, '403.html', {'page': page}) set_response_body(self.response, html, False) return # custom content-type metadata? if restype == 'default' and view == 'default' and page.metadata[ 'content-type'] != 'text/x-markdown': self.response.headers['Content-Type'] = '%s; charset=utf-8' % str( page.metadata['content-type']) set_response_body(self.response, WikiPage.remove_metadata(page.body), head) return if restype == 'default': if view == 'default': redirect = page.metadata.get('redirect', None) if redirect is not None: self.response.headers[ 'Location'] = '/' + WikiPage.title_to_path(redirect) self.response.status = 303 return template_data = { 'page': page, 'message': self.response.headers.get('X-Message', None), } if page.metadata.get('schema', None) == 'Blog': template_data['posts'] = WikiPage.get_published_posts( page.title, 20) elif page.revision == 0: self.response.status_int = 404 self.response.headers[ 'Content-Type'] = 'text/html; charset=utf-8' html = template(self.request, 'wikipage.html', template_data) set_response_body(self.response, html, head) elif view == 'edit': html = template(self.request, 'wikipage.form.html', { 'page': page, 'conflict': None }) self.response.headers[ 'Content-Type'] = 'text/html; charset=utf-8' set_response_body(self.response, html, head) elif view == 'bodyonly': self.response.headers[ 'Content-Type'] = 'text/html; charset=utf-8' html = template(self.request, 'bodyonly.html', { 'title': page.title, 'body': page.rendered_body, }) set_response_body(self.response, html, head) elif restype == 'atom': pages = WikiPage.get_published_posts(page.title, 20) rendered = render_posts_atom(self.request, page.title, pages) self.response.headers['Content-Type'] = 'text/xml; charset=utf-8' set_response_body(self.response, rendered, head) elif restype == 'txt': self.response.headers['Content-Type'] = 'text/plain; charset=utf-8' set_response_body(self.response, page.body, head) elif restype == 'json': self.response.headers[ 'Content-Type'] = 'application/json; charset=utf-8' pagedict = { 'title': page.title, 'modifier': page.modifier.email() if page.modifier else None, 'updated_at': format_iso_datetime(page.updated_at), 'body': page.body, 'revision': page.revision, 'acl_read': page.acl_read, 'acl_write': page.acl_write, 'data': page.data, } set_response_body(self.response, json.dumps(pagedict), head) else: self.abort(400, 'Unknown type: %s' % restype)
def load(self): query = WikiPage.path_to_title(self.path) return {'result': WikiPage.wikiquery(query, self.user), 'query': query}
def test_path_to_title(self): self.assertEqual(u'Hello World', WikiPage.path_to_title('Hello_World')) self.assertEqual(u'A&B', WikiPage.path_to_title('A%26B')) self.assertEqual(u'가', WikiPage.path_to_title('%EA%B0%80'))