summaryrefslogtreecommitdiff
path: root/kpov_judge/test_task.py
diff options
context:
space:
mode:
Diffstat (limited to 'kpov_judge/test_task.py')
-rwxr-xr-xkpov_judge/test_task.py61
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))