main.py 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. import os
  2. from pathlib import Path
  3. import typer
  4. from archive_logs import run as run_archive_logs
  5. from clients import run
  6. from files import run as run_files
  7. from move_files import default_desktop, move_files
  8. from summary import run as run_summary
  9. app = typer.Typer(help="PC-Visit Filetracker")
  10. DATA_DIRECTORY = Path("data")
  11. def default_session_history() -> Path:
  12. user_profile = Path(os.environ.get("USERPROFILE", str(Path.home())))
  13. return user_profile / "AppData" / "Roaming" / "pcvisit Data" / "Session History"
  14. @app.callback(invoke_without_command=True)
  15. def app_callback(context: typer.Context) -> None:
  16. """Verwalten der PC-Visit-Filetracker-Befehle."""
  17. if context.invoked_subcommand is None:
  18. typer.echo(context.get_help())
  19. @app.command()
  20. def clients(
  21. directory: Path | None = typer.Argument(None, help="Verzeichnis mit XML-Dateien"),
  22. output: Path = typer.Option(DATA_DIRECTORY / "clients.csv", "--output", "-o", help="Zielpfad der CSV-Datei"),
  23. ) -> None:
  24. """Importiert Client-Daten aus Session-XML-Dateien."""
  25. directory = directory or default_session_history()
  26. try:
  27. xml_count, row_count = run(directory, output)
  28. except ValueError as error:
  29. raise typer.BadParameter(str(error), param_hint="directory") from error
  30. typer.echo(f"{xml_count} XML-Dateien gelesen, {row_count} Einträge nach {output} geschrieben.")
  31. @app.command()
  32. def files(
  33. directory: Path | None = typer.Argument(None, help="Verzeichnis mit XML-Dateien"),
  34. output: Path = typer.Option(DATA_DIRECTORY / "files.csv", "--output", "-o", help="Zielpfad der CSV-Datei"),
  35. ignore_timestamp: bool = typer.Option(
  36. False,
  37. "--ignore-timestamp",
  38. help="Ignoriert den Abgleich des Erstellungsdatums mit der Session.",
  39. ),
  40. ) -> None:
  41. """Importiert vorhandene Dateien aus ReceivedFile-Elementen."""
  42. directory = directory or default_session_history()
  43. try:
  44. xml_count, row_count = run_files(directory, output, ignore_timestamp=ignore_timestamp)
  45. except ValueError as error:
  46. raise typer.BadParameter(str(error), param_hint="directory") from error
  47. typer.echo(f"{xml_count} XML-Dateien gelesen, {row_count} vorhandene Dateien nach {output} geschrieben.")
  48. @app.command("move-files")
  49. def move_files_command(
  50. files_csv: Path = typer.Option(
  51. DATA_DIRECTORY / "files.csv", "--files-csv", help="CSV-Datei mit den gefundenen Dateien"
  52. ),
  53. clients_csv: Path = typer.Option(DATA_DIRECTORY / "clients.csv", "--clients-csv", help="CSV-Datei mit den Kunden"),
  54. desktop: Path | None = typer.Option(None, "--desktop", help="Desktop-Verzeichnis als Zielbasis"),
  55. ) -> None:
  56. """Verschiebt gefundene Dateien in Desktop/PC-Visit/Kunde."""
  57. try:
  58. moved_count, skipped_count, missing_client_count = move_files(
  59. files_csv, clients_csv, desktop or default_desktop()
  60. )
  61. except ValueError as error:
  62. raise typer.BadParameter(str(error)) from error
  63. typer.echo(
  64. f"{moved_count} Dateien verschoben, {skipped_count} übersprungen, " f"{missing_client_count} ohne Kunde."
  65. )
  66. @app.command("archive-logs")
  67. def archive_logs(
  68. directory: Path | None = typer.Argument(None, help="Verzeichnis mit XML-Dateien"),
  69. ) -> None:
  70. """Archiviert Session-XML-Dateien nach Jahr."""
  71. directory = directory or default_session_history()
  72. try:
  73. checked_count, archived_count, skipped_count = run_archive_logs(directory)
  74. except ValueError as error:
  75. raise typer.BadParameter(str(error), param_hint="directory") from error
  76. typer.echo(f"{checked_count} XML-Dateien geprüft, {archived_count} archiviert, " f"{skipped_count} übersprungen.")
  77. @app.command()
  78. def summary(
  79. directory: Path | None = typer.Argument(None, help="Verzeichnis mit XML-Dateien"),
  80. output: Path = typer.Option(DATA_DIRECTORY / "summary.csv", "--output", "-o", help="Zielpfad der CSV-Datei"),
  81. ) -> None:
  82. """Erstellt eine Sitzungs- und Dauersumme pro Kunde."""
  83. directory = directory or default_session_history()
  84. try:
  85. xml_count, customer_count = run_summary(directory, output)
  86. except ValueError as error:
  87. raise typer.BadParameter(str(error), param_hint="directory") from error
  88. typer.echo(f"{xml_count} XML-Dateien geprüft, {customer_count} Kunden nach {output} geschrieben.")
  89. if __name__ == "__main__":
  90. app()