add debug method to look for relevant paths, related to delta-barth/delta-barth-py#33

This commit is contained in:
2025-06-11 11:40:12 +02:00
parent fd86abd872
commit 3af9c4fc6d
3 changed files with 357 additions and 328 deletions
+148 -126
View File
@@ -88,6 +88,10 @@ namespace dopt.DeltaBarth
/// </summary>
protected dynamic pyModPipeline;
/// <summary>
/// Debug-Modul für Python-Umgebung
/// </summary>
protected dynamic pyDebug;
/// <summary>
/// Konstruktor der Plugin-Klasse.
/// Kann mit beliebigem Pfad zu einer Python-Runtime initialisiert werden.
/// </summary>
@@ -100,141 +104,159 @@ namespace dopt.DeltaBarth
{
pyModManagement = Py.Import("delta_barth.management");
pyModPipeline = Py.Import("delta_barth.pipelines");
pyDebug = Py.Import("delta_barth._debug");
}
}
/// <summary>
/// Initialisiert das Plugin mit allen relevanten Paramtern für die weitere Nutzung.
/// Diese Methode sollte nur einmal je Instanz genutzt werden.
/// Gibt Runtime-relevante Pfade in der Konsole aus
/// </summary>
/// <param name="datenPfad">Pfad zu einem Ordner, in dem Programmdaten ohne Bedenken dauerhaft abgelegt werden können.</param>
/// <param name="basisApiUrl">Basis-URL zum Zugriff auf die API. Dies muss eine vollständige URL sein inkl. der Route "/api".</param>
/// <param name="nutzername">Nutzername für die Datenbankanmeldung.</param>
/// <param name="passwort">Passwort für die Datenbankanmeldung.</param>
/// <param name="datenbank">Name der Datenbank, bei der die Anmeldung erfolgen soll.</param>
/// <param name="mandant">Mandant für die Datenbankanmeldung.</param>
public void Startup(string datenPfad, string basisApiUrl, string nutzername, string passwort, string datenbank, string mandant)
public string DebugCall()
{
AssertNotDisposed();
Setup(datenPfad, basisApiUrl);
SetzeNutzerdaten(nutzername, passwort, datenbank, mandant);
}
/// <summary>
/// Diese Methode erlaubt es, die relevanten Nutzerdaten zur Laufzeit des Plugins zu ändern.
/// Dies beinhaltet: Nutzername, Passwort, Datenbankname, Mandant
/// </summary>
/// <param name="nutzername">Nutzername für die Datenbankanmeldung.</param>
/// <param name="passwort">Passwort für die Datenbankanmeldung.</param>
/// <param name="datenbank">Name der Datenbank, bei der die Anmeldung erfolgen soll.</param>
/// <param name="mandant">Mandant für die Datenbankanmeldung.</param>
public void SetzeNutzerdaten(string nutzername, string passwort, string datenbank, string mandant)
{
AssertNotDisposed();
using (Py.GIL()) {
pyModManagement.set_credentials(nutzername, passwort, datenbank, mandant);
}
}
/// <summary>
/// Ausführung der Umsatzprognose-Pipeline mit Dummy-Daten.
/// Es werden keine API-Abrufe durchgeführt und somit auch keine Live-Daten genutzt.
/// </summary>
/// <param name="firmaId">optional: Firmen-ID, für die die Pipeline ausgeführt werden soll.
/// Wird der Parameter nicht zur Verfügung gestellt, werden alle Firmen bzw. Kunden abgerufen</param>
/// <param name="analyseBeginn">optional: Start-Datum, ab dem die Daten für die Erstellung des Prognosemodells genutzt werden.
/// Daten, die weiter in der Vergangenheit liegen, werden nicht berücksichtigt.
/// Wird der Parameter nicht zur Verfügung gestellt, wird die gesamte Historie genutzt.</param>
/// <returns cref="DataObjects.UmsatzPrognoseAusgabe">Umsatzprognose inkl. Status-Objekt zur Nachvollziehbarkeit etwaig aufgetretener Fehler.</returns>
/// <exception cref="PythonParsingException"></exception>
public DataObjects.UmsatzPrognoseAusgabe UmsatzprognoseDummy(int? firmaId, DateTime? analyseBeginn)
{
AssertNotDisposed();
string pyJson;
string infos;
using (Py.GIL())
{
pyJson = pyModPipeline.pipeline_sales_forecast_dummy(firmaId, analyseBeginn);
}
var parsed = JsonSerializer.Deserialize<DataObjects.UmsatzPrognoseAusgabe>(pyJson) ?? throw new PythonParsingException("Could not correctly parse object from Python");
return parsed;
}
/// <summary>
/// Ausführung der Umsatzprognose-Pipeline mit Live-Daten.
/// Es werden API-Abrufe durchgeführt und somit auch Live-Daten genutzt.
/// Hierfür muss sichergestellt sein, dass der API-Server erreichbar und abrufbereit ist.
/// </summary>
/// <param name="firmaIds">optional: Liste von Firmen-IDs, für die die Pipeline ausgeführt werden soll.
/// Wird der Parameter nicht zur Verfügung gestellt, werden alle Firmen bzw. Kunden abgerufen</param>
/// <param name="analyseBeginn">optional: Start-Datum, ab dem die Daten für die Erstellung des Prognosemodells genutzt werden.
/// Daten, die weiter in der Vergangenheit liegen, werden nicht berücksichtigt.
/// Wird der Parameter nicht zur Verfügung gestellt, wird die gesamte Historie genutzt.</param>
/// <returns cref="DataObjects.UmsatzPrognoseAusgabe">Umsatzprognose inkl. Status-Objekt zur Nachvollziehbarkeit etwaig aufgetretener Fehler.</returns>
/// <exception cref="PythonParsingException"></exception>
public DataObjects.UmsatzPrognoseAusgabe Umsatzprognose(List<int>? firmaIds, DateTime? analyseBeginn)
{
AssertNotDisposed();
string pyJson;
using (Py.GIL())
{
pyJson = pyModPipeline.pipeline_sales_forecast(firmaIds, analyseBeginn);
}
var parsed = JsonSerializer.Deserialize<DataObjects.UmsatzPrognoseAusgabe>(pyJson) ?? throw new PythonParsingException("Could not correctly parse object from Python");
return parsed;
}
/// <summary>
/// Setup der Python-internen Umgebung
/// </summary>
/// <param name="datenPfad">Pfad zu einem Ordner, in dem Programmdaten ohne Bedenken dauerhaft abgelegt werden können.</param>
/// <param name="basisApiUrl">Basis-URL zum Zugriff auf die API. Dies muss eine vollständige URL sein inkl. der Route "/api".</param>
protected void Setup(string datenPfad, string basisApiUrl)
{
AssertNotDisposed();
using (Py.GIL())
{
pyModManagement.setup(datenPfad, basisApiUrl);
}
}
/// <summary>
/// Hole die konfigurierte API-Basis-URL aus der Python-Umgebung
/// </summary>
/// <returns>konfigurierte Basis-URL</returns>
protected string GetBaseApiUrl()
{
AssertNotDisposed();
string pyJson;
using (Py.GIL())
{
pyJson = (string)pyModManagement.get_base_url();
}
return pyJson;
}
/// <summary>
/// Hole den konfigurierten Datenpfad zur Dateiverwaltung aus der Python-Umgebung
/// </summary>
/// <returns>konfigurierten Datenpfad</returns>
protected string GetDataPath()
{
AssertNotDisposed();
string pyJson;
using (Py.GIL())
{
pyJson = (string)pyModManagement.get_data_path();
}
return pyJson;
}
/// <summary>
/// Hole die konfigurierten Nutzerdaten zur API-Interaktion aus der Python-Umgebung
/// </summary>
/// <returns cref="DataObjects.Credentials">konfigurierte Nutzerdaten</returns>
/// <exception cref="PythonParsingException"></exception>
protected DataObjects.Credentials GetCredentials()
{
AssertNotDisposed();
string pyJson;
using (Py.GIL())
{
pyJson = (string)pyModManagement.get_credentials();
infos = pyDebug.print_infos();
}
Console.WriteLine(infos);
Console.WriteLine($"PyEngine - PYHOME: {PythonEngine.PythonHome}");
Console.WriteLine($"PyEngine - PYPATH: {PythonEngine.PythonPath}");
DataObjects.Credentials? parsed = JsonSerializer.Deserialize<DataObjects.Credentials>(pyJson);
return parsed ?? throw new PythonParsingException("Could not correctly parse object from Python");
return infos;
}
///// <summary>
///// Initialisiert das Plugin mit allen relevanten Paramtern für die weitere Nutzung.
///// Diese Methode sollte nur einmal je Instanz genutzt werden.
///// </summary>
///// <param name="datenPfad">Pfad zu einem Ordner, in dem Programmdaten ohne Bedenken dauerhaft abgelegt werden können.</param>
///// <param name="basisApiUrl">Basis-URL zum Zugriff auf die API. Dies muss eine vollständige URL sein inkl. der Route "/api".</param>
///// <param name="nutzername">Nutzername für die Datenbankanmeldung.</param>
///// <param name="passwort">Passwort für die Datenbankanmeldung.</param>
///// <param name="datenbank">Name der Datenbank, bei der die Anmeldung erfolgen soll.</param>
///// <param name="mandant">Mandant für die Datenbankanmeldung.</param>
//public void Startup(string datenPfad, string basisApiUrl, string nutzername, string passwort, string datenbank, string mandant)
//{
// AssertNotDisposed();
// Setup(datenPfad, basisApiUrl);
// SetzeNutzerdaten(nutzername, passwort, datenbank, mandant);
//}
///// <summary>
///// Diese Methode erlaubt es, die relevanten Nutzerdaten zur Laufzeit des Plugins zu ändern.
///// Dies beinhaltet: Nutzername, Passwort, Datenbankname, Mandant
///// </summary>
///// <param name="nutzername">Nutzername für die Datenbankanmeldung.</param>
///// <param name="passwort">Passwort für die Datenbankanmeldung.</param>
///// <param name="datenbank">Name der Datenbank, bei der die Anmeldung erfolgen soll.</param>
///// <param name="mandant">Mandant für die Datenbankanmeldung.</param>
//public void SetzeNutzerdaten(string nutzername, string passwort, string datenbank, string mandant)
//{
// AssertNotDisposed();
// using (Py.GIL()) {
// pyModManagement.set_credentials(nutzername, passwort, datenbank, mandant);
// }
//}
///// <summary>
///// Ausführung der Umsatzprognose-Pipeline mit Dummy-Daten.
///// Es werden keine API-Abrufe durchgeführt und somit auch keine Live-Daten genutzt.
///// </summary>
///// <param name="firmaId">optional: Firmen-ID, für die die Pipeline ausgeführt werden soll.
///// Wird der Parameter nicht zur Verfügung gestellt, werden alle Firmen bzw. Kunden abgerufen</param>
///// <param name="analyseBeginn">optional: Start-Datum, ab dem die Daten für die Erstellung des Prognosemodells genutzt werden.
///// Daten, die weiter in der Vergangenheit liegen, werden nicht berücksichtigt.
///// Wird der Parameter nicht zur Verfügung gestellt, wird die gesamte Historie genutzt.</param>
///// <returns cref="DataObjects.UmsatzPrognoseAusgabe">Umsatzprognose inkl. Status-Objekt zur Nachvollziehbarkeit etwaig aufgetretener Fehler.</returns>
///// <exception cref="PythonParsingException"></exception>
//public DataObjects.UmsatzPrognoseAusgabe UmsatzprognoseDummy(int? firmaId, DateTime? analyseBeginn)
//{
// AssertNotDisposed();
// string pyJson;
// using (Py.GIL())
// {
// pyJson = pyModPipeline.pipeline_sales_forecast_dummy(firmaId, analyseBeginn);
// }
// var parsed = JsonSerializer.Deserialize<DataObjects.UmsatzPrognoseAusgabe>(pyJson) ?? throw new PythonParsingException("Could not correctly parse object from Python");
// return parsed;
//}
///// <summary>
///// Ausführung der Umsatzprognose-Pipeline mit Live-Daten.
///// Es werden API-Abrufe durchgeführt und somit auch Live-Daten genutzt.
///// Hierfür muss sichergestellt sein, dass der API-Server erreichbar und abrufbereit ist.
///// </summary>
///// <param name="firmaIds">optional: Liste von Firmen-IDs, für die die Pipeline ausgeführt werden soll.
///// Wird der Parameter nicht zur Verfügung gestellt, werden alle Firmen bzw. Kunden abgerufen</param>
///// <param name="analyseBeginn">optional: Start-Datum, ab dem die Daten für die Erstellung des Prognosemodells genutzt werden.
///// Daten, die weiter in der Vergangenheit liegen, werden nicht berücksichtigt.
///// Wird der Parameter nicht zur Verfügung gestellt, wird die gesamte Historie genutzt.</param>
///// <returns cref="DataObjects.UmsatzPrognoseAusgabe">Umsatzprognose inkl. Status-Objekt zur Nachvollziehbarkeit etwaig aufgetretener Fehler.</returns>
///// <exception cref="PythonParsingException"></exception>
//public DataObjects.UmsatzPrognoseAusgabe Umsatzprognose(List<int>? firmaIds, DateTime? analyseBeginn)
//{
// AssertNotDisposed();
// string pyJson;
// using (Py.GIL())
// {
// pyJson = pyModPipeline.pipeline_sales_forecast(firmaIds, analyseBeginn);
// }
// var parsed = JsonSerializer.Deserialize<DataObjects.UmsatzPrognoseAusgabe>(pyJson) ?? throw new PythonParsingException("Could not correctly parse object from Python");
// return parsed;
//}
///// <summary>
///// Setup der Python-internen Umgebung
///// </summary>
///// <param name="datenPfad">Pfad zu einem Ordner, in dem Programmdaten ohne Bedenken dauerhaft abgelegt werden können.</param>
///// <param name="basisApiUrl">Basis-URL zum Zugriff auf die API. Dies muss eine vollständige URL sein inkl. der Route "/api".</param>
//protected void Setup(string datenPfad, string basisApiUrl)
//{
// AssertNotDisposed();
// using (Py.GIL())
// {
// pyModManagement.setup(datenPfad, basisApiUrl);
// }
//}
///// <summary>
///// Hole die konfigurierte API-Basis-URL aus der Python-Umgebung
///// </summary>
///// <returns>konfigurierte Basis-URL</returns>
//protected string GetBaseApiUrl()
//{
// AssertNotDisposed();
// string pyJson;
// using (Py.GIL())
// {
// pyJson = (string)pyModManagement.get_base_url();
// }
// return pyJson;
//}
///// <summary>
///// Hole den konfigurierten Datenpfad zur Dateiverwaltung aus der Python-Umgebung
///// </summary>
///// <returns>konfigurierten Datenpfad</returns>
//protected string GetDataPath()
//{
// AssertNotDisposed();
// string pyJson;
// using (Py.GIL())
// {
// pyJson = (string)pyModManagement.get_data_path();
// }
// return pyJson;
//}
///// <summary>
///// Hole die konfigurierten Nutzerdaten zur API-Interaktion aus der Python-Umgebung
///// </summary>
///// <returns cref="DataObjects.Credentials">konfigurierte Nutzerdaten</returns>
///// <exception cref="PythonParsingException"></exception>
//protected DataObjects.Credentials GetCredentials()
//{
// AssertNotDisposed();
// string pyJson;
// using (Py.GIL())
// {
// pyJson = (string)pyModManagement.get_credentials();
// }
// DataObjects.Credentials? parsed = JsonSerializer.Deserialize<DataObjects.Credentials>(pyJson);
// return parsed ?? throw new PythonParsingException("Could not correctly parse object from Python");
//}
}
}
+1 -1
View File
@@ -6,7 +6,7 @@
<Nullable>enable</Nullable>
<PlatformTarget>x64</PlatformTarget>
<Platforms>x64</Platforms>
<Version>0.4.0</Version>
<Version>0.4.1-alpha1</Version>
<GenerateDocumentationFile>True</GenerateDocumentationFile>
</PropertyGroup>