changeset 6363:81fdf2f62ef2

validators: remove unneeded M/StateObj classes The M class is actually a wrapper around formencode.api.Validator.message, inserting a translator into the 'state' object. Setting a translator into the state object is indeed what is mentioned in the formencode docs. But, if you work this way, the custom state should be set both for custom validators, as well as for validators that are simple wrappers around formencode's default validators (for example wrappers that just set a custom message string). And the latter is what Kallithea is currently _not_ doing. Also, when using formencode.api.Validator.message correctly, you should not use the translator function _ on your validator strings manually. Remove the inconsistency in Kallithea validators as follows: - remove M and StateObj classes - replace the usage of M by direct calls to self.message (which is now no longer in charge of translating but simply of mapping a keyword onto the right message) - translation will be done by explicit _ calls at Kallithea side, so that formencode directly receives translated strings.
author Thomas De Schampheleire <thomas.de.schampheleire@gmail.com>
date Sun, 04 Dec 2016 20:22:23 +0100
parents 24b61c257aab
children d55626d8c933
files kallithea/model/validators.py
diffstat 1 files changed, 30 insertions(+), 54 deletions(-) [+]
line wrap: on
line diff
--- a/kallithea/model/validators.py	Sat Dec 03 21:56:54 2016 +0100
+++ b/kallithea/model/validators.py	Sun Dec 04 20:22:23 2016 +0100
@@ -44,30 +44,6 @@
 log = logging.getLogger(__name__)
 
 
