154 lines
3.7 KiB
Dart
154 lines
3.7 KiB
Dart
import 'dart:convert';
|
|
|
|
class OdooRpcHelper {
|
|
static const String _jsonRpcVersion = "2.0";
|
|
static const String _method = "call";
|
|
|
|
static Map<String, dynamic> buildLogout({
|
|
required String service,
|
|
required String db,
|
|
required int uid,
|
|
required String password,
|
|
required String model,
|
|
required String method,
|
|
List<dynamic> domain = const [],
|
|
Map<String, dynamic> kwargs = const {},
|
|
}) {
|
|
// Make sure domain is always a list of lists (even if empty)
|
|
final safeDomain = domain.isEmpty ? [[]] : domain;
|
|
|
|
return {
|
|
"jsonrpc": _jsonRpcVersion,
|
|
"method": _method,
|
|
"params": {
|
|
"service": service,
|
|
"method": "logout",
|
|
"args": [
|
|
db,
|
|
uid,
|
|
password,
|
|
model,
|
|
method,
|
|
safeDomain,
|
|
kwargs,
|
|
],
|
|
},
|
|
"id": DateTime.now().millisecondsSinceEpoch,
|
|
};
|
|
}
|
|
/// Builds the correct JSON-RPC payload for any Odoo model method
|
|
static Map<String, dynamic> buildExecuteKw({
|
|
required String service,
|
|
required String db,
|
|
required int uid,
|
|
required String password,
|
|
required String model,
|
|
required String method,
|
|
List<dynamic> domain = const [],
|
|
Map<String, dynamic> kwargs = const {},
|
|
}) {
|
|
// Make sure domain is always a list of lists (even if empty)
|
|
final safeDomain = domain.isEmpty ? [[]] : domain;
|
|
|
|
return {
|
|
"jsonrpc": _jsonRpcVersion,
|
|
"method": _method,
|
|
"params": {
|
|
"service": service,
|
|
"method": "execute_kw",
|
|
"args": [
|
|
db,
|
|
uid,
|
|
password,
|
|
model,
|
|
method,
|
|
safeDomain,
|
|
kwargs,
|
|
],
|
|
},
|
|
"id": DateTime.now().millisecondsSinceEpoch,
|
|
};
|
|
}
|
|
|
|
/// Convenience wrapper for search_read
|
|
static Map<String, dynamic> searchRead({
|
|
required String db,
|
|
required int uid,
|
|
required String password,
|
|
required String model,
|
|
List<dynamic> domain = const [],
|
|
List<String> fields = const [],
|
|
int? limit,
|
|
int? offset,
|
|
String? order,
|
|
}) {
|
|
final kwargs = <String, dynamic>{};
|
|
|
|
if (fields.isNotEmpty) kwargs["fields"] = fields;
|
|
if (limit != null) kwargs["limit"] = limit;
|
|
if (offset != null) kwargs["offset"] = offset;
|
|
if (order != null) kwargs["order"] = order;
|
|
|
|
return buildExecuteKw(
|
|
service: "object",
|
|
db: db,
|
|
uid: uid,
|
|
password: password,
|
|
model: model,
|
|
method: "search_read",
|
|
domain: domain,
|
|
kwargs: kwargs,
|
|
);
|
|
}
|
|
|
|
static Map<String, dynamic> executeKw({
|
|
required String method,
|
|
required String db,
|
|
required int uid,
|
|
required String password,
|
|
required String model,
|
|
List<dynamic> domain = const [],
|
|
List<String> fields = const [],
|
|
int? limit,
|
|
int? offset,
|
|
String? order,
|
|
}) {
|
|
final kwargs = <String, dynamic>{};
|
|
|
|
if (fields.isNotEmpty) kwargs["fields"] = fields;
|
|
if (limit != null) kwargs["limit"] = limit;
|
|
if (offset != null) kwargs["offset"] = offset;
|
|
if (order != null) kwargs["order"] = order;
|
|
|
|
return buildExecuteKw(
|
|
service: "object",
|
|
db: db,
|
|
uid: uid,
|
|
password: password,
|
|
model: model,
|
|
method: method,
|
|
domain: domain,
|
|
kwargs: kwargs,
|
|
);
|
|
}
|
|
|
|
/// Convenience wrapper for create
|
|
static Map<String, dynamic> create({
|
|
required String db,
|
|
required int uid,
|
|
required String password,
|
|
required String model,
|
|
required Map<String, dynamic> values,
|
|
}) {
|
|
return buildExecuteKw(
|
|
service: "object",
|
|
db: db,
|
|
uid: uid,
|
|
password: password,
|
|
model: model,
|
|
method: "create",
|
|
domain: [[]], // create doesn't use domain
|
|
kwargs: {"vals": values}, // Odoo expects 'vals' for create in some versions
|
|
);
|
|
}
|
|
} |