Mercurial > kallithea
changeset 3089:4cc9bb83ecb4 beta
Fixed some issues with edit form
- unified code (but still a lot of duplicated code left over)
- fixed forms
- fixed validators
author | Marcin Kuzminski <marcin@python-works.com> |
---|---|
date | Thu, 13 Dec 2012 03:34:19 +0100 |
parents | 304e4e3e2990 |
children | 280ac97cb37f |
files | rhodecode/controllers/admin/repos.py rhodecode/controllers/settings.py rhodecode/model/forms.py rhodecode/model/repo.py rhodecode/model/validators.py rhodecode/templates/settings/repo_settings.html rhodecode/tests/models/test_repos_groups.py |
diffstat | 7 files changed, 148 insertions(+), 86 deletions(-) [+] |
line wrap: on
line diff
--- 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')
--- 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') \
--- 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
--- 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:
--- 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):
--- 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 @@ <label for="landing_rev">${_('Landing revision')}:</label> </div> <div class="input"> - ${h.select('landing_rev','',c.landing_revs,class_="medium")} + ${h.select('repo_landing_rev','',c.landing_revs,class_="medium")} <span class="help-block">${_('Default revision for files page, downloads, whoosh and readme')}</span> </div> </div> <div class="field"> <div class="label label-textarea"> - <label for="description">${_('Description')}:</label> + <label for="repo_description">${_('Description')}:</label> </div> <div class="textarea text-area editor"> - ${h.textarea('description')} + ${h.textarea('repo_description')} <span class="help-block">${_('Keep it short and to the point. Use a README file for longer descriptions.')}</span> </div> </div> <div class="field"> <div class="label label-checkbox"> - <label for="private">${_('Private repository')}:</label> + <label for="repo_private">${_('Private repository')}:</label> </div> <div class="checkboxes"> - ${h.checkbox('private',value="True")} + ${h.checkbox('repo_private',value="True")} <span class="help-block">${_('Private repositories are only visible to people explicitly added as collaborators.')}</span> </div> </div> @@ -89,29 +89,7 @@ <%include file="../admin/repos/repo_edit_perms.html"/> </div> </div> - - <div class="field"> - <div class="label"> - <label for="">${_('Remove repo')}:</label> - </div> - <div class="checkboxes"> - ${h.form(url('repo_settings_delete', repo_name=c.repo_info.repo_name),method='delete')} - <div class=""> - <div class="fields"> - ${h.submit('remove_%s' % c.repo_info.repo_name,_('Remove this repository'),class_="ui-btn red",onclick="return confirm('"+_('Confirm to delete this repository')+"');")} - </div> - <div class="field" style="border:none;color:#888"> - <ul> - <li>${_('''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''')} - </li> - </ul> - </div> - </div> - ${h.end_form()} - </div> - </div> - + <div class="buttons"> ${h.submit('save',_('Save'),class_="ui-btn large")} ${h.reset('reset',_('Reset'),class_="ui-btn large")} @@ -120,5 +98,35 @@ </div> ${h.end_form()} </div> + +<h3>${_('Delete repository')}</h3> +<div class="form"> + <!-- fields --> + <div class="fields"> + + <div class="field"> + <div class="label"> + <label for="">${_('Remove repo')}:</label> + </div> + <div class="checkboxes"> + ${h.form(url('repo_settings_delete', repo_name=c.repo_info.repo_name),method='delete')} + <div class=""> + <div class="fields"> + ${h.submit('remove_%s' % c.repo_info.repo_name,_('Remove this repository'),class_="ui-btn red",onclick="return confirm('"+_('Confirm to delete this repository')+"');")} + </div> + <div class="field" style="border:none;color:#888"> + <ul> + <li>${_('''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''')} + </li> + </ul> + </div> + </div> + ${h.end_form()} + </div> + </div> + </div> +</div> + </div> </%def>
--- 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)