##// END OF EJS Templates
Added views for new ajax functions, got somehow lost in previos commit
marcink -
r2625:fc19979a beta
parent child Browse files
Show More
@@ -1,426 +1,443
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2 """
2 """
3 rhodecode.controllers.admin.settings
3 rhodecode.controllers.admin.settings
4 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
4 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
5
5
6 settings controller for rhodecode admin
6 settings controller for rhodecode admin
7
7
8 :created_on: Jul 14, 2010
8 :created_on: Jul 14, 2010
9 :author: marcink
9 :author: marcink
10 :copyright: (C) 2010-2012 Marcin Kuzminski <marcin@python-works.com>
10 :copyright: (C) 2010-2012 Marcin Kuzminski <marcin@python-works.com>
11 :license: GPLv3, see COPYING for more details.
11 :license: GPLv3, see COPYING for more details.
12 """
12 """
13 # This program is free software: you can redistribute it and/or modify
13 # This program is free software: you can redistribute it and/or modify
14 # it under the terms of the GNU General Public License as published by
14 # it under the terms of the GNU General Public License as published by
15 # the Free Software Foundation, either version 3 of the License, or
15 # the Free Software Foundation, either version 3 of the License, or
16 # (at your option) any later version.
16 # (at your option) any later version.
17 #
17 #
18 # This program is distributed in the hope that it will be useful,
18 # This program is distributed in the hope that it will be useful,
19 # but WITHOUT ANY WARRANTY; without even the implied warranty of
19 # but WITHOUT ANY WARRANTY; without even the implied warranty of
20 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 # GNU General Public License for more details.
21 # GNU General Public License for more details.
22 #
22 #
23 # You should have received a copy of the GNU General Public License
23 # You should have received a copy of the GNU General Public License
24 # along with this program. If not, see <http://www.gnu.org/licenses/>.
24 # along with this program. If not, see <http://www.gnu.org/licenses/>.
25
25
26 import logging
26 import logging
27 import traceback
27 import traceback
28 import formencode
28 import formencode
29 import pkg_resources
29 import pkg_resources
30 import platform
30 import platform
31
31
32 from sqlalchemy import func
32 from sqlalchemy import func
33 from formencode import htmlfill
33 from formencode import htmlfill
34 from pylons import request, session, tmpl_context as c, url, config
34 from pylons import request, session, tmpl_context as c, url, config
35 from pylons.controllers.util import abort, redirect
35 from pylons.controllers.util import abort, redirect
36 from pylons.i18n.translation import _
36 from pylons.i18n.translation import _
37
37
38 from rhodecode.lib import helpers as h
38 from rhodecode.lib import helpers as h
39 from rhodecode.lib.auth import LoginRequired, HasPermissionAllDecorator, \
39 from rhodecode.lib.auth import LoginRequired, HasPermissionAllDecorator, \
40 HasPermissionAnyDecorator, NotAnonymous
40 HasPermissionAnyDecorator, NotAnonymous
41 from rhodecode.lib.base import BaseController, render
41 from rhodecode.lib.base import BaseController, render
42 from rhodecode.lib.celerylib import tasks, run_task
42 from rhodecode.lib.celerylib import tasks, run_task
43 from rhodecode.lib.utils import repo2db_mapper, invalidate_cache, \
43 from rhodecode.lib.utils import repo2db_mapper, invalidate_cache, \
44 set_rhodecode_config, repo_name_slug
44 set_rhodecode_config, repo_name_slug
45 from rhodecode.model.db import RhodeCodeUi, Repository, RepoGroup, \
45 from rhodecode.model.db import RhodeCodeUi, Repository, RepoGroup, \
46 RhodeCodeSetting
46 RhodeCodeSetting, PullRequest, PullRequestReviewers
47 from rhodecode.model.forms import UserForm, ApplicationSettingsForm, \
47 from rhodecode.model.forms import UserForm, ApplicationSettingsForm, \
48 ApplicationUiSettingsForm
48 ApplicationUiSettingsForm
49 from rhodecode.model.scm import ScmModel
49 from rhodecode.model.scm import ScmModel
50 from rhodecode.model.user import UserModel
50 from rhodecode.model.user import UserModel
51 from rhodecode.model.db import User
51 from rhodecode.model.db import User
52 from rhodecode.model.notification import EmailNotificationModel
52 from rhodecode.model.notification import EmailNotificationModel
53 from rhodecode.model.meta import Session
53 from rhodecode.model.meta import Session
54 from pylons.decorators import jsonify
55 from rhodecode.model.pull_request import PullRequestModel
54
56
55 log = logging.getLogger(__name__)
57 log = logging.getLogger(__name__)
56
58
57
59
58 class SettingsController(BaseController):
60 class SettingsController(BaseController):
59 """REST Controller styled on the Atom Publishing Protocol"""
61 """REST Controller styled on the Atom Publishing Protocol"""
60 # To properly map this controller, ensure your config/routing.py
62 # To properly map this controller, ensure your config/routing.py
61 # file has a resource setup:
63 # file has a resource setup:
62 # map.resource('setting', 'settings', controller='admin/settings',
64 # map.resource('setting', 'settings', controller='admin/settings',
63 # path_prefix='/admin', name_prefix='admin_')
65 # path_prefix='/admin', name_prefix='admin_')
64
66
65 @LoginRequired()
67 @LoginRequired()
66 def __before__(self):
68 def __before__(self):
67 c.admin_user = session.get('admin_user')
69 c.admin_user = session.get('admin_user')
68 c.admin_username = session.get('admin_username')
70 c.admin_username = session.get('admin_username')
69 c.modules = sorted([(p.project_name, p.version)
71 c.modules = sorted([(p.project_name, p.version)
70 for p in pkg_resources.working_set],
72 for p in pkg_resources.working_set],
71 key=lambda k: k[0].lower())
73 key=lambda k: k[0].lower())
72 c.py_version = platform.python_version()
74 c.py_version = platform.python_version()
73 c.platform = platform.platform()
75 c.platform = platform.platform()
74 super(SettingsController, self).__before__()
76 super(SettingsController, self).__before__()
75
77
76 @HasPermissionAllDecorator('hg.admin')
78 @HasPermissionAllDecorator('hg.admin')
77 def index(self, format='html'):
79 def index(self, format='html'):
78 """GET /admin/settings: All items in the collection"""
80 """GET /admin/settings: All items in the collection"""
79 # url('admin_settings')
81 # url('admin_settings')
80
82
81 defaults = RhodeCodeSetting.get_app_settings()
83 defaults = RhodeCodeSetting.get_app_settings()
82 defaults.update(self.get_hg_ui_settings())
84 defaults.update(self.get_hg_ui_settings())
83
85
84 return htmlfill.render(
86 return htmlfill.render(
85 render('admin/settings/settings.html'),
87 render('admin/settings/settings.html'),
86 defaults=defaults,
88 defaults=defaults,
87 encoding="UTF-8",
89 encoding="UTF-8",
88 force_defaults=False
90 force_defaults=False
89 )
91 )
90
92
91 @HasPermissionAllDecorator('hg.admin')
93 @HasPermissionAllDecorator('hg.admin')
92 def create(self):
94 def create(self):
93 """POST /admin/settings: Create a new item"""
95 """POST /admin/settings: Create a new item"""
94 # url('admin_settings')
96 # url('admin_settings')
95
97
96 @HasPermissionAllDecorator('hg.admin')
98 @HasPermissionAllDecorator('hg.admin')
97 def new(self, format='html'):
99 def new(self, format='html'):
98 """GET /admin/settings/new: Form to create a new item"""
100 """GET /admin/settings/new: Form to create a new item"""
99 # url('admin_new_setting')
101 # url('admin_new_setting')
100
102
101 @HasPermissionAllDecorator('hg.admin')
103 @HasPermissionAllDecorator('hg.admin')
102 def update(self, setting_id):
104 def update(self, setting_id):
103 """PUT /admin/settings/setting_id: Update an existing item"""
105 """PUT /admin/settings/setting_id: Update an existing item"""
104 # Forms posted to this method should contain a hidden field:
106 # Forms posted to this method should contain a hidden field:
105 # <input type="hidden" name="_method" value="PUT" />
107 # <input type="hidden" name="_method" value="PUT" />
106 # Or using helpers:
108 # Or using helpers:
107 # h.form(url('admin_setting', setting_id=ID),
109 # h.form(url('admin_setting', setting_id=ID),
108 # method='put')
110 # method='put')
109 # url('admin_setting', setting_id=ID)
111 # url('admin_setting', setting_id=ID)
110 if setting_id == 'mapping':
112 if setting_id == 'mapping':
111 rm_obsolete = request.POST.get('destroy', False)
113 rm_obsolete = request.POST.get('destroy', False)
112 log.debug('Rescanning directories with destroy=%s' % rm_obsolete)
114 log.debug('Rescanning directories with destroy=%s' % rm_obsolete)
113 initial = ScmModel().repo_scan()
115 initial = ScmModel().repo_scan()
114 log.debug('invalidating all repositories')
116 log.debug('invalidating all repositories')
115 for repo_name in initial.keys():
117 for repo_name in initial.keys():
116 invalidate_cache('get_repo_cached_%s' % repo_name)
118 invalidate_cache('get_repo_cached_%s' % repo_name)
117
119
118 added, removed = repo2db_mapper(initial, rm_obsolete)
120 added, removed = repo2db_mapper(initial, rm_obsolete)
119
121
120 h.flash(_('Repositories successfully'
122 h.flash(_('Repositories successfully'
121 ' rescanned added: %s,removed: %s') % (added, removed),
123 ' rescanned added: %s,removed: %s') % (added, removed),
122 category='success')
124 category='success')
123
125
124 if setting_id == 'whoosh':
126 if setting_id == 'whoosh':
125 repo_location = self.get_hg_ui_settings()['paths_root_path']
127 repo_location = self.get_hg_ui_settings()['paths_root_path']
126 full_index = request.POST.get('full_index', False)
128 full_index = request.POST.get('full_index', False)
127 run_task(tasks.whoosh_index, repo_location, full_index)
129 run_task(tasks.whoosh_index, repo_location, full_index)
128
130
129 h.flash(_('Whoosh reindex task scheduled'), category='success')
131 h.flash(_('Whoosh reindex task scheduled'), category='success')
130 if setting_id == 'global':
132 if setting_id == 'global':
131
133
132 application_form = ApplicationSettingsForm()()
134 application_form = ApplicationSettingsForm()()
133 try:
135 try:
134 form_result = application_form.to_python(dict(request.POST))
136 form_result = application_form.to_python(dict(request.POST))
135
137
136 try:
138 try:
137 hgsettings1 = RhodeCodeSetting.get_by_name('title')
139 hgsettings1 = RhodeCodeSetting.get_by_name('title')
138 hgsettings1.app_settings_value = \
140 hgsettings1.app_settings_value = \
139 form_result['rhodecode_title']
141 form_result['rhodecode_title']
140
142
141 hgsettings2 = RhodeCodeSetting.get_by_name('realm')
143 hgsettings2 = RhodeCodeSetting.get_by_name('realm')
142 hgsettings2.app_settings_value = \
144 hgsettings2.app_settings_value = \
143 form_result['rhodecode_realm']
145 form_result['rhodecode_realm']
144
146
145 hgsettings3 = RhodeCodeSetting.get_by_name('ga_code')
147 hgsettings3 = RhodeCodeSetting.get_by_name('ga_code')
146 hgsettings3.app_settings_value = \
148 hgsettings3.app_settings_value = \
147 form_result['rhodecode_ga_code']
149 form_result['rhodecode_ga_code']
148
150
149 self.sa.add(hgsettings1)
151 self.sa.add(hgsettings1)
150 self.sa.add(hgsettings2)
152 self.sa.add(hgsettings2)
151 self.sa.add(hgsettings3)
153 self.sa.add(hgsettings3)
152 self.sa.commit()
154 self.sa.commit()
153 set_rhodecode_config(config)
155 set_rhodecode_config(config)
154 h.flash(_('Updated application settings'),
156 h.flash(_('Updated application settings'),
155 category='success')
157 category='success')
156
158
157 except Exception:
159 except Exception:
158 log.error(traceback.format_exc())
160 log.error(traceback.format_exc())
159 h.flash(_('error occurred during updating '
161 h.flash(_('error occurred during updating '
160 'application settings'),
162 'application settings'),
161 category='error')
163 category='error')
162
164
163 self.sa.rollback()
165 self.sa.rollback()
164
166
165 except formencode.Invalid, errors:
167 except formencode.Invalid, errors:
166 return htmlfill.render(
168 return htmlfill.render(
167 render('admin/settings/settings.html'),
169 render('admin/settings/settings.html'),
168 defaults=errors.value,
170 defaults=errors.value,
169 errors=errors.error_dict or {},
171 errors=errors.error_dict or {},
170 prefix_error=False,
172 prefix_error=False,
171 encoding="UTF-8")
173 encoding="UTF-8")
172
174
173 if setting_id == 'mercurial':
175 if setting_id == 'mercurial':
174 application_form = ApplicationUiSettingsForm()()
176 application_form = ApplicationUiSettingsForm()()
175 try:
177 try:
176 form_result = application_form.to_python(dict(request.POST))
178 form_result = application_form.to_python(dict(request.POST))
177 # fix namespaces for hooks
179 # fix namespaces for hooks
178 _f = lambda s: s.replace('.', '_')
180 _f = lambda s: s.replace('.', '_')
179 try:
181 try:
180
182
181 hgsettings1 = self.sa.query(RhodeCodeUi)\
183 hgsettings1 = self.sa.query(RhodeCodeUi)\
182 .filter(RhodeCodeUi.ui_key == 'push_ssl').one()
184 .filter(RhodeCodeUi.ui_key == 'push_ssl').one()
183 hgsettings1.ui_value = form_result['web_push_ssl']
185 hgsettings1.ui_value = form_result['web_push_ssl']
184
186
185 hgsettings2 = self.sa.query(RhodeCodeUi)\
187 hgsettings2 = self.sa.query(RhodeCodeUi)\
186 .filter(RhodeCodeUi.ui_key == '/').one()
188 .filter(RhodeCodeUi.ui_key == '/').one()
187 hgsettings2.ui_value = form_result['paths_root_path']
189 hgsettings2.ui_value = form_result['paths_root_path']
188
190
189 #HOOKS
191 #HOOKS
190 hgsettings3 = self.sa.query(RhodeCodeUi)\
192 hgsettings3 = self.sa.query(RhodeCodeUi)\
191 .filter(RhodeCodeUi.ui_key == RhodeCodeUi.HOOK_UPDATE)\
193 .filter(RhodeCodeUi.ui_key == RhodeCodeUi.HOOK_UPDATE)\
192 .one()
194 .one()
193 hgsettings3.ui_active = bool(form_result[_f('hooks_%s' %
195 hgsettings3.ui_active = bool(form_result[_f('hooks_%s' %
194 RhodeCodeUi.HOOK_UPDATE)])
196 RhodeCodeUi.HOOK_UPDATE)])
195
197
196 hgsettings4 = self.sa.query(RhodeCodeUi)\
198 hgsettings4 = self.sa.query(RhodeCodeUi)\
197 .filter(RhodeCodeUi.ui_key == RhodeCodeUi.HOOK_REPO_SIZE)\
199 .filter(RhodeCodeUi.ui_key == RhodeCodeUi.HOOK_REPO_SIZE)\
198 .one()
200 .one()
199 hgsettings4.ui_active = bool(form_result[_f('hooks_%s' %
201 hgsettings4.ui_active = bool(form_result[_f('hooks_%s' %
200 RhodeCodeUi.HOOK_REPO_SIZE)])
202 RhodeCodeUi.HOOK_REPO_SIZE)])
201
203
202 hgsettings5 = self.sa.query(RhodeCodeUi)\
204 hgsettings5 = self.sa.query(RhodeCodeUi)\
203 .filter(RhodeCodeUi.ui_key == RhodeCodeUi.HOOK_PUSH)\
205 .filter(RhodeCodeUi.ui_key == RhodeCodeUi.HOOK_PUSH)\
204 .one()
206 .one()
205 hgsettings5.ui_active = bool(form_result[_f('hooks_%s' %
207 hgsettings5.ui_active = bool(form_result[_f('hooks_%s' %
206 RhodeCodeUi.HOOK_PUSH)])
208 RhodeCodeUi.HOOK_PUSH)])
207
209
208 hgsettings6 = self.sa.query(RhodeCodeUi)\
210 hgsettings6 = self.sa.query(RhodeCodeUi)\
209 .filter(RhodeCodeUi.ui_key == RhodeCodeUi.HOOK_PULL)\
211 .filter(RhodeCodeUi.ui_key == RhodeCodeUi.HOOK_PULL)\
210 .one()
212 .one()
211 hgsettings6.ui_active = bool(form_result[_f('hooks_%s' %
213 hgsettings6.ui_active = bool(form_result[_f('hooks_%s' %
212 RhodeCodeUi.HOOK_PULL)])
214 RhodeCodeUi.HOOK_PULL)])
213
215
214 self.sa.add(hgsettings1)
216 self.sa.add(hgsettings1)
215 self.sa.add(hgsettings2)
217 self.sa.add(hgsettings2)
216 self.sa.add(hgsettings3)
218 self.sa.add(hgsettings3)
217 self.sa.add(hgsettings4)
219 self.sa.add(hgsettings4)
218 self.sa.add(hgsettings5)
220 self.sa.add(hgsettings5)
219 self.sa.add(hgsettings6)
221 self.sa.add(hgsettings6)
220 self.sa.commit()
222 self.sa.commit()
221
223
222 h.flash(_('Updated mercurial settings'),
224 h.flash(_('Updated mercurial settings'),
223 category='success')
225 category='success')
224
226
225 except:
227 except:
226 log.error(traceback.format_exc())
228 log.error(traceback.format_exc())
227 h.flash(_('error occurred during updating '
229 h.flash(_('error occurred during updating '
228 'application settings'), category='error')
230 'application settings'), category='error')
229
231
230 self.sa.rollback()
232 self.sa.rollback()
231
233
232 except formencode.Invalid, errors:
234 except formencode.Invalid, errors:
233 return htmlfill.render(
235 return htmlfill.render(
234 render('admin/settings/settings.html'),
236 render('admin/settings/settings.html'),
235 defaults=errors.value,
237 defaults=errors.value,
236 errors=errors.error_dict or {},
238 errors=errors.error_dict or {},
237 prefix_error=False,
239 prefix_error=False,
238 encoding="UTF-8")
240 encoding="UTF-8")
239
241
240 if setting_id == 'hooks':
242 if setting_id == 'hooks':
241 ui_key = request.POST.get('new_hook_ui_key')
243 ui_key = request.POST.get('new_hook_ui_key')
242 ui_value = request.POST.get('new_hook_ui_value')
244 ui_value = request.POST.get('new_hook_ui_value')
243 try:
245 try:
244
246
245 if ui_value and ui_key:
247 if ui_value and ui_key:
246 RhodeCodeUi.create_or_update_hook(ui_key, ui_value)
248 RhodeCodeUi.create_or_update_hook(ui_key, ui_value)
247 h.flash(_('Added new hook'),
249 h.flash(_('Added new hook'),
248 category='success')
250 category='success')
249
251
250 # check for edits
252 # check for edits
251 update = False
253 update = False
252 _d = request.POST.dict_of_lists()
254 _d = request.POST.dict_of_lists()
253 for k, v in zip(_d.get('hook_ui_key', []),
255 for k, v in zip(_d.get('hook_ui_key', []),
254 _d.get('hook_ui_value_new', [])):
256 _d.get('hook_ui_value_new', [])):
255 RhodeCodeUi.create_or_update_hook(k, v)
257 RhodeCodeUi.create_or_update_hook(k, v)
256 update = True
258 update = True
257
259
258 if update:
260 if update:
259 h.flash(_('Updated hooks'), category='success')
261 h.flash(_('Updated hooks'), category='success')
260 self.sa.commit()
262 self.sa.commit()
261 except:
263 except:
262 log.error(traceback.format_exc())
264 log.error(traceback.format_exc())
263 h.flash(_('error occurred during hook creation'),
265 h.flash(_('error occurred during hook creation'),
264 category='error')
266 category='error')
265
267
266 return redirect(url('admin_edit_setting', setting_id='hooks'))
268 return redirect(url('admin_edit_setting', setting_id='hooks'))
267
269
268 if setting_id == 'email':
270 if setting_id == 'email':
269 test_email = request.POST.get('test_email')
271 test_email = request.POST.get('test_email')
270 test_email_subj = 'RhodeCode TestEmail'
272 test_email_subj = 'RhodeCode TestEmail'
271 test_email_body = 'RhodeCode Email test'
273 test_email_body = 'RhodeCode Email test'
272
274
273 test_email_html_body = EmailNotificationModel()\
275 test_email_html_body = EmailNotificationModel()\
274 .get_email_tmpl(EmailNotificationModel.TYPE_DEFAULT,
276 .get_email_tmpl(EmailNotificationModel.TYPE_DEFAULT,
275 body=test_email_body)
277 body=test_email_body)
276
278
277 recipients = [test_email] if [test_email] else None
279 recipients = [test_email] if [test_email] else None
278
280
279 run_task(tasks.send_email, recipients, test_email_subj,
281 run_task(tasks.send_email, recipients, test_email_subj,
280 test_email_body, test_email_html_body)
282 test_email_body, test_email_html_body)
281
283
282 h.flash(_('Email task created'), category='success')
284 h.flash(_('Email task created'), category='success')
283 return redirect(url('admin_settings'))
285 return redirect(url('admin_settings'))
284
286
285 @HasPermissionAllDecorator('hg.admin')
287 @HasPermissionAllDecorator('hg.admin')
286 def delete(self, setting_id):
288 def delete(self, setting_id):
287 """DELETE /admin/settings/setting_id: Delete an existing item"""
289 """DELETE /admin/settings/setting_id: Delete an existing item"""
288 # Forms posted to this method should contain a hidden field:
290 # Forms posted to this method should contain a hidden field:
289 # <input type="hidden" name="_method" value="DELETE" />
291 # <input type="hidden" name="_method" value="DELETE" />
290 # Or using helpers:
292 # Or using helpers:
291 # h.form(url('admin_setting', setting_id=ID),
293 # h.form(url('admin_setting', setting_id=ID),
292 # method='delete')
294 # method='delete')
293 # url('admin_setting', setting_id=ID)
295 # url('admin_setting', setting_id=ID)
294 if setting_id == 'hooks':
296 if setting_id == 'hooks':
295 hook_id = request.POST.get('hook_id')
297 hook_id = request.POST.get('hook_id')
296 RhodeCodeUi.delete(hook_id)
298 RhodeCodeUi.delete(hook_id)
297 self.sa.commit()
299 self.sa.commit()
298
300
299 @HasPermissionAllDecorator('hg.admin')
301 @HasPermissionAllDecorator('hg.admin')
300 def show(self, setting_id, format='html'):
302 def show(self, setting_id, format='html'):
301 """
303 """
302 GET /admin/settings/setting_id: Show a specific item"""
304 GET /admin/settings/setting_id: Show a specific item"""
303 # url('admin_setting', setting_id=ID)
305 # url('admin_setting', setting_id=ID)
304
306
305 @HasPermissionAllDecorator('hg.admin')
307 @HasPermissionAllDecorator('hg.admin')
306 def edit(self, setting_id, format='html'):
308 def edit(self, setting_id, format='html'):
307 """
309 """
308 GET /admin/settings/setting_id/edit: Form to
310 GET /admin/settings/setting_id/edit: Form to
309 edit an existing item"""
311 edit an existing item"""
310 # url('admin_edit_setting', setting_id=ID)
312 # url('admin_edit_setting', setting_id=ID)
311
313
312 c.hooks = RhodeCodeUi.get_builtin_hooks()
314 c.hooks = RhodeCodeUi.get_builtin_hooks()
313 c.custom_hooks = RhodeCodeUi.get_custom_hooks()
315 c.custom_hooks = RhodeCodeUi.get_custom_hooks()
314
316
315 return htmlfill.render(
317 return htmlfill.render(
316 render('admin/settings/hooks.html'),
318 render('admin/settings/hooks.html'),
317 defaults={},
319 defaults={},
318 encoding="UTF-8",
320 encoding="UTF-8",
319 force_defaults=False
321 force_defaults=False
320 )
322 )
321
323
322 @NotAnonymous()
324 @NotAnonymous()
323 def my_account(self):
325 def my_account(self):
324 """
326 """
325 GET /_admin/my_account Displays info about my account
327 GET /_admin/my_account Displays info about my account
326 """
328 """
327 # url('admin_settings_my_account')
329 # url('admin_settings_my_account')
328
330
329 c.user = User.get(self.rhodecode_user.user_id)
331 c.user = User.get(self.rhodecode_user.user_id)
330 all_repos = self.sa.query(Repository)\
332 all_repos = self.sa.query(Repository)\
331 .filter(Repository.user_id == c.user.user_id)\
333 .filter(Repository.user_id == c.user.user_id)\
332 .order_by(func.lower(Repository.repo_name)).all()
334 .order_by(func.lower(Repository.repo_name)).all()
333
335
334 c.user_repos = ScmModel().get_repos(all_repos)
336 c.user_repos = ScmModel().get_repos(all_repos)
335
337
336 if c.user.username == 'default':
338 if c.user.username == 'default':
337 h.flash(_("You can't edit this user since it's"
339 h.flash(_("You can't edit this user since it's"
338 " crucial for entire application"), category='warning')
340 " crucial for entire application"), category='warning')
339 return redirect(url('users'))
341 return redirect(url('users'))
340
342
341 defaults = c.user.get_dict()
343 defaults = c.user.get_dict()
342
344
343 c.form = htmlfill.render(
345 c.form = htmlfill.render(
344 render('admin/users/user_edit_my_account_form.html'),
346 render('admin/users/user_edit_my_account_form.html'),
345 defaults=defaults,
347 defaults=defaults,
346 encoding="UTF-8",
348 encoding="UTF-8",
347 force_defaults=False
349 force_defaults=False
348 )
350 )
349 return render('admin/users/user_edit_my_account.html')
351 return render('admin/users/user_edit_my_account.html')
350
352
351 def my_account_update(self):
353 def my_account_update(self):
352 """PUT /_admin/my_account_update: Update an existing item"""
354 """PUT /_admin/my_account_update: Update an existing item"""
353 # Forms posted to this method should contain a hidden field:
355 # Forms posted to this method should contain a hidden field:
354 # <input type="hidden" name="_method" value="PUT" />
356 # <input type="hidden" name="_method" value="PUT" />
355 # Or using helpers:
357 # Or using helpers:
356 # h.form(url('admin_settings_my_account_update'),
358 # h.form(url('admin_settings_my_account_update'),
357 # method='put')
359 # method='put')
358 # url('admin_settings_my_account_update', id=ID)
360 # url('admin_settings_my_account_update', id=ID)
359 uid = self.rhodecode_user.user_id
361 uid = self.rhodecode_user.user_id
360 email = self.rhodecode_user.email
362 email = self.rhodecode_user.email
361 _form = UserForm(edit=True,
363 _form = UserForm(edit=True,
362 old_data={'user_id': uid, 'email': email})()
364 old_data={'user_id': uid, 'email': email})()
363 form_result = {}
365 form_result = {}
364 try:
366 try:
365 form_result = _form.to_python(dict(request.POST))
367 form_result = _form.to_python(dict(request.POST))
366 UserModel().update_my_account(uid, form_result)
368 UserModel().update_my_account(uid, form_result)
367 h.flash(_('Your account was updated successfully'),
369 h.flash(_('Your account was updated successfully'),
368 category='success')
370 category='success')
369 Session.commit()
371 Session.commit()
370 except formencode.Invalid, errors:
372 except formencode.Invalid, errors:
371 c.user = User.get(self.rhodecode_user.user_id)
373 c.user = User.get(self.rhodecode_user.user_id)
372 all_repos = self.sa.query(Repository)\
373 .filter(Repository.user_id == c.user.user_id)\
374 .order_by(func.lower(Repository.repo_name))\
375 .all()
376 c.user_repos = ScmModel().get_repos(all_repos)
377
374
378 c.form = htmlfill.render(
375 c.form = htmlfill.render(
379 render('admin/users/user_edit_my_account_form.html'),
376 render('admin/users/user_edit_my_account_form.html'),
380 defaults=errors.value,
377 defaults=errors.value,
381 errors=errors.error_dict or {},
378 errors=errors.error_dict or {},
382 prefix_error=False,
379 prefix_error=False,
383 encoding="UTF-8")
380 encoding="UTF-8")
384 return render('admin/users/user_edit_my_account.html')
381 return render('admin/users/user_edit_my_account.html')
385 except Exception:
382 except Exception:
386 log.error(traceback.format_exc())
383 log.error(traceback.format_exc())
387 h.flash(_('error occurred during update of user %s') \
384 h.flash(_('error occurred during update of user %s') \
388 % form_result.get('username'), category='error')
385 % form_result.get('username'), category='error')
389
386
390 return redirect(url('my_account'))
387 return redirect(url('my_account'))
391
388
389 def my_account_my_repos(self):
390 all_repos = self.sa.query(Repository)\
391 .filter(Repository.user_id == self.rhodecode_user.user_id)\
392 .order_by(func.lower(Repository.repo_name))\
393 .all()
394 c.user_repos = ScmModel().get_repos(all_repos)
395 return render('admin/users/user_edit_my_account_repos.html')
396
397 def my_account_my_pullrequests(self):
398 c.my_pull_requests = PullRequest.query()\
399 .filter(PullRequest.user_id==
400 self.rhodecode_user.user_id)\
401 .all()
402 c.participate_in_pull_requests = \
403 [x.pull_request for x in PullRequestReviewers.query()\
404 .filter(PullRequestReviewers.user_id==
405 self.rhodecode_user.user_id)\
406 .all()]
407 return render('admin/users/user_edit_my_account_pullrequests.html')
408
392 @NotAnonymous()
409 @NotAnonymous()
393 @HasPermissionAnyDecorator('hg.admin', 'hg.create.repository')
410 @HasPermissionAnyDecorator('hg.admin', 'hg.create.repository')
394 def create_repository(self):
411 def create_repository(self):
395 """GET /_admin/create_repository: Form to create a new item"""
412 """GET /_admin/create_repository: Form to create a new item"""
396
413
397 c.repo_groups = RepoGroup.groups_choices()
414 c.repo_groups = RepoGroup.groups_choices()
398 c.repo_groups_choices = map(lambda k: unicode(k[0]), c.repo_groups)
415 c.repo_groups_choices = map(lambda k: unicode(k[0]), c.repo_groups)
399 choices, c.landing_revs = ScmModel().get_repo_landing_revs()
416 choices, c.landing_revs = ScmModel().get_repo_landing_revs()
400
417
401 new_repo = request.GET.get('repo', '')
418 new_repo = request.GET.get('repo', '')
402 c.new_repo = repo_name_slug(new_repo)
419 c.new_repo = repo_name_slug(new_repo)
403
420
404 return render('admin/repos/repo_add_create_repository.html')
421 return render('admin/repos/repo_add_create_repository.html')
405
422
406 def get_hg_ui_settings(self):
423 def get_hg_ui_settings(self):
407 ret = self.sa.query(RhodeCodeUi).all()
424 ret = self.sa.query(RhodeCodeUi).all()
408
425
409 if not ret:
426 if not ret:
410 raise Exception('Could not get application ui settings !')
427 raise Exception('Could not get application ui settings !')
411 settings = {}
428 settings = {}
412 for each in ret:
429 for each in ret:
413 k = each.ui_key
430 k = each.ui_key
414 v = each.ui_value
431 v = each.ui_value
415 if k == '/':
432 if k == '/':
416 k = 'root_path'
433 k = 'root_path'
417
434
418 if k.find('.') != -1:
435 if k.find('.') != -1:
419 k = k.replace('.', '_')
436 k = k.replace('.', '_')
420
437
421 if each.ui_section == 'hooks':
438 if each.ui_section == 'hooks':
422 v = each.ui_active
439 v = each.ui_active
423
440
424 settings[each.ui_section + '_' + k] = v
441 settings[each.ui_section + '_' + k] = v
425
442
426 return settings
443 return settings
General Comments 0
You need to be logged in to leave comments. Login now