Skip to content

Commit

Permalink
Add ability to turn a task into a note and vice-versa
Browse files Browse the repository at this point in the history
  • Loading branch information
agateau committed Jan 27, 2017
1 parent 8f3fd3b commit 5a6a0fd
Show file tree
Hide file tree
Showing 4 changed files with 67 additions and 0 deletions.
1 change: 1 addition & 0 deletions NEWS
Expand Up @@ -2,6 +2,7 @@ v1.x.y unreleased

- New features:
- A new command has been added: `p_merge`, to merge a project into another.
- It is now possible to turn a task into a note with `t_to_note` and a note into a task with `n_to_task`.

v1.1.1 2016/11/11

Expand Down
26 changes: 26 additions & 0 deletions yokadi/core/db.py
Expand Up @@ -205,6 +205,32 @@ def setRecurrenceRule(self, rule):
self.recurrence = rule
self.dueDate = rule.getNext()

@staticmethod
def getNoteKeyword(session):
return session.query(Keyword).filter_by(name=NOTE_KEYWORD).one()

def toNote(self, session):
session.add(TaskKeyword(task=self, keyword=Task.getNoteKeyword(session), value=None))
try:
session.flush()
except IntegrityError:
# Already a note
session.rollback()
return

def toTask(self, session):
noteKeyword = Task.getNoteKeyword(session)
try:
taskKeyword = session.query(TaskKeyword).filter_by(task=self, keyword=noteKeyword).one()
except NoResultFound:
# Already a task
return
session.delete(taskKeyword)

def isNote(self, session):
noteKeyword = Task.getNoteKeyword(session)
return any((x.keyword == noteKeyword for x in self.taskKeywords))

def __repr__(self):
return "<Task id={} title={}>".format(self.id, self.title)

Expand Down
26 changes: 26 additions & 0 deletions yokadi/tests/tasktestcase.py
Expand Up @@ -333,4 +333,30 @@ def testDue(self):
for bad_input in ("coucou", "+1s"):
self.assertRaises(YokadiException, self.cmd.do_t_due, "1 %s" % bad_input)

def testToNote(self):
tui.addInputAnswers("y")
self.cmd.do_t_add("x t1")

self.cmd.do_t_to_note(1)
task = self.session.query(Task).get(1)
self.assertTrue(task.isNote(self.session))

# Doing it twice should not fail
self.cmd.do_t_to_note(1)
task = self.session.query(Task).get(1)
self.assertTrue(task.isNote(self.session))

def testToTask(self):
tui.addInputAnswers("y")
self.cmd.do_n_add("x t1")

self.cmd.do_n_to_task(1)
task = self.session.query(Task).get(1)
self.assertFalse(task.isNote(self.session))

# Doing it twice should not fail
self.cmd.do_n_to_task(1)
task = self.session.query(Task).get(1)
self.assertFalse(task.isNote(self.session))

# vi: ts=4 sw=4 et
14 changes: 14 additions & 0 deletions yokadi/ycli/taskcmd.py
Expand Up @@ -1032,4 +1032,18 @@ def do_t_filter(self, line):
prompt += " %s" % (" ".join([str(k) for k in keywordFilters]))
self.prompt = "%s> " % prompt

def do_t_to_note(self, line):
"""Turns a task into a note
"""
task = self.getTaskFromId(line)
task.toNote(self.session)
self.session.commit()

def do_n_to_task(self, line):
"""Turns a note into a task
"""
task = self.getTaskFromId(line)
task.toTask(self.session)
self.session.commit()

# vi: ts=4 sw=4 et

0 comments on commit 5a6a0fd

Please sign in to comment.