changeset 3089:4cc9bb83ecb4 beta

Fixed some issues with edit form - unified code (but still a lot of duplicated code left over) - fixed forms - fixed validators
author Marcin Kuzminski <marcin@python-works.com>
date Thu, 13 Dec 2012 03:34:19 +0100
parents 304e4e3e2990
children 280ac97cb37f
files rhodecode/controllers/admin/repos.py rhodecode/controllers/settings.py rhodecode/model/forms.py rhodecode/model/repo.py rhodecode/model/validators.py rhodecode/templates/settings/repo_settings.html rhodecode/tests/models/test_repos_groups.py
diffstat 7 files changed, 148 insertions(+), 86 deletions(-) [+]
line wrap: on
line diff
--- a/rhodecode/controllers/admin/repos.py	Thu Dec 13 00:09:59 2012 +0100
+++ b/rhodecode/controllers/admin/repos.py	Thu Dec 13 03:34:19 2012 +0100
@@ -97,6 +97,7 @@
 
             return redirect(url('repos'))
 
+        ##override defaults for exact repo info here git/hg etc
         choices, c.landing_revs = ScmModel().get_repo_landing_revs(c.repo_info)
         c.landing_revs_choices = choices
 
@@ -239,7 +240,15 @@
         new_repo = request.GET.get('repo', '')
         c.new_repo = repo_name_slug(new_repo)
         self.__load_defaults()
-        return render('admin/repos/repo_add.html')
+        ## apply the defaults from defaults page
+        defaults = RhodeCodeSetting.get_default_repo_settings(strip_prefix=True)
+        return htmlfill.render(
+            render('admin/repos/repo_add.html'),
+            defaults=defaults,
+            errors={},
+            prefix_error=False,
+            encoding="UTF-8"
+        )
 
     @HasPermissionAllDecorator('hg.admin')
     def update(self, repo_name):
@@ -263,7 +272,7 @@
                          landing_revs=c.landing_revs_choices)()
         try:
             form_result = _form.to_python(dict(request.POST))
-            repo = repo_model.update(repo_name, form_result)
+            repo = repo_model.update(repo_name, **form_result)
             invalidate_cache('get_repo_cached_%s' % repo_name)
             h.flash(_('Repository %s updated successfully') % repo_name,
                     category='success')
--- a/rhodecode/controllers/settings.py	Thu Dec 13 00:09:59 2012 +0100
+++ b/rhodecode/controllers/settings.py	Thu Dec 13 03:34:19 2012 +0100
@@ -65,23 +65,38 @@
         choices, c.landing_revs = ScmModel().get_repo_landing_revs()
         c.landing_revs_choices = choices
 
-    @HasRepoPermissionAllDecorator('repository.admin')
-    def index(self, repo_name):
-        repo_model = RepoModel()
-        c.repo_info = repo = repo_model.get_by_repo_name(repo_name)
-        if not repo:
+    def __load_data(self, repo_name=None):
+        """
+        Load defaults settings for edit, and update
+
+        :param repo_name:
+        """
+        self.__load_defaults()
+
+        c.repo_info = db_repo = Repository.get_by_repo_name(repo_name)
+        repo = db_repo.scm_instance
+
+        if c.repo_info is None:
             h.flash(_('%s repository is not mapped to db perhaps'
-                      ' it was created or renamed from the file system'
+                      ' it was created or renamed from the filesystem'
                       ' please run the application again'
                       ' in order to rescan repositories') % repo_name,
                       category='error')
 
             return redirect(url('home'))
 
-        self.__load_defaults()
+        ##override defaults for exact repo info here git/hg etc
+        choices, c.landing_revs = ScmModel().get_repo_landing_revs(c.repo_info)
+        c.landing_revs_choices = choices
 
         defaults = RepoModel()._get_defaults(repo_name)
 
+        return defaults
+
+    @HasRepoPermissionAllDecorator('repository.admin')
+    def index(self, repo_name):
+        defaults = self.__load_data(repo_name)
+
         return htmlfill.render(
             render('settings/repo_settings.html'),
             defaults=defaults,
@@ -91,10 +106,12 @@
 
     @HasRepoPermissionAllDecorator('repository.admin')
     def update(self, repo_name):
+        self.__load_defaults()
         repo_model = RepoModel()
         changed_name = repo_name
-
-        self.__load_defaults()
+        #override the choices with extracted revisions !
+        choices, c.landing_revs = ScmModel().get_repo_landing_revs(repo_name)
+        c.landing_revs_choices = choices
 
         _form = RepoSettingsForm(edit=True,
                                  old_data={'repo_name': repo_name},
@@ -102,8 +119,7 @@
                                  landing_revs=c.landing_revs_choices)()
         try:
             form_result = _form.to_python(dict(request.POST))
-
-            repo_model.update(repo_name, form_result)
+            repo_model.update(repo_name, **form_result)
             invalidate_cache('get_repo_cached_%s' % repo_name)
             h.flash(_('Repository %s updated successfully') % repo_name,
                     category='success')
@@ -112,15 +128,15 @@
                           changed_name, self.ip_addr, self.sa)
             Session().commit()
         except formencode.Invalid, errors:
