Completed POC for SuperOffice integration with the following key achievements: - Switched from RSA/SOAP to OAuth 2.0 (Refresh Token Flow) for better compatibility with SOD environment. - Implemented robust token refreshing and caching mechanism in . - Solved 'Wrong Subdomain' issue by enforcing for tenant . - Created for REST API interaction (Search, Create, Update UDFs). - Added helper scripts: , , . - Documented usage and configuration in . - Updated configuration requirements. [2ff88f42]
46 lines
1.7 KiB
Python
46 lines
1.7 KiB
Python
import os
|
|
import logging
|
|
import json
|
|
from dotenv import load_dotenv
|
|
from auth_handler import AuthHandler
|
|
from superoffice_client import SuperOfficeClient
|
|
|
|
logging.basicConfig(level=logging.INFO)
|
|
logger = logging.getLogger(__name__)
|
|
|
|
def discover_contact_structure():
|
|
load_dotenv(dotenv_path="../.env")
|
|
auth = AuthHandler()
|
|
client = SuperOfficeClient(auth)
|
|
|
|
logger.info("Fetching a single contact to inspect structure...")
|
|
|
|
# Try to get the first contact (usually ID 1 exists or can be found)
|
|
# If not, we try to create a dummy and then inspect it.
|
|
url = client._get_url("v1/Contact/1")
|
|
try:
|
|
resp = client.session.get(url, headers=client._get_headers())
|
|
if resp.status_code == 200:
|
|
contact = resp.json()
|
|
print("\n--- CONTACT STRUCTURE ---")
|
|
print(json.dumps(contact, indent=2))
|
|
else:
|
|
logger.warning(f"Contact 1 not found (Status {resp.status_code}). Trying to list contacts...")
|
|
url = client._get_url("v1/Contact?$top=1")
|
|
resp = client.session.get(url, headers=client._get_headers())
|
|
resp.raise_for_status()
|
|
contacts = resp.json().get("value", [])
|
|
if contacts:
|
|
print("\n--- CONTACT STRUCTURE (from list) ---")
|
|
print(json.dumps(contacts[0], indent=2))
|
|
else:
|
|
print("\nNo contacts found in tenant. Please create one manually in the UI or stay tuned.")
|
|
|
|
except Exception as e:
|
|
logger.error(f"Failed to fetch contact: {e}")
|
|
if hasattr(e, 'response') and e.response is not None:
|
|
print(f"Details: {e.response.text}")
|
|
|
|
if __name__ == "__main__":
|
|
discover_contact_structure()
|