Timed Exams breaking in Lilac with edx-proctoring version update

Hi all!

We are using timed exams (without proctoring) and there was fix added to lilac.master so we obviously wanted to pull that into our platforms however we had to revert it because we ran into an issue.
Looks like it’s a fairly big version bump for edx-proctoring and it contains migrations as well…

When we added the change the learners were able to start the timed exams but unable to submit an attempt. When hitting “Yes, submit my timed exam”, nothing happens, the timer keeps counting and we see in the logs the following:

Traceback:

File "/edx/app/edxapp/venvs/edxapp/lib/python3.8/site-packages/django/core/handlers/exception.py" in inner
  34.             response = get_response(request)

File "/edx/app/edxapp/venvs/edxapp/lib/python3.8/site-packages/django/core/handlers/base.py" in _get_response
  115.                 response = self.process_exception_by_middleware(e, request)

File "/edx/app/edxapp/venvs/edxapp/lib/python3.8/site-packages/django/core/handlers/base.py" in _get_response
  113.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "/edx/app/edxapp/venvs/edxapp/lib/python3.8/site-packages/django/views/decorators/csrf.py" in wrapped_view
  54.         return view_func(*args, **kwargs)

File "/edx/app/edxapp/venvs/edxapp/lib/python3.8/site-packages/django/views/generic/base.py" in view
  71.             return self.dispatch(request, *args, **kwargs)

File "/edx/app/edxapp/venvs/edxapp/lib/python3.8/site-packages/rest_framework/views.py" in dispatch
  509.             response = self.handle_exception(exc)

File "/edx/app/edxapp/venvs/edxapp/lib/python3.8/site-packages/edx_proctoring/views.py" in handle_exception
  189.             resp = super().handle_exception(exc)

File "/edx/app/edxapp/venvs/edxapp/lib/python3.8/site-packages/rest_framework/views.py" in handle_exception
  469.             self.raise_uncaught_exception(exc)

File "/edx/app/edxapp/venvs/edxapp/lib/python3.8/site-packages/rest_framework/views.py" in raise_uncaught_exception
  480.         raise exc

File "/edx/app/edxapp/venvs/edxapp/lib/python3.8/site-packages/rest_framework/views.py" in dispatch
  506.             response = handler(request, *args, **kwargs)

File "/edx/app/edxapp/venvs/edxapp/lib/python3.8/site-packages/edx_proctoring/views.py" in put
  1198.             exam_attempt_id = update_attempt_status(

File "/edx/app/edxapp/venvs/edxapp/lib/python3.8/site-packages/edx_proctoring/api.py" in update_attempt_status
  1411.     exam_attempt_obj.save()

File "/edx/app/edxapp/venvs/edxapp/lib/python3.8/site-packages/model_utils/models.py" in save
  38.         super().save(*args, **kwargs)

File "/edx/app/edxapp/venvs/edxapp/lib/python3.8/site-packages/django/db/models/base.py" in save
  743.         self.save_base(using=using, force_insert=force_insert,

File "/edx/app/edxapp/venvs/edxapp/lib/python3.8/site-packages/django/db/models/base.py" in save_base
  767.             pre_save.send(

File "/edx/app/edxapp/venvs/edxapp/lib/python3.8/site-packages/django/dispatch/dispatcher.py" in send
  173.         return [

File "/edx/app/edxapp/venvs/edxapp/lib/python3.8/site-packages/django/dispatch/dispatcher.py" in <listcomp>
  174.             (receiver, receiver(signal=self, sender=sender, **named))

File "/edx/app/edxapp/venvs/edxapp/lib/python3.8/site-packages/edx_proctoring/handlers.py" in on_attempt_changed
  119.                     instructor_service.complete_student_attempt(username, content_id)

Exception Type: AttributeError at /api/edx_proctoring/v1/proctored_exam/attempt/220
Exception Value: 'InstructorService' object has no attribute 'complete_student_attempt'

I could also reproduce the error in devstack, both edx-devstack and tutor.
Are there any additional steps one has to take in order to apply this change without breaking the exams?

Thanks!

What proctoring service are you using, out of curiousity?

Perhaps @alangston has some clues about what’s happening here?

@e0d we are using timed exams without proctoring, not sure if that answers your question, I can look into more specifics if not. Thanks!