-            c.repo_info = repo_model.get_by_repo_name(repo_name)
-            c.users_array = repo_model.get_users_js()
-            errors.value.update({'user': c.repo_info.user.username})
+            defaults = self.__load_data(repo_name)
+            defaults.update(errors.value)
             return htmlfill.render(
                 render('settings/repo_settings.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 repository %s') \
--- a/rhodecode/model/forms.py	Thu Dec 13 00:09:59 2012 +0100
+++ b/rhodecode/model/forms.py	Thu Dec 13 03:34:19 2012 +0100
@@ -173,7 +173,7 @@
              repo_groups=[], landing_revs=[]):
     class _RepoForm(formencode.Schema):
         allow_extra_fields = True
-        filter_extra_fields = True
+        filter_extra_fields = False
         repo_name = All(v.UnicodeString(strip=True, min=1, not_empty=True),
                         v.SlugifyName())
         repo_group = All(v.CanWriteGroup(),
@@ -181,11 +181,12 @@
         repo_type = v.OneOf(supported_backends)
         repo_description = v.UnicodeString(strip=True, min=1, not_empty=False)
         repo_private = v.StringBoolean(if_missing=False)
+        repo_landing_rev = v.OneOf(landing_revs, hideList=True)
+        clone_uri = All(v.UnicodeString(strip=True, min=1, not_empty=False))
+
         repo_enable_statistics = v.StringBoolean(if_missing=False)
         repo_enable_downloads = v.StringBoolean(if_missing=False)
         repo_enable_locking = v.StringBoolean(if_missing=False)
-        repo_landing_rev = v.OneOf(landing_revs, hideList=True)
-        clone_uri = All(v.UnicodeString(strip=True, min=1, not_empty=False))
 
         if edit:
             #this is repo owner
@@ -197,6 +198,27 @@
     return _RepoForm
 
 
+def RepoSettingsForm(edit=False, old_data={}, supported_backends=BACKENDS.keys(),
+                     repo_groups=[], landing_revs=[]):
+    class _RepoForm(formencode.Schema):
+        allow_extra_fields = True
+        filter_extra_fields = False
+        repo_name = All(v.UnicodeString(strip=True, min=1, not_empty=True),
+                        v.SlugifyName())
+        repo_group = All(v.CanWriteGroup(),
+                         v.OneOf(repo_groups, hideList=True))
+        repo_description = v.UnicodeString(strip=True, min=1, not_empty=False)
+        repo_private = v.StringBoolean(if_missing=False)
+        repo_landing_rev = v.OneOf(landing_revs, hideList=True)
+        clone_uri = All(v.UnicodeString(strip=True, min=1, not_empty=False))
+
+        chained_validators = [v.ValidCloneUri(),
+                              v.ValidRepoName(edit, old_data),
+                              v.ValidPerms(),
+                              v.ValidSettings()]
+    return _RepoForm
+
+
 def RepoForkForm(edit=False, old_data={}, supported_backends=BACKENDS.keys(),
                  repo_groups=[], landing_revs=[]):
     class _RepoForkForm(formencode.Schema):
@@ -218,23 +240,6 @@
     return _RepoForkForm
 
 
-def RepoSettingsForm(edit=False, old_data={}, supported_backends=BACKENDS.keys(),
-                     repo_groups=[], landing_revs=[]):
-    class _RepoForm(formencode.Schema):
-        allow_extra_fields = True
-        filter_extra_fields = False
-        repo_name = All(v.UnicodeString(strip=True, min=1, not_empty=True),
-                        v.SlugifyName())
-        description = v.UnicodeString(strip=True, min=1, not_empty=True)
-        repo_group = All(v.CanWriteGroup(),
-                         v.OneOf(repo_groups, hideList=True))
-        private = v.StringBoolean(if_missing=False)
-        landing_rev = v.OneOf(landing_revs, hideList=True)
-        chained_validators = [v.ValidRepoName(edit, old_data), v.ValidPerms(),
-                              v.ValidSettings()]
-    return _RepoForm
-
-
 def ApplicationSettingsForm():
     class _ApplicationSettingsForm(formencode.Schema):
         allow_extra_fields = True
--- a/rhodecode/model/repo.py	Thu Dec 13 00:09:59 2012 +0100
+++ b/rhodecode/model/repo.py	Thu Dec 13 03:34:19 2012 +0100
@@ -31,7 +31,8 @@
 
 from rhodecode.lib.vcs.backends import get_backend
 from rhodecode.lib.compat import json
-from rhodecode.lib.utils2 import LazyProperty, safe_str, safe_unicode
+from rhodecode.lib.utils2 import LazyProperty, safe_str, safe_unicode,\
+    remove_prefix
 from rhodecode.lib.caching_query import FromCache
 from rhodecode.lib.hooks import log_create_repository, log_delete_repository
 
@@ -131,6 +132,16 @@
         defaults['repo_group'] = getattr(group[-1] if group else None,
                                          'group_id', None)
 
+        for strip, k in [(0, 'repo_type'), (1, 'repo_enable_downloads'),
+                  (1, 'repo_description'), (1, 'repo_enable_locking'),
+                  (1, 'repo_landing_rev'), (0, 'clone_uri'),
+                  (1, 'repo_private'), (1, 'repo_enable_statistics')]:
+            attr = k
+            if strip:
+                attr = remove_prefix(k, 'repo_')
+
+            defaults[k] = defaults[attr]
+
         # fill owner
         if repo_info.user:
             defaults.update({'user': repo_info.user.username})
@@ -151,12 +162,12 @@
 
         return defaults
 
-    def update(self, repo_name, form_data):
+    def update(self, org_repo_name, **kwargs):
         try:
-            cur_repo = self.get_by_repo_name(repo_name, cache=False)
+            cur_repo = self.get_by_repo_name(org_repo_name, cache=False)
 
             # update permissions
-            for member, perm, member_type in form_data['perms_updates']:
+            for member, perm, member_type in kwargs['perms_updates']:
                 if member_type == 'user':
                     # this updates existing one
                     RepoModel().grant_user_permission(
@@ -167,7 +178,7 @@
                         repo=cur_repo, group_name=member, perm=perm
                     )
             # set new permissions
-            for member, perm, member_type in form_data['perms_new']:
+            for member, perm, member_type in kwargs['perms_new']:
                 if member_type == 'user':
                     RepoModel().grant_user_permission(
                         repo=cur_repo, user=member, perm=perm
@@ -177,26 +188,30 @@
                         repo=cur_repo, group_name=member, perm=perm
                     )
 
-            # update current repo
-            for k, v in form_data.items():
-                if k == 'user':
-                    cur_repo.user = User.get_by_username(v)
-                elif k == 'repo_name':
-                    pass
-                elif k == 'repo_group':
-                    cur_repo.group = RepoGroup.get(v)
+            if 'user' in kwargs:
+                cur_repo.user = User.get_by_username(kwargs['user'])
+
+            if 'repo_group' in kwargs:
+                cur_repo.group = RepoGroup.get(kwargs['repo_group'])
 
-                else:
-                    setattr(cur_repo, k, v)
+            for strip, k in [(0, 'repo_type'), (1, 'repo_enable_downloads'),
+                      (1, 'repo_description'), (1, 'repo_enable_locking'),
+                      (1, 'repo_landing_rev'), (0, 'clone_uri'),
+                      (1, 'repo_private'), (1, 'repo_enable_statistics')]:
+                if k in kwargs:
+                    val = kwargs[k]
+                    if strip:
+                        k = remove_prefix(k, 'repo_')
+                    setattr(cur_repo, k, val)
 
-            new_name = cur_repo.get_new_name(form_data['repo_name'])
+            new_name = cur_repo.get_new_name(kwargs['repo_name'])
             cur_repo.repo_name = new_name
 
             self.sa.add(cur_repo)
 
-            if repo_name != new_name:
+            if org_repo_name != new_name:
                 # rename repository
-                self.__rename_repo(old=repo_name, new=new_name)
+                self.__rename_repo(old=org_repo_name, new=new_name)
 
             return cur_repo
         except:
--- a/rhodecode/model/validators.py	Thu Dec 13 00:09:59 2012 +0100
+++ b/rhodecode/model/validators.py	Thu Dec 13 03:34:19 2012 +0100
@@ -566,9 +566,18 @@
 def ValidSettings():
     class _validator(formencode.validators.FancyValidator):
         def _to_python(self, value, state):
-            # settings  form can't edit user
-            if 'user' in value:
-                del value['user']
+            # settings  form for users that are not admin 
+            # can't edit certain parameters, it's extra backup if they mangle
+            # with forms
+
+            forbidden_params = [
+                'user', 'repo_type', 'repo_enable_locking',
+                'repo_enable_downloads', 'repo_enable_statistics'
+            ]
+
+            for param in forbidden_params:
+                if param in value:
+                    del value[param]
             return value
 
         def validate_python(self, value, state):
--- a/rhodecode/templates/settings/repo_settings.html	Thu Dec 13 00:09:59 2012 +0100
+++ b/rhodecode/templates/settings/repo_settings.html	Thu Dec 13 03:34:19 2012 +0100
@@ -57,26 +57,26 @@
                     <label for="landing_rev">${_('Landing revision')}:</label>
                 </div>
                 <div class="input">
-                    ${h.select('landing_rev','',c.landing_revs,class_="medium")}
+                    ${h.select('repo_landing_rev','',c.landing_revs,class_="medium")}
                     <span class="help-block">${_('Default revision for files page, downloads, whoosh and readme')}</span>
                 </div>
             </div>
             <div class="field">
                 <div class="label label-textarea">
-                    <label for="description">${_('Description')}:</label>
+                    <label for="repo_description">${_('Description')}:</label>
                 </div>
                 <div class="textarea text-area editor">
-                    ${h.textarea('description')}
+                    ${h.textarea('repo_description')}
                     <span class="help-block">${_('Keep it short and to the point. Use a README file for longer descriptions.')}</span>
                 </div>
             </div>
 
             <div class="field">
                 <div class="label label-checkbox">
-                    <label for="private">${_('Private repository')}:</label>
+                    <label for="repo_private">${_('Private repository')}:</label>
                 </div>
                 <div class="checkboxes">
-                    ${h.checkbox('private',value="True")}
+                    ${h.checkbox('repo_private',value="True")}
                     <span class="help-block">${_('Private repositories are only visible to people explicitly added as collaborators.')}</span>
                 </div>
             </div>
@@ -89,29 +89,7 @@
                     <%include file="../admin/repos/repo_edit_perms.html"/>
                 </div>
             </div>
-            
-            <div class="field">
-                <div class="label">
-                    <label for="">${_('Remove repo')}:</label>
-                </div>
-                <div class="checkboxes">
-                  ${h.form(url('repo_settings_delete', repo_name=c.repo_info.repo_name),method='delete')}
-                  <div class="">
-                     <div class="fields">
-                         ${h.submit('remove_%s' % c.repo_info.repo_name,_('Remove this repository'),class_="ui-btn red",onclick="return confirm('"+_('Confirm to delete this repository')+"');")}
-                     </div>
-                     <div class="field" style="border:none;color:#888">
-                     <ul>
-                          <li>${_('''This repository will be renamed in a special way in order to be unaccesible for RhodeCode and VCS systems.
-                                   If you need fully delete it from file system please do it manually''')}
-                          </li>
-                     </ul>
-                     </div>
-                  </div>
-                  ${h.end_form()}
-                </div>
-            </div>
-        
+
             <div class="buttons">
               ${h.submit('save',_('Save'),class_="ui-btn large")}
               ${h.reset('reset',_('Reset'),class_="ui-btn large")}
@@ -120,5 +98,35 @@
     </div>
     ${h.end_form()}
 </div>
+
+<h3>${_('Delete repository')}</h3>
+<div class="form">
+    <!-- fields -->
+    <div class="fields">
+
+        <div class="field">
+            <div class="label">
+                <label for="">${_('Remove repo')}:</label>
+            </div>
+            <div class="checkboxes">
+              ${h.form(url('repo_settings_delete', repo_name=c.repo_info.repo_name),method='delete')}
+              <div class="">
+                 <div class="fields">
+                     ${h.submit('remove_%s' % c.repo_info.repo_name,_('Remove this repository'),class_="ui-btn red",onclick="return confirm('"+_('Confirm to delete this repository')+"');")}
+                 </div>
+                 <div class="field" style="border:none;color:#888">
+                 <ul>
+                      <li>${_('''This repository will be renamed in a special way in order to be unaccesible for RhodeCode and VCS systems.
+                               If you need fully delete it from file system please do it manually''')}
+                      </li>
+                 </ul>
+                 </div>
+              </div>
+              ${h.end_form()}
+            </div>
+        </div>
+   </div>
+</div>
+
 </div>
 </%def>
--- a/rhodecode/tests/models/test_repos_groups.py	Thu Dec 13 00:09:59 2012 +0100
+++ b/rhodecode/tests/models/test_repos_groups.py	Thu Dec 13 03:34:19 2012 +0100
@@ -136,7 +136,7 @@
         form_data['repo_group'] = g1.group_id
         form_data['perms_new'] = []
         form_data['perms_updates'] = []
-        RepoModel().update(r.repo_name, form_data)
+        RepoModel().update(r.repo_name, **form_data)
         self.assertEqual(r.repo_name, 'g1/john')
 
         self.__update_group(g1.group_id, 'g1', parent_id=g2.group_id)