diff --git a/pagure/cli/admin.py b/pagure/cli/admin.py index f3791a2..8b3d9ea 100644 --- a/pagure/cli/admin.py +++ b/pagure/cli/admin.py @@ -286,6 +286,25 @@ def _parser_new_group(subparser): local_parser.set_defaults(func=do_new_group) +def _parser_block_user(subparser): + """ Set up the CLI argument parser for the block-user action. + + :arg subparser: an argparse subparser allowing to have action's specific + arguments + + """ + local_parser = subparser.add_parser( + 'block-user', + help='Prevents an user to interact with this pagure instance until ' + 'the specified date') + local_parser.add_argument('username', help='Name of the user to block') + local_parser.add_argument( + 'date', default=None, + help='Date before which the user is not welcome on this pagure ' + 'instance') + local_parser.set_defaults(func=do_block_user) + + def parse_arguments(args=None): """ Set-up the argument parsing. """ parser = argparse.ArgumentParser( @@ -325,6 +344,9 @@ def parse_arguments(args=None): # new-group _parser_new_group(subparser) + # block-user + _parser_block_user(subparser) + return parser.parse_args(args) @@ -745,6 +767,43 @@ def do_new_group(args): print(msg) +def do_block_user(args): + """ Block the specified user from all interactions with pagure until the + specified date. + + :arg args: the argparse object returned by ``parse_arguments()``. + + """ + + _log.debug('username: %s', args.username) + _log.debug('date: %s', args.date) + + if not args.username: + raise pagure.exceptions.PagureException( + 'An username must be specified') + + try: + date = arrow.get(args.date, 'YYYY-MM-DD').replace(tzinfo='UTC') + except Exception as err: + _log.exception(err) + raise pagure.exceptions.PagureException( + 'Invalid date submitted: %s, not of the format ' + 'YYYY-MM-DD' % args.date + ) + + # Validate user + user = pagure.lib.get_user(session, args.username) + + print('The user `%s` will be blocked from all interaction with this ' + 'pagure instance until: %s.', user.username, date.isoformat()) + if not _ask_confirmation(): + return + + user.refuse_sessions_before = date + session.add(user) + session.commit() + + def main(): """ Start of the application. """ diff --git a/tests/test_pagure_admin.py b/tests/test_pagure_admin.py index 6b6f14d..ea6a0a6 100644 --- a/tests/test_pagure_admin.py +++ b/tests/test_pagure_admin.py @@ -1265,5 +1265,135 @@ class PagureNewGroupTests(tests.Modeltests): groups = pagure.lib.search_groups(self.session) self.assertEqual(len(groups), 0) + +class PagureBlockUserTests(tests.Modeltests): + """ Tests for pagure-admin block-user """ + + populate_db = False + + def setUp(self): + """ Set up the environnment, ran before every tests. """ + super(PagureBlockUserTests, self).setUp() + pagure.cli.admin.session = self.session + + # Create the user pingou + item = pagure.lib.model.User( + user='pingou', + fullname='PY C', + password='foo', + default_email='bar@pingou.com', + ) + self.session.add(item) + item = pagure.lib.model.UserEmail( + user_id=1, + email='bar@pingou.com') + self.session.add(item) + + self.session.commit() + + # Make the imported pagure use the correct db session + pagure.cli.admin.session = self.session + + user = pagure.lib.get_user(self.session, 'pingou') + self.assertIsNone(user.refuse_sessions_before) + + def test_missing_date(self): + """ Test the block-user function of pagure-admin when the no date is + provided. + """ + + args = munch.Munch({ + 'username': 'pingou', + 'date': None, + }) + with self.assertRaises(pagure.exceptions.PagureException) as cm: + pagure.cli.admin.do_block_user(args) + self.assertEqual( + cm.exception.args[0], + 'Invalid date submitted: None, not of the format YYYY-MM-DD' + ) + + user = pagure.lib.get_user(self.session, 'pingou') + self.assertIsNone(user.refuse_sessions_before) + + def test_missing_username(self): + """ Test the block-user function of pagure-admin when the username + is missing from the args. + """ + + args = munch.Munch({ + 'date': '2018-06-11', + 'username': None, + }) + + with self.assertRaises(pagure.exceptions.PagureException) as cm: + pagure.cli.admin.do_block_user(args) + + self.assertEqual( + cm.exception.args[0], + 'An username must be specified' + ) + + user = pagure.lib.get_user(self.session, 'pingou') + self.assertIsNone(user.refuse_sessions_before) + + def test_invalid_username(self): + """ Test the block-user function of pagure-admin when the username + provided does correspond to any user in the DB. + """ + + args = munch.Munch({ + 'date': '2018-06-11', + 'username': 'invalid' + }) + + with self.assertRaises(pagure.exceptions.PagureException) as cm: + pagure.cli.admin.do_block_user(args) + + self.assertEqual( + cm.exception.args[0], + 'No user "invalid" found' + ) + + user = pagure.lib.get_user(self.session, 'pingou') + self.assertIsNone(user.refuse_sessions_before) + + def test_invalide_date(self): + """ Test the block-user function of pagure-admin when the provided + date is incorrect. + """ + + args = munch.Munch({ + 'date': '2018-14-05', + 'username': 'pingou', + }) + + with self.assertRaises(pagure.exceptions.PagureException) as cm: + pagure.cli.admin.do_block_user(args) + + self.assertEqual( + cm.exception.args[0], + 'Invalid date submitted: 2018-14-05, not of the format YYYY-MM-DD' + ) + + user = pagure.lib.get_user(self.session, 'pingou') + self.assertIsNone(user.refuse_sessions_before) + + def test_block_user(self): + """ Test the block-user function of pagure-admin when all arguments + are provided correctly. + """ + + args = munch.Munch({ + 'date': '2050-12-31', + 'username': 'pingou', + }) + + pagure.cli.admin.do_block_user(args) + + user = pagure.lib.get_user(self.session, 'pingou') + self.assertIsNone(user.refuse_sessions_before) + + if __name__ == '__main__': unittest.main(verbosity=2)