コード例 #1
0
ファイル: osf_event_handler.py プロジェクト: peircej/osf-sync
 def _get_item_by_path(self, path):
     for node in session.query(Node):
         if ProperPath(node.path, True) == path:
             return node
     for file_folder in session.query(File):
         file_path = ProperPath(file_folder.path, file_folder.is_folder)
         if file_path == path:
             return file_folder
     raise ItemNotInDB("item has path: {}".format(path.full_path))
コード例 #2
0
 def _get_item_by_path(self, path):
     for node in session.query(Node):
         if ProperPath(node.path, True) == path:
             return node
     for file_folder in session.query(File):
         file_path = ProperPath(file_folder.path, file_folder.is_folder)
         if file_path == path:
             return file_folder
     raise ItemNotInDB('item has path: {}'.format(path.full_path))
コード例 #3
0
    def logout(self):
        user = session.query(User).filter(User.logged_in).one()
        user.logged_in = False
        try:
            save(session, user)
        except SQLAlchemyError:
            session.query(User).delete()

        self.tray.tray_icon.hide()
        if self.preferences.isVisible():
            self.preferences.close()

        self.start_screen.open_window()
コード例 #4
0
ファイル: main.py プロジェクト: AndrewSallans/osf-sync
    def logout(self):
        user = session.query(User).filter(User.logged_in).one()
        user.logged_in = False
        try:
            save(session, user)
        except SQLAlchemyError:
            session.query(User).delete()

        self.tray.tray_icon.hide()
        if self.preferences.isVisible():
            self.preferences.close()

        self.start_screen.open_window()
コード例 #5
0
ファイル: preferences.py プロジェクト: AndrewSallans/osf-sync
    def selector(self, selected_index):
        if selected_index == self.GENERAL:
            user = session.query(User).filter(User.logged_in).one()
            containing_folder = os.path.dirname(user.osf_local_folder_path)
            self.preferences_window.containingFolderTextEdit.setText(self._translate("Preferences", containing_folder))
        elif selected_index == self.OSF:
            user = session.query(User).filter(User.logged_in).one()
            self.preferences_window.label.setText(self._translate("Preferences", user.full_name))

            self._executor = QtCore.QThread()
            self.node_fetcher = NodeFetcher()
            self.preferences_window.treeWidget.setCursor(QtCore.Qt.BusyCursor)
            self.node_fetcher.finished[list].connect(self.populate_item_tree)
            self.node_fetcher.moveToThread(self._executor)
            self._executor.started.connect(self.node_fetcher.fetch)
            self._executor.start()
コード例 #6
0
    def log_in(self):
        #self.start_screen.logInButton.setDisabled(True)  # Doesn't update until the asyncio call below returns
        logging.debug('attempting to log in')
        username = self.start_screen.usernameEdit.text().strip()
        password = self.start_screen.passwordEdit.text().strip()
        auth_client = AuthClient()
        user = None
        try:
            user = session.query(User).one()
        except NoResultFound:
            pass

        try:
            user = asyncio.get_event_loop().run_until_complete(auth_client.log_in(user=user, username=username, password=password))
        except AuthError as e:
            logging.exception(e.message)
            QMessageBox.warning(
                None,
                'Log in Failed',
                e.message
            )
            #self.start_screen.logInButton.setEnabled(True)
        else:
            logging.info('Successfully logged in user: {}'.format(user))
            self.close()
コード例 #7
0
ファイル: preferences.py プロジェクト: AndrewSallans/osf-sync
 def update_sync_nodes(self):
     user = session.query(User).filter(User.logged_in).one()
     guid_list = self.get_guid_list()
     # FIXME: This needs a try-except block but is waiting on a preferences refactor to be merged
     user.guid_for_top_level_nodes_to_sync = guid_list
     save(session, user)
     self.checked_items = guid_list
     self.close()
