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))
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))
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()
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()
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()
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()
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()
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()
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()
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()
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()
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()
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)
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()
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
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()
def _user_logged_in(self): try: session.query(User).filter(User.logged_in).one() return True except: return False
def get_current_user(self): return session.query(models.User).one()
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()