178 lines
7.7 KiB
Python
178 lines
7.7 KiB
Python
import tkinter as tk
|
|
from io import BytesIO
|
|
from tkinter import messagebox, ttk, Menu
|
|
from datetime import datetime
|
|
import requests
|
|
from PIL import Image, ImageTk
|
|
from .key import *
|
|
|
|
class TGTGOrdersApp:
|
|
def __init__(self, parent):
|
|
self.parent = parent
|
|
self.frame = tk.Frame(self.parent, bg="#ffffff")
|
|
self.frame.pack(fill="both", expand=True)
|
|
|
|
self.notebook = ttk.Notebook(self.frame)
|
|
self.notebook.pack(fill="both", expand=True)
|
|
|
|
self.orders_tab = tk.Frame(self.notebook, bg="#ffffff")
|
|
self.notebook.add(self.orders_tab, text="Bestellungen")
|
|
|
|
self.log_tab = tk.Frame(self.notebook, bg="#ffffff")
|
|
self.notebook.add(self.log_tab, text="Protokoll")
|
|
|
|
self.log_text = tk.Text(self.log_tab, wrap=tk.WORD, height=15, font=("Arial", 10), bg="#f0f0f0")
|
|
self.log_text.pack(fill="both", expand=True, padx=10, pady=10)
|
|
|
|
self.order_frame = tk.Frame(self.orders_tab, bg="#ffffff")
|
|
self.order_frame.pack(fill="both", expand=True, padx=10, pady=10)
|
|
|
|
self.menu = Menu(self.parent)
|
|
self.parent.config(menu=self.menu)
|
|
self.filemenu = Menu(self.menu)
|
|
self.menu.add_cascade(label="Datei", menu=self.filemenu)
|
|
self.filemenu.add_command(label="Beenden", command=self.exit_applet)
|
|
self.filemenu.add_command(label="Aktualisieren", command=self.display_orders)
|
|
self.filemenu.add_command(label="Protokoll speichern", command=self.save_log)
|
|
self.filemenu.add_separator()
|
|
self.filemenu.add_command(label="Über", command=self.about)
|
|
|
|
self.parent.after(1000, self.on_startup)
|
|
|
|
def log_message(self, message):
|
|
timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
|
self.log_text.insert(tk.END, f"{timestamp} - {message}\n")
|
|
self.log_text.yview(tk.END)
|
|
|
|
@staticmethod
|
|
def format_time(iso_time):
|
|
try:
|
|
dt = datetime.fromisoformat(iso_time.replace("Z", "+00:00"))
|
|
local_time = dt.astimezone()
|
|
return local_time.strftime("%H:%M")
|
|
except ValueError:
|
|
return "Unbekannter Fehler!"
|
|
|
|
def fetch_orders(self):
|
|
self.log_message("[ INFO ]: Bestellungen werden abgerufen...")
|
|
try:
|
|
active_orders = client.get_active()
|
|
if not isinstance(active_orders, dict) or "orders" not in active_orders:
|
|
raise ValueError("Unerwartetes API-Antwortformat.")
|
|
orders_list = active_orders.get("orders", [])
|
|
except Exception as e:
|
|
self.log_message(f"[ FEHLER ]: Fehler beim Abrufen aktiver Bestellungen: {e}")
|
|
messagebox.showerror("Fehler", f"Fehler beim Abrufen aktiver Bestellungen: {e}")
|
|
return []
|
|
|
|
orders_data = []
|
|
for order in orders_list:
|
|
try:
|
|
order_info = {
|
|
"name": order.get("item_name", "Unbekannt"),
|
|
"store_name": order.get("store_name", "Unbekannt"),
|
|
"address": order.get("pickup_location", {}).get("address", {}).get("address_line", "Unbekannt"),
|
|
"quantity": order.get("quantity", 1),
|
|
"price": order.get("total_price", {}).get("minor_units", 0) / (10 ** order.get("total_price", {}).get("decimals", 2)),
|
|
"currency": order.get("total_price", {}).get("code", "Unbekannt"),
|
|
"payment_method": order.get("payment_method_display_name", "Unbekannt"),
|
|
"pickup_window": {
|
|
"start": self.format_time(order.get("pickup_interval", {}).get("start", "Unbekannt")),
|
|
"end": self.format_time(order.get("pickup_interval", {}).get("end", "Unbekannt"))
|
|
},
|
|
"image_url": order.get("item_cover_image", {}).get("current_url", "")
|
|
}
|
|
orders_data.append(order_info)
|
|
except Exception as e:
|
|
self.log_message(f"[ KRITISCHER FEHLER ]: Eine Bestellung wird übersprungen: {e}")
|
|
return orders_data
|
|
|
|
def display_orders(self):
|
|
self.log_message("[ INFO ]: Bestellungen werden angezeigt...")
|
|
orders = self.fetch_orders()
|
|
if not orders:
|
|
messagebox.showinfo("Info", "Keine aktiven Bestellungen gefunden.")
|
|
self.log_message("[ FEHLER ]: Keine aktiven Bestellungen gefunden.")
|
|
return
|
|
|
|
for widget in self.order_frame.winfo_children():
|
|
widget.destroy()
|
|
|
|
canvas = tk.Canvas(self.order_frame, bg="#ffffff")
|
|
scroll_frame = tk.Frame(canvas, bg="#ffffff")
|
|
scrollbar = tk.Scrollbar(self.order_frame, orient="vertical", command=canvas.yview)
|
|
|
|
canvas.configure(yscrollcommand=scrollbar.set)
|
|
|
|
scrollbar.pack(side="right", fill="y")
|
|
canvas.pack(side="left", fill="both", expand=True)
|
|
canvas.create_window((0, 0), window=scroll_frame, anchor="nw")
|
|
|
|
image_refs = []
|
|
|
|
for order in orders:
|
|
text = (f"{order['name']} - {order['store_name']}\n"
|
|
f"Adresse: {order['address']}\n"
|
|
f"Menge: {order['quantity']}\n"
|
|
f"Preis: {order['price']} {order['currency']}\n"
|
|
f"Zahlung: {order['payment_method']}\n"
|
|
f"Abholung: {order['pickup_window']['start']} bis {order['pickup_window']['end']}\n")
|
|
|
|
label = tk.Label(scroll_frame, text=text, justify="left", padx=10, pady=5, anchor="w", font=("Arial", 10),
|
|
bg="#f0f0f0", relief="ridge")
|
|
label.pack(fill="x", pady=5)
|
|
|
|
if order["image_url"]:
|
|
try:
|
|
response = requests.get(order["image_url"])
|
|
img_data = BytesIO(response.content)
|
|
img = Image.open(img_data)
|
|
img.thumbnail((150, 150), Image.Resampling.LANCZOS)
|
|
img_tk = ImageTk.PhotoImage(img)
|
|
|
|
img_label = tk.Label(scroll_frame, image=img_tk)
|
|
img_label.image = img_tk
|
|
image_refs.append(img_tk)
|
|
img_label.pack(pady=5)
|
|
except Exception as e:
|
|
self.log_message(f"[ FEHLER ]: Bild konnte nicht geladen werden: {e}")
|
|
|
|
scroll_frame.update_idletasks()
|
|
canvas.config(scrollregion=canvas.bbox("all"))
|
|
|
|
def on_mouse_wheel(event):
|
|
canvas.yview_scroll(-1 * (event.delta // 120), "units")
|
|
|
|
canvas.bind_all("<MouseWheel>", on_mouse_wheel)
|
|
canvas.bind_all("<Button-4>", lambda e: canvas.yview_scroll(-1, "units"))
|
|
canvas.bind_all("<Button-5>", lambda e: canvas.yview_scroll(1, "units"))
|
|
|
|
def on_startup(self):
|
|
self.log_message("[ INFO ]: Anwendung gestartet.")
|
|
self.display_orders()
|
|
|
|
def exit_applet(self):
|
|
self.log_message("[ INFO ]: Anwendung wird beendet.")
|
|
self.parent.quit()
|
|
|
|
@staticmethod
|
|
def about():
|
|
messagebox.showinfo("Über", "TGTG OrderChecker PV2-PKG1\n PfandApplication ©")
|
|
|
|
def save_log(self):
|
|
try:
|
|
log_content = self.log_text.get("1.0", tk.END)
|
|
with open("protokoll_datei.log", "w") as log_file:
|
|
log_file.write(log_content)
|
|
self.log_message("[ INFO ]: Protokolldatei erfolgreich gespeichert.")
|
|
except Exception as e:
|
|
self.log_message(f"[ FEHLER ]: Fehler beim Speichern des Protokolls: {e}")
|
|
messagebox.showerror("Fehler", f"Fehler beim Speichern des Protokolls: {e}")
|
|
|
|
def start_tgtg(parent=None):
|
|
new_window = tk.Toplevel(parent)
|
|
new_window.title("TGTG Orders")
|
|
new_window.geometry("500x600")
|
|
|
|
app = TGTGOrdersApp(new_window)
|