changeset 1347:43b8e161be3f beta

#47 implemented basic edition of groups
author Marcin Kuzminski <marcin@python-works.com>
date Wed, 25 May 2011 10:27:29 +0200
parents cf78d302d441
children dccba44ee176
files rhodecode/controllers/admin/repos_groups.py rhodecode/model/forms.py rhodecode/model/repos_group.py rhodecode/templates/admin/repos_groups/repos_groups_add.html rhodecode/templates/admin/repos_groups/repos_groups_edit.html
diffstat 5 files changed, 185 insertions(+), 43 deletions(-) [+]
line wrap: on
line diff
--- a/rhodecode/controllers/admin/repos_groups.py	Mon May 23 02:46:43 2011 +0200
+++ b/rhodecode/controllers/admin/repos_groups.py	Wed May 25 10:27:29 2011 +0200
@@ -26,6 +26,10 @@
     # 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 = [('', '')]
@@ -42,9 +46,19 @@
                                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__()
+    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'):
@@ -67,7 +81,7 @@
             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:
 
@@ -80,7 +94,7 @@
         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'))
 
@@ -102,6 +116,36 @@
         #           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 creation 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"""
@@ -179,3 +223,14 @@
     def edit(self, id, format='html'):
         """GET /repos_groups/id/edit: Form to edit an existing item"""
         # url('edit_repos_group', id=ID)
+        c.repos_group = Group.get(id)
+        defaults = self.__load_data(id)
+
+        return htmlfill.render(
+            render('admin/repos_groups/repos_groups_edit.html'),
+            defaults=defaults,
+            encoding="UTF-8",
+            force_defaults=False
+        )
+
+
--- a/rhodecode/model/forms.py	Mon May 23 02:46:43 2011 +0200
+++ b/rhodecode/model/forms.py	Wed May 25 10:27:29 2011 +0200
@@ -117,25 +117,31 @@
 
 
 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:
+                # check filesystem
+                gr = Group.query().filter(Group.group_name == slug)\
+                    .filter(Group.group_parent_id == group_parent_id).scalar()
+
+                if gr:
+                    e_dict = {'group_name':_('This group already exists')}
+                    raise formencode.Invalid('', value, state,
+                                             error_dict=e_dict)
+
     return _ValidReposGroup
 
 class ValidPassword(formencode.validators.FancyValidator):
@@ -502,11 +508,11 @@
         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)
 
--- a/rhodecode/model/repos_group.py	Mon May 23 02:46:43 2011 +0200
+++ b/rhodecode/model/repos_group.py	Wed May 25 10:27:29 2011 +0200
@@ -26,6 +26,7 @@
 import os
 import logging
 import traceback
+import shutil
 
 from pylons.i18n.translation import _
 
@@ -73,13 +74,21 @@
         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):
         """
@@ -96,15 +105,15 @@
     def create(self, form_data):
         try:
             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:
@@ -116,10 +125,18 @@
 
         try:
             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 = \
+                form_data['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'])
+
             self.sa.commit()
         except:
             log.error(traceback.format_exc())
--- a/rhodecode/templates/admin/repos_groups/repos_groups_add.html	Mon May 23 02:46:43 2011 +0200
+++ b/rhodecode/templates/admin/repos_groups/repos_groups_add.html	Wed May 25 10:27:29 2011 +0200
@@ -32,27 +32,27 @@
                     <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>
              </div>
              
-	        <div class="field">
-	            <div class="label label-textarea">
-	                <label for="description">${_('Description')}:</label>
-	            </div>
-	            <div class="textarea text-area editor">
-	                ${h.textarea('repos_group_description',cols=23,rows=5,class_="medium")}
-	            </div>
-	         </div>
+            <div class="field">
+                <div class="label label-textarea">
+                    <label for="description">${_('Description')}:</label>
+                </div>
+                <div class="textarea text-area editor">
+                    ${h.textarea('group_description',cols=23,rows=5,class_="medium")}
+                </div>
+             </div>
              
-	         <div class="field">
-	             <div class="label">
-	                 <label for="repo_group">${_('Group parent')}:</label>
-	             </div>
-	             <div class="input">
-	                 ${h.select('repos_group_parent','',c.repo_groups,class_="medium")}
-	             </div>
-	         </div>             
+             <div class="field">
+                 <div class="label">
+                     <label for="repo_group">${_('Group parent')}:</label>
+                 </div>
+                 <div class="input">
+                     ${h.select('group_parent_id','',c.repo_groups,class_="medium")}
+                 </div>
+             </div>            
                          
             <div class="buttons">
               ${h.submit('save','save',class_="ui-button")}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rhodecode/templates/admin/repos_groups/repos_groups_edit.html	Wed May 25 10:27:29 2011 +0200
@@ -0,0 +1,64 @@
+## -*- 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'))} 
+    &raquo; 
+    ${h.link_to(_('Repos groups'),h.url('repos_groups'))} 
+    &raquo;
+    ${_('edit repos group')} "${c.repos_group.group_name}"
+</%def>
+
+<%def name="page_nav()">
+    ${self.menu('admin')}
+</%def>
+
+<%def name="main()">
+<div class="box">
+    <!-- box / title -->
+    <div class="title">
+        ${self.breadcrumbs()}       
+    </div>
+    <!-- end box / title -->
+    ${h.form(url('repos_group',id=c.repos_group.group_id),method='put')}
+    <div class="form">
+        <!-- fields -->
+        <div class="fields">
+             <div class="field">
+                <div class="label">
+                    <label for="users_group_name">${_('Group name')}:</label>
+                </div>
+                <div class="input">
+                    ${h.text('group_name',class_='medium')}
+                </div>
+             </div>
+             
+	        <div class="field">
+	            <div class="label label-textarea">
+	                <label for="description">${_('Description')}:</label>
+	            </div>
+	            <div class="textarea text-area editor">
+	                ${h.textarea('group_description',cols=23,rows=5,class_="medium")}
+	            </div>
+	         </div>
+             
+	         <div class="field">
+	             <div class="label">
+	                 <label for="repo_group">${_('Group parent')}:</label>
+	             </div>
+	             <div class="input">
+	                 ${h.select('group_parent_id','',c.repo_groups,class_="medium")}
+	             </div>
+	         </div>             
+                         
+            <div class="buttons">
+              ${h.submit('save','save',class_="ui-button")}
+            </div>             
+        </div>
+    </div>
+    ${h.end_form()}
+</div>    
+</%def>    
\ No newline at end of file