root/tracslimtimerplugin/0.10/tracslimtimer/admin_ui.py

Revision 2203, 10.0 kB (checked in by tst, 2 years ago)

TracSlimTimerPlugin:

Publishing version 0.1.0 minus docs to trac hacks

Line 
1 from pkg_resources import require, resource_filename, ResolutionError
2 import datetime
3 import os
4
5 from trac.core import *
6 from trac.perm import IPermissionRequestor
7 from trac.web.chrome import add_stylesheet, add_script, ITemplateProvider
8 from dump_users import ReportDumper
9 from users import Users
10
11 # Import IAdminPanelProvider or IAdminPageProvider depending on if we're trac
12 # 0.11 or 0.10
13
14 try: # Trac 0.11
15    from trac.admin import IAdminPanelProvider
16
17 except ImportError:
18     IAdminPanelProvider = None
19
20     try: # Trac 0.10 with WebAdmin plugin
21         require("TracWebAdmin")
22         from webadmin.web_ui import IAdminPageProvider
23     except (ResolutionError, ImportError):
24         IAdminPageProvider = None
25
26 ###############################################################################
27 #
28 # Basic settings panel
29 #
30 ###############################################################################
31
32 class TracSlimTimerBasicPanelProvider(Component):
33
34     implements (IPermissionRequestor, ITemplateProvider)
35
36     if IAdminPanelProvider:
37         implements(IAdminPanelProvider)
38     elif IAdminPageProvider:
39         implements(IAdminPageProvider)
40
41     # IAdminPanelProvider methods
42
43     def get_admin_panels(self, req):
44         if req.perm.has_permission('SLIMTIMER_CONFIG'):
45             yield ('slimtimer', 'SlimTimer Integration',
46                    'slimtimer.basic', 'Basic Settings')
47
48     def render_admin_panel(self, req, cat, page, path_info):
49         req.perm.assert_permission('SLIMTIMER_CONFIG')
50
51         if req.method == 'POST':
52             for option in ('api_key'):
53                 self.config.set('slimtimer', option, req.args.get(option))
54             self.config.save()
55             req.redirect(req.href.admin(cat, page))
56
57         api_key = self.config.get('slimtimer', 'api_key')
58         add_stylesheet(req, 'slimtimer/css/slimtimer.css')
59         return 'config_basics.html', {'api_key': api_key }
60
61     # IAdminPageProvider methods
62
63     get_admin_pages = get_admin_panels
64
65     def process_admin_request(self, req, cat, page, path_info):
66         template, data = self.render_admin_panel(req, cat, page, path_info)
67
68         req.hdf['admin.slimtimer'] = data
69         return template.replace('.html', '.cs'), None
70
71     def get_admin_pages(self, req):
72         return self.get_admin_panels(req)
73
74     def render_admin_page(self, req, cat, page, path_info):
75         return self.render_admin_panel(req, cat, page, path_info)
76
77     # IPermissionRequestor methods
78
79     def get_permission_actions(self):
80         return ['SLIMTIMER_CONFIG']
81
82     # ITemplateProvider
83
84     def get_htdocs_dirs(self):
85         """Return the absolute path of a directory containing additional
86         static resources (such as images, style sheets, etc).
87         """
88         return [('slimtimer', resource_filename(__name__, 'htdocs'))]
89
90     def get_templates_dirs(self):
91         """Return the absolute path of the directory containing the provided
92         ClearSilver templates.
93         """
94         return [resource_filename(__name__, 'templates')]
95
96 ###############################################################################
97 #
98 # User settings panel
99 #
100 ###############################################################################
101
102 class TracSlimTimerUserPanelProvider(Component):
103
104     if IAdminPanelProvider:
105         implements(IAdminPanelProvider)
106     elif IAdminPageProvider:
107         implements(IAdminPageProvider)
108
109     # IAdminPanelProvider methods
110
111     def get_admin_panels(self, req):
112         if req.perm.has_permission('SLIMTIMER_CONFIG'):
113             yield ('slimtimer', 'SlimTimer Integration',
114                    'slimtimer.user', 'Users')
115
116     def render_admin_panel(self, req, cat, page, path_info):
117         req.perm.assert_permission('SLIMTIMER_CONFIG')
118
119         config_file = self._get_user_config_file()
120         users = Users(config_file)
121
122         if req.method == 'POST':
123             if req.args.get('action','') == 'modify':
124                 self._do_mod_user(req, users)
125                 req.redirect(req.href.admin(cat, page))
126
127             elif req.args.get('action','') == 'delete':
128                 self._do_delete_user(req, users)
129                 req.redirect(req.href.admin(cat, page))
130
131             else:
132                 self._do_add_user(req, users)
133                 req.redirect(req.href.admin(cat, page))
134
135         add_stylesheet(req, 'slimtimer/css/slimtimer.css')
136         add_script(req, 'slimtimer/js/slimtimer_users.js')
137         return 'config_users.html', { 'users': users.get_all_users() }
138
139     # IAdminPageProvider methods
140
141     get_admin_pages = get_admin_panels
142
143     def process_admin_request(self, req, cat, page, path_info):
144         template, data = self.render_admin_panel(req, cat, page, path_info)
145
146         req.hdf['admin.slimtimer'] = data
147         return template.replace('.html', '.cs'), None
148
149     def get_admin_pages(self, req):
150         return self.get_admin_panels(req)
151
152     def render_admin_page(self, req, cat, page, path_info):
153         return self.render_admin_panel(req, cat, page, path_info)
154
155     # Internal methods
156
157     def _get_user_config_file(self):
158         return os.path.join(self.env.path, 'conf', 'users.xml')
159
160     def _do_add_user(self, req, users):
161         trac_username = req.args.get('trac_username', '')
162         new_user = users.add_user(trac_username)
163         new_user['st_user'] = req.args.get('st_username', '')
164         new_user['st_pass'] = req.args.get('st_password', '')
165         new_user['default_cc'] = req.args.has_key('default_cc')
166         new_user['report'] = req.args.has_key('report')
167         users.save()
168
169     def _do_mod_user(self, req, users):
170         trac_username = req.args.get('user', '')
171         existing_user = users.get_st_user(trac_username)
172
173         #
174         # Check the user already exists
175         #
176         if not existing_user:
177             self.log.error("Couldn't find user to edit: %s" \
178                            % trac_username)
179             return
180
181         #
182         # If they've changed the trac username we need to update the
183         # hashtable in Users
184         #
185         if trac_username != req.args.get('trac_username',''):
186             old = trac_username
187             new = req.args.get('trac_username', '')
188
189             #
190             # Preserve the old password; it's the only field that might not be
191             # set again below
192             #
193             old_password = existing_user.get('st_pass','')
194             existing_user = users.add_user(new)
195             existing_user['st_pass'] = old_password
196             users.delete_user(old)
197
198         existing_user['st_user'] = req.args.get('st_username', '')
199
200         #
201         # Special handling so the admin doesn't need to remember the user's
202         # password to change other settings
203         #
204         new_password = req.args.get('st_password', '')
205         if new_password != "__as_before__":
206             existing_user['st_pass'] = new_password
207
208         existing_user['default_cc'] = req.args.has_key('default_cc')
209         existing_user['report'] = req.args.has_key('report')
210
211         users.save()
212
213     def _do_delete_user(self, req, users):
214
215         trac_username = req.args.get('trac_username')
216         if (trac_username):
217             users.delete_user(trac_username)
218             users.save()
219
220 ###############################################################################
221 #
222 # Report settings panel
223 #
224 ###############################################################################
225
226 class TracSlimTimerReportPanelProvider(Component):
227
228     if IAdminPanelProvider:
229         implements(IAdminPanelProvider)
230     elif IAdminPageProvider:
231         implements(IAdminPageProvider)
232
233     # IAdminPanelProvider methods
234
235     def get_admin_panels(self, req):
236         if req.perm.has_permission('SLIMTIMER_CONFIG'):
237             yield ('slimtimer', 'SlimTimer Integration',
238                    'slimtimer.reporting', 'Reporting')
239
240     def render_admin_panel(self, req, cat, page, path_info):
241         req.perm.assert_permission('SLIMTIMER_CONFIG')
242
243         if req.method == 'POST':
244             if req.args.get('apply'):
245                 for option in ('db_host', 'db_username', 'db_password',
246                                'db_dsn', 'report_log'):
247                     self.config.set('slimtimer', option, req.args.get(option))
248                 self.config.save()
249                 req.redirect(req.href.admin(cat, page))
250
251             elif req.args.get('dump'):
252                 ndays = int(req.args.get('days'))
253                 range_end = datetime.datetime.today()
254                 range_start = range_end
255                 range_start -= datetime.timedelta(days=ndays)
256
257                 tracbase = self.env.path
258                 dumper = ReportDumper()
259                 dumper.dump(tracbase, range_start, range_end)
260
261         data = {
262             'host':     self.config.get('slimtimer', 'db_host'),
263             'username': self.config.get('slimtimer', 'db_username'),
264             'password': self.config.get('slimtimer', 'db_password'),
265             'database': self.config.get('slimtimer', 'db_dsn'),
266             'report_log': self.config.get('slimtimer', 'report_log'),
267             'default_report_log': self.get_default_report_log()
268         }
269         add_stylesheet(req, 'slimtimer/css/slimtimer.css')
270         return 'config_reports.html', data
271
272     # IAdminPageProvider methods
273
274     get_admin_pages = get_admin_panels
275
276     def process_admin_request(self, req, cat, page, path_info):
277         template, data = self.render_admin_panel(req, cat, page, path_info)
278
279         req.hdf['admin.slimtimer'] = data
280         return template.replace('.html', '.cs'), None
281
282     def get_admin_pages(self, req):
283         return self.get_admin_panels(req)
284
285     def render_admin_page(self, req, cat, page, path_info):
286         return self.render_admin_panel(req, cat, page, path_info)
287
288     def get_default_report_log(self):
289         #
290         # This complicated mess allows us to automatically arrive at something
291         # like: /var/trac/0.10.3/log/time_report.log
292         #
293         log_dir = os.path.dirname(self.env.log_file)
294         if log_dir:
295             (first, second) = os.path.split(log_dir)
296             if second == 'httpd':
297                 log_dir = first
298         else:
299             log_dir = self.env.get_log_dir()
300         return os.path.join(log_dir, 'time_report.log')
Note: See TracBrowser for help on using the browser.