From b6fa88f2016efafd22e82713be51f5934124536c Mon Sep 17 00:00:00 2001 From: Yusur Princeps Date: Thu, 11 Sep 2025 12:33:41 +0200 Subject: [PATCH] add Post.feed_info() --- freak/__init__.py | 2 +- freak/accounts.py | 2 ++ freak/models.py | 10 ++++++++++ freak/rest/__init__.py | 17 ++++++++++++----- 4 files changed, 25 insertions(+), 6 deletions(-) diff --git a/freak/__init__.py b/freak/__init__.py index 8d8cc2c..51b85b3 100644 --- a/freak/__init__.py +++ b/freak/__init__.py @@ -26,7 +26,7 @@ from suou import twocolon_list, WantsContentType from .colors import color_themes, theme_classes -__version__ = '0.5.0-dev35' +__version__ = '0.5.0-dev36' APP_BASE_DIR = os.path.dirname(os.path.dirname(__file__)) diff --git a/freak/accounts.py b/freak/accounts.py index b42108b..8951426 100644 --- a/freak/accounts.py +++ b/freak/accounts.py @@ -79,3 +79,5 @@ class UserLoader(AuthUser): return self._auth_obj id: int + username: str + display_name: str diff --git a/freak/models.py b/freak/models.py index f255e62..ef44748 100644 --- a/freak/models.py +++ b/freak/models.py @@ -644,6 +644,16 @@ class Post(Base): def is_text_post(self): return self.post_type == POST_TYPE_DEFAULT + def feed_info(self): + return dict( + id=Snowflake(self.id).to_b32l(), + slug = self.slug, + title = self.title, + author = self.author.simple_info(), + to = self.topic_or_user().simple_info(), + created_at = self.created_at + ) + class Comment(Base): __tablename__ = 'freak_comment' __table_args__ = ( diff --git a/freak/rest/__init__.py b/freak/rest/__init__.py index f1ce627..5228c92 100644 --- a/freak/rest/__init__.py +++ b/freak/rest/__init__.py @@ -3,7 +3,7 @@ from __future__ import annotations from flask import abort from pydantic import BaseModel -from quart import Blueprint, redirect, url_for +from quart import Blueprint, redirect, request, url_for from quart_auth import AuthUser, current_user, login_required, login_user, logout_user from quart_schema import QuartSchema, validate_request, validate_response from sqlalchemy import select @@ -48,9 +48,10 @@ async def health(): ## to get complete sooner or later ## XXX there is a bug in suou.sqlalchemy.auth_required() — apparently, /user/@me does not -## redirect, neither is able to get user injected. +## redirect, neither is able to get user injected. It was therefore dismissed. ## Auth-based REST endpoints won't be fully functional until 0.6 in most cases +## USERS ## @bp.get('/user/@me') @login_required @@ -84,6 +85,7 @@ async def resolve_user(username: str): abort(404, 'User not found') return redirect(url_for('rest.user_get', id=uid)), 302 +## POSTS ## @bp.get('/post/') async def get_post(id: int): @@ -104,6 +106,8 @@ async def get_post(id: int): return dict(posts={f'{Snowflake(id):l}': pj}) +## GUILDS ## + async def _guild_info(gu: Guild): return dict( id = f'{Snowflake(gu.id):l}', @@ -138,21 +142,24 @@ async def guild_feed(gname: str): # TODO add feed feed = [] algo = topic_timeline(gname) - posts: list[Post] = makelist((await db.paginate(algo))) - for p in posts: + posts = await db.paginate(algo) + async for p in posts: feed.append(p.feed_info()) return dict(guilds={f'{Snowflake(gu.id):l}': gj}, feed=feed) +## LOGIN/OUT ## class LoginIn(BaseModel): username: str password: str - remember: bool + remember: bool = False @bp.post('/login') @validate_request(LoginIn) async def login(data: LoginIn): + + print(data) async with db as session: u = (await session.execute(select(User).where(User.username == data.username))).scalar() match check_login(u, data.password):