Authentification

L'API utilise une authentification par session (cookies). Pour chaque requête modifiant des données (POST, PUT, DELETE), vous devez inclure un token CSRF.

1. Se connecter

POST /auth/login/
Content-Type: application/json
X-CSRFToken: <csrf_token>

{
    "email": "votre@email.com",
    "password": "votre_mot_de_passe"
}

2. Se déconnecter

POST /auth/logout/
X-CSRFToken: <csrf_token>
Le cookie de session sessionid est automatiquement géré par le navigateur. Pour les requêtes API, incluez toujours le header X-CSRFToken.

Niveaux d'accès

Rôle Description
Superuser Accès complet à toutes les ressources
Staff Accès à toutes les communes (lecture/écriture PAVs et localisations)
User avec commune Accès uniquement aux PAVs et localisations de sa commune

Endpoints

Communes

Seuls les superusers peuvent créer, modifier ou supprimer des communes.

Méthode Endpoint Description
GET /api/cities/ Lister toutes les communes
POST /api/cities/ Créer une commune
GET /api/cities/{id}/ Détail d'une commune
PUT /api/cities/{id}/ Modifier une commune
DELETE /api/cities/{id}/ Supprimer une commune
Structure des données
{
    "name": "Enghien",        // Requis, unique
    "postal_code": "7850",    // Optionnel
    "city": "Hainaut"         // Optionnel (région/province)
}

Localisations

Les utilisateurs non-staff ne peuvent accéder qu'aux localisations de leur commune.

Méthode Endpoint Description
GET /api/locations/ Lister les localisations
POST /api/locations/ Créer une localisation
GET /api/locations/{id}/ Détail d'une localisation
PUT /api/locations/{id}/ Modifier une localisation
DELETE /api/locations/{id}/ Supprimer une localisation
Structure des données
{
    "street": "Place du Marché",   // Optionnel
    "postal_code": "7850",         // Optionnel
    "city": 1,                     // ID de la commune (auto-assigné pour non-staff)
    "locality": "Centre-ville",    // Optionnel
    "country": "Belgique",         // Optionnel
    "longitude": 3.9667,           // Optionnel (coordonnée GPS)
    "latitude": 50.6833            // Optionnel (coordonnée GPS)
}

PAVs (Points d'Apport Volontaire)

Les utilisateurs non-staff ne peuvent accéder qu'aux PAVs de leur commune.

Méthode Endpoint Description
GET /pav/ Lister les PAVs
POST /pav/ Créer un PAV
GET /pav/{id}/ Détail d'un PAV
PUT /pav/{id}/ Modifier un PAV
DELETE /pav/{id}/ Supprimer un PAV
Structure des données
{
    "name": "Verre - Place du Marché",  // Requis
    "location": 1,                       // ID de la localisation
    "type": 1,                           // ID du type de PAV
    "is_full": false                     // État (défaut: false)
}

Logs de statut

Méthode Endpoint Description
GET /logs/ Lister les logs
POST /logs/ Signaler un changement de statut
Structure des données
{
    "pav": 1,       // ID du PAV (requis)
    "status": true  // true = plein, false = vide (requis)
}

Codes d'erreur

Code Description
200Succès
201Ressource créée
204Suppression réussie
400Requête invalide (données manquantes ou incorrectes)
401Non authentifié
403Accès refusé (permissions insuffisantes)
404Ressource non trouvée
429Trop de requêtes (rate limiting)

Exemple Python

import requests

BASE_URL = "https://pav404.be"
session = requests.Session()

# 1. Récupérer le CSRF token
login_page = session.get(f"{BASE_URL}/auth/login/")
csrf_token = session.cookies.get('csrftoken')

# 2. Se connecter
response = session.post(
    f"{BASE_URL}/auth/login/",
    json={"email": "user@example.com", "password": "password123"},
    headers={"X-CSRFToken": csrf_token}
)

# Mettre à jour le CSRF token après connexion
csrf_token = session.cookies.get('csrftoken')

# 3. Créer une localisation
response = session.post(
    f"{BASE_URL}/api/locations/",
    json={
        "street": "Rue de la Gare",
        "postal_code": "7850",
        "locality": "Centre"
    },
    headers={"X-CSRFToken": csrf_token}
)
location = response.json()

# 4. Créer un PAV
response = session.post(
    f"{BASE_URL}/pav/",
    json={
        "name": "Verre - Gare",
        "location": location["id"],
        "type": 1
    },
    headers={"X-CSRFToken": csrf_token}
)
pav = response.json()
print(f"PAV créé: {pav}")
Documentation interactive
Une documentation Swagger est disponible à /docs/ et ReDoc à /redoc/.