# HG changeset patch
# User Marcin Kuzminski <marcin@rhodecode.com>
# Date 2016-06-18 00:03:43
# Node ID c6a3436d4e2ab8e29ed898f187ad85fd98889fb8
# Parent  56e0b1a85c835892e03833fd8ec20fc732e89f21

repos, repo groups, user groups: allow to use disabled users in owner field.

This fixes #3374. There's no good benefit of having possibility to prevent
setting disabled user from beeing an owner.
It can happen that we start preperating a system and use disabled accounts.
Also users shouldn't be forbidden to edit settings on an disabled owner.

diff --git a/rhodecode/controllers/admin/repo_groups.py b/rhodecode/controllers/admin/repo_groups.py
--- a/rhodecode/controllers/admin/repo_groups.py
+++ b/rhodecode/controllers/admin/repo_groups.py
@@ -246,11 +246,10 @@ class RepoGroupsController(BaseControlle
                              repo_group=c.repo_group)
 
         repo_group_form = RepoGroupForm(
-            edit=True,
-            old_data=c.repo_group.get_dict(),
+            edit=True, old_data=c.repo_group.get_dict(),
             available_groups=c.repo_groups_choices,
-            can_create_in_root=can_create_in_root,
-        )()
+            can_create_in_root=can_create_in_root, allow_disabled=True)()
+
         try:
             form_result = repo_group_form.to_python(dict(request.POST))
             gr_name = form_result['group_name']
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
@@ -307,9 +307,9 @@ class ReposController(BaseRepoController
             'repo_group': repo.group.get_dict() if repo.group else {},
             'repo_type': repo.repo_type,
         }
-        _form = RepoForm(edit=True, old_data=old_data,
-                         repo_groups=c.repo_groups_choices,
-                         landing_revs=c.landing_revs_choices)()
+        _form = RepoForm(
+            edit=True, old_data=old_data, repo_groups=c.repo_groups_choices,
+            landing_revs=c.landing_revs_choices, allow_disabled=True)()
 
         try:
             form_result = _form.to_python(dict(request.POST))
diff --git a/rhodecode/controllers/admin/user_groups.py b/rhodecode/controllers/admin/user_groups.py
--- a/rhodecode/controllers/admin/user_groups.py
+++ b/rhodecode/controllers/admin/user_groups.py
@@ -209,9 +209,9 @@ class UserGroupsController(BaseControlle
 
         available_members = [safe_unicode(x[0]) for x in c.available_members]
 
-        users_group_form = UserGroupForm(edit=True,
-                                         old_data=c.user_group.get_dict(),
-                                         available_members=available_members)()
+        users_group_form = UserGroupForm(
+            edit=True, old_data=c.user_group.get_dict(),
+            available_members=available_members, allow_disabled=True)()
 
         try:
             form_result = users_group_form.to_python(request.POST)
diff --git a/rhodecode/model/forms.py b/rhodecode/model/forms.py
--- a/rhodecode/model/forms.py
+++ b/rhodecode/model/forms.py
@@ -138,7 +138,11 @@ def UserForm(edit=False, available_langu
     return _UserForm
 
 
-def UserGroupForm(edit=False, old_data={}, available_members=[]):
+def UserGroupForm(edit=False, old_data=None, available_members=None,
+                  allow_disabled=False):
+    old_data = old_data or {}
+    available_members = available_members or []
+
     class _UserGroupForm(formencode.Schema):
         allow_extra_fields = True
         filter_extra_fields = True
@@ -157,14 +161,18 @@ def UserGroupForm(edit=False, old_data={
                 available_members, hideList=False, testValueList=True,
                 if_missing=None, not_empty=False
             )
-            #this is user group owner
-            user = All(v.UnicodeString(not_empty=True), v.ValidRepoUser())
-
+            # this is user group owner
+            user = All(
+                v.UnicodeString(not_empty=True),
+                v.ValidRepoUser(allow_disabled))
     return _UserGroupForm
 
 
-def RepoGroupForm(edit=False, old_data={}, available_groups=[],
-                   can_create_in_root=False):
+def RepoGroupForm(edit=False, old_data=None, available_groups=None,
+                   can_create_in_root=False, allow_disabled=False):
+    old_data = old_data or {}
+    available_groups = available_groups or []
+
     class _RepoGroupForm(formencode.Schema):
         allow_extra_fields = True
         filter_extra_fields = False
@@ -178,11 +186,14 @@ def RepoGroupForm(edit=False, old_data={
         group_parent_id = v.OneOf(available_groups, hideList=False,
                                   testValueList=True, not_empty=True)
         enable_locking = v.StringBoolean(if_missing=False)
-        chained_validators = [v.ValidRepoGroup(edit, old_data, can_create_in_root)]
+        chained_validators = [
+            v.ValidRepoGroup(edit, old_data, can_create_in_root)]
 
         if edit:
-            #this is repo group owner
-            user = All(v.UnicodeString(not_empty=True), v.ValidRepoUser())
+            # this is repo group owner
+            user = All(
+                v.UnicodeString(not_empty=True),
+                v.ValidRepoUser(allow_disabled))
 
     return _RepoGroupForm
 
@@ -221,7 +232,8 @@ def PasswordResetForm():
     return _PasswordResetForm
 
 
-def RepoForm(edit=False, old_data=None, repo_groups=None, landing_revs=None):
+def RepoForm(edit=False, old_data=None, repo_groups=None, landing_revs=None,
+             allow_disabled=False):
     old_data = old_data or {}
     repo_groups = repo_groups or []
     landing_revs = landing_revs or []
@@ -248,7 +260,9 @@ def RepoForm(edit=False, old_data=None, 
 
         if edit:
             # this is repo owner
-            user = All(v.UnicodeString(not_empty=True), v.ValidRepoUser())
+            user = All(
+                v.UnicodeString(not_empty=True),
+                v.ValidRepoUser(allow_disabled))
             clone_uri_change = v.UnicodeString(
                 not_empty=False, if_missing=v.Missing)
 
diff --git a/rhodecode/model/validators.py b/rhodecode/model/validators.py
--- a/rhodecode/model/validators.py
+++ b/rhodecode/model/validators.py
@@ -193,21 +193,26 @@ def ValidRegex(msg=None):
     return _validator
 
 
-def ValidRepoUser():
+def ValidRepoUser(allow_disabled=False):
     class _validator(formencode.validators.FancyValidator):
         messages = {
-            'invalid_username': _(u'Username %(username)s is not valid')
+            'invalid_username': _(u'Username %(username)s is not valid'),
+            'disabled_username': _(u'Username %(username)s is disabled')
         }
 
         def validate_python(self, value, state):
             try:
-                User.query().filter(User.active == true())\
-                    .filter(User.username == value).one()
+                user = User.query().filter(User.username == value).one()
             except Exception:
                 msg = M(self, 'invalid_username', state, username=value)
                 raise formencode.Invalid(
                     msg, value, state, error_dict={'username': msg}
                 )
+            if user and (not allow_disabled and not user.active):
+                msg = M(self, 'disabled_username', state, username=value)
+                raise formencode.Invalid(
+                    msg, value, state, error_dict={'username': msg}
+                )
 
     return _validator