# HG changeset patch # User Marcin Kuzminski # Date 1355366059 -3600 # Node ID 4cc9bb83ecb4334488f9ab6bfabe186d041f4fd6 # Parent 304e4e3e299077bf16857462453602f3fff1545b Fixed some issues with edit form - unified code (but still a lot of duplicated code left over) - fixed forms - fixed validators diff -r 304e4e3e2990 -r 4cc9bb83ecb4 rhodecode/controllers/admin/repos.py --- a/rhodecode/controllers/admin/repos.py Thu Dec 13 00:09:59 2012 +0100 +++ b/rhodecode/controllers/admin/repos.py Thu Dec 13 03:34:19 2012 +0100 @@ -97,6 +97,7 @@ return redirect(url('repos')) + ##override defaults for exact repo info here git/hg etc choices, c.landing_revs = ScmModel().get_repo_landing_revs(c.repo_info) c.landing_revs_choices = choices @@ -239,7 +240,15 @@ new_repo = request.GET.get('repo', '') c.new_repo = repo_name_slug(new_repo) self.__load_defaults() - return render('admin/repos/repo_add.html') + ## apply the defaults from defaults page + defaults = RhodeCodeSetting.get_default_repo_settings(strip_prefix=True) + return htmlfill.render( + render('admin/repos/repo_add.html'), + defaults=defaults, + errors={}, + prefix_error=False, + encoding="UTF-8" + ) @HasPermissionAllDecorator('hg.admin') def update(self, repo_name): @@ -263,7 +272,7 @@ landing_revs=c.landing_revs_choices)() try: form_result = _form.to_python(dict(request.POST)) - repo = repo_model.update(repo_name, form_result) + repo = repo_model.update(repo_name, **form_result) invalidate_cache('get_repo_cached_%s' % repo_name) h.flash(_('Repository %s updated successfully') % repo_name, category='success') diff -r 304e4e3e2990 -r 4cc9bb83ecb4 rhodecode/controllers/settings.py --- a/rhodecode/controllers/settings.py Thu Dec 13 00:09:59 2012 +0100 +++ b/rhodecode/controllers/settings.py Thu Dec 13 03:34:19 2012 +0100 @@ -65,23 +65,38 @@ choices, c.landing_revs = ScmModel().get_repo_landing_revs() c.landing_revs_choices = choices - @HasRepoPermissionAllDecorator('repository.admin') - def index(self, repo_name): - repo_model = RepoModel() - c.repo_info = repo = repo_model.get_by_repo_name(repo_name) - if not repo: + def __load_data(self, repo_name=None): + """ + Load defaults settings for edit, and update + + :param repo_name: + """ + self.__load_defaults() + + c.repo_info = db_repo = Repository.get_by_repo_name(repo_name) + repo = db_repo.scm_instance + + if c.repo_info is None: h.flash(_('%s repository is not mapped to db perhaps' - ' it was created or renamed from the file system' + ' it was created or renamed from the filesystem' ' please run the application again' ' in order to rescan repositories') % repo_name, category='error') return redirect(url('home')) - self.__load_defaults() + ##override defaults for exact repo info here git/hg etc + choices, c.landing_revs = ScmModel().get_repo_landing_revs(c.repo_info) + c.landing_revs_choices = choices defaults = RepoModel()._get_defaults(repo_name) + return defaults + + @HasRepoPermissionAllDecorator('repository.admin') + def index(self, repo_name): + defaults = self.__load_data(repo_name) + return htmlfill.render( render('settings/repo_settings.html'), defaults=defaults, @@ -91,10 +106,12 @@ @HasRepoPermissionAllDecorator('repository.admin') def update(self, repo_name): + self.__load_defaults() repo_model = RepoModel() changed_name = repo_name - - self.__load_defaults() + #override the choices with extracted revisions ! + choices, c.landing_revs = ScmModel().get_repo_landing_revs(repo_name) + c.landing_revs_choices = choices _form = RepoSettingsForm(edit=True, old_data={'repo_name': repo_name}, @@ -102,8 +119,7 @@ landing_revs=c.landing_revs_choices)() try: form_result = _form.to_python(dict(request.POST)) - - repo_model.update(repo_name, form_result) + repo_model.update(repo_name, **form_result) invalidate_cache('get_repo_cached_%s' % repo_name) h.flash(_('Repository %s updated successfully') % repo_name, category='success') @@ -112,15 +128,15 @@ changed_name, self.ip_addr, self.sa) Session().commit() except formencode.Invalid, errors: - c.repo_info = repo_model.get_by_repo_name(repo_name) - c.users_array = repo_model.get_users_js() - errors.value.update({'user': c.repo_info.user.username}) + defaults = self.__load_data(repo_name) + defaults.update(errors.value) return htmlfill.render( render('settings/repo_settings.html'), defaults=errors.value, errors=errors.error_dict or {}, prefix_error=False, encoding="UTF-8") + except Exception: log.error(traceback.format_exc()) h.flash(_('error occurred during update of repository %s') \ diff -r 304e4e3e2990 -r 4cc9bb83ecb4 rhodecode/model/forms.py --- a/rhodecode/model/forms.py Thu Dec 13 00:09:59 2012 +0100 +++ b/rhodecode/model/forms.py Thu Dec 13 03:34:19 2012 +0100 @@ -173,7 +173,7 @@ repo_groups=[], landing_revs=[]): class _RepoForm(formencode.Schema): allow_extra_fields = True - filter_extra_fields = True + filter_extra_fields = False repo_name = All(v.UnicodeString(strip=True, min=1, not_empty=True), v.SlugifyName()) repo_group = All(v.CanWriteGroup(), @@ -181,11 +181,12 @@ repo_type = v.OneOf(supported_backends) repo_description = v.UnicodeString(strip=True, min=1, not_empty=False) repo_private = v.StringBoolean(if_missing=False) + repo_landing_rev = v.OneOf(landing_revs, hideList=True) + clone_uri = All(v.UnicodeString(strip=True, min=1, not_empty=False)) + repo_enable_statistics = v.StringBoolean(if_missing=False) repo_enable_downloads = v.StringBoolean(if_missing=False) repo_enable_locking = v.StringBoolean(if_missing=False) - repo_landing_rev = v.OneOf(landing_revs, hideList=True) - clone_uri = All(v.UnicodeString(strip=True, min=1, not_empty=False)) if edit: #this is repo owner @@ -197,6 +198,27 @@ return _RepoForm +def RepoSettingsForm(edit=False, old_data={}, supported_backends=BACKENDS.keys(), + repo_groups=[], landing_revs=[]): + class _RepoForm(formencode.Schema): + allow_extra_fields = True + filter_extra_fields = False + repo_name = All(v.UnicodeString(strip=True, min=1, not_empty=True), + v.SlugifyName()) + repo_group = All(v.CanWriteGroup(), + v.OneOf(repo_groups, hideList=True)) + repo_description = v.UnicodeString(strip=True, min=1, not_empty=False) + repo_private = v.StringBoolean(if_missing=False) + repo_landing_rev = v.OneOf(landing_revs, hideList=True) + clone_uri = All(v.UnicodeString(strip=True, min=1, not_empty=False)) + + chained_validators = [v.ValidCloneUri(), + v.ValidRepoName(edit, old_data), + v.ValidPerms(), + v.ValidSettings()] + return _RepoForm + + def RepoForkForm(edit=False, old_data={}, supported_backends=BACKENDS.keys(), repo_groups=[], landing_revs=[]): class _RepoForkForm(formencode.Schema): @@ -218,23 +240,6 @@ return _RepoForkForm -def RepoSettingsForm(edit=False, old_data={}, supported_backends=BACKENDS.keys(), - repo_groups=[], landing_revs=[]): - class _RepoForm(formencode.Schema): - allow_extra_fields = True - filter_extra_fields = False - repo_name = All(v.UnicodeString(strip=True, min=1, not_empty=True), - v.SlugifyName()) - description = v.UnicodeString(strip=True, min=1, not_empty=True) - repo_group = All(v.CanWriteGroup(), - v.OneOf(repo_groups, hideList=True)) - private = v.StringBoolean(if_missing=False) - landing_rev = v.OneOf(landing_revs, hideList=True) - chained_validators = [v.ValidRepoName(edit, old_data), v.ValidPerms(), - v.ValidSettings()] - return _RepoForm - - def ApplicationSettingsForm(): class _ApplicationSettingsForm(formencode.Schema): allow_extra_fields = True diff -r 304e4e3e2990 -r 4cc9bb83ecb4 rhodecode/model/repo.py --- a/rhodecode/model/repo.py Thu Dec 13 00:09:59 2012 +0100 +++ b/rhodecode/model/repo.py Thu Dec 13 03:34:19 2012 +0100 @@ -31,7 +31,8 @@ from rhodecode.lib.vcs.backends import get_backend from rhodecode.lib.compat import json -from rhodecode.lib.utils2 import LazyProperty, safe_str, safe_unicode +from rhodecode.lib.utils2 import LazyProperty, safe_str, safe_unicode,\ + remove_prefix from rhodecode.lib.caching_query import FromCache from rhodecode.lib.hooks import log_create_repository, log_delete_repository @@ -131,6 +132,16 @@ defaults['repo_group'] = getattr(group[-1] if group else None, 'group_id', None) + for strip, k in [(0, 'repo_type'), (1, 'repo_enable_downloads'), + (1, 'repo_description'), (1, 'repo_enable_locking'), + (1, 'repo_landing_rev'), (0, 'clone_uri'), + (1, 'repo_private'), (1, 'repo_enable_statistics')]: + attr = k + if strip: + attr = remove_prefix(k, 'repo_') + + defaults[k] = defaults[attr] + # fill owner if repo_info.user: defaults.update({'user': repo_info.user.username}) @@ -151,12 +162,12 @@ return defaults - def update(self, repo_name, form_data): + def update(self, org_repo_name, **kwargs): try: - cur_repo = self.get_by_repo_name(repo_name, cache=False) + cur_repo = self.get_by_repo_name(org_repo_name, cache=False) # update permissions - for member, perm, member_type in form_data['perms_updates']: + for member, perm, member_type in kwargs['perms_updates']: if member_type == 'user': # this updates existing one RepoModel().grant_user_permission( @@ -167,7 +178,7 @@ repo=cur_repo, group_name=member, perm=perm ) # set new permissions - for member, perm, member_type in form_data['perms_new']: + for member, perm, member_type in kwargs['perms_new']: if member_type == 'user': RepoModel().grant_user_permission( repo=cur_repo, user=member, perm=perm @@ -177,26 +188,30 @@ repo=cur_repo, group_name=member, perm=perm ) - # update current repo - for k, v in form_data.items(): - if k == 'user': - cur_repo.user = User.get_by_username(v) - elif k == 'repo_name': - pass - elif k == 'repo_group': - cur_repo.group = RepoGroup.get(v) + if 'user' in kwargs: + cur_repo.user = User.get_by_username(kwargs['user']) + + if 'repo_group' in kwargs: + cur_repo.group = RepoGroup.get(kwargs['repo_group']) - else: - setattr(cur_repo, k, v) + for strip, k in [(0, 'repo_type'), (1, 'repo_enable_downloads'), + (1, 'repo_description'), (1, 'repo_enable_locking'), + (1, 'repo_landing_rev'), (0, 'clone_uri'), + (1, 'repo_private'), (1, 'repo_enable_statistics')]: + if k in kwargs: + val = kwargs[k] + if strip: + k = remove_prefix(k, 'repo_') + setattr(cur_repo, k, val) - new_name = cur_repo.get_new_name(form_data['repo_name']) + new_name = cur_repo.get_new_name(kwargs['repo_name']) cur_repo.repo_name = new_name self.sa.add(cur_repo) - if repo_name != new_name: + if org_repo_name != new_name: # rename repository - self.__rename_repo(old=repo_name, new=new_name) + self.__rename_repo(old=org_repo_name, new=new_name) return cur_repo except: diff -r 304e4e3e2990 -r 4cc9bb83ecb4 rhodecode/model/validators.py --- a/rhodecode/model/validators.py Thu Dec 13 00:09:59 2012 +0100 +++ b/rhodecode/model/validators.py Thu Dec 13 03:34:19 2012 +0100 @@ -566,9 +566,18 @@ def ValidSettings(): class _validator(formencode.validators.FancyValidator): def _to_python(self, value, state): - # settings form can't edit user - if 'user' in value: - del value['user'] + # settings form for users that are not admin + # can't edit certain parameters, it's extra backup if they mangle + # with forms + + forbidden_params = [ + 'user', 'repo_type', 'repo_enable_locking', + 'repo_enable_downloads', 'repo_enable_statistics' + ] + + for param in forbidden_params: + if param in value: + del value[param] return value def validate_python(self, value, state): diff -r 304e4e3e2990 -r 4cc9bb83ecb4 rhodecode/templates/settings/repo_settings.html --- a/rhodecode/templates/settings/repo_settings.html Thu Dec 13 00:09:59 2012 +0100 +++ b/rhodecode/templates/settings/repo_settings.html Thu Dec 13 03:34:19 2012 +0100 @@ -57,26 +57,26 @@
- ${h.select('landing_rev','',c.landing_revs,class_="medium")} + ${h.select('repo_landing_rev','',c.landing_revs,class_="medium")} ${_('Default revision for files page, downloads, whoosh and readme')}
- +
- ${h.textarea('description')} + ${h.textarea('repo_description')} ${_('Keep it short and to the point. Use a README file for longer descriptions.')}
- +
- ${h.checkbox('private',value="True")} + ${h.checkbox('repo_private',value="True")} ${_('Private repositories are only visible to people explicitly added as collaborators.')}
@@ -89,29 +89,7 @@ <%include file="../admin/repos/repo_edit_perms.html"/> - -
-
- -
-
- ${h.form(url('repo_settings_delete', repo_name=c.repo_info.repo_name),method='delete')} -
-
- ${h.submit('remove_%s' % c.repo_info.repo_name,_('Remove this repository'),class_="ui-btn red",onclick="return confirm('"+_('Confirm to delete this repository')+"');")} -
-
-
    -
  • ${_('''This repository will be renamed in a special way in order to be unaccesible for RhodeCode and VCS systems. - If you need fully delete it from file system please do it manually''')} -
  • -
