예제 #1
0
 def test_normal_pages(self):
     for title, _ in self.fixtures:
         self._validate('/%s' % WikiPage.title_to_path(title),
                        'html')
         self._validate('/%s?rev=1' % WikiPage.title_to_path(title),
                        'html')
         self._validate('/%s?_type=body' % WikiPage.title_to_path(title),
                        'html')
         self._validate('/%s?_type=form' % WikiPage.title_to_path(title),
                        'html')
예제 #2
0
 def test_normal_pages(self):
     for title, _ in self.fixtures:
         path = WikiPage.title_to_path(title)
         self._validate('/%s' % path, 'html')
         self._validate('/%s?rev=1' % path, 'html')
         self._validate('/%s?view=bodyonly' % path, 'html')
         self._validate('/%s?view=edit' % path, 'html')
예제 #3
0
 def test_normal_pages(self):
     for title, _ in self.fixtures:
         path = WikiPage.title_to_path(title)
         self._validate("/%s" % path, "html")
         self._validate("/%s?rev=1" % path, "html")
         self._validate("/%s?view=bodyonly" % path, "html")
         self._validate("/%s?view=edit" % path, "html")
예제 #4
0
def index(request, path, head=False):
    if request.method == 'GET':
        if path == '':
            resource = RedirectResource(request, '/Home')
            return resource.get(head)
        elif request.path.find(' ') != -1:
            resource = RedirectResource(request, '/%s' % WikiPage.title_to_path(path))
            return resource.get(head)
        elif request.GET.get('rev') == 'list':
            resource = RevisionListResource(request, path)
            return resource.get(head)
        elif request.GET.get('rev', '') != '':
            resource = RevisionResource(request, path, request.GET.get('rev', ''))
            return resource.get(head)
        else:
            resource = PageResource(request, path)
            return resource.get(head)
    elif request.method == 'POST':
        method = request.GET.get('_method', 'POST')
        if method == 'DELETE':
            resource = PageResource(request, path)
            return resource.delete()
        elif method == 'PUT':
            resource = PageResource(request, path)
            return resource.put()
        else:
            resource = PageResource(request, path)
            return resource.post()
    elif request.method == 'PUT':
        resource = PageResource(request, path)
        return resource.put()
    elif request.method == 'DELETE':
        pass
예제 #5
0
 def test_normal_pages(self):
     for title, _ in self.fixtures:
         path = WikiPage.title_to_path(title)
         self._validate('/%s' % path, 'html')
         self._validate('/%s?rev=1' % path, 'html')
         self._validate('/%s?view=bodyonly' % path, 'html')
         self._validate('/%s?view=edit' % path, 'html')
예제 #6
0
 def represent_atom_default(self, page):
     content = render_atom(self.req,
                           page.title,
                           WikiPage.title_to_path(page.title),
                           page.get_posts(count=20),
                           include_content=True,
                           use_published_date=True)
     return Representation(content, 'text/xml; charset=utf-8')
예제 #7
0
 def represent_atom_default(self, page):
     content = render_atom(
         self.req,
         page.title,
         WikiPage.title_to_path(page.title),
         page.get_posts(count=20),
         include_content=True,
         use_published_date=True,
     )
     return Representation(content, "text/xml; charset=utf-8")
예제 #8
0
 def get(self, path, head=False):
     if path == '':
         resource = RedirectResource(self.request, self.response, '/Home')
     elif self.request.path.find(' ') != -1:
         resource = RedirectResource(self.request, self.response, '/%s' % WikiPage.title_to_path(path))
     elif self.request.GET.get('rev') == 'list':
         resource = RevisionListResource(self.request, self.response, path)
     elif self.request.GET.get('rev', '') != '':
         resource = RevisionResource(self.request, self.response, path, self.request.GET.get('rev', ''))
     else:
         resource = PageResource(self.request, self.response, path)
     resource.get(head)
예제 #9
0
    def get(self, head):
        page = self.load()

        if not page.can_read(self.user):
            self._403(page, head)
            return

        if get_restype(self.req, 'html') == 'html' and self.req.GET.get('view', self.default_view) == 'default':
            redirect = page.metadata.get('redirect', None)
            if redirect is not None:
                path = WikiPage.title_to_path(redirect)
                return RedirectResource(self.req, self.res, path, redirect_from=page.title).get(head)

        representation = self.get_representation(page)
        representation.respond(self.res, head)
