Add files from the old svn, r101.
[matthijs/upstream/mobilegtd.git] / src / model / action.py
1 import re
2 from model import *
3 import config.config as config
4
5 class ActionStatus(Status):
6     pass
7
8 class UnprocessedStatus(Status):
9     def __init__(self):
10         super(UnprocessedStatus,self).__init__(u'unprocessed',0)
11     def update(self,owner):
12         return active
13
14
15
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)
23
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)
26
27
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):
33         status_symbol = u''
34     status = ActionStatus.get_status(status_symbol)
35     info = matching.group('info')
36     context = parse_context(matching.group('context'))
37     if(info==None):
38         info=u''
39     return context,description,info,status    
40
41
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'/')
48     else:
49         context=context_text
50     if (len(context)<2):
51         context = u'None'
52     return context
53
54
55
56
57 class Action(ObservableItem,ItemWithStatus):
58     def parse(string):
59         assert type(string) == unicode
60         context,description,info,status  = parse_action_line(string)
61         return Action(description,context,info=info,status=status)
62     
63     parse = staticmethod(parse)
64     
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
71         
72         self.description = description
73         self.context = context
74         self.info = info
75         self.status = status
76         
77     def is_active(self):
78         return self.status in [active,unprocessed]
79     
80     def is_reviewable(self):
81         return self.status in [unprocessed,inactive]
82     
83     def is_not_done(self):
84         return self.status in [active,unprocessed,inactive]
85         
86     def __repr__(self):
87         advanced_info = u''
88         if self.project:
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)
95     
96     def project_file_string(self,entry_separator=' '):
97         return (u'%s%s'%(self.status_symbol(),self.context_description_info())).strip()
98     
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,\
103                 self.info_string())
104
105     def info_string(self,entry_separator=''):
106         info_string = u''
107         if (len(self.info) > 1):
108             info_string = u'%s(%s)'%(entry_separator,self.info)
109         return info_string
110
111     def __str__(self):
112         return self.project_file_string()
113     def __cmp__(self,other):
114         return self.status.__cmp__(other.status)
115
116     def summary(self):
117         return self.description
118 __all__ = ["Action","ActionStatus","active","done","tickled","inactive","someday","info","unprocessed","parse_action_line","parse_context"]