-
-
- ${h.end_form()} -
-
- +
${h.submit('save',_('Save'),class_="ui-btn large")} ${h.reset('reset',_('Reset'),class_="ui-btn large")} @@ -120,5 +98,35 @@
${h.end_form()} + +

${_('Delete repository')}

+
+ +
+ +
+
+ +
+
+ ${h.form(url('repo_settings_delete', repo_name=c.repo_info.repo_name),method='delete')} +
+
+ ${h.submit('remove_%s' % c.repo_info.repo_name,_('Remove this repository'),class_="ui-btn red",onclick="return confirm('"+_('Confirm to delete this repository')+"');")} +
+
+
    +
  • ${_('''This repository will be renamed in a special way in order to be unaccesible for RhodeCode and VCS systems. + If you need fully delete it from file system please do it manually''')} +
  • +
+
+
+ ${h.end_form()} +
+
+
+
+ diff -r 304e4e3e2990 -r 4cc9bb83ecb4 rhodecode/tests/models/test_repos_groups.py --- a/rhodecode/tests/models/test_repos_groups.py Thu Dec 13 00:09:59 2012 +0100 +++ b/rhodecode/tests/models/test_repos_groups.py Thu Dec 13 03:34:19 2012 +0100 @@ -136,7 +136,7 @@ form_data['repo_group'] = g1.group_id form_data['perms_new'] = [] form_data['perms_updates'] = [] - RepoModel().update(r.repo_name, form_data) + RepoModel().update(r.repo_name, **form_data) self.assertEqual(r.repo_name, 'g1/john') self.__update_group(g1.group_id, 'g1', parent_id=g2.group_id)