Aller au contenu principal

SDK Python pour MONCRENEAU

Le SDK Python officiel pour intégrer MONCRENEAU dans vos applications Django, Flask, FastAPI ou Python standard.

Installation

pip install moncreneau

Ou avec Poetry :

poetry add moncreneau

Configuration

Python Standard

from moncreneau import MoncreneauClient

client = MoncreneauClient('YOUR_API_KEY')

Avec configuration avancée

from moncreneau import MoncreneauClient, Configuration

config = Configuration(
api_key='YOUR_API_KEY',
base_url='https://mc-prd.duckdns.org/api/v1',
timeout=30,
max_retries=3
)

client = MoncreneauClient(config)

Avec variables d'environnement

import os
from moncreneau import MoncreneauClient

client = MoncreneauClient(os.getenv('MONCRENEAU_API_KEY'))

Fichier .env :

MONCRENEAU_API_KEY=YOUR_API_KEY
MONCRENEAU_BASE_URL=https://mc-prd.duckdns.org/api/v1

Exemples d'utilisation

Lister les départements

from moncreneau import MoncreneauClient

client = MoncreneauClient('YOUR_API_KEY')

try:
departments = client.departments.list()

for dept in departments:
print(f"ID: {dept.id} - {dept.name} ({dept.address})")

except Exception as e:
print(f"Erreur: {e}")

Créer un rendez-vous

from moncreneau import MoncreneauClient
from moncreneau.exceptions import InsufficientCreditsError

client = MoncreneauClient('YOUR_API_KEY')

try:
appointment = client.appointments.create(
department_id=5,
date_time='2026-02-15T10:00:00',
name='Amadou Diallo'
)

print('✅ Rendez-vous créé!')
print(f'ID: {appointment.id}')
print(f'QR Code: {appointment.qr_code}')
print(f'Statut: {appointment.status}')

except InsufficientCreditsError as e:
print(f'❌ Crédits insuffisants: {e}')
except Exception as e:
print(f'❌ Erreur: {e}')

Vérifier la disponibilité

from moncreneau import MoncreneauClient

client = MoncreneauClient('YOUR_API_KEY')

try:
availability = client.departments.check_availability(
department_id=5,
date_time='2026-02-15T10:00:00'
)

if availability.available:
print('✅ Créneau disponible!')
print(f'Places restantes: {availability.remaining_slots}')
else:
print('❌ Créneau indisponible')
print(f'Raison: {availability.unavailability_reason}')

except Exception as e:
print(f'Erreur: {e}')

Annuler un rendez-vous

from moncreneau import MoncreneauClient

client = MoncreneauClient('YOUR_API_KEY')

try:
cancelled = client.appointments.cancel(123)

print('✅ Rendez-vous annulé')
print(f'Statut: {cancelled.status}')
print('1 crédit remboursé')

except Exception as e:
print(f'❌ Erreur: {e}')

Intégration Django

Configuration settings.py

# settings.py

MONCRENEAU = {
'API_KEY': os.getenv('MONCRENEAU_API_KEY'),
'BASE_URL': os.getenv('MONCRENEAU_BASE_URL', 'https://mc-prd.duckdns.org/api/v1'),
'TIMEOUT': 30,
}

Service Django

Créez myapp/services/moncreneau_service.py :

from django.conf import settings
from moncreneau import MoncreneauClient, Configuration

class MoncreneauService:
def __init__(self):
config = Configuration(
api_key=settings.MONCRENEAU['API_KEY'],
base_url=settings.MONCRENEAU['BASE_URL'],
timeout=settings.MONCRENEAU['TIMEOUT']
)
self.client = MoncreneauClient(config)

def create_appointment(self, department_id: int, date_time: str, name: str):
return self.client.appointments.create(
department_id=department_id,
date_time=date_time,
name=name
)

def list_departments(self):
return self.client.departments.list()

# Singleton
moncreneau_service = MoncreneauService()

View Django

from django.http import JsonResponse
from django.views import View
from moncreneau.exceptions import InsufficientCreditsError
from .services.moncreneau_service import moncreneau_service

class CreateAppointmentView(View):
def post(self, request):
try:
data = json.loads(request.body)

appointment = moncreneau_service.create_appointment(
department_id=data['department_id'],
date_time=data['date_time'],
name=data['name']
)

return JsonResponse({
'id': appointment.id,
'status': appointment.status,
'qr_code': appointment.qr_code
}, status=201)

except InsufficientCreditsError as e:
return JsonResponse({'error': str(e)}, status=402)
except Exception as e:
return JsonResponse({'error': str(e)}, status=500)

class CheckAvailabilityView(View):
def get(self, request, department_id):
date_time = request.GET.get('dateTime')

availability = moncreneau_service.client.departments.check_availability(
department_id=department_id,
date_time=date_time
)

return JsonResponse({
'available': availability.available,
'remaining_slots': availability.remaining_slots,
'unavailability_reason': availability.unavailability_reason
})

Intégration Flask

Configuration Flask

from flask import Flask
from moncreneau import MoncreneauClient
import os

app = Flask(__name__)
app.config['MONCRENEAU_API_KEY'] = os.getenv('MONCRENEAU_API_KEY')

client = MoncreneauClient(app.config['MONCRENEAU_API_KEY'])

Routes Flask

from flask import Flask, request, jsonify
from moncreneau import MoncreneauClient
from moncreneau.exceptions import InsufficientCreditsError

app = Flask(__name__)
client = MoncreneauClient(os.getenv('MONCRENEAU_API_KEY'))

@app.route('/appointments', methods=['POST'])
def create_appointment():
try:
data = request.get_json()

appointment = client.appointments.create(
department_id=data['department_id'],
date_time=data['date_time'],
name=data['name']
)