コード例 #8
0
    def start(self):
        logger.debug('Start in main called.')

        try:
            user = session.query(User).filter(User.logged_in).one()
        except MultipleResultsFound:
            session.query(User).delete()
            self.login_signal.emit()
            return
        except NoResultFound:
            self.login_signal.emit()
            return

        try:
            # Simple request to ensure user logged in with valid oauth_token
            user = asyncio.get_event_loop().run_until_complete(
                AuthClient().populate_user_data(user))
        except AuthError as e:
            logging.exception(e.message)
            self.login_signal.emit()

        containing_folder = os.path.dirname(user.osf_local_folder_path)
        while not validate_containing_folder(containing_folder):
            logger.warning(
                'Invalid containing folder: {}'.format(containing_folder))
            AlertHandler.warn(
                'Invalid containing folder. Please choose another.')
            containing_folder = os.path.abspath(
                self.set_containing_folder_initial())

        user.osf_local_folder_path = os.path.join(containing_folder, 'OSF')

        save(session, user)
        self.tray.set_containing_folder(containing_folder)

        if not os.path.isdir(user.osf_local_folder_path):
            os.makedirs(user.osf_local_folder_path)

        self.start_tray_signal.emit()
        logger.debug('starting background worker from main.start')

        self.background_worker = BackgroundWorker()
        self.background_worker.start()
コード例 #9
0
    def get_local_from_remote(self, remote):
        assert isinstance(remote, RemoteObject)

        if isinstance(remote, RemoteNode):
            cls = Node
        elif isinstance(remote, RemoteFileFolder):
            cls = File
        else:
            raise InvalidItemType

        return session.query(cls).filter(cls.osf_id == remote.id).one()
コード例 #10
0
ファイル: polling.py プロジェクト: AndrewSallans/osf-sync
    def get_local_from_remote(self, remote):
        assert isinstance(remote, RemoteObject)

        if isinstance(remote, RemoteNode):
            cls = Node
        elif isinstance(remote, RemoteFileFolder):
            cls = File
        else:
            raise InvalidItemType

        return session.query(cls).filter(cls.osf_id == remote.id).one()
コード例 #11
0
ファイル: main.py プロジェクト: AndrewSallans/osf-sync
    def start(self):
        logger.debug('Start in main called.')

        try:
            user = session.query(User).filter(User.logged_in).one()
        except MultipleResultsFound:
            session.query(User).delete()
            self.login_signal.emit()
            return
        except NoResultFound:
            self.login_signal.emit()
            return

        try:
            # Simple request to ensure user logged in with valid oauth_token
            user = asyncio.get_event_loop().run_until_complete(AuthClient().populate_user_data(user))
        except AuthError as e:
            logging.exception(e.message)
            self.login_signal.emit()

        containing_folder = os.path.dirname(user.osf_local_folder_path)
        while not validate_containing_folder(containing_folder):
            logger.warning('Invalid containing folder: {}'.format(containing_folder))
            AlertHandler.warn('Invalid containing folder. Please choose another.')
            containing_folder = os.path.abspath(self.set_containing_folder_initial())

        user.osf_local_folder_path = os.path.join(containing_folder, 'OSF')

        save(session, user)
        self.tray.set_containing_folder(containing_folder)

        if not os.path.isdir(user.osf_local_folder_path):
            os.makedirs(user.osf_local_folder_path)

        self.start_tray_signal.emit()
        logger.debug('starting background worker from main.start')

        self.background_worker = BackgroundWorker()
        self.background_worker.start()
コード例 #12
0
 def open_window(self):
     if not self.isVisible():
         if not self._has_UI():
             self.start_screen.setupUi(self)
             self.setup_slots()
         try:
             # 'Remember me' functionality
             username = session.query(User).one().osf_login
         except (NoResultFound, AttributeError):
             self.start_screen.usernameEdit.setFocus()
         else:
             self.start_screen.usernameEdit.setText(username)
             self.start_screen.passwordEdit.setFocus()
         #self.start_screen.logInButton.setEnabled(True)
         self.show()
