Source code for twon_lss.schemas.feed

import typing
import json

import pydantic

from twon_lss.schemas.user import User
from twon_lss.schemas.post import Post


[docs] class Feed(pydantic.RootModel): root: typing.List[Post] = pydantic.Field(default_factory=list) def __iter__(self): return iter(self.root) def __len__(self): return len(self.root) def __getitem__(self, index): return self.root[index] def append(self, post: Post) -> None: self.root.append(post) def extend(self, posts: typing.List[Post]) -> None: self.root.extend(posts) def get_items_by_user(self, user: User) -> "Feed": return Feed(list(filter(lambda post: post.user == user, self.root))) def get_unread_items_by_user(self, user: User) -> "Feed": return Feed(list(filter(lambda post: user not in post.reads, self.root))) def filter_by_timestamp(self, timestamp:int, persistence: int) -> "Feed": return Feed(list(filter(lambda post: post.timestamp > (timestamp - persistence), self.root))) def get_like_count_by_user(self, user: User) -> int: """ Get count of likes that user received on their posts """ posts = self.get_items_by_user(user) return sum(len(post.likes) for post in posts) def get_likes_given_to_user(self, source_user: User, target_user: User) -> int: """ Get count of likes that source_user gave to target_user's posts """ target_posts = self.get_items_by_user(target_user) return sum(1 for post in target_posts if source_user in post.likes) def to_json(self, path: str) -> None: json.dump(self.model_dump(mode="json"), open(path, "w"), indent=4)