##// END OF EJS Templates
users: do not require description on admin user creation
marcink -
r4056:0532bdf7 default
parent child Browse files
Show More
@@ -1,630 +1,631 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 3 # Copyright (C) 2010-2019 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 """
22 22 this is forms validation classes
23 23 http://formencode.org/module-formencode.validators.html
24 24 for list off all availible validators
25 25
26 26 we can create our own validators
27 27
28 28 The table below outlines the options which can be used in a schema in addition to the validators themselves
29 29 pre_validators [] These validators will be applied before the schema
30 30 chained_validators [] These validators will be applied after the schema
31 31 allow_extra_fields False If True, then it is not an error when keys that aren't associated with a validator are present
32 32 filter_extra_fields False If True, then keys that aren't associated with a validator are removed
33 33 if_key_missing NoDefault If this is given, then any keys that aren't available but are expected will be replaced with this value (and then validated). This does not override a present .if_missing attribute on validators. NoDefault is a special FormEncode class to mean that no default values has been specified and therefore missing keys shouldn't take a default value.
34 34 ignore_key_missing False If True, then missing keys will be missing in the result, if the validator doesn't have .if_missing on it already
35 35
36 36
37 37 <name> = formencode.validators.<name of validator>
38 38 <name> must equal form name
39 39 list=[1,2,3,4,5]
40 40 for SELECT use formencode.All(OneOf(list), Int())
41 41
42 42 """
43 43
44 44 import deform
45 45 import logging
46 46 import formencode
47 47
48 48 from pkg_resources import resource_filename
49 49 from formencode import All, Pipe
50 50
51 51 from pyramid.threadlocal import get_current_request
52 52
53 53 from rhodecode import BACKENDS
54 54 from rhodecode.lib import helpers
55 55 from rhodecode.model import validators as v
56 56
57 57 log = logging.getLogger(__name__)
58 58
59 59
60 60 deform_templates = resource_filename('deform', 'templates')
61 61 rhodecode_templates = resource_filename('rhodecode', 'templates/forms')
62 62 search_path = (rhodecode_templates, deform_templates)
63 63
64 64
65 65 class RhodecodeFormZPTRendererFactory(deform.ZPTRendererFactory):
66 66 """ Subclass of ZPTRendererFactory to add rhodecode context variables """
67 67 def __call__(self, template_name, **kw):
68 68 kw['h'] = helpers
69 69 kw['request'] = get_current_request()
70 70 return self.load(template_name)(**kw)
71 71
72 72
73 73 form_renderer = RhodecodeFormZPTRendererFactory(search_path)
74 74 deform.Form.set_default_renderer(form_renderer)
75 75
76 76
77 77 def LoginForm(localizer):
78 78 _ = localizer
79 79
80 80 class _LoginForm(formencode.Schema):
81 81 allow_extra_fields = True
82 82 filter_extra_fields = True
83 83 username = v.UnicodeString(
84 84 strip=True,
85 85 min=1,
86 86 not_empty=True,
87 87 messages={
88 88 'empty': _(u'Please enter a login'),
89 89 'tooShort': _(u'Enter a value %(min)i characters long or more')
90 90 }
91 91 )
92 92
93 93 password = v.UnicodeString(
94 94 strip=False,
95 95 min=3,
96 96 max=72,
97 97 not_empty=True,
98 98 messages={
99 99 'empty': _(u'Please enter a password'),
100 100 'tooShort': _(u'Enter %(min)i characters or more')}
101 101 )
102 102
103 103 remember = v.StringBoolean(if_missing=False)
104 104
105 105 chained_validators = [v.ValidAuth(localizer)]
106 106 return _LoginForm
107 107
108 108
109 109 def UserForm(localizer, edit=False, available_languages=None, old_data=None):
110 110 old_data = old_data or {}
111 111 available_languages = available_languages or []
112 112 _ = localizer
113 113
114 114 class _UserForm(formencode.Schema):
115 115 allow_extra_fields = True
116 116 filter_extra_fields = True
117 117 username = All(v.UnicodeString(strip=True, min=1, not_empty=True),
118 118 v.ValidUsername(localizer, edit, old_data))
119 119 if edit:
120 120 new_password = All(
121 121 v.ValidPassword(localizer),
122 122 v.UnicodeString(strip=False, min=6, max=72, not_empty=False)
123 123 )
124 124 password_confirmation = All(
125 125 v.ValidPassword(localizer),
126 126 v.UnicodeString(strip=False, min=6, max=72, not_empty=False),
127 127 )
128 128 admin = v.StringBoolean(if_missing=False)
129 129 else:
130 130 password = All(
131 131 v.ValidPassword(localizer),
132 132 v.UnicodeString(strip=False, min=6, max=72, not_empty=True)
133 133 )
134 134 password_confirmation = All(
135 135 v.ValidPassword(localizer),
136 136 v.UnicodeString(strip=False, min=6, max=72, not_empty=False)
137 137 )
138 138
139 139 password_change = v.StringBoolean(if_missing=False)
140 140 create_repo_group = v.StringBoolean(if_missing=False)
141 141
142 142 active = v.StringBoolean(if_missing=False)
143 143 firstname = v.UnicodeString(strip=True, min=1, not_empty=False)
144 144 lastname = v.UnicodeString(strip=True, min=1, not_empty=False)
145 145 email = All(v.UniqSystemEmail(localizer, old_data), v.Email(not_empty=True))
146 description = v.UnicodeString(strip=True, min=1, max=250, not_empty=False)
146 description = v.UnicodeString(strip=True, min=1, max=250, not_empty=False,
147 if_missing='')
147 148 extern_name = v.UnicodeString(strip=True)
148 149 extern_type = v.UnicodeString(strip=True)
149 150 language = v.OneOf(available_languages, hideList=False,
150 151 testValueList=True, if_missing=None)
151 152 chained_validators = [v.ValidPasswordsMatch(localizer)]
152 153 return _UserForm
153 154
154 155
155 156 def UserGroupForm(localizer, edit=False, old_data=None, allow_disabled=False):
156 157 old_data = old_data or {}
157 158 _ = localizer
158 159
159 160 class _UserGroupForm(formencode.Schema):
160 161 allow_extra_fields = True
161 162 filter_extra_fields = True
162 163
163 164 users_group_name = All(
164 165 v.UnicodeString(strip=True, min=1, not_empty=True),
165 166 v.ValidUserGroup(localizer, edit, old_data)
166 167 )
167 168 user_group_description = v.UnicodeString(strip=True, min=1,
168 169 not_empty=False)
169 170
170 171 users_group_active = v.StringBoolean(if_missing=False)
171 172
172 173 if edit:
173 174 # this is user group owner
174 175 user = All(
175 176 v.UnicodeString(not_empty=True),
176 177 v.ValidRepoUser(localizer, allow_disabled))
177 178 return _UserGroupForm
178 179
179 180
180 181 def RepoGroupForm(localizer, edit=False, old_data=None, available_groups=None,
181 182 can_create_in_root=False, allow_disabled=False):
182 183 _ = localizer
183 184 old_data = old_data or {}
184 185 available_groups = available_groups or []
185 186
186 187 class _RepoGroupForm(formencode.Schema):
187 188 allow_extra_fields = True
188 189 filter_extra_fields = False
189 190
190 191 group_name = All(v.UnicodeString(strip=True, min=1, not_empty=True),
191 192 v.SlugifyName(localizer),)
192 193 group_description = v.UnicodeString(strip=True, min=1,
193 194 not_empty=False)
194 195 group_copy_permissions = v.StringBoolean(if_missing=False)
195 196
196 197 group_parent_id = v.OneOf(available_groups, hideList=False,
197 198 testValueList=True, not_empty=True)
198 199 enable_locking = v.StringBoolean(if_missing=False)
199 200 chained_validators = [
200 201 v.ValidRepoGroup(localizer, edit, old_data, can_create_in_root)]
201 202
202 203 if edit:
203 204 # this is repo group owner
204 205 user = All(
205 206 v.UnicodeString(not_empty=True),
206 207 v.ValidRepoUser(localizer, allow_disabled))
207 208 return _RepoGroupForm
208 209
209 210
210 211 def RegisterForm(localizer, edit=False, old_data=None):
211 212 _ = localizer
212 213 old_data = old_data or {}
213 214
214 215 class _RegisterForm(formencode.Schema):
215 216 allow_extra_fields = True
216 217 filter_extra_fields = True
217 218 username = All(
218 219 v.ValidUsername(localizer, edit, old_data),
219 220 v.UnicodeString(strip=True, min=1, not_empty=True)
220 221 )
221 222 password = All(
222 223 v.ValidPassword(localizer),
223 224 v.UnicodeString(strip=False, min=6, max=72, not_empty=True)
224 225 )
225 226 password_confirmation = All(
226 227 v.ValidPassword(localizer),
227 228 v.UnicodeString(strip=False, min=6, max=72, not_empty=True)
228 229 )
229 230 active = v.StringBoolean(if_missing=False)
230 231 firstname = v.UnicodeString(strip=True, min=1, not_empty=False)
231 232 lastname = v.UnicodeString(strip=True, min=1, not_empty=False)
232 233 email = All(v.UniqSystemEmail(localizer, old_data), v.Email(not_empty=True))
233 234
234 235 chained_validators = [v.ValidPasswordsMatch(localizer)]
235 236 return _RegisterForm
236 237
237 238
238 239 def PasswordResetForm(localizer):
239 240 _ = localizer
240 241
241 242 class _PasswordResetForm(formencode.Schema):
242 243 allow_extra_fields = True
243 244 filter_extra_fields = True
244 245 email = All(v.ValidSystemEmail(localizer), v.Email(not_empty=True))
245 246 return _PasswordResetForm
246 247
247 248
248 249 def RepoForm(localizer, edit=False, old_data=None, repo_groups=None, allow_disabled=False):
249 250 _ = localizer
250 251 old_data = old_data or {}
251 252 repo_groups = repo_groups or []
252 253 supported_backends = BACKENDS.keys()
253 254
254 255 class _RepoForm(formencode.Schema):
255 256 allow_extra_fields = True
256 257 filter_extra_fields = False
257 258 repo_name = All(v.UnicodeString(strip=True, min=1, not_empty=True),
258 259 v.SlugifyName(localizer), v.CannotHaveGitSuffix(localizer))
259 260 repo_group = All(v.CanWriteGroup(localizer, old_data),
260 261 v.OneOf(repo_groups, hideList=True))
261 262 repo_type = v.OneOf(supported_backends, required=False,
262 263 if_missing=old_data.get('repo_type'))
263 264 repo_description = v.UnicodeString(strip=True, min=1, not_empty=False)
264 265 repo_private = v.StringBoolean(if_missing=False)
265 266 repo_copy_permissions = v.StringBoolean(if_missing=False)
266 267 clone_uri = All(v.UnicodeString(strip=True, min=1, not_empty=False))
267 268
268 269 repo_enable_statistics = v.StringBoolean(if_missing=False)
269 270 repo_enable_downloads = v.StringBoolean(if_missing=False)
270 271 repo_enable_locking = v.StringBoolean(if_missing=False)
271 272
272 273 if edit:
273 274 # this is repo owner
274 275 user = All(
275 276 v.UnicodeString(not_empty=True),
276 277 v.ValidRepoUser(localizer, allow_disabled))
277 278 clone_uri_change = v.UnicodeString(
278 279 not_empty=False, if_missing=v.Missing)
279 280
280 281 chained_validators = [v.ValidCloneUri(localizer),
281 282 v.ValidRepoName(localizer, edit, old_data)]
282 283 return _RepoForm
283 284
284 285
285 286 def RepoPermsForm(localizer):
286 287 _ = localizer
287 288
288 289 class _RepoPermsForm(formencode.Schema):
289 290 allow_extra_fields = True
290 291 filter_extra_fields = False
291 292 chained_validators = [v.ValidPerms(localizer, type_='repo')]
292 293 return _RepoPermsForm
293 294
294 295
295 296 def RepoGroupPermsForm(localizer, valid_recursive_choices):
296 297 _ = localizer
297 298
298 299 class _RepoGroupPermsForm(formencode.Schema):
299 300 allow_extra_fields = True
300 301 filter_extra_fields = False
301 302 recursive = v.OneOf(valid_recursive_choices)
302 303 chained_validators = [v.ValidPerms(localizer, type_='repo_group')]
303 304 return _RepoGroupPermsForm
304 305
305 306
306 307 def UserGroupPermsForm(localizer):
307 308 _ = localizer
308 309
309 310 class _UserPermsForm(formencode.Schema):
310 311 allow_extra_fields = True
311 312 filter_extra_fields = False
312 313 chained_validators = [v.ValidPerms(localizer, type_='user_group')]
313 314 return _UserPermsForm
314 315
315 316
316 317 def RepoFieldForm(localizer):
317 318 _ = localizer
318 319
319 320 class _RepoFieldForm(formencode.Schema):
320 321 filter_extra_fields = True
321 322 allow_extra_fields = True
322 323
323 324 new_field_key = All(v.FieldKey(localizer),
324 325 v.UnicodeString(strip=True, min=3, not_empty=True))
325 326 new_field_value = v.UnicodeString(not_empty=False, if_missing=u'')
326 327 new_field_type = v.OneOf(['str', 'unicode', 'list', 'tuple'],
327 328 if_missing='str')
328 329 new_field_label = v.UnicodeString(not_empty=False)
329 330 new_field_desc = v.UnicodeString(not_empty=False)
330 331 return _RepoFieldForm
331 332
332 333
333 334 def RepoForkForm(localizer, edit=False, old_data=None,
334 335 supported_backends=BACKENDS.keys(), repo_groups=None):
335 336 _ = localizer
336 337 old_data = old_data or {}
337 338 repo_groups = repo_groups or []
338 339
339 340 class _RepoForkForm(formencode.Schema):
340 341 allow_extra_fields = True
341 342 filter_extra_fields = False
342 343 repo_name = All(v.UnicodeString(strip=True, min=1, not_empty=True),
343 344 v.SlugifyName(localizer))
344 345 repo_group = All(v.CanWriteGroup(localizer, ),
345 346 v.OneOf(repo_groups, hideList=True))
346 347 repo_type = All(v.ValidForkType(localizer, old_data), v.OneOf(supported_backends))
347 348 description = v.UnicodeString(strip=True, min=1, not_empty=True)
348 349 private = v.StringBoolean(if_missing=False)
349 350 copy_permissions = v.StringBoolean(if_missing=False)
350 351 fork_parent_id = v.UnicodeString()
351 352 chained_validators = [v.ValidForkName(localizer, edit, old_data)]
352 353 return _RepoForkForm
353 354
354 355
355 356 def ApplicationSettingsForm(localizer):
356 357 _ = localizer
357 358
358 359 class _ApplicationSettingsForm(formencode.Schema):
359 360 allow_extra_fields = True
360 361 filter_extra_fields = False
361 362 rhodecode_title = v.UnicodeString(strip=True, max=40, not_empty=False)
362 363 rhodecode_realm = v.UnicodeString(strip=True, min=1, not_empty=True)
363 364 rhodecode_pre_code = v.UnicodeString(strip=True, min=1, not_empty=False)
364 365 rhodecode_post_code = v.UnicodeString(strip=True, min=1, not_empty=False)
365 366 rhodecode_captcha_public_key = v.UnicodeString(strip=True, min=1, not_empty=False)
366 367 rhodecode_captcha_private_key = v.UnicodeString(strip=True, min=1, not_empty=False)
367 368 rhodecode_create_personal_repo_group = v.StringBoolean(if_missing=False)
368 369 rhodecode_personal_repo_group_pattern = v.UnicodeString(strip=True, min=1, not_empty=False)
369 370 return _ApplicationSettingsForm
370 371
371 372
372 373 def ApplicationVisualisationForm(localizer):
373 374 from rhodecode.model.db import Repository
374 375 _ = localizer
375 376
376 377 class _ApplicationVisualisationForm(formencode.Schema):
377 378 allow_extra_fields = True
378 379 filter_extra_fields = False
379 380 rhodecode_show_public_icon = v.StringBoolean(if_missing=False)
380 381 rhodecode_show_private_icon = v.StringBoolean(if_missing=False)
381 382 rhodecode_stylify_metatags = v.StringBoolean(if_missing=False)
382 383
383 384 rhodecode_repository_fields = v.StringBoolean(if_missing=False)
384 385 rhodecode_lightweight_journal = v.StringBoolean(if_missing=False)
385 386 rhodecode_dashboard_items = v.Int(min=5, not_empty=True)
386 387 rhodecode_admin_grid_items = v.Int(min=5, not_empty=True)
387 388 rhodecode_show_version = v.StringBoolean(if_missing=False)
388 389 rhodecode_use_gravatar = v.StringBoolean(if_missing=False)
389 390 rhodecode_markup_renderer = v.OneOf(['markdown', 'rst'])
390 391 rhodecode_gravatar_url = v.UnicodeString(min=3)
391 392 rhodecode_clone_uri_tmpl = v.UnicodeString(not_empty=False, if_empty=Repository.DEFAULT_CLONE_URI)
392 393 rhodecode_clone_uri_ssh_tmpl = v.UnicodeString(not_empty=False, if_empty=Repository.DEFAULT_CLONE_URI_SSH)
393 394 rhodecode_support_url = v.UnicodeString()
394 395 rhodecode_show_revision_number = v.StringBoolean(if_missing=False)
395 396 rhodecode_show_sha_length = v.Int(min=4, not_empty=True)
396 397 return _ApplicationVisualisationForm
397 398
398 399
399 400 class _BaseVcsSettingsForm(formencode.Schema):
400 401
401 402 allow_extra_fields = True
402 403 filter_extra_fields = False
403 404 hooks_changegroup_repo_size = v.StringBoolean(if_missing=False)
404 405 hooks_changegroup_push_logger = v.StringBoolean(if_missing=False)
405 406 hooks_outgoing_pull_logger = v.StringBoolean(if_missing=False)
406 407
407 408 # PR/Code-review
408 409 rhodecode_pr_merge_enabled = v.StringBoolean(if_missing=False)
409 410 rhodecode_use_outdated_comments = v.StringBoolean(if_missing=False)
410 411
411 412 # hg
412 413 extensions_largefiles = v.StringBoolean(if_missing=False)
413 414 extensions_evolve = v.StringBoolean(if_missing=False)
414 415 phases_publish = v.StringBoolean(if_missing=False)
415 416
416 417 rhodecode_hg_use_rebase_for_merging = v.StringBoolean(if_missing=False)
417 418 rhodecode_hg_close_branch_before_merging = v.StringBoolean(if_missing=False)
418 419
419 420 # git
420 421 vcs_git_lfs_enabled = v.StringBoolean(if_missing=False)
421 422 rhodecode_git_use_rebase_for_merging = v.StringBoolean(if_missing=False)
422 423 rhodecode_git_close_branch_before_merging = v.StringBoolean(if_missing=False)
423 424
424 425 # svn
425 426 vcs_svn_proxy_http_requests_enabled = v.StringBoolean(if_missing=False)
426 427 vcs_svn_proxy_http_server_url = v.UnicodeString(strip=True, if_missing=None)
427 428
428 429 # cache
429 430 rhodecode_diff_cache = v.StringBoolean(if_missing=False)
430 431
431 432
432 433 def ApplicationUiSettingsForm(localizer):
433 434 _ = localizer
434 435
435 436 class _ApplicationUiSettingsForm(_BaseVcsSettingsForm):
436 437 web_push_ssl = v.StringBoolean(if_missing=False)
437 438 paths_root_path = All(
438 439 v.ValidPath(localizer),
439 440 v.UnicodeString(strip=True, min=1, not_empty=True)
440 441 )
441 442 largefiles_usercache = All(
442 443 v.ValidPath(localizer),
443 444 v.UnicodeString(strip=True, min=2, not_empty=True))
444 445 vcs_git_lfs_store_location = All(
445 446 v.ValidPath(localizer),
446 447 v.UnicodeString(strip=True, min=2, not_empty=True))
447 448 extensions_hgsubversion = v.StringBoolean(if_missing=False)
448 449 extensions_hggit = v.StringBoolean(if_missing=False)
449 450 new_svn_branch = v.ValidSvnPattern(localizer, section='vcs_svn_branch')
450 451 new_svn_tag = v.ValidSvnPattern(localizer, section='vcs_svn_tag')
451 452 return _ApplicationUiSettingsForm
452 453
453 454
454 455 def RepoVcsSettingsForm(localizer, repo_name):
455 456 _ = localizer
456 457
457 458 class _RepoVcsSettingsForm(_BaseVcsSettingsForm):
458 459 inherit_global_settings = v.StringBoolean(if_missing=False)
459 460 new_svn_branch = v.ValidSvnPattern(localizer,
460 461 section='vcs_svn_branch', repo_name=repo_name)
461 462 new_svn_tag = v.ValidSvnPattern(localizer,
462 463 section='vcs_svn_tag', repo_name=repo_name)
463 464 return _RepoVcsSettingsForm
464 465
465 466
466 467 def LabsSettingsForm(localizer):
467 468 _ = localizer
468 469
469 470 class _LabSettingsForm(formencode.Schema):
470 471 allow_extra_fields = True
471 472 filter_extra_fields = False
472 473 return _LabSettingsForm
473 474
474 475
475 476 def ApplicationPermissionsForm(
476 477 localizer, register_choices, password_reset_choices,
477 478 extern_activate_choices):
478 479 _ = localizer
479 480
480 481 class _DefaultPermissionsForm(formencode.Schema):
481 482 allow_extra_fields = True
482 483 filter_extra_fields = True
483 484
484 485 anonymous = v.StringBoolean(if_missing=False)
485 486 default_register = v.OneOf(register_choices)
486 487 default_register_message = v.UnicodeString()
487 488 default_password_reset = v.OneOf(password_reset_choices)
488 489 default_extern_activate = v.OneOf(extern_activate_choices)
489 490 return _DefaultPermissionsForm
490 491
491 492
492 493 def ObjectPermissionsForm(localizer, repo_perms_choices, group_perms_choices,
493 494 user_group_perms_choices):
494 495 _ = localizer
495 496
496 497 class _ObjectPermissionsForm(formencode.Schema):
497 498 allow_extra_fields = True
498 499 filter_extra_fields = True
499 500 overwrite_default_repo = v.StringBoolean(if_missing=False)
500 501 overwrite_default_group = v.StringBoolean(if_missing=False)
501 502 overwrite_default_user_group = v.StringBoolean(if_missing=False)
502 503
503 504 default_repo_perm = v.OneOf(repo_perms_choices)
504 505 default_group_perm = v.OneOf(group_perms_choices)
505 506 default_user_group_perm = v.OneOf(user_group_perms_choices)
506 507
507 508 return _ObjectPermissionsForm
508 509
509 510
510 511 def BranchPermissionsForm(localizer, branch_perms_choices):
511 512 _ = localizer
512 513
513 514 class _BranchPermissionsForm(formencode.Schema):
514 515 allow_extra_fields = True
515 516 filter_extra_fields = True
516 517 overwrite_default_branch = v.StringBoolean(if_missing=False)
517 518 default_branch_perm = v.OneOf(branch_perms_choices)
518 519
519 520 return _BranchPermissionsForm
520 521
521 522
522 523 def UserPermissionsForm(localizer, create_choices, create_on_write_choices,
523 524 repo_group_create_choices, user_group_create_choices,
524 525 fork_choices, inherit_default_permissions_choices):
525 526 _ = localizer
526 527
527 528 class _DefaultPermissionsForm(formencode.Schema):
528 529 allow_extra_fields = True
529 530 filter_extra_fields = True
530 531
531 532 anonymous = v.StringBoolean(if_missing=False)
532 533
533 534 default_repo_create = v.OneOf(create_choices)
534 535 default_repo_create_on_write = v.OneOf(create_on_write_choices)
535 536 default_user_group_create = v.OneOf(user_group_create_choices)
536 537 default_repo_group_create = v.OneOf(repo_group_create_choices)
537 538 default_fork_create = v.OneOf(fork_choices)
538 539 default_inherit_default_permissions = v.OneOf(inherit_default_permissions_choices)
539 540 return _DefaultPermissionsForm
540 541
541 542
542 543 def UserIndividualPermissionsForm(localizer):
543 544 _ = localizer
544 545
545 546 class _DefaultPermissionsForm(formencode.Schema):
546 547 allow_extra_fields = True
547 548 filter_extra_fields = True
548 549
549 550 inherit_default_permissions = v.StringBoolean(if_missing=False)
550 551 return _DefaultPermissionsForm
551 552
552 553
553 554 def DefaultsForm(localizer, edit=False, old_data=None, supported_backends=BACKENDS.keys()):
554 555 _ = localizer
555 556 old_data = old_data or {}
556 557
557 558 class _DefaultsForm(formencode.Schema):
558 559 allow_extra_fields = True
559 560 filter_extra_fields = True
560 561 default_repo_type = v.OneOf(supported_backends)
561 562 default_repo_private = v.StringBoolean(if_missing=False)
562 563 default_repo_enable_statistics = v.StringBoolean(if_missing=False)
563 564 default_repo_enable_downloads = v.StringBoolean(if_missing=False)
564 565 default_repo_enable_locking = v.StringBoolean(if_missing=False)
565 566 return _DefaultsForm
566 567
567 568
568 569 def AuthSettingsForm(localizer):
569 570 _ = localizer
570 571
571 572 class _AuthSettingsForm(formencode.Schema):
572 573 allow_extra_fields = True
573 574 filter_extra_fields = True
574 575 auth_plugins = All(v.ValidAuthPlugins(localizer),
575 576 v.UniqueListFromString(localizer)(not_empty=True))
576 577 return _AuthSettingsForm
577 578
578 579
579 580 def UserExtraEmailForm(localizer):
580 581 _ = localizer
581 582
582 583 class _UserExtraEmailForm(formencode.Schema):
583 584 email = All(v.UniqSystemEmail(localizer), v.Email(not_empty=True))
584 585 return _UserExtraEmailForm
585 586
586 587
587 588 def UserExtraIpForm(localizer):
588 589 _ = localizer
589 590
590 591 class _UserExtraIpForm(formencode.Schema):
591 592 ip = v.ValidIp(localizer)(not_empty=True)
592 593 return _UserExtraIpForm
593 594
594 595
595 596 def PullRequestForm(localizer, repo_id):
596 597 _ = localizer
597 598
598 599 class ReviewerForm(formencode.Schema):
599 600 user_id = v.Int(not_empty=True)
600 601 reasons = All()
601 602 rules = All(v.UniqueList(localizer, convert=int)())
602 603 mandatory = v.StringBoolean()
603 604
604 605 class _PullRequestForm(formencode.Schema):
605 606 allow_extra_fields = True
606 607 filter_extra_fields = True
607 608
608 609 common_ancestor = v.UnicodeString(strip=True, required=True)
609 610 source_repo = v.UnicodeString(strip=True, required=True)
610 611 source_ref = v.UnicodeString(strip=True, required=True)
611 612 target_repo = v.UnicodeString(strip=True, required=True)
612 613 target_ref = v.UnicodeString(strip=True, required=True)
613 614 revisions = All(#v.NotReviewedRevisions(localizer, repo_id)(),
614 615 v.UniqueList(localizer)(not_empty=True))
615 616 review_members = formencode.ForEach(ReviewerForm())
616 617 pullrequest_title = v.UnicodeString(strip=True, required=True, min=1, max=255)
617 618 pullrequest_desc = v.UnicodeString(strip=True, required=False)
618 619 description_renderer = v.UnicodeString(strip=True, required=False)
619 620
620 621 return _PullRequestForm
621 622
622 623
623 624 def IssueTrackerPatternsForm(localizer):
624 625 _ = localizer
625 626
626 627 class _IssueTrackerPatternsForm(formencode.Schema):
627 628 allow_extra_fields = True
628 629 filter_extra_fields = False
629 630 chained_validators = [v.ValidPattern(localizer)]
630 631 return _IssueTrackerPatternsForm
@@ -1,147 +1,147 b''
1 1 ## -*- coding: utf-8 -*-
2 2 <%inherit file="/base/base.mako"/>
3 3
4 4 <%def name="title()">
5 5 ${_('Add user')}
6 6 %if c.rhodecode_name:
7 7 &middot; ${h.branding(c.rhodecode_name)}
8 8 %endif
9 9 </%def>
10 10 <%def name="breadcrumbs_links()">
11 11 ${h.link_to(_('Admin'),h.route_path('admin_home'))}
12 12 &raquo;
13 13 ${h.link_to(_('Users'),h.route_path('users'))}
14 14 &raquo;
15 15 ${_('Add User')}
16 16 </%def>
17 17
18 18 <%def name="menu_bar_nav()">
19 19 ${self.menu_items(active='admin')}
20 20 </%def>
21 21
22 22 <%def name="main()">
23 23 <div class="box">
24 24 <!-- box / title -->
25 25 <div class="title">
26 26 ${self.breadcrumbs()}
27 27 </div>
28 28 <!-- end box / title -->
29 29 ${h.secure_form(h.route_path('users_create'), request=request)}
30 30 <div class="form">
31 31 <!-- fields -->
32 32 <div class="fields">
33 33 <div class="field">
34 34 <div class="label">
35 35 <label for="username">${_('Username')}:</label>
36 36 </div>
37 37 <div class="input">
38 38 ${h.text('username', class_='medium')}
39 39 </div>
40 40 </div>
41 41
42 42 <div class="field">
43 43 <div class="label">
44 44 <label for="password">${_('Password')}:</label>
45 45 </div>
46 46 <div class="input">
47 47 ${h.password('password', class_='medium')}
48 48 </div>
49 49 </div>
50 50
51 51 <div class="field">
52 52 <div class="label">
53 53 <label for="password_confirmation">${_('Password confirmation')}:</label>
54 54 </div>
55 55 <div class="input">
56 56 ${h.password('password_confirmation',autocomplete="off", class_='medium')}
57 57 <div class="info-block">
58 58 <a id="generate_password" href="#">
59 59 <i class="icon-lock"></i> ${_('Generate password')}
60 60 </a>
61 61 <span id="generate_password_preview"></span>
62 62 </div>
63 63 </div>
64 64 </div>
65 65
66 66 <div class="field">
67 67 <div class="label">
68 68 <label for="firstname">${_('First Name')}:</label>
69 69 </div>
70 70 <div class="input">
71 71 ${h.text('firstname', class_='medium')}
72 72 </div>
73 73 </div>
74 74
75 75 <div class="field">
76 76 <div class="label">
77 77 <label for="lastname">${_('Last Name')}:</label>
78 78 </div>
79 79 <div class="input">
80 80 ${h.text('lastname', class_='medium')}
81 81 </div>
82 82 </div>
83 83
84 84 <div class="field">
85 85 <div class="label">
86 86 <label for="email">${_('Email')}:</label>
87 87 </div>
88 88 <div class="input">
89 89 ${h.text('email', class_='medium')}
90 90 ${h.hidden('extern_name', c.default_extern_type)}
91 91 ${h.hidden('extern_type', c.default_extern_type)}
92 92 </div>
93 93 </div>
94 94
95 95 <div class="field">
96 96 <div class="label label-checkbox">
97 97 <label for="active">${_('Active')}:</label>
98 98 </div>
99 99 <div class="checkboxes">
100 100 ${h.checkbox('active',value=True,checked='checked')}
101 101 </div>
102 102 </div>
103 103
104 104 <div class="field">
105 105 <div class="label label-checkbox">
106 106 <label for="password_change">${_('Password change')}:</label>
107 107 </div>
108 108 <div class="checkboxes">
109 109 ${h.checkbox('password_change',value=True)}
110 110 <span class="help-block">${_('Force user to change his password on the next login')}</span>
111 111 </div>
112 112 </div>
113 113
114 114 <div class="field">
115 115 <div class="label label-checkbox">
116 116 <label for="create_repo_group">${_('Add personal repository group')}:</label>
117 117 </div>
118 118 <div class="checkboxes">
119 119 ${h.checkbox('create_repo_group',value=True, checked=c.default_create_repo_group)}
120 120 <span class="help-block">
121 ${_('New group will be created at: `/%(path)s`') % {'path': c.personal_repo_group_name}}<br/>
121 ${_('New group will be created at: `/{path}`').format(path=c.personal_repo_group_name)}<br/>
122 122 ${_('User will be automatically set as this group owner.')}
123 123 </span>
124 124 </div>
125 125 </div>
126 126
127 127 <div class="buttons">
128 128 ${h.submit('save',_('Save'),class_="btn")}
129 129 </div>
130 130 </div>
131 131 </div>
132 132 ${h.end_form()}
133 133 </div>
134 134 <script>
135 135 $(document).ready(function(){
136 136 $('#username').focus();
137 137
138 138 $('#generate_password').on('click', function(e){
139 139 var tmpl = "(${_('generated password:')} {0})";
140 140 var new_passwd = generatePassword(12);
141 141 $('#generate_password_preview').html(tmpl.format(new_passwd));
142 142 $('#password').val(new_passwd);
143 143 $('#password_confirmation').val(new_passwd);
144 144 })
145 145 })
146 146 </script>
147 147 </%def>
General Comments 0
You need to be logged in to leave comments. Login now