diff rhodecode/controllers/admin/repos_groups.py @ 1345:3bce31f026b8 beta

#47 implemented Adding of new repo_groups+forms+validators. Fixed sorting of repo groups by main names in multiple locations. Removed some unneeded calls to self.sa for exchange to .query() methods. Added new db unique key for Group
author Marcin Kuzminski <marcin@python-works.com>
date Mon, 23 May 2011 02:22:00 +0200
parents a04fe5986109
children cf78d302d441
line wrap: on
line diff
--- a/rhodecode/controllers/admin/repos_groups.py	Mon May 23 00:18:32 2011 +0200
+++ b/rhodecode/controllers/admin/repos_groups.py	Mon May 23 02:22:00 2011 +0200
@@ -1,11 +1,21 @@
 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__)
 
@@ -16,18 +26,73 @@
     # file has a resource setup:
     #     map.resource('repos_group', 'repos_groups')
 
+    def __load_defaults(self):
+
+        c.repo_groups = [('', '')]
+        parents_link = lambda k: h.literal('&raquo;'.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('&raquo;')[0])
+        c.repo_groups_choices = map(lambda k: unicode(k[0]), c.repo_groups)
+
+    @LoginRequired()
+    def __before__(self):
+        super(ReposGroupsController, self).__before__()
+
+    @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['repos_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')
+
+        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:
@@ -37,6 +102,7 @@
         #           method='put')
         # url('repos_group', id=ID)
 
+    @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:
@@ -88,6 +154,7 @@
 
         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)