3 import config.config as config
5 class ActionStatus(Status):
8 class UnprocessedStatus(Status):
10 super(UnprocessedStatus,self).__init__(u'unprocessed',0)
11 def update(self,owner):
16 unprocessed = UnprocessedStatus()
17 active = ActionStatus(u'active',1,u'-')
18 done = ActionStatus(u'done',2,u'+')
19 tickled = ActionStatus(u'tickled',3,u'/')
20 inactive = ActionStatus(u'inactive',4,u'!')
21 someday = ActionStatus(u'someday',5,u'~')
22 info = ActionStatus(u'info',0)
24 action_regexp = re.compile('(?P<status>[+-/!])?\s*(?P<context>\S*)\s*(?P<description>[^\(]*)(\((?P<info>[^\)]*))?',re.U)
25 context_regexp = re.compile('(?P<numbers>\d*)(?P<text>\D?.*)',re.U)
28 def parse_action_line(string):
29 matching = action_regexp.match(string)
30 description = matching.group('description').rstrip(u' \r\n')
31 status_symbol = matching.group('status')
32 if (status_symbol == None):
34 status = ActionStatus.get_status(status_symbol)
35 info = matching.group('info')
36 context = parse_context(matching.group('context'))
39 return context,description,info,status
42 def parse_context(context):
43 context_matching = context_regexp.match(context)
44 context_numbers = context_matching.group('numbers')
45 context_text = context_matching.group('text')
46 if(context_numbers in config.ABBREVIATIONS):
47 context=(unicode(config.ABBREVIATIONS[context_numbers])+context_text).rstrip(u'/')
57 class Action(ObservableItem,ItemWithStatus):
59 assert type(string) == unicode
60 context,description,info,status = parse_action_line(string)
61 return Action(description,context,info=info,status=status)
63 parse = staticmethod(parse)
65 def __init__(self,description,context,project=None,info=u'',status=unprocessed):
66 super(Action, self).__init__()
67 self.project = project
68 assert type(description) == unicode
69 assert type(context) == unicode
70 assert type(info) == unicode
72 self.description = description
73 self.context = context
78 return self.status in [active,unprocessed]
80 def is_reviewable(self):
81 return self.status in [unprocessed,inactive]
83 def is_not_done(self):
84 return self.status in [active,unprocessed,inactive]
89 advanced_info = advanced_info+' Project: '+str(self.project)
90 if len(self.info) > 0:
91 advanced_info = advanced_info +' Info: '+self.info
92 if len(advanced_info) > 0:
93 advanced_info = ' ('+advanced_info+' )'
94 return repr(self.description)+' @'+repr(self.context)+repr(advanced_info)
96 def project_file_string(self,entry_separator=' '):
97 return (u'%s%s'%(self.status_symbol(),self.context_description_info())).strip()
99 def context_description_info(self,entry_separator=' '):
100 return u'%s%s%s%s%s'%(\
101 self.context,entry_separator,\
102 self.description,entry_separator,\
105 def info_string(self,entry_separator=''):
107 if (len(self.info) > 1):
108 info_string = u'%s(%s)'%(entry_separator,self.info)
112 return self.project_file_string()
113 def __cmp__(self,other):
114 return self.status.__cmp__(other.status)
117 return self.description
118 __all__ = ["Action","ActionStatus","active","done","tickled","inactive","someday","info","unprocessed","parse_action_line","parse_context"]