changeset 3056:6104dfd35b16 beta

Implemented #379 defaults settings page for creation of repositories - locking - statistics, downloads - repository type
author Marcin Kuzminski <marcin@python-works.com>
date Mon, 03 Dec 2012 02:55:08 +0100
parents 301268606429
children 79c5967a1e5c
files rhodecode/config/routing.py rhodecode/controllers/admin/defaults.py rhodecode/controllers/admin/repos.py rhodecode/controllers/admin/settings.py rhodecode/lib/db_manage.py rhodecode/lib/dbmigrate/versions/008_version_1_5_0.py rhodecode/lib/utils2.py rhodecode/model/db.py rhodecode/model/forms.py rhodecode/model/repo.py rhodecode/public/css/style.css rhodecode/templates/admin/defaults/defaults.html rhodecode/templates/admin/repos/repo_add_base.html rhodecode/templates/base/base.html rhodecode/tests/__init__.py rhodecode/tests/api/api_base.py rhodecode/tests/functional/test_admin_defaults.py rhodecode/tests/functional/test_admin_repos.py rhodecode/tests/functional/test_files.py rhodecode/tests/models/test_repos_groups.py
diffstat 20 files changed, 489 insertions(+), 110 deletions(-) [+]
line wrap: on
line diff
--- a/rhodecode/config/routing.py	Sat Dec 01 15:17:36 2012 +0100
+++ b/rhodecode/config/routing.py	Mon Dec 03 02:55:08 2012 +0100
@@ -262,6 +262,10 @@
     rmap.resource('permission', 'permissions',
                   controller='admin/permissions', path_prefix=ADMIN_PREFIX)
 
