import data from tryton to moodle

I use a simple script to connect to a tryton server (better to use proteus for this):

import json
import requests
import configparser

from requests.packages.urllib3.exceptions import InsecureRequestWarning

config = configparser.ConfigParser()'tryton.cfg') # put a config file in your folder to store credentials

URL = config.get('tryton', 'URL')
USER = config.get('tryton', 'USER')
PASSWORD = config.get('tryton', 'PASSWORD')

class Tryton(object):
  """Client to make RPC requests to Tryton server.
    def __init__(self):
        self._id = 0

    def get_id(self):
        self._id += 1
        return self._id

    def _login(self):
        payload = json.dumps({
            'params': [USER, {'password': PASSWORD}],
            'jsonrpc': "2.0",
            'method': 'common.db.login',
            'id': 1,
        headers = {'content-type': 'application/json'}
        result =
            URL, data=payload, headers=headers, timeout=30, verify=False)
        session = result.json()
        return session

    def execute(self, method, *params):
        params = list(params) + [{}, ]
        payload = json.dumps({
            'params': params,
            'method': method,
            'id': self.get_id(),
        headers = {'content-type': 'application/json'}
        response =
            auth=(USER, PASSWORD),
            headers=headers, verify=False)
        result = response.json()
        return result['result']

Then you can consume this with a little python script:

import json
from trytonrpc import Tryton # the script above
TC = Tryton()

# you can define a method in your tryton module to return the structure you need
# or you use one which is build in - eg search_read
res = TC.execute(
  []) # filter the data to your needs or write dedicated methods which return what you need
print(json.dumps(res)) # you must print this to stdout

And than you use this output in a php script (here it is placed in a folder the root of moodle - you must change paths to import if your stuff is placed elsewhere)


 * Imports from Tryton
 * PHP version 7
 * @category Cli
 * @package  Moodle_Import
 * @author   Jan Grasnick <>
 * @license GNU Public License
 * @link     http://gitlab.internal
if (php_sapi_name() === 'cli') {
    define('CLI_SCRIPT', true);
global $CFG;

// the path to the moodle config
require_once(__DIR__ . '/../config.php');

// import the classes from moodle on which you will work
require_once $CFG->dirroot . '/lib/coursecatlib.php';
require_once $CFG->dirroot . '/course/lib.php';
require_once $CFG->dirroot . '/course/format/lib.php';

// make it a page if you want call it in the browser
$PAGE->set_title("Get data from Tryton");
$PAGE->set_heading("Get data from Tryton");
$PAGE->set_url('/tryton_moodle/moodle_import.php');  // the folder/name of your script

// require login if you do not run the script as cli
if (php_sapi_name() != 'cli') {

echo $OUTPUT->header();

global $DB;

$output = exec('/usr/bin/python'); // get data from your script above
$dict = json_decode($output);

foreach ($dict as $d) {
// now you have objects with all the keys/values you defined in tryton
   $idnumber = $d->id;
// get an existing record
    $hit= $DB->get_record('course_categories', array('idnumber' =>$idnumber));
    $create = false;

// create a new object to put values on
    $cat = new stdClass();

// add the attributes from tryton to the objects in moodle
$cat->description = $d->description;
    $cat->name = $d->rec_name;

   if (!$hit) {
//create new course cat
    } else {
// get the object and update it
$uid = $hit->id;
        $cat->id = $uid;
        $hit = coursecat::get($uid, MUST_EXIST, true);

// do the same with lectures, add enroles, add teachers or what ever comes from your tryton models
echo $OUTPUT->footer();


This scripts are all placed in a folder in the root of moodle.

My current topics on