##// END OF EJS Templates
#478 permissions overview for admin in user edit view
marcink -
r2435:751c1c56 beta
parent child Browse files
Show More
@@ -1,698 +1,699 b''
1 .. _changelog:
1 .. _changelog:
2
2
3 =========
3 =========
4 Changelog
4 Changelog
5 =========
5 =========
6
6
7 1.4.0 (**2012-XX-XX**)
7 1.4.0 (**2012-XX-XX**)
8 ----------------------
8 ----------------------
9
9
10 :status: in-progress
10 :status: in-progress
11 :branch: beta
11 :branch: beta
12
12
13 news
13 news
14 ++++
14 ++++
15
15
16 - new codereview system
16 - new codereview system
17 - email map, allowing users to have multiple email addresses mapped into
17 - email map, allowing users to have multiple email addresses mapped into
18 their accounts
18 their accounts
19 - improved git-hook system. Now all actions for git are logged into journal
19 - improved git-hook system. Now all actions for git are logged into journal
20 including pushed revisions, user and IP address
20 including pushed revisions, user and IP address
21 - changed setup-app into setup-rhodecode and added default options to it.
21 - changed setup-app into setup-rhodecode and added default options to it.
22 - new git repos are created as bare now by default
22 - new git repos are created as bare now by default
23 - #464 added links to groups in permission box
23 - #464 added links to groups in permission box
24 - #465 mentions autocomplete inside comments boxes
24 - #465 mentions autocomplete inside comments boxes
25 - #469 added --update-only option to whoosh to re-index only given list
25 - #469 added --update-only option to whoosh to re-index only given list
26 of repos in index
26 of repos in index
27 - rhodecode-api CLI client
27 - rhodecode-api CLI client
28 - new git http protocol replaced buggy dulwich implementation.
28 - new git http protocol replaced buggy dulwich implementation.
29 Now based on pygrack & gitweb
29 Now based on pygrack & gitweb
30 - Improved RSS/ATOM feeds. Discoverable by browsers using proper headers, and
30 - Improved RSS/ATOM feeds. Discoverable by browsers using proper headers, and
31 reformated based on user suggestions. Additional rss/atom feeds for user
31 reformated based on user suggestions. Additional rss/atom feeds for user
32 journal
32 journal
33 - various i18n improvements
33 - various i18n improvements
34 - #478 permissions overview for admin in user edit view
34
35
35 fixes
36 fixes
36 +++++
37 +++++
37
38
38 - improved translations
39 - improved translations
39 - fixes issue #455 Creating an archive generates an exception on Windows
40 - fixes issue #455 Creating an archive generates an exception on Windows
40 - fixes #448 Download ZIP archive keeps file in /tmp open and results
41 - fixes #448 Download ZIP archive keeps file in /tmp open and results
41 in out of disk space
42 in out of disk space
42 - fixes issue #454 Search results under Windows include proceeding
43 - fixes issue #454 Search results under Windows include proceeding
43 backslash
44 backslash
44 - fixed issue #450. Rhodecode no longer will crash when bad revision is
45 - fixed issue #450. Rhodecode no longer will crash when bad revision is
45 present in journal data.
46 present in journal data.
46 - fix for issue #417, git execution was broken on windows for certain
47 - fix for issue #417, git execution was broken on windows for certain
47 commands.
48 commands.
48 - fixed #413. Don't disable .git directory for bare repos on deleting
49 - fixed #413. Don't disable .git directory for bare repos on deleting
49 - fixed issue #459. Changed the way of obtaining logger in reindex task.
50 - fixed issue #459. Changed the way of obtaining logger in reindex task.
50 - fixed #453 added ID field in whoosh SCHEMA that solves the issue of
51 - fixed #453 added ID field in whoosh SCHEMA that solves the issue of
51 reindexing modified files
52 reindexing modified files
52
53
53 1.3.6 (**2012-05-17**)
54 1.3.6 (**2012-05-17**)
54 ----------------------
55 ----------------------
55
56
56 news
57 news
57 ++++
58 ++++
58
59
59 - chinese traditional translation
60 - chinese traditional translation
60 - changed setup-app into setup-rhodecode and added arguments for auto-setup
61 - changed setup-app into setup-rhodecode and added arguments for auto-setup
61 mode that doesn't need user interaction
62 mode that doesn't need user interaction
62
63
63 fixes
64 fixes
64 +++++
65 +++++
65
66
66 - fixed no scm found warning
67 - fixed no scm found warning
67 - fixed __future__ import error on rcextensions
68 - fixed __future__ import error on rcextensions
68 - made simplejson required lib for speedup on JSON encoding
69 - made simplejson required lib for speedup on JSON encoding
69 - fixes #449 bad regex could get more than revisions from parsing history
70 - fixes #449 bad regex could get more than revisions from parsing history
70 - don't clear DB session when CELERY_EAGER is turned ON
71 - don't clear DB session when CELERY_EAGER is turned ON
71
72
72 1.3.5 (**2012-05-10**)
73 1.3.5 (**2012-05-10**)
73 ----------------------
74 ----------------------
74
75
75 news
76 news
76 ++++
77 ++++
77
78
78 - use ext_json for json module
79 - use ext_json for json module
79 - unified annotation view with file source view
80 - unified annotation view with file source view
80 - notification improvements, better inbox + css
81 - notification improvements, better inbox + css
81 - #419 don't strip passwords for login forms, make rhodecode
82 - #419 don't strip passwords for login forms, make rhodecode
82 more compatible with LDAP servers
83 more compatible with LDAP servers
83 - Added HTTP_X_FORWARDED_FOR as another method of extracting
84 - Added HTTP_X_FORWARDED_FOR as another method of extracting
84 IP for pull/push logs. - moved all to base controller
85 IP for pull/push logs. - moved all to base controller
85 - #415: Adding comment to changeset causes reload.
86 - #415: Adding comment to changeset causes reload.
86 Comments are now added via ajax and doesn't reload the page
87 Comments are now added via ajax and doesn't reload the page
87 - #374 LDAP config is discarded when LDAP can't be activated
88 - #374 LDAP config is discarded when LDAP can't be activated
88 - limited push/pull operations are now logged for git in the journal
89 - limited push/pull operations are now logged for git in the journal
89 - bumped mercurial to 2.2.X series
90 - bumped mercurial to 2.2.X series
90 - added support for displaying submodules in file-browser
91 - added support for displaying submodules in file-browser
91 - #421 added bookmarks in changelog view
92 - #421 added bookmarks in changelog view
92
93
93 fixes
94 fixes
94 +++++
95 +++++
95
96
96 - fixed dev-version marker for stable when served from source codes
97 - fixed dev-version marker for stable when served from source codes
97 - fixed missing permission checks on show forks page
98 - fixed missing permission checks on show forks page
98 - #418 cast to unicode fixes in notification objects
99 - #418 cast to unicode fixes in notification objects
99 - #426 fixed mention extracting regex
100 - #426 fixed mention extracting regex
100 - fixed remote-pulling for git remotes remopositories
101 - fixed remote-pulling for git remotes remopositories
101 - fixed #434: Error when accessing files or changesets of a git repository
102 - fixed #434: Error when accessing files or changesets of a git repository
102 with submodules
103 with submodules
103 - fixed issue with empty APIKEYS for users after registration ref. #438
104 - fixed issue with empty APIKEYS for users after registration ref. #438
104 - fixed issue with getting README files from git repositories
105 - fixed issue with getting README files from git repositories
105
106
106 1.3.4 (**2012-03-28**)
107 1.3.4 (**2012-03-28**)
107 ----------------------
108 ----------------------
108
109
109 news
110 news
110 ++++
111 ++++
111
112
112 - Whoosh logging is now controlled by the .ini files logging setup
113 - Whoosh logging is now controlled by the .ini files logging setup
113 - added clone-url into edit form on /settings page
114 - added clone-url into edit form on /settings page
114 - added help text into repo add/edit forms
115 - added help text into repo add/edit forms
115 - created rcextensions module with additional mappings (ref #322) and
116 - created rcextensions module with additional mappings (ref #322) and
116 post push/pull/create repo hooks callbacks
117 post push/pull/create repo hooks callbacks
117 - implemented #377 Users view for his own permissions on account page
118 - implemented #377 Users view for his own permissions on account page
118 - #399 added inheritance of permissions for users group on repos groups
119 - #399 added inheritance of permissions for users group on repos groups
119 - #401 repository group is automatically pre-selected when adding repos
120 - #401 repository group is automatically pre-selected when adding repos
120 inside a repository group
121 inside a repository group
121 - added alternative HTTP 403 response when client failed to authenticate. Helps
122 - added alternative HTTP 403 response when client failed to authenticate. Helps
122 solving issues with Mercurial and LDAP
123 solving issues with Mercurial and LDAP
123 - #402 removed group prefix from repository name when listing repositories
124 - #402 removed group prefix from repository name when listing repositories
124 inside a group
125 inside a group
125 - added gravatars into permission view and permissions autocomplete
126 - added gravatars into permission view and permissions autocomplete
126 - #347 when running multiple RhodeCode instances, properly invalidates cache
127 - #347 when running multiple RhodeCode instances, properly invalidates cache
127 for all registered servers
128 for all registered servers
128
129
129 fixes
130 fixes
130 +++++
131 +++++
131
132
132 - fixed #390 cache invalidation problems on repos inside group
133 - fixed #390 cache invalidation problems on repos inside group
133 - fixed #385 clone by ID url was loosing proxy prefix in URL
134 - fixed #385 clone by ID url was loosing proxy prefix in URL
134 - fixed some unicode problems with waitress
135 - fixed some unicode problems with waitress
135 - fixed issue with escaping < and > in changeset commits
136 - fixed issue with escaping < and > in changeset commits
136 - fixed error occurring during recursive group creation in API
137 - fixed error occurring during recursive group creation in API
137 create_repo function
138 create_repo function
138 - fixed #393 py2.5 fixes for routes url generator
139 - fixed #393 py2.5 fixes for routes url generator
139 - fixed #397 Private repository groups shows up before login
140 - fixed #397 Private repository groups shows up before login
140 - fixed #396 fixed problems with revoking users in nested groups
141 - fixed #396 fixed problems with revoking users in nested groups
141 - fixed mysql unicode issues + specified InnoDB as default engine with
142 - fixed mysql unicode issues + specified InnoDB as default engine with
142 utf8 charset
143 utf8 charset
143 - #406 trim long branch/tag names in changelog to not break UI
144 - #406 trim long branch/tag names in changelog to not break UI
144
145
145 1.3.3 (**2012-03-02**)
146 1.3.3 (**2012-03-02**)
146 ----------------------
147 ----------------------
147
148
148 news
149 news
149 ++++
150 ++++
150
151
151
152
152 fixes
153 fixes
153 +++++
154 +++++
154
155
155 - fixed some python2.5 compatibility issues
156 - fixed some python2.5 compatibility issues
156 - fixed issues with removed repos was accidentally added as groups, after
157 - fixed issues with removed repos was accidentally added as groups, after
157 full rescan of paths
158 full rescan of paths
158 - fixes #376 Cannot edit user (using container auth)
159 - fixes #376 Cannot edit user (using container auth)
159 - fixes #378 Invalid image urls on changeset screen with proxy-prefix
160 - fixes #378 Invalid image urls on changeset screen with proxy-prefix
160 configuration
161 configuration
161 - fixed initial sorting of repos inside repo group
162 - fixed initial sorting of repos inside repo group
162 - fixes issue when user tried to resubmit same permission into user/user_groups
163 - fixes issue when user tried to resubmit same permission into user/user_groups
163 - bumped beaker version that fixes #375 leap error bug
164 - bumped beaker version that fixes #375 leap error bug
164 - fixed raw_changeset for git. It was generated with hg patch headers
165 - fixed raw_changeset for git. It was generated with hg patch headers
165 - fixed vcs issue with last_changeset for filenodes
166 - fixed vcs issue with last_changeset for filenodes
166 - fixed missing commit after hook delete
167 - fixed missing commit after hook delete
167 - fixed #372 issues with git operation detection that caused a security issue
168 - fixed #372 issues with git operation detection that caused a security issue
168 for git repos
169 for git repos
169
170
170 1.3.2 (**2012-02-28**)
171 1.3.2 (**2012-02-28**)
171 ----------------------
172 ----------------------
172
173
173 news
174 news
174 ++++
175 ++++
175
176
176
177
177 fixes
178 fixes
178 +++++
179 +++++
179
180
180 - fixed git protocol issues with repos-groups
181 - fixed git protocol issues with repos-groups
181 - fixed git remote repos validator that prevented from cloning remote git repos
182 - fixed git remote repos validator that prevented from cloning remote git repos
182 - fixes #370 ending slashes fixes for repo and groups
183 - fixes #370 ending slashes fixes for repo and groups
183 - fixes #368 improved git-protocol detection to handle other clients
184 - fixes #368 improved git-protocol detection to handle other clients
184 - fixes #366 When Setting Repository Group To Blank Repo Group Wont Be
185 - fixes #366 When Setting Repository Group To Blank Repo Group Wont Be
185 Moved To Root
186 Moved To Root
186 - fixes #371 fixed issues with beaker/sqlalchemy and non-ascii cache keys
187 - fixes #371 fixed issues with beaker/sqlalchemy and non-ascii cache keys
187 - fixed #373 missing cascade drop on user_group_to_perm table
188 - fixed #373 missing cascade drop on user_group_to_perm table
188
189
189 1.3.1 (**2012-02-27**)
190 1.3.1 (**2012-02-27**)
190 ----------------------
191 ----------------------
191
192
192 news
193 news
193 ++++
194 ++++
194
195
195
196
196 fixes
197 fixes
197 +++++
198 +++++
198
199
199 - redirection loop occurs when remember-me wasn't checked during login
200 - redirection loop occurs when remember-me wasn't checked during login
200 - fixes issues with git blob history generation
201 - fixes issues with git blob history generation
201 - don't fetch branch for git in file history dropdown. Causes unneeded slowness
202 - don't fetch branch for git in file history dropdown. Causes unneeded slowness
202
203
203 1.3.0 (**2012-02-26**)
204 1.3.0 (**2012-02-26**)
204 ----------------------
205 ----------------------
205
206
206 news
207 news
207 ++++
208 ++++
208
209
209 - code review, inspired by github code-comments
210 - code review, inspired by github code-comments
210 - #215 rst and markdown README files support
211 - #215 rst and markdown README files support
211 - #252 Container-based and proxy pass-through authentication support
212 - #252 Container-based and proxy pass-through authentication support
212 - #44 branch browser. Filtering of changelog by branches
213 - #44 branch browser. Filtering of changelog by branches
213 - mercurial bookmarks support
214 - mercurial bookmarks support
214 - new hover top menu, optimized to add maximum size for important views
215 - new hover top menu, optimized to add maximum size for important views
215 - configurable clone url template with possibility to specify protocol like
216 - configurable clone url template with possibility to specify protocol like
216 ssh:// or http:// and also manually alter other parts of clone_url.
217 ssh:// or http:// and also manually alter other parts of clone_url.
217 - enabled largefiles extension by default
218 - enabled largefiles extension by default
218 - optimized summary file pages and saved a lot of unused space in them
219 - optimized summary file pages and saved a lot of unused space in them
219 - #239 option to manually mark repository as fork
220 - #239 option to manually mark repository as fork
220 - #320 mapping of commit authors to RhodeCode users
221 - #320 mapping of commit authors to RhodeCode users
221 - #304 hashes are displayed using monospace font
222 - #304 hashes are displayed using monospace font
222 - diff configuration, toggle white lines and context lines
223 - diff configuration, toggle white lines and context lines
223 - #307 configurable diffs, whitespace toggle, increasing context lines
224 - #307 configurable diffs, whitespace toggle, increasing context lines
224 - sorting on branches, tags and bookmarks using YUI datatable
225 - sorting on branches, tags and bookmarks using YUI datatable
225 - improved file filter on files page
226 - improved file filter on files page
226 - implements #330 api method for listing nodes ar particular revision
227 - implements #330 api method for listing nodes ar particular revision
227 - #73 added linking issues in commit messages to chosen issue tracker url
228 - #73 added linking issues in commit messages to chosen issue tracker url
228 based on user defined regular expression
229 based on user defined regular expression
229 - added linking of changesets in commit messages
230 - added linking of changesets in commit messages
230 - new compact changelog with expandable commit messages
231 - new compact changelog with expandable commit messages
231 - firstname and lastname are optional in user creation
232 - firstname and lastname are optional in user creation
232 - #348 added post-create repository hook
233 - #348 added post-create repository hook
233 - #212 global encoding settings is now configurable from .ini files
234 - #212 global encoding settings is now configurable from .ini files
234 - #227 added repository groups permissions
235 - #227 added repository groups permissions
235 - markdown gets codehilite extensions
236 - markdown gets codehilite extensions
236 - new API methods, delete_repositories, grante/revoke permissions for groups
237 - new API methods, delete_repositories, grante/revoke permissions for groups
237 and repos
238 and repos
238
239
239
240
240 fixes
241 fixes
241 +++++
242 +++++
242
243
243 - rewrote dbsession management for atomic operations, and better error handling
244 - rewrote dbsession management for atomic operations, and better error handling
244 - fixed sorting of repo tables
245 - fixed sorting of repo tables
245 - #326 escape of special html entities in diffs
246 - #326 escape of special html entities in diffs
246 - normalized user_name => username in api attributes
247 - normalized user_name => username in api attributes
247 - fixes #298 ldap created users with mixed case emails created conflicts
248 - fixes #298 ldap created users with mixed case emails created conflicts
248 on saving a form
249 on saving a form
249 - fixes issue when owner of a repo couldn't revoke permissions for users
250 - fixes issue when owner of a repo couldn't revoke permissions for users
250 and groups
251 and groups
251 - fixes #271 rare JSON serialization problem with statistics
252 - fixes #271 rare JSON serialization problem with statistics
252 - fixes #337 missing validation check for conflicting names of a group with a
253 - fixes #337 missing validation check for conflicting names of a group with a
253 repositories group
254 repositories group
254 - #340 fixed session problem for mysql and celery tasks
255 - #340 fixed session problem for mysql and celery tasks
255 - fixed #331 RhodeCode mangles repository names if the a repository group
256 - fixed #331 RhodeCode mangles repository names if the a repository group
256 contains the "full path" to the repositories
257 contains the "full path" to the repositories
257 - #355 RhodeCode doesn't store encrypted LDAP passwords
258 - #355 RhodeCode doesn't store encrypted LDAP passwords
258
259
259 1.2.5 (**2012-01-28**)
260 1.2.5 (**2012-01-28**)
260 ----------------------
261 ----------------------
261
262
262 news
263 news
263 ++++
264 ++++
264
265
265 fixes
266 fixes
266 +++++
267 +++++
267
268
268 - #340 Celery complains about MySQL server gone away, added session cleanup
269 - #340 Celery complains about MySQL server gone away, added session cleanup
269 for celery tasks
270 for celery tasks
270 - #341 "scanning for repositories in None" log message during Rescan was missing
271 - #341 "scanning for repositories in None" log message during Rescan was missing
271 a parameter
272 a parameter
272 - fixed creating archives with subrepos. Some hooks were triggered during that
273 - fixed creating archives with subrepos. Some hooks were triggered during that
273 operation leading to crash.
274 operation leading to crash.
274 - fixed missing email in account page.
275 - fixed missing email in account page.
275 - Reverted Mercurial to 2.0.1 for windows due to bug in Mercurial that makes
276 - Reverted Mercurial to 2.0.1 for windows due to bug in Mercurial that makes
276 forking on windows impossible
277 forking on windows impossible
277
278
278 1.2.4 (**2012-01-19**)
279 1.2.4 (**2012-01-19**)
279 ----------------------
280 ----------------------
280
281
281 news
282 news
282 ++++
283 ++++
283
284
284 - RhodeCode is bundled with mercurial series 2.0.X by default, with
285 - RhodeCode is bundled with mercurial series 2.0.X by default, with
285 full support to largefiles extension. Enabled by default in new installations
286 full support to largefiles extension. Enabled by default in new installations
286 - #329 Ability to Add/Remove Groups to/from a Repository via AP
287 - #329 Ability to Add/Remove Groups to/from a Repository via AP
287 - added requires.txt file with requirements
288 - added requires.txt file with requirements
288
289
289 fixes
290 fixes
290 +++++
291 +++++
291
292
292 - fixes db session issues with celery when emailing admins
293 - fixes db session issues with celery when emailing admins
293 - #331 RhodeCode mangles repository names if the a repository group
294 - #331 RhodeCode mangles repository names if the a repository group
294 contains the "full path" to the repositories
295 contains the "full path" to the repositories
295 - #298 Conflicting e-mail addresses for LDAP and RhodeCode users
296 - #298 Conflicting e-mail addresses for LDAP and RhodeCode users
296 - DB session cleanup after hg protocol operations, fixes issues with
297 - DB session cleanup after hg protocol operations, fixes issues with
297 `mysql has gone away` errors
298 `mysql has gone away` errors
298 - #333 doc fixes for get_repo api function
299 - #333 doc fixes for get_repo api function
299 - #271 rare JSON serialization problem with statistics enabled
300 - #271 rare JSON serialization problem with statistics enabled
300 - #337 Fixes issues with validation of repository name conflicting with
301 - #337 Fixes issues with validation of repository name conflicting with
301 a group name. A proper message is now displayed.
302 a group name. A proper message is now displayed.
302 - #292 made ldap_dn in user edit readonly, to get rid of confusion that field
303 - #292 made ldap_dn in user edit readonly, to get rid of confusion that field
303 doesn't work
304 doesn't work
304 - #316 fixes issues with web description in hgrc files
305 - #316 fixes issues with web description in hgrc files
305
306
306 1.2.3 (**2011-11-02**)
307 1.2.3 (**2011-11-02**)
307 ----------------------
308 ----------------------
308
309
309 news
310 news
310 ++++
311 ++++
311
312
312 - added option to manage repos group for non admin users
313 - added option to manage repos group for non admin users
313 - added following API methods for get_users, create_user, get_users_groups,
314 - added following API methods for get_users, create_user, get_users_groups,
314 get_users_group, create_users_group, add_user_to_users_groups, get_repos,
315 get_users_group, create_users_group, add_user_to_users_groups, get_repos,
315 get_repo, create_repo, add_user_to_repo
316 get_repo, create_repo, add_user_to_repo
316 - implements #237 added password confirmation for my account
317 - implements #237 added password confirmation for my account
317 and admin edit user.
318 and admin edit user.
318 - implements #291 email notification for global events are now sent to all
319 - implements #291 email notification for global events are now sent to all
319 administrator users, and global config email.
320 administrator users, and global config email.
320
321
321 fixes
322 fixes
322 +++++
323 +++++
323
324
324 - added option for passing auth method for smtp mailer
325 - added option for passing auth method for smtp mailer
325 - #276 issue with adding a single user with id>10 to usergroups
326 - #276 issue with adding a single user with id>10 to usergroups
326 - #277 fixes windows LDAP settings in which missing values breaks the ldap auth
327 - #277 fixes windows LDAP settings in which missing values breaks the ldap auth
327 - #288 fixes managing of repos in a group for non admin user
328 - #288 fixes managing of repos in a group for non admin user
328
329
329 1.2.2 (**2011-10-17**)
330 1.2.2 (**2011-10-17**)
330 ----------------------
331 ----------------------
331
332
332 news
333 news
333 ++++
334 ++++
334
335
335 - #226 repo groups are available by path instead of numerical id
336 - #226 repo groups are available by path instead of numerical id
336
337
337 fixes
338 fixes
338 +++++
339 +++++
339
340
340 - #259 Groups with the same name but with different parent group
341 - #259 Groups with the same name but with different parent group
341 - #260 Put repo in group, then move group to another group -> repo becomes unavailable
342 - #260 Put repo in group, then move group to another group -> repo becomes unavailable
342 - #258 RhodeCode 1.2 assumes egg folder is writable (lockfiles problems)
343 - #258 RhodeCode 1.2 assumes egg folder is writable (lockfiles problems)
343 - #265 ldap save fails sometimes on converting attributes to booleans,
344 - #265 ldap save fails sometimes on converting attributes to booleans,
344 added getter and setter into model that will prevent from this on db model level
345 added getter and setter into model that will prevent from this on db model level
345 - fixed problems with timestamps issues #251 and #213
346 - fixed problems with timestamps issues #251 and #213
346 - fixes #266 RhodeCode allows to create repo with the same name and in
347 - fixes #266 RhodeCode allows to create repo with the same name and in
347 the same parent as group
348 the same parent as group
348 - fixes #245 Rescan of the repositories on Windows
349 - fixes #245 Rescan of the repositories on Windows
349 - fixes #248 cannot edit repos inside a group on windows
350 - fixes #248 cannot edit repos inside a group on windows
350 - fixes #219 forking problems on windows
351 - fixes #219 forking problems on windows
351
352
352 1.2.1 (**2011-10-08**)
353 1.2.1 (**2011-10-08**)
353 ----------------------
354 ----------------------
354
355
355 news
356 news
356 ++++
357 ++++
357
358
358
359
359 fixes
360 fixes
360 +++++
361 +++++
361
362
362 - fixed problems with basic auth and push problems
363 - fixed problems with basic auth and push problems
363 - gui fixes
364 - gui fixes
364 - fixed logger
365 - fixed logger
365
366
366 1.2.0 (**2011-10-07**)
367 1.2.0 (**2011-10-07**)
367 ----------------------
368 ----------------------
368
369
369 news
370 news
370 ++++
371 ++++
371
372
372 - implemented #47 repository groups
373 - implemented #47 repository groups
373 - implemented #89 Can setup google analytics code from settings menu
374 - implemented #89 Can setup google analytics code from settings menu
374 - implemented #91 added nicer looking archive urls with more download options
375 - implemented #91 added nicer looking archive urls with more download options
375 like tags, branches
376 like tags, branches
376 - implemented #44 into file browsing, and added follow branch option
377 - implemented #44 into file browsing, and added follow branch option
377 - implemented #84 downloads can be enabled/disabled for each repository
378 - implemented #84 downloads can be enabled/disabled for each repository
378 - anonymous repository can be cloned without having to pass default:default
379 - anonymous repository can be cloned without having to pass default:default
379 into clone url
380 into clone url
380 - fixed #90 whoosh indexer can index chooses repositories passed in command
381 - fixed #90 whoosh indexer can index chooses repositories passed in command
381 line
382 line
382 - extended journal with day aggregates and paging
383 - extended journal with day aggregates and paging
383 - implemented #107 source code lines highlight ranges
384 - implemented #107 source code lines highlight ranges
384 - implemented #93 customizable changelog on combined revision ranges -
385 - implemented #93 customizable changelog on combined revision ranges -
385 equivalent of githubs compare view
386 equivalent of githubs compare view
386 - implemented #108 extended and more powerful LDAP configuration
387 - implemented #108 extended and more powerful LDAP configuration
387 - implemented #56 users groups
388 - implemented #56 users groups
388 - major code rewrites optimized codes for speed and memory usage
389 - major code rewrites optimized codes for speed and memory usage
389 - raw and diff downloads are now in git format
390 - raw and diff downloads are now in git format
390 - setup command checks for write access to given path
391 - setup command checks for write access to given path
391 - fixed many issues with international characters and unicode. It uses utf8
392 - fixed many issues with international characters and unicode. It uses utf8
392 decode with replace to provide less errors even with non utf8 encoded strings
393 decode with replace to provide less errors even with non utf8 encoded strings
393 - #125 added API KEY access to feeds
394 - #125 added API KEY access to feeds
394 - #109 Repository can be created from external Mercurial link (aka. remote
395 - #109 Repository can be created from external Mercurial link (aka. remote
395 repository, and manually updated (via pull) from admin panel
396 repository, and manually updated (via pull) from admin panel
396 - beta git support - push/pull server + basic view for git repos
397 - beta git support - push/pull server + basic view for git repos
397 - added followers page and forks page
398 - added followers page and forks page
398 - server side file creation (with binary file upload interface)
399 - server side file creation (with binary file upload interface)
399 and edition with commits powered by codemirror
400 and edition with commits powered by codemirror
400 - #111 file browser file finder, quick lookup files on whole file tree
401 - #111 file browser file finder, quick lookup files on whole file tree
401 - added quick login sliding menu into main page
402 - added quick login sliding menu into main page
402 - changelog uses lazy loading of affected files details, in some scenarios
403 - changelog uses lazy loading of affected files details, in some scenarios
403 this can improve speed of changelog page dramatically especially for
404 this can improve speed of changelog page dramatically especially for
404 larger repositories.
405 larger repositories.
405 - implements #214 added support for downloading subrepos in download menu.
406 - implements #214 added support for downloading subrepos in download menu.
406 - Added basic API for direct operations on rhodecode via JSON
407 - Added basic API for direct operations on rhodecode via JSON
407 - Implemented advanced hook management
408 - Implemented advanced hook management
408
409
409 fixes
410 fixes
410 +++++
411 +++++
411
412
412 - fixed file browser bug, when switching into given form revision the url was
413 - fixed file browser bug, when switching into given form revision the url was
413 not changing
414 not changing
414 - fixed propagation to error controller on simplehg and simplegit middlewares
415 - fixed propagation to error controller on simplehg and simplegit middlewares
415 - fixed error when trying to make a download on empty repository
416 - fixed error when trying to make a download on empty repository
416 - fixed problem with '[' chars in commit messages in journal
417 - fixed problem with '[' chars in commit messages in journal
417 - fixed #99 Unicode errors, on file node paths with non utf-8 characters
418 - fixed #99 Unicode errors, on file node paths with non utf-8 characters
418 - journal fork fixes
419 - journal fork fixes
419 - removed issue with space inside renamed repository after deletion
420 - removed issue with space inside renamed repository after deletion
420 - fixed strange issue on formencode imports
421 - fixed strange issue on formencode imports
421 - fixed #126 Deleting repository on Windows, rename used incompatible chars.
422 - fixed #126 Deleting repository on Windows, rename used incompatible chars.
422 - #150 fixes for errors on repositories mapped in db but corrupted in
423 - #150 fixes for errors on repositories mapped in db but corrupted in
423 filesystem
424 filesystem
424 - fixed problem with ascendant characters in realm #181
425 - fixed problem with ascendant characters in realm #181
425 - fixed problem with sqlite file based database connection pool
426 - fixed problem with sqlite file based database connection pool
426 - whoosh indexer and code stats share the same dynamic extensions map
427 - whoosh indexer and code stats share the same dynamic extensions map
427 - fixes #188 - relationship delete of repo_to_perm entry on user removal
428 - fixes #188 - relationship delete of repo_to_perm entry on user removal
428 - fixes issue #189 Trending source files shows "show more" when no more exist
429 - fixes issue #189 Trending source files shows "show more" when no more exist
429 - fixes issue #197 Relative paths for pidlocks
430 - fixes issue #197 Relative paths for pidlocks
430 - fixes issue #198 password will require only 3 chars now for login form
431 - fixes issue #198 password will require only 3 chars now for login form
431 - fixes issue #199 wrong redirection for non admin users after creating a repository
432 - fixes issue #199 wrong redirection for non admin users after creating a repository
432 - fixes issues #202, bad db constraint made impossible to attach same group
433 - fixes issues #202, bad db constraint made impossible to attach same group
433 more than one time. Affects only mysql/postgres
434 more than one time. Affects only mysql/postgres
434 - fixes #218 os.kill patch for windows was missing sig param
435 - fixes #218 os.kill patch for windows was missing sig param
435 - improved rendering of dag (they are not trimmed anymore when number of
436 - improved rendering of dag (they are not trimmed anymore when number of
436 heads exceeds 5)
437 heads exceeds 5)
437
438
438 1.1.8 (**2011-04-12**)
439 1.1.8 (**2011-04-12**)
439 ----------------------
440 ----------------------
440
441
441 news
442 news
442 ++++
443 ++++
443
444
444 - improved windows support
445 - improved windows support
445
446
446 fixes
447 fixes
447 +++++
448 +++++
448
449
449 - fixed #140 freeze of python dateutil library, since new version is python2.x
450 - fixed #140 freeze of python dateutil library, since new version is python2.x
450 incompatible
451 incompatible
451 - setup-app will check for write permission in given path
452 - setup-app will check for write permission in given path
452 - cleaned up license info issue #149
453 - cleaned up license info issue #149
453 - fixes for issues #137,#116 and problems with unicode and accented characters.
454 - fixes for issues #137,#116 and problems with unicode and accented characters.
454 - fixes crashes on gravatar, when passed in email as unicode
455 - fixes crashes on gravatar, when passed in email as unicode
455 - fixed tooltip flickering problems
456 - fixed tooltip flickering problems
456 - fixed came_from redirection on windows
457 - fixed came_from redirection on windows
457 - fixed logging modules, and sql formatters
458 - fixed logging modules, and sql formatters
458 - windows fixes for os.kill issue #133
459 - windows fixes for os.kill issue #133
459 - fixes path splitting for windows issues #148
460 - fixes path splitting for windows issues #148
460 - fixed issue #143 wrong import on migration to 1.1.X
461 - fixed issue #143 wrong import on migration to 1.1.X
461 - fixed problems with displaying binary files, thanks to Thomas Waldmann
462 - fixed problems with displaying binary files, thanks to Thomas Waldmann
462 - removed name from archive files since it's breaking ui for long repo names
463 - removed name from archive files since it's breaking ui for long repo names
463 - fixed issue with archive headers sent to browser, thanks to Thomas Waldmann
464 - fixed issue with archive headers sent to browser, thanks to Thomas Waldmann
464 - fixed compatibility for 1024px displays, and larger dpi settings, thanks to
465 - fixed compatibility for 1024px displays, and larger dpi settings, thanks to
465 Thomas Waldmann
466 Thomas Waldmann
466 - fixed issue #166 summary pager was skipping 10 revisions on second page
467 - fixed issue #166 summary pager was skipping 10 revisions on second page
467
468
468
469
469 1.1.7 (**2011-03-23**)
470 1.1.7 (**2011-03-23**)
470 ----------------------
471 ----------------------
471
472
472 news
473 news
473 ++++
474 ++++
474
475
475 fixes
476 fixes
476 +++++
477 +++++
477
478
478 - fixed (again) #136 installation support for FreeBSD
479 - fixed (again) #136 installation support for FreeBSD
479
480
480
481
481 1.1.6 (**2011-03-21**)
482 1.1.6 (**2011-03-21**)
482 ----------------------
483 ----------------------
483
484
484 news
485 news
485 ++++
486 ++++
486
487
487 fixes
488 fixes
488 +++++
489 +++++
489
490
490 - fixed #136 installation support for FreeBSD
491 - fixed #136 installation support for FreeBSD
491 - RhodeCode will check for python version during installation
492 - RhodeCode will check for python version during installation
492
493
493 1.1.5 (**2011-03-17**)
494 1.1.5 (**2011-03-17**)
494 ----------------------
495 ----------------------
495
496
496 news
497 news
497 ++++
498 ++++
498
499
499 - basic windows support, by exchanging pybcrypt into sha256 for windows only
500 - basic windows support, by exchanging pybcrypt into sha256 for windows only
500 highly inspired by idea of mantis406
501 highly inspired by idea of mantis406
501
502
502 fixes
503 fixes
503 +++++
504 +++++
504
505
505 - fixed sorting by author in main page
506 - fixed sorting by author in main page
506 - fixed crashes with diffs on binary files
507 - fixed crashes with diffs on binary files
507 - fixed #131 problem with boolean values for LDAP
508 - fixed #131 problem with boolean values for LDAP
508 - fixed #122 mysql problems thanks to striker69
509 - fixed #122 mysql problems thanks to striker69
509 - fixed problem with errors on calling raw/raw_files/annotate functions
510 - fixed problem with errors on calling raw/raw_files/annotate functions
510 with unknown revisions
511 with unknown revisions
511 - fixed returned rawfiles attachment names with international character
512 - fixed returned rawfiles attachment names with international character
512 - cleaned out docs, big thanks to Jason Harris
513 - cleaned out docs, big thanks to Jason Harris
513
514
514 1.1.4 (**2011-02-19**)
515 1.1.4 (**2011-02-19**)
515 ----------------------
516 ----------------------
516
517
517 news
518 news
518 ++++
519 ++++
519
520
520 fixes
521 fixes
521 +++++
522 +++++
522
523
523 - fixed formencode import problem on settings page, that caused server crash
524 - fixed formencode import problem on settings page, that caused server crash
524 when that page was accessed as first after server start
525 when that page was accessed as first after server start
525 - journal fixes
526 - journal fixes
526 - fixed option to access repository just by entering http://server/<repo_name>
527 - fixed option to access repository just by entering http://server/<repo_name>
527
528
528 1.1.3 (**2011-02-16**)
529 1.1.3 (**2011-02-16**)
529 ----------------------
530 ----------------------
530
531
531 news
532 news
532 ++++
533 ++++
533
534
534 - implemented #102 allowing the '.' character in username
535 - implemented #102 allowing the '.' character in username
535 - added option to access repository just by entering http://server/<repo_name>
536 - added option to access repository just by entering http://server/<repo_name>
536 - celery task ignores result for better performance
537 - celery task ignores result for better performance
537
538
538 fixes
539 fixes
539 +++++
540 +++++
540
541
541 - fixed ehlo command and non auth mail servers on smtp_lib. Thanks to
542 - fixed ehlo command and non auth mail servers on smtp_lib. Thanks to
542 apollo13 and Johan Walles
543 apollo13 and Johan Walles
543 - small fixes in journal
544 - small fixes in journal
544 - fixed problems with getting setting for celery from .ini files
545 - fixed problems with getting setting for celery from .ini files
545 - registration, password reset and login boxes share the same title as main
546 - registration, password reset and login boxes share the same title as main
546 application now
547 application now
547 - fixed #113: to high permissions to fork repository
548 - fixed #113: to high permissions to fork repository
548 - fixed problem with '[' chars in commit messages in journal
549 - fixed problem with '[' chars in commit messages in journal
549 - removed issue with space inside renamed repository after deletion
550 - removed issue with space inside renamed repository after deletion
550 - db transaction fixes when filesystem repository creation failed
551 - db transaction fixes when filesystem repository creation failed
551 - fixed #106 relation issues on databases different than sqlite
552 - fixed #106 relation issues on databases different than sqlite
552 - fixed static files paths links to use of url() method
553 - fixed static files paths links to use of url() method
553
554
554 1.1.2 (**2011-01-12**)
555 1.1.2 (**2011-01-12**)
555 ----------------------
556 ----------------------
556
557
557 news
558 news
558 ++++
559 ++++
559
560
560
561
561 fixes
562 fixes
562 +++++
563 +++++
563
564
564 - fixes #98 protection against float division of percentage stats
565 - fixes #98 protection against float division of percentage stats
565 - fixed graph bug
566 - fixed graph bug
566 - forced webhelpers version since it was making troubles during installation
567 - forced webhelpers version since it was making troubles during installation
567
568
568 1.1.1 (**2011-01-06**)
569 1.1.1 (**2011-01-06**)
569 ----------------------
570 ----------------------
570
571
571 news
572 news
572 ++++
573 ++++
573
574
574 - added force https option into ini files for easier https usage (no need to
575 - added force https option into ini files for easier https usage (no need to
575 set server headers with this options)
576 set server headers with this options)
576 - small css updates
577 - small css updates
577
578
578 fixes
579 fixes
579 +++++
580 +++++
580
581
581 - fixed #96 redirect loop on files view on repositories without changesets
582 - fixed #96 redirect loop on files view on repositories without changesets
582 - fixed #97 unicode string passed into server header in special cases (mod_wsgi)
583 - fixed #97 unicode string passed into server header in special cases (mod_wsgi)
583 and server crashed with errors
584 and server crashed with errors
584 - fixed large tooltips problems on main page
585 - fixed large tooltips problems on main page
585 - fixed #92 whoosh indexer is more error proof
586 - fixed #92 whoosh indexer is more error proof
586
587
587 1.1.0 (**2010-12-18**)
588 1.1.0 (**2010-12-18**)
588 ----------------------
589 ----------------------
589
590
590 news
591 news
591 ++++
592 ++++
592
593
593 - rewrite of internals for vcs >=0.1.10
594 - rewrite of internals for vcs >=0.1.10
594 - uses mercurial 1.7 with dotencode disabled for maintaining compatibility
595 - uses mercurial 1.7 with dotencode disabled for maintaining compatibility
595 with older clients
596 with older clients
596 - anonymous access, authentication via ldap
597 - anonymous access, authentication via ldap
597 - performance upgrade for cached repos list - each repository has its own
598 - performance upgrade for cached repos list - each repository has its own
598 cache that's invalidated when needed.
599 cache that's invalidated when needed.
599 - performance upgrades on repositories with large amount of commits (20K+)
600 - performance upgrades on repositories with large amount of commits (20K+)
600 - main page quick filter for filtering repositories
601 - main page quick filter for filtering repositories
601 - user dashboards with ability to follow chosen repositories actions
602 - user dashboards with ability to follow chosen repositories actions
602 - sends email to admin on new user registration
603 - sends email to admin on new user registration
603 - added cache/statistics reset options into repository settings
604 - added cache/statistics reset options into repository settings
604 - more detailed action logger (based on hooks) with pushed changesets lists
605 - more detailed action logger (based on hooks) with pushed changesets lists
605 and options to disable those hooks from admin panel
606 and options to disable those hooks from admin panel
606 - introduced new enhanced changelog for merges that shows more accurate results
607 - introduced new enhanced changelog for merges that shows more accurate results
607 - new improved and faster code stats (based on pygments lexers mapping tables,
608 - new improved and faster code stats (based on pygments lexers mapping tables,
608 showing up to 10 trending sources for each repository. Additionally stats
609 showing up to 10 trending sources for each repository. Additionally stats
609 can be disabled in repository settings.
610 can be disabled in repository settings.
610 - gui optimizations, fixed application width to 1024px
611 - gui optimizations, fixed application width to 1024px
611 - added cut off (for large files/changesets) limit into config files
612 - added cut off (for large files/changesets) limit into config files
612 - whoosh, celeryd, upgrade moved to paster command
613 - whoosh, celeryd, upgrade moved to paster command
613 - other than sqlite database backends can be used
614 - other than sqlite database backends can be used
614
615
615 fixes
616 fixes
616 +++++
617 +++++
617
618
618 - fixes #61 forked repo was showing only after cache expired
619 - fixes #61 forked repo was showing only after cache expired
619 - fixes #76 no confirmation on user deletes
620 - fixes #76 no confirmation on user deletes
620 - fixes #66 Name field misspelled
621 - fixes #66 Name field misspelled
621 - fixes #72 block user removal when he owns repositories
622 - fixes #72 block user removal when he owns repositories
622 - fixes #69 added password confirmation fields
623 - fixes #69 added password confirmation fields
623 - fixes #87 RhodeCode crashes occasionally on updating repository owner
624 - fixes #87 RhodeCode crashes occasionally on updating repository owner
624 - fixes #82 broken annotations on files with more than 1 blank line at the end
625 - fixes #82 broken annotations on files with more than 1 blank line at the end
625 - a lot of fixes and tweaks for file browser
626 - a lot of fixes and tweaks for file browser
626 - fixed detached session issues
627 - fixed detached session issues
627 - fixed when user had no repos he would see all repos listed in my account
628 - fixed when user had no repos he would see all repos listed in my account
628 - fixed ui() instance bug when global hgrc settings was loaded for server
629 - fixed ui() instance bug when global hgrc settings was loaded for server
629 instance and all hgrc options were merged with our db ui() object
630 instance and all hgrc options were merged with our db ui() object
630 - numerous small bugfixes
631 - numerous small bugfixes
631
632
632 (special thanks for TkSoh for detailed feedback)
633 (special thanks for TkSoh for detailed feedback)
633
634
634
635
635 1.0.2 (**2010-11-12**)
636 1.0.2 (**2010-11-12**)
636 ----------------------
637 ----------------------
637
638
638 news
639 news
639 ++++
640 ++++
640
641
641 - tested under python2.7
642 - tested under python2.7
642 - bumped sqlalchemy and celery versions
643 - bumped sqlalchemy and celery versions
643
644
644 fixes
645 fixes
645 +++++
646 +++++
646
647
647 - fixed #59 missing graph.js
648 - fixed #59 missing graph.js
648 - fixed repo_size crash when repository had broken symlinks
649 - fixed repo_size crash when repository had broken symlinks
649 - fixed python2.5 crashes.
650 - fixed python2.5 crashes.
650
651
651
652
652 1.0.1 (**2010-11-10**)
653 1.0.1 (**2010-11-10**)
653 ----------------------
654 ----------------------
654
655
655 news
656 news
656 ++++
657 ++++
657
658
658 - small css updated
659 - small css updated
659
660
660 fixes
661 fixes
661 +++++
662 +++++
662
663
663 - fixed #53 python2.5 incompatible enumerate calls
664 - fixed #53 python2.5 incompatible enumerate calls
664 - fixed #52 disable mercurial extension for web
665 - fixed #52 disable mercurial extension for web
665 - fixed #51 deleting repositories don't delete it's dependent objects
666 - fixed #51 deleting repositories don't delete it's dependent objects
666
667
667
668
668 1.0.0 (**2010-11-02**)
669 1.0.0 (**2010-11-02**)
669 ----------------------
670 ----------------------
670
671
671 - security bugfix simplehg wasn't checking for permissions on commands
672 - security bugfix simplehg wasn't checking for permissions on commands
672 other than pull or push.
673 other than pull or push.
673 - fixed doubled messages after push or pull in admin journal
674 - fixed doubled messages after push or pull in admin journal
674 - templating and css corrections, fixed repo switcher on chrome, updated titles
675 - templating and css corrections, fixed repo switcher on chrome, updated titles
675 - admin menu accessible from options menu on repository view
676 - admin menu accessible from options menu on repository view
676 - permissions cached queries
677 - permissions cached queries
677
678
678 1.0.0rc4 (**2010-10-12**)
679 1.0.0rc4 (**2010-10-12**)
679 --------------------------
680 --------------------------
680
681
681 - fixed python2.5 missing simplejson imports (thanks to Jens BΓ€ckman)
682 - fixed python2.5 missing simplejson imports (thanks to Jens BΓ€ckman)
682 - removed cache_manager settings from sqlalchemy meta
683 - removed cache_manager settings from sqlalchemy meta
683 - added sqlalchemy cache settings to ini files
684 - added sqlalchemy cache settings to ini files
684 - validated password length and added second try of failure on paster setup-app
685 - validated password length and added second try of failure on paster setup-app
685 - fixed setup database destroy prompt even when there was no db
686 - fixed setup database destroy prompt even when there was no db
686
687
687
688
688 1.0.0rc3 (**2010-10-11**)
689 1.0.0rc3 (**2010-10-11**)
689 -------------------------
690 -------------------------
690
691
691 - fixed i18n during installation.
692 - fixed i18n during installation.
692
693
693 1.0.0rc2 (**2010-10-11**)
694 1.0.0rc2 (**2010-10-11**)
694 -------------------------
695 -------------------------
695
696
696 - Disabled dirsize in file browser, it's causing nasty bug when dir renames
697 - Disabled dirsize in file browser, it's causing nasty bug when dir renames
697 occure. After vcs is fixed it'll be put back again.
698 occure. After vcs is fixed it'll be put back again.
698 - templating/css rewrites, optimized css. No newline at end of file
699 - templating/css rewrites, optimized css.
@@ -1,217 +1,219 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2 """
2 """
3 rhodecode.controllers.admin.users
3 rhodecode.controllers.admin.users
4 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
4 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
5
5
6 Users crud controller for pylons
6 Users crud controller for pylons
7
7
8 :created_on: Apr 4, 2010
8 :created_on: Apr 4, 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
29
30 from formencode import htmlfill
30 from formencode import htmlfill
31 from pylons import request, session, tmpl_context as c, url, config
31 from pylons import request, session, tmpl_context as c, url, config
32 from pylons.controllers.util import redirect
32 from pylons.controllers.util import redirect
33 from pylons.i18n.translation import _
33 from pylons.i18n.translation import _
34
34
35 from rhodecode.lib.exceptions import DefaultUserException, \
35 from rhodecode.lib.exceptions import DefaultUserException, \
36 UserOwnsReposException
36 UserOwnsReposException
37 from rhodecode.lib import helpers as h
37 from rhodecode.lib import helpers as h
38 from rhodecode.lib.auth import LoginRequired, HasPermissionAllDecorator
38 from rhodecode.lib.auth import LoginRequired, HasPermissionAllDecorator,\
39 AuthUser
39 from rhodecode.lib.base import BaseController, render
40 from rhodecode.lib.base import BaseController, render
40
41
41 from rhodecode.model.db import User, Permission
42 from rhodecode.model.db import User, Permission
42 from rhodecode.model.forms import UserForm
43 from rhodecode.model.forms import UserForm
43 from rhodecode.model.user import UserModel
44 from rhodecode.model.user import UserModel
44 from rhodecode.model.meta import Session
45 from rhodecode.model.meta import Session
45 from rhodecode.lib.utils import action_logger
46 from rhodecode.lib.utils import action_logger
46
47
47 log = logging.getLogger(__name__)
48 log = logging.getLogger(__name__)
48
49
49
50
50 class UsersController(BaseController):
51 class UsersController(BaseController):
51 """REST Controller styled on the Atom Publishing Protocol"""
52 """REST Controller styled on the Atom Publishing Protocol"""
52 # To properly map this controller, ensure your config/routing.py
53 # To properly map this controller, ensure your config/routing.py
53 # file has a resource setup:
54 # file has a resource setup:
54 # map.resource('user', 'users')
55 # map.resource('user', 'users')
55
56
56 @LoginRequired()
57 @LoginRequired()
57 @HasPermissionAllDecorator('hg.admin')
58 @HasPermissionAllDecorator('hg.admin')
58 def __before__(self):
59 def __before__(self):
59 c.admin_user = session.get('admin_user')
60 c.admin_user = session.get('admin_user')
60 c.admin_username = session.get('admin_username')
61 c.admin_username = session.get('admin_username')
61 super(UsersController, self).__before__()
62 super(UsersController, self).__before__()
62 c.available_permissions = config['available_permissions']
63 c.available_permissions = config['available_permissions']
63
64
64 def index(self, format='html'):
65 def index(self, format='html'):
65 """GET /users: All items in the collection"""
66 """GET /users: All items in the collection"""
66 # url('users')
67 # url('users')
67
68
68 c.users_list = self.sa.query(User).all()
69 c.users_list = self.sa.query(User).all()
69 return render('admin/users/users.html')
70 return render('admin/users/users.html')
70
71
71 def create(self):
72 def create(self):
72 """POST /users: Create a new item"""
73 """POST /users: Create a new item"""
73 # url('users')
74 # url('users')
74
75
75 user_model = UserModel()
76 user_model = UserModel()
76 user_form = UserForm()()
77 user_form = UserForm()()
77 try:
78 try:
78 form_result = user_form.to_python(dict(request.POST))
79 form_result = user_form.to_python(dict(request.POST))
79 user_model.create(form_result)
80 user_model.create(form_result)
80 usr = form_result['username']
81 usr = form_result['username']
81 action_logger(self.rhodecode_user, 'admin_created_user:%s' % usr,
82 action_logger(self.rhodecode_user, 'admin_created_user:%s' % usr,
82 None, self.ip_addr, self.sa)
83 None, self.ip_addr, self.sa)
83 h.flash(_('created user %s') % usr,
84 h.flash(_('created user %s') % usr,
84 category='success')
85 category='success')
85 Session.commit()
86 Session.commit()
86 except formencode.Invalid, errors:
87 except formencode.Invalid, errors:
87 return htmlfill.render(
88 return htmlfill.render(
88 render('admin/users/user_add.html'),
89 render('admin/users/user_add.html'),
89 defaults=errors.value,
90 defaults=errors.value,
90 errors=errors.error_dict or {},
91 errors=errors.error_dict or {},
91 prefix_error=False,
92 prefix_error=False,
92 encoding="UTF-8")
93 encoding="UTF-8")
93 except Exception:
94 except Exception:
94 log.error(traceback.format_exc())
95 log.error(traceback.format_exc())
95 h.flash(_('error occurred during creation of user %s') \
96 h.flash(_('error occurred during creation of user %s') \
96 % request.POST.get('username'), category='error')
97 % request.POST.get('username'), category='error')
97 return redirect(url('users'))
98 return redirect(url('users'))
98
99
99 def new(self, format='html'):
100 def new(self, format='html'):
100 """GET /users/new: Form to create a new item"""
101 """GET /users/new: Form to create a new item"""
101 # url('new_user')
102 # url('new_user')
102 return render('admin/users/user_add.html')
103 return render('admin/users/user_add.html')
103
104
104 def update(self, id):
105 def update(self, id):
105 """PUT /users/id: Update an existing item"""
106 """PUT /users/id: Update an existing item"""
106 # Forms posted to this method should contain a hidden field:
107 # Forms posted to this method should contain a hidden field:
107 # <input type="hidden" name="_method" value="PUT" />
108 # <input type="hidden" name="_method" value="PUT" />
108 # Or using helpers:
109 # Or using helpers:
109 # h.form(url('update_user', id=ID),
110 # h.form(url('update_user', id=ID),
110 # method='put')
111 # method='put')
111 # url('user', id=ID)
112 # url('user', id=ID)
112 user_model = UserModel()
113 user_model = UserModel()
113 c.user = user_model.get(id)
114 c.user = user_model.get(id)
114
115 c.perm_user = AuthUser(user_id=id)
115 _form = UserForm(edit=True, old_data={'user_id': id,
116 _form = UserForm(edit=True, old_data={'user_id': id,
116 'email': c.user.email})()
117 'email': c.user.email})()
117 form_result = {}
118 form_result = {}
118 try:
119 try:
119 form_result = _form.to_python(dict(request.POST))
120 form_result = _form.to_python(dict(request.POST))
120 user_model.update(id, form_result)
121 user_model.update(id, form_result)
121 usr = form_result['username']
122 usr = form_result['username']
122 action_logger(self.rhodecode_user, 'admin_updated_user:%s' % usr,
123 action_logger(self.rhodecode_user, 'admin_updated_user:%s' % usr,
123 None, self.ip_addr, self.sa)
124 None, self.ip_addr, self.sa)
124 h.flash(_('User updated successfully'), category='success')
125 h.flash(_('User updated successfully'), category='success')
125 Session.commit()
126 Session.commit()
126 except formencode.Invalid, errors:
127 except formencode.Invalid, errors:
127 e = errors.error_dict or {}
128 e = errors.error_dict or {}
128 perm = Permission.get_by_key('hg.create.repository')
129 perm = Permission.get_by_key('hg.create.repository')
129 e.update({'create_repo_perm': user_model.has_perm(id, perm)})
130 e.update({'create_repo_perm': user_model.has_perm(id, perm)})
130 return htmlfill.render(
131 return htmlfill.render(
131 render('admin/users/user_edit.html'),
132 render('admin/users/user_edit.html'),
132 defaults=errors.value,
133 defaults=errors.value,
133 errors=e,
134 errors=e,
134 prefix_error=False,
135 prefix_error=False,
135 encoding="UTF-8")
136 encoding="UTF-8")
136 except Exception:
137 except Exception:
137 log.error(traceback.format_exc())
138 log.error(traceback.format_exc())
138 h.flash(_('error occurred during update of user %s') \
139 h.flash(_('error occurred during update of user %s') \
139 % form_result.get('username'), category='error')
140 % form_result.get('username'), category='error')
140
141
141 return redirect(url('users'))
142 return redirect(url('users'))
142
143
143 def delete(self, id):
144 def delete(self, id):
144 """DELETE /users/id: Delete an existing item"""
145 """DELETE /users/id: Delete an existing item"""
145 # Forms posted to this method should contain a hidden field:
146 # Forms posted to this method should contain a hidden field:
146 # <input type="hidden" name="_method" value="DELETE" />
147 # <input type="hidden" name="_method" value="DELETE" />
147 # Or using helpers:
148 # Or using helpers:
148 # h.form(url('delete_user', id=ID),
149 # h.form(url('delete_user', id=ID),
149 # method='delete')
150 # method='delete')
150 # url('user', id=ID)
151 # url('user', id=ID)
151 user_model = UserModel()
152 user_model = UserModel()
152 try:
153 try:
153 user_model.delete(id)
154 user_model.delete(id)
154 Session.commit()
155 Session.commit()
155 h.flash(_('successfully deleted user'), category='success')
156 h.flash(_('successfully deleted user'), category='success')
156 except (UserOwnsReposException, DefaultUserException), e:
157 except (UserOwnsReposException, DefaultUserException), e:
157 h.flash(e, category='warning')
158 h.flash(e, category='warning')
158 except Exception:
159 except Exception:
159 log.error(traceback.format_exc())
160 log.error(traceback.format_exc())
160 h.flash(_('An error occurred during deletion of user'),
161 h.flash(_('An error occurred during deletion of user'),
161 category='error')
162 category='error')
162 return redirect(url('users'))
163 return redirect(url('users'))
163
164
164 def show(self, id, format='html'):
165 def show(self, id, format='html'):
165 """GET /users/id: Show a specific item"""
166 """GET /users/id: Show a specific item"""
166 # url('user', id=ID)
167 # url('user', id=ID)
167
168
168 def edit(self, id, format='html'):
169 def edit(self, id, format='html'):
169 """GET /users/id/edit: Form to edit an existing item"""
170 """GET /users/id/edit: Form to edit an existing item"""
170 # url('edit_user', id=ID)
171 # url('edit_user', id=ID)
171 c.user = User.get(id)
172 c.user = User.get(id)
172 if not c.user:
173 if not c.user:
173 return redirect(url('users'))
174 return redirect(url('users'))
174 if c.user.username == 'default':
175 if c.user.username == 'default':
175 h.flash(_("You can't edit this user"), category='warning')
176 h.flash(_("You can't edit this user"), category='warning')
176 return redirect(url('users'))
177 return redirect(url('users'))
178 c.perm_user = AuthUser(user_id=id)
177 c.user.permissions = {}
179 c.user.permissions = {}
178 c.granted_permissions = UserModel().fill_perms(c.user)\
180 c.granted_permissions = UserModel().fill_perms(c.user)\
179 .permissions['global']
181 .permissions['global']
180
182
181 defaults = c.user.get_dict()
183 defaults = c.user.get_dict()
182 perm = Permission.get_by_key('hg.create.repository')
184 perm = Permission.get_by_key('hg.create.repository')
183 defaults.update({'create_repo_perm': UserModel().has_perm(id, perm)})
185 defaults.update({'create_repo_perm': UserModel().has_perm(id, perm)})
184
186
185 return htmlfill.render(
187 return htmlfill.render(
186 render('admin/users/user_edit.html'),
188 render('admin/users/user_edit.html'),
187 defaults=defaults,
189 defaults=defaults,
188 encoding="UTF-8",
190 encoding="UTF-8",
189 force_defaults=False
191 force_defaults=False
190 )
192 )
191
193
192 def update_perm(self, id):
194 def update_perm(self, id):
193 """PUT /users_perm/id: Update an existing item"""
195 """PUT /users_perm/id: Update an existing item"""
194 # url('user_perm', id=ID, method='put')
196 # url('user_perm', id=ID, method='put')
195
197
196 grant_perm = request.POST.get('create_repo_perm', False)
198 grant_perm = request.POST.get('create_repo_perm', False)
197 user_model = UserModel()
199 user_model = UserModel()
198
200
199 if grant_perm:
201 if grant_perm:
200 perm = Permission.get_by_key('hg.create.none')
202 perm = Permission.get_by_key('hg.create.none')
201 user_model.revoke_perm(id, perm)
203 user_model.revoke_perm(id, perm)
202
204
203 perm = Permission.get_by_key('hg.create.repository')
205 perm = Permission.get_by_key('hg.create.repository')
204 user_model.grant_perm(id, perm)
206 user_model.grant_perm(id, perm)
205 h.flash(_("Granted 'repository create' permission to user"),
207 h.flash(_("Granted 'repository create' permission to user"),
206 category='success')
208 category='success')
207 Session.commit()
209 Session.commit()
208 else:
210 else:
209 perm = Permission.get_by_key('hg.create.repository')
211 perm = Permission.get_by_key('hg.create.repository')
210 user_model.revoke_perm(id, perm)
212 user_model.revoke_perm(id, perm)
211
213
212 perm = Permission.get_by_key('hg.create.none')
214 perm = Permission.get_by_key('hg.create.none')
213 user_model.grant_perm(id, perm)
215 user_model.grant_perm(id, perm)
214 h.flash(_("Revoked 'repository create' permission to user"),
216 h.flash(_("Revoked 'repository create' permission to user"),
215 category='success')
217 category='success')
216 Session.commit()
218 Session.commit()
217 return redirect(url('edit_user', id=id))
219 return redirect(url('edit_user', id=id))
@@ -1,161 +1,207 b''
1 ## -*- coding: utf-8 -*-
1 ## -*- coding: utf-8 -*-
2 <%inherit file="/base/base.html"/>
2 <%inherit file="/base/base.html"/>
3
3
4 <%def name="title()">
4 <%def name="title()">
5 ${_('Edit user')} ${c.user.username} - ${c.rhodecode_name}
5 ${_('Edit user')} ${c.user.username} - ${c.rhodecode_name}
6 </%def>
6 </%def>
7
7
8 <%def name="breadcrumbs_links()">
8 <%def name="breadcrumbs_links()">
9 ${h.link_to(_('Admin'),h.url('admin_home'))}
9 ${h.link_to(_('Admin'),h.url('admin_home'))}
10 &raquo;
10 &raquo;
11 ${h.link_to(_('Users'),h.url('users'))}
11 ${h.link_to(_('Users'),h.url('users'))}
12 &raquo;
12 &raquo;
13 ${_('edit')} "${c.user.username}"
13 ${_('edit')} "${c.user.username}"
14 </%def>
14 </%def>
15
15
16 <%def name="page_nav()">
16 <%def name="page_nav()">
17 ${self.menu('admin')}
17 ${self.menu('admin')}
18 </%def>
18 </%def>
19
19
20 <%def name="main()">
20 <%def name="main()">
21 <div class="box box-left">
21 <div class="box box-left">
22 <!-- box / title -->
22 <!-- box / title -->
23 <div class="title">
23 <div class="title">
24 ${self.breadcrumbs()}
24 ${self.breadcrumbs()}
25 </div>
25 </div>
26 <!-- end box / title -->
26 <!-- end box / title -->
27 ${h.form(url('update_user', id=c.user.user_id),method='put')}
27 ${h.form(url('update_user', id=c.user.user_id),method='put')}
28 <div class="form">
28 <div class="form">
29 <div class="field">
29 <div class="field">
30 <div class="gravatar_box">
30 <div class="gravatar_box">
31 <div class="gravatar"><img alt="gravatar" src="${h.gravatar_url(c.user.email)}"/></div>
31 <div class="gravatar"><img alt="gravatar" src="${h.gravatar_url(c.user.email)}"/></div>
32 <p>
32 <p>
33 %if c.use_gravatar:
33 %if c.use_gravatar:
34 <strong>${_('Change your avatar at')} <a href="http://gravatar.com">gravatar.com</a></strong>
34 <strong>${_('Change your avatar at')} <a href="http://gravatar.com">gravatar.com</a></strong>
35 <br/>${_('Using')} ${c.user.email}
35 <br/>${_('Using')} ${c.user.email}
36 %else:
36 %else:
37 <br/>${c.user.email}
37 <br/>${c.user.email}
38 %endif
38 %endif
39 </div>
39 </div>
40 </div>
40 </div>
41 <div class="field">
41 <div class="field">
42 <div class="label">
42 <div class="label">
43 <label>${_('API key')}</label> ${c.user.api_key}
43 <label>${_('API key')}</label> ${c.user.api_key}
44 </div>
44 </div>
45 </div>
45 </div>
46
46
47 <div class="fields">
47 <div class="fields">
48 <div class="field">
48 <div class="field">
49 <div class="label">
49 <div class="label">
50 <label for="username">${_('Username')}:</label>
50 <label for="username">${_('Username')}:</label>
51 </div>
51 </div>
52 <div class="input">
52 <div class="input">
53 ${h.text('username',class_='medium')}
53 ${h.text('username',class_='medium')}
54 </div>
54 </div>
55 </div>
55 </div>
56
56
57 <div class="field">
57 <div class="field">
58 <div class="label">
58 <div class="label">
59 <label for="ldap_dn">${_('LDAP DN')}:</label>
59 <label for="ldap_dn">${_('LDAP DN')}:</label>
60 </div>
60 </div>
61 <div class="input">
61 <div class="input">
62 ${h.text('ldap_dn',class_='medium disabled',readonly="readonly")}
62 ${h.text('ldap_dn',class_='medium disabled',readonly="readonly")}
63 </div>
63 </div>
64 </div>
64 </div>
65
65
66 <div class="field">
66 <div class="field">
67 <div class="label">
67 <div class="label">
68 <label for="new_password">${_('New password')}:</label>
68 <label for="new_password">${_('New password')}:</label>
69 </div>
69 </div>
70 <div class="input">
70 <div class="input">
71 ${h.password('new_password',class_='medium',autocomplete="off")}
71 ${h.password('new_password',class_='medium',autocomplete="off")}
72 </div>
72 </div>
73 </div>
73 </div>
74
74
75 <div class="field">
75 <div class="field">
76 <div class="label">
76 <div class="label">
77 <label for="password_confirmation">${_('New password confirmation')}:</label>
77 <label for="password_confirmation">${_('New password confirmation')}:</label>
78 </div>
78 </div>
79 <div class="input">
79 <div class="input">
80 ${h.password('password_confirmation',class_="medium",autocomplete="off")}
80 ${h.password('password_confirmation',class_="medium",autocomplete="off")}
81 </div>
81 </div>
82 </div>
82 </div>
83
83
84 <div class="field">
84 <div class="field">
85 <div class="label">
85 <div class="label">
86 <label for="name">${_('First Name')}:</label>
86 <label for="name">${_('First Name')}:</label>
87 </div>
87 </div>
88 <div class="input">
88 <div class="input">
89 ${h.text('name',class_='medium')}
89 ${h.text('name',class_='medium')}
90 </div>
90 </div>
91 </div>
91 </div>
92
92
93 <div class="field">
93 <div class="field">
94 <div class="label">
94 <div class="label">
95 <label for="lastname">${_('Last Name')}:</label>
95 <label for="lastname">${_('Last Name')}:</label>
96 </div>
96 </div>
97 <div class="input">
97 <div class="input">
98 ${h.text('lastname',class_='medium')}
98 ${h.text('lastname',class_='medium')}
99 </div>
99 </div>
100 </div>
100 </div>
101
101
102 <div class="field">
102 <div class="field">
103 <div class="label">
103 <div class="label">
104 <label for="email">${_('Email')}:</label>
104 <label for="email">${_('Email')}:</label>
105 </div>
105 </div>
106 <div class="input">
106 <div class="input">
107 ${h.text('email',class_='medium')}
107 ${h.text('email',class_='medium')}
108 </div>
108 </div>
109 </div>
109 </div>
110
110
111 <div class="field">
111 <div class="field">
112 <div class="label label-checkbox">
112 <div class="label label-checkbox">
113 <label for="active">${_('Active')}:</label>
113 <label for="active">${_('Active')}:</label>
114 </div>
114 </div>
115 <div class="checkboxes">
115 <div class="checkboxes">
116 ${h.checkbox('active',value=True)}
116 ${h.checkbox('active',value=True)}
117 </div>
117 </div>
118 </div>
118 </div>
119
119
120 <div class="field">
120 <div class="field">
121 <div class="label label-checkbox">
121 <div class="label label-checkbox">
122 <label for="admin">${_('Admin')}:</label>
122 <label for="admin">${_('Admin')}:</label>
123 </div>
123 </div>
124 <div class="checkboxes">
124 <div class="checkboxes">
125 ${h.checkbox('admin',value=True)}
125 ${h.checkbox('admin',value=True)}
126 </div>
126 </div>
127 </div>
127 </div>
128 <div class="buttons">
128 <div class="buttons">
129 ${h.submit('save',_('Save'),class_="ui-button")}
129 ${h.submit('save',_('Save'),class_="ui-button")}
130 ${h.reset('reset',_('Reset'),class_="ui-button")}
130 ${h.reset('reset',_('Reset'),class_="ui-button")}
131 </div>
131 </div>
132 </div>
132 </div>
133 </div>
133 </div>
134 ${h.end_form()}
134 ${h.end_form()}
135 </div>
135 </div>
136 <div class="box box-right">
136 <div class="box box-right">
137 <!-- box / title -->
137 <!-- box / title -->
138 <div class="title">
138 <div class="title">
139 <h5>${_('Permissions')}</h5>
139 <h5>${_('Permissions')}</h5>
140 </div>
140 </div>
141 ${h.form(url('user_perm', id=c.user.user_id),method='put')}
141 ${h.form(url('user_perm', id=c.user.user_id),method='put')}
142 <div class="form">
142 <div class="form">
143 <!-- fields -->
143 <!-- fields -->
144 <div class="fields">
144 <div class="fields">
145 <div class="field">
145 <div class="field">
146 <div class="label label-checkbox">
146 <div class="label label-checkbox">
147 <label for="create_repo_perm">${_('Create repositories')}:</label>
147 <label for="create_repo_perm">${_('Create repositories')}:</label>
148 </div>
148 </div>
149 <div class="checkboxes">
149 <div class="checkboxes">
150 ${h.checkbox('create_repo_perm',value=True)}
150 ${h.checkbox('create_repo_perm',value=True)}
151 </div>
151 </div>
152 </div>
152 </div>
153 <div class="buttons">
153 <div class="buttons">
154 ${h.submit('save',_('Save'),class_="ui-button")}
154 ${h.submit('save',_('Save'),class_="ui-button")}
155 ${h.reset('reset',_('Reset'),class_="ui-button")}
155 ${h.reset('reset',_('Reset'),class_="ui-button")}
156 </div>
156 </div>
157 </div>
157 </div>
158 </div>
158 </div>
159 ${h.end_form()}
159 ${h.end_form()}
160
161 ## permissions overview
162 <div id="perms" class="table">
163 %for section in sorted(c.perm_user.permissions.keys()):
164 <div class="perms_section_head">${section.replace("_"," ").capitalize()}</div>
165
166 <div id='tbl_list_wrap_${section}' class="yui-skin-sam">
167 <table id="tbl_list_${section}">
168 <thead>
169 <tr>
170 <th class="left">${_('Name')}</th>
171 <th class="left">${_('Permission')}</th>
172 </thead>
173 <tbody>
174 %for k in c.perm_user.permissions[section]:
175 <%
176 if section != 'global':
177 section_perm = c.perm_user.permissions[section].get(k)
178 _perm = section_perm.split('.')[-1]
179 else:
180 _perm = section_perm = None
181 %>
182 <tr>
183 <td>
184 %if section == 'repositories':
185 <a href="${h.url('summary_home',repo_name=k)}">${k}</a>
186 %elif section == 'repositories_groups':
187 <a href="${h.url('repos_group_home',group_name=k)}">${k}</a>
188 %else:
189 ${k}
190 %endif
191 </td>
192 <td>
193 %if section == 'global':
194 ${h.bool2icon(True)}
195 %else:
196 <span class="perm_tag ${_perm}">${section_perm}</span>
197 %endif
198 </td>
199 </tr>
200 %endfor
201 </tbody>
202 </table>
203 </div>
204 %endfor
205 </div>
160 </div>
206 </div>
161 </%def>
207 </%def>
General Comments 0
You need to be logged in to leave comments. Login now