Server returns 500 error when no tokens available
Issue template
Description: The server returns 500 error when user has no tokens available on the task.
Steps to reproduce:
- Create a contest with a finite-token task (I followed the instructions to import
con_test) - Adjust the tokens parameters of the task as follows, so that it is easier to run out of tokens: Token mode: finite Maximum number of tokens: Minimum interval between tokens: 10 Initial number of tokens: 2 Token generation number: 1 Token generation period: 1 Maximum accumulated tokens: 2
- Login as user, submit at least 3 submissions, and try to run out of tokens.
Expected: It should show the submissions page as before, and tell user that no tokens available now.
Actual: A 500 error.
Logs
~/cms/log/ContestWebServer-0/2025-09-07-09-12-21.log
Relevant lines:
2025-09-07 09:16:12,560 - ERROR [Contest,0 9 base::write_error] Uncaught exception (UndefinedError("'tokens_info' is undefined")) while processing a request: Traceback (most recent call last):
File "/home/cmsuser/cms/lib/python3.12/site-packages/tornado/web.py", line 1510, in _execute
result = method(*self.path_args, **self.path_kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/cmsuser/cms/lib/python3.12/site-packages/tornado/web.py", line 2898, in wrapper
return method(self, *args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/cmsuser/cms/lib/python3.12/site-packages/cms/server/contest/phase_management.py", line 240, in wrapped
return func(self, *args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/cmsuser/cms/lib/python3.12/site-packages/cms/server/util.py", line 64, in wrapped_f
f(self, *args)
File "/home/cmsuser/cms/lib/python3.12/site-packages/cms/server/contest/handlers/tasksubmission.py", line 179, in get
self.render("task_submissions.html",
File "/home/cmsuser/cms/lib/python3.12/site-packages/cms/server/contest/handlers/base.py", line 91, in render
for chunk in t.generate(**params):
File "/home/cmsuser/cms/lib/python3.12/site-packages/jinja2/environment.py", line 1045, in generate
yield self.environment.handle_exception(exc_info, True)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/cmsuser/cms/lib/python3.12/site-packages/jinja2/environment.py", line 780, in handle_exception
reraise(exc_type, exc_value, tb)
File "/home/cmsuser/cms/lib/python3.12/site-packages/jinja2/_compat.py", line 37, in reraise
raise value.with_traceback(tb)
File "/home/cmsuser/cms/lib/python3.12/site-packages/cms/server/contest/templates/task_submissions.html", line 24, in <module>
{% set can_play_token_now = can_play_token and tokens_info[2] is none %}
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/cmsuser/cms/lib/python3.12/site-packages/jinja2/environment.py", line 1039, in generate
for event in self.root_render_func(self.new_context(vars)):
File "/home/cmsuser/cms/lib/python3.12/site-packages/cms/server/contest/templates/task_submissions.html", line 46, in root
return;
File "/home/cmsuser/cms/lib/python3.12/site-packages/cms/server/contest/templates/contest.html", line 14, in root
{% for extension in (lang|to_language).source_extensions %}
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/cmsuser/cms/lib/python3.12/site-packages/cms/server/contest/templates/base.html", line 27, in root
File "/home/cmsuser/cms/lib/python3.12/site-packages/cms/server/contest/templates/contest.html", line 315, in block_body
File "/home/cmsuser/cms/lib/python3.12/site-packages/cms/server/contest/templates/task_submissions.html", line 315, in block_core
{% endif %}
File "/home/cmsuser/cms/lib/python3.12/site-packages/jinja2/runtime.py", line 262, in call
return __obj(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^
File "/home/cmsuser/cms/lib/python3.12/site-packages/jinja2/runtime.py", line 570, in __call__
return self._invoke(arguments, autoescape)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/cmsuser/cms/lib/python3.12/site-packages/jinja2/asyncsupport.py", line 110, in _invoke
return original_invoke(self, arguments, autoescape)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/cmsuser/cms/lib/python3.12/site-packages/jinja2/runtime.py", line 574, in _invoke
rv = self._func(*arguments)
^^^^^^^^^^^^^^^^^^^^^^
File "/home/cmsuser/cms/lib/python3.12/site-packages/cms/server/contest/templates/macro/submission.html", line 215, in macro
{% endif %}
^
File "/home/cmsuser/cms/lib/python3.12/site-packages/jinja2/runtime.py", line 262, in call
return __obj(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^
File "/home/cmsuser/cms/lib/python3.12/site-packages/jinja2/runtime.py", line 570, in __call__
return self._invoke(arguments, autoescape)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/cmsuser/cms/lib/python3.12/site-packages/jinja2/asyncsupport.py", line 110, in _invoke
return original_invoke(self, arguments, autoescape)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/cmsuser/cms/lib/python3.12/site-packages/jinja2/runtime.py", line 574, in _invoke
rv = self._func(*arguments)
^^^^^^^^^^^^^^^^^^^^^^
File "/home/cmsuser/cms/lib/python3.12/site-packages/cms/server/contest/templates/macro/submission.html", line 499, in macro
File "/home/cmsuser/cms/lib/python3.12/site-packages/jinja2/environment.py", line 411, in getitem
return obj[argument]
~~~^^^^^^^^^^
jinja2.exceptions.UndefinedError: 'tokens_info' is undefined
2025-09-07 09:16:12,560 - ERROR [Contest,0 9 web::log_request] 500 GET /tasks/batch/submissions?submission_id=3ZBQOjcz2LQJ17g05Rl7JbX4xTFFU6cU0mfB0askSK0. (172.18.0.1) 25.79ms
It seems to be related with https://github.com/cms-dev/cms/blob/main/cms/server/contest/templates/macro/submission.html#L239
System Information
CMS version: main How was CMS installed: docker
Out of curiosity, are you planning to actually use tokens in a contest? Or were you just exploring CMS features?
Tokens are kind of a weird feature, they are poorly tested and we've been discussing removing them altogether. But if anyone actually wants them, then we can reconsider.
Maybe the latter, since I'm just checking whether the translated token description matches its behavior. I haven't held or joined any official contests using the token feature.