예제 #10
0
    def get(self, head):
        page = self.load()

        if not page.can_read(self.req.user):
            self._403(page, head)
            return self.res

        if get_restype(self.req, 'html') == 'html' and self.req.GET.get('view', self.default_view) == 'default':
            redirect = page.metadata.get('redirect', None)
            if redirect is not None:
                self.res.location = '/' + WikiPage.title_to_path(redirect)
                self.res.status_code = 303
                return self.res

        representation = self.get_representation(page)
        return representation.respond(self.res, head)
예제 #11
0
    def get(self, head):
        page = self.load()

        if not page.can_read(self.user):
            self._403(page, head)
            return
        if (not page.can_write(self.user)) and self.req.GET.get("view", self.default_view) == "edit":
            self._403(page, head)
            return

        if get_restype(self.req, "html") == "html" and self.req.GET.get("view", self.default_view) == "default":
            redirect = page.metadata.get("redirect", None)
            if redirect is not None:
                path = WikiPage.title_to_path(redirect)
                return RedirectResource(self.req, self.res, path, redirect_from=page.title).get(head)

        representation = self.get_representation(page)
        representation.respond(self.res, head)
예제 #12
0
파일: views.py 프로젝트: uastory/ecogwiki
    def _render_posts_atom(self, title, pages):
        host = self.request.host_url
        config = WikiPage.yaml_by_title(".config")
        if title is None:
            feed_title = "%s: posts" % config["service"]["title"]
            url = "%s/sp.posts?_type=atom" % host
        else:
            feed_title = title
            url = "%s/%s?_type=atom" % (WikiPage.title_to_path(title), host)

        feed = AtomFeed(title=feed_title, feed_url=url, url="%s/" % host, author=config["admin"]["email"])
        for page in pages:
            feed.add(
                title=page.title,
                content_type="html",
                content=page.rendered_body,
                author=page.modifier,
                url="%s%s" % (host, page.absolute_url),
                updated=page.published_at,
            )
        return feed.to_string()
예제 #13
0
파일: views.py 프로젝트: namongk/ecogwiki
def render_posts_atom(req, title, pages):
    host = req.host_url
    config = WikiPage.get_config()
    if title is None:
        feed_title = '%s: posts' % config['service']['title']
        url = "%s/sp.posts?_type=atom" % host
    else:
        feed_title = title
        url = "%s/%s?_type=atom" % (WikiPage.title_to_path(title), host)

    feed = AtomFeed(title=feed_title,
                    feed_url=url,
                    url="%s/" % host,
                    author=config['admin']['email'])
    for page in pages:
        feed.add(title=page.title,
                 content_type="html",
                 content=page.rendered_body,
                 author=page.modifier,
                 url='%s%s' % (host, page.absolute_url),
                 updated=page.published_at)
    return feed.to_string()
예제 #14
0
파일: views.py 프로젝트: namongk/ecogwiki
def render_posts_atom(req, title, pages):
    host = req.host_url
    config = WikiPage.get_config()
    if title is None:
        feed_title = '%s: posts' % config['service']['title']
        url = "%s/sp.posts?_type=atom" % host
    else:
        feed_title = title
        url = "%s/%s?_type=atom" % (WikiPage.title_to_path(title), host)

    feed = AtomFeed(title=feed_title,
                    feed_url=url,
                    url="%s/" % host,
                    author=config['admin']['email'])
    for page in pages:
        feed.add(title=page.title,
                 content_type="html",
                 content=page.rendered_body,
                 author=page.modifier,
                 url='%s%s' % (host, page.absolute_url),
                 updated=page.published_at)
    return feed.to_string()
예제 #15
0
    def get(self, head):
        page = self.load()

        if not page.can_read(self.user):
            self._403(page, head)
            return
        if (not page.can_write(self.user)) and self.req.GET.get(
                'view', self.default_view) == 'edit':
            self._403(page, head)
            return

        if get_restype(self.req, 'html') == 'html' and self.req.GET.get(
                'view', self.default_view) == 'default':
            redirect = page.metadata.get('redirect', None)
            if redirect is not None:
                path = WikiPage.title_to_path(redirect)
                return RedirectResource(self.req,
                                        self.res,
                                        path,
                                        redirect_from=page.title).get(head)

        representation = self.get_representation(page)
        representation.respond(self.res, head)
