Variantenimport via xml_import()

Hallo @bb und @danielstraub, mit dem Branch variant_parent_id habe ich noch ein gedankliches Problem:

Wie habt Ihr das bei Euch umgesetzt, denn das Attribut variantparent_id funktioniert? In meinen Tests/nach meinem Wissen geht es nicht in allen Fällen dms.XmlImport(), sondern, nur wenn es effektiv ein dms.XmlInsert() auslöst, da es keine Suchtreffer gegeben hat.

Eure Implementation:

object_element = XmlElement('Object', a={'variantparent_id': (variant_parent_id if variant_parent_id != None else '-1')}, 

Grundsätzlich hätte ich es jetzt so vorgesehen:

        object_element = XmlElement('Object', 
            s=[ XmlElement(
            'Search', s=[ search_fields_element := XmlElement('Fields') ]), 
            import_fields_element := XmlElement('Fields') 
        ])

...

        if variant_parent_id:
            if len(search_fields) > 0:
                raise ValueError('search_fields must be empty when variant_parant_id is set.')
            search_fields = { SystemFields.OBJECT_ID.name: '-1' }
            object_element.set('variantparent_id', str(variant_parent_id))

Dadurch gelingt mein Test:

    def test_xml_import_parent_variant_id(self):
        client = TcpPoolClient(self.connection_string, 'TestApp', 'root', 'optimal', self.use_ssl)
        result = client.xml_import(
            object_name='UnittestDoc', 
            search_fields={'StringField': 'Test Variant'},
            import_fields={'StringField': 'Test Variant'},
            folder_id=self.folder_id,
            action1=ImportActions.NONE,
            main_type=MainTypeId.DOC_WINDOWS,
            files=['README.md']
        )
        parent_id = result.values['ObjectID']
        result = client.xml_import(
            object_name='UnittestDoc', 
            search_fields={},
            import_fields={'StringField': 'Test Variant'},
            folder_id=self.folder_id,
            files=['README.md'],
            main_type=MainTypeId.DOC_WINDOWS,
            variant_parent_id=parent_id
        )
        self.assertEqual(result.return_code, 0)
        self.assertEqual(result.values['Action'], ImportActions.INSERT.value)

Ist das in Eurem Sinne? Dann würde ich einen Merge Request entgegennehmen :wink:

1 „Gefällt mir“

Hallo @rk, laut API-Doku funktioniert der Variantenimport nur bei einemdms.XmlInsert, das ist richtig. Ich hatte daher zunächst auf Basis der bereits vorhandenen Methode xml_import im blue_client eine separate xml_insert geschrieben und die Option der der Variante zunächst dort implementiert. Das hatte funktioniert.

Da wir bei der Migration nach Anlage der Strukturelemente im Zielschrank allerdings zuerst die Varianten übernehmen, konnten wir es auch mit dem xml_import machen, da in diesem Fall immer ein dms.XmlInsertausgelöst wird.

Mit der zusätzlichen Prüfung, die du in den xml_import eingebaut hast, ist das ganze natürlich sehr viel robuster - VIELEN DANK :slight_smile: :+1:

Danke Dir! Ist mit Ecmind_blue_client: Release Notes - #3 von rk und Version 0.2.8 online.

1 „Gefällt mir“

Funktioniert super, vielen Dank für dieses Beispiel.

Als kleine Ergänzung noch:

mit

options='VARIANTSETACTIVE=1'

wird die neue Variante direkt als aktive Variante gesetzt.

Neu würde dies auch mit einem Options-Objekt gehen (siehe Ecmind_blue_client: Release Notes 0.3.1):

options=Options(VARIANTSETACTIVE=True)

Falls sich jemand an das Thema einer Variantenmigration trauen will, anbei unsere Erkenntnis welche Reihenfolge relevant ist:

  1. erstellen aller Root-Varianten (Originale)
  2. mit Hilfe von ‚std.GetDocVariant‘ kann eine neue Variante erzeugt werden. Im besten Fall im Vorfeld die Varianten aufsteigend sortieren.
    2.1 Wichtig die Parent-Variante muss vorher als aktiv gesetzt sein (Befehl std.SetActiveVariant)
  3. Aktualisieren der Variante, da zunächst die Indexdaten und die Datei identisch zu der Variante sind aus der sie erstellt wurde
    3.1 Wieder vor dem Aktualisieren die Variante als aktiv kennzeichnen
  4. als letztes nach Erstellung des kompletten Variantenbaums muss die korrekte Variante wieder als Aktiv gekennzeichnet werden

Zu Beachten:

  • aus inaktiven Varianten können die Indexdaten nicht ermittelt werden. Dies ist nur direkt über ein SELECT auf die Datenbank möglich.

Sollten noch neue Erkenntnisse kommen ergänze ich es hier.

@danielstraub Cool, danke für die Liste.
Ich glaube der API Call dms.getObjectDetails gibt dir die Indexdaten der inaktiven Varianten.
Habt ihr das schon getestet?

@uw Wir haben einige Aufrufe probiert. Ich glaube dms.getObjectDetails war auch dabei. Aktuell funktioniert es im Code mit einem direkten SQL-Select.

Für die Zukunft sollte man jedoch hier tatsächlich nochmals forschen.