Skip to content

List member attendance

In this example, it will be demonstrated how to count how many times each member attended a specific activity since a given date.

The following logical steps are performed:

  • Define the team_id, activity_name, and since_date date.
  • Retrieve the team members.
  • Retrieve activities from the since_date date and count members marked as Attending for matching activities.
  • Print each member with their attendance count.
from collections import Counter
from datetime import date, datetime

from pyholdsport import (
    Holdsport,
    HoldsportActivitiesUser,
    HoldsportActivity,
    HoldsportActivityUserStatus,
    HoldsportMember,
)

with Holdsport(
    holdsport_username="username",
    holdsport_password="password",
) as holdsport:
    team_id = 123
    activity_name = "Activity Name"
    since_date = date(2026, 1, 1)

    members: list[HoldsportMember] = holdsport.get_members(team_id=team_id)
    member_ids: set[int] = {member.id for member in members}

    attendance_counts: Counter[int] = Counter()
    page = 1
    while True:
        reached_future_activity = False
        activities: list[HoldsportActivity] = holdsport.get_activities(
            team_id=team_id,
            date=since_date.isoformat(),
            page=page,
            per_page=20,
        )
        if not activities:
            break

        for activity in activities:
            activity_time = datetime.strptime(
                activity.starttime, "%Y-%m-%dT%H:%M:%S%z"
            )
            if activity_time > datetime.now(activity_time.tzinfo):
                # Assume that once a future activity is reached, all subsequent
                # activities are also in the future.
                reached_future_activity = True
                break

            if activity.name != activity_name:
                continue

            activities_users: list[HoldsportActivitiesUser] = (
                holdsport.get_activities_users(
                    activity.id,
                )
            )
            for user in activities_users:
                if (
                    user.status_code is HoldsportActivityUserStatus.ATTENDING
                    and user.user_id in member_ids
                ):
                    attendance_counts[user.user_id] += 1

        if reached_future_activity:
            break

        page += 1

    print(
        f"Player attendance for '{activity_name}' "
        f"since {since_date.isoformat()}:"
    )
    sorted_members = sorted(
        members,
        key=lambda member: (
            -attendance_counts[member.id],
            member.lastname,
            member.firstname,
        ),
    )
    for sorted_member in sorted_members:
        print(
            f"{sorted_member.firstname} {sorted_member.lastname}: "
            f"{attendance_counts[sorted_member.id]}"
        )