1
+ from typing import Optional , List
2
+ from datetime import datetime
3
+ import reflex as rx
4
+ from reflex_local_auth .user import LocalUser
5
+
6
+ import sqlalchemy
7
+ from sqlmodel import Field , Relationship
8
+
9
+ from . import utils
10
+
11
+ class UserInfo (rx .Model , table = True ):
12
+ email : str
13
+ user_id : int = Field (foreign_key = 'localuser.id' )
14
+ user : LocalUser | None = Relationship () # LocalUser instance
15
+ posts : List ['BlogPostModel' ] = Relationship (
16
+ back_populates = 'userinfo'
17
+ )
18
+ contact_entries : List ['ContactEntryModel' ] = Relationship (
19
+ back_populates = 'userinfo'
20
+ )
21
+ created_at : datetime = Field (
22
+ default_factory = utils .timing .get_utc_now ,
23
+ sa_type = sqlalchemy .DateTime (timezone = True ),
24
+ sa_column_kwargs = {
25
+ 'server_default' : sqlalchemy .func .now ()
26
+ },
27
+ nullable = False
28
+ )
29
+ updated_at : datetime = Field (
30
+ default_factory = utils .timing .get_utc_now ,
31
+ sa_type = sqlalchemy .DateTime (timezone = True ),
32
+ sa_column_kwargs = {
33
+ 'onupdate' : sqlalchemy .func .now (),
34
+ 'server_default' : sqlalchemy .func .now ()
35
+ },
36
+ nullable = False
37
+ )
38
+
39
+
40
+ class BlogPostModel (rx .Model , table = True ):
41
+ # user
42
+ # id: int -> primary key
43
+ userinfo_id : int = Field (default = None , foreign_key = "userinfo.id" )
44
+ userinfo : Optional ['UserInfo' ] = Relationship (back_populates = "posts" )
45
+ title : str
46
+ content : str
47
+ created_at : datetime = Field (
48
+ default_factory = utils .timing .get_utc_now ,
49
+ sa_type = sqlalchemy .DateTime (timezone = True ),
50
+ sa_column_kwargs = {
51
+ 'server_default' : sqlalchemy .func .now ()
52
+ },
53
+ nullable = False
54
+ )
55
+ updated_at : datetime = Field (
56
+ default_factory = utils .timing .get_utc_now ,
57
+ sa_type = sqlalchemy .DateTime (timezone = True ),
58
+ sa_column_kwargs = {
59
+ 'onupdate' : sqlalchemy .func .now (),
60
+ 'server_default' : sqlalchemy .func .now ()
61
+ },
62
+ nullable = False
63
+ )
64
+ publish_active : bool = False
65
+ publish_date : datetime = Field (
66
+ default = None ,
67
+ sa_type = sqlalchemy .DateTime (timezone = True ),
68
+ sa_column_kwargs = {},
69
+ nullable = True
70
+ )
71
+
72
+
73
+
74
+ class ContactEntryModel (rx .Model , table = True ):
75
+ user_id : int | None = None
76
+ userinfo_id : int = Field (default = None , foreign_key = "userinfo.id" )
77
+ userinfo : Optional ['UserInfo' ] = Relationship (back_populates = "contact_entries" )
78
+ first_name : str
79
+ last_name : str | None = None
80
+ email : str | None = None # = Field(nullable=True)
81
+ message : str
82
+ created_at : datetime = Field (
83
+ default_factory = utils .timing .get_utc_now ,
84
+ sa_type = sqlalchemy .DateTime (timezone = True ),
85
+ sa_column_kwargs = {
86
+ 'server_default' : sqlalchemy .func .now ()
87
+ },
88
+ nullable = False
89
+ )
0 commit comments