repos_groups.py
242 lines
| 8.6 KiB
| text/x-python
|
PythonLexer
r1171 | import logging | |||
r1345 | import traceback | |||
import formencode | ||||
from formencode import htmlfill | ||||
r1193 | from operator import itemgetter | |||
r1171 | ||||
from pylons import request, response, session, tmpl_context as c, url | ||||
from pylons.controllers.util import abort, redirect | ||||
r1345 | from pylons.i18n.translation import _ | |||
r1171 | ||||
r1345 | from rhodecode.lib import helpers as h | |||
from rhodecode.lib.auth import LoginRequired, HasPermissionAllDecorator, \ | ||||
HasPermissionAnyDecorator | ||||
r1171 | from rhodecode.lib.base import BaseController, render | |||
r1193 | from rhodecode.model.db import Group | |||
r1345 | from rhodecode.model.repos_group import ReposGroupModel | |||
from rhodecode.model.forms import ReposGroupForm | ||||
r1171 | ||||
log = logging.getLogger(__name__) | ||||
r1245 | ||||
r1171 | 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') | ||||
r1347 | @LoginRequired() | |||
def __before__(self): | ||||
super(ReposGroupsController, self).__before__() | ||||
r1345 | def __load_defaults(self): | |||
c.repo_groups = [('', '')] | ||||
parents_link = lambda k: h.literal('»'.join( | ||||
map(lambda k: k.group_name, | ||||
k.parents + [k]) | ||||
) | ||||
) | ||||
c.repo_groups.extend([(x.group_id, parents_link(x)) for \ | ||||
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) | ||||
r1347 | 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) | ||||
r1349 | data = repo_group.get_dict() | |||
r1347 | ||||
r1349 | return data | |||
r1345 | ||||
@HasPermissionAnyDecorator('hg.admin') | ||||
r1171 | def index(self, format='html'): | |||
"""GET /repos_groups: All items in the collection""" | ||||
# url('repos_groups') | ||||
r1345 | sk = lambda g:g.parents[0].group_name if g.parents else g.group_name | |||
c.groups = sorted(Group.query().all(), key=sk) | ||||
return render('admin/repos_groups/repos_groups_show.html') | ||||
@HasPermissionAnyDecorator('hg.admin') | ||||
r1171 | def create(self): | |||
"""POST /repos_groups: Create a new item""" | ||||
# url('repos_groups') | ||||
r1345 | self.__load_defaults() | |||
repos_group_model = ReposGroupModel() | ||||
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') \ | ||||
r1347 | % form_result['group_name'], category='success') | |||
r1345 | #TODO: in futureaction_logger(, '', '', '', self.sa) | |||
except formencode.Invalid, errors: | ||||
r1171 | ||||
r1345 | 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') \ | ||||
r1347 | % request.POST.get('group_name'), category='error') | |||
r1345 | ||||
return redirect(url('repos_groups')) | ||||
@HasPermissionAnyDecorator('hg.admin') | ||||
r1171 | def new(self, format='html'): | |||
"""GET /repos_groups/new: Form to create a new item""" | ||||
# url('new_repos_group') | ||||
r1345 | self.__load_defaults() | |||
return render('admin/repos_groups/repos_groups_add.html') | ||||
r1171 | ||||
r1345 | @HasPermissionAnyDecorator('hg.admin') | |||
r1171 | def update(self, id): | |||
"""PUT /repos_groups/id: Update an existing item""" | ||||
# Forms posted to this method should contain a hidden field: | ||||
# <input type="hidden" name="_method" value="PUT" /> | ||||
# Or using helpers: | ||||
# h.form(url('repos_group', id=ID), | ||||
# method='put') | ||||
# url('repos_group', id=ID) | ||||
r1347 | 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()) | ||||
r1349 | h.flash(_('error occurred during update of repos group %s') \ | |||
r1347 | % request.POST.get('group_name'), category='error') | |||
return redirect(url('repos_groups')) | ||||
r1345 | @HasPermissionAnyDecorator('hg.admin') | |||
r1171 | 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" /> | ||||
# Or using helpers: | ||||
# h.form(url('repos_group', id=ID), | ||||
# method='delete') | ||||
# url('repos_group', id=ID) | ||||
r1346 | repos_group_model = ReposGroupModel() | |||
gr = Group.get(id) | ||||
repos = gr.repositories.all() | ||||
if repos: | ||||
h.flash(_('This group contains %s repositores and cannot be ' | ||||
'deleted' % len(repos)), | ||||
category='error') | ||||
return redirect(url('repos_groups')) | ||||
try: | ||||
repos_group_model.delete(id) | ||||
h.flash(_('removed repos group %s' % gr.group_name), category='success') | ||||
#TODO: in futureaction_logger(, '', '', '', self.sa) | ||||
except Exception: | ||||
log.error(traceback.format_exc()) | ||||
h.flash(_('error occurred during deletion of repos group %s' % gr.group_name), | ||||
category='error') | ||||
return redirect(url('repos_groups')) | ||||
r1171 | def show(self, id, format='html'): | |||
"""GET /repos_groups/id: Show a specific item""" | ||||
# url('repos_group', id=ID) | ||||
r1193 | c.group = Group.get(id) | |||
if c.group: | ||||
r1343 | c.group_repos = c.group.repositories.all() | |||
r1193 | else: | |||
return redirect(url('repos_group')) | ||||
sortables = ['name', 'description', 'last_change', 'tip', 'owner'] | ||||
current_sort = request.GET.get('sort', 'name') | ||||
current_sort_slug = current_sort.replace('-', '') | ||||
if current_sort_slug not in sortables: | ||||
c.sort_by = 'name' | ||||
current_sort_slug = c.sort_by | ||||
else: | ||||
c.sort_by = current_sort | ||||
c.sort_slug = current_sort_slug | ||||
sort_key = current_sort_slug + '_sort' | ||||
#overwrite our cached list with current filter | ||||
gr_filter = [r.repo_name for r in c.group_repos] | ||||
c.cached_repo_list = self.scm_model.get_repos(all_repos=gr_filter) | ||||
if c.sort_by.startswith('-'): | ||||
c.repos_list = sorted(c.cached_repo_list, key=itemgetter(sort_key), | ||||
reverse=True) | ||||
else: | ||||
c.repos_list = sorted(c.cached_repo_list, key=itemgetter(sort_key), | ||||
reverse=False) | ||||
c.repo_cnt = len(c.repos_list) | ||||
r1343 | ||||
c.groups = self.sa.query(Group).order_by(Group.group_name)\ | ||||
.filter(Group.group_parent_id == id).all() | ||||
r1193 | return render('admin/repos_groups/repos_groups.html') | |||
r1345 | @HasPermissionAnyDecorator('hg.admin') | |||
r1171 | def edit(self, id, format='html'): | |||
"""GET /repos_groups/id/edit: Form to edit an existing item""" | ||||
# url('edit_repos_group', id=ID) | ||||
r1349 | ||||
id = int(id) | ||||
r1347 | c.repos_group = Group.get(id) | |||
defaults = self.__load_data(id) | ||||
r1349 | # we need to exclude this group from the group list for editing | |||
c.repo_groups = filter(lambda x:x[0] != id, c.repo_groups) | ||||
r1347 | return htmlfill.render( | |||
render('admin/repos_groups/repos_groups_edit.html'), | ||||
defaults=defaults, | ||||
encoding="UTF-8", | ||||
force_defaults=False | ||||
) | ||||