コード例 #13
0
 def open_window(self):
     if not self.isVisible():
         if not self._has_UI():
             self.start_screen.setupUi(self)
             self.setup_slots()
         try:
             # 'Remember me' functionality
             username = session.query(User).one().osf_login
         except (NoResultFound, AttributeError):
             self.start_screen.usernameEdit.setFocus()
         else:
             self.start_screen.usernameEdit.setText(username)
             self.start_screen.passwordEdit.setFocus()
         #self.start_screen.logInButton.setEnabled(True)
         self.show()
コード例 #14
0
ファイル: main.py プロジェクト: AndrewSallans/osf-sync
    def quit(self):
        try:
            if self.background_worker.is_alive():
                logger.info('Stopping background worker')
                self.background_worker.stop()

            try:
                user = session.query(User).filter(User.logged_in).one()
            except NoResultFound:
                pass
            else:
                logger.info('Saving user data')
                save(session, user)
            session.close()
        finally:
            logger.info('Quitting application')
            QApplication.instance().quit()
コード例 #15
0
    def quit(self):
        try:
            if self.background_worker.is_alive():
                logger.info('Stopping background worker')
                self.background_worker.stop()

            try:
                user = session.query(User).filter(User.logged_in).one()
            except NoResultFound:
                pass
            else:
                logger.info('Saving user data')
                save(session, user)
            session.close()
        finally:
            logger.info('Quitting application')
            QApplication.instance().quit()
コード例 #16
0
ファイル: preferences.py プロジェクト: AndrewSallans/osf-sync
    def populate_item_tree(self, nodes):
        self.reset_tree_widget()
        _translate = QCoreApplication.translate
        try:
            user = session.query(User).filter(User.logged_in).one()
        except SQLAlchemyError:
            return

        for node in nodes:
            tree_item = QTreeWidgetItem(self.preferences_window.treeWidget)
            tree_item.setCheckState(self.PROJECT_SYNC_COLUMN, Qt.Unchecked)
            tree_item.setText(self.PROJECT_NAME_COLUMN, _translate("Preferences", path.make_folder_name(node.name, node_id=node.id)))

            if node.id in user.guid_for_top_level_nodes_to_sync:
                tree_item.setCheckState(self.PROJECT_SYNC_COLUMN, Qt.Checked)
                if node.id not in self.checked_items:
                    self.checked_items.append(node.id)

            self.tree_items.append((tree_item, node.id))
        self.preferences_window.treeWidget.resizeColumnToContents(self.PROJECT_SYNC_COLUMN)
        self.preferences_window.treeWidget.resizeColumnToContents(self.PROJECT_NAME_COLUMN)
        self.preferences_window.treeWidget.unsetCursor()
コード例 #17
0
ファイル: preferences.py プロジェクト: AndrewSallans/osf-sync
    def set_containing_folder(self):
        new_containing_folder = QFileDialog.getExistingDirectory(self, "Choose where to place OSF folder")
        osf_path = os.path.join(new_containing_folder, "OSF")

        if new_containing_folder == "":
            # cancel, closed, or no folder chosen
            return
        elif not os.path.exists(osf_path):
            os.makedirs(osf_path)
        elif os.path.isfile(osf_path):
            # FIXME: Consolidate redundant messages
            AlertHandler.warn(
                "An OSF file exists where you would like to create the OSF folder. Delete it, or choose a different location")
            logging.warning("An OSF file exists where you would like to create the OSF folder.")
            return

        user = session.query(User).filter(User.logged_in).one()
        user.osf_local_folder_path = os.path.join(osf_path)

        self.preferences_window.containingFolderTextEdit.setText(self._translate("Preferences", self.containing_folder))
        self.open_window(tab=Preferences.GENERAL)  # todo: dynamically update ui????
        self.containing_folder_updated_signal.emit(new_containing_folder)
