Package emma :: Package module :: Package issues
[hide private]
[frames] | no frames]

Source Code for Package emma.module.issues

  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 
20 21 22 -class issues(Module):
23 - def run(self):
24 self.issue_list = {} 25 help_event = Event(event="help", identifier=self.conf['id']) 26 subscribe(help_event, self.help_handler) 27 cmd_event = Event(event="command", identifier=self.conf['id']) 28 subscribe(cmd_event, self.cmd_handler)
29
30 - def help_handler(self, event, data):
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
48 - def cmd_handler(self, event, data):
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):
64 to = self.get_to(event, data) 65 msg = Message(message, to) 66 event = Event(event="send", interface=event.interface, 67 identifier=event.identifier) 68 trigger(event, msg)
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
119 - def store_issue_list(self, issue_list, to):
120 self.issue_list[to] = issue_list
121