From 1fa962f8680bfb131a1fe77d15dee38f4b79f37b Mon Sep 17 00:00:00 2001 From: rekushi <1+rekushi@noreply.flipnote.world> Date: Thu, 29 Oct 2026 04:30:49 +0000 Subject: [PATCH] feat(dsi): paginate channels and enforce posting settings Add channel pagination, reject missing channels and apply guest-posting and upload-size settings. --- hatenadir/ds/v2-xx/ch.py | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/hatenadir/ds/v2-xx/ch.py b/hatenadir/ds/v2-xx/ch.py index cd2651d..5ba6e12 100644 --- a/hatenadir/ds/v2-xx/ch.py +++ b/hatenadir/ds/v2-xx/ch.py @@ -1,8 +1,9 @@ +import html from twisted.web import resource from DB import Database from hatena import NotFound, as_text, client_ip -from reximemo import current_account, dialog, dsi_url, flipnote_buttons, html_page, make_menu +from reximemo import dialog, dsi_text_html, dsi_url, flipnote_buttons, html_page, make_menu, page_number, pagination_buttons, posting_account, read_ppm_upload class PyResource(resource.Resource): @@ -26,25 +27,36 @@ class ChannelResource(resource.Resource): def render_GET(self, request): channel = Database.get_channel(self.channel_id) + if not channel: + return NotFound.render(request) if self.ext in {"ugo", "uls"}: - rows = Database.list_flipnotes(channel_id=self.channel_id, limit=50) + total = Database.count_flipnotes(channel_id=self.channel_id) + page = page_number(request, total) + rows = Database.list_flipnotes(channel_id=self.channel_id, page=page, per_page=50) + pager = pagination_buttons(request, f"ch/{self.channel_id}.uls", page, total) + prev = [item for item in pager if item["label"].startswith("Previous")] + nxt = [item for item in pager if item["label"].startswith("Next")] request.setHeader(b"content-type", b"text/plain") return make_menu( layout=(2,1), title=channel["title"], subtitle_top="Channel", subtitle_bottom=channel["description"], - left="Flipnotes", right=str(Database.count_flipnotes(channel_id=self.channel_id)), - buttons=flipnote_buttons(request, rows), corner={"label":"Post", "url":dsi_url(request, f"ch/{self.channel_id}.post")}, + left="Flipnotes", right=str(total), + buttons=prev + flipnote_buttons(request, rows) + nxt, corner={"label":"Post", "url":dsi_url(request, f"ch/{self.channel_id}.post")}, ) if self.ext == "htm": - return html_page(request, channel["title"], '
%s
' % (channel["title"], channel["description"], dsi_url(request, f"ch/{self.channel_id}.uls"))) + return html_page(request, channel["title"], '%s
' % (dsi_text_html(channel["title"]), dsi_text_html(channel["description"], preserve_newlines=True), html.escape(dsi_url(request, f"ch/{self.channel_id}.uls"), quote=True))) request.setResponseCode(405); return b"" def render_POST(self, request): if self.ext != "post": request.setResponseCode(405); return b"" - data = request.content.read() - account = current_account(request) + account, denied = posting_account(request) + if denied is not None: + return denied try: + data = read_ppm_upload(request) result = Database.AddFlipnote(data, str(self.channel_id), account["id"] if account else None, client_ip(request)) + except ValueError as exc: + return dialog(request, str(exc)) except Exception: result = False if not result: