def check(self, p_prev: Path = None, check_pics=True, **kw): """Check if self.p_event exists. Parameters ---------- p_prev : Path, optional Compare against manually given path, default None\n check_pics : bool, optional Returns ------- bool True if folder exists or replace was successful. """ from smseventlog.gui import dialogs as dlgs if not fl.drive_exists(**kw): return p = self._p_event p_blank = self.p_event_blank if not p.exists(): if not p_prev is None and p_prev.exists(): # rename folder when title changed fl.move_folder(p_src=p_prev, p_dst=p) elif p_blank.exists(): # if wo_blank stills exists but event now has a WO, automatically rename fl.move_folder(p_src=p_blank, p_dst=p) else: # show folder picker dialog msg = f'Can\'t find folder:\n\'{p.name}\'\n\nWould you like to link it?' if dlgs.msgbox(msg=msg, yesno=True): p_old = dlgs.select_single_folder(p_start=p.parent) # if user selected a folder if p_old: fl.move_folder(p_src=p_old, p_dst=p) if not p.exists(): # if user declined to create OR failed to choose a folder, ask to create msg = f'Folder:\n\'{p.name}\' \n\ndoesn\'t exist, create now?' if dlgs.msgbox(msg=msg, yesno=True): self.create_folder() if p.exists(): if check_pics: self.set_pics() return True else: return False
def zip_recent_dls_unit(unit: str, _zip=True) -> Path: """Func for gui to find (optional zip) most recent dls folder by parsing date in folder title""" from smseventlog.gui import _global as gbl from smseventlog.gui.dialogs import msg_simple, msgbox p_dls = get_recent_dls_unit(unit=unit) if not p_dls is None: msg = f'Found DLS folder: {p_dls.name}, calculating size...' gbl.update_statusbar(msg) gbl.get_mainwindow().app.processEvents() size = fl.calc_size(p_dls) msg = f'Found DLS folder:\n\n{p_dls.name}\n{size}\n\nZip now?' if not msgbox(msg=msg, yesno=True): return else: msg = 'Couldn\'t find recent DLS folder, check folder structure for issues.' msg_simple(msg=msg, icon='warning') return if _zip: p_zip = fl.zip_folder_threadsafe(p_src=p_dls, delete=False) return p_zip else: return p_dls
def handle_monthly_report_result(self, rep=None): if rep is None: return rep.open_() msg = f'Report:\n\n"{rep.title}"\n\nsuccessfully created. Email now?' if dlgs.msgbox(msg=msg, yesno=True): rep.email()
def create_plm_report(self): """Trigger plm report from current unit selected in table""" from smseventlog.data.internal import plm view = self.active_table() try: e = view.e unit, d_upper = e.Unit, e.DateAdded except er.NoRowSelectedError: # don't set dialog w unit and date, just default unit, d_upper, e = None, None, None # Report dialog will always set final unit etc dlg = dlgs.PLMReport(unit=unit, d_upper=d_upper) ok = dlg.exec() if not ok: return # user exited m = dlg.get_items(lower=True) # unit, d_upper, d_lower # check if unit selected matches event selected if not e is None: if not e.Unit == m['unit']: e = None m['e'] = e # NOTE could make a func 'rename_dict_keys' m['d_upper'], m['d_lower'] = m['date upper'], m['date lower'] # check max date in db maxdate = plm.max_date_plm(unit=m['unit']) if maxdate + delta(days=5) < m['d_upper']: # worker will call back and make report when finished if not fl.drive_exists(warn=False): msg = 'Can\'t connect to P Drive. Create report without updating records first?' if dlgs.msgbox(msg=msg, yesno=True): self.make_plm_report(**m) return Worker(func=plm.update_plm_single_unit, mw=self, unit=m['unit']) \ .add_signals( signals=('result', dict( func=self.handle_import_result, kw=m))) \ .start() msg = f'Max date in db: {maxdate:%Y-%m-%d}. ' \ + 'Importing haul cylce files from network drive, this may take a few minutes...' self.update_statusbar(msg=msg) else: # just make report now self.make_plm_report(**m)
def check_overwrite(self, p_base=None): if p_base is None: p_base = Path.home() / 'Desktop' p = p_base / f'{self.title}.{self.ext}' if p.exists(): from smseventlog.gui.dialogs import msgbox msg = f'File "{p.name}" already exists. Overwrite?' return msgbox(msg=msg, yesno=True) return True
def _install_update(self, updater: Updater = None, ask_user: bool = True, allow_dismissed: bool = False) -> None: """Ask if user wants to update and show changelog Parameters ---------- updater : Updater, optional Updater obj, default None ask_user : bool, optional prompt user to update or just install, default True allow_dismissed : bool, optional allow ignoring patch updates if user has dismissed once """ # update check failed, None result from thread if updater is None: return v_current = updater.version v_latest = updater.ver_latest # check if PATCH update has been dismissed if not updater.needs_update and allow_dismissed: log.info('User declined current update. current:' + f'{v_latest}, dismissed: {updater.ver_dismissed}') return # show changelog between current installed and latest version markdown_msg = updater.get_changelog_new() # prompt user to install update and restart msg = 'An updated version of the Event Log is available.\n\n' \ + f'Current: {v_current}\n' \ + f'Latest: {v_latest}\n\n' \ + 'Would you like to restart and update now?' \ + '\n\nNOTE - Patch updates (eg x.x.1) can be dismissed. Use Help > Check for Update ' \ + 'to prompt again.' if ask_user: if not dlgs.msgbox(msg=msg, yesno=True, markdown_msg=markdown_msg): # mark version as dismissed self.settings.setValue('ver_dismissed', str(v_latest)) self.update_statusbar( f'User dismissed update version: {v_latest}', log_=True) return Worker(func=updater.install_update, mw=self).start() self.update_statusbar('Extracting update and restarting...')
def ask_delete_files(msg: str = None, statusmsg: str = None, lst_csv: list = None) -> None: if msg is None: return if isinstance(msg, tuple): # came back from worker thread # NOTE kinda ugly msg, statusmsg, lst_csv = msg[0], msg[1], msg[2] msg += '\n\nWould you like to delete files?' if dlgs.msgbox(msg=msg, yesno=True, statusmsg=statusmsg): for p in lst_csv: p.unlink()
def handle_plm_result(self, rep=None, unit=None, **kw): if rep is False: # not super robust, but just warn if no rows in query msg = 'No rows returned in query, can\'t create report!' dlgs.msg_simple(msg=msg, icon='warning') if not rep or not rep.p_rep.exists(): self.update_statusbar('Failed to create PLM report.', warn=True) return self.update_statusbar(f'PLM report created for unit {unit}', success=True) msg = f'Report:\n\n"{rep.title}"\n\nsuccessfully created. Open now?' if dlgs.msgbox(msg=msg, yesno=True): rep.open_()
def get_import_files(): # load all csv files from import folder to df p = cf.p_drive / cf.config['FilePaths']['Import FC'] lst = [f for f in p.glob('*.csv')] if lst: new_files = '\n\t'.join([p.name for p in lst]) msg = f'Found file(s): \n\t{new_files}\n\nWould you like to import?' if not dlgs.msgbox(msg=msg, yesno=True): return else: msg = f'No files founnd in import folder: \n\n{p}' dlgs.msg_simple(msg=msg, icon='Warning') return return lst
def create_folder(self, show=True, ask_show=False): from smseventlog.gui import dialogs as dlgs fl.drive_exists() try: p = self._p_event p_pics = p / 'Pictures' # p_dls = p / 'Downloads' if not p.exists(): p_pics.mkdir(parents=True) # p_dls.mkdir(parents=True) if ask_show: msg = 'Event folder created. Would you like to open?' if dlgs.msgbox(msg=msg, yesno=True): self.show() elif show: self.show() except: msg = 'Can\'t create folder!' dlgs.msg_simple(msg=msg, icon='critical') log.error(msg, exc_info=True)
def make_plm_report(self, e=None, **kw): """Actually make the report pdf""" from smseventlog import eventfolders as efl from smseventlog.reports import PLMUnitReport rep = PLMUnitReport(mw=self, **kw) if not e is None: ef = efl.EventFolder.from_model(e) p = ef._p_event else: ef = None # If cant get event folder, ask to create at desktop if ef is None or not ef.check(check_pics=False, warn=False): p = Path.home() / 'Desktop' msg = 'Can\'t get event folder, create report at desktop?' if not dlgs.msgbox(msg=msg, yesno=True): return Worker(func=rep.create_pdf, mw=self, p_base=p) \ .add_signals(signals=('result', dict(func=self.handle_plm_result, kw=kw))) \ .start() self.update_statusbar(f'Creating PLM report for unit {kw["unit"]}...')
def show_full_changelog(self) -> None: """Show full changelog""" msg = self.updater.get_changelog_full() dlgs.msgbox(msg='Changelog:', markdown_msg=msg)