From 08cc5e18572edea4b78245815ab644f913377154 Mon Sep 17 00:00:00 2001 From: Daniel <d.hornung@indiscale.com> Date: Tue, 9 Apr 2024 18:21:06 +0200 Subject: [PATCH] DOC: json table conversion `specs.md` --- src/doc/table-json-conversion/specs.md | 144 ++++++++++++++----------- 1 file changed, 84 insertions(+), 60 deletions(-) diff --git a/src/doc/table-json-conversion/specs.md b/src/doc/table-json-conversion/specs.md index 3a5fcef5..73e48044 100644 --- a/src/doc/table-json-conversion/specs.md +++ b/src/doc/table-json-conversion/specs.md @@ -1,20 +1,19 @@ -# Konversion zwischen LinkAhead-Datenmodellen, JSON-Schema und XLSX (und zurück) # +# Conversion between LinkAhead data models, JSON schema, and XLSX (and vice versa) # -Top level of json must be a dict. keys of the dict are RT names. +This file describes the conversion between JSON schema files and XLSX templates, and between JSON +data files following a given schema and XLSX files with data. This conversion is handled by the +Python modules in the `table_json_conversion` library. +Requirements: When converting from a json schema, the top level of the json schema must be a +dict. The keys of the dict are RecordType names. -Frage: is the first RT never an array? +## Data models in JSON Schema and JSON data ## +The data model in LinkAhead defines the types of records present in a LinkAhead instance and their +structure. This data model can also be represented in a JSON Schema, which defines the structure of +JSON files containing records pertaining to the data model. -Do not use sheet name, but only content of hidden rows - -## Datenmodelle in JSON-Schema und JSON-Daten ## - -Das Datenmodell in LinkAhead legt fest, welche Arten von Records es in einer LinkAhead-Instanz gibt -und wie diese aussehen. Dieses Datenmodell kann auch in einem JSON Schema repräsentiert werden, dass -die Struktur von JSON Dateien festlegt, die zu dem Datenmodell gehörige Records enthält. - -Zum Beispiel kann das folgende JSON den Record einer Person beschreiben: +For example, the following JSON can describe a "Person" Record: ```JSON { @@ -25,46 +24,61 @@ Zum Beispiel kann das folgende JSON den Record einer Person beschreiben: } ``` -Ein *JSON Schema* schreibt eine konkrete Struktur vor, und die zugehörige JSON Dateien können -genutzt werden, um Daten zu bestimmten Record-Strukturen zu repräsentieren. Beispielsweise könnte -man ein JSON Schema erstellen, dass es erlaubt "Training" Records mit Informationen zu abgehaltenen -Trainings zu speichern. Dies ist insbesondere wertvoll beim Datenim- und export. Man -könnte Webformulare aus dem Json Schema generieren oder es nutzen, um in LinkAhead gespeicherte -Objekte als JSON zu exportieren. +A *JSON Schema* specifies a concrete structure, and the associated JSON files can be used to +represent data for specific record structures. For instance, one could create a JSON Schema allowing +the storage of "Training" Records containing information about conducted trainings. This is +particularly valuable for data import and export. One could generate web forms from the JSON Schema +or use it to export objects stored in LinkAhead as JSON. -## Von JSON zu XLSX: Datenrepräsentation ## +## From JSON to XLSX: Data Representation ## -Im Folgenden wird beschrieben, wie JSON Dateien, die LinkAhead-Records reprästentieren in XLSX -Dateien umgewandelt werden, bzw. wie aus XLSX-Dateien JSON Dateien mit Records erstellt werden. +The following describes how JSON files representing LinkAhead records are converted into XLSX files, +or how JSON files with records are created from XLSX files. -Der Attributname (oben "Person") legt den RecordType fest und der Wert diese Attributs kann entweder -ein Objekt oder eine Liste sein. Ist es ein Objekt (wie im obigen Beispiel), so wird ein einzelner -Record repräsentiert. Bei einer Liste mehrere Records, die den gleichen RecordType als Parent -haben. +The attribute name (e.g., "Person" above) determines the RecordType, and the value of this attribute +can either be an object or a list. If it is an object (as in the example above), a single record is +represented. In the case of a list, multiple records sharing the same RecordType as the parent are +represented. -Die *Properties* des Records (oben `family_name` und `given_name`) werden zu *Spalten* im XLSX. Die -Properties haben wiederum einen Attributnamen und einen Wert. Der Wert kann +The *Properties* of the record (e.g., `family_name` and `given_name` above) become *columns* in the +XLSX file. These properties have an attribute name and a value. The value can be: -a. primitiv (Text, Zahl, Boolean, ...) -b. ein Record -c. eine Liste von primitiven Typen -d. eine Liste von Records +a. A primitive (text, number, boolean, ...) +b. A record +c. A list of primitive types +d. A list of records -sein. +In cases *a.* and *c.*, a cell is created in the column corresponding to the property in the XLSX +file. In case *b.*, columns are created for the Properties of the record, where for each of the +Properties the cases *a.* - *d.* are considered recursively. -In den Fällen *a.* und *c.* wird in XLSX eine Zelle in der zur Property gehörigen Spalte erstellt. -Im Fall *b.* wird prinzipiell für die Properties des Records Spalten erstellt. Tatsächlich wird der -referenzierte Record genauso behandelt wie der ursprüngliche. D.h. die Fälle a.-d. werden wieder -für die einzelnen Properties betrachtet. +For case *d.* however, the two-dimensional structure of an XLSX sheet is not sufficient. Therefore, +for such cases, *new* XLSX sheets/tables are created. -Für den Fall *d.* ist die zweidimensionale Struktur eines XLSX Blatts nicht ausreichend. Daher -werden für solche Fälle *neue* XLSX-Blätter/-Tabellen erstellt. +In these sheets/tables, the referenced records are treated as described above (new columns for the +Properties). However, there are now additional columns that indicate from which "external" record +these records are referenced. -In diesen werden die referenzierten Records behandelt wie oben beschrieben. Es gibt jedoch -zusätzliche Spalten die es erlauben zu erkennen, von welchem "externen" Record diese Records -referenziert werden. +Let's now consider these four cases in detail and with examples: + +### a. Properties with Primitive Data Types ### + +```JSON +{ + "Training": { + "date": "2023-01-01", + "url": "www.indiscale.com", + "duration": 1.0, + "participants": 1, + "remote": false + } +} +``` + +This entry is represented in an XLSX sheet with the following content: +date url duration participants remote +2023-01-01 www.indiscale.com 1.0 1 false -Wir betrachten diese vier Fälle nun im Detail: ### a. Properties mit primitiven Datentypen ### @@ -79,13 +93,14 @@ Wir betrachten diese vier Fälle nun im Detail: } } ``` -Dieser Eintrag wird in einem XLSX-Blatt mit dem folgenden Inhalt abgebildet: + +This entry will be represented in an XLSX sheet with the following content: | date | url | duration | participants | remote | |------------|-------------------|----------|--------------|--------| | 2023-01-01 | www.indiscale.com | 1.0 | 1 | false | -### b. Property, die einen Record referenziert ### +### b. Property referencing a record ### ```JSON { @@ -99,16 +114,16 @@ Dieser Eintrag wird in einem XLSX-Blatt mit dem folgenden Inhalt abgebildet: } ``` -Dieser Eintrag wird in einem XLSX Blatt mit dem folgenden Inhalt abgebildet: +This entry will be represented in an XLSX sheet with the following content: | date | `supervisor.family_name` | `supervisor.given_name` | |------------|--------------------------|-------------------------| | 2023-01-01 | Stevenson | Stevie | -Beachten Sie, dass die Spaltennamen umbenannt werden dürfen. Die Zuordnung der Spalte zu Properties -von Records wird über den Inhalt von versteckten Zeilen gewährleistet. +Note that column names may be renamed. The mapping of columns to properties of records is ensured +through the content of hidden rows. (See below for the definition of hidden rows.) -### c. Properties, die Listen mit Werten von primitiven Datentypen enthalten ### +### c. Properties containing lists of primitive data types ### ```JSON { @@ -119,16 +134,16 @@ von Records wird über den Inhalt von versteckten Zeilen gewährleistet. } ``` -Dieser Eintrag würde in einem XLSX Blatt mit dem folgenden Inhalt abgebildet: +This entry would be represented in an XLSX sheet with the following content: | url | subjects | |-------------------|--------------| | www.indiscale.com | Math;Physics | -Die Listenelemente werden separiert von `;` in die Zelle geschrieben. Wenn die Elemente den -Separator `;` enthalten, dann wird dieser mit einem `\\` escaped. +The list elements are written into the cell separated by `;` (semicolon). If the elements contain +the separator `;`, it is escaped with `\\`. -### d. Properties, die Listen mit Referenzen enthalten ### +### d. Properties containing lists with references ### ```JSON { @@ -148,22 +163,23 @@ Separator `;` enthalten, dann wird dieser mit einem `\\` escaped. } ``` -Da die beiden Coaches nicht vernünftig in einer Zelle dargestellt werden können, bedarf es nun eines -weiteren Tabellenblatts, das die Eigenschaften der Coaches enthält. +Since the two coaches cannot be represented properly in a single cell, another worksheet is needed +to contain the properties of the coaches. -Das Blatt zu den *Trainings* enthält in diesem Beispiel nur die "date" Spalte: +The sheet for the Trainings in this example only contains the "date" column | date | |------------| | 2023-01-01 | -Zusätzlich gibt es ein *weiteres* Blatt in dem die Coaches gespeichert werden. Hier ist nun -entscheidend, dass definiert wird, wie von potentiell mehreren "Trainings" das richtige Element -gewählt wird. In diesem Fall bedeutet dies, dass das "date" eindeutig sein muss. +Additionally, there is *another* sheet where the coaches are stored. Here, it is crucial to define +how the correct element is chosen from potentially multiple "Trainings". In this case, it means that +the "date" must be unique. -TODO: In welchem Scope gilt diese Eindeutigkeit? Können wir dies checken? +Note: This uniqueness requirement is not strictly checked right now, it is your responsibility as a +user that such "foreign properties" are truly unique. -Das zweite Blatt sieht dann wie folgt aus +The second sheet looks like this: | date | `coach.family_name` | `coach.given_name` | |------------|---------------------|--------------------| @@ -227,3 +243,11 @@ For example, this table defines three coaches for the two trainings from the las | | 2024-02-27 | example.com/mp | Ada | | | 2024-02-27 | example.com/mp | Berta | | | 2024-02-27 | example.com/m | Chris | + +## Current limitations ## + +The current implementation still lacks the following: + +- Lists of enum references are not yet implemented as columns where matching cell can simply be + ticked/crossed. +- Files handling is not implemented yet. -- GitLab