Compare commits

...

41 Commits

Author SHA1 Message Date
Wir
e3cc967a71 neues Datenmodell5 hochgeladen 2024-11-25 19:10:03 +01:00
Wir
fca3def892 Reporting in Excel 2024-11-20 15:13:46 +01:00
32c9bf4e66 erklaerung liste 2024-11-19 15:29:18 +01:00
Wir
f73edd7692 Reporting Daten verfügbar 2024-11-14 19:19:42 +01:00
0bb91c25b7 added get_inventory_logs_of_type() to Asset 2024-11-14 18:01:01 +01:00
Wir
6c1e9f63f2 blabal 2024-11-12 17:58:37 +01:00
a2fbb6bf20 log notes 2024-11-12 17:37:05 +01:00
f350685e00 ammend 2024-11-12 17:28:21 +01:00
ff27f922b8 make multiple taxonomy items clear in name 2024-11-12 17:27:35 +01:00
5c45389af3 material-types 2024-11-12 17:17:25 +01:00
7d1ac383ea klassendiagramm 2024-11-12 16:49:05 +01:00
Wir
67785960d6 bla 2024-11-12 15:32:48 +01:00
Wir
f20b7e171f Reports verbessert 2024-11-12 12:55:45 +01:00
Wir
ffa81946fc Reports verbessert 2024-11-12 12:09:26 +01:00
Wir
742daa1cd8 Reports verbessert 2024-11-12 11:53:55 +01:00
018a5842d0 fix value properties on price an regular quantitiy 2024-11-07 18:34:56 +01:00
275bc49ffd multiple retries for fetching token 2024-11-07 17:47:18 +01:00
Wir
0b2ea9650c Master Report, Excel Export, Logs Reports erstellt
Es fehlen noch Daten!!!
2024-11-06 15:33:57 +01:00
2d3b93ec61 fix token timeout2 2024-11-05 16:43:33 +01:00
289062da8d fix token timeout 2024-11-05 16:39:10 +01:00
Wir
17b64357a0 Details gefixt 2024-11-05 15:58:42 +01:00
Wir
775135e6b3 Alle logs zu plant mit quantities nebeneinander in Excel exportiert 2024-11-05 12:24:01 +01:00
Wir
0472eb4cfb Quantities 2024-11-04 15:23:49 +01:00
Wir
8aa2d1d383 Report alle logs in einem Plant in Tabellenform erstellt 2024-11-04 13:49:05 +01:00
829e4cb608 added Asset.get_logs_of_type() NEXT: try deployment 2024-11-03 17:28:00 +01:00
ba5afc852b fixed infinite recursion with type attribute of product asset NEXT: write Asset.logs and Asset.get_logs_of_type(type) 2024-11-02 20:54:10 +01:00
Wir
a91a2750c9 try deployment 2024-11-02 20:10:28 +01:00
Wir
4358384169 fixed module reloading for jupyterlab NEXT: try deployment 2024-11-02 18:56:38 +01:00
Wir
79b12d15f0 adjust for jupyter 2024-11-01 17:41:41 +01:00
772acff4e8 tested to work for most entities NEXT: add logs property to asset 2024-11-01 16:52:40 +01:00
ae1156bd6c entire v3 datamodel orm NEXT: test orm 2024-11-01 14:47:03 +01:00
4bfebf2f61 Merge branch 'main' of https://git.wagframe.duckdns.org/matze/farmos.py-wagner 2024-10-31 20:48:40 +01:00
0e212f22a1 neofarm half done NEXT: finish and extract orm into separate files 2024-10-31 20:48:36 +01:00
Wir
37e53ddb2b jetzt mit relationsships 2024-10-31 17:19:52 +01:00
Wir
4b2e1a2330 Neues Datenmodel mit Purchase und Sale 2024-10-28 09:38:45 +01:00
Wir
752610a905 Falsches Model 2024-10-28 09:37:33 +01:00
Wir
8a0e38c13c Datumformat verbessert 2024-10-23 12:30:38 +02:00
Wir
3e80170479 Datenmodel aktualisiert 2024-10-23 07:19:55 +02:00
Wir
47cb483662 Datenmodell hinzugefügt 2024-10-22 17:01:55 +02:00
Wir
b4ddd1eefe Bla 2024-10-22 16:47:37 +02:00
Wir
d879a25948 Daten ohne relationships 2024-10-22 16:45:20 +02:00
16 changed files with 6464 additions and 3201 deletions

1
.gitignore vendored
View File

@@ -178,4 +178,3 @@ ipython_config.py
# Remove previous ipynb_checkpoints
# git rm -r .ipynb_checkpoints/

File diff suppressed because it is too large Load Diff

BIN
Datenmodell3.xlsx Normal file

Binary file not shown.

BIN
Datenmodell5.xlsx Normal file