-class StateObj(object):
-    """
-    this is needed to translate the messages using _() in validators
-    """
-    _ = staticmethod(_)
-
-
-def M(self, key, state=None, **kwargs):
-    """
-    returns string from self.message based on given key,
-    passed kw params are used to substitute %(named)s params inside
-    translated strings
-
-    :param msg:
-    :param state:
-    """
-    if state is None:
-        state = StateObj()
-    else:
-        state._ = staticmethod(_)
-    #inject validator into state object
-    return self.message(key, state, **kwargs)
-
-
 def UniqueListFromString():
     class _UniqueListFromString(formencode.FancyValidator):
         """
@@ -104,7 +80,7 @@
 
         def validate_python(self, value, state):
             if value in ['default', 'new_user']:
-                msg = M(self, 'system_invalid_username', state, username=value)
+                msg = self.message('system_invalid_username', state, username=value)
                 raise formencode.Invalid(msg, value, state)
             #check if user is unique
             old_un = None
@@ -113,11 +89,11 @@
 
             if old_un != value or not edit:
                 if User.get_by_username(value, case_insensitive=True):
-                    msg = M(self, 'username_exists', state, username=value)
+                    msg = self.message('username_exists', state, username=value)
                     raise formencode.Invalid(msg, value, state)
 
             if re.match(r'^[a-zA-Z0-9\_]{1}[a-zA-Z0-9\-\_\.]*$', value) is None:
-                msg = M(self, 'invalid_username', state)
+                msg = self.message('invalid_username', state)
                 raise formencode.Invalid(msg, value, state)
     return _validator
 
@@ -139,7 +115,7 @@
                 User.query().filter(User.active == True) \
                     .filter(User.username == value).one()
             except sqlalchemy.exc.InvalidRequestError: # NoResultFound/MultipleResultsFound
-                msg = M(self, 'invalid_username', state, username=value)
+                msg = self.message('invalid_username', state, username=value)
                 raise formencode.Invalid(msg, value, state,
                     error_dict=dict(username=msg)
                 )
@@ -161,7 +137,7 @@
 
         def validate_python(self, value, state):
             if value in ['default']:
-                msg = M(self, 'invalid_group', state)
+                msg = self.message('invalid_group', state)
                 raise formencode.Invalid(msg, value, state,
                     error_dict=dict(users_group_name=msg)
                 )
@@ -175,13 +151,13 @@
                 is_existing_group = UserGroup.get_by_group_name(value,
                                                         case_insensitive=True)
                 if is_existing_group:
-                    msg = M(self, 'group_exist', state, usergroup=value)
+                    msg = self.message('group_exist', state, usergroup=value)
                     raise formencode.Invalid(msg, value, state,
                         error_dict=dict(users_group_name=msg)
                     )
 
             if re.match(r'^[a-zA-Z0-9]{1}[a-zA-Z0-9\-\_\.]+$', value) is None:
-                msg = M(self, 'invalid_usergroup_name', state)
+                msg = self.message('invalid_usergroup_name', state)
                 raise formencode.Invalid(msg, value, state,
                     error_dict=dict(users_group_name=msg)
                 )
@@ -214,7 +190,7 @@
                 if parent_group_id else False
             )
             if edit and parent_of_self():
-                msg = M(self, 'parent_group_id', state)
+                msg = self.message('parent_group_id', state)
                 raise formencode.Invalid(msg, value, state,
                     error_dict=dict(parent_group_id=msg)
                 )
@@ -232,7 +208,7 @@
                       .scalar()
 
                 if gr is not None:
-                    msg = M(self, 'group_exists', state, group_name=slug)
+                    msg = self.message('group_exists', state, group_name=slug)
                     raise formencode.Invalid(msg, value, state,
                             error_dict=dict(group_name=msg)
                     )
@@ -243,7 +219,7 @@
                       .scalar()
 
                 if repo is not None:
-                    msg = M(self, 'repo_exists', state, group_name=slug)
+                    msg = self.message('repo_exists', state, group_name=slug)
                     raise formencode.Invalid(msg, value, state,
                             error_dict=dict(group_name=msg)
                     )
@@ -262,7 +238,7 @@
             try:
                 (value or '').decode('ascii')
             except UnicodeError:
-                msg = M(self, 'invalid_password', state)
+                msg = self.message('invalid_password', state)
                 raise formencode.Invalid(msg, value, state,)
     return _validator
 
@@ -276,7 +252,7 @@
         def validate_python(self, value, state):
             from kallithea.lib import auth_modules
             if auth_modules.authenticate(username, value, '') is None:
-                msg = M(self, 'invalid_password', state)
+                msg = self.message('invalid_password', state)
                 raise formencode.Invalid(msg, value, state,
                     error_dict=dict(current_password=msg)
                 )
@@ -291,7 +267,7 @@
 
         def validate_python(self, value, state):
             if value.get(password_field) != value[password_confirmation_field]:
-                msg = M(self, 'password_mismatch', state)
+                msg = self.message('password_mismatch', state)
                 raise formencode.Invalid(msg, value, state,
                      error_dict={password_field:msg, password_confirmation_field: msg}
                 )
@@ -316,13 +292,13 @@
                 user = User.get_by_username_or_email(username)
                 if user and not user.active:
                     log.warning('user %s is disabled', username)
-                    msg = M(self, 'invalid_auth', state)
+                    msg = self.message('invalid_auth', state)
                     raise formencode.Invalid(msg, value, state,
                         error_dict=dict(username=' ', password=msg)
                     )
                 else:
                     log.warning('user %s failed to authenticate', username)
-                    msg = M(self, 'invalid_auth', state)
+                    msg = self.message('invalid_auth', state)
                     raise formencode.Invalid(msg, value, state,
                         error_dict=dict(username=' ', password=msg)
                     )
@@ -337,7 +313,7 @@
 
         def validate_python(self, value, state):
             if value != authentication_token():
-                msg = M(self, 'invalid_token', state)
+                msg = self.message('invalid_token', state)
                 raise formencode.Invalid(msg, value, state)
     return _validator
 
@@ -385,7 +361,7 @@
             group_name = value.get('group_name')
 
             if repo_name in [ADMIN_PREFIX, '']:
-                msg = M(self, 'invalid_repo_name', state, repo=repo_name)
+                msg = self.message('invalid_repo_name', state, repo=repo_name)
                 raise formencode.Invalid(msg, value, state,
                     error_dict=dict(repo_name=msg)
                 )
@@ -396,20 +372,20 @@
 
                 if group_path != '':
                     if Repository.get_by_repo_name(repo_name_full):
-                        msg = M(self, 'repository_in_group_exists', state,
+                        msg = self.message('repository_in_group_exists', state,
                                 repo=repo_name, group=group_name)
                         raise formencode.Invalid(msg, value, state,
                             error_dict=dict(repo_name=msg)
                         )
                 elif RepoGroup.get_by_group_name(repo_name_full):
-                        msg = M(self, 'same_group_exists', state,
+                        msg = self.message('same_group_exists', state,
                                 repo=repo_name)
                         raise formencode.Invalid(msg, value, state,
                             error_dict=dict(repo_name=msg)
                         )
 
                 elif Repository.get_by_repo_name(repo_name_full):
-                        msg = M(self, 'repository_exists', state,
+                        msg = self.message('repository_exists', state,
                                 repo=repo_name)
                         raise formencode.Invalid(msg, value, state,
                             error_dict=dict(repo_name=msg)
@@ -481,7 +457,7 @@
                     url_handler(repo_type, url, make_ui('db', clear_session=False))
                 except Exception:
                     log.exception('URL validation failed')
-                    msg = M(self, 'clone_uri')
+                    msg = self.message('clone_uri', state)
                     raise formencode.Invalid(msg, value, state,
                         error_dict=dict(clone_uri=msg)
                     )
@@ -498,7 +474,7 @@
 
         def validate_python(self, value, state):
             if old_data['repo_type'] != value:
-                msg = M(self, 'invalid_fork_type', state)
+                msg = self.message('invalid_fork_type', state)
                 raise formencode.Invalid(msg, value, state,
                     error_dict=dict(repo_type=msg)
                 )
@@ -543,13 +519,13 @@
             if value_changed or new:
                 #parent group need to be existing
                 if gr and forbidden:
-                    msg = M(self, 'permission_denied', state)
+                    msg = self.message('permission_denied', state)
                     raise formencode.Invalid(msg, value, state,
                         error_dict=dict(repo_type=msg)
                     )
                 ## check if we can write to root location !
                 elif gr is None and not can_create_repos():
-                    msg = M(self, 'permission_denied_root', state)
+                    msg = self.message('permission_denied_root', state)
                     raise formencode.Invalid(msg, value, state,
                         error_dict=dict(repo_type=msg)
                     )
@@ -582,7 +558,7 @@
             val = HasRepoGroupPermissionAny('group.admin')
             forbidden = not val(gr_name, 'can create group validator')
             if forbidden_in_root or forbidden:
-                msg = M(self, 'permission_denied', state)
+                msg = self.message('permission_denied', state)
                 raise formencode.Invalid(msg, value, state,
                     error_dict=dict(parent_group_id=msg)
                 )
@@ -661,7 +637,7 @@
 
                 except Exception:
                     log.exception('Updated permission failed')
-                    msg = M(self, 'perm_new_member_type', state)
+                    msg = self.message('perm_new_member_type', state)
                     raise formencode.Invalid(msg, value, state,
                         error_dict=dict(perm_new_member_name=msg)
                     )
@@ -699,7 +675,7 @@
 
         def validate_python(self, value, state):
             if not os.path.isdir(value):
-                msg = M(self, 'invalid_path', state)
+                msg = self.message('invalid_path', state)
                 raise formencode.Invalid(msg, value, state,
                     error_dict=dict(paths_root_path=msg)
                 )
@@ -721,7 +697,7 @@
             if (old_data.get('email') or '').lower() != value:
                 user = User.get_by_email(value)
                 if user is not None:
-                    msg = M(self, 'email_taken', state)
+                    msg = self.message('email_taken', state)
                     raise formencode.Invalid(msg, value, state,
                         error_dict=dict(email=msg)
                     )
@@ -740,7 +716,7 @@
         def validate_python(self, value, state):
             user = User.get_by_email(value)
             if user is None:
-                msg = M(self, 'non_existing_email', state, email=value)
+                msg = self.message('non_existing_email', state, email=value)
                 raise formencode.Invalid(msg, value, state,
                     error_dict=dict(email=msg)
                 )
@@ -860,7 +836,7 @@
                     plugin = auth_modules.loadplugin(module)
                     plugin_name = plugin.name
                     if plugin_name in unique_names:
-                        msg = M(self, 'import_duplicate', state,
+                        msg = self.message('import_duplicate', state,
                                 loaded=unique_names[plugin_name],
                                 next_to_load=plugin_name)
                         raise formencode.Invalid(msg, value, state)