1+ from datetime import datetime
2+ from typing import Optional , List
3+ import reflex as rx
4+
5+ import sqlalchemy
6+ from sqlmodel import select
7+
8+ from .. import navigation
9+ from ..auth .state import SessionState
10+ from ..models import BlogPostModel , UserInfo
11+
12+ ARTICLE_LIST_ROUTE = navigation .routes .ARTICLE_LIST_ROUTE
13+ if ARTICLE_LIST_ROUTE .endswith ("/" ):
14+ ARTICLE_LIST_ROUTE = ARTICLE_LIST_ROUTE [:- 1 ]
15+
16+ class ArticlePublicState (SessionState ):
17+ posts : List ['BlogPostModel' ] = []
18+ post : Optional ['BlogPostModel' ] = None
19+ post_content : str = ""
20+ post_publish_active : bool = False
21+
22+ @rx .var
23+ def post_id (self ):
24+ return self .router .page .params .get ("post_id" , "" )
25+
26+ @rx .var
27+ def post_url (self ):
28+ if not self .post :
29+ return f"{ ARTICLE_LIST_ROUTE } "
30+ return f"{ ARTICLE_LIST_ROUTE } /{ self .post .id } "
31+
32+ def get_post_detail (self ):
33+ lookups = (
34+ (BlogPostModel .publish_active == True ) &
35+ (BlogPostModel .publish_date < datetime .now ()) &
36+ (BlogPostModel .id == self .post_id )
37+ )
38+ with rx .session () as session :
39+ if self .post_id == "" :
40+ self .post = None
41+ self .post_content = ""
42+ self .post_publish_active = False
43+ return
44+ sql_statement = select (BlogPostModel ).options (
45+ sqlalchemy .orm .joinedload (BlogPostModel .userinfo ).joinedload (UserInfo .user )
46+ ).where (lookups )
47+ result = session .exec (sql_statement ).one_or_none ()
48+ self .post = result
49+ if result is None :
50+ self .post_content = ""
51+ return
52+ self .post_content = self .post .content
53+ self .post_publish_active = self .post .publish_active
54+ # return
55+
56+ def load_posts (self , * args , ** kwargs ):
57+ lookup_args = (
58+ (BlogPostModel .publish_active == True ) &
59+ (BlogPostModel .publish_date < datetime .now ())
60+ )
61+ with rx .session () as session :
62+ result = session .exec (
63+ select (BlogPostModel ).options (
64+ sqlalchemy .orm .joinedload (BlogPostModel .userinfo )
65+ ).where (lookup_args )
66+ ).all ()
67+ self .posts = result
68+
69+ def to_post (self ):
70+ if not self .post :
71+ return rx .redirect (ARTICLE_LIST_ROUTE )
72+ return rx .redirect (f"{ self .post_url } " )
0 commit comments