예제 #16
0
파일: views.py 프로젝트: uastory/ecogwiki
    def get(self, path, head=False):
        if path == "":
            self.response.headers["Location"] = "/Home"
            self.response.status = 303
            return
        if path.find(" ") != -1:
            self.response.headers["Location"] = "/%s" % urllib2.quote(path.replace(" ", "_"))
            self.response.status = 303
            return
        if path.startswith("+") or path.startswith("-"):
            return self.get_search_result(path, head)
        if path.startswith("sp."):
            return self.get_sp(path[3:], head)

        user = WikiPageHandler._get_cur_user()
        page = WikiPage.get_by_title(WikiPage.path_to_title(path))

        if not page.can_read(user):
            self.response.status = 403
            self.response.headers["Content-Type"] = "text/html; charset=utf-8"
            html = self._template("403.html", {"page": page})
            self._set_response_body(html, False)
            return

        restype = self._get_restype()

        # custom content-type metadata?
        if restype == "default" and page.metadata["content-type"] != "text/x-markdown":
            self.response.headers["Content-Type"] = "%s; charset=utf-8" % str(page.metadata["content-type"])
            self._set_response_body(WikiPage.remove_metadata(page.body), head)
            return

        if restype == "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}
            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 = self._template("wikipage.html", template_data)
            self._set_response_body(html, head)
        elif restype == "atom":
            pages = WikiPage.get_published_posts(page.title, 20)
            rendered = self._render_posts_atom(page.title, pages)
            self.response.headers["Content-Type"] = "text/xml; charset=utf-8"
            self._set_response_body(rendered, head)
        elif restype == "form":
            html = self._template("wikipage.form.html", {"page": page})
            self.response.headers["Content-Type"] = "text/html; charset=utf-8"
            self._set_response_body(html, head)
        elif restype == "rawbody":
            self.response.headers["Content-Type"] = "text/plain; charset=utf-8"
            self._set_response_body(page.body, head)
        elif restype == "body":
            self.response.headers["Content-Type"] = "text/html; charset=utf-8"
            html = self._template("bodyonly.html", {"page": page})
            self._set_response_body(html, head)
        elif restype == "history":
            self.response.headers["Content-Type"] = "text/html; charset=utf-8"
            revisions = page.revisions.order(-WikiPageRevision.created_at)
            html = self._template("history.html", {"page": page, "revisions": revisions})
            self._set_response_body(html, head)
        elif restype == "json":
            self.response.headers["Content-Type"] = "application/json"
            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,
            }
            self._set_response_body(json.dumps(pagedict), head)
        else:
            self.abort(400, "Unknown type: %s" % restype)
예제 #17
0
파일: views.py 프로젝트: namongk/ecogwiki
def to_pluspath(title):
    return '/%2B' + WikiPage.title_to_path(title)
예제 #18
0
파일: views.py 프로젝트: namongk/ecogwiki
def to_path(title):
    return '/' + WikiPage.title_to_path(title)
예제 #19
0
파일: views.py 프로젝트: namongk/ecogwiki
    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)
예제 #20
0
파일: views.py 프로젝트: namongk/ecogwiki
def to_pluspath(title):
    return '/%2B' + WikiPage.title_to_path(title)
예제 #21
0
파일: views.py 프로젝트: namongk/ecogwiki
def to_path(title):
    return '/' + WikiPage.title_to_path(title)
예제 #22
0
 def test_title_to_path(self):
     self.assertEqual('Hello_World', WikiPage.title_to_path(u'Hello World'))
     self.assertEqual('A%26B', WikiPage.title_to_path(u'A&B'))
     self.assertEqual('%EA%B0%80', WikiPage.title_to_path(u'가'))
예제 #23
0
파일: views.py 프로젝트: uastory/ecogwiki
def to_path(title):
    return "/" + WikiPage.title_to_path(title)
예제 #24
0
 def test_title_to_path(self):
     self.assertEqual("Hello_World", WikiPage.title_to_path(u"Hello World"))
     self.assertEqual("A%26B", WikiPage.title_to_path(u"A&B"))
     self.assertEqual("%EA%B0%80", WikiPage.title_to_path(u"가"))
예제 #25
0

class EmptyRepresentation(Representation):
    def __init__(self, rescode):
        super(EmptyRepresentation, self).__init__(None, None)
        self._rescode = rescode

    def respond(self, httpres, head):
        httpres.status = 400


JINJA = jinja2.Environment(loader=jinja2.FileSystemLoader(
    os.path.dirname(__file__)),
                           extensions=['jinja2.ext.autoescape'])

to_rel_path = lambda title: WikiPage.title_to_path(title)
to_abs_path = lambda title: '/' + to_rel_path(title)
to_pluspath = lambda title: '/%2B' + to_rel_path(title)
format_short_datetime = lambda v: _format_datetime(v, '%m-%d %H:%M')
format_datetime = lambda v: _format_datetime(v, '%Y-%m-%d %H:%M:%S')
format_iso_datetime = lambda v: _format_datetime(v, '%Y-%m-%dT%H:%M:%SZ')


