Files @ a05d16fc1d87
Branch filter:

Location: kallithea/rhodecode/controllers/admin/repos_groups.py - annotation

Marcin Kuzminski
Added tag v1.2.1 for changeset 0b8fba8ab90b
2ab211e0aecd
3bce31f026b8
3bce31f026b8
3bce31f026b8
3bce31f026b8
523382549c45
2ab211e0aecd
2ab211e0aecd
2ab211e0aecd
3bce31f026b8
2ab211e0aecd
3bce31f026b8
3bce31f026b8
3bce31f026b8
2ab211e0aecd
523382549c45
3bce31f026b8
3bce31f026b8
2ab211e0aecd
2ab211e0aecd
2ab211e0aecd
5f2fbab7c429
2ab211e0aecd
2ab211e0aecd
2ab211e0aecd
2ab211e0aecd
2ab211e0aecd
2ab211e0aecd
43b8e161be3f
43b8e161be3f
43b8e161be3f
43b8e161be3f
3bce31f026b8
3bce31f026b8
3bce31f026b8
3bce31f026b8
3bce31f026b8
3bce31f026b8
3bce31f026b8
3bce31f026b8
3bce31f026b8
3bce31f026b8
3bce31f026b8
3bce31f026b8
3bce31f026b8
3bce31f026b8
3bce31f026b8
3bce31f026b8
43b8e161be3f
43b8e161be3f
43b8e161be3f
43b8e161be3f
43b8e161be3f
43b8e161be3f
43b8e161be3f
43b8e161be3f
43b8e161be3f
43b8e161be3f
526120c77a38
43b8e161be3f
526120c77a38
3bce31f026b8
3bce31f026b8
2ab211e0aecd
2ab211e0aecd
2ab211e0aecd
2ab211e0aecd
3bce31f026b8
3bce31f026b8
3bce31f026b8
3bce31f026b8
3bce31f026b8
2ab211e0aecd
2ab211e0aecd
2ab211e0aecd
3bce31f026b8
3bce31f026b8
3bce31f026b8
3bce31f026b8
3bce31f026b8
3bce31f026b8
3bce31f026b8
3bce31f026b8
43b8e161be3f
3bce31f026b8
3bce31f026b8
2ab211e0aecd
3bce31f026b8
3bce31f026b8
3bce31f026b8
3bce31f026b8
3bce31f026b8
3bce31f026b8
3bce31f026b8
3bce31f026b8
3bce31f026b8
43b8e161be3f
3bce31f026b8
3bce31f026b8
3bce31f026b8
3bce31f026b8
3bce31f026b8
2ab211e0aecd
2ab211e0aecd
2ab211e0aecd
3bce31f026b8
3bce31f026b8
2ab211e0aecd
3bce31f026b8
2ab211e0aecd
2ab211e0aecd
2ab211e0aecd
2ab211e0aecd
2ab211e0aecd
2ab211e0aecd
2ab211e0aecd
2ab211e0aecd
2ab211e0aecd
43b8e161be3f
43b8e161be3f
43b8e161be3f
43b8e161be3f
43b8e161be3f
43b8e161be3f
43b8e161be3f
43b8e161be3f
43b8e161be3f
43b8e161be3f
43b8e161be3f
43b8e161be3f
43b8e161be3f
43b8e161be3f
43b8e161be3f
43b8e161be3f
43b8e161be3f
43b8e161be3f
43b8e161be3f
43b8e161be3f
43b8e161be3f
43b8e161be3f
43b8e161be3f
43b8e161be3f
526120c77a38
43b8e161be3f
43b8e161be3f
43b8e161be3f
43b8e161be3f
43b8e161be3f
3bce31f026b8
2ab211e0aecd
2ab211e0aecd
2ab211e0aecd
2ab211e0aecd
2ab211e0aecd
2ab211e0aecd
2ab211e0aecd
2ab211e0aecd
2ab211e0aecd
cf78d302d441
cf78d302d441
cf78d302d441
cf78d302d441
cf78d302d441
cf78d302d441
cf78d302d441
cf78d302d441
cf78d302d441
cf78d302d441
cf78d302d441
cf78d302d441
a39c0e5fca89
cf78d302d441
cf78d302d441
cf78d302d441
cf78d302d441
cf78d302d441
cf78d302d441
cf78d302d441
2ab211e0aecd
2ab211e0aecd
2ab211e0aecd
2ab211e0aecd
a39c0e5fca89
9c0f5d558789
523382549c45
a04fe5986109
523382549c45
416dacac46bf
523382549c45
523382549c45
9c0f5d558789
523382549c45
523382549c45
9c0f5d558789
523382549c45
9c0f5d558789
a04fe5986109
a04fe5986109
a04fe5986109
a04fe5986109
523382549c45
523382549c45
3bce31f026b8
2ab211e0aecd
2ab211e0aecd
2ab211e0aecd
526120c77a38
a39c0e5fca89
526120c77a38
a39c0e5fca89
a39c0e5fca89
43b8e161be3f
526120c77a38
a39c0e5fca89
526120c77a38
43b8e161be3f
43b8e161be3f
43b8e161be3f
43b8e161be3f
43b8e161be3f
43b8e161be3f
43b8e161be3f
43b8e161be3f
import logging
import traceback
import formencode

