1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 import pkg_resources
18 import re
19
20 from genshi.builder import tag
21
22 from trac.core import *
23 from trac.prefs.api import IPreferencePanelProvider
24 from trac.util.datefmt import all_timezones, get_timezone, localtz
25 from trac.util.translation import _, Locale, deactivate,\
26 get_available_locales, make_activable
27 from trac.web.api import HTTPNotFound, IRequestHandler
28 from trac.web.chrome import INavigationContributor, ITemplateProvider, \
29 add_notice, add_stylesheet
30
31
33 """Displays the preference panels and dispatch control to the
34 individual panels"""
35
36 panel_providers = ExtensionPoint(IPreferencePanelProvider)
37
38 implements(INavigationContributor, IPreferencePanelProvider,
39 IRequestHandler, ITemplateProvider)
40
41 _form_fields = [
42 'newsid', 'name', 'email', 'tz', 'lc_time', 'dateinfo',
43 'language', 'accesskeys',
44 'ui.use_symbols', 'ui.hide_help',
45 ]
46
47
48
51
55
56
57
59 match = re.match('/prefs(?:/([^/]+))?$', req.path_info)
60 if match:
61 req.args['panel_id'] = match.group(1)
62 return True
63
65 xhr = req.get_header('X-Requested-With') == 'XMLHttpRequest'
66 if xhr and req.method == 'POST' and 'save_prefs' in req.args:
67 self._do_save_xhr(req)
68
69 panel_id = req.args.get('panel_id')
70
71 panels = []
72 chosen_provider = None
73
74 for provider in self.panel_providers:
75 for name, label in provider.get_preference_panels(req) or []:
76 if name == panel_id or None:
77 chosen_provider = provider
78 panels.append((name, label))
79 if not chosen_provider:
80 raise HTTPNotFound(_("Unknown preference panel"))
81
82 template, data = chosen_provider.render_preference_panel(req, panel_id)
83 data.update({'active_panel': panel_id, 'panels': panels})
84
85 add_stylesheet(req, 'common/css/prefs.css')
86 return template, data, None
87
88
89
91 yield (None, _("General"))
92 yield ('datetime', _("Date & Time"))
93 yield ('keybindings', _("Keyboard Shortcuts"))
94 yield ('userinterface', _("User Interface"))
95 if Locale or 'TRAC_ADMIN' in req.perm:
96 yield ('language', _("Language"))
97 if not req.authname or req.authname == 'anonymous':
98 yield ('advanced', _("Advanced"))
99
101 if req.method == 'POST':
102 if 'restore' in req.args:
103 self._do_load(req)
104 else:
105 self._do_save(req)
106 req.redirect(req.href.prefs(panel or None))
107
108 data = {
109 'settings': {'session': req.session,
110 'session_id': req.session.sid},
111 'timezones': all_timezones,
112 'timezone': get_timezone,
113 'localtz': localtz,
114 'has_babel': False
115 }
116
117 if Locale:
118 locale_ids = get_available_locales()
119 locales = [Locale.parse(locale) for locale in locale_ids]
120
121
122
123
124 languages = sorted((id, locale.display_name)
125 for id, locale in zip(locale_ids, locales))
126 data['locales'] = locales
127 data['languages'] = languages
128 data['has_babel'] = True
129
130 return 'prefs_%s.html' % (panel or 'general'), data
131
132
133
136
138 return [pkg_resources.resource_filename('trac.prefs', 'templates')]
139
140
141
148
172
179