diff options
author | Timotej Lazar <timotej.lazar@fri.uni-lj.si> | 2019-02-20 03:24:54 +0100 |
---|---|---|
committer | Timotej Lazar <timotej.lazar@fri.uni-lj.si> | 2019-02-20 03:24:54 +0100 |
commit | 2dd80251f10b11030abd36e56aff0d1f3a86a754 (patch) | |
tree | 881acb33dc4014487eda4faf8c5d383dcd4fdf1c /kpov_judge/test_task.py | |
parent | d0c2fc09b6dc0c51167f15361d5a4a4c2050f205 (diff) |
Fix and clean up token-based access to params and results
Diffstat (limited to 'kpov_judge/test_task.py')
-rwxr-xr-x | kpov_judge/test_task.py | 61 |
1 files changed, 33 insertions, 28 deletions
diff --git a/kpov_judge/test_task.py b/kpov_judge/test_task.py index 28fc513..a049bee 100755 --- a/kpov_judge/test_task.py +++ b/kpov_judge/test_task.py @@ -153,40 +153,42 @@ if __name__ == '__main__': # get stored task parameters params['task_params'] = params.get('task_params', {}) task_params = params['task_params'].setdefault(task_name, {}) + tokens = params.setdefault('tokens', {}) # ensure we have a submission token if task_url.startswith('http'): - # check if existing token is valid - if task_params.get('token'): - response = urllib.request.urlopen( - '{task_url}/{task_name}/params-token.json'.format(**params), - data=urllib.parse.urlencode({'params': json.dumps(task_params)}).encode()) - response = json.load(io.TextIOWrapper(response)) - if response: - # got a good token - task_params.update(response) - else: - # did not get a token, try again with password - del task_params['token'] - - # authenticate to get a new token - if not task_params.get('token'): - # get the student's ID and password - # TODO clunky, should refactor all argument-getting stuff - fetch_params_meta = {'username': {'descriptions': {'si': 'Uporabniško ime', 'en': 'Username'}}} - params = get_params(params, fetch_params_meta, params['language']) - fetch_pass_meta = {'password': {'descriptions': {'si': 'Geslo', 'en': 'Password'}, 'masked': True}} - params_pass = get_params({}, fetch_pass_meta, params['language']) - + n_tries = 3 + while n_tries > 0: try: - http_auth(task_url, params['username'], params_pass['password']) - response = urllib.request.urlopen('{task_url}/{task_name}/params.json'.format(**params)) - response = json.load(io.TextIOWrapper(response)) - if response: - task_params.update(response) + if tokens.get(task_name): + response = urllib.request.urlopen( + '{task_url}/{task_name}/params.json'.format(**params), + data=urllib.parse.urlencode({'token': tokens.get(task_name)}).encode()) + response = json.load(io.TextIOWrapper(response)) + if response: + # got params + task_params.update(response) + break + else: + # did not get a token, try again with password + del tokens[task_name] + n_tries -= 1 + + if not tokens.get(task_name): + # get the student's ID and password + # TODO clunky, should refactor all argument-getting stuff + fetch_params_meta = {'username': {'descriptions': {'si': 'Uporabniško ime', 'en': 'Username'}}} + params = get_params(params, fetch_params_meta, params['language']) + fetch_pass_meta = {'password': {'descriptions': {'si': 'Geslo', 'en': 'Password'}, 'masked': True}} + params_pass = get_params({}, fetch_pass_meta, params['language']) + + http_auth(task_url, params['username'], params_pass['password']) + response = urllib.request.urlopen('{task_url}/{task_name}/token.json'.format(**params)) + response = json.load(io.TextIOWrapper(response)) + if response: + tokens[task_name] = response['token'] except Exception as ex: print(ex) - exit(2) if basic_args.generate_params: #prejema lahko samo stringe in ne številk (potrebno je str(int) @@ -210,6 +212,7 @@ if __name__ == '__main__': for k in inspect.getargs(task.__code__)[0]: public_params[k] = task_params[k] params['task_params'][params['task_name']] = task_params + # save parameters for the next run with open(basic_args.params_file, 'w') as f: yaml.dump(params, f) @@ -219,7 +222,9 @@ if __name__ == '__main__': print('Running task… ') task_result = task(**public_params) print('Checking task… ') + task_params['token'] = tokens[task_name] # hack to avoid changing task_check signature score, hints = task_check(task_result, task_params) + del task_params['token'] print('Done!') print() print('Score: {}'.format(score)) |