import webbrowser import shlex import subprocess import platform import csv from typing import Sequence, Any from os import path, makedirs, system from PyQt5.QtWidgets import QWidget, QMessageBox, QFileDialog from PyQt5.QtCore import QDate from Constants import * main_window: QWidget = None class JsonModel: def from_json(self, json_dict: dict): raise NotImplementedError("from_json method is not implemented") def save_json_file(file_dir: str, file_name: str, json_string: str): try: if not path.isdir(file_dir): makedirs(file_dir) file = open(file_dir + file_name, 'w') file.write(json_string) file.close() except IOError as e: print(e) def read_json_file(file_path: str) -> str: json_string = "[]" try: file = open(file_path, 'r', encoding='utf-8-sig') json_string = file.read() file.close() except IOError: pass finally: return json_string def show_message(message: str): message_box = QMessageBox(main_window) message_box.setMinimumSize(800, 800) message_box.setWindowTitle("Info") message_box.setText(message) message_box.exec_() def ask_confirmation(message: str = 'Are you sure you want to continue?') -> bool: reply = QMessageBox.question(main_window, "Confirm", message, QMessageBox.Yes, QMessageBox.No) return reply == QMessageBox.Yes def open_file_or_dir(target_path: str): if path.exists(target_path): if platform.system() == "Darwin": system("open " + shlex.quote(target_path)) elif platform.system() == "Linux": subprocess.call(["xdg-open", target_path]) else: webbrowser.open_new_tab(path.realpath(target_path)) else: show_message(f"\'{target_path}\' does not exist") def choose_file(name_filters) -> str: file_path = "" dialog = QFileDialog(main_window) dialog.setFileMode(QFileDialog.ExistingFile) dialog.setNameFilters(name_filters) if dialog.exec_(): file_path = dialog.selectedFiles()[0] return file_path def choose_files(name_filters) -> list: file_paths = [] dialog = QFileDialog(main_window) dialog.setFileMode(QFileDialog.ExistingFiles) dialog.setNameFilters([x for x in name_filters]) if dialog.exec_(): file_paths = dialog.selectedFiles() return file_paths def choose_directory() -> str: dir_path = "" dialog = QFileDialog(main_window) dialog.setFileMode(QFileDialog.Directory) if dialog.exec_(): dir_path = dialog.selectedFiles()[0] + "/" return dir_path def choose_save(name_filters) -> str: file_path = "" dialog = QFileDialog(main_window) dialog.setFileMode(QFileDialog.AnyFile) dialog.setAcceptMode(QFileDialog.AcceptSave) dialog.setNameFilters(name_filters) if dialog.exec_(): file_path = dialog.selectedFiles()[0] return file_path def open_in_browser(url: str): webbrowser.open_new_tab(url) def get_yearly_file_dir(base_path: str, vendor_name: str, begin_date: QDate) -> str: return f"{base_path}{begin_date.toString('yyyy')}/{vendor_name}/" def get_yearly_file_name(vendor_name: str, report_type: str, begin_date: QDate) -> str: return f"{begin_date.toString('yyyy')}_{vendor_name}_{report_type}.tsv" def get_special_file_dir(base_path: str, vendor_name: str) -> str: return f"{base_path}{vendor_name}/special/" def get_special_file_name(vendor_name: str, report_type: str, begin_date: QDate, end_date: QDate) -> str: return f"{vendor_name}_{report_type}_{begin_date.toString('yyyy-MMM')}_{end_date.toString('yyyy-MMM')}_S.tsv" def get_other_file_dir(base_path: str, vendor_name: str) -> str: return f"{base_path}{vendor_name}/" def get_other_file_name(vendor_name: str, report_type: str, begin_date: QDate, end_date: QDate) -> str: return f"{vendor_name}_{report_type}_{begin_date.toString('yyyy-MMM')}_{end_date.toString('yyyy-MMM')}.tsv" def get_major_report_type(report_type: str) -> MajorReportType: """Returns a major report type that a report type falls under""" if report_type == "PR" or report_type == "PR_P1": return MajorReportType.PLATFORM elif report_type == "DR" or report_type == "DR_D1" or report_type == "DR_D2": return MajorReportType.DATABASE elif report_type == "TR" or report_type == "TR_B1" or report_type == "TR_B2" \ or report_type == "TR_B3" or report_type == "TR_J1" or report_type == "TR_J2" \ or report_type == "TR_J3" or report_type == "TR_J4": return MajorReportType.TITLE elif report_type == "IR" or report_type == "IR_A1" or report_type == "IR_M1": return MajorReportType.ITEM def save_data_as_tsv(file_name: str, data: Sequence[Any]): """Saves data in a TSV file :param file_name: the name and location to save the results at :param data: the data to save in the file""" file = open(file_name, 'w', newline="", encoding='utf-8-sig') if file.mode == 'w': output = csv.writer(file, delimiter='\t', quotechar='\"') for row in data: output.writerow(row) file.close() else: print('Error: could not open file ' + file_name)