1
# -*- coding: UTF-8 -*-
3
Project related commands.
5
@author: Aurélien Gâteau <aurelien.gateau@free.fr>
8
from sqlobject import SQLObjectNotFound
9
from sqlobject.dberrors import DuplicateEntryError
12
from completers import ProjectCompleter
13
from db import Project, Task
14
from yokadiexception import YokadiException
15
from yokadioptionparser import YokadiOptionParser
20
def getProjectFromName(name, parameterName="project_name"):
22
Helper function which returns a project given its name, or raise a
23
YokadiException if it does not exist.
27
raise YokadiException("Missing <%s> parameter" % parameterName)
30
return Project.byName(name)
31
except SQLObjectNotFound:
32
raise YokadiException("Project '%s' not found. Use p_list to see all projects." % name)
35
class ProjectCmd(object):
36
def do_p_add(self, line):
37
"""Add new project. Will prompt to create keywords if they do not exist.
38
p_add <projectName> [@<keyword1>] [@<keyword2>]"""
40
print "Give at least a project name !"
42
projectName, garbage, keywordDict = parseutils.parseLine(line)
44
raise YokadiException("Cannot parse line, got garbage (%s)" % garbage)
46
project = Project(name=projectName)
47
except DuplicateEntryError:
48
raise YokadiException("A project named %s already exists. Please find another name" % projectName)
49
print "Added project '%s'" % projectName
50
if not dbutils.createMissingKeywords(keywordDict.keys()):
52
project.setKeywordDict(keywordDict)
54
def do_p_edit(self, line):
56
p_edit <project name>"""
57
project=dbutils.getOrCreateProject(line, createIfNeeded=False)
60
raise YokadiException("Project does not exist.")
63
projectLine = parseutils.createLine(project.name, "", project.getKeywordDict())
66
line = tui.editLine(projectLine)
69
projectName, garbage, keywordDict = parseutils.parseLine(line)
71
raise YokadiException("Cannot parse line, got garbage (%s)" % garbage)
72
if not dbutils.createMissingKeywords(keywordDict.keys()):
74
project.name = projectName
75
project.setKeywordDict(keywordDict)
77
complete_p_edit = ProjectCompleter(1)
79
def do_p_list(self, line):
80
"""List all projects."""
81
for project in Project.select():
86
print "%s %s %s" % (project.name, project.getKeywordsAsString(), active)
89
def do_p_set_active(self, line):
90
"""Activate the given project"""
91
getProjectFromName(line).active=True
92
complete_p_set_active = ProjectCompleter(1)
94
def do_p_set_inactive(self, line):
95
"""Desactivate the given project"""
96
getProjectFromName(line).active=False
97
complete_p_set_inactive = ProjectCompleter(1)
99
def parser_p_remove(self):
100
parser = YokadiOptionParser()
101
parser.set_usage("p_remove [options] <project_name>")
102
parser.set_description("Remove a project and all its associated tasks.")
103
parser.add_option("-f", dest="force", default=False, action="store_true",
104
help="Skip confirmation prompt")
107
def do_p_remove(self, line):
108
parser = self.parser_p_remove()
109
options, args = parser.parse_args(line)
110
project = getProjectFromName(' '.join(args))
111
if not options.force:
112
if not tui.confirm("Remove project '%s' and all its tasks" % project.name):
114
taskList = Task.select(Task.q.projectID == project.id)
115
taskList = list(taskList)
116
print "Removing project tasks:"
117
for task in taskList:
119
print "- task %(id)-3s: %(title)-30s" % dict(id=str(task.id), title=str(task.title))
120
project.delete(project.id)
121
print "Project removed"
122
complete_p_remove = ProjectCompleter(1)