You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
196 lines
5.3 KiB
196 lines
5.3 KiB
"""Example: TweedeKamerAPI usage - from api_client.py and actual codebase."""
|
|
|
|
from datetime import datetime, timedelta
|
|
from typing import Dict, List
|
|
|
|
# Import the API client
|
|
from api_client import TweedeKamerAPI
|
|
|
|
|
|
# =============================================================================
|
|
# Example 1: Basic API usage
|
|
# =============================================================================
|
|
|
|
|
|
def example_fetch_motions():
|
|
"""Fetch recent parliamentary motions from TweedeKamer API."""
|
|
|
|
api = TweedeKamerAPI()
|
|
|
|
# Fetch motions from last 30 days
|
|
start_date = datetime.now() - timedelta(days=30)
|
|
|
|
try:
|
|
motions = api.get_motions(start_date=start_date, limit=100)
|
|
|
|
print(f"Fetched {len(motions)} motions")
|
|
|
|
for motion in motions[:5]: # Show first 5
|
|
print(f" - {motion.get('title', 'N/A')}")
|
|
|
|
return motions
|
|
finally:
|
|
api.close()
|
|
|
|
|
|
# =============================================================================
|
|
# Example 2: Fetching with date range
|
|
# =============================================================================
|
|
|
|
|
|
def example_date_range():
|
|
"""Fetch motions from a specific date range."""
|
|
|
|
api = TweedeKamerAPI()
|
|
|
|
start = datetime(2024, 1, 1)
|
|
end = datetime(2024, 3, 31) # Q1 2024
|
|
|
|
try:
|
|
motions = api.get_motions(start_date=start, end_date=end, limit=500)
|
|
|
|
# Group by policy area
|
|
by_area = {}
|
|
for m in motions:
|
|
area = m.get("policy_area", "Onbekend")
|
|
by_area.setdefault(area, []).append(m)
|
|
|
|
for area, area_motions in sorted(by_area.items()):
|
|
print(f"{area}: {len(area_motions)} motions")
|
|
|
|
return motions
|
|
finally:
|
|
api.close()
|
|
|
|
|
|
# =============================================================================
|
|
# Example 3: Context manager usage
|
|
# =============================================================================
|
|
|
|
|
|
def example_context_manager():
|
|
"""Use API client as context manager."""
|
|
|
|
with TweedeKamerAPI() as api:
|
|
motions = api.get_motions(
|
|
start_date=datetime.now() - timedelta(days=7), limit=50
|
|
)
|
|
|
|
print(f"Fetched {len(motions)} motions this week")
|
|
|
|
return motions
|
|
|
|
|
|
# =============================================================================
|
|
# Example 4: Processing voting records
|
|
# =============================================================================
|
|
|
|
|
|
def example_process_votes():
|
|
"""Process individual voting records from API."""
|
|
|
|
api = TweedeKamerAPI()
|
|
|
|
start_date = datetime.now() - timedelta(days=7)
|
|
|
|
try:
|
|
# Get voting records directly
|
|
voting_records, besluit_meta = api._get_voting_records(
|
|
start_date=start_date, limit=1000
|
|
)
|
|
|
|
print(f"Fetched {len(voting_records)} voting records")
|
|
print(f"From {len(besluit_meta)} unique decisions")
|
|
|
|
# Count votes by party
|
|
party_votes = {}
|
|
for record in voting_records:
|
|
party = record.get("Fractie", "Onbekend")
|
|
vote = record.get("Soort", "Onbekend")
|
|
party_votes.setdefault(party, {})[vote] = (
|
|
party_votes.get(party, {}).get(vote, 0) + 1
|
|
)
|
|
|
|
for party, votes in sorted(party_votes.items()):
|
|
total = sum(votes.values())
|
|
voor = votes.get("Voor", 0)
|
|
print(f"{party}: {total} votes ({voor} voor)")
|
|
|
|
return voting_records
|
|
finally:
|
|
api.close()
|
|
|
|
|
|
# =============================================================================
|
|
# Example 5: Safe API call with fallback
|
|
# =============================================================================
|
|
|
|
|
|
def example_safe_call():
|
|
"""Make API call with safe fallback on failure."""
|
|
|
|
api = TweedeKamerAPI()
|
|
|
|
try:
|
|
# This will return [] on any error
|
|
motions = api.get_motions(
|
|
start_date=datetime.now() - timedelta(days=30), limit=100
|
|
)
|
|
|
|
if not motions:
|
|
print("No motions returned - using cached data")
|
|
# Fallback to cached/local data
|
|
from database import db
|
|
|
|
return db.get_filtered_motions(limit=10)
|
|
|
|
return motions
|
|
finally:
|
|
api.close()
|
|
|
|
|
|
# =============================================================================
|
|
# Example 6: Pagination handling
|
|
# =============================================================================
|
|
|
|
|
|
def example_pagination():
|
|
"""Understand how pagination works in the API."""
|
|
|
|
api = TweedeKamerAPI()
|
|
|
|
start_date = datetime.now() - timedelta(days=365)
|
|
|
|
# Simulate pagination
|
|
page_size = 250
|
|
total_limit = 500
|
|
|
|
all_motions = []
|
|
skip = 0
|
|
|
|
while len(all_motions) < total_limit:
|
|
print(f"Fetching page with skip={skip}...")
|
|
|
|
# In real usage, get_motions handles pagination internally
|
|
# This demonstrates what's happening under the hood
|
|
page_motions = api._fetch_page(start_date=start_date, skip=skip, top=page_size)
|
|
|
|
if not page_motions:
|
|
break
|
|
|
|
all_motions.extend(page_motions)
|
|
skip += page_size
|
|
|
|
if len(page_motions) < page_size:
|
|
break # Last page
|
|
|
|
print(f"Total fetched: {len(all_motions)} motions")
|
|
return all_motions
|
|
|
|
|
|
if __name__ == "__main__":
|
|
print("=== Basic Fetch ===")
|
|
example_fetch_motions()
|
|
|
|
print("\n=== Process Votes ===")
|
|
example_process_votes()
|
|
|