Binary file not shown.

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,923 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 12.1.2 (0)
-->
<!-- Title: classes_neofarm Pages: 1 -->
<svg width="6468pt" height="405pt"
viewBox="0.00 0.00 6467.88 404.50" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 400.5)">
<title>classes_neofarm</title>
<polygon fill="white" stroke="none" points="-4,4 -4,-400.5 6463.88,-400.5 6463.88,4 -4,4"/>
<!-- log.Activity -->
<g id="node1" class="node">
<title>log.Activity</title>
<polygon fill="none" stroke="black" points="0,-39 0,-89.5 82,-89.5 82,-39 0,-39"/>
<text text-anchor="start" x="8" y="-72.2" font-family="Times,serif" font-size="14.00">Activity</text>
<polyline fill="none" stroke="black" points="0,-64.25 82,-64.25"/>
<polyline fill="none" stroke="black" points="0,-64.25 82,-64.25"/>
<text text-anchor="start" x="36.88" y="-46.95" font-family="Times,serif" font-size="14.00"> </text>
</g>
<!-- log.Log -->
<g id="node8" class="node">
<title>log.Log</title>
<polygon fill="none" stroke="black" points="255.62,-165 255.62,-396 494.38,-396 494.38,-165 255.62,-165"/>
<text text-anchor="start" x="362.62" y="-378.7" font-family="Times,serif" font-size="14.00">Log</text>
<polyline fill="none" stroke="black" points="255.62,-370.75 494.38,-370.75"/>
<text text-anchor="start" x="263.62" y="-353.45" font-family="Times,serif" font-size="14.00">assets : RelationField</text>
<text text-anchor="start" x="263.62" y="-336.2" font-family="Times,serif" font-size="14.00">equipment : RelationField</text>
<text text-anchor="start" x="263.62" y="-318.95" font-family="Times,serif" font-size="14.00">isMovement : AttributeField</text>
<text text-anchor="start" x="263.62" y="-301.7" font-family="Times,serif" font-size="14.00">json_notes : AttributeField</text>
<text text-anchor="start" x="263.62" y="-284.45" font-family="Times,serif" font-size="14.00">location : RelationField</text>
<text text-anchor="start" x="263.62" y="-267.2" font-family="Times,serif" font-size="14.00">name : AttributeField</text>
<text text-anchor="start" x="263.62" y="-249.95" font-family="Times,serif" font-size="14.00">notes</text>
<text text-anchor="start" x="263.62" y="-232.7" font-family="Times,serif" font-size="14.00">plant</text>
<text text-anchor="start" x="263.62" y="-215.45" font-family="Times,serif" font-size="14.00">quantities : RelationField</text>
<text text-anchor="start" x="263.62" y="-198.2" font-family="Times,serif" font-size="14.00">timestamp : AttributeField</text>
<polyline fill="none" stroke="black" points="255.62,-190.25 494.38,-190.25"/>
<text text-anchor="start" x="370.88" y="-172.95" font-family="Times,serif" font-size="14.00"> </text>
</g>
<!-- log.Activity&#45;&gt;log.Log -->
<g id="edge13" class="edge">
<title>log.Activity&#45;&gt;log.Log</title>
<path fill="none" stroke="black" d="M56.76,-89.8C65.72,-102.44 77.78,-117.47 91,-128.5 136.93,-166.81 194.14,-199.5 245.15,-224.56"/>
<polygon fill="none" stroke="black" points="243.38,-227.59 253.91,-228.81 246.44,-221.3 243.38,-227.59"/>
</g>
<!-- asset.Asset -->
<g id="node2" class="node">
<title>asset.Asset</title>
<polygon fill="none" stroke="black" points="1217.75,-225.38 1217.75,-335.62 1448.25,-335.62 1448.25,-225.38 1217.75,-225.38"/>
<text text-anchor="start" x="1312.38" y="-318.32" font-family="Times,serif" font-size="14.00">Asset</text>
<polyline fill="none" stroke="black" points="1217.75,-310.38 1448.25,-310.38"/>
<text text-anchor="start" x="1225.75" y="-293.07" font-family="Times,serif" font-size="14.00">location : RelationField</text>
<text text-anchor="start" x="1225.75" y="-275.82" font-family="Times,serif" font-size="14.00">name : AttributeField</text>
<text text-anchor="start" x="1225.75" y="-258.57" font-family="Times,serif" font-size="14.00">timestamp : AttributeField</text>
<polyline fill="none" stroke="black" points="1217.75,-250.62 1448.25,-250.62"/>
<text text-anchor="start" x="1242.25" y="-233.32" font-family="Times,serif" font-size="14.00">get_logs_of_type(type)</text>
</g>
<!-- taxonomy.Crop -->
<g id="node3" class="node">
<title>taxonomy.Crop</title>
<polygon fill="none" stroke="black" points="2040,-39 2040,-89.5 2094,-89.5 2094,-39 2040,-39"/>
<text text-anchor="start" x="2050.5" y="-72.2" font-family="Times,serif" font-size="14.00">Crop</text>
<polyline fill="none" stroke="black" points="2040,-64.25 2094,-64.25"/>
<polyline fill="none" stroke="black" points="2040,-64.25 2094,-64.25"/>
<text text-anchor="start" x="2062.88" y="-46.95" font-family="Times,serif" font-size="14.00"> </text>
</g>
<!-- taxonomy.Taxonomy -->
<g id="node56" class="node">
<title>taxonomy.Taxonomy</title>
<polygon fill="none" stroke="black" points="2320.38,-242.62 2320.38,-318.38 2509.62,-318.38 2509.62,-242.62 2320.38,-242.62"/>
<text text-anchor="start" x="2382" y="-301.07" font-family="Times,serif" font-size="14.00">Taxonomy</text>
<polyline fill="none" stroke="black" points="2320.38,-293.12 2509.62,-293.12"/>
<text text-anchor="start" x="2328.38" y="-275.82" font-family="Times,serif" font-size="14.00">name : AttributeField</text>
<polyline fill="none" stroke="black" points="2320.38,-267.88 2509.62,-267.88"/>
<text text-anchor="start" x="2410.88" y="-250.57" font-family="Times,serif" font-size="14.00"> </text>
</g>
<!-- taxonomy.Crop&#45;&gt;taxonomy.Taxonomy -->
<g id="edge35" class="edge">
<title>taxonomy.Crop&#45;&gt;taxonomy.Taxonomy</title>
<path fill="none" stroke="black" d="M2076.72,-89.82C2082.75,-102.62 2091.56,-117.8 2103,-128.5 2161.7,-183.41 2244.07,-222.12 2309.44,-246.6"/>
<polygon fill="none" stroke="black" points="2308.18,-249.86 2318.78,-250.03 2310.6,-243.29 2308.18,-249.86"/>
</g>
<!-- asset.Equipment -->
<g id="node4" class="node">
<title>asset.Equipment</title>
<polygon fill="none" stroke="black" points="747.88,-39 747.88,-89.5 838.12,-89.5 838.12,-39 747.88,-39"/>
<text text-anchor="start" x="755.88" y="-72.2" font-family="Times,serif" font-size="14.00">Equipment</text>
<polyline fill="none" stroke="black" points="747.88,-64.25 838.12,-64.25"/>
<polyline fill="none" stroke="black" points="747.88,-64.25 838.12,-64.25"/>
<text text-anchor="start" x="788.88" y="-46.95" font-family="Times,serif" font-size="14.00"> </text>
</g>
<!-- asset.Equipment&#45;&gt;asset.Asset -->
<g id="edge1" class="edge">
<title>asset.Equipment&#45;&gt;asset.Asset</title>
<path fill="none" stroke="black" d="M808.88,-89.87C818.49,-103.01 831.81,-118.49 847,-128.5 956.71,-200.8 1102.95,-240.05 1206.26,-260.26"/>
<polygon fill="none" stroke="black" points="1205.42,-263.66 1215.9,-262.11 1206.73,-256.79 1205.42,-263.66"/>
</g>
<!-- log.Harvest -->
<g id="node5" class="node">
<title>log.Harvest</title>
<polygon fill="none" stroke="black" points="100.12,-39 100.12,-89.5 173.88,-89.5 173.88,-39 100.12,-39"/>
<text text-anchor="start" x="108.12" y="-72.2" font-family="Times,serif" font-size="14.00">Harvest</text>
<polyline fill="none" stroke="black" points="100.12,-64.25 173.88,-64.25"/>
<polyline fill="none" stroke="black" points="100.12,-64.25 173.88,-64.25"/>
<text text-anchor="start" x="132.88" y="-46.95" font-family="Times,serif" font-size="14.00"> </text>
</g>
<!-- log.Harvest&#45;&gt;log.Log -->
<g id="edge15" class="edge">
<title>log.Harvest&#45;&gt;log.Log</title>
<path fill="none" stroke="black" d="M152.58,-89.9C160.88,-102.13 171.7,-116.76 183,-128.5 202.35,-148.59 224.43,-168.32 246.56,-186.56"/>
<polygon fill="none" stroke="black" points="244.23,-189.18 254.19,-192.78 248.65,-183.75 244.23,-189.18"/>
</g>
<!-- log.Input -->
<g id="node6" class="node">
<title>log.Input</title>
<polygon fill="none" stroke="black" points="192.38,-39 192.38,-89.5 249.62,-89.5 249.62,-39 192.38,-39"/>
<text text-anchor="start" x="200.38" y="-72.2" font-family="Times,serif" font-size="14.00">Input</text>
<polyline fill="none" stroke="black" points="192.38,-64.25 249.62,-64.25"/>
<polyline fill="none" stroke="black" points="192.38,-64.25 249.62,-64.25"/>
<text text-anchor="start" x="216.88" y="-46.95" font-family="Times,serif" font-size="14.00"> </text>
</g>
<!-- log.Input&#45;&gt;log.Log -->
<g id="edge17" class="edge">
<title>log.Input&#45;&gt;log.Log</title>
<path fill="none" stroke="black" d="M234.98,-89.99C241.9,-101.84 250.56,-116.11 259,-128.5 265.07,-137.41 271.48,-146.51 278.04,-155.59"/>
<polygon fill="none" stroke="black" points="275.04,-157.42 283.75,-163.44 280.7,-153.3 275.04,-157.42"/>
</g>
<!-- asset.Land -->
<g id="node7" class="node">
<title>asset.Land</title>
<polygon fill="none" stroke="black" points="856.25,-26.38 856.25,-102.12 1119.75,-102.12 1119.75,-26.38 856.25,-26.38"/>
<text text-anchor="start" x="971.5" y="-84.83" font-family="Times,serif" font-size="14.00">Land</text>
<polyline fill="none" stroke="black" points="856.25,-76.88 1119.75,-76.88"/>
<text text-anchor="start" x="864.25" y="-59.58" font-family="Times,serif" font-size="14.00">json_geometry : AttributeField</text>
<polyline fill="none" stroke="black" points="856.25,-51.62 1119.75,-51.62"/>
<text text-anchor="start" x="983.88" y="-34.33" font-family="Times,serif" font-size="14.00"> </text>
</g>
<!-- asset.Land&#45;&gt;asset.Asset -->
<g id="edge3" class="edge">
<title>asset.Land&#45;&gt;asset.Asset</title>
<path fill="none" stroke="black" d="M1048.09,-102.57C1099.77,-134.66 1175.29,-181.56 1235.59,-219.01"/>
<polygon fill="none" stroke="black" points="1233.51,-221.83 1243.85,-224.13 1237.2,-215.89 1233.51,-221.83"/>
</g>
<!-- taxonomy.LogCategory -->
<g id="node9" class="node">
<title>taxonomy.LogCategory</title>
<polygon fill="none" stroke="black" points="2111.62,-39 2111.62,-89.5 2218.38,-89.5 2218.38,-39 2111.62,-39"/>
<text text-anchor="start" x="2119.62" y="-72.2" font-family="Times,serif" font-size="14.00">LogCategory</text>
<polyline fill="none" stroke="black" points="2111.62,-64.25 2218.38,-64.25"/>
<polyline fill="none" stroke="black" points="2111.62,-64.25 2218.38,-64.25"/>
<text text-anchor="start" x="2160.88" y="-46.95" font-family="Times,serif" font-size="14.00"> </text>
</g>
<!-- taxonomy.LogCategory&#45;&gt;taxonomy.Taxonomy -->
<g id="edge37" class="edge">
<title>taxonomy.LogCategory&#45;&gt;taxonomy.Taxonomy</title>
<path fill="none" stroke="black" d="M2187.9,-89.95C2199.33,-101.93 2213.55,-116.32 2227,-128.5 2268.79,-166.36 2318.66,-206.18 2356.52,-235.42"/>
<polygon fill="none" stroke="black" points="2354.13,-238 2364.19,-241.32 2358.4,-232.45 2354.13,-238"/>
</g>
<!-- log.Maintenance -->
<g id="node10" class="node">
<title>log.Maintenance</title>
<polygon fill="none" stroke="black" points="267.62,-39 267.62,-89.5 374.38,-89.5 374.38,-39 267.62,-39"/>
<text text-anchor="start" x="275.62" y="-72.2" font-family="Times,serif" font-size="14.00">Maintenance</text>
<polyline fill="none" stroke="black" points="267.62,-64.25 374.38,-64.25"/>
<polyline fill="none" stroke="black" points="267.62,-64.25 374.38,-64.25"/>
<text text-anchor="start" x="316.88" y="-46.95" font-family="Times,serif" font-size="14.00"> </text>
</g>
<!-- log.Maintenance&#45;&gt;log.Log -->
<g id="edge19" class="edge">
<title>log.Maintenance&#45;&gt;log.Log</title>
<path fill="none" stroke="black" d="M327.19,-89.83C331.35,-106.3 337.16,-129.37 343.31,-153.77"/>
<polygon fill="none" stroke="black" points="339.85,-154.36 345.69,-163.2 346.64,-152.65 339.85,-154.36"/>
</g>
<!-- asset.Material -->
<g id="node11" class="node">
<title>asset.Material</title>
<polygon fill="none" stroke="black" points="1137.5,-26.38 1137.5,-102.12 1318.5,-102.12 1318.5,-26.38 1137.5,-26.38"/>
<text text-anchor="start" x="1195" y="-84.83" font-family="Times,serif" font-size="14.00">Material</text>
<polyline fill="none" stroke="black" points="1137.5,-76.88 1318.5,-76.88"/>
<text text-anchor="start" x="1145.5" y="-59.58" font-family="Times,serif" font-size="14.00">crop : RelationField</text>
<polyline fill="none" stroke="black" points="1137.5,-51.62 1318.5,-51.62"/>
<text text-anchor="start" x="1223.88" y="-34.33" font-family="Times,serif" font-size="14.00"> </text>
</g>
<!-- asset.Material&#45;&gt;asset.Asset -->
<g id="edge5" class="edge">
<title>asset.Material&#45;&gt;asset.Asset</title>
<path fill="none" stroke="black" d="M1246.29,-102.57C1261.43,-133.47 1283.31,-178.1 1301.3,-214.81"/>
<polygon fill="none" stroke="black" points="1298.05,-216.13 1305.59,-223.57 1304.33,-213.05 1298.05,-216.13"/>
</g>
<!-- quantity.Material -->
<g id="node12" class="node">
<title>quantity.Material</title>
<polygon fill="none" stroke="black" points="2759.25,-26.38 2759.25,-102.12 3022.75,-102.12 3022.75,-26.38 2759.25,-26.38"/>
<text text-anchor="start" x="2858" y="-84.83" font-family="Times,serif" font-size="14.00">Material</text>
<polyline fill="none" stroke="black" points="2759.25,-76.88 3022.75,-76.88"/>
<text text-anchor="start" x="2767.25" y="-59.58" font-family="Times,serif" font-size="14.00">material_types : RelationField</text>
<polyline fill="none" stroke="black" points="2759.25,-51.62 3022.75,-51.62"/>
<text text-anchor="start" x="2886.88" y="-34.33" font-family="Times,serif" font-size="14.00"> </text>
</g>
<!-- quantity.Quantity -->
<g id="node50" class="node">
<title>quantity.Quantity</title>
<polygon fill="none" stroke="black" points="3024.38,-199.5 3024.38,-361.5 3345.62,-361.5 3345.62,-199.5 3024.38,-199.5"/>
<text text-anchor="start" x="3152" y="-344.2" font-family="Times,serif" font-size="14.00">Quantity</text>
<polyline fill="none" stroke="black" points="3024.38,-336.25 3345.62,-336.25"/>
<text text-anchor="start" x="3032.38" y="-318.95" font-family="Times,serif" font-size="14.00">inventory_adjustment : AttributeField</text>
<text text-anchor="start" x="3032.38" y="-301.7" font-family="Times,serif" font-size="14.00">inventory_asset : RelationField</text>
<text text-anchor="start" x="3032.38" y="-284.45" font-family="Times,serif" font-size="14.00">json_value : AttributeField</text>
<text text-anchor="start" x="3032.38" y="-267.2" font-family="Times,serif" font-size="14.00">measure : AttributeField</text>
<text text-anchor="start" x="3032.38" y="-249.95" font-family="Times,serif" font-size="14.00">units : RelationField</text>
<text text-anchor="start" x="3032.38" y="-232.7" font-family="Times,serif" font-size="14.00">value</text>
<polyline fill="none" stroke="black" points="3024.38,-224.75 3345.62,-224.75"/>
<text text-anchor="start" x="3180.88" y="-207.45" font-family="Times,serif" font-size="14.00"> </text>
</g>
<!-- quantity.Material&#45;&gt;quantity.Quantity -->
<g id="edge29" class="edge">
<title>quantity.Material&#45;&gt;quantity.Quantity</title>
<path fill="none" stroke="black" d="M2942.21,-102.57C2976.31,-127.42 3022.58,-161.14 3065.59,-192.48"/>
<polygon fill="none" stroke="black" points="3063.35,-195.18 3073.49,-198.24 3067.47,-189.52 3063.35,-195.18"/>
</g>
<!-- taxonomy.MaterialType -->
<g id="node13" class="node">
<title>taxonomy.MaterialType</title>
<polygon fill="none" stroke="black" points="2236.5,-39 2236.5,-89.5 2351.5,-89.5 2351.5,-39 2236.5,-39"/>
<text text-anchor="start" x="2244.5" y="-72.2" font-family="Times,serif" font-size="14.00">MaterialType</text>
<polyline fill="none" stroke="black" points="2236.5,-64.25 2351.5,-64.25"/>
<polyline fill="none" stroke="black" points="2236.5,-64.25 2351.5,-64.25"/>
<text text-anchor="start" x="2289.88" y="-46.95" font-family="Times,serif" font-size="14.00"> </text>
</g>
<!-- taxonomy.MaterialType&#45;&gt;taxonomy.Taxonomy -->
<g id="edge39" class="edge">
<title>taxonomy.MaterialType&#45;&gt;taxonomy.Taxonomy</title>
<path fill="none" stroke="black" d="M2307.88,-89.83C2327.46,-124.5 2363.57,-188.44 2388.41,-232.43"/>
<polygon fill="none" stroke="black" points="2385.29,-234.01 2393.26,-241 2391.39,-230.57 2385.29,-234.01"/>
</g>
<!-- log.Medical -->
<g id="node14" class="node">
<title>log.Medical</title>
<polygon fill="none" stroke="black" points="392.12,-39 392.12,-89.5 465.88,-89.5 465.88,-39 392.12,-39"/>
<text text-anchor="start" x="400.12" y="-72.2" font-family="Times,serif" font-size="14.00">Medical</text>
<polyline fill="none" stroke="black" points="392.12,-64.25 465.88,-64.25"/>
<polyline fill="none" stroke="black" points="392.12,-64.25 465.88,-64.25"/>
<text text-anchor="start" x="424.88" y="-46.95" font-family="Times,serif" font-size="14.00"> </text>
</g>
<!-- log.Medical&#45;&gt;log.Log -->
<g id="edge21" class="edge">
<title>log.Medical&#45;&gt;log.Log</title>
<path fill="none" stroke="black" d="M422.81,-89.83C418.65,-106.3 412.84,-129.37 406.69,-153.77"/>
<polygon fill="none" stroke="black" points="403.36,-152.65 404.31,-163.2 410.15,-154.36 403.36,-152.65"/>
</g>
<!-- asset.Asset.Meta -->
<g id="node15" class="node">
<title>asset.Asset.Meta</title>
<polygon fill="none" stroke="black" points="3738.75,-242.62 3738.75,-318.38 3837.25,-318.38 3837.25,-242.62 3738.75,-242.62"/>
<text text-anchor="start" x="3771.5" y="-301.07" font-family="Times,serif" font-size="14.00">Meta</text>
<polyline fill="none" stroke="black" points="3738.75,-293.12 3837.25,-293.12"/>
<text text-anchor="start" x="3746.75" y="-275.82" font-family="Times,serif" font-size="14.00">type : str</text>
<polyline fill="none" stroke="black" points="3738.75,-267.88 3837.25,-267.88"/>
<text text-anchor="start" x="3783.88" y="-250.57" font-family="Times,serif" font-size="14.00"> </text>
</g>
<!-- asset.Land.Meta -->
<g id="node16" class="node">
<title>asset.Land.Meta</title>
<polygon fill="none" stroke="black" points="3446.75,-9.12 3446.75,-119.38 3545.25,-119.38 3545.25,-9.12 3446.75,-9.12"/>
<text text-anchor="start" x="3479.5" y="-102.08" font-family="Times,serif" font-size="14.00">Meta</text>
<polyline fill="none" stroke="black" points="3446.75,-94.12 3545.25,-94.12"/>
<text text-anchor="start" x="3454.75" y="-76.83" font-family="Times,serif" font-size="14.00">name : str</text>
<text text-anchor="start" x="3454.75" y="-59.58" font-family="Times,serif" font-size="14.00">path</text>
<text text-anchor="start" x="3454.75" y="-42.33" font-family="Times,serif" font-size="14.00">type</text>
<polyline fill="none" stroke="black" points="3446.75,-34.38 3545.25,-34.38"/>
<text text-anchor="start" x="3491.88" y="-17.07" font-family="Times,serif" font-size="14.00"> </text>
</g>
<!-- asset.Land.Meta&#45;&gt;asset.Asset.Meta -->
<g id="edge4" class="edge">
<title>asset.Land.Meta&#45;&gt;asset.Asset.Meta</title>
<path fill="none" stroke="black" d="M3545.03,-119.65C3548.32,-122.73 3551.66,-125.7 3555,-128.5 3609.95,-174.56 3679.71,-218.08 3728.52,-246.45"/>
<polygon fill="none" stroke="black" points="3726.57,-249.37 3736.98,-251.34 3730.07,-243.31 3726.57,-249.37"/>
</g>
<!-- asset.Plant.Meta -->
<g id="node17" class="node">
<title>asset.Plant.Meta</title>
<polygon fill="none" stroke="black" points="3563.75,-9.12 3563.75,-119.38 3662.25,-119.38 3662.25,-9.12 3563.75,-9.12"/>
<text text-anchor="start" x="3596.5" y="-102.08" font-family="Times,serif" font-size="14.00">Meta</text>
<polyline fill="none" stroke="black" points="3563.75,-94.12 3662.25,-94.12"/>
<text text-anchor="start" x="3571.75" y="-76.83" font-family="Times,serif" font-size="14.00">name : str</text>
<text text-anchor="start" x="3571.75" y="-59.58" font-family="Times,serif" font-size="14.00">path</text>
<text text-anchor="start" x="3571.75" y="-42.33" font-family="Times,serif" font-size="14.00">type</text>
<polyline fill="none" stroke="black" points="3563.75,-34.38 3662.25,-34.38"/>
<text text-anchor="start" x="3608.88" y="-17.07" font-family="Times,serif" font-size="14.00"> </text>
</g>
<!-- asset.Plant.Meta&#45;&gt;asset.Asset.Meta -->
<g id="edge8" class="edge">
<title>asset.Plant.Meta&#45;&gt;asset.Asset.Meta</title>
<path fill="none" stroke="black" d="M3657.61,-119.87C3686.34,-155.04 3723.25,-200.23 3750.47,-233.55"/>
<polygon fill="none" stroke="black" points="3747.53,-235.48 3756.56,-241.01 3752.95,-231.05 3747.53,-235.48"/>
</g>
<!-- asset.Equipment.Meta -->
<g id="node18" class="node">
<title>asset.Equipment.Meta</title>
<polygon fill="none" stroke="black" points="3680.75,-9.12 3680.75,-119.38 3779.25,-119.38 3779.25,-9.12 3680.75,-9.12"/>
<text text-anchor="start" x="3713.5" y="-102.08" font-family="Times,serif" font-size="14.00">Meta</text>
<polyline fill="none" stroke="black" points="3680.75,-94.12 3779.25,-94.12"/>
<text text-anchor="start" x="3688.75" y="-76.83" font-family="Times,serif" font-size="14.00">name : str</text>
<text text-anchor="start" x="3688.75" y="-59.58" font-family="Times,serif" font-size="14.00">path</text>
<text text-anchor="start" x="3688.75" y="-42.33" font-family="Times,serif" font-size="14.00">type</text>
<polyline fill="none" stroke="black" points="3680.75,-34.38 3779.25,-34.38"/>
<text text-anchor="start" x="3725.88" y="-17.07" font-family="Times,serif" font-size="14.00"> </text>
</g>
<!-- asset.Equipment.Meta&#45;&gt;asset.Asset.Meta -->
<g id="edge2" class="edge">
<title>asset.Equipment.Meta&#45;&gt;asset.Asset.Meta</title>
<path fill="none" stroke="black" d="M3744.79,-119.87C3754.1,-154.29 3766.02,-198.31 3774.98,-231.41"/>
<polygon fill="none" stroke="black" points="3771.51,-231.98 3777.5,-240.72 3778.27,-230.16 3771.51,-231.98"/>
</g>
<!-- asset.Material.Meta -->
<g id="node19" class="node">
<title>asset.Material.Meta</title>
<polygon fill="none" stroke="black" points="3797.75,-9.12 3797.75,-119.38 3896.25,-119.38 3896.25,-9.12 3797.75,-9.12"/>
<text text-anchor="start" x="3830.5" y="-102.08" font-family="Times,serif" font-size="14.00">Meta</text>
<polyline fill="none" stroke="black" points="3797.75,-94.12 3896.25,-94.12"/>
<text text-anchor="start" x="3805.75" y="-76.83" font-family="Times,serif" font-size="14.00">name : str</text>
<text text-anchor="start" x="3805.75" y="-59.58" font-family="Times,serif" font-size="14.00">path</text>
<text text-anchor="start" x="3805.75" y="-42.33" font-family="Times,serif" font-size="14.00">type</text>
<polyline fill="none" stroke="black" points="3797.75,-34.38 3896.25,-34.38"/>
<text text-anchor="start" x="3842.88" y="-17.07" font-family="Times,serif" font-size="14.00"> </text>
</g>
<!-- asset.Material.Meta&#45;&gt;asset.Asset.Meta -->
<g id="edge6" class="edge">
<title>asset.Material.Meta&#45;&gt;asset.Asset.Meta</title>
<path fill="none" stroke="black" d="M3831.96,-119.87C3822.48,-154.29 3810.36,-198.31 3801.24,-231.41"/>
<polygon fill="none" stroke="black" points="3797.96,-230.15 3798.68,-240.72 3804.71,-232.01 3797.96,-230.15"/>
</g>
<!-- asset.Seed.Meta -->
<g id="node20" class="node">
<title>asset.Seed.Meta</title>
<polygon fill="none" stroke="black" points="3914.75,-9.12 3914.75,-119.38 4013.25,-119.38 4013.25,-9.12 3914.75,-9.12"/>
<text text-anchor="start" x="3947.5" y="-102.08" font-family="Times,serif" font-size="14.00">Meta</text>
<polyline fill="none" stroke="black" points="3914.75,-94.12 4013.25,-94.12"/>
<text text-anchor="start" x="3922.75" y="-76.83" font-family="Times,serif" font-size="14.00">name : str</text>
<text text-anchor="start" x="3922.75" y="-59.58" font-family="Times,serif" font-size="14.00">path</text>
<text text-anchor="start" x="3922.75" y="-42.33" font-family="Times,serif" font-size="14.00">type</text>
<polyline fill="none" stroke="black" points="3914.75,-34.38 4013.25,-34.38"/>
<text text-anchor="start" x="3959.88" y="-17.07" font-family="Times,serif" font-size="14.00"> </text>
</g>
<!-- asset.Seed.Meta&#45;&gt;asset.Asset.Meta -->
<g id="edge12" class="edge">
<title>asset.Seed.Meta&#45;&gt;asset.Asset.Meta</title>
<path fill="none" stroke="black" d="M3919.13,-119.87C3890.24,-155.04 3853.12,-200.23 3825.75,-233.55"/>
<polygon fill="none" stroke="black" points="3823.26,-231.07 3819.62,-241.01 3828.67,-235.51 3823.26,-231.07"/>
</g>
<!-- asset.Product.Meta -->
<g id="node21" class="node">
<title>asset.Product.Meta</title>
<polygon fill="none" stroke="black" points="4031.75,-9.12 4031.75,-119.38 4130.25,-119.38 4130.25,-9.12 4031.75,-9.12"/>
<text text-anchor="start" x="4064.5" y="-102.08" font-family="Times,serif" font-size="14.00">Meta</text>
<polyline fill="none" stroke="black" points="4031.75,-94.12 4130.25,-94.12"/>
<text text-anchor="start" x="4039.75" y="-76.83" font-family="Times,serif" font-size="14.00">name : str</text>
<text text-anchor="start" x="4039.75" y="-59.58" font-family="Times,serif" font-size="14.00">path</text>
<text text-anchor="start" x="4039.75" y="-42.33" font-family="Times,serif" font-size="14.00">type</text>
<polyline fill="none" stroke="black" points="4031.75,-34.38 4130.25,-34.38"/>
<text text-anchor="start" x="4076.88" y="-17.07" font-family="Times,serif" font-size="14.00"> </text>
</g>
<!-- asset.Product.Meta&#45;&gt;asset.Asset.Meta -->
<g id="edge10" class="edge">
<title>asset.Product.Meta&#45;&gt;asset.Asset.Meta</title>
<path fill="none" stroke="black" d="M4031.98,-119.66C4028.68,-122.73 4025.34,-125.71 4022,-128.5 3966.66,-174.79 3896.33,-218.42 3847.29,-246.76"/>
<polygon fill="none" stroke="black" points="3845.71,-243.63 3838.78,-251.65 3849.2,-249.7 3845.71,-243.63"/>
</g>
<!-- log.Log.Meta -->
<g id="node22" class="node">
<title>log.Log.Meta</title>
<polygon fill="none" stroke="black" points="4557.75,-242.62 4557.75,-318.38 4656.25,-318.38 4656.25,-242.62 4557.75,-242.62"/>
<text text-anchor="start" x="4590.5" y="-301.07" font-family="Times,serif" font-size="14.00">Meta</text>
<polyline fill="none" stroke="black" points="4557.75,-293.12 4656.25,-293.12"/>
<text text-anchor="start" x="4565.75" y="-275.82" font-family="Times,serif" font-size="14.00">type : str</text>
<polyline fill="none" stroke="black" points="4557.75,-267.88 4656.25,-267.88"/>
<text text-anchor="start" x="4602.88" y="-250.57" font-family="Times,serif" font-size="14.00"> </text>
</g>
<!-- log.Activity.Meta -->
<g id="node23" class="node">
<title>log.Activity.Meta</title>
<polygon fill="none" stroke="black" points="4148.75,-9.12 4148.75,-119.38 4247.25,-119.38 4247.25,-9.12 4148.75,-9.12"/>
<text text-anchor="start" x="4181.5" y="-102.08" font-family="Times,serif" font-size="14.00">Meta</text>
<polyline fill="none" stroke="black" points="4148.75,-94.12 4247.25,-94.12"/>
<text text-anchor="start" x="4156.75" y="-76.83" font-family="Times,serif" font-size="14.00">name : str</text>
<text text-anchor="start" x="4156.75" y="-59.58" font-family="Times,serif" font-size="14.00">path</text>
<text text-anchor="start" x="4156.75" y="-42.33" font-family="Times,serif" font-size="14.00">type</text>
<polyline fill="none" stroke="black" points="4148.75,-34.38 4247.25,-34.38"/>
<text text-anchor="start" x="4193.88" y="-17.07" font-family="Times,serif" font-size="14.00"> </text>
</g>
<!-- log.Activity.Meta&#45;&gt;log.Log.Meta -->
<g id="edge14" class="edge">
<title>log.Activity.Meta&#45;&gt;log.Log.Meta</title>
<path fill="none" stroke="black" d="M4245.79,-119.73C4249.45,-122.86 4253.19,-125.82 4257,-128.5 4349.11,-193.39 4473.52,-238.76 4546.51,-261.87"/>
<polygon fill="none" stroke="black" points="4545.31,-265.16 4555.89,-264.8 4547.39,-258.48 4545.31,-265.16"/>
</g>
<!-- log.Maintenance.Meta -->
<g id="node24" class="node">
<title>log.Maintenance.Meta</title>
<polygon fill="none" stroke="black" points="4265.75,-9.12 4265.75,-119.38 4364.25,-119.38 4364.25,-9.12 4265.75,-9.12"/>
<text text-anchor="start" x="4298.5" y="-102.08" font-family="Times,serif" font-size="14.00">Meta</text>
<polyline fill="none" stroke="black" points="4265.75,-94.12 4364.25,-94.12"/>
<text text-anchor="start" x="4273.75" y="-76.83" font-family="Times,serif" font-size="14.00">name : str</text>
<text text-anchor="start" x="4273.75" y="-59.58" font-family="Times,serif" font-size="14.00">path</text>
<text text-anchor="start" x="4273.75" y="-42.33" font-family="Times,serif" font-size="14.00">type</text>
<polyline fill="none" stroke="black" points="4265.75,-34.38 4364.25,-34.38"/>
<text text-anchor="start" x="4310.88" y="-17.07" font-family="Times,serif" font-size="14.00"> </text>
</g>
<!-- log.Maintenance.Meta&#45;&gt;log.Log.Meta -->
<g id="edge20" class="edge">
<title>log.Maintenance.Meta&#45;&gt;log.Log.Meta</title>
<path fill="none" stroke="black" d="M4364.03,-119.65C4367.32,-122.73 4370.66,-125.7 4374,-128.5 4428.95,-174.56 4498.71,-218.08 4547.52,-246.45"/>
<polygon fill="none" stroke="black" points="4545.57,-249.37 4555.98,-251.34 4549.07,-243.31 4545.57,-249.37"/>
</g>
<!-- log.Purchase.Meta -->
<g id="node25" class="node">
<title>log.Purchase.Meta</title>
<polygon fill="none" stroke="black" points="4382.75,-9.12 4382.75,-119.38 4481.25,-119.38 4481.25,-9.12 4382.75,-9.12"/>
<text text-anchor="start" x="4415.5" y="-102.08" font-family="Times,serif" font-size="14.00">Meta</text>
<polyline fill="none" stroke="black" points="4382.75,-94.12 4481.25,-94.12"/>
<text text-anchor="start" x="4390.75" y="-76.83" font-family="Times,serif" font-size="14.00">name : str</text>
<text text-anchor="start" x="4390.75" y="-59.58" font-family="Times,serif" font-size="14.00">path</text>
<text text-anchor="start" x="4390.75" y="-42.33" font-family="Times,serif" font-size="14.00">type</text>
<polyline fill="none" stroke="black" points="4382.75,-34.38 4481.25,-34.38"/>
<text text-anchor="start" x="4427.88" y="-17.07" font-family="Times,serif" font-size="14.00"> </text>
</g>
<!-- log.Purchase.Meta&#45;&gt;log.Log.Meta -->
<g id="edge24" class="edge">
<title>log.Purchase.Meta&#45;&gt;log.Log.Meta</title>
<path fill="none" stroke="black" d="M4476.61,-119.87C4505.34,-155.04 4542.25,-200.23 4569.47,-233.55"/>
<polygon fill="none" stroke="black" points="4566.53,-235.48 4575.56,-241.01 4571.95,-231.05 4566.53,-235.48"/>
</g>
<!-- log.Seeding.Meta -->
<g id="node26" class="node">
<title>log.Seeding.Meta</title>
<polygon fill="none" stroke="black" points="4499.75,-9.12 4499.75,-119.38 4598.25,-119.38 4598.25,-9.12 4499.75,-9.12"/>
<text text-anchor="start" x="4532.5" y="-102.08" font-family="Times,serif" font-size="14.00">Meta</text>
<polyline fill="none" stroke="black" points="4499.75,-94.12 4598.25,-94.12"/>
<text text-anchor="start" x="4507.75" y="-76.83" font-family="Times,serif" font-size="14.00">name : str</text>
<text text-anchor="start" x="4507.75" y="-59.58" font-family="Times,serif" font-size="14.00">path</text>
<text text-anchor="start" x="4507.75" y="-42.33" font-family="Times,serif" font-size="14.00">type</text>
<polyline fill="none" stroke="black" points="4499.75,-34.38 4598.25,-34.38"/>
<text text-anchor="start" x="4544.88" y="-17.07" font-family="Times,serif" font-size="14.00"> </text>
</g>
<!-- log.Seeding.Meta&#45;&gt;log.Log.Meta -->
<g id="edge28" class="edge">
<title>log.Seeding.Meta&#45;&gt;log.Log.Meta</title>
<path fill="none" stroke="black" d="M4563.79,-119.87C4573.1,-154.29 4585.02,-198.31 4593.98,-231.41"/>
<polygon fill="none" stroke="black" points="4590.51,-231.98 4596.5,-240.72 4597.27,-230.16 4590.51,-231.98"/>
</g>
<!-- log.Input.Meta -->
<g id="node27" class="node">
<title>log.Input.Meta</title>
<polygon fill="none" stroke="black" points="4616.75,-9.12 4616.75,-119.38 4715.25,-119.38 4715.25,-9.12 4616.75,-9.12"/>
<text text-anchor="start" x="4649.5" y="-102.08" font-family="Times,serif" font-size="14.00">Meta</text>
<polyline fill="none" stroke="black" points="4616.75,-94.12 4715.25,-94.12"/>
<text text-anchor="start" x="4624.75" y="-76.83" font-family="Times,serif" font-size="14.00">name : str</text>
<text text-anchor="start" x="4624.75" y="-59.58" font-family="Times,serif" font-size="14.00">path</text>
<text text-anchor="start" x="4624.75" y="-42.33" font-family="Times,serif" font-size="14.00">type</text>
<polyline fill="none" stroke="black" points="4616.75,-34.38 4715.25,-34.38"/>
<text text-anchor="start" x="4661.88" y="-17.07" font-family="Times,serif" font-size="14.00"> </text>
</g>
<!-- log.Input.Meta&#45;&gt;log.Log.Meta -->
<g id="edge18" class="edge">
<title>log.Input.Meta&#45;&gt;log.Log.Meta</title>
<path fill="none" stroke="black" d="M4650.96,-119.87C4641.48,-154.29 4629.36,-198.31 4620.24,-231.41"/>
<polygon fill="none" stroke="black" points="4616.96,-230.15 4617.68,-240.72 4623.71,-232.01 4616.96,-230.15"/>
</g>
<!-- log.Medical.Meta -->
<g id="node28" class="node">
<title>log.Medical.Meta</title>
<polygon fill="none" stroke="black" points="4733.75,-9.12 4733.75,-119.38 4832.25,-119.38 4832.25,-9.12 4733.75,-9.12"/>
<text text-anchor="start" x="4766.5" y="-102.08" font-family="Times,serif" font-size="14.00">Meta</text>
<polyline fill="none" stroke="black" points="4733.75,-94.12 4832.25,-94.12"/>
<text text-anchor="start" x="4741.75" y="-76.83" font-family="Times,serif" font-size="14.00">name : str</text>
<text text-anchor="start" x="4741.75" y="-59.58" font-family="Times,serif" font-size="14.00">path</text>
<text text-anchor="start" x="4741.75" y="-42.33" font-family="Times,serif" font-size="14.00">type</text>
<polyline fill="none" stroke="black" points="4733.75,-34.38 4832.25,-34.38"/>
<text text-anchor="start" x="4778.88" y="-17.07" font-family="Times,serif" font-size="14.00"> </text>
</g>
<!-- log.Medical.Meta&#45;&gt;log.Log.Meta -->
<g id="edge22" class="edge">
<title>log.Medical.Meta&#45;&gt;log.Log.Meta</title>
<path fill="none" stroke="black" d="M4738.13,-119.87C4709.24,-155.04 4672.12,-200.23 4644.75,-233.55"/>
<polygon fill="none" stroke="black" points="4642.26,-231.07 4638.62,-241.01 4647.67,-235.51 4642.26,-231.07"/>
</g>
<!-- log.Harvest.Meta -->
<g id="node29" class="node">
<title>log.Harvest.Meta</title>
<polygon fill="none" stroke="black" points="4850.75,-9.12 4850.75,-119.38 4949.25,-119.38 4949.25,-9.12 4850.75,-9.12"/>
<text text-anchor="start" x="4883.5" y="-102.08" font-family="Times,serif" font-size="14.00">Meta</text>
<polyline fill="none" stroke="black" points="4850.75,-94.12 4949.25,-94.12"/>
<text text-anchor="start" x="4858.75" y="-76.83" font-family="Times,serif" font-size="14.00">name : str</text>
<text text-anchor="start" x="4858.75" y="-59.58" font-family="Times,serif" font-size="14.00">path</text>
<text text-anchor="start" x="4858.75" y="-42.33" font-family="Times,serif" font-size="14.00">type</text>
<polyline fill="none" stroke="black" points="4850.75,-34.38 4949.25,-34.38"/>
<text text-anchor="start" x="4895.88" y="-17.07" font-family="Times,serif" font-size="14.00"> </text>
</g>
<!-- log.Harvest.Meta&#45;&gt;log.Log.Meta -->
<g id="edge16" class="edge">
<title>log.Harvest.Meta&#45;&gt;log.Log.Meta</title>
<path fill="none" stroke="black" d="M4850.98,-119.66C4847.68,-122.73 4844.34,-125.71 4841,-128.5 4785.66,-174.79 4715.33,-218.42 4666.29,-246.76"/>
<polygon fill="none" stroke="black" points="4664.71,-243.63 4657.78,-251.65 4668.2,-249.7 4664.71,-243.63"/>
</g>
<!-- log.Sale.Meta -->
<g id="node30" class="node">
<title>log.Sale.Meta</title>
<polygon fill="none" stroke="black" points="4967.75,-9.12 4967.75,-119.38 5066.25,-119.38 5066.25,-9.12 4967.75,-9.12"/>
<text text-anchor="start" x="5000.5" y="-102.08" font-family="Times,serif" font-size="14.00">Meta</text>
<polyline fill="none" stroke="black" points="4967.75,-94.12 5066.25,-94.12"/>
<text text-anchor="start" x="4975.75" y="-76.83" font-family="Times,serif" font-size="14.00">name : str</text>
<text text-anchor="start" x="4975.75" y="-59.58" font-family="Times,serif" font-size="14.00">path</text>
<text text-anchor="start" x="4975.75" y="-42.33" font-family="Times,serif" font-size="14.00">type</text>
<polyline fill="none" stroke="black" points="4967.75,-34.38 5066.25,-34.38"/>
<text text-anchor="start" x="5012.88" y="-17.07" font-family="Times,serif" font-size="14.00"> </text>
</g>
<!-- log.Sale.Meta&#45;&gt;log.Log.Meta -->
<g id="edge26" class="edge">
<title>log.Sale.Meta&#45;&gt;log.Log.Meta</title>
<path fill="none" stroke="black" d="M4969.21,-119.73C4965.56,-122.86 4961.81,-125.82 4958,-128.5 4865.5,-193.59 4740.52,-238.96 4667.35,-262"/>
<polygon fill="none" stroke="black" points="4666.46,-258.61 4657.95,-264.92 4668.54,-265.3 4666.46,-258.61"/>
</g>
<!-- quantity.Quantity.Meta -->
<g id="node31" class="node">
<title>quantity.Quantity.Meta</title>
<polygon fill="none" stroke="black" points="5201.75,-242.62 5201.75,-318.38 5300.25,-318.38 5300.25,-242.62 5201.75,-242.62"/>
<text text-anchor="start" x="5234.5" y="-301.07" font-family="Times,serif" font-size="14.00">Meta</text>
<polyline fill="none" stroke="black" points="5201.75,-293.12 5300.25,-293.12"/>
<text text-anchor="start" x="5209.75" y="-275.82" font-family="Times,serif" font-size="14.00">type : str</text>
<polyline fill="none" stroke="black" points="5201.75,-267.88 5300.25,-267.88"/>
<text text-anchor="start" x="5246.88" y="-250.57" font-family="Times,serif" font-size="14.00"> </text>
</g>
<!-- quantity.Standard.Meta -->
<g id="node32" class="node">
<title>quantity.Standard.Meta</title>
<polygon fill="none" stroke="black" points="5084.75,-9.12 5084.75,-119.38 5183.25,-119.38 5183.25,-9.12 5084.75,-9.12"/>
<text text-anchor="start" x="5117.5" y="-102.08" font-family="Times,serif" font-size="14.00">Meta</text>
<polyline fill="none" stroke="black" points="5084.75,-94.12 5183.25,-94.12"/>
<text text-anchor="start" x="5092.75" y="-76.83" font-family="Times,serif" font-size="14.00">name : str</text>
<text text-anchor="start" x="5092.75" y="-59.58" font-family="Times,serif" font-size="14.00">path</text>
<text text-anchor="start" x="5092.75" y="-42.33" font-family="Times,serif" font-size="14.00">type</text>
<polyline fill="none" stroke="black" points="5084.75,-34.38 5183.25,-34.38"/>
<text text-anchor="start" x="5129.88" y="-17.07" font-family="Times,serif" font-size="14.00"> </text>
</g>
<!-- quantity.Standard.Meta&#45;&gt;quantity.Quantity.Meta -->
<g id="edge34" class="edge">
<title>quantity.Standard.Meta&#45;&gt;quantity.Quantity.Meta</title>
<path fill="none" stroke="black" d="M5163.83,-119.87C5182.79,-154.59 5207.08,-199.08 5225.21,-232.27"/>
<polygon fill="none" stroke="black" points="5222.03,-233.76 5229.9,-240.85 5228.18,-230.4 5222.03,-233.76"/>
</g>
<!-- quantity.Price.Meta -->
<g id="node33" class="node">
<title>quantity.Price.Meta</title>
<polygon fill="none" stroke="black" points="5201.75,-9.12 5201.75,-119.38 5300.25,-119.38 5300.25,-9.12 5201.75,-9.12"/>
<text text-anchor="start" x="5234.5" y="-102.08" font-family="Times,serif" font-size="14.00">Meta</text>
<polyline fill="none" stroke="black" points="5201.75,-94.12 5300.25,-94.12"/>
<text text-anchor="start" x="5209.75" y="-76.83" font-family="Times,serif" font-size="14.00">name : str</text>
<text text-anchor="start" x="5209.75" y="-59.58" font-family="Times,serif" font-size="14.00">path</text>
<text text-anchor="start" x="5209.75" y="-42.33" font-family="Times,serif" font-size="14.00">type</text>
<polyline fill="none" stroke="black" points="5201.75,-34.38 5300.25,-34.38"/>
<text text-anchor="start" x="5246.88" y="-17.07" font-family="Times,serif" font-size="14.00"> </text>
</g>
<!-- quantity.Price.Meta&#45;&gt;quantity.Quantity.Meta -->
<g id="edge32" class="edge">
<title>quantity.Price.Meta&#45;&gt;quantity.Quantity.Meta</title>
<path fill="none" stroke="black" d="M5251,-119.87C5251,-154.14 5251,-197.93 5251,-230.98"/>
<polygon fill="none" stroke="black" points="5247.5,-230.67 5251,-240.67 5254.5,-230.67 5247.5,-230.67"/>
</g>
<!-- quantity.Material.Meta -->
<g id="node34" class="node">
<title>quantity.Material.Meta</title>
<polygon fill="none" stroke="black" points="5318.75,-9.12 5318.75,-119.38 5417.25,-119.38 5417.25,-9.12 5318.75,-9.12"/>
<text text-anchor="start" x="5351.5" y="-102.08" font-family="Times,serif" font-size="14.00">Meta</text>
<polyline fill="none" stroke="black" points="5318.75,-94.12 5417.25,-94.12"/>
<text text-anchor="start" x="5326.75" y="-76.83" font-family="Times,serif" font-size="14.00">name : str</text>
<text text-anchor="start" x="5326.75" y="-59.58" font-family="Times,serif" font-size="14.00">path</text>
<text text-anchor="start" x="5326.75" y="-42.33" font-family="Times,serif" font-size="14.00">type</text>
<polyline fill="none" stroke="black" points="5318.75,-34.38 5417.25,-34.38"/>
<text text-anchor="start" x="5363.88" y="-17.07" font-family="Times,serif" font-size="14.00"> </text>
</g>
<!-- quantity.Material.Meta&#45;&gt;quantity.Quantity.Meta -->
<g id="edge30" class="edge">
<title>quantity.Material.Meta&#45;&gt;quantity.Quantity.Meta</title>
<path fill="none" stroke="black" d="M5338.17,-119.87C5319.21,-154.59 5294.92,-199.08 5276.79,-232.27"/>
<polygon fill="none" stroke="black" points="5273.82,-230.4 5272.1,-240.85 5279.97,-233.76 5273.82,-230.4"/>
</g>
<!-- taxonomy.Taxonomy.Meta -->
<g id="node35" class="node">
<title>taxonomy.Taxonomy.Meta</title>
<polygon fill="none" stroke="black" points="5786.75,-242.62 5786.75,-318.38 5885.25,-318.38 5885.25,-242.62 5786.75,-242.62"/>
<text text-anchor="start" x="5819.5" y="-301.07" font-family="Times,serif" font-size="14.00">Meta</text>
<polyline fill="none" stroke="black" points="5786.75,-293.12 5885.25,-293.12"/>
<text text-anchor="start" x="5794.75" y="-275.82" font-family="Times,serif" font-size="14.00">type : str</text>
<polyline fill="none" stroke="black" points="5786.75,-267.88 5885.25,-267.88"/>
<text text-anchor="start" x="5831.88" y="-250.57" font-family="Times,serif" font-size="14.00"> </text>
</g>
<!-- taxonomy.Crop.Meta -->
<g id="node36" class="node">
<title>taxonomy.Crop.Meta</title>
<polygon fill="none" stroke="black" points="5435.75,-9.12 5435.75,-119.38 5534.25,-119.38 5534.25,-9.12 5435.75,-9.12"/>
<text text-anchor="start" x="5468.5" y="-102.08" font-family="Times,serif" font-size="14.00">Meta</text>
<polyline fill="none" stroke="black" points="5435.75,-94.12 5534.25,-94.12"/>
<text text-anchor="start" x="5443.75" y="-76.83" font-family="Times,serif" font-size="14.00">name : str</text>
<text text-anchor="start" x="5443.75" y="-59.58" font-family="Times,serif" font-size="14.00">path</text>
<text text-anchor="start" x="5443.75" y="-42.33" font-family="Times,serif" font-size="14.00">type</text>
<polyline fill="none" stroke="black" points="5435.75,-34.38 5534.25,-34.38"/>
<text text-anchor="start" x="5480.88" y="-17.07" font-family="Times,serif" font-size="14.00"> </text>
</g>
<!-- taxonomy.Crop.Meta&#45;&gt;taxonomy.Taxonomy.Meta -->
<g id="edge36" class="edge">
<title>taxonomy.Crop.Meta&#45;&gt;taxonomy.Taxonomy.Meta</title>
<path fill="none" stroke="black" d="M5533.37,-119.73C5536.85,-122.83 5540.41,-125.78 5544,-128.5 5617.41,-184.15 5714.33,-229.66 5775.93,-255.68"/>
<polygon fill="none" stroke="black" points="5774.29,-258.79 5784.86,-259.42 5776.99,-252.33 5774.29,-258.79"/>
</g>
<!-- taxonomy.LogCategory.Meta -->
<g id="node37" class="node">
<title>taxonomy.LogCategory.Meta</title>
<polygon fill="none" stroke="black" points="5552.75,-9.12 5552.75,-119.38 5651.25,-119.38 5651.25,-9.12 5552.75,-9.12"/>
<text text-anchor="start" x="5585.5" y="-102.08" font-family="Times,serif" font-size="14.00">Meta</text>
<polyline fill="none" stroke="black" points="5552.75,-94.12 5651.25,-94.12"/>
<text text-anchor="start" x="5560.75" y="-76.83" font-family="Times,serif" font-size="14.00">name : str</text>
<text text-anchor="start" x="5560.75" y="-59.58" font-family="Times,serif" font-size="14.00">path</text>
<text text-anchor="start" x="5560.75" y="-42.33" font-family="Times,serif" font-size="14.00">type</text>
<polyline fill="none" stroke="black" points="5552.75,-34.38 5651.25,-34.38"/>
<text text-anchor="start" x="5597.88" y="-17.07" font-family="Times,serif" font-size="14.00"> </text>
</g>
<!-- taxonomy.LogCategory.Meta&#45;&gt;taxonomy.Taxonomy.Meta -->
<g id="edge38" class="edge">
<title>taxonomy.LogCategory.Meta&#45;&gt;taxonomy.Taxonomy.Meta</title>
<path fill="none" stroke="black" d="M5651.5,-119.13C5654.68,-122.33 5657.86,-125.48 5661,-128.5 5699.92,-165.94 5746.29,-205.75 5781.52,-235.09"/>
<polygon fill="none" stroke="black" points="5779.13,-237.66 5789.06,-241.35 5783.6,-232.27 5779.13,-237.66"/>
</g>
<!-- taxonomy.MaterialType.Meta -->
<g id="node38" class="node">
<title>taxonomy.MaterialType.Meta</title>
<polygon fill="none" stroke="black" points="5669.75,-9.12 5669.75,-119.38 5768.25,-119.38 5768.25,-9.12 5669.75,-9.12"/>
<text text-anchor="start" x="5702.5" y="-102.08" font-family="Times,serif" font-size="14.00">Meta</text>
<polyline fill="none" stroke="black" points="5669.75,-94.12 5768.25,-94.12"/>
<text text-anchor="start" x="5677.75" y="-76.83" font-family="Times,serif" font-size="14.00">name : str</text>
<text text-anchor="start" x="5677.75" y="-59.58" font-family="Times,serif" font-size="14.00">path</text>
<text text-anchor="start" x="5677.75" y="-42.33" font-family="Times,serif" font-size="14.00">type</text>
<polyline fill="none" stroke="black" points="5669.75,-34.38 5768.25,-34.38"/>
<text text-anchor="start" x="5714.88" y="-17.07" font-family="Times,serif" font-size="14.00"> </text>
</g>
<!-- taxonomy.MaterialType.Meta&#45;&gt;taxonomy.Taxonomy.Meta -->
<g id="edge40" class="edge">
<title>taxonomy.MaterialType.Meta&#45;&gt;taxonomy.Taxonomy.Meta</title>
<path fill="none" stroke="black" d="M5748.83,-119.87C5767.79,-154.59 5792.08,-199.08 5810.21,-232.27"/>
<polygon fill="none" stroke="black" points="5807.03,-233.76 5814.9,-240.85 5813.18,-230.4 5807.03,-233.76"/>
</g>
<!-- taxonomy.PlantType.Meta -->
<g id="node39" class="node">
<title>taxonomy.PlantType.Meta</title>
<polygon fill="none" stroke="black" points="5786.75,-9.12 5786.75,-119.38 5885.25,-119.38 5885.25,-9.12 5786.75,-9.12"/>
<text text-anchor="start" x="5819.5" y="-102.08" font-family="Times,serif" font-size="14.00">Meta</text>
<polyline fill="none" stroke="black" points="5786.75,-94.12 5885.25,-94.12"/>
<text text-anchor="start" x="5794.75" y="-76.83" font-family="Times,serif" font-size="14.00">name : str</text>
<text text-anchor="start" x="5794.75" y="-59.58" font-family="Times,serif" font-size="14.00">path</text>
<text text-anchor="start" x="5794.75" y="-42.33" font-family="Times,serif" font-size="14.00">type</text>
<polyline fill="none" stroke="black" points="5786.75,-34.38 5885.25,-34.38"/>
<text text-anchor="start" x="5831.88" y="-17.07" font-family="Times,serif" font-size="14.00"> </text>
</g>
<!-- taxonomy.PlantType.Meta&#45;&gt;taxonomy.Taxonomy.Meta -->
<g id="edge42" class="edge">
<title>taxonomy.PlantType.Meta&#45;&gt;taxonomy.Taxonomy.Meta</title>
<path fill="none" stroke="black" d="M5836,-119.87C5836,-154.14 5836,-197.93 5836,-230.98"/>
<polygon fill="none" stroke="black" points="5832.5,-230.67 5836,-240.67 5839.5,-230.67 5832.5,-230.67"/>
</g>
<!-- taxonomy.ProductType.Meta -->
<g id="node40" class="node">
<title>taxonomy.ProductType.Meta</title>
<polygon fill="none" stroke="black" points="5903.75,-9.12 5903.75,-119.38 6002.25,-119.38 6002.25,-9.12 5903.75,-9.12"/>
<text text-anchor="start" x="5936.5" y="-102.08" font-family="Times,serif" font-size="14.00">Meta</text>
<polyline fill="none" stroke="black" points="5903.75,-94.12 6002.25,-94.12"/>
<text text-anchor="start" x="5911.75" y="-76.83" font-family="Times,serif" font-size="14.00">name : str</text>
<text text-anchor="start" x="5911.75" y="-59.58" font-family="Times,serif" font-size="14.00">path</text>
<text text-anchor="start" x="5911.75" y="-42.33" font-family="Times,serif" font-size="14.00">type</text>
<polyline fill="none" stroke="black" points="5903.75,-34.38 6002.25,-34.38"/>
<text text-anchor="start" x="5948.88" y="-17.07" font-family="Times,serif" font-size="14.00"> </text>
</g>
<!-- taxonomy.ProductType.Meta&#45;&gt;taxonomy.Taxonomy.Meta -->
<g id="edge44" class="edge">
<title>taxonomy.ProductType.Meta&#45;&gt;taxonomy.Taxonomy.Meta</title>
<path fill="none" stroke="black" d="M5923.17,-119.87C5904.21,-154.59 5879.92,-199.08 5861.79,-232.27"/>
<polygon fill="none" stroke="black" points="5858.82,-230.4 5857.1,-240.85 5864.97,-233.76 5858.82,-230.4"/>
</g>
<!-- taxonomy.Season.Meta -->
<g id="node41" class="node">
<title>taxonomy.Season.Meta</title>
<polygon fill="none" stroke="black" points="6020.75,-9.12 6020.75,-119.38 6119.25,-119.38 6119.25,-9.12 6020.75,-9.12"/>
<text text-anchor="start" x="6053.5" y="-102.08" font-family="Times,serif" font-size="14.00">Meta</text>
<polyline fill="none" stroke="black" points="6020.75,-94.12 6119.25,-94.12"/>
<text text-anchor="start" x="6028.75" y="-76.83" font-family="Times,serif" font-size="14.00">name : str</text>
<text text-anchor="start" x="6028.75" y="-59.58" font-family="Times,serif" font-size="14.00">path</text>
<text text-anchor="start" x="6028.75" y="-42.33" font-family="Times,serif" font-size="14.00">type</text>
<polyline fill="none" stroke="black" points="6020.75,-34.38 6119.25,-34.38"/>
<text text-anchor="start" x="6065.88" y="-17.07" font-family="Times,serif" font-size="14.00"> </text>
</g>
<!-- taxonomy.Season.Meta&#45;&gt;taxonomy.Taxonomy.Meta -->
<g id="edge46" class="edge">
<title>taxonomy.Season.Meta&#45;&gt;taxonomy.Taxonomy.Meta</title>
<path fill="none" stroke="black" d="M6020.5,-119.13C6017.32,-122.33 6014.14,-125.48 6011,-128.5 5972.08,-165.94 5925.71,-205.75 5890.48,-235.09"/>
<polygon fill="none" stroke="black" points="5888.4,-232.27 5882.94,-241.35 5892.87,-237.66 5888.4,-232.27"/>
</g>
<!-- taxonomy.Unit.Meta -->
<g id="node42" class="node">
<title>taxonomy.Unit.Meta</title>
<polygon fill="none" stroke="black" points="6137.75,-9.12 6137.75,-119.38 6236.25,-119.38 6236.25,-9.12 6137.75,-9.12"/>
<text text-anchor="start" x="6170.5" y="-102.08" font-family="Times,serif" font-size="14.00">Meta</text>
<polyline fill="none" stroke="black" points="6137.75,-94.12 6236.25,-94.12"/>
<text text-anchor="start" x="6145.75" y="-76.83" font-family="Times,serif" font-size="14.00">name : str</text>
<text text-anchor="start" x="6145.75" y="-59.58" font-family="Times,serif" font-size="14.00">path</text>
<text text-anchor="start" x="6145.75" y="-42.33" font-family="Times,serif" font-size="14.00">type</text>
<polyline fill="none" stroke="black" points="6137.75,-34.38 6236.25,-34.38"/>
<text text-anchor="start" x="6182.88" y="-17.07" font-family="Times,serif" font-size="14.00"> </text>
</g>
<!-- taxonomy.Unit.Meta&#45;&gt;taxonomy.Taxonomy.Meta -->
<g id="edge48" class="edge">
<title>taxonomy.Unit.Meta&#45;&gt;taxonomy.Taxonomy.Meta</title>
<path fill="none" stroke="black" d="M6138.63,-119.73C6135.15,-122.83 6131.59,-125.78 6128,-128.5 6054.59,-184.15 5957.67,-229.66 5896.07,-255.68"/>
<polygon fill="none" stroke="black" points="5895.01,-252.33 5887.14,-259.42 5897.71,-258.79 5895.01,-252.33"/>
</g>
<!-- my_meta.MyMeta -->
<g id="node43" class="node">
<title>my_meta.MyMeta</title>
<polygon fill="none" stroke="black" points="6254.12,-30.38 6254.12,-98.12 6459.88,-98.12 6459.88,-30.38 6254.12,-30.38"/>
<text text-anchor="start" x="6332.25" y="-80.83" font-family="Times,serif" font-size="14.00">MyMeta</text>
<polyline fill="none" stroke="black" points="6254.12,-72.88 6459.88,-72.88"/>
<polyline fill="none" stroke="black" points="6254.12,-72.88 6459.88,-72.88"/>
<text text-anchor="start" x="6262.12" y="-55.58" font-family="Times,serif" font-size="14.00">get_type_and_path(name)</text>
<text text-anchor="start" x="6262.12" y="-38.33" font-family="Times,serif" font-size="14.00">set_api(api)</text>
</g>
<!-- asset.Plant -->
<g id="node44" class="node">
<title>asset.Plant</title>
<polygon fill="none" stroke="black" points="1336.12,-17.75 1336.12,-110.75 1541.88,-110.75 1541.88,-17.75 1336.12,-17.75"/>
<text text-anchor="start" x="1418.38" y="-93.45" font-family="Times,serif" font-size="14.00">Plant</text>
<polyline fill="none" stroke="black" points="1336.12,-85.5 1541.88,-85.5"/>
<text text-anchor="start" x="1344.12" y="-68.2" font-family="Times,serif" font-size="14.00">crops : RelationField</text>
<text text-anchor="start" x="1344.12" y="-50.95" font-family="Times,serif" font-size="14.00">seasons : RelationField</text>
<polyline fill="none" stroke="black" points="1336.12,-43 1541.88,-43"/>
<text text-anchor="start" x="1434.88" y="-25.7" font-family="Times,serif" font-size="14.00"> </text>
</g>
<!-- asset.Plant&#45;&gt;asset.Asset -->
<g id="edge7" class="edge">
<title>asset.Plant&#45;&gt;asset.Asset</title>
<path fill="none" stroke="black" d="M1416.26,-111.21C1401.32,-141.41 1381.56,-181.36 1365.03,-214.75"/>
<polygon fill="none" stroke="black" points="1361.99,-213.02 1360.69,-223.53 1368.26,-216.12 1361.99,-213.02"/>
</g>
<!-- taxonomy.PlantType -->
<g id="node45" class="node">
<title>taxonomy.PlantType</title>
<polygon fill="none" stroke="black" points="2369.88,-39 2369.88,-89.5 2460.12,-89.5 2460.12,-39 2369.88,-39"/>
<text text-anchor="start" x="2377.88" y="-72.2" font-family="Times,serif" font-size="14.00">PlantType</text>
<polyline fill="none" stroke="black" points="2369.88,-64.25 2460.12,-64.25"/>
<polyline fill="none" stroke="black" points="2369.88,-64.25 2460.12,-64.25"/>
<text text-anchor="start" x="2410.88" y="-46.95" font-family="Times,serif" font-size="14.00"> </text>
</g>
<!-- taxonomy.PlantType&#45;&gt;taxonomy.Taxonomy -->
<g id="edge41" class="edge">
<title>taxonomy.PlantType&#45;&gt;taxonomy.Taxonomy</title>
<path fill="none" stroke="black" d="M2415,-89.83C2415,-124.13 2415,-187.1 2415,-231.03"/>
<polygon fill="none" stroke="black" points="2411.5,-230.8 2415,-240.8 2418.5,-230.8 2411.5,-230.8"/>
</g>
<!-- quantity.Price -->
<g id="node46" class="node">
<title>quantity.Price</title>
<polygon fill="none" stroke="black" points="3040.88,-0.5 3040.88,-128 3329.12,-128 3329.12,-0.5 3040.88,-0.5"/>
<text text-anchor="start" x="3164.38" y="-110.7" font-family="Times,serif" font-size="14.00">Price</text>
<polyline fill="none" stroke="black" points="3040.88,-102.75 3329.12,-102.75"/>
<text text-anchor="start" x="3048.88" y="-85.45" font-family="Times,serif" font-size="14.00">json_total_price : AttributeField</text>
<text text-anchor="start" x="3048.88" y="-68.2" font-family="Times,serif" font-size="14.00">json_unit_price : AttributeField</text>
<text text-anchor="start" x="3048.88" y="-50.95" font-family="Times,serif" font-size="14.00">total_price</text>
<text text-anchor="start" x="3048.88" y="-33.7" font-family="Times,serif" font-size="14.00">unit_price</text>
<polyline fill="none" stroke="black" points="3040.88,-25.75 3329.12,-25.75"/>
<text text-anchor="start" x="3180.88" y="-8.45" font-family="Times,serif" font-size="14.00"> </text>
</g>
<!-- quantity.Price&#45;&gt;quantity.Quantity -->
<g id="edge31" class="edge">
<title>quantity.Price&#45;&gt;quantity.Quantity</title>
<path fill="none" stroke="black" d="M3185,-128.37C3185,-147.03 3185,-167.85 3185,-187.92"/>
<polygon fill="none" stroke="black" points="3181.5,-187.79 3185,-197.79 3188.5,-187.79 3181.5,-187.79"/>
</g>
<!-- asset.Product -->
<g id="node47" class="node">
<title>asset.Product</title>
<polygon fill="none" stroke="black" points="1559.5,-26.38 1559.5,-102.12 1806.5,-102.12 1806.5,-26.38 1559.5,-26.38"/>
<text text-anchor="start" x="1654.12" y="-84.83" font-family="Times,serif" font-size="14.00">Product</text>
<polyline fill="none" stroke="black" points="1559.5,-76.88 1806.5,-76.88"/>
<text text-anchor="start" x="1567.5" y="-59.58" font-family="Times,serif" font-size="14.00">product_type : RelationField</text>
<polyline fill="none" stroke="black" points="1559.5,-51.62 1806.5,-51.62"/>
<text text-anchor="start" x="1678.88" y="-34.33" font-family="Times,serif" font-size="14.00"> </text>
</g>
<!-- asset.Product&#45;&gt;asset.Asset -->
<g id="edge9" class="edge">
<title>asset.Product&#45;&gt;asset.Asset</title>
<path fill="none" stroke="black" d="M1622.03,-102.57C1569.61,-134.66 1493,-181.56 1431.82,-219.01"/>
<polygon fill="none" stroke="black" points="1430.13,-215.94 1423.43,-224.14 1433.79,-221.91 1430.13,-215.94"/>
</g>
<!-- taxonomy.ProductType -->
<g id="node48" class="node">
<title>taxonomy.ProductType</title>
<polygon fill="none" stroke="black" points="2478.62,-39 2478.62,-89.5 2585.38,-89.5 2585.38,-39 2478.62,-39"/>
<text text-anchor="start" x="2486.62" y="-72.2" font-family="Times,serif" font-size="14.00">ProductType</text>
<polyline fill="none" stroke="black" points="2478.62,-64.25 2585.38,-64.25"/>
<polyline fill="none" stroke="black" points="2478.62,-64.25 2585.38,-64.25"/>
<text text-anchor="start" x="2527.88" y="-46.95" font-family="Times,serif" font-size="14.00"> </text>
</g>
<!-- taxonomy.ProductType&#45;&gt;taxonomy.Taxonomy -->
<g id="edge43" class="edge">
<title>taxonomy.ProductType&#45;&gt;taxonomy.Taxonomy</title>
<path fill="none" stroke="black" d="M2518.58,-89.83C2499.65,-124.5 2464.73,-188.44 2440.71,-232.43"/>
<polygon fill="none" stroke="black" points="2437.75,-230.54 2436.03,-240.99 2443.89,-233.89 2437.75,-230.54"/>
</g>
<!-- log.Purchase -->
<g id="node49" class="node">
<title>log.Purchase</title>
<polygon fill="none" stroke="black" points="484,-39 484,-89.5 566,-89.5 566,-39 484,-39"/>
<text text-anchor="start" x="492" y="-72.2" font-family="Times,serif" font-size="14.00">Purchase</text>
<polyline fill="none" stroke="black" points="484,-64.25 566,-64.25"/>
<polyline fill="none" stroke="black" points="484,-64.25 566,-64.25"/>
<text text-anchor="start" x="520.88" y="-46.95" font-family="Times,serif" font-size="14.00"> </text>
</g>
<!-- log.Purchase&#45;&gt;log.Log -->
<g id="edge23" class="edge">
<title>log.Purchase&#45;&gt;log.Log</title>
<path fill="none" stroke="black" d="M507.79,-89.83C496,-106.66 479.38,-130.41 461.88,-155.41"/>
<polygon fill="none" stroke="black" points="459.13,-153.23 456.26,-163.43 464.86,-157.25 459.13,-153.23"/>
</g>
<!-- log.Sale -->
<g id="node51" class="node">
<title>log.Sale</title>
<polygon fill="none" stroke="black" points="584,-39 584,-89.5 638,-89.5 638,-39 584,-39"/>
<text text-anchor="start" x="594.5" y="-72.2" font-family="Times,serif" font-size="14.00">Sale</text>
<polyline fill="none" stroke="black" points="584,-64.25 638,-64.25"/>
<polyline fill="none" stroke="black" points="584,-64.25 638,-64.25"/>
<text text-anchor="start" x="606.88" y="-46.95" font-family="Times,serif" font-size="14.00"> </text>
</g>
<!-- log.Sale&#45;&gt;log.Log -->
<g id="edge25" class="edge">
<title>log.Sale&#45;&gt;log.Log</title>
<path fill="none" stroke="black" d="M599.94,-89.88C593.68,-102.26 585.09,-117.01 575,-128.5 554.13,-152.26 528.99,-174.7 503.69,-194.65"/>
<polygon fill="none" stroke="black" points="501.68,-191.77 495.93,-200.67 505.98,-197.3 501.68,-191.77"/>
</g>
<!-- taxonomy.Season -->
<g id="node52" class="node">
<title>taxonomy.Season</title>
<polygon fill="none" stroke="black" points="2603.25,-39 2603.25,-89.5 2668.75,-89.5 2668.75,-39 2603.25,-39"/>
<text text-anchor="start" x="2611.25" y="-72.2" font-family="Times,serif" font-size="14.00">Season</text>
<polyline fill="none" stroke="black" points="2603.25,-64.25 2668.75,-64.25"/>
<polyline fill="none" stroke="black" points="2603.25,-64.25 2668.75,-64.25"/>
<text text-anchor="start" x="2631.88" y="-46.95" font-family="Times,serif" font-size="14.00"> </text>
</g>
<!-- taxonomy.Season&#45;&gt;taxonomy.Taxonomy -->
<g id="edge45" class="edge">
<title>taxonomy.Season&#45;&gt;taxonomy.Taxonomy</title>
<path fill="none" stroke="black" d="M2621.95,-89.84C2614.41,-102.06 2604.53,-116.69 2594,-128.5 2558.46,-168.37 2512.26,-207.08 2475.7,-235.33"/>
<polygon fill="none" stroke="black" points="2473.63,-232.5 2467.82,-241.36 2477.89,-238.05 2473.63,-232.5"/>
</g>
<!-- asset.Seed -->
<g id="node53" class="node">
<title>asset.Seed</title>
<polygon fill="none" stroke="black" points="1824.25,-17.75 1824.25,-110.75 2021.75,-110.75 2021.75,-17.75 1824.25,-17.75"/>
<text text-anchor="start" x="1906.5" y="-93.45" font-family="Times,serif" font-size="14.00">Seed</text>
<polyline fill="none" stroke="black" points="1824.25,-85.5 2021.75,-85.5"/>
<text text-anchor="start" x="1832.25" y="-68.2" font-family="Times,serif" font-size="14.00">crop : RelationField</text>
<text text-anchor="start" x="1832.25" y="-50.95" font-family="Times,serif" font-size="14.00">season : RelationField</text>
<polyline fill="none" stroke="black" points="1824.25,-43 2021.75,-43"/>
<text text-anchor="start" x="1918.88" y="-25.7" font-family="Times,serif" font-size="14.00"> </text>
</g>
<!-- asset.Seed&#45;&gt;asset.Asset -->
<g id="edge11" class="edge">
<title>asset.Seed&#45;&gt;asset.Asset</title>
<path fill="none" stroke="black" d="M1849.51,-111.24C1838.17,-117.47 1826.42,-123.44 1815,-128.5 1698.29,-180.16 1558.49,-221.88 1459.58,-248.28"/>
<polygon fill="none" stroke="black" points="1458.87,-244.84 1450.1,-250.79 1460.66,-251.61 1458.87,-244.84"/>
</g>
<!-- log.Seeding -->
<g id="node54" class="node">
<title>log.Seeding</title>
<polygon fill="none" stroke="black" points="656.12,-39 656.12,-89.5 729.88,-89.5 729.88,-39 656.12,-39"/>
<text text-anchor="start" x="664.12" y="-72.2" font-family="Times,serif" font-size="14.00">Seeding</text>
<polyline fill="none" stroke="black" points="656.12,-64.25 729.88,-64.25"/>
<polyline fill="none" stroke="black" points="656.12,-64.25 729.88,-64.25"/>
<text text-anchor="start" x="688.88" y="-46.95" font-family="Times,serif" font-size="14.00"> </text>
</g>
<!-- log.Seeding&#45;&gt;log.Log -->
<g id="edge27" class="edge">
<title>log.Seeding&#45;&gt;log.Log</title>
<path fill="none" stroke="black" d="M678.78,-89.77C670.61,-102.4 659.51,-117.43 647,-128.5 605.08,-165.59 552.53,-197.4 504.82,-222.12"/>
<polygon fill="none" stroke="black" points="503.38,-218.93 496.07,-226.6 506.57,-225.16 503.38,-218.93"/>
</g>
<!-- quantity.Standard -->
<g id="node55" class="node">
<title>quantity.Standard</title>
<polygon fill="none" stroke="black" points="3347,-39 3347,-89.5 3429,-89.5 3429,-39 3347,-39"/>
<text text-anchor="start" x="3355" y="-72.2" font-family="Times,serif" font-size="14.00">Standard</text>
<polyline fill="none" stroke="black" points="3347,-64.25 3429,-64.25"/>
<polyline fill="none" stroke="black" points="3347,-64.25 3429,-64.25"/>
<text text-anchor="start" x="3383.88" y="-46.95" font-family="Times,serif" font-size="14.00"> </text>
</g>
<!-- quantity.Standard&#45;&gt;quantity.Quantity -->
<g id="edge33" class="edge">
<title>quantity.Standard&#45;&gt;quantity.Quantity</title>
<path fill="none" stroke="black" d="M3369.68,-89.85C3360.5,-101.8 3349.02,-116.2 3338,-128.5 3319.31,-149.36 3298.44,-170.96 3278.26,-191.09"/>
<polygon fill="none" stroke="black" points="3275.98,-188.42 3271.34,-197.95 3280.91,-193.39 3275.98,-188.42"/>
</g>
<!-- taxonomy.Unit -->
<g id="node57" class="node">
<title>taxonomy.Unit</title>
<polygon fill="none" stroke="black" points="2687,-39 2687,-89.5 2741,-89.5 2741,-39 2687,-39"/>
<text text-anchor="start" x="2697.5" y="-72.2" font-family="Times,serif" font-size="14.00">Unit</text>
<polyline fill="none" stroke="black" points="2687,-64.25 2741,-64.25"/>
<polyline fill="none" stroke="black" points="2687,-64.25 2741,-64.25"/>
<text text-anchor="start" x="2709.88" y="-46.95" font-family="Times,serif" font-size="14.00"> </text>
</g>
<!-- taxonomy.Unit&#45;&gt;taxonomy.Taxonomy -->
<g id="edge47" class="edge">
<title>taxonomy.Unit&#45;&gt;taxonomy.Taxonomy</title>
<path fill="none" stroke="black" d="M2703.83,-89.81C2697.71,-102.46 2688.97,-117.49 2678,-128.5 2631.92,-174.75 2568.77,-211.63 2515.9,-237.36"/>
<polygon fill="none" stroke="black" points="2514.68,-234.06 2507.18,-241.54 2517.71,-240.37 2514.68,-234.06"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 62 KiB

