4141_USER_AGENT_MAX_LEN = UserSubscriptionUpdate .__table__ .columns .user_agent .type .length or 512
4242
4343
44- async def load_user_attrs (user : User ):
45- await user .awaitable_attrs .admin
46- await user .awaitable_attrs .next_plan
47- await user .awaitable_attrs .usage_logs
48- await user .awaitable_attrs .groups
44+ async def load_user_attrs (
45+ user : User ,
46+ * ,
47+ load_admin : bool = True ,
48+ load_next_plan : bool = True ,
49+ load_usage_logs : bool = True ,
50+ load_groups : bool = True ,
51+ ):
52+ if load_admin :
53+ await user .awaitable_attrs .admin
54+ if load_next_plan :
55+ await user .awaitable_attrs .next_plan
56+ if load_usage_logs :
57+ await user .awaitable_attrs .usage_logs
58+ if load_groups :
59+ await user .awaitable_attrs .groups
4960
5061
51- async def get_user (db : AsyncSession , username : str ) -> Optional [User ]:
62+ async def get_user (
63+ db : AsyncSession ,
64+ username : str ,
65+ * ,
66+ load_admin : bool = True ,
67+ load_next_plan : bool = True ,
68+ load_usage_logs : bool = True ,
69+ load_groups : bool = True ,
70+ ) -> Optional [User ]:
5271 """
5372 Retrieves a user by username.
5473
@@ -63,11 +82,25 @@ async def get_user(db: AsyncSession, username: str) -> Optional[User]:
6382
6483 user = (await db .execute (stmt )).unique ().scalar_one_or_none ()
6584 if user :
66- await load_user_attrs (user )
85+ await load_user_attrs (
86+ user ,
87+ load_admin = load_admin ,
88+ load_next_plan = load_next_plan ,
89+ load_usage_logs = load_usage_logs ,
90+ load_groups = load_groups ,
91+ )
6792 return user
6893
6994
70- async def get_user_by_id (db : AsyncSession , user_id : int ) -> User | None :
95+ async def get_user_by_id (
96+ db : AsyncSession ,
97+ user_id : int ,
98+ * ,
99+ load_admin : bool = True ,
100+ load_next_plan : bool = True ,
101+ load_usage_logs : bool = True ,
102+ load_groups : bool = True ,
103+ ) -> User | None :
71104 """
72105 Retrieves a user by user ID.
73106
@@ -82,10 +115,29 @@ async def get_user_by_id(db: AsyncSession, user_id: int) -> User | None:
82115
83116 user = (await db .execute (stmt )).unique ().scalar_one_or_none ()
84117 if user :
85- await load_user_attrs (user )
118+ await load_user_attrs (
119+ user ,
120+ load_admin = load_admin ,
121+ load_next_plan = load_next_plan ,
122+ load_usage_logs = load_usage_logs ,
123+ load_groups = load_groups ,
124+ )
86125 return user
87126
88127
128+ async def get_user_lifetime_used_traffic (db : AsyncSession , user_id : int ) -> int :
129+ stmt = (
130+ select (func .coalesce (func .sum (UserUsageResetLogs .used_traffic_at_reset ), 0 ) + func .coalesce (User .used_traffic , 0 ))
131+ .select_from (User )
132+ .outerjoin (UserUsageResetLogs , UserUsageResetLogs .user_id == User .id )
133+ .where (User .id == user_id )
134+ .group_by (User .id )
135+ )
136+ result = await db .execute (stmt )
137+ value = result .scalar_one_or_none ()
138+ return int (value or 0 )
139+
140+
89141async def get_existing_usernames (db : AsyncSession , usernames : Sequence [str ]) -> set [str ]:
90142 """
91143 Returns the set of usernames that already exist in the database.
@@ -594,7 +646,7 @@ async def create_user(db: AsyncSession, new_user: UserCreate, groups: list[Group
594646 await db .commit ()
595647 await db .refresh (db_user )
596648
597- await load_user_attrs (db_user )
649+ await load_user_attrs (db_user , load_usage_logs = False )
598650 return db_user
599651
600652
@@ -634,7 +686,7 @@ async def create_users_bulk(
634686 await db .commit ()
635687
636688 for user in db_users :
637- await load_user_attrs (user )
689+ await load_user_attrs (user , load_usage_logs = False )
638690
639691 return db_users
640692
@@ -780,7 +832,7 @@ async def modify_user(db: AsyncSession, db_user: User, modify: UserModify) -> Us
780832
781833 await db .commit ()
782834 await db .refresh (db_user )
783- await load_user_attrs (db_user )
835+ await load_user_attrs (db_user , load_usage_logs = False )
784836 return db_user
785837
786838
@@ -819,7 +871,7 @@ async def reset_user_data_usage(db: AsyncSession, db_user: User) -> User:
819871
820872 await db .commit ()
821873 await db .refresh (db_user )
822- await load_user_attrs (db_user )
874+ await load_user_attrs (db_user , load_usage_logs = False )
823875 return db_user
824876
825877
@@ -841,7 +893,7 @@ async def bulk_reset_user_data_usage(db: AsyncSession, users: list[User]) -> lis
841893 await db .commit ()
842894 for user in users :
843895 await db .refresh (user )
844- await load_user_attrs (user )
896+ await load_user_attrs (user , load_usage_logs = False )
845897 return users
846898
847899
@@ -903,7 +955,7 @@ async def reset_user_by_next(db: AsyncSession, db_user: User) -> User:
903955
904956 await db .commit ()
905957 await db .refresh (db_user )
906- await load_user_attrs (db_user )
958+ await load_user_attrs (db_user , load_usage_logs = False )
907959 return db_user
908960
909961
@@ -926,7 +978,7 @@ async def revoke_user_sub(db: AsyncSession, db_user: User) -> User:
926978 await db .execute (stmt )
927979 await db .commit ()
928980 await db .refresh (db_user )
929- await load_user_attrs (db_user )
981+ await load_user_attrs (db_user , load_usage_logs = False )
930982 return db_user
931983
932984
@@ -1144,7 +1196,7 @@ async def update_users_status(db: AsyncSession, users: list[User], status: UserS
11441196 await db .commit ()
11451197 for user in users :
11461198 await db .refresh (user )
1147- await load_user_attrs (user )
1199+ await load_user_attrs (user , load_usage_logs = False )
11481200 return users
11491201
11501202
@@ -1164,7 +1216,7 @@ async def set_owner(db: AsyncSession, db_user: User, admin: Admin) -> User:
11641216 await db .execute (stmt )
11651217 await db .commit ()
11661218 await db .refresh (db_user )
1167- await load_user_attrs (db_user )
1219+ await load_user_attrs (db_user , load_usage_logs = False )
11681220 return db_user
11691221
11701222
@@ -1192,7 +1244,7 @@ async def start_users_expire(db: AsyncSession, users: list[User]) -> list[User]:
11921244 await db .commit ()
11931245 for user in users :
11941246 await db .refresh (user )
1195- await load_user_attrs (user )
1247+ await load_user_attrs (user , load_usage_logs = False )
11961248 return users
11971249
11981250
0 commit comments