Coverage for app / backend / src / couchers / helpers / completed_profile.py: 100%

12 statements  

« prev     ^ index     » next       coverage.py v7.13.2, created at 2026-02-03 06:18 +0000

1from sqlalchemy import and_, func, select 

2from sqlalchemy.orm import Session 

3from sqlalchemy.sql.elements import ColumnElement 

4 

5from couchers.constants import COMPLETED_PROFILE_MINIMUM_CHAR_LENGTH 

6from couchers.models import User 

7from couchers.models.uploads import has_avatar_photo_expression 

8 

9 

10def has_completed_profile(session: Session, user: User) -> bool: 

11 """ 

12 Check if a user has completed their profile (has photo + 150 char about_me). 

13 """ 

14 if not user.profile_gallery_id or not user.about_me or len(user.about_me) < COMPLETED_PROFILE_MINIMUM_CHAR_LENGTH: 

15 return False 

16 return bool(session.execute(select(has_avatar_photo_expression(user))).scalar()) 

17 

18 

19def has_completed_profile_expression() -> ColumnElement[bool]: 

20 """ 

21 Returns a SQL expression for checking if a user has completed their profile. 

22 

23 Use this in SQLAlchemy queries where you need to filter by profile completeness. 

24 

25 Usage: 

26 statement = select(User).where(has_completed_profile_expression()) 

27 """ 

28 return and_( 

29 User.profile_gallery_id != None, 

30 has_avatar_photo_expression(User), 

31 func.coalesce(func.character_length(User.about_me), 0) >= COMPLETED_PROFILE_MINIMUM_CHAR_LENGTH, 

32 )