Пример #1
0
    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
Пример #2
0
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
Пример #3
0
    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()
Пример #4
0
    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)
Пример #5
0
    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
Пример #6
0
    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...')
Пример #7
0
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()
Пример #8
0
    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_()
Пример #9
0
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
Пример #10
0
    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)
Пример #11
0
    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"]}...')
Пример #12
0
 def show_full_changelog(self) -> None:
     """Show full changelog"""
     msg = self.updater.get_changelog_full()
     dlgs.msgbox(msg='Changelog:', markdown_msg=msg)