def applyChanges(project, oldList, newList, interactive=True): """ Modify a project so that its task list is newList @param project: the project name @param oldList: a list of Task instances @param newList: a list of MEditEntry @param interactive: whether to confirm creation of new keywords """ session = db.getSession() # Sanity check: all ids in newList should be in oldList oldIds = set([x.id for x in oldList]) newIds = set([x.id for x in newList if x.id is not None]) unknownIds = newIds.difference(oldIds) if unknownIds: idString = ", ".join([str(x) for x in unknownIds]) raise YokadiException("Unknown id(s): %s" % idString) # Check keywords for entry in newList: for name in entry.keywords: dbutils.getOrCreateKeyword(name, interactive=interactive) # Remove tasks whose lines have been deleted for id in oldIds.difference(newIds): task = dbutils.getTaskFromId(id) session.delete(task) # Update existing tasks, add new ones nbTasks = len(newList) for pos, newEntry in enumerate(newList): if newEntry.id: task = dbutils.getTaskFromId(newEntry.id) else: task = Task(creationDate=datetime.now().replace(second=0, microsecond=0), project=project) task.title = newEntry.title task.setKeywordDict(newEntry.keywords) task.setStatus(newEntry.status) task.urgency = nbTasks - pos if newEntry.id: session.merge(task) else: session.add(task)