Ejemplo n.º 1
0
    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)
Ejemplo n.º 2
0
 def post(self, path):
     cache.create_prc()
     user = get_cur_user()
     if path == 'preferences':
         self.post_preferences(user)
     else:
         self.abort(404)
Ejemplo n.º 3
0
 def post(self, path):
     cache.create_prc()
     user = get_cur_user()
     if path == 'preferences':
         self.post_preferences(user)
     else:
         self.abort(404)
Ejemplo n.º 4
0
 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)
Ejemplo n.º 5
0
 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)
Ejemplo n.º 6
0
    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)
Ejemplo n.º 7
0
    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)
Ejemplo n.º 8
0
    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)
Ejemplo n.º 9
0
    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)
Ejemplo n.º 10
0
    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)
Ejemplo n.º 11
0
    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)
Ejemplo n.º 12
0
    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)
Ejemplo n.º 13
0
    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)
Ejemplo n.º 14
0
    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)
Ejemplo n.º 15
0
    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)
Ejemplo n.º 16
0
    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)