1. Konsep Dasar
SharePoint: Platform kolaborasi web-based milik Microsoft. Dalam konteks ini, fungsinya adalah sebagai Document Management System (DMS) eksternal untuk menyimpan file dari Odoo.
Microsoft Graph API: Satu endpoint tunggal (https://graph.microsoft.com) yang menghubungkan berbagai layanan Microsoft 365. Kita menggunakan ini untuk memanipulasi file (Upload, Download, Delete) di SharePoint secara programatik.
2. Prasyarat: Konfigurasi Azure AD (Entra ID)
Sebelum coding, Anda wajib mendaftarkan aplikasi di Azure Portal untuk mendapatkan akses:
1. Buka Azure Portal > App registrations.
2. Buat New Registration.
3. Catat Application (client) ID dan Directory (tenant) ID.
4. Buka menu Certificates & secrets > Buat New client secret. Catat "Value"-nya (ini hanya muncul sekali).
4. Buka menu Certificates & secrets > Buat New client secret. Catat "Value"-nya (ini hanya muncul sekali).
5. Buka menu API Permissions > Add permission > Microsoft Graph > Application permissions.
6. Pilih: Sites.ReadWrite.All (Untuk akses tulis ke SharePoint).
6. Pilih: Sites.ReadWrite.All (Untuk akses tulis ke SharePoint).
PENTING: Klik "Grant admin consent" agar permission aktif.
3. Alur Kerja Integrasi
Mekanisme otentikasi yang digunakan untuk server-to-server (Odoo ke Microsoft) adalah OAuth 2.0 Client Credentials Flow.
Odoo meminta Access Token ke Azure AD menggunakan Client ID & Secret.
Azure AD memberikan token.
Odoo mengirim file ke SharePoint via Graph API dengan menyertakan token tersebut di Header.
4. Implementasi di Odoo (Python Controller)
Berikut adalah struktur kode untuk Controller Odoo. Kode ini menangani otentikasi dan upload file.
Dependensi: Pastikan library requests terinstall (pip install requests).
Python
import requests
import json
import base64
from odoo import http
from odoo.http import request
class SharePointController(http.Controller):
# --- Konfigurasi (Sebaiknya simpan di ir.config_parameter) ---
TENANT_ID = 'your-tenant-id'
CLIENT_ID = 'your-client-id'
CLIENT_SECRET = 'your-client-secret'
# Site ID didapat via API request ke Graph (lihat poin 5)
SITE_ID = 'your-sharepoint-site-id'
DRIVE_ID = 'your-drive-id-usually-documents-library'
def _get_access_token(self):
"""Mendapatkan Token OAuth dari Azure AD"""
url = f"https://login.microsoftonline.com/{self.TENANT_ID}/oauth2/v2.0/token"
headers = {'Content-Type': 'application/x-www-form-urlencoded'}
data = {
'client_id': self.CLIENT_ID,
'scope': 'https://graph.microsoft.com/.default',
'client_secret': self.CLIENT_SECRET,
'grant_type': 'client_credentials',
}
response = requests.post(url, headers=headers, data=data)
if response.status_code == 200:
return response.json().get('access_token')
else:
raise Exception(f"Gagal Auth: {response.text}")
@http.route('/integrasi/upload_sharepoint', type='json', auth='user')
def upload_file(self, filename, file_content_base64):
"""
Endpoint untuk menerima file dari Odoo dan push ke SharePoint.
file_content_base64: Binary file dalam format base64
"""
token = self._get_access_token()
# Endpoint Graph API untuk upload file kecil (<4MB)
# Untuk file besar, gunakan metode 'createUploadSession'
endpoint = f"https://graph.microsoft.com/v1.0/sites/{self.SITE_ID}/drives/{self.DRIVE_ID}/root:/{filename}:/content"
headers = {
'Authorization': f'Bearer {token}',
'Content-Type': 'application/octet-stream' # Sesuaikan mime type jika perlu
}
# Decode base64 ke binary
file_data = base64.b64decode(file_content_base64)
response = requests.put(endpoint, headers=headers, data=file_data)
if response.status_code in [200, 201]:
return {
'status': 'success',
'sharepoint_url': response.json().get('webUrl'),
'id': response.json().get('id')
}
else:
return {'status': 'error', 'message': response.text}
5. Detail Kecil yang Penting
Mencari Site ID: Site ID bukan URL browser. Gunakan Graph Explorer atau browser request: https://graph.microsoft.com/v1.0/sites/{host-sharepoint}.sharepoint.com:/{relative-path-to-site} Contoh: .../sites/contoso.sharepoint.com:/sites/marketing
Limitasi Upload: Kode di atas menggunakan endpoint :/content yang maksimal hanya untuk file < 4MB. Jika file > 4MB, Anda harus menggunakan endpoint createUploadSession yang memecah file menjadi chunks.
Permission Scope: Selalu gunakan scope https://graph.microsoft.com/.default saat menggunakan Client Credentials Flow agar mengambil semua permission yang disetujui admin di Azure Portal.