From f3167698665482c8ee2ed9a02d84315f599031f0 Mon Sep 17 00:00:00 2001 From: Ben Sima Date: Sun, 16 Nov 2025 09:07:37 -0500 Subject: Fix public feed display and admin access issues Issue #1: demo@example.com admin status - Confirmed demo@example.com IS in ADMIN_EMAILS (working as intended) - Both Core.py and UI.py have demo@example.com in whitelist Issue #2: /public page auto-refresh causing disappearing articles - Created PublicFeedPage component without auto-refresh - Separated from HomePage which has dashboard auto-updates - /public route now uses PublicFeedPage instead of HomePage Issue #3: Homepage missing public feed for logged-out users - Updated HomePage to show public feed when user is not logged in - Shows login form with public episodes below - Includes marketing message: 'Sign up to create your own personal feed!' - Public episodes are fetched and displayed prominently Additional improvements: - Added 'Public Feed' link to navbar for easy access - PublicFeedPage shows RSS feed link for public.rss - Clear separation between user dashboard (auto-refresh) and public feed (static) All tests passing (48 tests) --- Biz/PodcastItLater/UI.py | 18 ++++++++++++++ Biz/PodcastItLater/Web.py | 63 ++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 77 insertions(+), 4 deletions(-) (limited to 'Biz') diff --git a/Biz/PodcastItLater/UI.py b/Biz/PodcastItLater/UI.py index 72a0bf1..a457a02 100644 --- a/Biz/PodcastItLater/UI.py +++ b/Biz/PodcastItLater/UI.py @@ -192,6 +192,24 @@ class PageLayout(Component[AnyChildren, PageLayoutAttrs]): ), classes=["nav-item"], ), + html.li( + html.a( + html.i( + classes=[ + "bi", + "bi-globe", + "me-1", + ], + ), + "Public Feed", + href="/public", + classes=[ + "nav-link", + "active" if is_active("public") else "", + ], + ), + classes=["nav-item"], + ), html.li( html.a( html.i( diff --git a/Biz/PodcastItLater/Web.py b/Biz/PodcastItLater/Web.py index 60818e9..57d9b91 100644 --- a/Biz/PodcastItLater/Web.py +++ b/Biz/PodcastItLater/Web.py @@ -683,6 +683,45 @@ class HomePageAttrs(Attrs): error: str | None +class PublicFeedPageAttrs(Attrs): + """Attributes for PublicFeedPage component.""" + + episodes: list[dict[str, typing.Any]] + user: dict[str, typing.Any] | None + + +class PublicFeedPage(Component[AnyChildren, PublicFeedPageAttrs]): + """Public feed page without auto-refresh.""" + + @override + def render(self) -> UI.PageLayout: + episodes = self.attrs["episodes"] + user = self.attrs.get("user") + + return UI.PageLayout( + html.div( + html.h2( + html.i(classes=["bi", "bi-globe", "me-2"]), + "Public Feed", + classes=["mb-3"], + ), + html.p( + "Featured articles converted to audio by our community. " + "Subscribe to get new episodes in your podcast app!", + classes=["lead", "text-muted", "mb-4"], + ), + EpisodeList( + episodes=episodes, + rss_url=f"{BASE_URL}/public.rss", + user=user, + ), + ), + user=user, + current_page="public", + error=None, + ) + + class HomePage(Component[AnyChildren, HomePageAttrs]): """Main page combining all components.""" @@ -766,8 +805,26 @@ class HomePage(Component[AnyChildren, HomePageAttrs]): error = self.attrs.get("error") if not user: + # Show public feed with login form for logged-out users return UI.PageLayout( LoginForm(error=error), + html.div( + html.h4( + html.i(classes=["bi", "bi-broadcast", "me-2"]), + "Public Feed", + classes=["mb-3", "mt-4"], + ), + html.p( + "Featured articles converted to audio. " + "Sign up to create your own personal feed!", + classes=["text-muted", "mb-3"], + ), + EpisodeList( + episodes=episodes, + rss_url=None, + user=None, + ), + ), user=None, current_page="home", error=error, @@ -855,18 +912,16 @@ def index(request: Request) -> HomePage: @app.get("/public") -def public_feed(request: Request) -> HomePage: +def public_feed(request: Request) -> PublicFeedPage: """Display public feed page.""" # Always show public episodes, whether user is logged in or not episodes = Core.Database.get_public_episodes(50) user_id = request.session.get("user_id") user = Core.Database.get_user_by_id(user_id) if user_id else None - return HomePage( - queue_items=[], + return PublicFeedPage( episodes=episodes, user=user, - error=None, ) -- cgit v1.2.3