~ubuntu-branches/debian/wheezy/gtg/wheezy

« back to all changes in this revision

Viewing changes to .pc/reaper_hang.patch/GTG/plugins/task_reaper/reaper.py

  • Committer: Bazaar Package Importer
  • Author(s): Luca Falavigna
  • Date: 2010-06-24 20:22:12 UTC
  • mto: This revision was merged to the branch mainline in revision 9.
  • Revision ID: james.westby@ubuntu.com-20100624202212-bzzkaqnte1o713kp
* debian/patches/test_executable.patch:
  - Do not launch program to see if it is available, check if it is
    installed and has executable bit enabled instead.
* debian/patches/reaper_hang.patch:
  - Do not hang on quit due to "completed tasks remover" plugin.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# -*- coding: utf-8 -*-
 
2
# Copyright (c) 2009 - Luca Invernizzi <invernizzi.l@gmail.com>
 
3
#
 
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
 
7
# version.
 
8
#
 
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
 
12
# details.
 
13
#
 
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/>.
 
16
import sys
 
17
import os
 
18
import datetime
 
19
try:
 
20
    import pygtk
 
21
    pygtk.require("2.0")
 
22
except: # pylint: disable-msg=W0702
 
23
    sys.exit(1)
 
24
try:
 
25
    import gtk
 
26
except: # pylint: disable-msg=W0702
 
27
    sys.exit(1)
 
28
from threading           import Timer
 
29
 
 
30
from GTG.core.task       import Task
 
31
 
 
32
 
 
33
class pluginReaper:
 
34
 
 
35
    DEFAULT_PREFERENCES = {'max_days': 30,
 
36
                           'is_automatic': False,
 
37
                           'show_menu_item': True}
 
38
 
 
39
    PLUGIN_NAME = "task-reaper"
 
40
    
 
41
    #In case of automatic removing tasks, the time
 
42
    # between two runs of the cleaner function
 
43
    TIME_BETWEEN_PURGES = 60 * 60
 
44
 
 
45
    def __init__(self):
 
46
        self.path = os.path.dirname(os.path.abspath(__file__))
 
47
        #GUI initialization
 
48
        self.builder = gtk.Builder()
 
49
        self.builder.add_from_file(os.path.join(
 
50
                             os.path.dirname(os.path.abspath(__file__)) + \
 
51
                             "/reaper.ui"))
 
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
 
66
        }
 
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)
 
70
 
 
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
 
76
        self.timer = None
 
77
        self.logger = self.plugin_api.get_logger()
 
78
        self.preferences_load()
 
79
        self.preferences_apply()
 
80
 
 
81
    def onTaskClosed(self, plugin_api):
 
82
        pass
 
83
 
 
84
    def onTaskOpened(self, plugin_api):
 
85
        pass
 
86
 
 
87
    def deactivate(self, plugin_api):
 
88
        if self.menu_item_is_shown == True:
 
89
            plugin_api.remove_menu_item(self.menu_item)
 
90
 
 
91
## HELPER FUNCTIONS ############################################################
 
92
 
 
93
    def __log(self, message):
 
94
        if self.logger:
 
95
            self.logger.debug(message)
 
96
 
 
97
## CORE FUNCTIONS ##############################################################
 
98
 
 
99
    def schedule_autopurge(self):
 
100
        self.timer = Timer(self.TIME_BETWEEN_PURGES, self.delete_old_closed_tasks)
 
101
        self.timer.start()
 
102
        self.__log("Automatic deletion of old tasks scheduled")
 
103
 
 
104
    def cancel_autopurge(self):
 
105
        if self.timer:
 
106
            self.__log("Automatic deletion of old tasks cancelled")
 
107
            self.timer.cancel()
 
108
        pass
 
109
 
 
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,
 
115
                                                  Task.STA_DONE])
 
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,\
 
121
                           closed_tasks)
 
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()
 
126
 
 
127
 
 
128
## Preferences methods #########################################################
 
129
 
 
130
    def is_configurable(self):
 
131
        """A configurable plugin should have this method and return True"""
 
132
        return True
 
133
 
 
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()
 
141
 
 
142
    def on_preferences_cancel(self, widget = None, data = None):
 
143
        self.preferences_dialog.hide()
 
144
        return True
 
145
 
 
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()
 
153
 
 
154
    def preferences_load(self):
 
155
        data = self.plugin_api.load_configuration_object(self.PLUGIN_NAME,\
 
156
                                                         "preferences")
 
157
        if data == None or type(data) != type (dict()):
 
158
            self.preferences = self.DEFAULT_PREFERENCES
 
159
        else:
 
160
            self.preferences = data
 
161
 
 
162
    def preferences_store(self):
 
163
        self.plugin_api.save_configuration_object(self.PLUGIN_NAME,\
 
164
                                                  "preferences", \
 
165
                                                  self.preferences)
 
166
 
 
167
    def preferences_apply(self):
 
168
        #Showing the GUI
 
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
 
177
        #Auto-purge
 
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
 
186
 
 
187