diff --git a/rhodecode/controllers/admin/repos.py b/rhodecode/controllers/admin/repos.py --- a/rhodecode/controllers/admin/repos.py +++ b/rhodecode/controllers/admin/repos.py @@ -63,19 +63,36 @@ class ReposController(BaseController): c.admin_username = session.get('admin_username') super(ReposController, self).__before__() - + def __load_defaults(self): + repo_model = RepoModel() - def __load_data(self, repo_name): + 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_choices = map(lambda k: unicode(k[0]), c.repo_groups) + c.users_array = repo_model.get_users_js() + c.users_groups_array = repo_model.get_users_groups_js() + + def __load_data(self, repo_name=None): """ Load defaults settings for edit, and update :param repo_name: """ + self.__load_defaults() + repo, dbrepo = ScmModel().get(repo_name, retval='repo') repo_model = RepoModel() c.repo_info = repo_model.get_by_repo_name(repo_name) + if c.repo_info is None: h.flash(_('%s repository is not mapped to db perhaps' ' it was created or renamed from the filesystem' @@ -86,10 +103,6 @@ class ReposController(BaseController): return redirect(url('repos')) - - c.repo_groups = [('', '')] - c.repo_groups.extend([(x.group_id, x.group_name) for x in self.sa.query(Group).all()]) - c.default_user_id = User.by_username('default').user_id c.in_public_journal = self.sa.query(UserFollowing)\ .filter(UserFollowing.user_id == c.default_user_id)\ @@ -109,13 +122,13 @@ class ReposController(BaseController): c.stats_percentage = '%.2f' % ((float((last_rev)) / c.repo_last_rev) * 100) - c.users_array = repo_model.get_users_js() - c.users_groups_array = repo_model.get_users_groups_js() + defaults = c.repo_info.get_dict() group, repo_name = c.repo_info.groups_and_repo defaults['repo_name'] = repo_name - defaults['repo_group'] = getattr(group, 'group_id', None) + defaults['repo_group'] = getattr(group[-1], 'group_id', None) + #fill owner if c.repo_info.user: defaults.update({'user':c.repo_info.user.username}) @@ -153,11 +166,11 @@ class ReposController(BaseController): POST /repos: Create a new item""" # url('repos') repo_model = RepoModel() - c.repo_groups = [('', '')] - c.repo_groups.extend([(x.group_id, x.group_name) for x in self.sa.query(Group).all()]) + self.__load_defaults() form_result = {} try: - form_result = RepoForm()(repo_groups=c.repo_groups).to_python(dict(request.POST)) + form_result = RepoForm(repo_groups=c.repo_groups_choices)()\ + .to_python(dict(request.POST)) repo_model.create(form_result, self.rhodecode_user) if form_result['clone_uri']: h.flash(_('created repository %s from %s') \ @@ -177,8 +190,6 @@ class ReposController(BaseController): except formencode.Invalid, errors: c.new_repo = errors.value['repo_name'] - c.repo_groups = [('', '')] - c.repo_groups.extend([(x.group_id, x.group_name) for x in self.sa.query(Group).all()]) if request.POST.get('user_created'): r = render('admin/repos/repo_add_create_repository.html') @@ -206,8 +217,7 @@ class ReposController(BaseController): """GET /repos/new: Form to create a new item""" new_repo = request.GET.get('repo', '') c.new_repo = repo_name_slug(new_repo) - c.repo_groups = [('', '')] - c.repo_groups.extend([(x.group_id, x.group_name) for x in self.sa.query(Group).all()]) + self.__load_defaults() return render('admin/repos/repo_add.html') @HasPermissionAllDecorator('hg.admin') @@ -220,9 +230,11 @@ class ReposController(BaseController): # h.form(url('repo', repo_name=ID), # method='put') # url('repo', repo_name=ID) + self.__load_defaults() repo_model = RepoModel() changed_name = repo_name - _form = RepoForm(edit=True, old_data={'repo_name':repo_name})() + _form = RepoForm(edit=True, old_data={'repo_name':repo_name}, + repo_groups=c.repo_groups_choices)() try: form_result = _form.to_python(dict(request.POST)) repo_model.update(repo_name, form_result) diff --git a/rhodecode/lib/helpers.py b/rhodecode/lib/helpers.py --- a/rhodecode/lib/helpers.py +++ b/rhodecode/lib/helpers.py @@ -680,3 +680,18 @@ def changed_tooltip(nodes): return literal(pref + '
'.join([x.path.decode('utf-8', 'replace') for x in nodes[:30]]) + suf) else: return ': ' + _('No Files') + + + +def repo_link(groups_and_repos): + groups, repo_name = groups_and_repos + + if not groups: + return repo_name + else: + def make_link(group): + return link_to(group.group_name, url('/', group.group_id)) + return literal(' » '.join(map(make_link, groups)) + \ + " » " + repo_name) + + diff --git a/rhodecode/model/db.py b/rhodecode/model/db.py --- a/rhodecode/model/db.py +++ b/rhodecode/model/db.py @@ -255,6 +255,21 @@ class Group(Base): return "<%s('%s:%s')>" % (self.__class__.__name__, self.group_id, self.group_name) + @property + def parents(self): + groups = [] + if self.parent_group is None: + return groups + cur_gr = self.parent_group + groups.insert(0, cur_gr) + while 1: + gr = getattr(cur_gr, 'parent_group', None) + cur_gr = cur_gr.parent_group + if gr is None: + break + groups.insert(0, gr) + return groups + class Permission(Base): __tablename__ = 'permissions' __table_args__ = {'useexisting':True} diff --git a/rhodecode/model/forms.py b/rhodecode/model/forms.py --- a/rhodecode/model/forms.py +++ b/rhodecode/model/forms.py @@ -458,7 +458,7 @@ def RepoForm(edit=False, old_data={}, su repo_name = All(UnicodeString(strip=True, min=1, not_empty=True), ValidRepoName(edit, old_data)) clone_uri = UnicodeString(strip=True, min=1, not_empty=False) - repo_group = OneOf(repo_groups) + repo_group = OneOf(repo_groups, hideList=True) repo_type = OneOf(supported_backends) description = UnicodeString(strip=True, min=1, not_empty=True) private = StringBoolean(if_missing=False) diff --git a/rhodecode/templates/admin/repos/repo_edit.html b/rhodecode/templates/admin/repos/repo_edit.html --- a/rhodecode/templates/admin/repos/repo_edit.html +++ b/rhodecode/templates/admin/repos/repo_edit.html @@ -10,7 +10,7 @@ » ${h.link_to(_('Repositories'),h.url('repos'))} » - ${_('edit')} » ${h.link_to(c.repo_name,h.url('summary_home',repo_name=c.repo_name))} + ${_('edit')} » ${h.link_to(c.repo_info.just_name,h.url('summary_home',repo_name=c.repo_name))} <%def name="page_nav()"> @@ -40,7 +40,7 @@
- ${h.text('clone_uri',class_="small")} + ${h.text('clone_uri',class_="medium")}