##// END OF EJS Templates
authn: Generate the form default values manually....
Martin Bornhold -
r291:3526ca25 default
parent child Browse files
Show More
@@ -1,190 +1,192 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 3 # Copyright (C) 2012-2016 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
7 7 # (only), as published by the Free Software Foundation.
8 8 #
9 9 # This program is distributed in the hope that it will be useful,
10 10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 12 # GNU General Public License for more details.
13 13 #
14 14 # You should have received a copy of the GNU Affero General Public License
15 15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
16 16 #
17 17 # This program is dual-licensed. If you wish to learn more about the
18 18 # RhodeCode Enterprise Edition, including its added features, Support services,
19 19 # and proprietary license terms, please see https://rhodecode.com/licenses/
20 20
21 21 import colander
22 22 import formencode.htmlfill
23 23 import logging
24 24
25 25 from pyramid.httpexceptions import HTTPFound
26 26 from pyramid.renderers import render
27 27 from pyramid.response import Response
28 28
29 29 from rhodecode.authentication.base import get_auth_cache_manager
30 30 from rhodecode.authentication.interface import IAuthnPluginRegistry
31 31 from rhodecode.lib import auth
32 32 from rhodecode.lib.auth import LoginRequired, HasPermissionAllDecorator
33 33 from rhodecode.model.forms import AuthSettingsForm
34 34 from rhodecode.model.meta import Session
35 35 from rhodecode.model.settings import SettingsModel
36 36 from rhodecode.translation import _
37 37
38 38 log = logging.getLogger(__name__)
39 39
40 40
41 41 class AuthnPluginViewBase(object):
42 42
43 43 def __init__(self, context, request):
44 44 self.request = request
45 45 self.context = context
46 46 self.plugin = context.plugin
47 47 self._rhodecode_user = request.user
48 48
49 49 @LoginRequired()
50 50 @HasPermissionAllDecorator('hg.admin')
51 51 def settings_get(self, defaults=None, errors=None):
52 52 """
53 53 View that displays the plugin settings as a form.
54 54 """
55 55 defaults = defaults or {}
56 56 errors = errors or {}
57 57 schema = self.plugin.get_settings_schema()
58 58
59 59 # Compute default values for the form. Priority is:
60 60 # 1. Passed to this method 2. DB value 3. Schema default
61 61 for node in schema:
62 62 if node.name not in defaults:
63 63 defaults[node.name] = self.plugin.get_setting_by_name(
64 64 node.name, node.default)
65 65
66 66 template_context = {
67 67 'defaults': defaults,
68 68 'errors': errors,
69 69 'plugin': self.context.plugin,
70 70 'resource': self.context,
71 71 }
72 72
73 73 return template_context
74 74
75 75 @LoginRequired()
76 76 @HasPermissionAllDecorator('hg.admin')
77 77 @auth.CSRFRequired()
78 78 def settings_post(self):
79 79 """
80 80 View that validates and stores the plugin settings.
81 81 """
82 82 schema = self.plugin.get_settings_schema()
83 data = self.request.params
84
83 85 try:
84 valid_data = schema.deserialize(self.request.params)
86 valid_data = schema.deserialize(data)
85 87 except colander.Invalid, e:
86 88 # Display error message and display form again.
87 89 self.request.session.flash(
88 90 _('Errors exist when saving plugin settings. '
89 91 'Please check the form inputs.'),
90 92 queue='error')
91 defaults = schema.flatten(self.request.params)
93 defaults = {key: data[key] for key in data if key in schema}
92 94 return self.settings_get(errors=e.asdict(), defaults=defaults)
93 95
94 96 # Store validated data.
95 97 for name, value in valid_data.items():
96 98 self.plugin.create_or_update_setting(name, value)
97 99 Session.commit()
98 100
99 101 # Display success message and redirect.
100 102 self.request.session.flash(
101 103 _('Auth settings updated successfully.'),
102 104 queue='success')
103 105 redirect_to = self.request.resource_path(
104 106 self.context, route_name='auth_home')
105 107 return HTTPFound(redirect_to)
106 108
107 109
108 110 # TODO: Ongoing migration in these views.
109 111 # - Maybe we should also use a colander schema for these views.
110 112 class AuthSettingsView(object):
111 113 def __init__(self, context, request):
112 114 self.context = context
113 115 self.request = request
114 116
115 117 # TODO: Move this into a utility function. It is needed in all view
116 118 # classes during migration. Maybe a mixin?
117 119
118 120 # Some of the decorators rely on this attribute to be present on the
119 121 # class of the decorated method.
120 122 self._rhodecode_user = request.user
121 123
122 124 @LoginRequired()
123 125 @HasPermissionAllDecorator('hg.admin')
124 126 def index(self, defaults=None, errors=None, prefix_error=False):
125 127 defaults = defaults or {}
126 128 authn_registry = self.request.registry.getUtility(IAuthnPluginRegistry)
127 129 enabled_plugins = SettingsModel().get_auth_plugins()
128 130
129 131 # Create template context and render it.
130 132 template_context = {
131 133 'resource': self.context,
132 134 'available_plugins': authn_registry.get_plugins(),
133 135 'enabled_plugins': enabled_plugins,
134 136 }
135 137 html = render('rhodecode:templates/admin/auth/auth_settings.html',
136 138 template_context,
137 139 request=self.request)
138 140
139 141 # Create form default values and fill the form.
140 142 form_defaults = {
141 143 'auth_plugins': ','.join(enabled_plugins)
142 144 }
143 145 form_defaults.update(defaults)
144 146 html = formencode.htmlfill.render(
145 147 html,
146 148 defaults=form_defaults,
147 149 errors=errors,
148 150 prefix_error=prefix_error,
149 151 encoding="UTF-8",
150 152 force_defaults=False)
151 153
152 154 return Response(html)
153 155
154 156 @LoginRequired()
155 157 @HasPermissionAllDecorator('hg.admin')
156 158 @auth.CSRFRequired()
157 159 def auth_settings(self):
158 160 try:
159 161 form = AuthSettingsForm()()
160 162 form_result = form.to_python(self.request.params)
161 163 plugins = ','.join(form_result['auth_plugins'])
162 164 setting = SettingsModel().create_or_update_setting(
163 165 'auth_plugins', plugins)
164 166 Session().add(setting)
165 167 Session().commit()
166 168
167 169 cache_manager = get_auth_cache_manager()
168 170 cache_manager.clear()
169 171 self.request.session.flash(
170 172 _('Auth settings updated successfully.'),
171 173 queue='success')
172 174 except formencode.Invalid as errors:
173 175 e = errors.error_dict or {}
174 176 self.request.session.flash(
175 177 _('Errors exist when saving plugin setting. '
176 178 'Please check the form inputs.'),
177 179 queue='error')
178 180 return self.index(
179 181 defaults=errors.value,
180 182 errors=e,
181 183 prefix_error=False)
182 184 except Exception:
183 185 log.exception('Exception in auth_settings')
184 186 self.request.session.flash(
185 187 _('Error occurred during update of auth settings.'),
186 188 queue='error')
187 189
188 190 redirect_to = self.request.resource_path(
189 191 self.context, route_name='auth_home')
190 192 return HTTPFound(redirect_to)
General Comments 0
You need to be logged in to leave comments. Login now