114 lines
3.8 KiB
Python
Executable File
114 lines
3.8 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
# Steuerpanel: bleibt offen, bis das Fenster geschlossen wird.
|
|
import os
|
|
import shlex
|
|
import subprocess
|
|
|
|
import gi
|
|
gi.require_version("Gtk", "3.0")
|
|
from gi.repository import Gtk
|
|
|
|
DIR = "/home/arbeit/projects/project-starter"
|
|
ARBEIT = os.path.expanduser("~/arbeit")
|
|
|
|
CLAUDE_PROMPT = (
|
|
"Verschaff dir kurz Projekt-Ueberblick (ddev, shopware 6). "
|
|
"Lies dann /tmp/redmine-{nr}/data.json (enthaelt Redmine Issue + Briefing-Wiki) "
|
|
"sowie ggf. Bilder unter /tmp/redmine-{nr}/. "
|
|
"Liste die fuer das Ticket noetigen Features als knappe Bullet-Liste auf - "
|
|
"vollstaendig, nichts weglassen, aber auch nicht aufgeblaeht. Simpel und kurz."
|
|
)
|
|
|
|
|
|
def referenzprojekte():
|
|
namen = [e for e in os.listdir(ARBEIT)
|
|
if os.path.isdir(os.path.join(ARBEIT, e, ".ddev"))]
|
|
return sorted(namen, key=str.lower)
|
|
|
|
|
|
def im_terminal(befehl, arbeitsverzeichnis=None):
|
|
aufruf = ["gnome-terminal"]
|
|
if arbeitsverzeichnis:
|
|
aufruf += ["--working-directory", arbeitsverzeichnis]
|
|
aufruf += ["--", "bash", "-c", befehl + "; exec bash"]
|
|
subprocess.Popen(aufruf)
|
|
|
|
|
|
class Panel(Gtk.Window):
|
|
def __init__(self):
|
|
super().__init__(title="Projekt Panel")
|
|
self.set_border_width(8)
|
|
self.connect("destroy", Gtk.main_quit)
|
|
|
|
raster = Gtk.Grid(row_spacing=6, column_spacing=8)
|
|
self.add(raster)
|
|
|
|
raster.attach(Gtk.Label(label="Ticket-Nr", xalign=0), 0, 0, 1, 1)
|
|
self.ticket = Gtk.Entry(hexpand=True, width_chars=30)
|
|
raster.attach(self.ticket, 1, 0, 1, 1)
|
|
|
|
raster.attach(Gtk.Label(label="Referenzprojekt", xalign=0), 0, 1, 1, 1)
|
|
self.referenz = Gtk.ComboBoxText()
|
|
for name in referenzprojekte():
|
|
self.referenz.append_text(name)
|
|
self.referenz.set_active(0)
|
|
raster.attach(self.referenz, 1, 1, 1, 1)
|
|
|
|
knopfreihe = Gtk.Box(spacing=6, homogeneous=True)
|
|
raster.attach(knopfreihe, 0, 2, 2, 1)
|
|
for beschriftung, aktion in (
|
|
("Ticketdaten abrufen", self.ticketdaten),
|
|
("Projekt setup", self.projekt_setup),
|
|
("Terminal starten", self.terminal_starten),
|
|
):
|
|
knopf = Gtk.Button(label=beschriftung)
|
|
knopf.connect("clicked", aktion)
|
|
knopfreihe.pack_start(knopf, True, True, 0)
|
|
|
|
def fehler(self, text):
|
|
dialog = Gtk.MessageDialog(transient_for=self, modal=True,
|
|
message_type=Gtk.MessageType.ERROR,
|
|
buttons=Gtk.ButtonsType.OK, text=text)
|
|
dialog.run()
|
|
dialog.destroy()
|
|
|
|
def ticket_nr(self):
|
|
nr = self.ticket.get_text().strip()
|
|
if not nr:
|
|
self.fehler("Ticket-Nr fehlt.")
|
|
return None
|
|
return nr
|
|
|
|
def ticketdaten(self, _knopf):
|
|
nr = self.ticket_nr()
|
|
if nr:
|
|
im_terminal(f"{shlex.quote(DIR + '/ticket-daten')} {shlex.quote(nr)}")
|
|
|
|
def projekt_setup(self, _knopf):
|
|
nr = self.ticket_nr()
|
|
if not nr:
|
|
return
|
|
referenz = self.referenz.get_active_text() or ""
|
|
pfad = os.path.join(ARBEIT, referenz)
|
|
if not os.path.isdir(os.path.join(pfad, ".ddev")):
|
|
self.fehler(f"Kein ddev-Projekt: {pfad}")
|
|
return
|
|
im_terminal(f"{shlex.quote(DIR + '/ticket-setup')} "
|
|
f"{shlex.quote(nr)} {shlex.quote(pfad)}")
|
|
|
|
def terminal_starten(self, _knopf):
|
|
nr = self.ticket_nr()
|
|
if not nr:
|
|
return
|
|
ziel = os.path.join(ARBEIT, "tickets", nr)
|
|
if not os.path.isdir(ziel):
|
|
self.fehler(f"{ziel} gibt es noch nicht. Erst Projekt setup.")
|
|
return
|
|
prompt = CLAUDE_PROMPT.format(nr=nr)
|
|
im_terminal(f"claude {shlex.quote(prompt)}", arbeitsverzeichnis=ziel)
|
|
|
|
|
|
panel = Panel()
|
|
panel.show_all()
|
|
Gtk.main()
|