コード例 #18
0
ファイル: preferences.py プロジェクト: AndrewSallans/osf-sync
 def closeEvent(self, event):
     guid_list = self.get_guid_list()
     if guid_list != self.checked_items:
         reply = QMessageBox()
         reply.setText('Unsaved changes')
         reply.setIcon(QMessageBox.Warning)
         reply.setInformativeText('You have unsaved changes to your synced projects.\n\n '
                                  'Please review your changes and press \'update\' if you would like to save them. \n\n  '
                                  'Are you sure you would like to leave without saving? \n')
         default = reply.addButton('Exit without saving', QMessageBox.YesRole)
         reply.addButton('Review changes', QMessageBox.NoRole)
         reply.setDefaultButton(default)
         if reply.exec_() != 0:
             return event.ignore()
     try:
         user = session.query(User).filter(User.logged_in).one()
     except SQLAlchemyError:
         pass
     else:
         self.preferences_closed_signal.emit()
     self.reset_tree_widget()
     event.accept()
コード例 #19
0
ファイル: preferences.py プロジェクト: AndrewSallans/osf-sync
    def fetch(self):
        remote_top_level_nodes = []
        try:

            user = session.query(User).filter(User.logged_in).one()
            if user:
                user_nodes = []
                url = api_url_for(USERS, related_type=NODES, user_id=user.osf_id)
                headers = {'Authorization': 'Bearer {}'.format(user.oauth_token)}
                resp = requests.get(url, headers=headers).json()
                user_nodes.extend(resp['data'])
                while resp['links']['next']:
                    resp = requests.get(resp['links']['next'], headers=headers).json()
                    user_nodes.extend(resp['data'])
                for node in user_nodes:
                    verified_node = RemoteNode(node)
                    if verified_node.is_top_level:
                        remote_top_level_nodes.append(verified_node)
        except Exception as e:
            logging.warning(e)

        self.finished.emit(remote_top_level_nodes)
        return remote_top_level_nodes
コード例 #20
0
    def log_in(self):
        #self.start_screen.logInButton.setDisabled(True)  # Doesn't update until the asyncio call below returns
        logging.debug('attempting to log in')
        username = self.start_screen.usernameEdit.text().strip()
        password = self.start_screen.passwordEdit.text().strip()
        auth_client = AuthClient()
        user = None
        try:
            user = session.query(User).one()
        except NoResultFound:
            pass

        try:
            user = asyncio.get_event_loop().run_until_complete(
                auth_client.log_in(user=user,
                                   username=username,
                                   password=password))
        except AuthError as e:
            logging.exception(e.message)
            QMessageBox.warning(None, 'Log in Failed', e.message)
            #self.start_screen.logInButton.setEnabled(True)
        else:
            logging.info('Successfully logged in user: {}'.format(user))
            self.close()
コード例 #21
0
 def _user_logged_in(self):
     try:
         session.query(User).filter(User.logged_in).one()
         return True
     except:
         return False
コード例 #22
0
 def _user_logged_in(self):
     try:
         session.query(User).filter(User.logged_in).one()
         return True
     except:
         return False
コード例 #23
0
 def get_current_user(self):
     return session.query(models.User).one()
コード例 #24
0
 def __init__(self, osf_folder, loop):
     super().__init__()
     self._loop = loop or asyncio.get_event_loop()
     self.osf_folder = ProperPath(osf_folder, True)
     self.user = session.query(User).filter(User.logged_in).one()
コード例 #25
0
ファイル: background.py プロジェクト: peircej/osf-sync
 def get_current_user(self):
     return session.query(models.User).one()
コード例 #26
0
ファイル: osf_event_handler.py プロジェクト: peircej/osf-sync
 def __init__(self, osf_folder, loop):
     super().__init__()
     self._loop = loop or asyncio.get_event_loop()
     self.osf_folder = ProperPath(osf_folder, True)
     self.user = session.query(User).filter(User.logged_in).one()