def get_user_attributes(user: User) -> UserAttributes:
    from pcapi.core.users.api import get_domains_credit

    is_pro_user = user.has_pro_role or db.session.query(
        UserOfferer.query.filter_by(userId=user.id).exists()).scalar()
    user_bookings: List[Booking] = _get_user_bookings(
        user) if not is_pro_user else []
    last_favorite = (Favorite.query.filter_by(userId=user.id).order_by(
        Favorite.id.desc()).first() if not is_pro_user else None)
    domains_credit = get_domains_credit(
        user, user_bookings) if not is_pro_user else None
    booking_categories, booking_subcategories = _get_bookings_categories_and_subcategories(
        user_bookings)

    return UserAttributes(
        booking_categories=booking_categories,
        booking_count=len(user_bookings),
        booking_subcategories=booking_subcategories,
        date_created=user.dateCreated,
        date_of_birth=user.dateOfBirth,
        departement_code=user.departementCode,
        deposit_activation_date=user.deposit_activation_date,
        deposit_expiration_date=user.deposit_expiration_date,
        domains_credit=domains_credit,
        eligibility=user.eligibility,
        first_name=user.firstName,
        has_completed_id_check=user.hasCompletedIdCheck,
        user_id=user.id,
        is_beneficiary=user.has_beneficiary_role,
        is_eligible=user.is_eligible,
        is_email_validated=user.isEmailValidated,
        is_pro=is_pro_user,
        last_booking_date=user_bookings[0].dateCreated
        if user_bookings else None,
        last_favorite_creation_date=last_favorite.dateCreated
        if last_favorite else None,
        last_name=user.lastName,
        last_visit_date=user.lastConnectionDate,
        marketing_email_subscription=user.get_notification_subscriptions(
        ).marketing_email,
        marketing_push_subscription=user.get_notification_subscriptions().
        marketing_push,
        postal_code=user.postalCode,
        products_use_date={
            f"product_{TRACKED_PRODUCT_IDS[booking.stock.offer.productId]}_use":
            booking.dateUsed
            for booking in user_bookings if booking.dateUsed
            and booking.stock.offer.productId in TRACKED_PRODUCT_IDS
        },
    )
 def from_orm(cls, user: User):  # type: ignore
     user.show_eligible_card = cls._show_eligible_card(user)
     user.subscriptions = user.get_notification_subscriptions()
     user.domains_credit = get_domains_credit(user)
     user.booked_offers = cls._get_booked_offers(user)
     user.next_beneficiary_validation_step = get_next_beneficiary_validation_step(
         user)
     result = super().from_orm(user)
     result.subscriptionMessage = SubscriptionMessage.from_model(
         subscription_api.get_latest_subscription_message(user))
     # FIXME: (Lixxday) Remove after isBeneficiary column has been deleted
     result.isBeneficiary = user.is_beneficiary
     return result