mirror of
https://github.com/fhswf/aki_prj23_transparenzregister.git
synced 2025-04-22 22:22:54 +02:00
Added a test-db.drawio diagram
This commit is contained in:
parent
27a6bce545
commit
a833439ba7
@ -1,3 +1,154 @@
|
||||
### Database Generator (Philipp Horstenkamp)
|
||||
|
||||
Zur Definition eines Relationalen Datenbankschemas und zur Interation mit der
|
||||
Zur Definition eines Relationalen Datenbankschemas und um zur Härtung gegen SQL-Injections wurde SQLAlchemy als SQL Interface / Driver / Abstraction layer genutzt.
|
||||
SQLAlchemy sorgt dabei für ein stark dialekt unabhängiges Interface.
|
||||
|
||||
Auch wenn es seit einiger Zeit SQLAlchemy2 gibt haben wir uns entschieden mit Version 1.4 zu nutzen da es zur Version 2 nur wenig Dokumentation externe Dokumentation und Beispiele gab.
|
||||
SQLAlchemy ist ein sehr mächtiges und beliebtes Werkzeug, leider ist die Projektdokumentation sehr undurchsichtig.
|
||||
Da aber SQLAlchemy1.4 zurzeit noch gewartet wird, ist dies für dieses Projekt kein Problem.
|
||||
|
||||
Hier ein kurzes Beipiel einer SQL-defintion via SQLAlchemy.
|
||||
|
||||
|
||||
Dynamicly generated
|
||||
|
||||
```python
|
||||
AnnualFinanceStatement = type(
|
||||
"AnnualFinanceStatement",
|
||||
(Base,),
|
||||
{
|
||||
"__tablename__": "annual_finance_statement",
|
||||
"id": sa.Column(sa.Integer, primary_key=True),
|
||||
"company_id": sa.Column(sa.Integer, sa.ForeignKey("company.id")),
|
||||
"date": sa.Column(sa.Date, nullable=False),
|
||||
}
|
||||
| {_.value: sa.Column(sa.Float, default="NaN") for _ in FinancialKPIEnum},
|
||||
)
|
||||
```
|
||||
|
||||
```{eval-rst}
|
||||
.. drawio-figure:: test-db.drawio
|
||||
:format: png
|
||||
:page-index: 1
|
||||
```
|
||||
|
||||
```{mermaid}
|
||||
classDiagram
|
||||
direction BT
|
||||
class annual_finance_statement {
|
||||
integer company_id
|
||||
date date
|
||||
float revenue
|
||||
float net_income
|
||||
float ebit
|
||||
float ebitda
|
||||
float gross_profit
|
||||
float operating_profit
|
||||
float assets
|
||||
float liabilities
|
||||
float equity
|
||||
float current_assets
|
||||
float current_liabilities
|
||||
float long_term_debt
|
||||
float short_term_debt
|
||||
float cash_and_cash_equivalents
|
||||
float dividends
|
||||
float cash_flow
|
||||
integer id
|
||||
}
|
||||
class company {
|
||||
varchar hr
|
||||
integer court_id
|
||||
varchar(150) name
|
||||
varchar(26) company_type
|
||||
date founding_date
|
||||
varchar business_purpose
|
||||
varchar(100) street
|
||||
varchar(30) house_number
|
||||
varchar(5) zip_code
|
||||
varchar(100) city
|
||||
float longitude
|
||||
float latitude
|
||||
float pos_accuracy
|
||||
float capital_value
|
||||
varchar(13) original_currency
|
||||
varchar(12) capital_type
|
||||
date last_update
|
||||
varchar(100) sector
|
||||
integer id
|
||||
}
|
||||
class district_court {
|
||||
varchar(100) city
|
||||
varchar(100) name
|
||||
integer id
|
||||
}
|
||||
class news {
|
||||
varchar(150) title
|
||||
datetime timestamp
|
||||
varchar text
|
||||
varchar source_url
|
||||
varchar source_domain
|
||||
varchar(8) overall_sentiment_label
|
||||
float overall_sentiment_certainty
|
||||
integer number_of_companies
|
||||
integer sum_of_times_named
|
||||
integer id
|
||||
}
|
||||
class person {
|
||||
varchar(100) firstname
|
||||
varchar(100) lastname
|
||||
date date_of_birth
|
||||
varchar(100) works_for
|
||||
varchar(100) street
|
||||
varchar(10) house_number
|
||||
varchar(5) zip_code
|
||||
varchar(100) city
|
||||
float longitude
|
||||
float latitude
|
||||
float pos_accuracy
|
||||
integer id
|
||||
}
|
||||
class relation {
|
||||
integer company_id
|
||||
date date_from
|
||||
date date_to
|
||||
varchar(24) relation
|
||||
integer id
|
||||
}
|
||||
class company_relation {
|
||||
integer company2_id
|
||||
integer id
|
||||
}
|
||||
class person_relation {
|
||||
integer person_id
|
||||
integer id
|
||||
}
|
||||
class sentiment {
|
||||
integer company_id
|
||||
integer article_id
|
||||
integer times_named
|
||||
varchar(8) specific_sentiment_label
|
||||
float specific_sentiment_score
|
||||
integer id
|
||||
}
|
||||
|
||||
class missing_company {
|
||||
varchar(5) zip_code
|
||||
varchar(100) city
|
||||
integer number_of_links
|
||||
boolean searched_for
|
||||
varchar(150) name
|
||||
}
|
||||
|
||||
|
||||
annual_finance_statement --> company : company_id->id
|
||||
company --> district_court : court_id->id
|
||||
company_relation --> company : company2_id->id
|
||||
company_relation --> relation : id
|
||||
person_relation --> person : person_id -> id
|
||||
person_relation --> relation : id
|
||||
relation --> company : company_id -> id
|
||||
sentiment --> company : company_id -> id
|
||||
sentiment --> news : article_id -> id
|
||||
|
||||
```
|
||||
|
@ -0,0 +1,140 @@
|
||||
<mxfile host="Electron" modified="2023-12-28T23:56:10.064Z" agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/21.7.5 Chrome/114.0.5735.289 Electron/25.8.1 Safari/537.36" version="21.7.5" etag="c6GnFWleMcZyy7GyK6ET" type="device">
|
||||
<diagram id="jjorYr7iqQ5mkkBvd20T" name="Seite-1">
|
||||
<mxGraphModel dx="2351" dy="1374" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="0" pageScale="1" pageWidth="827" pageHeight="1169" background="none" math="0" shadow="0">
|
||||
<root>
|
||||
<mxCell id="0" />
|
||||
<mxCell id="1" parent="0" />
|
||||
<mxCell id="node4" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>annual_finance_statement</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> company_id: integer<br/> date: date<br/> revenue: float<br/> net_income: float<br/> ebit: float<br/> ebitda: float<br/> gross_profit: float<br/> operating_profit: float<br/> assets: float<br/> liabilities: float<br/> equity: float<br/> current_assets: float<br/> current_liabilities: float<br/> long_term_debt: float<br/> short_term_debt: float<br/> cash_and_cash_equivalents: float<br/> dividends: float<br/> cash_flow: float</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> id: integer</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" parent="1" vertex="1">
|
||||
<mxGeometry x="169" y="918" width="254" height="477" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="node3" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>company</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> hr: varchar<br/> court_id: integer<br/> name: varchar(150)<br/> company_type: varchar(26)<br/> founding_date: date<br/> business_purpose: varchar<br/> street: varchar(100)<br/> house_number: varchar(30)<br/> zip_code: varchar(5)<br/> city: varchar(100)<br/> longitude: float<br/> latitude: float<br/> pos_accuracy: float<br/> capital_value: float<br/> original_currency: varchar(13)<br/> capital_type: varchar(12)<br/> last_update: date<br/> sector: varchar(100)</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> id: integer</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" parent="1" vertex="1">
|
||||
<mxGeometry x="250" y="120" width="212" height="477" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="node0" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>company_relation</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> company2_id: integer</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> id: integer</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" parent="1" vertex="1">
|
||||
<mxGeometry x="403" y="1513" width="186" height="93" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="node7" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>district_court</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> city: varchar(100)<br/> name: varchar(100)</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> id: integer</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" parent="1" vertex="1">
|
||||
<mxGeometry x="281" y="-238" width="150" height="118" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="node2" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>missing_company</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> zip_code: varchar(5)<br/> city: varchar(100)<br/> number_of_links: integer<br/> searched_for: boolean</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> name: varchar(150)</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" parent="1" vertex="1">
|
||||
<mxGeometry x="-20" y="-70" width="185" height="155" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="node10" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>news</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> title: varchar(150)<br/> timestamp: datetime<br/> text: varchar<br/> source_url: varchar<br/> source_domain: varchar<br/> overall_sentiment_label: varchar(8)<br/> overall_sentiment_certainty: float<br/> number_of_companies: integer<br/> sum_of_times_named: integer</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> id: integer</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" parent="1" vertex="1">
|
||||
<mxGeometry x="-50" y="200" width="245" height="270" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="node8" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>person</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> firstname: varchar(100)<br/> lastname: varchar(100)<br/> date_of_birth: date<br/> works_for: varchar(100)<br/> street: varchar(100)<br/> house_number: varchar(10)<br/> zip_code: varchar(5)<br/> city: varchar(100)<br/> longitude: float<br/> latitude: float<br/> pos_accuracy: float</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> id: integer</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" parent="1" vertex="1">
|
||||
<mxGeometry x="-123" y="998" width="199" height="316" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="node1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>person_relation</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> person_id: integer</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> id: integer</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" parent="1" vertex="1">
|
||||
<mxGeometry x="-67" y="1513" width="167" height="93" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="node9" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>relation</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> company_id: integer<br/> date_from: date<br/> date_to: date<br/> relation: varchar(24)</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> id: integer</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" parent="1" vertex="1">
|
||||
<mxGeometry x="379" y="719" width="155" height="155" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="node6" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>sentiment</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> company_id: integer<br/> article_id: integer<br/> times_named: integer<br/> specific_sentiment_label: varchar(8)<br/> specific_sentiment_score: float</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> id: integer</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" parent="1" vertex="1">
|
||||
<mxGeometry x="10" y="707" width="252" height="178" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="edge7" value="" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=0;startArrow=none;endArrow=block;endSize=12;strokeColor=#595959;exitX=0.500;exitY=0.000;exitDx=0;exitDy=0;entryX=0.250;entryY=1.000;entryDx=0;entryDy=0;" parent="1" source="node4" target="node3" edge="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<Array as="points">
|
||||
<mxPoint x="296" y="636" />
|
||||
<mxPoint x="303" y="636" />
|
||||
</Array>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="edge2" value="" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=0;startArrow=none;endArrow=block;endSize=12;strokeColor=#595959;exitX=0.500;exitY=0.000;exitDx=0;exitDy=0;entryX=0.500;entryY=1.000;entryDx=0;entryDy=0;" parent="1" source="node3" target="node7" edge="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<Array as="points" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="label14" value="court_id:id" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" parent="edge2" vertex="1" connectable="0">
|
||||
<mxGeometry x="295" y="-6" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="edge1" value="" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=0;startArrow=none;endArrow=block;endSize=12;strokeColor=#595959;exitX=0.750;exitY=0.000;exitDx=0;exitDy=0;entryX=0.750;entryY=1.000;entryDx=0;entryDy=0;" parent="1" source="node0" target="node3" edge="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<Array as="points">
|
||||
<mxPoint x="543" y="1476" />
|
||||
<mxPoint x="556" y="1476" />
|
||||
<mxPoint x="556" y="656" />
|
||||
<mxPoint x="409" y="656" />
|
||||
</Array>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="label8" value="company2_id:id" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" parent="edge1" vertex="1" connectable="0">
|
||||
<mxGeometry x="465" y="1056" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="edge0" value="" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=0;startArrow=none;endArrow=block;endSize=12;strokeColor=#595959;exitX=0.250;exitY=0.000;exitDx=0;exitDy=0;entryX=0.500;entryY=1.000;entryDx=0;entryDy=0;" parent="1" source="node0" target="node9" edge="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<Array as="points">
|
||||
<mxPoint x="450" y="1476" />
|
||||
<mxPoint x="456" y="1476" />
|
||||
</Array>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="label2" value="id" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" parent="edge0" vertex="1" connectable="0">
|
||||
<mxGeometry x="436" y="1485" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="edge5" value="" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=0;startArrow=none;endArrow=block;endSize=12;strokeColor=#595959;exitX=0.250;exitY=0.000;exitDx=0;exitDy=0;entryX=0.500;entryY=1.000;entryDx=0;entryDy=0;" parent="1" source="node1" target="node8" edge="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<Array as="points">
|
||||
<mxPoint x="-26" y="1476" />
|
||||
<mxPoint x="-24" y="1476" />
|
||||
</Array>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="label32" value="person_id:id" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" parent="edge5" vertex="1" connectable="0">
|
||||
<mxGeometry x="-99" y="1466" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="edge4" value="" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=0;startArrow=none;endArrow=block;endSize=12;strokeColor=#595959;exitX=0.750;exitY=0.000;exitDx=0;exitDy=0;entryX=0.500;entryY=1.000;entryDx=0;entryDy=0;" parent="1" source="node1" target="node9" edge="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<Array as="points">
|
||||
<mxPoint x="58" y="1476" />
|
||||
<mxPoint x="456" y="1476" />
|
||||
</Array>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="label26" value="id" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" parent="edge4" vertex="1" connectable="0">
|
||||
<mxGeometry x="250" y="1456" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="edge8" value="" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=0;startArrow=none;endArrow=block;endSize=12;strokeColor=#595959;exitX=0.500;exitY=0.000;exitDx=0;exitDy=0;entryX=0.250;entryY=1.000;entryDx=0;entryDy=0;" parent="1" source="node9" target="node3" edge="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<Array as="points">
|
||||
<mxPoint x="456" y="676" />
|
||||
<mxPoint x="296" y="676" />
|
||||
<mxPoint x="296" y="636" />
|
||||
<mxPoint x="303" y="636" />
|
||||
</Array>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="label50" value="company_id:id" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" parent="edge8" vertex="1" connectable="0">
|
||||
<mxGeometry x="212" y="646" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="edge3" value="" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=0;startArrow=none;endArrow=block;endSize=12;strokeColor=#595959;exitX=0.750;exitY=0.000;exitDx=0;exitDy=0;entryX=0.250;entryY=1.000;entryDx=0;entryDy=0;" parent="1" source="node6" target="node3" edge="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<Array as="points">
|
||||
<mxPoint x="199" y="676" />
|
||||
<mxPoint x="296" y="676" />
|
||||
<mxPoint x="296" y="636" />
|
||||
<mxPoint x="303" y="636" />
|
||||
</Array>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="label20" value="company_id:id" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" parent="edge3" vertex="1" connectable="0">
|
||||
<mxGeometry x="212" y="646" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="edge6" value="" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=0;startArrow=none;endArrow=block;endSize=12;strokeColor=#595959;exitX=0.250;exitY=0.000;exitDx=0;exitDy=0;entryX=0.500;entryY=1.000;entryDx=0;entryDy=0;" parent="1" edge="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<Array as="points">
|
||||
<mxPoint x="87" y="676" />
|
||||
</Array>
|
||||
<mxPoint x="87" y="707" as="sourcePoint" />
|
||||
<mxPoint x="86.5" y="470" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="label38" value="article_id:id" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" parent="edge6" vertex="1" connectable="0">
|
||||
<mxGeometry x="6" y="666" as="geometry" />
|
||||
</mxCell>
|
||||
</root>
|
||||
</mxGraphModel>
|
||||
</diagram>
|
||||
</mxfile>
|
@ -47,6 +47,8 @@ Diese sind, um Industriestandards zu entsprechen, auf Englisch gehalten.
|
||||
:numbered:
|
||||
|
||||
Ergebnisse/Abschlussbericht_und_Praesentation/PhHo/05-DEV-OPS
|
||||
Ergebnisse/Abschlussbericht_und_Praesentation/PhHo/4-4-2-database-generator
|
||||
|
||||
|
||||
.. .. toctree::
|
||||
:glob:
|
||||
|
Loading…
x
Reference in New Issue
Block a user