1 """
2 simple issue tracker module
3
4 @copyright: (c) 2011 hackmeeting U{http://sindominio.net/hackmeeting}
5 @author: Ruben Pollan
6 @organization: hackmeeting U{http://sindominio.net/hackmeeting}
7 @contact: meskio@sindominio.net
8 @license:
9 This program is free software; you can redistribute it and/or
10 modify it under the terms of the Do What The Fuck You Want To
11 Public License, Version 2, as published by Sam Hocevar. See
12 U{http://sam.zoy.org/projects/COPYING.WTFPL} for more details.
13 """
14
15 from emma.events import Event, subscribe, trigger
16 from emma.module import Module
17 from emma.complement import use_lock
18 from emma.interface.message import Message
19 from pymongo import ASCENDING
29
31 if not data:
32 return _(" Keep track of issues.\n"
33 " * issues [group]\n"
34 " Show issues. If group given, filter by it.\n"
35 " * issue group bla\n"
36 " Add new issue, required by the group\n"
37 " * done n\n"
38 " close issue numbered with n in issue list.\n")
39 elif data[0] in ('issues', _('issues')):
40 return _("Show the list of issues.")
41 elif data[0] in ('issue', _('issue')):
42 return _("Add new issue")
43 elif data[0] in ('done', _('done')):
44 return _("Close the issue'")
45 else:
46 return ""
47
49 cmd, args = data[0]
50 if cmd in ("issues", _("issues")):
51 self.issues(event, data)
52 elif cmd in ("issue", _("issue")):
53 self.issue(event, data)
54 elif cmd in ("done", _("done")):
55 self.done(event, data)
56
57 - def get_to(self, event, data):
58 to = data[1]['From']
59 if event.interface == 'irc' and data[1]['To'][0] == '#':
60 to = data[1]['To']
61 return to
62
63 - def reply(self, event, data, message):
69
70 - def issue(self, event, data):
71 cmd, args = data[0]
72 if event.interface == "email":
73 group, text = args.split("\n", 1)
74 else:
75 group, text = args.split(" ", 1)
76 self.db.insert({"group": group, "text": text})
77
78 self.reply(event, data, _("issue accepted"))
79 self.log(_("Issue accepted (%(group)s, %(text)s)") % {'group': group, 'text': text})
80
81 - def issues(self, event, data):
82 cmd, args = data[0]
83 if args:
84 issue_list = self.db.find({'group': args})
85 message = _('Issues of %s group:\n' % args)
86 else:
87 issue_list = self.db.find()
88 message = _('Issues:\n')
89 issue_list.sort('group', ASCENDING)
90
91 to = self.get_to(event, data)
92 issue_list = [issue for issue in issue_list]
93 self.store_issue_list(issue_list, to)
94 issue_template = "\n %(number)4d - %(group)s: %(text)s"
95 counter = 0
96 for issue in issue_list:
97 message += issue_template % {'number': counter,
98 'group': issue['group'],
99 'text': issue['text']}
100 counter += 1
101
102 self.reply(event, data, message)
103
104 - def done(self, event, data):
105 cmd, args = data[0]
106 to = self.get_to(event, data)
107 issue_list = self.issue_list[to]
108 try:
109 index = int(args)
110 except ValueError:
111 self.reply(event, data, _("invalid issue number"))
112 try:
113 self.db.remove(issue_list[index])
114 self.reply(event, data, _("Issue done"))
115 except IndexError:
116 self.reply(event, data, _("invalid issue number"))
117
118 @use_lock
120 self.issue_list[to] = issue_list
121