From a4d9ba11381295380314a1f749c1ae1eeb6773f2 Mon Sep 17 00:00:00 2001 From: Arjun Satarkar Date: Tue, 4 Jul 2023 21:25:53 +0530 Subject: Add feed modification and deletion --- serve.py | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 58 insertions(+), 11 deletions(-) (limited to 'serve.py') diff --git a/serve.py b/serve.py index 025510a..d6e074b 100755 --- a/serve.py +++ b/serve.py @@ -3,13 +3,12 @@ import gevent.monkey gevent.monkey.patch_all() import bottle -import feedparser import gevent.lock import argparse import os import pathlib -import time +import typing import tagrss @@ -22,7 +21,7 @@ args = parser.parse_args() storage_path: pathlib.Path = pathlib.Path(args.storage_path) tagrss_lock = gevent.lock.RLock() -tagrss_backend = tagrss.TagRss(storage_path=storage_path) +core = tagrss.TagRss(storage_path=storage_path) def parse_space_separated_tags(inp: str) -> list[str]: @@ -44,30 +43,39 @@ def parse_space_separated_tags(inp: str) -> list[str]: tag += c if tag: tags.add(tag) - return tuple(sorted(tags)) + return list(sorted(tags)) + + +def serialise_tags(tags: list[str]) -> str: + result = "" + for i, tag in enumerate(tags): + if i > 0: + result += " " + result += (tag.replace("\\", "\\\\")).replace(" ", "\\ ") + return result @bottle.route("/") def index(): with tagrss_lock: - entries = tagrss_backend.get_entries(limit=100) - return bottle.template("index", entries=entries, tagrss_backend=tagrss_backend) + entries = core.get_entries(limit=100) + return bottle.template("index", entries=entries, core=core) @bottle.get("/add_feed") -def add_feed_ui(): +def add_feed_view(): return bottle.template("add_feed") @bottle.post("/add_feed") def add_feed_effect(): - feed_source = bottle.request.forms.get("feed_source") - tags = parse_space_separated_tags(bottle.request.forms.get("tags")) + feed_source: str = bottle.request.forms.get("feed_source") # type: ignore + tags = parse_space_separated_tags(bottle.request.forms.get("tags")) # type: ignore already_present: bool = False with tagrss_lock: try: - tagrss_backend.add_feed(feed_source=feed_source, tags=tags) + core.add_feed(feed_source=feed_source, tags=tags) except tagrss.FeedAlreadyAddedError: already_present = True # TODO: handle FeedFetchError too @@ -75,13 +83,52 @@ def add_feed_effect(): "add_feed", after_add=True, feed_source=feed_source, - already_present=already_present + already_present=already_present, ) +@bottle.get("/manage_feed") +def manage_feed_view(): + try: + feed_id_raw: str = bottle.request.query["feed"] # type: ignore + feed_id: int = int(feed_id_raw) + except KeyError: + raise bottle.HTTPError(400, "Feed ID not given.") + feed: dict[str, typing.Any] = {} + feed["id"] = feed_id + feed["source"] = core.get_feed_source(feed_id) + feed["title"] = core.get_feed_title(feed_id) + feed["tags"] = core.get_feed_tags(feed_id) + feed["serialised_tags"] = serialise_tags(feed["tags"]) + return bottle.template("manage_feed", feed=feed) + +@bottle.post("/manage_feed") +def manage_feed_effect_update(): + feed_id: int = int(bottle.request.forms["id"]) # type: ignore + feed_source: str = bottle.request.forms["source"] # type: ignore + feed_title: str = bottle.request.forms["title"] # type: ignore + feed_tags: list[str] = parse_space_separated_tags(bottle.request.forms["tags"]) # type: ignore + core.set_feed_source(feed_id, feed_source) + core.set_feed_title(feed_id, feed_title) + core.set_feed_tags(feed_id, feed_tags) + return bottle.redirect(f"/manage_feed?feed={feed_id}") + +@bottle.get("/delete") +def delete_view(): + return bottle.static_file("delete.html", root="views") + + +@bottle.post("/delete") +def delete_effect(): + feed_id: int = int(bottle.request.forms["id"]) # type: ignore + core.delete_feed(feed_id) + return bottle.redirect("/delete") + + @bottle.get("/static/") def serve_static(path): return bottle.static_file(path, pathlib.Path(os.getcwd(), "static")) bottle.run(host=args.host, port=args.port, server="gevent") +core.close() -- cgit v1.2.3-57-g22cb