Compare commits

...

33 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
13 changed files with 4598 additions and 2 deletions

3
.gitignore vendored
View File

@@ -177,5 +177,4 @@ profile_default/
ipython_config.py
# Remove previous ipynb_checkpoints
# git rm -r .ipynb_checkpoints/
# git rm -r .ipynb_checkpoints/

BIN
Datenmodell5.xlsx Normal file

Binary file not shown.

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])