def do_p_edit(self, line): """Edit a project. p_edit <project name>""" project = dbutils.getOrCreateProject(line, createIfNeeded=False) if not project: raise YokadiException("Project does not exist.") # Create project line projectLine = parseutils.createLine(project.name, "", project.getKeywordDict()) # Edit line = tui.editLine(projectLine) # Update project projectName, garbage, keywordDict = parseutils.parseLine(line) if garbage: raise BadUsageException("Cannot parse line, got garbage (%s)" % garbage) if not dbutils.createMissingKeywords(keywordDict.keys()): return try: project.name = projectName except DuplicateEntryError: raise YokadiException( "A project named %s already exists. Please find another name" % projectName) project.setKeywordDict(keywordDict)
def do_p_edit(self, line): """Edit a project. p_edit <project name>""" session = db.getSession() project = dbutils.getOrCreateProject(line, createIfNeeded=False) if not project: raise YokadiException("Project does not exist.") # Create project line projectLine = parseutils.createLine(project.name, "", project.getKeywordDict()) # Edit line = tui.editLine(projectLine) # Update project projectName, garbage, keywordDict = parseutils.parseLine(line) if garbage: raise BadUsageException("Cannot parse line, got garbage (%s)" % garbage) if not dbutils.createMissingKeywords(list(keywordDict.keys())): return try: project.name = projectName project.setKeywordDict(keywordDict) session.merge(project) session.commit() except IntegrityError: session.rollback() raise YokadiException("A project named %s already exists. Please find another name" % projectName)
def _t_edit(self, line): """Code shared by t_edit and bug_edit.""" def editComplete(text, state): """ Specific completer for the edit prompt. This subfunction should stay here because it needs to access to cmd members""" if state == 0: origline = readline.get_line_buffer() line = origline.lstrip() stripped = len(origline) - len(line) begidx = readline.get_begidx() - stripped endidx = readline.get_endidx() - stripped if begidx > 0: self.completion_matches = projectAndKeywordCompleter( "", text, line, begidx, endidx, shift=1) else: self.completion_matches = [] try: return self.completion_matches[state] except IndexError: return None task = self.getTaskFromId(line) if self.cryptoMgr.isEncrypted(task.title): self.cryptoMgr.force_decrypt = True # Decryption must be turned on to edit title = self.cryptoMgr.decrypt(task.title) # Create task line taskLine = parseutils.createLine("", title, task.getKeywordDict()) oldCompleter = readline.get_completer( ) # Backup previous completer to restore it in the end readline.set_completer(editComplete) # Switch to specific completer while True: # Edit print "(Press Ctrl+C to cancel)" try: line = tui.editLine(taskLine) if not line.strip(): tui.warning("Missing title") continue except KeyboardInterrupt: print print "Cancelled" task = None break foo, title, keywordDict = parseutils.parseLine(task.project.name + " " + line) if self.cryptoMgr.isEncrypted(task.title): title = self.cryptoMgr.encrypt(title) if dbutils.updateTask(task, task.project.name, title, keywordDict): break readline.set_completer(oldCompleter) # Restore standard completer return task
def _t_edit(self, line): """Code shared by t_edit and bug_edit.""" def editComplete(text, state): """ Specific completer for the edit prompt. This subfunction should stay here because it needs to access to cmd members""" if state == 0: origline = readline.get_line_buffer() line = origline.lstrip() stripped = len(origline) - len(line) begidx = readline.get_begidx() - stripped endidx = readline.get_endidx() - stripped if begidx > 0: self.completion_matches = projectAndKeywordCompleter("", text, line, begidx, endidx, shift=1) else: self.completion_matches = [] try: return self.completion_matches[state] except IndexError: return None task = self.getTaskFromId(line) if self.cryptoMgr.isEncrypted(task.title): self.cryptoMgr.force_decrypt = True # Decryption must be turned on to edit title = self.cryptoMgr.decrypt(task.title) # Create task line taskLine = parseutils.createLine("", title, task.getKeywordDict()) oldCompleter = readline.get_completer() # Backup previous completer to restore it in the end readline.set_completer(editComplete) # Switch to specific completer while True: # Edit print("(Press Ctrl+C to cancel)") try: line = tui.editLine(taskLine) if not line.strip(): tui.warning("Missing title") continue except KeyboardInterrupt: print() print("Cancelled") task = None break foo, title, keywordDict = parseutils.parseLine(task.project.name + " " + line) if self.cryptoMgr.isEncrypted(task.title): title = self.cryptoMgr.encrypt(title) if dbutils.updateTask(task, task.project.name, title, keywordDict): break readline.set_completer(oldCompleter) # Restore standard completer self.session.merge(task) return task
def do_k_edit(self, line): """Edit a keyword k_edit @<keyword>""" session = db.getSession() keyword = dbutils.getKeywordFromName(line) oldName = keyword.name newName = tui.editLine(oldName) if newName == "": print("Cancelled") return lst = session.query(Keyword).filter_by(name=newName).all() if len(lst) == 0: # Simple case: newName does not exist, just rename the existing keyword keyword.name = newName session.merge(keyword) session.commit() print("Keyword %s has been renamed to %s" % (oldName, newName)) return # We already have a keyword with this name, we need to merge print("Keyword %s already exists" % newName) if not tui.confirm("Do you want to merge %s and %s" % (oldName, newName)): return # Check we can merge conflictingTasks = [] for task in keyword.tasks: kwDict = task.getKeywordDict() if oldName in kwDict and newName in kwDict and kwDict[ oldName] != kwDict[newName]: conflictingTasks.append(task) if len(conflictingTasks) > 0: # We cannot merge tui.error("Cannot merge keywords %s and %s because they are both" " used with different values in these tasks:" % (oldName, newName)) for task in conflictingTasks: print("- %d, %s" % (task.id, task.title)) print("Edit these tasks and try again") return # Merge for task in keyword.tasks: kwDict = task.getKeywordDict() if newName not in kwDict: kwDict[newName] = kwDict[oldName] del kwDict[oldName] task.setKeywordDict(kwDict) session.delete(keyword) session.commit() print("Keyword %s has been merged with %s" % (oldName, newName))
def do_k_edit(self, line): """Edit a keyword k_edit @<keyword>""" session = db.getSession() keyword = dbutils.getKeywordFromName(line) oldName = keyword.name newName = tui.editLine(oldName) if newName == "": print("Cancelled") return lst = session.query(Keyword).filter_by(name=newName).all() if len(lst) == 0: # Simple case: newName does not exist, just rename the existing keyword keyword.name = newName session.merge(keyword) session.commit() print("Keyword %s has been renamed to %s" % (oldName, newName)) return # We already have a keyword with this name, we need to merge print("Keyword %s already exists" % newName) if not tui.confirm("Do you want to merge %s and %s" % (oldName, newName)): return # Check we can merge conflictingTasks = [] for task in keyword.tasks: kwDict = task.getKeywordDict() if oldName in kwDict and newName in kwDict and kwDict[oldName] != kwDict[newName]: conflictingTasks.append(task) if len(conflictingTasks) > 0: # We cannot merge tui.error("Cannot merge keywords %s and %s because they are both" " used with different values in these tasks:" % (oldName, newName)) for task in conflictingTasks: print("- %d, %s" % (task.id, task.title)) print("Edit these tasks and try again") return # Merge for task in keyword.tasks: kwDict = task.getKeywordDict() if newName not in kwDict: kwDict[newName] = kwDict[oldName] del kwDict[oldName] task.setKeywordDict(kwDict) session.delete(keyword) session.commit() print("Keyword %s has been merged with %s" % (oldName, newName))
def do_a_edit_command(self, line): """Edit the command of an alias. a_edit_command <alias name>""" session = db.getSession() name = line if name not in self.aliases: raise YokadiException("There is no alias named {}".format(name)) command = tui.editLine(self.aliases[name]) session = db.getSession() db.Alias.setCommand(session, name, command) session.commit() self._updateAliasDict()
def do_a_edit_name(self, line): """Edit the name of an alias. a_edit_name <alias name>""" session = db.getSession() name = line if name not in self.aliases: raise YokadiException("There is no alias named {}".format(name)) newName = tui.editLine(name) newName = parseOneWordName(newName) if newName in self.aliases: raise YokadiException("There is already an alias named {}.".format(newName)) session = db.getSession() db.Alias.rename(session, name, newName) session.commit() self._updateAliasDict()
def do_a_edit_name(self, line): """Edit the name of an alias. a_edit_name <alias name>""" session = db.getSession() name = line if not name in self.aliases: raise YokadiException("There is no alias named {}".format(name)) newName = tui.editLine(name) newName = parseutils.parseOneWordName(newName) if newName in self.aliases: raise YokadiException("There is already an alias named {}.".format(newName)) session = db.getSession() db.Alias.rename(session, name, newName) session.commit() self._updateAliasDict()
def askPassphrase(self): """Ask user for passphrase if needed""" cache = bool(int(db.getConfigKey("PASSPHRASE_CACHE", environ=False))) if self.passphrase and cache: return self.passphrase = tui.editLine("", prompt="passphrase> ", echo=False) self.passphrase = adjustString(self.passphrase, KEY_LENGTH) if not self.isPassphraseValid() and cache: self.passphrase = None self.force_decrypt = False # As passphrase is invalid, don't force decrypt for next time raise YokadiException("Passphrase differ from previous one." "If you really want to change passphrase, " "you should blank the CRYPTO_CHECK parameter " "with c_set CRYPTO_CHECK '' " "Note that you won't be able to retrieve previous tasks you " "encrypted with your lost passphrase") else: # Now that passphrase is valid, we will always decrypt encrypted data self.force_decrypt = True
def do_p_edit(self, line): """Edit a project. p_edit <project name>""" session = db.getSession() project = dbutils.getOrCreateProject(line, createIfNeeded=False) if not project: raise YokadiException("Project does not exist.") # Edit line = tui.editLine(project.name) # Update project projectName = parseutils.parseOneWordName(line) try: project.name = projectName session.commit() except IntegrityError: session.rollback() raise YokadiException("A project named %s already exists. Please find another name" % projectName)
def askPassphrase(self): """Ask user for passphrase if needed""" cache = bool(int(db.getConfigKey("PASSPHRASE_CACHE", environ=False))) if self.passphrase and cache: return self.passphrase = tui.editLine("", prompt="passphrase> ", echo=False) self.passphrase = adjustString(self.passphrase, KEY_LENGTH) if not self.isPassphraseValid() and cache: self.passphrase = None self.force_decrypt = False # As passphrase is invalid, don't force decrypt for next time raise YokadiException( "Passphrase differ from previous one." "If you really want to change passphrase, " "you should blank the CRYPTO_CHECK parameter " "with c_set CRYPTO_CHECK '' " "Note that you won't be able to retrieve previous tasks you " "encrypted with your lost passphrase") else: # Now that passphrase is valid, we will always decrypt encrypted data self.force_decrypt = True
def _t_edit(self, line, keywordEditor=None): """Code shared by t_edit and bug_edit. if keywordEditor is not None it will be called after editing the task. Returns the modified task if OK, None if cancelled""" def editComplete(text, state): """ Specific completer for the edit prompt. This subfunction should stay here because it needs to access to cmd members""" if state == 0: origline = readline.get_line_buffer() line = origline.lstrip() stripped = len(origline) - len(line) begidx = readline.get_begidx() - stripped endidx = readline.get_endidx() - stripped if begidx > 0: self.completion_matches = projectAndKeywordCompleter( "", text, line, begidx, endidx, shift=1) else: self.completion_matches = [] try: return self.completion_matches[state] except IndexError: return None task = self.getTaskFromId(line) if self.cryptoMgr.isEncrypted(task.title): self.cryptoMgr.force_decrypt = True # Decryption must be turned on to edit title = self.cryptoMgr.decrypt(task.title) # Create task line keywordDict = task.getKeywordDict() userKeywordDict, keywordDict = dbutils.splitKeywordDict(keywordDict) taskLine = parseutils.createLine("", title, userKeywordDict) oldCompleter = readline.get_completer( ) # Backup previous completer to restore it in the end readline.set_completer(editComplete) # Switch to specific completer # Edit try: while True: print("(Press Ctrl+C to cancel)") try: line = tui.editLine(taskLine) if not line.strip(): tui.warning("Missing title") continue except KeyboardInterrupt: print() print("Cancelled") return None _, title, userKeywordDict = parseutils.parseLine( task.project.name + " " + line) if self.cryptoMgr.isEncrypted(task.title): title = self.cryptoMgr.encrypt(title) if dbutils.createMissingKeywords(userKeywordDict.keys()): # We were able to create missing keywords if there were any, # we can now exit the edit loop break finally: readline.set_completer(oldCompleter) keywordDict.update(userKeywordDict) if keywordEditor: keywordEditor(keywordDict) task.title = title task.setKeywordDict(keywordDict) return task
def _t_edit(self, line, keywordEditor=None): """Code shared by t_edit and bug_edit. if keywordEditor is not None it will be called after editing the task. Returns the modified task if OK, None if cancelled""" def editComplete(text, state): """ Specific completer for the edit prompt. This subfunction should stay here because it needs to access to cmd members""" if state == 0: origline = readline.get_line_buffer() line = origline.lstrip() stripped = len(origline) - len(line) begidx = readline.get_begidx() - stripped endidx = readline.get_endidx() - stripped if begidx > 0: self.completion_matches = projectAndKeywordCompleter("", text, line, begidx, endidx, shift=1) else: self.completion_matches = [] try: return self.completion_matches[state] except IndexError: return None task = self.getTaskFromId(line) # Create task line keywordDict = task.getKeywordDict() userKeywordDict, keywordDict = dbutils.splitKeywordDict(keywordDict) taskLine = parseutils.createLine("", task.title, userKeywordDict) oldCompleter = readline.get_completer() # Backup previous completer to restore it in the end readline.set_completer(editComplete) # Switch to specific completer # Edit try: while True: print("(Press Ctrl+C to cancel)") try: line = tui.editLine(taskLine) if not line.strip(): tui.warning("Missing title") continue except KeyboardInterrupt: print() print("Cancelled") return None _, title, userKeywordDict = parseutils.parseLine(task.project.name + " " + line) if dbutils.createMissingKeywords(userKeywordDict.keys()): # We were able to create missing keywords if there were any, # we can now exit the edit loop break finally: readline.set_completer(oldCompleter) keywordDict.update(userKeywordDict) if keywordEditor: keywordEditor(keywordDict) task.title = title task.setKeywordDict(keywordDict) return task