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
« 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
5from couchers.constants import COMPLETED_PROFILE_MINIMUM_CHAR_LENGTH
6from couchers.models import User
7from couchers.models.uploads import has_avatar_photo_expression
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())
19def has_completed_profile_expression() -> ColumnElement[bool]:
20 """
21 Returns a SQL expression for checking if a user has completed their profile.
23 Use this in SQLAlchemy queries where you need to filter by profile completeness.
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 )