def _format_datetime(value, pattern):
    return '' if value is None else value.strftime(pattern)


def userpage_link(user):
    if user is None:
        return '<span class="user" data-userpage="" data-email="">Anonymous</span>'
예제 #26
0
 def test_normal_pages(self):
     for title, _ in self.fixtures:
         self._validate('/%s' % WikiPage.title_to_path(title),
                        'html')
         self._validate('/%s?_form=edit' % WikiPage.title_to_path(title),
                        'html')
예제 #27
0
파일: views.py 프로젝트: namongk/ecogwiki
    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)
예제 #28
0
 def test_title_to_path(self):
     self.assertEqual('Hello_World', WikiPage.title_to_path(u'Hello World'))
     self.assertEqual('A%26B', WikiPage.title_to_path(u'A&B'))
     self.assertEqual('%EA%B0%80', WikiPage.title_to_path(u'가'))
예제 #29
0
class EmptyRepresentation(Representation):
    def __init__(self, rescode):
        super(EmptyRepresentation, self).__init__(None, None)
        self._rescode = rescode

    def respond(self, httpres, head):
        httpres.status = 400


JINJA = jinja2.Environment(
    loader=jinja2.FileSystemLoader(os.path.dirname(__file__)),
    extensions=['jinja2.ext.autoescape'])


to_rel_path = lambda title: WikiPage.title_to_path(title)
to_abs_path = lambda title: '/' + to_rel_path(title)
to_pluspath = lambda title: '/%2B' + to_rel_path(title)
format_short_datetime = lambda v: _format_datetime(v, '%m-%d %H:%M')
format_datetime = lambda v: _format_datetime(v, '%Y-%m-%d %H:%M:%S')
format_iso_datetime = lambda v: _format_datetime(v, '%Y-%m-%dT%H:%M:%SZ')


def _format_datetime(value, pattern):
    return '' if value is None else value.strftime(pattern)


def userpage_link(user):
    if user is None:
        return '<span class="user">Anonymous</span>'
예제 #30
0
파일: views.py 프로젝트: ledzpl/ecogwiki
    def get(self, path, head=False):
        if path == '':
            self.response.headers['Location'] = '/Home'
            self.response.status = 303
            return
        if path.find(' ') != -1:
            self.response.headers['Location'] = '/%s' % urllib2.quote(path.replace(' ', '_'))
            self.response.status = 303
            return
        if path.startswith('+') or path.startswith('-'):
            return self.get_search_result(path, head)
        if path.startswith('sp.'):
            return self.get_sp(path[3:], head)

        user = WikiPageHandler._get_cur_user()
        restype = self._get_restype()
        page = WikiPage.get_by_title(WikiPage.path_to_title(path))

        rev = self.request.GET.get('rev', 'latest')
        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 = self._template('403.html', {'page': page})
            self._set_response_body(html, False)
            return

        # custom content-type metadata?
        if restype == 'default' and page.metadata['content-type'] != 'text/x-markdown':
            self.response.headers['Content-Type'] = '%s; charset=utf-8' % str(page.metadata['content-type'])
            self._set_response_body(WikiPage.remove_metadata(page.body), head)
            return

        if restype == '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}
            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 = self._template('wikipage.html', template_data)
            self._set_response_body(html, head)
        elif restype == 'atom':
            pages = WikiPage.get_published_posts(page.title, 20)
            rendered = self._render_posts_atom(page.title, pages)
            self.response.headers['Content-Type'] = 'text/xml; charset=utf-8'
            self._set_response_body(rendered, head)
        elif restype == 'form':
            html = self._template('wikipage.form.html', {'page': page})
            self.response.headers['Content-Type'] = 'text/html; charset=utf-8'
            self._set_response_body(html, head)
        elif restype == 'rawbody':
            self.response.headers['Content-Type'] = 'text/plain; charset=utf-8'
            self._set_response_body(page.body, head)
        elif restype == 'body':
            self.response.headers['Content-Type'] = 'text/html; charset=utf-8'
            html = self._template('bodyonly.html', {'page': page})
            self._set_response_body(html, head)
        elif restype == 'history':
            if type(page) == WikiPageRevision:
                raise ValueError()

            self.response.headers['Content-Type'] = 'text/html; charset=utf-8'
            revisions = page.revisions.order(-WikiPageRevision.created_at)
            html = self._template('history.html', {'page': page, 'revisions': revisions})
            self._set_response_body(html, head)
        elif restype == 'json':
            self.response.headers['Content-Type'] = 'application/json'
            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,
            }
            self._set_response_body(json.dumps(pagedict), head)
        else:
            self.abort(400, 'Unknown type: %s' % restype)