api: use consistent way to extract users, repos, repo groups and user groups by id or name.

- makes usage of Number vs String to differenciate if we pick objec ID or it's name
this will allow easy fetching of objects by either id or it's name, including numeric string
name
- fixes #5230
This commit is contained in:
Marcin Kuzminski 2017-03-13 12:56:22 +01:00
parent 7ed3e7e047
commit db64ea8c81
2 changed files with 79 additions and 23 deletions

View file

@ -181,29 +181,56 @@ class TestGetRefHash(object):
class TestUserByNameOrError(object):
def test_user_found_by_id(self):
fake_user = Mock(id=123)
patcher = patch('rhodecode.model.user.UserModel.get_user')
with patcher as get_user:
get_user.return_value = fake_user
result = utils.get_user_or_error('123')
assert result == fake_user
patcher = patch('rhodecode.model.user.UserModel.get_by_username')
with patcher as get_by_username:
result = utils.get_user_or_error(123)
assert result == fake_user
def test_user_not_found_by_id_as_str(self):
fake_user = Mock(id=123)
patcher = patch('rhodecode.model.user.UserModel.get_user')
with patcher as get_user:
get_user.return_value = fake_user
patcher = patch('rhodecode.model.user.UserModel.get_by_username')
with patcher as get_by_username:
get_by_username.return_value = None
with pytest.raises(JSONRPCError):
utils.get_user_or_error('123')
def test_user_found_by_name(self):
fake_user = Mock(id=123)
patcher = patch('rhodecode.model.user.UserModel.get_by_username')
with patcher as get_by_username:
get_by_username.return_value = fake_user
result = utils.get_user_or_error('test')
assert result == fake_user
patcher = patch('rhodecode.model.user.UserModel.get_user')
with patcher as get_user:
get_user.return_value = None
patcher = patch('rhodecode.model.user.UserModel.get_by_username')
with patcher as get_by_username:
get_by_username.return_value = fake_user
result = utils.get_user_or_error('test')
assert result == fake_user
def test_user_not_found_by_id(self):
patcher = patch('rhodecode.model.user.UserModel.get_user')
with patcher as get_user:
get_user.return_value = None
with pytest.raises(JSONRPCError) as excinfo:
utils.get_user_or_error('123')
patcher = patch('rhodecode.model.user.UserModel.get_by_username')
with patcher as get_by_username:
get_by_username.return_value = None
expected_message = 'user `123` does not exist'
assert excinfo.value.message == expected_message
with pytest.raises(JSONRPCError) as excinfo:
utils.get_user_or_error(123)
expected_message = 'user `123` does not exist'
assert excinfo.value.message == expected_message
def test_user_not_found_by_name(self):
patcher = patch('rhodecode.model.user.UserModel.get_by_username')
@ -216,8 +243,7 @@ class TestUserByNameOrError(object):
assert excinfo.value.message == expected_message
class TestGetCommitDict:
class TestGetCommitDict(object):
@pytest.mark.parametrize('filename, expected', [
(b'sp\xc3\xa4cial', u'sp\xe4cial'),
(b'sp\xa4cial', u'sp\ufffdcial'),

View file

@ -213,15 +213,19 @@ def get_user_or_error(userid):
:param userid:
"""
from rhodecode.model.user import UserModel
user_model = UserModel()
try:
user = user_model.get_user(int(userid))
except ValueError:
if isinstance(userid, (int, long)):
try:
user = user_model.get_user(userid)
except ValueError:
user = None
else:
user = user_model.get_by_username(userid)
if user is None:
raise JSONRPCError("user `%s` does not exist" % (userid,))
raise JSONRPCError(
'user `%s` does not exist' % (userid,))
return user
@ -232,10 +236,19 @@ def get_repo_or_error(repoid):
:param repoid:
"""
from rhodecode.model.repo import RepoModel
repo_model = RepoModel()
if isinstance(repoid, (int, long)):
try:
repo = repo_model.get_repo(repoid)
except ValueError:
repo = None
else:
repo = repo_model.get_by_repo_name(repoid)
repo = RepoModel().get_repo(repoid)
if repo is None:
raise JSONRPCError('repository `%s` does not exist' % (repoid,))
raise JSONRPCError(
'repository `%s` does not exist' % (repoid,))
return repo
@ -246,8 +259,16 @@ def get_repo_group_or_error(repogroupid):
:param repogroupid:
"""
from rhodecode.model.repo_group import RepoGroupModel
repo_group_model = RepoGroupModel()
if isinstance(repogroupid, (int, long)):
try:
repo_group = repo_group_model._get_repo_group(repogroupid)
except ValueError:
repo_group = None
else:
repo_group = repo_group_model.get_by_group_name(repogroupid)
repo_group = RepoGroupModel()._get_repo_group(repogroupid)
if repo_group is None:
raise JSONRPCError(
'repository group `%s` does not exist' % (repogroupid,))
@ -261,10 +282,19 @@ def get_user_group_or_error(usergroupid):
:param usergroupid:
"""
from rhodecode.model.user_group import UserGroupModel
user_group_model = UserGroupModel()
if isinstance(usergroupid, (int, long)):
try:
user_group = user_group_model.get_group(usergroupid)
except ValueError:
user_group = None
else:
user_group = user_group_model.get_by_name(usergroupid)
user_group = UserGroupModel().get_group(usergroupid)
if user_group is None:
raise JSONRPCError('user group `%s` does not exist' % (usergroupid,))
raise JSONRPCError(
'user group `%s` does not exist' % (usergroupid,))
return user_group