You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
213 lines
8.2 KiB
213 lines
8.2 KiB
5 years ago
|
import shutil
|
||
|
import webbrowser
|
||
|
from os import path, makedirs, system
|
||
|
from PyQt5.QtCore import QModelIndex, QDate, Qt
|
||
|
from PyQt5.QtWidgets import QWidget, QDialog, QFileDialog
|
||
|
from PyQt5.QtGui import QStandardItemModel, QStandardItem, QIcon, QPixmap
|
||
|
from PyQt5 import QtWidgets
|
||
|
from ui import MainWindow, MessageDialog, ReportResultWidget
|
||
|
from ManageVendors import Vendor
|
||
|
from FetchData import REPORT_TYPES, CompletionStatus
|
||
|
from Settings import SettingsModel
|
||
|
import platform
|
||
|
import shlex
|
||
|
|
||
|
|
||
|
class ProcessResult:
|
||
|
def __init__(self, vendor: Vendor, report_type: str):
|
||
|
self.vendor = vendor
|
||
|
self.report_type = report_type
|
||
|
self.completion_status = CompletionStatus.SUCCESSFUL
|
||
|
self.message = ""
|
||
|
self.file_name = ""
|
||
|
self.file_dir = ""
|
||
|
self.file_path = ""
|
||
|
|
||
|
|
||
|
class ImportFileController:
|
||
|
def __init__(self, vendors: list, settings: SettingsModel, main_window_ui: MainWindow.Ui_mainWindow):
|
||
|
|
||
|
# region General
|
||
|
self.vendors = vendors
|
||
|
self.date = QDate.currentDate()
|
||
|
self.selected_vendor_index = -1
|
||
|
self.selected_report_type_index = -1
|
||
|
self.selected_file_name: str = ""
|
||
|
self.selected_file_path: str = ""
|
||
|
self.settings = settings
|
||
|
self.result_dialog = None
|
||
|
# endregion
|
||
|
|
||
|
# region Vendors
|
||
|
self.vendor_list_view = main_window_ui.vendors_list_view_import
|
||
|
self.vendor_list_model = QStandardItemModel(self.vendor_list_view)
|
||
|
self.vendor_list_view.setModel(self.vendor_list_model)
|
||
|
self.vendor_list_view.clicked.connect(self.on_vendor_selected)
|
||
|
self.update_vendors_ui()
|
||
|
# endregion
|
||
|
|
||
|
# region Report Types
|
||
|
self.report_type_list_view = main_window_ui.report_types_list_view_import
|
||
|
self.report_type_list_model = QStandardItemModel(self.report_type_list_view)
|
||
|
self.report_type_list_view.setModel(self.report_type_list_model)
|
||
|
self.report_type_list_view.clicked.connect(self.on_report_type_selected)
|
||
|
for report_type in REPORT_TYPES:
|
||
|
item = QStandardItem(report_type)
|
||
|
item.setEditable(False)
|
||
|
self.report_type_list_model.appendRow(item)
|
||
|
# endregion
|
||
|
|
||
|
# region Others
|
||
|
self.year_date_edit = main_window_ui.report_year_date_edit
|
||
|
self.year_date_edit.setDate(self.date)
|
||
|
self.year_date_edit.dateChanged.connect(self.on_date_changed)
|
||
|
|
||
|
self.select_file_btn = main_window_ui.select_file_button
|
||
|
self.select_file_btn.clicked.connect(self.open_file_select_dialog)
|
||
|
|
||
|
self.selected_file_label = main_window_ui.selected_file_label
|
||
|
|
||
|
self.import_file_button = main_window_ui.import_file_button
|
||
|
self.import_file_button.clicked.connect(self.on_import_clicked)
|
||
|
# endregion
|
||
|
|
||
|
def on_vendors_changed(self, vendors: list):
|
||
|
self.selected_vendor_index = -1
|
||
|
self.update_vendors(vendors)
|
||
|
self.update_vendors_ui()
|
||
|
|
||
|
def update_vendors(self, vendors: list):
|
||
|
self.vendors = vendors
|
||
|
|
||
|
def update_vendors_ui(self):
|
||
|
self.vendor_list_model.clear()
|
||
|
for vendor in self.vendors:
|
||
|
item = QStandardItem(vendor.name)
|
||
|
item.setEditable(False)
|
||
|
self.vendor_list_model.appendRow(item)
|
||
|
|
||
|
def on_vendor_selected(self, model_index: QModelIndex):
|
||
|
self.selected_vendor_index = model_index.row()
|
||
|
|
||
|
def on_report_type_selected(self, model_index: QModelIndex):
|
||
|
self.selected_report_type_index = model_index.row()
|
||
|
|
||
|
def on_date_changed(self, date: QDate):
|
||
|
self.date = date
|
||
|
|
||
|
def open_file_select_dialog(self):
|
||
|
dialog = QFileDialog()
|
||
|
dialog.setFileMode(QFileDialog.ExistingFile)
|
||
|
dialog.setNameFilter("All TSV files (*.tsv)")
|
||
|
if dialog.exec_():
|
||
|
self.selected_file_path = dialog.selectedFiles()[0]
|
||
|
arr = self.selected_file_path.split("/")
|
||
|
self.selected_file_name = arr[max(len(arr), 1) - 1]
|
||
|
self.selected_file_label.setText(self.selected_file_name)
|
||
|
|
||
|
def on_import_clicked(self):
|
||
|
if self.selected_vendor_index == -1:
|
||
|
self.show_message("Select a vendor")
|
||
|
return
|
||
|
elif self.selected_report_type_index == -1:
|
||
|
self.show_message("Select a report type")
|
||
|
return
|
||
|
elif self.selected_file_path == "":
|
||
|
self.show_message("Select a file")
|
||
|
return
|
||
|
|
||
|
vendor = self.vendors[self.selected_vendor_index]
|
||
|
report_type = REPORT_TYPES[self.selected_report_type_index]
|
||
|
|
||
|
process_result = self.import_file(vendor, report_type)
|
||
|
self.show_result(process_result)
|
||
|
|
||
|
def import_file(self, vendor: Vendor, report_type: str) -> ProcessResult:
|
||
|
process_result = ProcessResult(vendor, report_type)
|
||
|
|
||
|
try:
|
||
|
dest_file_dir = f"{self.settings.yearly_directory}{self.date.toString('yyyy')}/{vendor.name}/"
|
||
|
dest_file_name = f"{self.date.toString('yyyy')}_{vendor.name}_{report_type}.tsv"
|
||
|
dest_file_path = f"{dest_file_dir}{dest_file_name}"
|
||
|
|
||
|
self.verify_path_exists(dest_file_dir)
|
||
|
self.copy_file(self.selected_file_path, dest_file_path)
|
||
|
|
||
|
process_result.file_dir = dest_file_dir
|
||
|
process_result.file_name = dest_file_name
|
||
|
process_result.file_path = dest_file_path
|
||
|
process_result.completion_status = CompletionStatus.SUCCESSFUL
|
||
|
|
||
|
except Exception as e:
|
||
|
process_result.message = f"Exception: {e}"
|
||
|
process_result.completion_status = CompletionStatus.FAILED
|
||
|
|
||
|
return process_result
|
||
|
|
||
|
def verify_path_exists(self, path_str: str):
|
||
|
if not path.isdir(path_str):
|
||
|
makedirs(path_str)
|
||
|
|
||
|
def copy_file(self, origin_path: str, dest_path: str):
|
||
|
shutil.copy2(origin_path, dest_path)
|
||
|
|
||
|
def show_result(self, process_result: ProcessResult):
|
||
|
self.result_dialog = QDialog(flags=Qt.WindowCloseButtonHint)
|
||
|
self.result_dialog.setWindowTitle("Import Result")
|
||
|
vertical_layout = QtWidgets.QVBoxLayout(self.result_dialog)
|
||
|
vertical_layout.setContentsMargins(5, 5, 5, 5)
|
||
|
|
||
|
report_result_widget = QWidget(self.result_dialog)
|
||
|
report_result_ui = ReportResultWidget.Ui_ReportResultWidget()
|
||
|
report_result_ui.setupUi(report_result_widget)
|
||
|
|
||
|
vendor = process_result.vendor
|
||
|
report_type = process_result.report_type
|
||
|
|
||
|
report_result_ui.report_type_label.setText(f"{vendor.name} - {report_type}")
|
||
|
report_result_ui.success_label.setText(process_result.completion_status.value)
|
||
|
|
||
|
if process_result.completion_status == CompletionStatus.SUCCESSFUL:
|
||
|
report_result_ui.message_label.hide()
|
||
|
report_result_ui.retry_frame.hide()
|
||
|
|
||
|
report_result_ui.file_label.setText(f"Saved as: {process_result.file_name}")
|
||
|
report_result_ui.file_label.mousePressEvent = lambda event: self.open_explorer(process_result.file_path)
|
||
|
|
||
|
folder_pixmap = QPixmap("./ui/resources/folder_icon.png")
|
||
|
report_result_ui.folder_button.setIcon(QIcon(folder_pixmap))
|
||
|
report_result_ui.folder_button.clicked.connect(lambda: self.open_explorer(process_result.file_dir))
|
||
|
|
||
|
report_result_ui.success_label.setText("Successful!")
|
||
|
report_result_ui.retry_frame.hide()
|
||
|
|
||
|
elif process_result.completion_status == CompletionStatus.FAILED:
|
||
|
report_result_ui.file_frame.hide()
|
||
|
report_result_ui.retry_frame.hide()
|
||
|
|
||
|
report_result_ui.message_label.setText(process_result.message)
|
||
|
|
||
|
vertical_layout.addWidget(report_result_widget)
|
||
|
self.result_dialog.show()
|
||
|
|
||
|
def show_message(self, message: str):
|
||
|
message_dialog = QDialog(flags=Qt.WindowCloseButtonHint)
|
||
|
message_dialog_ui = MessageDialog.Ui_message_dialog()
|
||
|
message_dialog_ui.setupUi(message_dialog)
|
||
|
|
||
|
message_label = message_dialog_ui.message_label
|
||
|
message_label.setText(message)
|
||
|
|
||
|
message_dialog.show()
|
||
|
|
||
|
def open_explorer(self, file_path: str):
|
||
|
if path.exists(file_path):
|
||
|
if(platform.system()=="Windows"):
|
||
|
webbrowser.open(path.realpath(file_path))
|
||
|
elif(platform.system()=="Darwin"):
|
||
|
system("open " + shlex.quote(file_path))
|
||
|
else:
|
||
|
self.show_message(f"\'{file_path}\' does not exist")
|
||
|
|
||
|
|