View File

@@ -0,0 +1,2 @@
#/bin/sh
pyreverse -o svg -p neofarm ../orm/*.py

View File

@@ -0,0 +1,67 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 12.1.2 (0)
-->
<!-- Title: packages_neofarm Pages: 1 -->
<svg width="338pt" height="116pt"
viewBox="0.00 0.00 337.62 116.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 112)">
<title>packages_neofarm</title>
<polygon fill="white" stroke="none" points="-4,4 -4,-112 333.62,-112 333.62,4 -4,4"/>
<!-- asset -->
<g id="node1" class="node">
<title>asset</title>
<polygon fill="none" stroke="black" points="57.25,-36 0,-36 0,0 57.25,0 57.25,-36"/>
<text text-anchor="middle" x="28.62" y="-13.32" font-family="Times,serif" font-size="14.00">asset</text>
</g>
<!-- my_meta -->
<g id="node3" class="node">
<title>my_meta</title>
<polygon fill="none" stroke="black" points="182.5,-108 108.75,-108 108.75,-72 182.5,-72 182.5,-108"/>
<text text-anchor="middle" x="145.62" y="-85.33" font-family="Times,serif" font-size="14.00">my_meta</text>
</g>
<!-- asset&#45;&gt;my_meta -->
<g id="edge1" class="edge">
<title>asset&#45;&gt;my_meta</title>
<path fill="none" stroke="black" d="M57.55,-36.3C72.59,-45.31 91.18,-56.43 107.4,-66.13"/>
<polygon fill="black" stroke="black" points="115.59,-71.03 104.69,-69.75 112.34,-69.09 107,-65.89 107,-65.89 107,-65.89 112.34,-69.09 109.31,-62.03 115.59,-71.03"/>
</g>
<!-- log -->
<g id="node2" class="node">
<title>log</title>
<polygon fill="none" stroke="black" points="129.62,-36 75.62,-36 75.62,0 129.62,0 129.62,-36"/>
<text text-anchor="middle" x="102.62" y="-13.32" font-family="Times,serif" font-size="14.00">log</text>
</g>
<!-- log&#45;&gt;my_meta -->
<g id="edge2" class="edge">
<title>log&#45;&gt;my_meta</title>
<path fill="none" stroke="black" d="M113.25,-36.3C118.1,-44.19 123.94,-53.7 129.32,-62.45"/>
<polygon fill="black" stroke="black" points="134.48,-70.86 125.41,-64.69 132.5,-67.64 129.25,-62.34 129.25,-62.34 129.25,-62.34 132.5,-67.64 133.08,-59.98 134.48,-70.86"/>
</g>
<!-- quantity -->
<g id="node4" class="node">
<title>quantity</title>
<polygon fill="none" stroke="black" points="229.62,-36 147.62,-36 147.62,0 229.62,0 229.62,-36"/>
<text text-anchor="middle" x="188.62" y="-13.32" font-family="Times,serif" font-size="14.00">quantity</text>
</g>
<!-- quantity&#45;&gt;my_meta -->
<g id="edge3" class="edge">
<title>quantity&#45;&gt;my_meta</title>
<path fill="none" stroke="black" d="M178,-36.3C173.15,-44.19 167.31,-53.7 161.93,-62.45"/>
<polygon fill="black" stroke="black" points="156.77,-70.86 158.17,-59.98 158.75,-67.64 162,-62.34 162,-62.34 162,-62.34 158.75,-67.64 165.84,-64.69 156.77,-70.86"/>
</g>
<!-- taxonomy -->
<g id="node5" class="node">
<title>taxonomy</title>
<polygon fill="none" stroke="black" points="329.62,-36 247.62,-36 247.62,0 329.62,0 329.62,-36"/>
<text text-anchor="middle" x="288.62" y="-13.32" font-family="Times,serif" font-size="14.00">taxonomy</text>
</g>
<!-- taxonomy&#45;&gt;my_meta -->
<g id="edge4" class="edge">
<title>taxonomy&#45;&gt;my_meta</title>
<path fill="none" stroke="black" d="M252.91,-36.48C234.08,-45.7 210.8,-57.1 190.74,-66.92"/>
<polygon fill="black" stroke="black" points="181.98,-71.2 188.98,-62.77 185.38,-69.54 190.96,-66.81 190.96,-66.81 190.96,-66.81 185.38,-69.54 192.94,-70.85 181.98,-71.2"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.4 KiB

45
neofarm/lib.py Normal file
View File

@@ -0,0 +1,45 @@
import requests
from oauthlib.oauth2 import BackendApplicationClient
from requests_oauthlib import OAuth2Session, OAuth2
import jsonapi_requests
from . orm.my_meta import MyMeta
# constants:
root_url = 'https://farmos.wagframe.duckdns.org/'
api_root = root_url + 'api/'
token_url = root_url + 'oauth/token/'
client_id = 'neofarm'
client_secret = 'Wk&%g#d8lYFUDrU7k7k%5ZS$V@hHauBq'
fetch_retries = 10;
def init_api():
client = BackendApplicationClient(client_id=client_id)
oauth_session = OAuth2Session(client=client)
for i in range(fetch_retries):
try:
token = oauth_session.fetch_token(
token_url = token_url,
client_id = client_id,
client_secret = client_secret
)
break
except:
print("Fehler bei Verbindung mit Server (wahrscheinlich DuckDns) probiere erneut...")
oauth = OAuth2(client_id=client_id, client=client, token=token)
api = jsonapi_requests.orm.OrmApi.config({
'API_ROOT': api_root,
'AUTH': oauth,
'TIMEOUT': 1,
})
jsonapi_requests.configuration.default = api
return api
api = init_api()
MyMeta.set_api(api)
# orm stuff classes imported here to allow inheritance from MyMeta
import neofarm.orm.log as Log
import neofarm.orm.asset as Asset
import neofarm.orm.quantity as Quantity
import neofarm.orm.taxonomy as Taxonomy

72
neofarm/orm/asset.py Normal file
View File

@@ -0,0 +1,72 @@
import jsonapi_requests
import neofarm.orm.log as Log
from . my_meta import MyMeta
class Asset(jsonapi_requests.orm.ApiModel):
class Meta(MyMeta):
type = 'asset'
name = jsonapi_requests.orm.AttributeField('name')
timestamp = jsonapi_requests.orm.AttributeField('timestamp')
location = jsonapi_requests.orm.RelationField('location')
def get_logs_of_type(self, type):
if not issubclass(type, Log.Log):
raise ValueError("type specified is not a type of log use for example: get_logs_of_type(Log.Harvest)")
logs = type.get_list()
related = []
for log in logs:
for asset in log.assets:
if asset.id == self.id:
related.append(log)
break;
return related
def get_inventory_logs_of_type(self, type):
if not issubclass(type, Log.Log):
raise ValueError("type specified is not a type of log use for example: get_logs_of_type(Log.Harvest)")
logs = type.get_list()
related = []
for log in logs:
for quantity in log.quantities:
if quantity.inventory_asset:
if quantity.inventory_asset.id == self.id:
related.append(log)
break;
return related
class Land(Asset):
class Meta(Asset.Meta):
name = 'land'
type, path = Asset.Meta.get_type_and_path(name)
json_geometry = jsonapi_requests.orm.AttributeField('intrinsic_geometry')
class Plant(Asset):
class Meta(Asset.Meta):
name = 'plant'
type, path = Asset.Meta.get_type_and_path(name)
crops = jsonapi_requests.orm.RelationField('plant_type')
seasons = jsonapi_requests.orm.RelationField('season')
class Equipment(Asset):
class Meta(Asset.Meta):
name = 'equipment'
type, path = Asset.Meta.get_type_and_path(name)
class Material(Asset):
class Meta(Asset.Meta):
name = 'material'
type, path = Asset.Meta.get_type_and_path(name)
crop = jsonapi_requests.orm.RelationField('material_type')
class Seed(Asset):
class Meta(Asset.Meta):
name = 'seed'
type, path = Asset.Meta.get_type_and_path(name)
crop = jsonapi_requests.orm.RelationField('plant_type')
season = jsonapi_requests.orm.RelationField('season')
class Product(Asset):
class Meta(Asset.Meta):
name = 'product'
type, path = Asset.Meta.get_type_and_path(name)
# do not rename to type as that will end in infinite recursion
product_type = jsonapi_requests.orm.RelationField('product_type')

59
neofarm/orm/log.py Normal file
View File

@@ -0,0 +1,59 @@
import jsonapi_requests
from . my_meta import MyMeta
class Log(jsonapi_requests.orm.ApiModel):
class Meta(MyMeta):
type = 'log'
name = jsonapi_requests.orm.AttributeField('name')
timestamp = jsonapi_requests.orm.AttributeField('timestamp')
isMovement = jsonapi_requests.orm.AttributeField('is_movement')
assets = jsonapi_requests.orm.RelationField('asset')
location = jsonapi_requests.orm.RelationField('location')
equipment = jsonapi_requests.orm.RelationField('equipment')
quantities = jsonapi_requests.orm.RelationField('quantity')
json_notes = jsonapi_requests.orm.AttributeField('notes')
@property
def notes(self):
return self.json_notes['value']
@property
def plant(self):
for asset in self.assets:
if asset.type == 'asset--plant':
return asset
class Activity(Log):
class Meta(Log.Meta):
name = 'activity'
type, path = Log.Meta.get_type_and_path(name)
class Maintenance(Log):
class Meta(Log.Meta):
name = 'maintenance'
type, path = Log.Meta.get_type_and_path(name)
class Purchase(Log):
class Meta(Log.Meta):
name = 'purchase'
type, path = Log.Meta.get_type_and_path(name)
class Seeding(Log):
class Meta(Log.Meta):
name = 'seeding'
type, path = Log.Meta.get_type_and_path(name)
class Input(Log):
class Meta(Log.Meta):
name = 'input'
type, path = Log.Meta.get_type_and_path(name)
class Medical(Log):
class Meta(Log.Meta):
name = 'medical'
type, path = Log.Meta.get_type_and_path(name)
class Harvest(Log):
class Meta(Log.Meta):
name = 'harvest'
type, path = Log.Meta.get_type_and_path(name)
class Sale(Log):
class Meta(Log.Meta):
name = 'sale'
type, path = Log.Meta.get_type_and_path(name)

10
neofarm/orm/my_meta.py Normal file
View File

@@ -0,0 +1,10 @@
api_path_separator = '/'
api_type_separator = '--'
class MyMeta:
@classmethod
def get_type_and_path(cls, name):
return (f"{cls.type}{api_type_separator}{name}", f"{cls.type}{api_path_separator}{name}")
@classmethod
def set_api(cls, api):
cls.api = api

41
neofarm/orm/quantity.py Normal file
View File

@@ -0,0 +1,41 @@
import jsonapi_requests
from . my_meta import MyMeta
class Quantity(jsonapi_requests.orm.ApiModel):
class Meta(MyMeta):
type = 'quantity'
measure = jsonapi_requests.orm.AttributeField('measure')
json_value = jsonapi_requests.orm.AttributeField('value')
units = jsonapi_requests.orm.RelationField('units')
inventory_adjustment = jsonapi_requests.orm.AttributeField('inventory_adjustment')
inventory_asset = jsonapi_requests.orm.RelationField('inventory_asset')
@property
def value(self):
return float(self.json_value['decimal'])
class Standard(Quantity):
class Meta(Quantity.Meta):
name = 'standard'
type, path = Quantity.Meta.get_type_and_path(name)
class Price(Quantity):
class Meta(Quantity.Meta):
name = 'price'
type, path = Quantity.Meta.get_type_and_path(name)
json_unit_price = jsonapi_requests.orm.AttributeField('unit_price')
json_total_price = jsonapi_requests.orm.AttributeField('total_price')
@property
def unit_price(self):
return float(self.json_unit_price['decimal'])
@property
def total_price(self):
return float(self.json_total_price['decimal'])
class Material(Quantity):
class Meta(Quantity.Meta):
name = 'material'
type, path = Quantity.Meta.get_type_and_path(name)
material_types = jsonapi_requests.orm.RelationField('material_type')

38
neofarm/orm/taxonomy.py Normal file
View File

@@ -0,0 +1,38 @@
import jsonapi_requests
from . my_meta import MyMeta
class Taxonomy(jsonapi_requests.orm.ApiModel):
class Meta(MyMeta):
type = 'taxonomy_term'
name = jsonapi_requests.orm.AttributeField('name')
class Crop(Taxonomy):
class Meta(Taxonomy.Meta):
name = 'crop_family'
type, path = Taxonomy.Meta.get_type_and_path(name)
class LogCategory(Taxonomy):
class Meta(Taxonomy.Meta):
name = 'log_category'
type, path = Taxonomy.Meta.get_type_and_path(name)
class MaterialType(Taxonomy):
class Meta(Taxonomy.Meta):
name = 'material_type'
type, path = Taxonomy.Meta.get_type_and_path(name)
class PlantType(Taxonomy):
class Meta(Taxonomy.Meta):
name = 'plant_type'
type, path = Taxonomy.Meta.get_type_and_path(name)
class ProductType(Taxonomy):
class Meta(Taxonomy.Meta):
name = 'product_type'
type, path = Taxonomy.Meta.get_type_and_path(name)
class Season(Taxonomy):
class Meta(Taxonomy.Meta):
name = 'season'
type, path = Taxonomy.Meta.get_type_and_path(name)
class Unit(Taxonomy):
class Meta(Taxonomy.Meta):
name = 'unit'
type, path = Taxonomy.Meta.get_type_and_path(name)

3333
reporting.ipynb Normal file

File diff suppressed because it is too large Load Diff

7
test.py Normal file
View File

@@ -0,0 +1,7 @@
liste = [1, 2, 3]
m = 1
print(liste[m])
for element in liste:
print(element)
for i in range(len(liste)):
print(liste[i])