1
# -*- coding: utf-8 -*-
2
# Copyright (c) 2009 - Luca Invernizzi <invernizzi.l@gmail.com>
4
# This program is free software: you can redistribute it and/or modify it under
5
# the terms of the GNU General Public License as published by the Free Software
6
# Foundation, either version 3 of the License, or (at your option) any later
9
# This program is distributed in the hope that it will be useful, but WITHOUT
10
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
11
# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
14
# You should have received a copy of the GNU General Public License along with
15
# this program. If not, see <http://www.gnu.org/licenses/>.
22
except: # pylint: disable-msg=W0702
26
except: # pylint: disable-msg=W0702
28
from threading import Timer
30
from GTG.core.task import Task
35
DEFAULT_PREFERENCES = {'max_days': 30,
36
'is_automatic': False,
37
'show_menu_item': True}
39
PLUGIN_NAME = "task-reaper"
41
#In case of automatic removing tasks, the time
42
# between two runs of the cleaner function
43
TIME_BETWEEN_PURGES = 60 * 60
46
self.path = os.path.dirname(os.path.abspath(__file__))
48
self.builder = gtk.Builder()
49
self.builder.add_from_file(os.path.join(
50
os.path.dirname(os.path.abspath(__file__)) + \
52
self.preferences_dialog = self.builder.get_object("preferences_dialog")
53
self.pref_chbox_show_menu_item = \
54
self.builder.get_object("pref_chbox_show_menu_item")
55
self.pref_chbox_is_automatic = \
56
self.builder.get_object("pref_chbox_is_automatic")
57
self.pref_spinbtn_max_days = \
58
self.builder.get_object("pref_spinbtn_max_days")
59
SIGNAL_CONNECTIONS_DIC = {
60
"on_preferences_dialog_delete_event":
61
self.on_preferences_cancel,
62
"on_btn_preferences_cancel_clicked":
63
self.on_preferences_cancel,
64
"on_btn_preferences_ok_clicked":
65
self.on_preferences_ok
67
self.builder.connect_signals(SIGNAL_CONNECTIONS_DIC)
68
self.menu_item = gtk.MenuItem("Delete old closed tasks")
69
self.menu_item.connect('activate', self.delete_old_closed_tasks)
71
def activate(self, plugin_api):
72
self.plugin_api = plugin_api
73
#preferences initialization
74
self.menu_item_is_shown = False
75
self.is_automatic = False
77
self.logger = self.plugin_api.get_logger()
78
self.preferences_load()
79
self.preferences_apply()
81
def onTaskClosed(self, plugin_api):
84
def onTaskOpened(self, plugin_api):
87
def deactivate(self, plugin_api):
88
if self.menu_item_is_shown == True:
89
plugin_api.remove_menu_item(self.menu_item)
91
## HELPER FUNCTIONS ############################################################
93
def __log(self, message):
95
self.logger.debug(message)
97
## CORE FUNCTIONS ##############################################################
99
def schedule_autopurge(self):
100
self.timer = Timer(self.TIME_BETWEEN_PURGES, self.delete_old_closed_tasks)
102
self.__log("Automatic deletion of old tasks scheduled")
104
def cancel_autopurge(self):
106
self.__log("Automatic deletion of old tasks cancelled")
110
def delete_old_closed_tasks(self, widget = None):
111
self.__log("Starting deletion of old tasks")
112
today = datetime.datetime.now().date()
113
requester = self.plugin_api.get_requester()
114
closed_tids = requester.get_tasks_list(status = [Task.STA_DISMISSED,
116
closed_tasks = [requester.get_task(tid) for tid in closed_tids]
117
#print [t.get_title() for t in closed_tasks]
118
delta = datetime.timedelta(days = self.preferences["max_days"])
119
#print [t.get_closed_date().to_py_date() for t in closed_tasks]
120
to_remove = filter(lambda t: t.get_closed_date().to_py_date() < today -delta,\
122
map(lambda t: requester.delete_task(t.get_id()), to_remove)
123
#If automatic purging is on, schedule another run
124
if self.is_automatic:
125
self.schedule_autopurge()
128
## Preferences methods #########################################################
130
def is_configurable(self):
131
"""A configurable plugin should have this method and return True"""
134
def configure_dialog(self, plugin_apis, manager_dialog):
135
self.preferences_load()
136
self.preferences_dialog.set_transient_for(manager_dialog)
137
self.pref_chbox_is_automatic.set_active(self.preferences["is_automatic"])
138
self.pref_chbox_show_menu_item.set_active(self.preferences["show_menu_item"])
139
self.pref_spinbtn_max_days.set_value(self.preferences["max_days"])
140
self.preferences_dialog.show_all()
142
def on_preferences_cancel(self, widget = None, data = None):
143
self.preferences_dialog.hide()
146
def on_preferences_ok(self, widget = None, data = None):
147
self.preferences["is_automatic"] = self.pref_chbox_is_automatic.get_active()
148
self.preferences["show_menu_item"] = self.pref_chbox_show_menu_item.get_active()
149
self.preferences["max_days"] = self.pref_spinbtn_max_days.get_value()
150
self.preferences_apply()
151
self.preferences_store()
152
self.preferences_dialog.hide()
154
def preferences_load(self):
155
data = self.plugin_api.load_configuration_object(self.PLUGIN_NAME,\
157
if data == None or type(data) != type (dict()):
158
self.preferences = self.DEFAULT_PREFERENCES
160
self.preferences = data
162
def preferences_store(self):
163
self.plugin_api.save_configuration_object(self.PLUGIN_NAME,\
167
def preferences_apply(self):
169
if self.preferences['show_menu_item'] == True and \
170
self.menu_item_is_shown == False:
171
self.plugin_api.add_menu_item(self.menu_item)
172
self.menu_item_is_shown = True
173
elif self.preferences['show_menu_item'] == False and \
174
self.menu_item_is_shown == True:
175
self.plugin_api.remove_menu_item(self.menu_item)
176
self.menu_item_is_shown = False
178
if self.preferences['is_automatic'] == True and \
179
self.is_automatic == False:
180
self.schedule_autopurge()
181
self.is_automatic = True
182
elif self.preferences['is_automatic'] == False and \
183
self.is_automatic == True:
184
self.cancel_autopurge()
185
self.is_automatic = False