Benutzerdefinierte Kategorien über API



  • Hallo!

    Ich möchte mit CMDBObject.createWithCategories() in einer i-doit 1.12.2 Pro ein Objekt (eines benutzerdefinierten Objekttyps) sowohl mit Standard- als auch mit benutzerdefinierten Kategorien anlegen.

    Der Ergebnis-Array enthält aber nur einen Eintrag für die Standardkategorie. Ist nicht vorgesehen, benutzerdefinierte Kategorien anzulegen?

    P.S.: Wir verwenden als Client-API-Lib eine eigene Implementation der i-doit-api-client-php in Python, die genau entlang der PHP-Implementierung geschrieben wurde.

    Codeschnipsel:

    cat = {
        'C__CATG__CUSTOM_FIELDS_ERP_INFORMATIONEN': [{
            K.IDOIT_ERP_CONTRACT_ID: master_data[K.WKS_VER_NR][2:],
            K.IDOIT_ERP_PDV_ENV: obj[K.WKS_OBJ_ENV],
            K.IDOIT_ERP_ARA_ENV: obj[K.WKS_OBJ_ARA_ENV],
            'description': obj[K.WKS_OBJ_REMARKS],
        }],
    }
    # ...
    cat['C__CATG__MODEL'] = [{
         'manufacturer': obj[K.WKS_OBJ_PRODUCER],
         'title': obj[K.WKS_OBJ_PROD_NAME],
         'productid': obj[K.WKS_OBJ_PROD_PART],
         'service_tag': None,
         'serial': obj[K.WKS_OBJ_PROD_SN],
         'firmware': None,
         'description': None,
    }]
    # ...
    result = idoitapi.CMDBObject(api).create_with_categories(
        object_type=obj_klasse_to_idoit_objtype(mgd_svc),
        title=obj[K.WKS_OBJ_HOSTNAME],
        categories=cat,
        attributes={
            'category': None,
            'purpose': None,
            'cmdb_status': 'C__CMDB_STATUS__IN_OPERATION',
            'description': None,
        }
    )
    

    Das ergibt

    result = {
        'id': 385,
        'message': 'Object was successfully created',
        'categories': {
            'C__CATG__MODEL': [19]
        },
        'success': True
    }
    


  • Das hat unser PRO-Reseller mittlerweile reproduzieren können und ein Ticket bei Synetics eröffnet. In der Zwischenzeit habe ich mir beholfen mit

    def idoit_create_with_categories(api, object_type, title, categories, attributes=None):
        object_id = idoitapi.CMDBObject(api).create(object_type, title, attributes)
    
        requests = list()
    
        for category, catattr_array in categories.items():
            for i, catattrs in enumerate(catattr_array):
                params = {
                    'object': object_id,
                    'category': category,
                    'data': catattrs
                }
                if len(catattr_array) > 1:
                    params['entry'] = i
                requests.append({
                    'method': 'cmdb.category.save',
                    'params': params
                })
    
        response = api.batch_request(requests)
    
        result = {
            'id': object_id,
            'success': True,
            'categories': dict(),
        }
    
        for i, entry in enumerate(response):
            if 'success' not in entry or not entry['success']:
                idoitapi.CMDBObject(api).delete(object_id)
                message = 'Bad result'
                if 'message' in entry:
                    message += ': ' + entry['message']
                raise JSONRPC(message=message)
    
            params = requests[i]['params']
    
            category = params['category']
            if 'entry' in params:
                # For multi-valued categories, value is a list of IDs
                if category not in result['categories']:
                    result['categories'][category] = list()
                result['categories'][category][params['entry']] = entry['entry']
            else:
                result['categories'].update({category: entry['entry']})
    
        return result
    
    


  • Inzwischen habe ich von unserem Reseller Nachricht bekommen, dass dieser Bug in i-doit 1.13.2 behoben sein wird.


Log in to reply
 


Datenschutz / Privacy Policy