from formencode import htmlfill
from operator import itemgetter

from pylons import request, response, session, tmpl_context as c, url
from pylons.controllers.util import abort, redirect
from pylons.i18n.translation import _

from rhodecode.lib import helpers as h
from rhodecode.lib.auth import LoginRequired, HasPermissionAllDecorator, \
    HasPermissionAnyDecorator
from rhodecode.lib.base import BaseController, render
from rhodecode.model.db import Group
from rhodecode.model.repos_group import ReposGroupModel
from rhodecode.model.forms import ReposGroupForm

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])
                                    )
                                )

        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)

    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)

        data = repo_group.get_dict()

        return data

    @HasPermissionAnyDecorator('hg.admin')
    def index(self, format='html'):
        """GET /repos_groups: All items in the collection"""
        # url('repos_groups')

        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')
    def create(self):
        """POST /repos_groups: Create a new item"""
        # url('repos_groups')
        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') \
                    % 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('group_name'), category='error')

        return redirect(url('repos_groups'))


    @HasPermissionAnyDecorator('hg.admin')
    def new(self, format='html'):
        """GET /repos_groups/new: Form to create a new item"""
        # url('new_repos_group')
        self.__load_defaults()
        return render('admin/repos_groups/repos_groups_add.html')

    @HasPermissionAnyDecorator('hg.admin')
    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)

        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 update 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"""
        # 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)

        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 future action_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'))

    def show(self, id, format='html'):
        """GET /repos_groups/id: Show a specific item"""
        # url('repos_group', id=ID)

        c.group = Group.get(id)

        if c.group:
            c.group_repos = c.group.repositories.all()
        else:
            return redirect(url('home'))

        #overwrite our cached list with current filter
        gr_filter = c.group_repos
        c.cached_repo_list = self.scm_model.get_repos(all_repos=gr_filter)

        c.repos_list = c.cached_repo_list

        c.repo_cnt = 0

        c.groups = self.sa.query(Group).order_by(Group.group_name)\
            .filter(Group.group_parent_id == id).all()

        return render('admin/repos_groups/repos_groups.html')

    @HasPermissionAnyDecorator('hg.admin')
    def edit(self, id, format='html'):
        """GET /repos_groups/id/edit: Form to edit an existing item"""
        # url('edit_repos_group', id=ID)

        id_ = int(id)

        c.repos_group = Group.get(id_)
        defaults = self.__load_data(id_)

        # we need to exclude this group from the group list for editing
        c.repo_groups = filter(lambda x:x[0] != id_, c.repo_groups)

        return htmlfill.render(
            render('admin/repos_groups/repos_groups_edit.html'),
            defaults=defaults,
            encoding="UTF-8",
            force_defaults=False
        )