Director¶
The Director resource provides access to tournament director information, their tournament history, and country director assignments.
Quick Example¶
from ifpa_api import IfpaClient
from ifpa_api.models.director import DirectorSearchResponse
client: IfpaClient = IfpaClient()
# Fluent query builder - search for directors named "Josh" in the US
results: DirectorSearchResponse = client.director.query("Josh").country("US").get()
Searching Directors (Fluent Query Builder)¶
The recommended way to search for directors is using the fluent query builder:
from ifpa_api import IfpaClient
from ifpa_api.models.director import DirectorSearchResponse
client: IfpaClient = IfpaClient()
# Simple name search
results: DirectorSearchResponse = client.director.query("Josh").get()
for director in results.directors:
print(f"{director.director_id}: {director.name}")
print(f" Location: {director.city}, {director.stateprov}, {director.country_name}")
print(f" Tournaments Directed: {director.tournament_count}")
# Output:
# 1533: Josh Sharpe
# Location: Chicago, IL, United States
# Tournaments Directed: 45
Chained Filters¶
The fluent API allows method chaining for complex queries:
from ifpa_api import IfpaClient
from ifpa_api.models.director import DirectorSearchResponse
client: IfpaClient = IfpaClient()
# Chain multiple filters
results: DirectorSearchResponse = (client.director.query("Sharpe")
.country("US")
.state("IL")
.city("Chicago")
.limit(25)
.get())
# Location-only search (no name query)
results: DirectorSearchResponse = (client.director.query()
.country("US")
.state("IL")
.limit(50)
.get())
# Country filter with pagination
results: DirectorSearchResponse = (client.director.query()
.country("US")
.offset(0)
.limit(100)
.get())
Query Reuse (Immutable Pattern)¶
The query builder is immutable - each method returns a new instance, allowing query reuse:
from ifpa_api import IfpaClient
from ifpa_api.models.director import DirectorSearchResponse
client: IfpaClient = IfpaClient()
# Create a reusable base query for US directors
us_query = client.director.query().country("US")
# Derive state-specific queries from the base
il_directors: DirectorSearchResponse = us_query.state("IL").limit(25).get()
or_directors: DirectorSearchResponse = us_query.state("OR").limit(25).get()
wa_directors: DirectorSearchResponse = us_query.state("WA").limit(25).get()
# The base query remains unchanged and can be reused
ca_directors: DirectorSearchResponse = us_query.state("CA").limit(25).get()
Available Filters¶
| Method | Parameter | Description |
|---|---|---|
.query(name) |
str |
Director name (partial match, case insensitive) |
.city(city) |
str |
City filter |
.state(stateprov) |
str |
State/province code (e.g., "IL", "WA") |
.country(code) |
str |
Country name or code (e.g., "US", "CA") |
.offset(start_position) |
int |
Pagination offset (0-based) |
.limit(count) |
int |
Maximum number of results |
.get() |
- | Execute query and return results |
Migration from 0.2.x
The client.director.search(name="Josh") method was removed in v0.3.0.
Use the fluent query builder instead: client.director.query("Josh").get()
Individual Director Operations¶
Access individual director information using the callable pattern. These methods are not deprecated.
Get Director Details¶
Retrieve detailed information about a specific tournament director:
from ifpa_api import IfpaClient
from ifpa_api.models.director import Director
client: IfpaClient = IfpaClient()
# Get director by ID - Josh Rainwater (1533) from Columbia, SC
director: Director = client.director(1533).details()
print(f"Name: {director.name}")
print(f"Director ID: {director.director_id}")
print(f"Location: {director.city}, {director.stateprov}, {director.country_name}")
# Access director statistics
if director.stats:
print(f"\nDirector Statistics:")
print(f" Total Tournaments: {director.stats.tournament_count}")
print(f" Unique Venues: {director.stats.unique_location_count}")
print(f" Total Players: {director.stats.total_player_count}")
print(f" Unique Players: {director.stats.unique_player_count}")
print(f" Largest Event: {director.stats.largest_event_count} players")
print(f" Average Tournament Value: {director.stats.average_value}")
print(f" Highest Tournament Value: {director.stats.highest_value}")
# Output:
# Name: Josh Rainwater
# Director ID: 1533
# Location: Columbia, SC, United States
#
# Director Statistics:
# Total Tournaments: 13
# Unique Venues: 1
# Total Players: 347
# Unique Players: 120
# Largest Event: 41 players
# Average Tournament Value: 5.89
# Highest Tournament Value: 11.82
Director Profile Information¶
Director profiles include:
- Identity: Name, director ID, profile photo
- Location: City, state/province, country
- Social: Twitch username (if available)
- Statistics: Tournament count, player statistics, format usage
- Tournament counts (total, women's, league)
- Player metrics (total, unique, first-time, repeat)
- Venue count
- Format breakdown (single, multiple, unknown)
- Tournament values (highest, average)
Invalid Director IDs¶
When requesting a non-existent director, the SDK raises an error:
from ifpa_api import IfpaClient
from ifpa_api.core.exceptions import IfpaApiError
client: IfpaClient = IfpaClient()
try:
director = client.director(99999999).details()
except IfpaApiError as e:
if e.status_code == 404:
print("Director not found")
Get Director's Tournaments¶
Access a director's tournament history:
from ifpa_api import IfpaClient
from ifpa_api.models.common import TimePeriod
from ifpa_api.models.director import DirectorTournamentsResponse
client: IfpaClient = IfpaClient()
# Get past tournaments for Josh Rainwater (1533)
past: DirectorTournamentsResponse = client.director(1533).tournaments(TimePeriod.PAST)
print(f"Director: {past.director_name}")
print(f"Total past tournaments: {past.total_count}")
for tournament in past.tournaments[:3]: # Show first 3
print(f"\n{tournament.tournament_name}")
print(f" Date: {tournament.event_date}")
print(f" Location: {tournament.location_name}")
print(f" City: {tournament.city}, {tournament.stateprov}")
print(f" Players: {tournament.player_count}")
print(f" Value: {tournament.value}")
# Output:
# Director: Josh Rainwater
# Total past tournaments: 13
#
# South Carolina Pinball Championship
# Date: 2024-03-16
# Location: Cinnebarre
# City: Columbia, SC
# Players: 41
# Value: 11.82
Get Upcoming Tournaments¶
from ifpa_api import IfpaClient
from ifpa_api.models.common import TimePeriod
from ifpa_api.models.director import DirectorTournamentsResponse
client: IfpaClient = IfpaClient()
# Get future tournaments for Josh Rainwater (1533)
upcoming: DirectorTournamentsResponse = client.director(1533).tournaments(TimePeriod.FUTURE)
print(f"Upcoming tournaments: {upcoming.total_count}")
for tournament in upcoming.tournaments:
print(f"\n{tournament.tournament_name}")
print(f" Start: {tournament.event_date}")
print(f" End: {tournament.event_end_date}")
print(f" Location: {tournament.location_name}")
print(f" Ranking System: {tournament.ranking_system}")
Working with Highly Active Directors¶
For directors with extensive history, use the same pattern:
from ifpa_api import IfpaClient
from ifpa_api.models.common import TimePeriod
from ifpa_api.models.director import Director, DirectorTournamentsResponse
client: IfpaClient = IfpaClient()
# Get highly active director - Erik Thoren (1151)
# 545 tournaments, 1,658 unique players, De Pere, WI
director: Director = client.director(1151).details()
print(f"{director.name}")
print(f" Tournaments: {director.stats.tournament_count}")
print(f" Unique Players: {director.stats.unique_player_count}")
print(f" Highest Value: {director.stats.highest_value}")
print(f" Location: {director.city}, {director.stateprov}")
# Get future events
future: DirectorTournamentsResponse = client.director(1151).tournaments(TimePeriod.FUTURE)
print(f" Upcoming Events: {future.total_count}")
Handling Empty Results¶
Some directors may have no future tournaments:
from ifpa_api import IfpaClient
from ifpa_api.models.common import TimePeriod
from ifpa_api.models.director import DirectorTournamentsResponse
client: IfpaClient = IfpaClient()
# Check for empty tournament lists
future: DirectorTournamentsResponse = client.director(1752).tournaments(TimePeriod.FUTURE)
if future.total_count == 0 or not future.tournaments:
print("No upcoming tournaments")
else:
print(f"Found {future.total_count} upcoming tournaments")
Tournament Parameters¶
| Parameter | Type | Required | Description |
|---|---|---|---|
time_period |
TimePeriod |
Yes | TimePeriod.PAST or TimePeriod.FUTURE |
Tournament Information¶
Each tournament includes:
- Identity: Tournament ID, name, event name
- Dates: Event start date, end date
- Location: Venue name, city, state/province, country
- Format: Qualifying format, finals format
- Details: Ranking system, player count, tournament value
- Special: Women-only flag
Country Directors¶
Get the list of IFPA country directors:
from ifpa_api import IfpaClient
from ifpa_api.models.director import CountryDirectorsResponse
client: IfpaClient = IfpaClient()
# Get all country directors
country_dirs: CountryDirectorsResponse = client.director.country_directors()
print(f"Total country directors: {country_dirs.count}")
for director in country_dirs.country_directors[:5]: # Show first 5
profile = director.player_profile
print(f"\n{profile.country_name} ({profile.country_code})")
print(f" Director: {profile.name}")
print(f" Player ID: {profile.player_id}")
Country Director Information¶
Each country director includes a nested player_profile with:
- Identity: Player ID, name
- Country: Country code, country name
- Profile: Profile photo URL
Note: Access director information through the player_profile field:
Complete Example: Director Analysis¶
Here's a complete example that analyzes a director's activity:
from ifpa_api import IfpaClient
from ifpa_api.core.exceptions import IfpaApiError
from ifpa_api.models.common import TimePeriod
from ifpa_api.models.director import Director, DirectorTournamentsResponse
def analyze_director(director_id: int = 1533) -> None:
"""Comprehensive director analysis.
Default director: Josh Rainwater (1533) - active director from Columbia, SC
"""
client: IfpaClient = IfpaClient()
try:
# Get director profile
director: Director = client.director(director_id).details()
print("=" * 60)
print(f"{director.name}")
print("=" * 60)
# Basic info
print(f"\nLocation: {director.city}, {director.stateprov}, {director.country_name}")
print(f"Director ID: {director.director_id}")
# Statistics
if director.stats:
stats = director.stats
print(f"\nTournament Activity:")
print(f" Total Tournaments: {stats.tournament_count}")
print(f" Women's Tournaments: {stats.women_tournament_count}")
print(f" League Events: {stats.league_count}")
print(f" Unique Venues: {stats.unique_location_count}")
print(f"\nPlayer Engagement:")
print(f" Total Participations: {stats.total_player_count}")
print(f" Unique Players: {stats.unique_player_count}")
print(f" First-Time Players: {stats.first_time_player_count}")
print(f" Repeat Players: {stats.repeat_player_count}")
print(f" Largest Event: {stats.largest_event_count} players")
print(f"\nTournament Quality:")
print(f" Average Value: {stats.average_value:.2f}")
print(f" Highest Value: {stats.highest_value:.2f}")
# Format breakdown
if stats.formats:
print(f"\nFormat Usage:")
for fmt in stats.formats[:5]:
print(f" {fmt.name}: {fmt.count} tournaments")
# Get recent past tournaments
past: DirectorTournamentsResponse = client.director(director_id).tournaments(TimePeriod.PAST)
print(f"\nRecent Past Tournaments ({past.total_count} total):")
for tournament in past.tournaments[:5]:
print(f"\n {tournament.tournament_name}")
print(f" Date: {tournament.event_date}")
print(f" Players: {tournament.player_count}")
if tournament.value:
print(f" Value: {tournament.value:.2f}")
# Get upcoming tournaments
future: DirectorTournamentsResponse = client.director(director_id).tournaments(TimePeriod.FUTURE)
if future.total_count and future.total_count > 0:
print(f"\nUpcoming Tournaments ({future.total_count}):")
for tournament in future.tournaments[:3]:
print(f"\n {tournament.tournament_name}")
print(f" Start: {tournament.event_date}")
print(f" Location: {tournament.location_name}")
else:
print(f"\nNo upcoming tournaments scheduled")
except IfpaApiError as e:
if e.status_code == 404:
print(f"Director {director_id} not found")
else:
print(f"API error: {e}")
if __name__ == "__main__":
# Analyze Josh Rainwater - active director
analyze_director(1533)
Best Practices¶
Error Handling¶
Always handle potential errors:
from ifpa_api import IfpaClient
from ifpa_api.core.exceptions import IfpaApiError
from ifpa_api.models.director import Director
client: IfpaClient = IfpaClient()
try:
director: Director = client.director(999999).details()
except IfpaApiError as e:
if e.status_code == 404:
print("Director not found")
else:
print(f"API error: {e}")
Reusable Queries¶
Take advantage of the immutable query builder pattern:
from ifpa_api import IfpaClient
from ifpa_api.models.director import DirectorSearchResponse
client: IfpaClient = IfpaClient()
# Create a base query for US directors
us_query = client.director.query().country("US")
# Derive specific state queries
il_directors: DirectorSearchResponse = us_query.state("IL").limit(50).get()
wa_directors: DirectorSearchResponse = us_query.state("WA").limit(50).get()
or_directors: DirectorSearchResponse = us_query.state("OR").limit(50).get()
Working with Country Directors¶
Find a specific country's director:
from ifpa_api import IfpaClient
from ifpa_api.models.director import CountryDirectorsResponse
client: IfpaClient = IfpaClient()
country_dirs: CountryDirectorsResponse = client.director.country_directors()
# Find director for a specific country
target_country = "US"
country_director = next(
(d for d in country_dirs.country_directors if d.player_profile.country_code == target_country),
None
)
if country_director:
print(f"Country Director for {target_country}: {country_director.player_profile.name}")
else:
print(f"No director found for {target_country}")
Working with International Directors¶
Access directors from any country:
from ifpa_api import IfpaClient
from ifpa_api.models.director import Director
client: IfpaClient = IfpaClient()
# Get international director - Michael Trepp (1071) from Switzerland
director: Director = client.director(1071).details()
print(f"{director.name}")
print(f" Country: {director.country_name} ({director.country_code})")
print(f" Tournaments: {director.stats.tournament_count}")
print(f" Unique Players: {director.stats.unique_player_count}")
Migration from 0.2.x¶
Migration from 0.2.x
The search() method was removed in v0.3.0. Use the fluent query builder instead:
# Old (0.2.x):
results: DirectorSearchResponse = client.director.search(name="Josh", country="US")
# New (0.3.0+):
results: DirectorSearchResponse = client.director.query("Josh").country("US").get()
Chained filters:
# Old (0.2.x):
results = client.director.search(name="Sharpe", city="Chicago", stateprov="IL")
# New (0.3.0+):
results = client.director.query("Sharpe").city("Chicago").state("IL").get()
The query builder is immutable and chainable, enabling query reuse and better type safety.
Related Resources¶
- Tournaments - View tournament details and results
- Player - View player profiles and statistics
- Error Handling - Handle API errors