UIpdate image script

This commit is contained in:
2024-10-11 12:52:08 +02:00
parent 33054a1f1c
commit e15e337dbe
28 changed files with 1655 additions and 610 deletions

View File

@@ -1,58 +1,234 @@
import customtkinter as ctk
from api.woocommerce_api import save_credentials, load_credentials
from api.woocommerce_api import (
load_credentials,
save_active_credential_set,
)
from config.encrypt_config import ConfigEncryptor
from PIL import Image, ImageTk
import os
import sys
KEY = b"u4xTBY5Ns4WYdLvqMjEr138mpMmDEhhqTszKCcDy2cI="
def resource_path(relative_path):
""" Get the absolute path to a resource, whether we're running in development or a PyInstaller package. """
try:
# PyInstaller stores files in _MEIPASS when built
base_path = sys._MEIPASS
except Exception:
base_path = os.path.abspath(".")
return os.path.join(base_path, 'ui/images/'+ relative_path +'.png')
class SettingsTab:
def __init__(self, tab_parent):
def __init__(self, tab_parent, controller):
self.tab = ctk.CTkFrame(tab_parent)
self.tab.grid(row=0, column=0, sticky="nsew")
self.credentials = load_credentials()
# Initialize an instance of ConfigEncryptor
self.config_encryptor = ConfigEncryptor(KEY) # Ensure you pass any required arguments in the constructor if necessary
config = self.config_encryptor.load_config()
self.credentials_list = []
if config:
self.credentials_list = self.config_encryptor.load_config().get('credentials')
self.active_credential_set = (
self.get_active_credential_set()
) # Fetch active credentials
else:
self.active_credential_set = {
'nice_name': "Default"
}
self.inputs = {}
self.setup_ui()
def setup_ui(self):
if self.credentials:
settings_options = {
"url": {"type": "text", "label": "WooCommerce URL:", "default": self.credentials.get('url', '')},
"consumer_key": {"type": "text", "label": "Consumer Key:", "default": self.credentials.get('consumer_key', '')},
"consumer_secret": {"type": "text", "label": "Consumer Secret:", "default": self.credentials.get('consumer_secret', '')},
"username": {"type": "text", "label": "Username:", "default": self.credentials.get('username', '')},
"password": {"type": "text", "label": "Password:", "default": self.credentials.get('password', ''), "show": "*"}
}
else:
settings_options = {
"url": {"type": "text", "label": "WooCommerce URL:", "default": ""},
"consumer_key": {"type": "text", "label": "Consumer Key:", "default": ""},
"consumer_secret": {"type": "text", "label": "Consumer Secret:", "default": ""},
"username": {"type": "text", "label": "Username:", "default": ""},
"password": {"type": "text", "label": "Password:", "default": "", "show": "*"}
}
def get_active_credential_set(self):
"""Retrieve active credential set from saved data and convert to new format if needed."""
if isinstance(self.credentials_list, list) and all(
isinstance(cred, dict) for cred in self.credentials_list
):
for cred in self.credentials_list:
if cred.get("active", False):
return cred
return self.credentials_list[0] if self.credentials_list else None
row_index = 0
elif isinstance(self.credentials_list, dict):
self.credentials_list = [self.convert_to_new_format(self.credentials_list)]
return self.credentials_list[0]
elif isinstance(self.credentials_list, str):
self.credentials_list = [
self.convert_to_new_format({"url": self.credentials_list})
]
return self.credentials_list[0]
return None
def convert_to_new_format(self, old_credential):
return {
"url": old_credential.get("url", ""),
"consumer_key": old_credential.get("consumer_key", ""),
"consumer_secret": old_credential.get("consumer_secret", ""),
"username": old_credential.get("username", ""),
"password": old_credential.get("password", ""),
"name": old_credential.get("name", "Default Credential Set"),
"nice_name": old_credential.get("nice_name", old_credential.get("url", "Unnamed Credential")),
"active": True,
}
def setup_ui(self):
# Dropdown to select active credentials
self.credential_var = ctk.StringVar()
self.credential_var.set(
self.active_credential_set.get("nice_name", "Default")
)
credential_options = [
cred.get("nice_name", "Unnamed Credential")
for cred in self.credentials_list
]
dropdown_label = ctk.CTkLabel(self.tab, text="Select Active Credentials:")
dropdown_label.grid(row=0, column=0, padx=5, columnspan=2 , pady=5, sticky="w")
self.credential_dropdown = ctk.CTkComboBox(
self.tab,
variable=self.credential_var,
values=credential_options,
command=self.load_selected_credential,
)
self.credential_dropdown.grid(row=0, column=2, columnspan=2, padx=5, pady=5, sticky="w")
# Show fields for credentials
self.create_credentials_form(self.active_credential_set, row_index=1)
icon_path = resource_path("save")
icon_image = ctk.CTkImage(light_image=Image.open(icon_path), size=(24, 24)) if icon_path else None
save_button = ctk.CTkButton(
self.tab, width=100,fg_color="green",image=icon_image, text="Save", command=self.save_credentials
)
save_button.grid(row=7, column=0, columnspan=1, pady=10)
new_button = ctk.CTkButton(
self.tab, width=100, fg_color="green", image=icon_image, text="New", command=self.add_new_credential_set
)
new_button.grid(row=7, column=1, columnspan=1, pady=10)
# Trash icon for delete button
trash_icon_path = resource_path("trash")
trash_icon_image = ctk.CTkImage(light_image=Image.open(trash_icon_path), size=(24, 24)) if trash_icon_path else None
delete_button = ctk.CTkButton(
self.tab, width=100, fg_color="red", image=trash_icon_image, text="Delete", command=self.delete_selected_credential
)
delete_button.grid(row=7, column=2, columnspan=1, pady=10)
def create_credentials_form(self, credentials, row_index):
settings_options = {
"url": {
"type": "text",
"label": "WooCommerce URL:",
"default": credentials.get("url", ""),
},
"consumer_key": {
"type": "text",
"label": "Consumer Key:",
"default": credentials.get("consumer_key", ""),
},
"consumer_secret": {
"type": "text",
"label": "Consumer Secret:",
"default": credentials.get("consumer_secret", ""),
},
"username": {
"type": "text",
"label": "Username:",
"default": credentials.get("username", ""),
},
"password": {
"type": "text",
"label": "Password:",
"default": credentials.get("password", ""),
"show": "*",
},
"nice_name": {
"type": "text",
"label": "Nice Name:",
"default": credentials.get("nice_name", "Unnamed Credential"),
},
}
self.inputs = {} # Reset inputs for new credentials set
for name, details in settings_options.items():
self.create_setting(name, details, row_index)
row_index += 1
save_button = ctk.CTkButton(self.tab, text="Save Credentials", command=self.save_credentials)
save_button.grid(row=row_index, column=0, columnspan=2, pady=10)
def create_setting(self, name, details, row_index):
"""
Create a setting based on its type.
"""
lbl = ctk.CTkLabel(self.tab, text=details["label"])
lbl.grid(row=row_index, column=0, padx=5, pady=5, sticky="w")
lbl.grid(row=row_index, column=0,columnspan=2, padx=5, pady=5, sticky="w")
if details["type"] == "text":
entry = ctk.CTkEntry(self.tab, show=details.get("show", None))
entry.insert(0, details["default"])
entry.grid(row=row_index, column=1, padx=5, pady=5, sticky="w")
self.inputs[name] = entry
entry = ctk.CTkEntry(self.tab, show=details.get("show", None))
entry.insert(0, details["default"])
entry.grid(row=row_index, column=2,columnspan=2, padx=5, pady=5, sticky="w")
self.inputs[name] = entry
def load_selected_credential(self, selected_name):
for cred in self.credentials_list:
if cred.get("nice_name", "Unnamed Credential") == selected_name:
self.active_credential_set = cred
self.create_credentials_form(self.active_credential_set, row_index=1)
break
def save_credentials(self):
save_credentials(
self.inputs["url"].get(),
self.inputs["consumer_key"].get(),
self.inputs["consumer_secret"].get(),
self.inputs["username"].get(),
self.inputs["password"].get()
credentials = {
"url": self.inputs["url"].get(),
"consumer_key": self.inputs["consumer_key"].get(),
"consumer_secret": self.inputs["consumer_secret"].get(),
"username": self.inputs["username"].get(),
"password": self.inputs["password"].get(),
"name": self.inputs["nice_name"].get(),
"nice_name": self.inputs["nice_name"].get(),
"active": True,
}
ConfigEncryptor(KEY).save_credentials(credentials)
save_active_credential_set(credentials["name"])
self.credentials_list.append(credentials)
self.credential_dropdown.configure(
values=[cred.get("nice_name", "Unnamed Credential") for cred in self.credentials_list]
)
def add_new_credential_set(self):
self.active_credential_set = {
"url": "",
"consumer_key": "",
"consumer_secret": "",
"username": "",
"password": "",
"name": "New Credential Set",
"nice_name": "New Credential Set",
"active": False,
}
self.create_credentials_form(self.active_credential_set, row_index=1)
self.credential_var.set(self.active_credential_set["nice_name"])
def delete_selected_credential(self):
selected_name = self.credential_var.get()
# Find and remove the selected credential from the list
self.credentials_list = [
cred for cred in self.credentials_list if cred.get("nice_name") != selected_name
]
# Save updated credentials list to storage
ConfigEncryptor(KEY).delete_credentials(selected_name)
# Update the dropdown and form after deletion
if self.credentials_list:
self.active_credential_set = self.credentials_list[0] # Load first available credential
self.credential_var.set(self.active_credential_set["nice_name"])
self.create_credentials_form(self.active_credential_set, row_index=1)
else:
self.active_credential_set = {}
self.create_credentials_form({}, row_index=1) # Clear form if no credentials are left
self.credential_dropdown.configure(
values=[cred.get("nice_name", "Unnamed Credential") for cred in self.credentials_list]
)