+    #ADMIN DEFAULTS REST ROUTES
+    rmap.resource('default', 'defaults',
+                  controller='admin/defaults', path_prefix=ADMIN_PREFIX)
+
     ##ADMIN LDAP SETTINGS
     rmap.connect('ldap_settings', '%s/ldap' % ADMIN_PREFIX,
                  controller='admin/ldap_settings', action='ldap_settings',
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rhodecode/controllers/admin/defaults.py	Mon Dec 03 02:55:08 2012 +0100
@@ -0,0 +1,130 @@
+# -*- coding: utf-8 -*-
+"""
+    rhodecode.controllers.admin.defaults
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    default settings controller for Rhodecode
+
+    :created_on: Apr 27, 2010
+    :author: marcink
+    :copyright: (C) 2010-2012 Marcin Kuzminski <marcin@python-works.com>
+    :license: GPLv3, see COPYING for more details.
+"""
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+import logging
+import traceback
+import formencode
+from formencode import htmlfill
+
+from pylons import request, 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
+from rhodecode.lib.base import BaseController, render
+from rhodecode.model.forms import DefaultsForm
+from rhodecode.model.meta import Session
+from rhodecode import BACKENDS
+from rhodecode.model.db import RhodeCodeSetting
+
+log = logging.getLogger(__name__)
+
+
+class DefaultsController(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('default', 'defaults')
+
+    @LoginRequired()
+    @HasPermissionAllDecorator('hg.admin')
+    def __before__(self):
+        super(DefaultsController, self).__before__()
+
+    def index(self, format='html'):
+        """GET /defaults: All items in the collection"""
+        # url('defaults')
+        c.backends = BACKENDS.keys()
+        defaults = RhodeCodeSetting.get_default_repo_settings()
+
+        return htmlfill.render(
+            render('admin/defaults/defaults.html'),
+            defaults=defaults,
+            encoding="UTF-8",
+            force_defaults=False
+        )
+
+    def create(self):
+        """POST /defaults: Create a new item"""
+        # url('defaults')
+
+    def new(self, format='html'):
+        """GET /defaults/new: Form to create a new item"""
+        # url('new_default')
+
+    def update(self, id):
+        """PUT /defaults/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('default', id=ID),
+        #           method='put')
+        # url('default', id=ID)
+
+        _form = DefaultsForm()()
+
+        try:
+            form_result = _form.to_python(dict(request.POST))
+            for k, v in form_result.iteritems():
+                setting = RhodeCodeSetting.get_by_name_or_create(k)
+                setting.app_settings_value = v
+                Session().add(setting)
+            Session().commit()
+            h.flash(_('Default settings updated successfully'),
+                    category='success')
+
+        except formencode.Invalid, errors:
+            defaults = errors.value
+
+            return htmlfill.render(
+                render('admin/defaults/defaults.html'),
+                defaults=defaults,
+                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 defaults'),
+                    category='error')
+
+        return redirect(url('defaults'))
+
+    def delete(self, id):
+        """DELETE /defaults/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('default', id=ID),
+        #           method='delete')
+        # url('default', id=ID)
+
+    def show(self, id, format='html'):
+        """GET /defaults/id: Show a specific item"""
+        # url('default', id=ID)
+
+    def edit(self, id, format='html'):
+        """GET /defaults/id/edit: Form to edit an existing item"""
+        # url('edit_default', id=ID)
--- a/rhodecode/controllers/admin/repos.py	Sat Dec 01 15:17:36 2012 +0100
+++ b/rhodecode/controllers/admin/repos.py	Mon Dec 03 02:55:08 2012 +0100
@@ -42,7 +42,8 @@
 from rhodecode.lib.utils import invalidate_cache, action_logger, repo_name_slug
 from rhodecode.lib.helpers import get_token
 from rhodecode.model.meta import Session
-from rhodecode.model.db import User, Repository, UserFollowing, RepoGroup
+from rhodecode.model.db import User, Repository, UserFollowing, RepoGroup,\
+    RhodeCodeSetting
 from rhodecode.model.forms import RepoForm
 from rhodecode.model.scm import ScmModel
 from rhodecode.model.repo import RepoModel
--- a/rhodecode/controllers/admin/settings.py	Sat Dec 01 15:17:36 2012 +0100
+++ b/rhodecode/controllers/admin/settings.py	Mon Dec 03 02:55:08 2012 +0100
@@ -481,7 +481,15 @@
         new_repo = request.GET.get('repo', '')
         c.new_repo = repo_name_slug(new_repo)
 
-        return render('admin/repos/repo_add_create_repository.html')
+        ## apply the defaults from defaults page
+        defaults = RhodeCodeSetting.get_default_repo_settings(strip_prefix=True)
+        return htmlfill.render(
+            render('admin/repos/repo_add_create_repository.html'),
+            defaults=defaults,
+            errors={},
+            prefix_error=False,
+            encoding="UTF-8"
+        )
 
     def _get_hg_ui_settings(self):
         ret = RhodeCodeUi.query().all()
--- a/rhodecode/lib/db_manage.py	Sat Dec 01 15:17:36 2012 +0100
+++ b/rhodecode/lib/db_manage.py	Mon Dec 03 02:55:08 2012 +0100
@@ -273,6 +273,7 @@
 
             def step_8(self):
                 self.klass.populate_default_permissions()
+                self.klass.create_default_options(skip_existing=True)
                 Session().commit()
 
         upgrade_steps = [0] + range(curr_version + 1, __dbversion__ + 1)
@@ -482,6 +483,22 @@
             setting = RhodeCodeSetting(k, v)
             self.sa.add(setting)
 
+    def create_default_options(self, skip_existing=False):
+        """Creates default settings"""
+
+        for k, v in [
+            ('default_repo_enable_locking',  False),
+            ('default_repo_enable_downloads', False),
+            ('default_repo_enable_statistics', False),
+            ('default_repo_private', False),
+            ('default_repo_type', 'hg')]:
+
+            if skip_existing and RhodeCodeSetting.get_by_name(k) != None:
+                log.debug('Skipping option %s' % k)
+                continue
+            setting = RhodeCodeSetting(k, v)
+            self.sa.add(setting)
+
     def fixup_groups(self):
         def_usr = User.get_by_username('default')
         for g in RepoGroup.query().all():
@@ -622,6 +639,7 @@
         self.sa.add(sett6)
 
         self.create_ldap_options()
+        self.create_default_options()
 
         log.info('created ui config')
 
--- a/rhodecode/lib/dbmigrate/versions/008_version_1_5_0.py	Sat Dec 01 15:17:36 2012 +0100
+++ b/rhodecode/lib/dbmigrate/versions/008_version_1_5_0.py	Mon Dec 03 02:55:08 2012 +0100
@@ -23,6 +23,7 @@
     """
     pass
 
+
 def downgrade(migrate_engine):
     meta = MetaData()
     meta.bind = migrate_engine
--- a/rhodecode/lib/utils2.py	Sat Dec 01 15:17:36 2012 +0100
+++ b/rhodecode/lib/utils2.py	Mon Dec 03 02:55:08 2012 +0100
@@ -287,7 +287,7 @@
 
 def remove_prefix(s, prefix):
     if s.startswith(prefix):
-        s = s[:-1 * len(prefix)]
+        s = s[len(prefix):]
     return s
 
 
--- a/rhodecode/model/db.py	Sat Dec 01 15:17:36 2012 +0100
+++ b/rhodecode/model/db.py	Mon Dec 03 02:55:08 2012 +0100
@@ -46,7 +46,7 @@
 from rhodecode.lib.vcs.utils.lazy import LazyProperty
 
 from rhodecode.lib.utils2 import str2bool, safe_str, get_changeset_safe, \
-    safe_unicode, remove_suffix
+    safe_unicode, remove_suffix, remove_prefix
 from rhodecode.lib.compat import json
 from rhodecode.lib.caching_query import FromCache
 
@@ -167,7 +167,11 @@
     @hybrid_property
     def app_settings_value(self):
         v = self._app_settings_value
-        if self.app_settings_name == 'ldap_active':
+        if self.app_settings_name in ["ldap_active",
+                                      "default_repo_enable_statistics",
+                                      "default_repo_enable_locking",
+                                      "default_repo_private",
+                                      "default_repo_enable_downloads"]:
             v = str2bool(v)
         return v
 
@@ -225,6 +229,19 @@
 
         return fd
 
+    @classmethod
+    def get_default_repo_settings(cls, cache=False, strip_prefix=False):
+        ret = cls.query()\
+                .filter(cls.app_settings_name.startswith('default_')).all()
+        fd = {}
+        for row in ret:
+            key = row.app_settings_name
+            if strip_prefix:
+                key = remove_prefix(key, prefix='default_')
+            fd.update({key: row.app_settings_value})
+
+        return fd
+
 
 class RhodeCodeUi(Base, BaseModel):
     __tablename__ = 'rhodecode_ui'
--- a/rhodecode/model/forms.py	Sat Dec 01 15:17:36 2012 +0100
+++ b/rhodecode/model/forms.py	Mon Dec 03 02:55:08 2012 +0100
@@ -173,19 +173,19 @@
              repo_groups=[], landing_revs=[]):
     class _RepoForm(formencode.Schema):
         allow_extra_fields = True
-        filter_extra_fields = False
+        filter_extra_fields = True
         repo_name = All(v.UnicodeString(strip=True, min=1, not_empty=True),
                         v.SlugifyName())
-        clone_uri = All(v.UnicodeString(strip=True, min=1, not_empty=False))
         repo_group = All(v.CanWriteGroup(),
                          v.OneOf(repo_groups, hideList=True))
         repo_type = v.OneOf(supported_backends)
-        description = v.UnicodeString(strip=True, min=1, not_empty=False)
-        private = v.StringBoolean(if_missing=False)
-        enable_statistics = v.StringBoolean(if_missing=False)
-        enable_downloads = v.StringBoolean(if_missing=False)
-        enable_locking = v.StringBoolean(if_missing=False)
-        landing_rev = v.OneOf(landing_revs, hideList=True)
+        repo_description = v.UnicodeString(strip=True, min=1, not_empty=False)
+        repo_private = v.StringBoolean(if_missing=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
@@ -218,9 +218,8 @@
     return _RepoForkForm
 
 
-def RepoSettingsForm(edit=False, old_data={},
-                     supported_backends=BACKENDS.keys(), repo_groups=[],
-                     landing_revs=[]):
+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
@@ -282,8 +281,8 @@
     return _ApplicationUiSettingsForm
 
 
-def DefaultPermissionsForm(repo_perms_choices, group_perms_choices, register_choices, create_choices,
-                           fork_choices):
+def DefaultPermissionsForm(repo_perms_choices, group_perms_choices,
+                           register_choices, create_choices, fork_choices):
     class _DefaultPermissionsForm(formencode.Schema):
         allow_extra_fields = True
         filter_extra_fields = True
@@ -299,6 +298,19 @@
     return _DefaultPermissionsForm
 
 
+def DefaultsForm(edit=False, old_data={}, supported_backends=BACKENDS.keys()):
+    class _DefaultsForm(formencode.Schema):
+        allow_extra_fields = True
+        filter_extra_fields = True
+        default_repo_type = v.OneOf(supported_backends)
+        default_repo_private = v.StringBoolean(if_missing=False)
+        default_repo_enable_statistics = v.StringBoolean(if_missing=False)
+        default_repo_enable_downloads = v.StringBoolean(if_missing=False)
+        default_repo_enable_locking = v.StringBoolean(if_missing=False)
+
+    return _DefaultsForm
+
+
 def LdapSettingsForm(tls_reqcert_choices, search_scope_choices,
                      tls_kind_choices):
     class _LdapSettingsForm(formencode.Schema):
--- a/rhodecode/model/repo.py	Sat Dec 01 15:17:36 2012 +0100
+++ b/rhodecode/model/repo.py	Mon Dec 03 02:55:08 2012 +0100
@@ -37,7 +37,8 @@
 
 from rhodecode.model import BaseModel
 from rhodecode.model.db import Repository, UserRepoToPerm, User, Permission, \
-    Statistics, UsersGroup, UsersGroupRepoToPerm, RhodeCodeUi, RepoGroup
+    Statistics, UsersGroup, UsersGroupRepoToPerm, RhodeCodeUi, RepoGroup,\
+    RhodeCodeSetting
 from rhodecode.lib import helpers as h
 
 
@@ -205,7 +206,8 @@
     def create_repo(self, repo_name, repo_type, description, owner,
                     private=False, clone_uri=None, repos_group=None,
                     landing_rev='tip', just_db=False, fork_of=None,
-                    copy_fork_permissions=False):
+                    copy_fork_permissions=False, enable_statistics=False,
+                    enable_locking=False, enable_downloads=False):
         """
         Create repository
 
@@ -234,6 +236,10 @@
             new_repo.clone_uri = clone_uri
             new_repo.landing_rev = landing_rev
 
+            new_repo.enable_statistics = enable_statistics
+            new_repo.enable_locking = enable_locking
+            new_repo.enable_downloads = enable_downloads
+
             if repos_group:
                 new_repo.enable_locking = repos_group.enable_locking
 
@@ -307,20 +313,27 @@
         :param just_db:
         :param fork:
         """
-
+        owner = cur_user
         repo_name = form_data['repo_name_full']
         repo_type = form_data['repo_type']
-        description = form_data['description']
-        owner = cur_user
-        private = form_data['private']
+        description = form_data['repo_description']
+        private = form_data['repo_private']
         clone_uri = form_data.get('clone_uri')
         repos_group = form_data['repo_group']
-        landing_rev = form_data['landing_rev']
+        landing_rev = form_data['repo_landing_rev']
         copy_fork_permissions = form_data.get('copy_permissions')
         fork_of = form_data.get('fork_parent_id')
+
+        ##defaults
+        defs = RhodeCodeSetting.get_default_repo_settings(strip_prefix=True)
+        enable_statistics = defs.get('repo_enable_statistic')
+        enable_locking = defs.get('repo_enable_locking')
+        enable_downloads = defs.get('repo_enable_downloads')
+
         return self.create_repo(
             repo_name, repo_type, description, owner, private, clone_uri,
-            repos_group, landing_rev, just_db, fork_of, copy_fork_permissions
+            repos_group, landing_rev, just_db, fork_of, copy_fork_permissions,
+            enable_statistics, enable_locking, enable_downloads
         )
 
     def create_fork(self, form_data, cur_user):
--- a/rhodecode/public/css/style.css	Sat Dec 01 15:17:36 2012 +0100
+++ b/rhodecode/public/css/style.css	Mon Dec 03 02:55:08 2012 +0100
@@ -626,6 +626,14 @@
 	padding: 12px 9px 7px 24px;
 }
 
+#header #header-inner #quick li ul li a.defaults,#header #header-inner #quick li ul li a.defaults:hover
+    {
+    background: #FFF url("../images/icons/wrench.png") no-repeat 4px 9px;
+    width: 167px;
+    margin: 0;
+    padding: 12px 9px 7px 24px;
+}
+
 #header #header-inner #quick li ul li a.settings,#header #header-inner #quick li ul li a.settings:hover
 	{
 	background: #FFF url("../images/icons/cog.png") no-repeat 4px 9px;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rhodecode/templates/admin/defaults/defaults.html	Mon Dec 03 02:55:08 2012 +0100
@@ -0,0 +1,93 @@
+## -*- coding: utf-8 -*-
+<%inherit file="/base/base.html"/>
+
+<%def name="title()">
+    ${_('Repositories defaults')} - ${c.rhodecode_name}
+</%def>
+
+<%def name="breadcrumbs_links()">
+    ${h.link_to(_('Admin'),h.url('admin_home'))}
+    &raquo;
+    ${_('Defaults')}
+</%def>
+
+<%def name="page_nav()">
+	${self.menu('admin')}
+</%def>
+
+<%def name="main()">
+<div class="box">
+    <!-- box / title -->
+    <div class="title">
+        ${self.breadcrumbs()}
+    </div>
+    
+    <h3>${_('Repositories defaults')}</h3>
+
+    ${h.form(url('default', id='defaults'),method='put')}
+    <div class="form">
+        <!-- fields -->
+
+        <div class="fields">
+        
+            <div class="field">
+                <div class="label">
+                    <label for="default_repo_type">${_('Type')}:</label>
+                </div>
+                <div class="input">
+                    ${h.select('default_repo_type','hg',c.backends,class_="medium")}
+                </div>
+            </div>        
+
+            <div class="field">
+                <div class="label label-checkbox">
+                    <label for="default_repo_private">${_('Private repository')}:</label>
+                </div>
+                <div class="checkboxes">
+                    ${h.checkbox('default_repo_private',value="True")}
+                    <span class="help-block">${_('Private repositories are only visible to people explicitly added as collaborators.')}</span>
+                </div>
+            </div>
+
+
+            <div class="field">
+                <div class="label label-checkbox">
+                    <label for="default_repo_enable_statistics">${_('Enable statistics')}:</label>
+                </div>
+                <div class="checkboxes">
+                    ${h.checkbox('default_repo_enable_statistics',value="True")}
+                    <span class="help-block">${_('Enable statistics window on summary page.')}</span>
+                </div>
+            </div>
+
+            <div class="field">
+                <div class="label label-checkbox">
+                    <label for="default_repo_enable_downloads">${_('Enable downloads')}:</label>
+                </div>
+                <div class="checkboxes">
+                    ${h.checkbox('default_repo_enable_downloads',value="True")}
+                    <span class="help-block">${_('Enable download menu on summary page.')}</span>
+                </div>
+            </div>
+
+            <div class="field">
+                <div class="label label-checkbox">
+                    <label for="default_repo_enable_locking">${_('Enable locking')}:</label>
+                </div>
+                <div class="checkboxes">
+                    ${h.checkbox('default_repo_enable_locking',value="True")}
+                    <span class="help-block">${_('Enable lock-by-pulling on repository.')}</span>
+                </div>
+            </div>
+
+            <div class="buttons">
+            ${h.submit('save',_('Save'),class_="ui-btn large")}
+            </div>
+        </div>
+    </div>
+    ${h.end_form()}
+    
+    ##<h3>${_('Groups defaults')}</h3>
+    
+</div>
+</%def>
--- a/rhodecode/templates/admin/repos/repo_add_base.html	Sat Dec 01 15:17:36 2012 +0100
+++ b/rhodecode/templates/admin/repos/repo_add_base.html	Mon Dec 03 02:55:08 2012 +0100
@@ -12,7 +12,7 @@
                 ${h.text('repo_name',c.new_repo,class_="small")}
                 %if not h.HasPermissionAll('hg.admin')('repo create form'):
                     ${h.hidden('user_created',True)}
-                %endif
+                %endif                
             </div>
          </div>
         <div class="field">
@@ -44,28 +44,28 @@
          </div>
          <div class="field">
             <div class="label">
-                <label for="landing_rev">${_('Landing revision')}:</label>
+                <label for="repo_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>
--- a/rhodecode/templates/base/base.html	Sat Dec 01 15:17:36 2012 +0100
+++ b/rhodecode/templates/base/base.html	Mon Dec 03 02:55:08 2012 +0100
@@ -236,6 +236,7 @@
                             <li>${h.link_to(_('users groups'),h.url('users_groups'),class_='groups')}</li>
                             <li>${h.link_to(_('permissions'),h.url('edit_permission',id='default'),class_='permissions')}</li>
                             <li>${h.link_to(_('ldap'),h.url('ldap_home'),class_='ldap')}</li>
+                            <li>${h.link_to(_('defaults'),h.url('defaults'),class_='defaults')}</li>
                             <li class="last">${h.link_to(_('settings'),h.url('admin_settings'),class_='settings')}</li>
                         </ul>
                         </%def>
--- a/rhodecode/tests/__init__.py	Sat Dec 01 15:17:36 2012 +0100
+++ b/rhodecode/tests/__init__.py	Mon Dec 03 02:55:08 2012 +0100
@@ -47,7 +47,7 @@
     'TEST_USER_REGULAR2_PASS', 'TEST_USER_REGULAR2_EMAIL', 'TEST_HG_REPO',
     'TEST_HG_REPO_CLONE', 'TEST_HG_REPO_PULL', 'TEST_GIT_REPO',
     'TEST_GIT_REPO_CLONE', 'TEST_GIT_REPO_PULL', 'HG_REMOTE_REPO',
-    'GIT_REMOTE_REPO', 'SCM_TESTS',
+    'GIT_REMOTE_REPO', 'SCM_TESTS', '_get_repo_create_params'
 ]
 
 # Invoke websetup with the current config file
@@ -163,3 +163,24 @@
                 'msg `%s` not found in session flash: got `%s` instead' % (
                       msg, response.session['flash'])
             )
+
+
+## HELPERS ##
+
+def _get_repo_create_params(**custom):
+    defs = {
+        'repo_name': None,
+        'repo_type': 'hg',
+        'clone_uri': '',
+        'repo_group': '',
+        'repo_description': 'DESC',
+        'repo_private': False,
+        'repo_landing_rev': 'tip'
+    }
+    defs.update(custom)
+    if 'repo_name_full' not in custom:
+        defs.update({'repo_name_full': defs['repo_name']})
+
+    return defs
+
+
--- a/rhodecode/tests/api/api_base.py	Sat Dec 01 15:17:36 2012 +0100
+++ b/rhodecode/tests/api/api_base.py	Mon Dec 03 02:55:08 2012 +0100
@@ -61,15 +61,10 @@
 
 def create_repo(repo_name, repo_type):
     # create new repo
-    form_data = dict(repo_name=repo_name,
-                     repo_name_full=repo_name,
-                     fork_name=None,
-                     description='description %s' % repo_name,
-                     repo_group=None,
-                     private=False,
-                     repo_type=repo_type,
-                     clone_uri=None,
-                     landing_rev='tip')
+    form_data = _get_repo_create_params(
+                    repo_name_full=repo_name,
+                    repo_description='description %s' % repo_name,
+                )
     cur_user = UserModel().get_by_username(TEST_USER_ADMIN_LOGIN)
     r = RepoModel().create(form_data, cur_user)
     Session().commit()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rhodecode/tests/functional/test_admin_defaults.py	Mon Dec 03 02:55:08 2012 +0100
@@ -0,0 +1,72 @@
+from rhodecode.tests import *
+from rhodecode.model.db import RhodeCodeSetting
+
+
+class TestDefaultsController(TestController):
+
+    def test_index(self):
+        self.log_user()
+        response = self.app.get(url('defaults'))
+        response.mustcontain('default_repo_private')
+        response.mustcontain('default_repo_enable_statistics')
+        response.mustcontain('default_repo_enable_downloads')
+        response.mustcontain('default_repo_enable_locking')
+
+    def test_index_as_xml(self):
+        response = self.app.get(url('formatted_defaults', format='xml'))
+
+    def test_create(self):
+        response = self.app.post(url('defaults'))
+
+    def test_new(self):
+        response = self.app.get(url('new_default'))
+
+    def test_new_as_xml(self):
+        response = self.app.get(url('formatted_new_default', format='xml'))
+
+    def test_update(self):
+        self.log_user()
+        params = {
+            'default_repo_enable_locking': True,
+            'default_repo_enable_downloads': True,
+            'default_repo_enable_statistics': True,
+            'default_repo_private': True,
+            'default_repo_type': 'hg',
+        }
+        response = self.app.put(url('default', id='default'), params=params)
+        self.checkSessionFlash(response, 'Default settings updated successfully')
+        defs = RhodeCodeSetting.get_default_repo_settings()
+        self.assertEqual(params, defs)
+
+        params = {
+            'default_repo_enable_locking': False,
+            'default_repo_enable_downloads': False,
+            'default_repo_enable_statistics': False,
+            'default_repo_private': False,
+            'default_repo_type': 'git',
+        }
+        response = self.app.put(url('default', id='default'), params=params)
+        self.checkSessionFlash(response, 'Default settings updated successfully')
+        defs = RhodeCodeSetting.get_default_repo_settings()
+        self.assertEqual(params, defs)
+
+    def test_update_browser_fakeout(self):
+        response = self.app.post(url('default', id=1), params=dict(_method='put'))
+
+    def test_delete(self):
+        response = self.app.delete(url('default', id=1))
+
+    def test_delete_browser_fakeout(self):
+        response = self.app.post(url('default', id=1), params=dict(_method='delete'))
+
+    def test_show(self):
+        response = self.app.get(url('default', id=1))
+
+    def test_show_as_xml(self):
+        response = self.app.get(url('formatted_default', id=1, format='xml'))
+
+    def test_edit(self):
+        response = self.app.get(url('edit_default', id=1))
+
+    def test_edit_as_xml(self):
+        response = self.app.get(url('formatted_edit_default', id=1, format='xml'))
--- a/rhodecode/tests/functional/test_admin_repos.py	Sat Dec 01 15:17:36 2012 +0100
+++ b/rhodecode/tests/functional/test_admin_repos.py	Mon Dec 03 02:55:08 2012 +0100
@@ -26,14 +26,10 @@
         self.log_user()
         repo_name = NEW_HG_REPO
         description = 'description for newly created repo'
-        private = False
-        response = self.app.post(url('repos'), {'repo_name': repo_name,
-                                                'repo_type': 'hg',
-                                                'clone_uri': '',
-                                                'repo_group': '',
-                                                'description': description,
-                                                'private': private,
-                                                'landing_rev': 'tip'})
+        response = self.app.post(url('repos'), 
+                        _get_repo_create_params(repo_private=False,
+                                                repo_name=repo_name,
+                                                repo_description=description))
         self.checkSessionFlash(response,
                                'created repository %s' % (repo_name))
 
@@ -63,13 +59,10 @@
         description = 'description for newly created repo' + non_ascii
         description_unicode = description.decode('utf8')
         private = False
-        response = self.app.post(url('repos'), {'repo_name': repo_name,
-                                                'repo_type': 'hg',
-                                                'clone_uri': '',
-                                                'repo_group': '',
-                                                'description': description,
-                                                'private': private,
-                                                'landing_rev': 'tip'})
+        response = self.app.post(url('repos'),
+                        _get_repo_create_params(repo_private=False,
+                                                repo_name=repo_name,
+                                                repo_description=description))
         self.checkSessionFlash(response,
                                'created repository %s' % (repo_name_unicode))
 
@@ -103,14 +96,12 @@
         repo_name = 'ingroup'
         repo_name_full = RepoGroup.url_sep().join([group_name, repo_name])
         description = 'description for newly created repo'
-        private = False
-        response = self.app.post(url('repos'), {'repo_name': repo_name,
-                                                'repo_type': 'hg',
-                                                'clone_uri': '',
-                                                'repo_group': gr.group_id,
-                                                'description': description,
-                                                'private': private,
-                                                'landing_rev': 'tip'})
+        response = self.app.post(url('repos'),
+                        _get_repo_create_params(repo_private=False,
+                                                repo_name=repo_name,
+                                                repo_description=description,
+                                                repo_group=gr.group_id,))
+
         self.checkSessionFlash(response,
                                'created repository %s' % (repo_name))
 
@@ -142,14 +133,12 @@
         self.log_user()
         repo_name = NEW_GIT_REPO
         description = 'description for newly created repo'
-        private = False
-        response = self.app.post(url('repos'), {'repo_name': repo_name,
-                                                'repo_type': 'git',
-                                                'clone_uri': '',
-                                                'repo_group': '',
-                                                'description': description,
-                                                'private': private,
-                                                'landing_rev': 'tip'})
+
+        response = self.app.post(url('repos'),
+                        _get_repo_create_params(repo_private=False,
+                                                repo_type='git',
+                                                repo_name=repo_name,
+                                                repo_description=description))
         self.checkSessionFlash(response,
                                'created repository %s' % (repo_name))
 
@@ -179,13 +168,12 @@
         description = 'description for newly created repo' + non_ascii
         description_unicode = description.decode('utf8')
         private = False
-        response = self.app.post(url('repos'), {'repo_name': repo_name,
-                                                'repo_type': 'git',
-                                                'clone_uri': '',
-                                                'repo_group': '',
-                                                'description': description,
-                                                'private': private,
-                                                'landing_rev': 'tip'})
+        response = self.app.post(url('repos'),
+                        _get_repo_create_params(repo_private=False,
+                                                repo_type='git',
+                                                repo_name=repo_name,
+                                                repo_description=description))
+
         self.checkSessionFlash(response,
                                'created repository %s' % (repo_name_unicode))
 
@@ -226,13 +214,12 @@
         repo_name = 'vcs_test_new_to_delete'
         description = 'description for newly created repo'
         private = False
-        response = self.app.post(url('repos'), {'repo_name': repo_name,
-                                                'repo_type': 'hg',
-                                                'clone_uri': '',
-                                                'repo_group': '',
-                                                'description': description,
-                                                'private': private,
-                                                'landing_rev': 'tip'})
+        response = self.app.post(url('repos'),
+                        _get_repo_create_params(repo_private=False,
+                                                repo_type='hg',
+                                                repo_name=repo_name,
+                                                repo_description=description))
+
         self.checkSessionFlash(response,
                                'created repository %s' % (repo_name))
 
@@ -275,13 +262,12 @@
         repo_name = 'vcs_test_new_to_delete'
         description = 'description for newly created repo'
         private = False
-        response = self.app.post(url('repos'), {'repo_name': repo_name,
-                                                'repo_type': 'git',
-                                                'clone_uri': '',
-                                                'repo_group': '',
-                                                'description': description,
-                                                'private': private,
-                                                'landing_rev': 'tip'})
+        response = self.app.post(url('repos'), 
+                        _get_repo_create_params(repo_private=False,
+                                                repo_type='git',
+                                                repo_name=repo_name,
+                                                repo_description=description))
+
         self.checkSessionFlash(response,
                                'created repository %s' % (repo_name))
 
--- a/rhodecode/tests/functional/test_files.py	Sat Dec 01 15:17:36 2012 +0100
+++ b/rhodecode/tests/functional/test_files.py	Mon Dec 03 02:55:08 2012 +0100
@@ -1,4 +1,6 @@
 from rhodecode.tests import *
+from rhodecode.model.db import Repository
+from rhodecode.model.meta import Session
 
 ARCHIVE_SPECS = {
     '.tar.bz2': ('application/x-bzip2', 'tbz2', ''),
@@ -7,6 +9,13 @@
 }
 
 
+def _set_downloads(repo_name, set_to):
+    repo = Repository.get_by_repo_name(repo_name)
+    repo.enable_downloads = set_to
+    Session().add(repo)
+    Session().commit()
+
+
 class TestFilesController(TestController):
 
     def test_index(self):
@@ -216,7 +225,7 @@
 
     def test_archival(self):
         self.log_user()
-
+        _set_downloads(HG_REPO, set_to=True)
         for arch_ext, info in ARCHIVE_SPECS.items():
             short = '27cd5cce30c9%s' % arch_ext
             fname = '27cd5cce30c96924232dffcd24178a07ffeb5dfc%s' % arch_ext
@@ -237,7 +246,7 @@
 
     def test_archival_wrong_ext(self):
         self.log_user()
-
+        _set_downloads(HG_REPO, set_to=True)
         for arch_ext in ['tar', 'rar', 'x', '..ax', '.zipz']:
             fname = '27cd5cce30c96924232dffcd24178a07ffeb5dfc%s' % arch_ext
 
@@ -249,7 +258,7 @@
 
     def test_archival_wrong_revision(self):
         self.log_user()
-
+        _set_downloads(HG_REPO, set_to=True)
         for rev in ['00x000000', 'tar', 'wrong', '@##$@$42413232', '232dffcd']:
             fname = '%s.zip' % rev
 
--- a/rhodecode/tests/models/test_repos_groups.py	Sat Dec 01 15:17:36 2012 +0100
+++ b/rhodecode/tests/models/test_repos_groups.py	Mon Dec 03 02:55:08 2012 +0100
@@ -4,7 +4,7 @@
 
 from rhodecode.model.repos_group import ReposGroupModel
 from rhodecode.model.repo import RepoModel
-from rhodecode.model.db import RepoGroup, User, Repository
+from rhodecode.model.db import RepoGroup, User
 from rhodecode.model.meta import Session
 from sqlalchemy.exc import IntegrityError
 
@@ -125,17 +125,7 @@
         g2 = _make_group('g2')
 
         # create new repo
-        form_data = dict(repo_name='john',
-                         repo_name_full='john',
-                         fork_name=None,
-                         description=None,
-                         repo_group=None,
-                         private=False,
-                         repo_type='hg',
-                         clone_uri=None,
-                         landing_rev='tip',
-                         enable_locking=False,
-                         recursive=False)
+        form_data = _get_repo_create_params(repo_name='john')
         cur_user = User.get_by_username(TEST_USER_ADMIN_LOGIN)
         r = RepoModel().create(form_data, cur_user)