return jsonify({
'id': appointment.id,
'status': appointment.status,
'qr_code': appointment.qr_code
}), 201

except InsufficientCreditsError as e:
return jsonify({'error': str(e)}), 402
except Exception as e:
return jsonify({'error': str(e)}), 500

@app.route('/departments/<int:id>/availability', methods=['GET'])
def check_availability(id):
date_time = request.args.get('dateTime')

availability = client.departments.check_availability(
department_id=id,
date_time=date_time
)

return jsonify({
'available': availability.available,
'remaining_slots': availability.remaining_slots
})

if __name__ == '__main__':
app.run(debug=True)

Intégration FastAPI

Application FastAPI

from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from moncreneau import MoncreneauClient
from moncreneau.exceptions import InsufficientCreditsError
import os

app = FastAPI()
client = MoncreneauClient(os.getenv('MONCRENEAU_API_KEY'))

class CreateAppointmentRequest(BaseModel):
department_id: int
date_time: str
name: str

@app.post('/appointments')
async def create_appointment(request: CreateAppointmentRequest):
try:
appointment = client.appointments.create(
department_id=request.department_id,
date_time=request.date_time,
name=request.name
)

return {
'id': appointment.id,
'status': appointment.status,
'qr_code': appointment.qr_code
}

except InsufficientCreditsError as e:
raise HTTPException(status_code=402, detail=str(e))
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))

@app.get('/departments/{department_id}/availability')
async def check_availability(department_id: int, dateTime: str):
availability = client.departments.check_availability(
department_id=department_id,
date_time=dateTime
)

return {
'available': availability.available,
'remaining_slots': availability.remaining_slots,
'unavailability_reason': availability.unavailability_reason
}

Support asynchrone

Le SDK supporte les opérations async/await :

from moncreneau import AsyncMoncreneauClient
import asyncio

async def main():
client = AsyncMoncreneauClient('YOUR_API_KEY')

# Toutes les opérations sont async
departments = await client.departments.list()

appointment = await client.appointments.create(
department_id=5,
date_time='2026-02-15T10:00:00',
name='Amadou Diallo'
)

print(f'Rendez-vous créé: {appointment.id}')

asyncio.run(main())

Gestion des erreurs

Le SDK utilise des exceptions typées :

from moncreneau import MoncreneauClient
from moncreneau.exceptions import (
InsufficientCreditsError,
ValidationError,
NotFoundError,
UnauthorizedError,
ApiError
)

client = MoncreneauClient('YOUR_API_KEY')

try:
appointment = client.appointments.create(data)

except InsufficientCreditsError as e:
# Pas assez de crédits
print(f'Crédits insuffisants: {e}')

except ValidationError as e:
# Validation échouée
print(f'Validation: {e.errors}')

except NotFoundError as e:
# Ressource introuvable
print(f'Non trouvé: {e}')

except UnauthorizedError as e:
# API Key invalide
print('API Key invalide')

except ApiError as e:
# Erreur API générique
print(f'Erreur API: {e.message}')
print(f'Status: {e.status_code}')

except Exception as e:
# Erreur générique
print(f'Erreur: {e}')

Configuration avancée

Timeout et retry

from moncreneau import MoncreneauClient, Configuration

config = Configuration(
api_key='YOUR_API_KEY',
base_url='https://mc-prd.duckdns.org/api/v1',
timeout=30, # secondes
connect_timeout=10,
max_retries=3,
retry_delay=1.0 # secondes
)

client = MoncreneauClient(config)

Logging

import logging
from moncreneau import MoncreneauClient, Configuration

# Activer le logging
logging.basicConfig(level=logging.DEBUG)

config = Configuration(
api_key='YOUR_API_KEY',
debug=True
)

client = MoncreneauClient(config)

Webhooks

Vérifiez la signature des webhooks :

from moncreneau import Webhook
from flask import Flask, request

app = Flask(__name__)
webhook = Webhook(os.getenv('WEBHOOK_SECRET'))

@app.route('/webhooks/moncreneau', methods=['POST'])
def handle_webhook():
payload = request.get_data(as_text=True)
signature = request.headers.get('X-Moncreneau-Signature')

if not webhook.verify_signature(payload, signature):
return {'error': 'Invalid signature'}, 401

event = request.get_json()
print(f"Event: {event['type']}")

return {'received': True}, 200

Type hints

Le SDK est entièrement typé (PEP 484) :

from typing import List
from moncreneau import MoncreneauClient
from moncreneau.models import Department, Appointment, SlotAvailability

client = MoncreneauClient('YOUR_API_KEY')

def list_all_departments() -> List[Department]:
return client.departments.list()

def create_new_appointment(dept_id: int, dt: str, name: str) -> Appointment:
return client.appointments.create(
department_id=dept_id,
date_time=dt,
name=name
)

def check_slot(dept_id: int, dt: str) -> SlotAvailability:
return client.departments.check_availability(
department_id=dept_id,
date_time=dt
)

Tests unitaires avec pytest

import pytest
from moncreneau import MoncreneauClient
from moncreneau.exceptions import InsufficientCreditsError
import os

@pytest.fixture
def client():
return MoncreneauClient(os.getenv('MONCRENEAU_API_KEY'))

def test_create_appointment(client):
appointment = client.appointments.create(
department_id=5,
date_time='2026-02-15T10:00:00',
name='Test User'
)

assert isinstance(appointment.id, int)
assert appointment.status == 'PENDING'
assert appointment.qr_code is not None

def test_insufficient_credits(client):
with pytest.raises(InsufficientCreditsError):
# Créer plusieurs RDV pour épuiser les crédits
client.appointments.create(...)

Ressources