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')
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')
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")
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
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')
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")
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)
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)
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)
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)
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()
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()
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)
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)
def to_pluspath(title): return '/%2B' + WikiPage.title_to_path(title)
def to_path(title): return '/' + WikiPage.title_to_path(title)
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 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'가'))
def to_path(title): return "/" + WikiPage.title_to_path(title)
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"가"))
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>'
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')
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)
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>'
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)