fetch_users previously only surfaced users who appeared as ticket owners. Add list_users(limit, offset) to hit the accounts user-list endpoint directly with raw limit/offset params -- the generated OpenAPI wrapper only supports page, which this endpoint silently ignores. fetch_users now paginates that list and hydrates each entry with get_user_detailed_info to keep the existing email/phone/address columns. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
99 lines
3.3 KiB
Python
99 lines
3.3 KiB
Python
import time
|
|
|
|
import requests
|
|
from django.conf import settings
|
|
from django.core.cache import cache
|
|
from django.db import models
|
|
from httpx import Request
|
|
|
|
from utils.clients.gooyal_accounts_client import AuthenticatedClient
|
|
from utils.clients.gooyal_accounts_client.models import Account
|
|
from utils.clients.gooyal_accounts_client.api.users import (users_api_users_details_retrieve)
|
|
from utils.http_fallback import request_with_ssl_fallback, resolve_verify_ssl
|
|
|
|
|
|
|
|
def login_as_client_credentials():
|
|
access_token = cache.get('settlement_access_token')
|
|
# expires_in = self.auth_data.get('expires_in')
|
|
# created_at = self.auth_data.get('created_at')
|
|
#
|
|
# if access_token and expires_in > time.time() - created_at:
|
|
# return self.auth_data
|
|
if access_token:
|
|
print('already in cache')
|
|
return access_token
|
|
|
|
print('not in cache')
|
|
|
|
data = {
|
|
"grant_type": 'client_credentials',
|
|
"scope": settings.OAUTH2_PROVIDER_SCOPES,
|
|
}
|
|
auth = (settings.OAUTH2_PROVIDER_CLIENT_ID, settings.OAUTH2_PROVIDER_CLIENT_SECRET)
|
|
|
|
response = request_with_ssl_fallback('POST', f'{settings.OAUTH2_PROVIDER_BASE_PUBLIC_URL}/token/',
|
|
data=data,
|
|
auth=auth)
|
|
print(response.content)
|
|
|
|
auth_data = response.json()
|
|
if 'access_token' in auth_data:
|
|
auth_data['created_at'] = time.time()
|
|
cache.set('settlement_access_token', auth_data, timeout=auth_data.get('expires_in') - 5)
|
|
|
|
return auth_data
|
|
|
|
|
|
def log_request(request: Request):
|
|
print(request.headers['authorization'])
|
|
print(
|
|
f"Request event hook: {request.method} {request.url} {request.method} {request.headers} - Waiting for response")
|
|
|
|
|
|
def log_response(response):
|
|
request = response.request
|
|
print(f"Response event hook: {request.method} {request.url} - Status {response.status_code}")
|
|
|
|
|
|
def get_client():
|
|
access_token = login_as_client_credentials()['access_token']
|
|
verify_ssl = resolve_verify_ssl(settings.ACCOUNTS_BASE_PUBLIC_URL)
|
|
client = AuthenticatedClient(base_url=settings.ACCOUNTS_BASE_PUBLIC_URL, token=access_token,
|
|
verify_ssl=verify_ssl,
|
|
httpx_args={"event_hooks": {"request": [log_request], "response": [log_response]}},
|
|
)
|
|
return client
|
|
|
|
|
|
def get_user_detailed_info(uuid):
|
|
client = get_client()
|
|
response: Account = users_api_users_details_retrieve.sync(uuid=uuid, client=client)
|
|
print(response)
|
|
|
|
return response
|
|
|
|
|
|
def list_users(limit=100, offset=0):
|
|
"""Fetch one page of the accounts user list.
|
|
|
|
The generated OpenAPI client (users_api_users_list) only supports
|
|
`page`, and that param is silently ignored by the upstream endpoint --
|
|
every page returns the same first results. Its real pagination is
|
|
limit/offset, so this bypasses the generated wrapper with a raw request.
|
|
"""
|
|
access_token = login_as_client_credentials()['access_token']
|
|
base_url = settings.ACCOUNTS_BASE_PUBLIC_URL
|
|
url = f"{base_url.rstrip('/')}/users/api/users/"
|
|
|
|
response = request_with_ssl_fallback(
|
|
'GET',
|
|
url,
|
|
params={"limit": limit, "offset": offset},
|
|
headers={"Authorization": f"Bearer {access_token}"},
|
|
verify=resolve_verify_ssl(base_url),
|
|
)
|
|
response.raise_for_status()
|
|
return response.json()
|
|
|
|
|