diff --git a/rhodecode/controllers/admin/repos.py b/rhodecode/controllers/admin/repos.py --- a/rhodecode/controllers/admin/repos.py +++ b/rhodecode/controllers/admin/repos.py @@ -97,6 +97,7 @@ class ReposController(BaseController): 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 @@ class ReposController(BaseController): 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 @@ class ReposController(BaseController): 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 --git a/rhodecode/controllers/settings.py b/rhodecode/controllers/settings.py --- a/rhodecode/controllers/settings.py +++ b/rhodecode/controllers/settings.py @@ -65,23 +65,38 @@ class SettingsController(BaseRepoControl 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 @@ class SettingsController(BaseRepoControl @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 @@ class SettingsController(BaseRepoControl 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 @@ class SettingsController(BaseRepoControl 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 --git a/rhodecode/model/forms.py b/rhodecode/model/forms.py --- a/rhodecode/model/forms.py +++ b/rhodecode/model/forms.py @@ -173,7 +173,7 @@ def RepoForm(edit=False, old_data={}, su 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 @@ def RepoForm(edit=False, old_data={}, su 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 @@ def RepoForm(edit=False, old_data={}, su 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 @@ def RepoForkForm(edit=False, old_data={} 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 --git a/rhodecode/model/repo.py b/rhodecode/model/repo.py --- a/rhodecode/model/repo.py +++ b/rhodecode/model/repo.py @@ -31,7 +31,8 @@ from datetime import datetime 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 @@ class RepoModel(BaseModel): 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 @@ class RepoModel(BaseModel): 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 @@ class RepoModel(BaseModel): 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 @@ class RepoModel(BaseModel): 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 --git a/rhodecode/model/validators.py b/rhodecode/model/validators.py --- a/rhodecode/model/validators.py +++ b/rhodecode/model/validators.py @@ -566,9 +566,18 @@ def ValidPerms(type_='repo'): 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 --git a/rhodecode/templates/settings/repo_settings.html b/rhodecode/templates/settings/repo_settings.html --- a/rhodecode/templates/settings/repo_settings.html +++ b/rhodecode/templates/settings/repo_settings.html @@ -57,26 +57,26 @@