@@ -23,12 +23,16 @@ log = logging.getLogger(__name__)
class ReposGroupsController(BaseController):
"""REST Controller styled on the Atom Publishing Protocol"""
# To properly map this controller, ensure your config/routing.py
# 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 = [('', '')]
parents_link = lambda k: h.literal('»'.join(
map(lambda k: k.group_name,
k.parents + [k])
@@ -39,15 +43,25 @@ class ReposGroupsController(BaseControll
x in self.sa.query(Group).all()])
c.repo_groups = sorted(c.repo_groups,
key=lambda t: t[1].split('»')[0])
c.repo_groups_choices = map(lambda k: unicode(k[0]), c.repo_groups)
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'):
"""GET /repos_groups: All items in the collection"""
# url('repos_groups')
@@ -64,26 +78,26 @@ class ReposGroupsController(BaseControll
repos_group_form = ReposGroupForm(available_groups=
c.repo_groups_choices)()
try:
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:
return htmlfill.render(
render('admin/repos_groups/repos_groups_add.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('repos_group_name'), category='error')
% request.POST.get('group_name'), category='error')
return redirect(url('repos_groups'))
def new(self, format='html'):
@@ -99,12 +113,42 @@ class ReposGroupsController(BaseControll
# <input type="hidden" name="_method" value="PUT" />
# Or using helpers:
# h.form(url('repos_group', id=ID),
# method='put')
# url('repos_group', id=ID)
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=
repos_group_model.update(id, form_result)
h.flash(_('updated repos group %s') \
render('admin/repos_groups/repos_groups_edit.html'),
def delete(self, id):
"""DELETE /repos_groups/id: Delete an existing item"""
# Forms posted to this method should contain a hidden field:
# <input type="hidden" name="_method" value="DELETE" />
@@ -176,6 +220,17 @@ class ReposGroupsController(BaseControll
return render('admin/repos_groups/repos_groups.html')
def edit(self, id, format='html'):
"""GET /repos_groups/id/edit: Form to edit an existing item"""
# url('edit_repos_group', id=ID)
defaults = self.__load_data(id)
defaults=defaults,
encoding="UTF-8",
force_defaults=False
)
@@ -114,31 +114,37 @@ def ValidUsersGroup(edit, old_data):
'character'), value, state)
return _ValidUsersGroup
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:
.filter(Group.group_parent_id == group_parent_id).scalar()
e_dict = {'group_name':_('This group already exists')}
return _ValidReposGroup
class ValidPassword(formencode.validators.FancyValidator):
def to_python(self, value, state):
@@ -499,17 +505,17 @@ def UsersGroupForm(edit=False, old_data=
def ReposGroupForm(edit=False, old_data={}, available_groups=[]):
class _ReposGroupForm(formencode.Schema):
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)
chained_validators = [ValidReposGroup(edit, old_data)]
return _ReposGroupForm
@@ -23,12 +23,13 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import os
import logging
import traceback
import shutil
from pylons.i18n.translation import _
from vcs.utils.lazy import LazyProperty
from rhodecode.model import BaseModel
@@ -70,19 +71,27 @@ class ReposGroupModel(BaseModel):
raise Exception('That directory already exists !')
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):
Deletes a group from a filesystem
:param group: instance of group from database
@@ -93,36 +102,44 @@ class ReposGroupModel(BaseModel):
rm_path = os.path.join(self.repos_path, paths)
os.rmdir(rm_path)
def create(self, form_data):
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:
self.sa.rollback()
raise
def update(self, repos_group_id, form_data):
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 = \
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'])
@@ -29,33 +29,33 @@
<div class="fields">
<div class="field">
<div class="label">
<label for="users_group_name">${_('Group name')}:</label>
</div>
<div class="input">
${h.text('repos_group_name',class_='medium')}
${h.text('group_name',class_='medium')}
<div class="label label-textarea">
<label for="description">${_('Description')}:</label>
<div class="textarea text-area editor">
${h.textarea('repos_group_description',cols=23,rows=5,class_="medium")}
${h.textarea('group_description',cols=23,rows=5,class_="medium")}
<label for="repo_group">${_('Group parent')}:</label>
${h.select('repos_group_parent','',c.repo_groups,class_="medium")}
${h.select('group_parent_id','',c.repo_groups,class_="medium")}
<div class="buttons">
${h.submit('save','save',class_="ui-button")}
new file 100644
## -*- coding: utf-8 -*-
<%inherit file="/base/base.html"/>
<%def name="title()">
${_('Edit repos group')} ${c.repos_group.group_name} - ${c.rhodecode_name}
</%def>
<%def name="breadcrumbs_links()">
${h.link_to(_('Admin'),h.url('admin_home'))}
»
${h.link_to(_('Repos groups'),h.url('repos_groups'))}
${_('edit repos group')} "${c.repos_group.group_name}"
<%def name="page_nav()">
${self.menu('admin')}
<%def name="main()">
<div class="box">
<!-- box / title -->
<div class="title">
${self.breadcrumbs()}
<!-- end box / title -->
${h.form(url('repos_group',id=c.repos_group.group_id),method='put')}
<div class="form">
<!-- fields -->
${h.end_form()}
\ No newline at end of file
Status change: