diff --git a/rhodecode/controllers/admin/repos_groups.py b/rhodecode/controllers/admin/repos_groups.py --- a/rhodecode/controllers/admin/repos_groups.py +++ b/rhodecode/controllers/admin/repos_groups.py @@ -26,6 +26,10 @@ class ReposGroupsController(BaseControll # file has a resource setup: # map.resource('repos_group', 'repos_groups') + @LoginRequired() + def __before__(self): + super(ReposGroupsController, self).__before__() + def __load_defaults(self): c.repo_groups = [('', '')] @@ -42,9 +46,19 @@ class ReposGroupsController(BaseControll key=lambda t: t[1].split('»')[0]) c.repo_groups_choices = map(lambda k: unicode(k[0]), c.repo_groups) - @LoginRequired() - def __before__(self): - super(ReposGroupsController, self).__before__() + def __load_data(self, group_id): + """ + Load defaults settings for edit, and update + + :param group_id: + """ + self.__load_defaults() + + repo_group = Group.get(group_id) + + defaults = repo_group.get_dict() + + return defaults @HasPermissionAnyDecorator('hg.admin') def index(self, format='html'): @@ -67,7 +81,7 @@ class ReposGroupsController(BaseControll form_result = repos_group_form.to_python(dict(request.POST)) repos_group_model.create(form_result) h.flash(_('created repos group %s') \ - % form_result['repos_group_name'], category='success') + % form_result['group_name'], category='success') #TODO: in futureaction_logger(, '', '', '', self.sa) except formencode.Invalid, errors: @@ -80,7 +94,7 @@ class ReposGroupsController(BaseControll except Exception: log.error(traceback.format_exc()) h.flash(_('error occurred during creation of repos group %s') \ - % request.POST.get('repos_group_name'), category='error') + % request.POST.get('group_name'), category='error') return redirect(url('repos_groups')) @@ -102,6 +116,36 @@ class ReposGroupsController(BaseControll # method='put') # url('repos_group', id=ID) + self.__load_defaults() + c.repos_group = Group.get(id) + + repos_group_model = ReposGroupModel() + repos_group_form = ReposGroupForm(edit=True, + old_data=c.repos_group.get_dict(), + available_groups= + c.repo_groups_choices)() + try: + form_result = repos_group_form.to_python(dict(request.POST)) + repos_group_model.update(id, form_result) + h.flash(_('updated repos group %s') \ + % form_result['group_name'], category='success') + #TODO: in futureaction_logger(, '', '', '', self.sa) + except formencode.Invalid, errors: + + return htmlfill.render( + render('admin/repos_groups/repos_groups_edit.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 creation of repos group %s') \ + % request.POST.get('group_name'), category='error') + + return redirect(url('repos_groups')) + + @HasPermissionAnyDecorator('hg.admin') def delete(self, id): """DELETE /repos_groups/id: Delete an existing item""" @@ -179,3 +223,14 @@ class ReposGroupsController(BaseControll def edit(self, id, format='html'): """GET /repos_groups/id/edit: Form to edit an existing item""" # url('edit_repos_group', id=ID) + c.repos_group = Group.get(id) + defaults = self.__load_data(id) + + return htmlfill.render( + render('admin/repos_groups/repos_groups_edit.html'), + defaults=defaults, + encoding="UTF-8", + force_defaults=False + ) + + diff --git a/rhodecode/model/forms.py b/rhodecode/model/forms.py --- a/rhodecode/model/forms.py +++ b/rhodecode/model/forms.py @@ -117,25 +117,31 @@ def ValidUsersGroup(edit, old_data): def ValidReposGroup(edit, old_data): - class _ValidReposGroup(formencode.validators.FancyValidator): def validate_python(self, value, state): #TODO WRITE VALIDATIONS - group_name = value.get('repos_group_name') - parent_id = value.get('repos_group_parent') + group_name = value.get('group_name') + group_parent_id = value.get('group_parent_id') # slugify repo group just in case :) slug = repo_name_slug(group_name) - # check filesystem - gr = Group.query().filter(Group.group_name == slug)\ - .filter(Group.group_parent_id == parent_id).scalar() + old_gname = None + if edit: + old_gname = Group.get( + old_data.get('group_id')).group_name - if gr: - e_dict = {'repos_group_name':_('This group already exists')} - raise formencode.Invalid('', value, state, - error_dict=e_dict) + if old_gname != group_name or not edit: + # check filesystem + gr = Group.query().filter(Group.group_name == slug)\ + .filter(Group.group_parent_id == group_parent_id).scalar() + + if gr: + e_dict = {'group_name':_('This group already exists')} + raise formencode.Invalid('', value, state, + error_dict=e_dict) + return _ValidReposGroup class ValidPassword(formencode.validators.FancyValidator): @@ -502,11 +508,11 @@ def ReposGroupForm(edit=False, old_data= allow_extra_fields = True filter_extra_fields = True - repos_group_name = All(UnicodeString(strip=True, min=1, not_empty=True), + group_name = All(UnicodeString(strip=True, min=1, not_empty=True), SlugifyName()) - repos_group_description = UnicodeString(strip=True, min=1, + group_description = UnicodeString(strip=True, min=1, not_empty=True) - repos_group_parent = OneOf(available_groups, hideList=False, + group_parent_id = OneOf(available_groups, hideList=False, testValueList=True, if_missing=None, not_empty=False) diff --git a/rhodecode/model/repos_group.py b/rhodecode/model/repos_group.py --- a/rhodecode/model/repos_group.py +++ b/rhodecode/model/repos_group.py @@ -26,6 +26,7 @@ import os import logging import traceback +import shutil from pylons.i18n.translation import _ @@ -73,13 +74,21 @@ class ReposGroupModel(BaseModel): os.makedirs(create_path) - def __rename_group(self, group_name): + def __rename_group(self, old, new): """ Renames a group on filesystem :param group_name: """ - pass + log.info('renaming repos group from %s to %s', old, + old) + + old_path = os.path.join(self.repos_path, old) + new_path = os.path.join(self.repos_path, new) + if os.path.isdir(new_path): + raise Exception('Was trying to rename to already existing dir %s', + new_path) + shutil.move(old_path, new_path) def __delete_group(self, group): """ @@ -96,15 +105,15 @@ class ReposGroupModel(BaseModel): def create(self, form_data): try: new_repos_group = Group() - new_repos_group.group_name = form_data['repos_group_name'] + new_repos_group.group_name = form_data['group_name'] new_repos_group.group_description = \ - form_data['repos_group_description'] - new_repos_group.group_parent_id = form_data['repos_group_parent'] + form_data['group_description'] + new_repos_group.group_parent_id = form_data['group_parent_id'] self.sa.add(new_repos_group) - self.__create_group(form_data['repos_group_name'], - form_data['repos_group_parent']) + self.__create_group(form_data['group_name'], + form_data['group_parent_id']) self.sa.commit() except: @@ -116,10 +125,18 @@ class ReposGroupModel(BaseModel): try: repos_group = Group.get(repos_group_id) + old_name = repos_group.group_name - + repos_group.group_name = form_data['group_name'] + repos_group.group_description = \ + form_data['group_description'] + repos_group.group_parent_id = form_data['group_parent_id'] self.sa.add(repos_group) + + if old_name != form_data['group_name']: + self.__rename_group(old=old_name, new=form_data['group_name']) + self.sa.commit() except: log.error(traceback.format_exc()) diff --git a/rhodecode/templates/admin/repos_groups/repos_groups_add.html b/rhodecode/templates/admin/repos_groups/repos_groups_add.html --- a/rhodecode/templates/admin/repos_groups/repos_groups_add.html +++ b/rhodecode/templates/admin/repos_groups/repos_groups_add.html @@ -32,27 +32,27 @@