~ubuntu-branches/ubuntu/maverick/yokadi/maverick

« back to all changes in this revision

Viewing changes to src/yokadi/projectcmd.py

  • Committer: Bazaar Package Importer
  • Author(s): Harald Sitter
  • Date: 2009-07-19 13:01:35 UTC
  • Revision ID: james.westby@ubuntu.com-20090719130135-eonczddb1s21ux1v
Tags: upstream-0.10.0
Import upstream version 0.10.0

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# -*- coding: UTF-8 -*-
 
2
"""
 
3
Project related commands.
 
4
 
 
5
@author: Aurélien Gâteau <aurelien.gateau@free.fr>
 
6
@license: GPLv3
 
7
"""
 
8
from sqlobject import SQLObjectNotFound
 
9
from sqlobject.dberrors import DuplicateEntryError
 
10
 
 
11
import tui
 
12
from completers import ProjectCompleter
 
13
from db import Project, Task
 
14
from yokadiexception import YokadiException
 
15
from yokadioptionparser import YokadiOptionParser
 
16
import parseutils
 
17
import dbutils
 
18
 
 
19
 
 
20
def getProjectFromName(name, parameterName="project_name"):
 
21
    """
 
22
    Helper function which returns a project given its name, or raise a
 
23
    YokadiException if it does not exist.
 
24
    """
 
25
    name = name.strip()
 
26
    if len(name) == 0:
 
27
        raise YokadiException("Missing <%s> parameter" % parameterName)
 
28
 
 
29
    try:
 
30
        return Project.byName(name)
 
31
    except SQLObjectNotFound:
 
32
        raise YokadiException("Project '%s' not found. Use p_list to see all projects." % name)
 
33
 
 
34
 
 
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>]"""
 
39
        if not line:
 
40
            print "Give at least a project name !"
 
41
            return
 
42
        projectName, garbage, keywordDict = parseutils.parseLine(line)
 
43
        if garbage:
 
44
            raise YokadiException("Cannot parse line, got garbage (%s)" % garbage)
 
45
        try:
 
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()):
 
51
            return None
 
52
        project.setKeywordDict(keywordDict)
 
53
 
 
54
    def do_p_edit(self, line):
 
55
        """Edit a project.
 
56
        p_edit <project name>"""
 
57
        project=dbutils.getOrCreateProject(line, createIfNeeded=False)
 
58
 
 
59
        if not project:
 
60
            raise YokadiException("Project does not exist.")
 
61
 
 
62
        # Create project line
 
63
        projectLine = parseutils.createLine(project.name, "", project.getKeywordDict())
 
64
 
 
65
        # Edit
 
66
        line = tui.editLine(projectLine)
 
67
 
 
68
        # Update project
 
69
        projectName, garbage, keywordDict = parseutils.parseLine(line)
 
70
        if garbage:
 
71
            raise YokadiException("Cannot parse line, got garbage (%s)" % garbage)
 
72
        if not dbutils.createMissingKeywords(keywordDict.keys()):
 
73
            return
 
74
        project.name = projectName
 
75
        project.setKeywordDict(keywordDict)
 
76
 
 
77
    complete_p_edit = ProjectCompleter(1)
 
78
 
 
79
    def do_p_list(self, line):
 
80
        """List all projects."""
 
81
        for project in Project.select():
 
82
            if project.active:
 
83
                active = ""
 
84
            else:
 
85
                active = "(inactive)"
 
86
            print "%s %s %s" % (project.name, project.getKeywordsAsString(), active)
 
87
 
 
88
 
 
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)
 
93
 
 
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)
 
98
 
 
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")
 
105
        return parser
 
106
 
 
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):
 
113
                return
 
114
        taskList = Task.select(Task.q.projectID == project.id)
 
115
        taskList = list(taskList)
 
116
        print "Removing project tasks:"
 
117
        for task in taskList:
 
118
            task.delete(task.id)
 
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)
 
123
 
 
124
# vi: ts=4 sw=4 et