cms icon indicating copy to clipboard operation
cms copied to clipboard

Server returns 500 error when no tokens available

Open OmeletWithoutEgg opened this issue 3 months ago • 2 comments

Issue template

Description: The server returns 500 error when user has no tokens available on the task.

Steps to reproduce:

  1. Create a contest with a finite-token task (I followed the instructions to import con_test)
  2. 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
  3. 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

OmeletWithoutEgg avatar Sep 07 '25 09:09 OmeletWithoutEgg

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.

prandla avatar Sep 07 '25 13:09 prandla

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.

OmeletWithoutEgg avatar Sep 07 '25 13:09 OmeletWithoutEgg