From 38ce9ba07c194d9bfd69cc9a7d0ac7a73c6c356c Mon Sep 17 00:00:00 2001 From: dittko Date: Sat, 1 Jun 2024 11:42:04 +0200 Subject: [PATCH 1/3] export import maili do grup i z grup --- Interface/GroupEditor.py | 43 ++++++++++++++++++++++++++++++++-------- 1 file changed, 35 insertions(+), 8 deletions(-) diff --git a/Interface/GroupEditor.py b/Interface/GroupEditor.py index 7bfd152..8d6f22a 100644 --- a/Interface/GroupEditor.py +++ b/Interface/GroupEditor.py @@ -1,15 +1,15 @@ -from tkinter import Text, Button, Label, Entry, Tk, Toplevel +import pandas as pd +from tkinter import Text, Button, Label, Entry, Tk, Toplevel, filedialog from tkinter.constants import END, INSERT, WORD from group_controller import GroupController from models import Contact, Group from .ContactList import ContactList - class GroupEditor(Toplevel): def __init__(self, parent: Toplevel | Tk, edited: Group | None = None): super().__init__(parent.root) self.parent = parent - self.currentGroup = edited if edited != None else Group(_name="Nowa grupa" + str(len(Group.all_instances))) + self.currentGroup = Group() if edited is None else edited def prepareInterface(self): name_label = Label(self, text="Nazwa grupy:", bg="lightblue") @@ -18,27 +18,30 @@ def prepareInterface(self): self.email_text = Text(self, bg="lightblue", fg="black", wrap=WORD) btn_add_list_contact = Button(self, text="Dodaj z listy", bg="lightblue", fg="black", command=self.add_contact_from_list_window) btn_save = Button(self, text="Zapisz", bg="lightblue", fg="black", command=self.__save_group_clicked) + btn_import = Button(self, text="Importuj", bg="lightblue", fg="black", command=self.import_emails) + btn_export = Button(self, text="Eksportuj", bg="lightblue", fg="black", command=self.export_emails) name_label.grid(row=0, column=0, padx=5, pady=5, sticky="w") self.name_entry.grid(row=0, column=1, padx=5, pady=5, sticky="ew") email_label.grid(row=1, column=0, padx=5, pady=5, sticky="w") self.email_text.grid(row=1, column=1, padx=5, pady=5, sticky="nsew") btn_add_list_contact.grid(row=2, column=0, padx=5, pady=5, sticky="ew") - btn_save.grid(row=3, column=0, columnspan=2, padx=5, pady=5, sticky="ew") + btn_import.grid(row=2, column=1, padx=5, pady=5, sticky="ew") + btn_export.grid(row=3, column=0, padx=5, pady=5, sticky="ew") + btn_save.grid(row=3, column=1, padx=5, pady=5, sticky="ew") self.grid_columnconfigure(1, weight=1) self.grid_rowconfigure(1, weight=1) self.update() - def update(self): if self.currentGroup: self.title(f"Edytuj grupę {self.currentGroup.name}") self.name_entry.delete(0, END) self.name_entry.insert(0, self.currentGroup.name) self.currentGroup.contacts = GroupController.get_contacts(self.currentGroup) - self.email_text.delete('1.0', END) # Clear current content + self.email_text.delete('1.0', END) [self.add_contact(c) for c in self.currentGroup.contacts] else: self.title("Dodaj grupę") @@ -53,8 +56,32 @@ def add_contact_from_list_window(self): def __save_group_clicked(self) -> None: if not self.currentGroup: - self.currentGroup = Group(_name = self.name_entry.get()) + self.currentGroup = Group(_name=self.name_entry.get()) else: self.currentGroup.name = self.name_entry.get() - self.parent.update() + txt = self.email_text.get(1.0, END).strip() + email_addresses = [address for address in txt.replace("\n", "").split(",") if address.strip()] + # TODO: Przy zmianie kontrolek w grupie będzie trzeba zmienić wywoływanie konstruktora - te kontakty powinny być zapisane wcześniej, bez możliwości dodawania ich od tak z palca + for mail in email_addresses: + try: + self.currentGroup._add_contact(Contact(_email=mail)) + except AttributeError as e: + raise e + self.parent.add_group(self.currentGroup) self.destroy() + + def import_emails(self): + file_path = filedialog.askopenfilename(filetypes=[("Excel files", "*.xlsx")]) + if file_path: + df = pd.read_excel(file_path) + emails = df['email'].dropna().tolist() + for email in emails: + self.email_text.insert(INSERT, str(email) + "\n") + + def export_emails(self): + file_path = filedialog.asksaveasfilename(defaultextension=".xlsx", filetypes=[("Excel files", "*.xlsx")]) + if file_path: + txt = self.email_text.get(1.0, END).strip() + email_addresses = [address for address in txt.split("\n") if address.strip()] + df = pd.DataFrame(email_addresses, columns=["email"]) + df.to_excel(file_path, index=False) \ No newline at end of file From 7c0f495553fd5053c7f6bab1a702782e5a5cfa56 Mon Sep 17 00:00:00 2001 From: Maciej Kuczynski Date: Sat, 1 Jun 2024 22:30:09 +0200 Subject: [PATCH 2/3] Group saving fix --- Interface/GroupEditor.py | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/Interface/GroupEditor.py b/Interface/GroupEditor.py index 8d6f22a..e19923f 100644 --- a/Interface/GroupEditor.py +++ b/Interface/GroupEditor.py @@ -56,18 +56,10 @@ def add_contact_from_list_window(self): def __save_group_clicked(self) -> None: if not self.currentGroup: - self.currentGroup = Group(_name=self.name_entry.get()) + self.currentGroup = Group(_name = self.name_entry.get()) else: self.currentGroup.name = self.name_entry.get() - txt = self.email_text.get(1.0, END).strip() - email_addresses = [address for address in txt.replace("\n", "").split(",") if address.strip()] - # TODO: Przy zmianie kontrolek w grupie będzie trzeba zmienić wywoływanie konstruktora - te kontakty powinny być zapisane wcześniej, bez możliwości dodawania ich od tak z palca - for mail in email_addresses: - try: - self.currentGroup._add_contact(Contact(_email=mail)) - except AttributeError as e: - raise e - self.parent.add_group(self.currentGroup) + self.parent.update() self.destroy() def import_emails(self): From 8a7c30a0f52a9a5442f60962cce9ffa0af72414b Mon Sep 17 00:00:00 2001 From: Maciej Kuczynski Date: Sat, 1 Jun 2024 23:08:16 +0200 Subject: [PATCH 3/3] NameError on closing the app fixed --- Interface/AppUI.py | 2 ++ main.py | 20 ++++++++++++++------ 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/Interface/AppUI.py b/Interface/AppUI.py index 77da5e1..5fdc127 100644 --- a/Interface/AppUI.py +++ b/Interface/AppUI.py @@ -10,6 +10,7 @@ from .Settings import Settings from .TemplateEditor import TemplateEditor from MessagingService.senders import ISender +from sys import exit #import MessagingService.smtp_data #from MessagingService.ethereal_demo import send_email @@ -75,6 +76,7 @@ def run(self): def __exit_clicked(self) -> NoReturn | None: # Wait for saving objects to DB print("Exiting") + self.root.destroy() exit() def update_templates(self): diff --git a/main.py b/main.py index 4029aaa..c636e8b 100644 --- a/main.py +++ b/main.py @@ -1,13 +1,14 @@ from MessagingService.senders import * from MessagingService.readers import * from UserInfo.LoginService import * -# from sys import platform +from sys import exit from group_controller import GroupController from models import DataImport, IModel, Template, Attachment, Contact, Message, Group, User from Triggers.triggers import ITrigger from Interface.AppUI import AppUI from DataSources.dataSources import DatabaseHandler, GapFillSource, IDataSource from additionalTableSetup import GroupContacts, MessageAttachment, SendAttempt +import tkinter as tk #from MessagingService.smtp_data import smtp_security, smtp_host, smtp_port #from globaldb import db @@ -23,18 +24,24 @@ dbURL = f"sqlite:///{dbname}" tables = [Template, DataImport, Attachment, Contact, User, ITrigger, Message, Group, MessageAttachment, SendAttempt, GroupContacts] - +def on_closing(): + print("Window closed by user.") + exit() + if __name__ == "__main__": db = DatabaseHandler(dbURL, tables) GroupController.setDbHandler(db) if db.checkIntegrity(): - print("Database intact, proceeding") + print("Database intact, proceeding.") + else: + print("Database integrity check failed. Exiting.") + exit() + db.LoadSavedState() ui = AppUI() ui.prepareInterface() - ui.setDb(db) _contact_fields = GapFillSource() @@ -48,13 +55,14 @@ sender = SMTPSender() except Exception as e: print(e) + exit() sender = SMTPSender() ui.setSender(sender) - # user = - # User(_email="russ.connelly30@ethereal.email", _password="QQcGx1RmfVkaEMjzqZ", _first_name="Russ", _last_name="Connelly", _selected=True) + # user = User(_email="russ.connelly30@ethereal.email", _password="QQcGx1RmfVkaEMjzqZ", _first_name="Russ", _last_name="Connelly", _selected=True) # ui.setUser(user) # ui.add_periodic_task(5000, pushQueuedInstances) + ui.run()