From f887c4101076f7b3fdbab180fdb043b3d33fd72d Mon Sep 17 00:00:00 2001
From: Alexander Schlemmer <alexander@mail-schlemmer.de>
Date: Mon, 28 Jun 2021 12:27:13 +0200
Subject: [PATCH] DOC: new page in documentation covering the topic of complex
 data models

---
 src/doc/tutorials/complex_data_models.rst | 63 +++++++++++++++++++++++
 src/doc/tutorials/index.rst               |  3 +-
 2 files changed, 65 insertions(+), 1 deletion(-)
 create mode 100644 src/doc/tutorials/complex_data_models.rst

diff --git a/src/doc/tutorials/complex_data_models.rst b/src/doc/tutorials/complex_data_models.rst
new file mode 100644
index 00000000..efdcf4e1
--- /dev/null
+++ b/src/doc/tutorials/complex_data_models.rst
@@ -0,0 +1,63 @@
+Complex Data Models
+-------------------
+
+With CaosDB it is possible to create very complex data models.
+
+E.g. it is possible to add properties to properties to cover complex relations
+in data management workflows.
+
+One example for a use case is meta data that is added to very specific properties of
+datasets, e.g. data privacy information can be added to properties which themselves
+could already be considered meta data of a dataset.
+
+The example below tries to cover some complex cases for data models:
+
+Examples
+--------
+
+.. code-block:: python3
+
+import caosdb as db
+
+# Create two record types with descriptions:
+rt1 = db.RecordType(name="TypeA", description="11 The first type")
+rt2 = db.RecordType(name="TypeB", description="22 The second type")
+
+# Create a record using the first record type as parent:
+r1 = db.Record(name="Test_R_1", description="33 A record for the first type")
+r1.add_parent(rt1)
+
+# Create two files (the files named test.txt and testfile2.txt should exist in the
+# current working directory:
+f1 = db.File(name="Test A cool file", path="/test.txt", file="test.txt")
+f2 = db.File(name="Test Another cool file", path="/testfile2.txt", file="testfile2.txt")
+
+# Create two properties with different data types:
+p1 = db.Property(name="TestFileProperty", datatype=db.FILE)
+p2 = db.Property(name="TestDoubleProperty", datatype=db.DOUBLE, unit="m")
+p3 = db.Property(name="TestIntegerProperty", datatype=db.INTEGER, unit="s")
+
+# Create a reference property that points to records of record type 2:
+p4 = db.Property(name="TestReferenceProperty", datatype=rt2)
+
+# Create a complex record:
+r2 = db.Record(name="Test_R_2", description="44 A second record for the second type")
+r2.add_parent(rt2)
+r2.add_property(rt1, value=r1)  # this is a reference to the first record type
+r2.add_property(p1, value=f1)  # this is a reference to the first file
+r2.add_property(p2, value=24.8)  # this is a double property with a value
+r2.add_property(p3, value=1)  # this is an integer property with a value
+
+f2.add_property(p1, value=f1)  # this adds a file property with value first file to the second file
+p2.add_property(p3, value=27)  # this adds an integer property with value 27 to the double property
+
+p2.add_property(p4, value=r2)  # this adds a reference property pointing to record 2 to the double property
+
+# Insert a container containing all the newly created entities:
+c = db.Container().extend([rt1, rt2, r1, r2, f1, p1, p2, p3, f2, p4])
+c.insert()
+
+# Useful for testing: wait until the user presses a key, meanwhile check the webui
+b = input("Press any key to cleanup.")
+# cleanup everything after the user presses any button.
+c.delete()
diff --git a/src/doc/tutorials/index.rst b/src/doc/tutorials/index.rst
index 3889edb8..79068e92 100644
--- a/src/doc/tutorials/index.rst
+++ b/src/doc/tutorials/index.rst
@@ -15,4 +15,5 @@ advanced usage of the Python client.
    Data-Insertion
    errors
    data-model-interface
-
+   complex_data_models
+      
-- 
GitLab