zesje issueshttps://gitlab.kwant-project.org/zesje/zesje/-/issues2023-11-15T11:08:48Zhttps://gitlab.kwant-project.org/zesje/zesje/-/issues/695Celery workers still failing2023-11-15T11:08:48ZAnton AkhmerovCelery workers still failingOn v0.4.9 I see the following traceback in celery logs when multiple tasks are running.
```python
[2023-11-15 09:43:47,064: ERROR/ForkPoolWorker-2] Task zesje.scans.process_scan[c0123198-e0ce-4ab4-9707-7815826b7903] raised unexpected: P...On v0.4.9 I see the following traceback in celery logs when multiple tasks are running.
```python
[2023-11-15 09:43:47,064: ERROR/ForkPoolWorker-2] Task zesje.scans.process_scan[c0123198-e0ce-4ab4-9707-7815826b7903] raised unexpected: PendingRollbackError("Can't reconnect until invalid transaction is rolled back.")
Traceback (most recent call last):
File "/app/zesje/scans.py", line 100, in _process_scan
report_progress(f"Processing page {number} / {total}")
File "/app/zesje/scans.py", line 187, in write_scan_status
scan = Scan.query.get(scan_id)
File "<string>", line 2, in get
File "/opt/conda/lib/python3.9/site-packages/sqlalchemy/util/deprecations.py", line 468, in warned
return fn(*args, **kwargs)
File "/opt/conda/lib/python3.9/site-packages/sqlalchemy/orm/query.py", line 947, in get
return self._get_impl(ident, loading.load_on_pk_identity)
File "/opt/conda/lib/python3.9/site-packages/sqlalchemy/orm/query.py", line 951, in _get_impl
return self.session._get_impl(
File "/opt/conda/lib/python3.9/site-packages/sqlalchemy/orm/session.py", line 2942, in _get_impl
instance = self._identity_lookup(
File "/opt/conda/lib/python3.9/site-packages/sqlalchemy/orm/session.py", line 2220, in _identity_lookup
return loading.get_from_identity(self, mapper, key, passive)
File "/opt/conda/lib/python3.9/site-packages/sqlalchemy/orm/loading.py", line 379, in get_from_identity
state._load_expired(state, passive)
File "/opt/conda/lib/python3.9/site-packages/sqlalchemy/orm/state.py", line 712, in _load_expired
self.manager.expired_attribute_loader(self, toload, passive)
File "/opt/conda/lib/python3.9/site-packages/sqlalchemy/orm/loading.py", line 1451, in load_scalar_attributes
result = load_on_ident(
File "/opt/conda/lib/python3.9/site-packages/sqlalchemy/orm/loading.py", line 407, in load_on_ident
return load_on_pk_identity(
File "/opt/conda/lib/python3.9/site-packages/sqlalchemy/orm/loading.py", line 530, in load_on_pk_identity
session.execute(
File "/opt/conda/lib/python3.9/site-packages/sqlalchemy/orm/session.py", line 1717, in execute
result = conn._execute_20(statement, params or {}, execution_options)
File "/opt/conda/lib/python3.9/site-packages/sqlalchemy/engine/base.py", line 1710, in _execute_20
return meth(self, args_10style, kwargs_10style, execution_options)
File "/opt/conda/lib/python3.9/site-packages/sqlalchemy/sql/elements.py", line 334, in _execute_on_connection
return connection._execute_clauseelement(
File "/opt/conda/lib/python3.9/site-packages/sqlalchemy/engine/base.py", line 1577, in _execute_clauseelement
ret = self._execute_context(
File "/opt/conda/lib/python3.9/site-packages/sqlalchemy/engine/base.py", line 1808, in _execute_context
conn = self._revalidate_connection()
File "/opt/conda/lib/python3.9/site-packages/sqlalchemy/engine/base.py", line 650, in _revalidate_connection
self._invalid_transaction()
File "/opt/conda/lib/python3.9/site-packages/sqlalchemy/engine/base.py", line 622, in _invalid_transaction
raise exc.PendingRollbackError(
sqlalchemy.exc.PendingRollbackError: Can't reconnect until invalid transaction is rolled back. (Background on this error at: https://sqlalche.me/e/14/8s2b)
```https://gitlab.kwant-project.org/zesje/zesje/-/issues/694App unconditionally executes DB statements on startup2023-11-22T11:03:38ZAnton AkhmerovApp unconditionally executes DB statements on startupWith the current master, running `yarn dev:mysql-init` fails with the error `pymysql.err.ProgrammingError: (1146, "Table 'course.grader' doesn't exist")`. This also occurs in production.
<details><summary>Full traceback</summary>
```
...With the current master, running `yarn dev:mysql-init` fails with the error `pymysql.err.ProgrammingError: (1146, "Table 'course.grader' doesn't exist")`. This also occurs in production.
<details><summary>Full traceback</summary>
```
yarn dev:mysql-init (zesje-dev)
yarn run v1.22.19
$ yarn dev:mysql create && sleep 2 && yarn dev:mysql-migrate
$ ZESJE_SETTINGS=$(pwd)/zesje_dev_cfg.py python3 -m zesje.mysql create
Initializing MySQL...
mysqld --defaults-file=/home/anton/Bot/coding/zesje/mysql.conf --datadir=/home/anton/Bot/coding/zesje/data-dev/mysql --basedir=$CONDA_PREFIX/bin --lc-messages-dir=$CONDA_PREFIX/share/mysql --plugin-dir=$CONDA_PREFIX/lib/plugin --init-file=/home/anton/Bot/coding/zesje/myinit.sql --initialize
$ yarn dev:mysql is-running && (yarn dev:migrate || true) || ((yarn dev:mysql start && sleep 2 && yarn dev:migrate); yarn dev:mysql stop)
$ ZESJE_SETTINGS=$(pwd)/zesje_dev_cfg.py python3 -m zesje.mysql is-running
MySQL is not running
error Command failed with exit code 1.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.
$ ZESJE_SETTINGS=$(pwd)/zesje_dev_cfg.py python3 -m zesje.mysql start
mysqld --defaults-file=/home/anton/Bot/coding/zesje/mysql.conf --datadir=/home/anton/Bot/coding/zesje/data-dev/mysql --basedir=$CONDA_PREFIX/bin --lc-messages-dir=$CONDA_PREFIX/share/mysql --plugin-dir=$CONDA_PREFIX/lib/plugin --gdb
$ ZESJE_SETTINGS=$(pwd)/zesje_dev_cfg.py FLASK_APP=zesje.wsgi:app flask db upgrade
Traceback (most recent call last):
File "/home/anton/micromamba/envs/zesje-dev/lib/python3.9/site-packages/sqlalchemy/engine/base.py", line 1910, in _execute_context
self.dialect.do_execute(
File "/home/anton/micromamba/envs/zesje-dev/lib/python3.9/site-packages/sqlalchemy/engine/default.py", line 736, in do_execute
cursor.execute(statement, parameters)
File "/home/anton/micromamba/envs/zesje-dev/lib/python3.9/site-packages/pymysql/cursors.py", line 153, in execute
result = self._query(query)
File "/home/anton/micromamba/envs/zesje-dev/lib/python3.9/site-packages/pymysql/cursors.py", line 322, in _query
conn.query(q)
File "/home/anton/micromamba/envs/zesje-dev/lib/python3.9/site-packages/pymysql/connections.py", line 558, in query
self._affected_rows = self._read_query_result(unbuffered=unbuffered)
File "/home/anton/micromamba/envs/zesje-dev/lib/python3.9/site-packages/pymysql/connections.py", line 822, in _read_query_result
result.read()
File "/home/anton/micromamba/envs/zesje-dev/lib/python3.9/site-packages/pymysql/connections.py", line 1200, in read
first_packet = self.connection._read_packet()
File "/home/anton/micromamba/envs/zesje-dev/lib/python3.9/site-packages/pymysql/connections.py", line 772, in _read_packet
packet.raise_for_error()
File "/home/anton/micromamba/envs/zesje-dev/lib/python3.9/site-packages/pymysql/protocol.py", line 221, in raise_for_error
err.raise_mysql_exception(self._data)
File "/home/anton/micromamba/envs/zesje-dev/lib/python3.9/site-packages/pymysql/err.py", line 143, in raise_mysql_exception
raise errorclass(errno, errval)
pymysql.err.ProgrammingError: (1146, "Table 'course.grader' doesn't exist")
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "/home/anton/micromamba/envs/zesje-dev/bin/flask", line 8, in <module>
sys.exit(main())
File "/home/anton/micromamba/envs/zesje-dev/lib/python3.9/site-packages/flask/cli.py", line 1064, in main
cli.main()
File "/home/anton/micromamba/envs/zesje-dev/lib/python3.9/site-packages/click/core.py", line 1078, in main
rv = self.invoke(ctx)
File "/home/anton/micromamba/envs/zesje-dev/lib/python3.9/site-packages/click/core.py", line 1688, in invoke
return _process_result(sub_ctx.command.invoke(sub_ctx))
File "/home/anton/micromamba/envs/zesje-dev/lib/python3.9/site-packages/click/core.py", line 1688, in invoke
return _process_result(sub_ctx.command.invoke(sub_ctx))
File "/home/anton/micromamba/envs/zesje-dev/lib/python3.9/site-packages/click/core.py", line 1434, in invoke
return ctx.invoke(self.callback, **ctx.params)
File "/home/anton/micromamba/envs/zesje-dev/lib/python3.9/site-packages/click/core.py", line 783, in invoke
return __callback(*args, **kwargs)
File "/home/anton/micromamba/envs/zesje-dev/lib/python3.9/site-packages/click/decorators.py", line 33, in new_func
return f(get_current_context(), *args, **kwargs)
File "/home/anton/micromamba/envs/zesje-dev/lib/python3.9/site-packages/flask/cli.py", line 355, in decorator
app = __ctx.ensure_object(ScriptInfo).load_app()
File "/home/anton/micromamba/envs/zesje-dev/lib/python3.9/site-packages/flask/cli.py", line 309, in load_app
app = locate_app(import_name, name)
File "/home/anton/micromamba/envs/zesje-dev/lib/python3.9/site-packages/flask/cli.py", line 219, in locate_app
__import__(module_name)
File "/home/anton/Bot/coding/zesje/zesje/wsgi.py", line 4, in <module>
app = factory.create_app(celery=celery)
File "/home/anton/Bot/coding/zesje/zesje/factory.py", line 42, in create_app
if Grader.query.filter(Grader.oauth_id == app.config["OWNER_OAUTH_ID"]).one_or_none() is None:
File "/home/anton/micromamba/envs/zesje-dev/lib/python3.9/site-packages/sqlalchemy/orm/query.py", line 2850, in one_or_none
return self._iter().one_or_none()
File "/home/anton/micromamba/envs/zesje-dev/lib/python3.9/site-packages/sqlalchemy/orm/query.py", line 2916, in _iter
result = self.session.execute(
File "/home/anton/micromamba/envs/zesje-dev/lib/python3.9/site-packages/sqlalchemy/orm/session.py", line 1717, in execute
result = conn._execute_20(statement, params or {}, execution_options)
File "/home/anton/micromamba/envs/zesje-dev/lib/python3.9/site-packages/sqlalchemy/engine/base.py", line 1710, in _execute_20
return meth(self, args_10style, kwargs_10style, execution_options)
File "/home/anton/micromamba/envs/zesje-dev/lib/python3.9/site-packages/sqlalchemy/sql/elements.py", line 334, in _execute_on_connection
return connection._execute_clauseelement(
File "/home/anton/micromamba/envs/zesje-dev/lib/python3.9/site-packages/sqlalchemy/engine/base.py", line 1577, in _execute_clauseelement
ret = self._execute_context(
File "/home/anton/micromamba/envs/zesje-dev/lib/python3.9/site-packages/sqlalchemy/engine/base.py", line 1953, in _execute_context
self._handle_dbapi_exception(
File "/home/anton/micromamba/envs/zesje-dev/lib/python3.9/site-packages/sqlalchemy/engine/base.py", line 2134, in _handle_dbapi_exception
util.raise_(
File "/home/anton/micromamba/envs/zesje-dev/lib/python3.9/site-packages/sqlalchemy/util/compat.py", line 211, in raise_
raise exception
File "/home/anton/micromamba/envs/zesje-dev/lib/python3.9/site-packages/sqlalchemy/engine/base.py", line 1910, in _execute_context
self.dialect.do_execute(
File "/home/anton/micromamba/envs/zesje-dev/lib/python3.9/site-packages/sqlalchemy/engine/default.py", line 736, in do_execute
cursor.execute(statement, parameters)
File "/home/anton/micromamba/envs/zesje-dev/lib/python3.9/site-packages/pymysql/cursors.py", line 153, in execute
result = self._query(query)
File "/home/anton/micromamba/envs/zesje-dev/lib/python3.9/site-packages/pymysql/cursors.py", line 322, in _query
conn.query(q)
File "/home/anton/micromamba/envs/zesje-dev/lib/python3.9/site-packages/pymysql/connections.py", line 558, in query
self._affected_rows = self._read_query_result(unbuffered=unbuffered)
File "/home/anton/micromamba/envs/zesje-dev/lib/python3.9/site-packages/pymysql/connections.py", line 822, in _read_query_result
result.read()
File "/home/anton/micromamba/envs/zesje-dev/lib/python3.9/site-packages/pymysql/connections.py", line 1200, in read
first_packet = self.connection._read_packet()
File "/home/anton/micromamba/envs/zesje-dev/lib/python3.9/site-packages/pymysql/connections.py", line 772, in _read_packet
packet.raise_for_error()
File "/home/anton/micromamba/envs/zesje-dev/lib/python3.9/site-packages/pymysql/protocol.py", line 221, in raise_for_error
err.raise_mysql_exception(self._data)
File "/home/anton/micromamba/envs/zesje-dev/lib/python3.9/site-packages/pymysql/err.py", line 143, in raise_mysql_exception
raise errorclass(errno, errval)
sqlalchemy.exc.ProgrammingError: (pymysql.err.ProgrammingError) (1146, "Table 'course.grader' doesn't exist")
[SQL: SELECT grader.id AS grader_id, grader.name AS grader_name, grader.oauth_id AS grader_oauth_id, grader.internal AS grader_internal
FROM grader
WHERE grader.oauth_id = %(oauth_id_1)s]
[parameters: {'oauth_id_1': 'admin@admin'}]
```
</details>https://gitlab.kwant-project.org/zesje/zesje/-/issues/692Uncaught error in oauth2023-11-08T14:53:42ZAnton AkhmerovUncaught error in oauthI have observed the following error message in the logs on the current master branch:
```
Traceback (most recent call last):
File "/opt/conda/lib/python3.9/site-packages/flask/app.py", line 1484, in full_dispatch_request
rv = self....I have observed the following error message in the logs on the current master branch:
```
Traceback (most recent call last):
File "/opt/conda/lib/python3.9/site-packages/flask/app.py", line 1484, in full_dispatch_request
rv = self.dispatch_request()
File "/opt/conda/lib/python3.9/site-packages/flask/app.py", line 1469, in dispatch_request
return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args)
File "/opt/conda/lib/python3.9/site-packages/flask/views.py", line 109, in view
return current_app.ensure_sync(self.dispatch_request)(**kwargs)
File "/opt/conda/lib/python3.9/site-packages/flask/views.py", line 190, in dispatch_request
return current_app.ensure_sync(meth)(**kwargs)
File "/app/zesje/api/oauth.py", line 56, in get
user_url = session["oauth_userurl"]
```
While the users did not report disruptions, this warrants investigation.https://gitlab.kwant-project.org/zesje/zesje/-/issues/691graded_at may be empty even if grader is set2023-10-04T10:55:27ZAnton Akhmerovgraded_at may be empty even if grader is setThis causes statistics to failThis causes statistics to failhttps://gitlab.kwant-project.org/zesje/zesje/-/issues/690Stop processing scans / wrong files uploaded2023-10-24T07:58:10ZDion GijswijtStop processing scans / wrong files uploadedI accidentally uploaded wrong pdfs. Since they have no QR code, processing seems to keep running forever.
Is there a way to stop processing all uploaded files in the queue?I accidentally uploaded wrong pdfs. Since they have no QR code, processing seems to keep running forever.
Is there a way to stop processing all uploaded files in the queue?https://gitlab.kwant-project.org/zesje/zesje/-/issues/689Remove student sheets from an exam2023-04-26T09:59:48Zjos thijssenRemove student sheets from an examI was stupid enough to include a few exams that were not used by any students.
No problem to handle in zesje up to the point where it comes to e-mailing the results. Then all the scripts need to be validated.
I had to create fake users...I was stupid enough to include a few exams that were not used by any students.
No problem to handle in zesje up to the point where it comes to e-mailing the results. Then all the scripts need to be validated.
I had to create fake users (not so bad), with fake email addresses (bad: maybe the server could get blacklisted(?)).
I guess it will be not too difficult to send the results to the students of all validated copies, and issue a warning that not all exams were sent as a result of a few not being validated.https://gitlab.kwant-project.org/zesje/zesje/-/issues/688Follow-up from "Scan processing deadlocks"2023-04-03T00:07:44ZAnton AkhmerovFollow-up from "Scan processing deadlocks"The following discussion from !431 should be addressed: investigate where else the race condition can cause deadlocksThe following discussion from !431 should be addressed: investigate where else the race condition can cause deadlockshttps://gitlab.kwant-project.org/zesje/zesje/-/issues/681Catch errors in uploaded csv2023-04-14T09:15:46ZAnton AkhmerovCatch errors in uploaded csvTrying to upload an invalid csv results in a 500 with this error.
```
Traceback (most recent call last):
File "/opt/conda/envs/zesje-dev/lib/python3.8/site-packages/flask/app.py", line 1516, in full_dispatch_request
rv = self.dispa...Trying to upload an invalid csv results in a 500 with this error.
```
Traceback (most recent call last):
File "/opt/conda/envs/zesje-dev/lib/python3.8/site-packages/flask/app.py", line 1516, in full_dispatch_request
rv = self.dispatch_request()
File "/opt/conda/envs/zesje-dev/lib/python3.8/site-packages/flask/app.py", line 1502, in dispatch_request
return self.ensure_sync(self.view_functions[rule.endpoint])(**req.view_args)
File "/opt/conda/envs/zesje-dev/lib/python3.8/site-packages/flask_restful/__init__.py", line 467, in wrapper
resp = resource(*args, **kwargs)
File "/opt/conda/envs/zesje-dev/lib/python3.8/site-packages/flask/views.py", line 84, in view
return current_app.ensure_sync(self.dispatch_request)(*args, **kwargs)
File "/opt/conda/envs/zesje-dev/lib/python3.8/site-packages/flask_restful/__init__.py", line 582, in dispatch_request
resp = meth(*args, **kwargs)
File "/app/zesje/api/students.py", line 136, in post
student = _row_to_student(row)
File "/app/zesje/api/students.py", line 175, in _row_to_student
first_name=row['First Name'],
File "/opt/conda/envs/zesje-dev/lib/python3.8/site-packages/pandas/core/series.py", line 981, in __getitem__
return self._get_value(key)
File "/opt/conda/envs/zesje-dev/lib/python3.8/site-packages/pandas/core/series.py", line 1089, in _get_value
loc = self.index.get_loc(label)
File "/opt/conda/envs/zesje-dev/lib/python3.8/site-packages/pandas/core/indexes/base.py", line 3805, in get_loc
raise KeyError(key) from err
KeyError: 'First Name'
```
we catch it and be more informativehttps://gitlab.kwant-project.org/zesje/zesje/-/issues/679Score of feedback options is nullable in the database2022-11-16T11:44:52ZHugo KerstensScore of feedback options is nullable in the databaseThe field `FeedbackOption.score` should not be nullable:
- A null value is not used anywhere in the code
- The front-end doesn't like it and throws errors.
- The root feedback option has score 0
- This originates from before SQLAlchemy
...The field `FeedbackOption.score` should not be nullable:
- A null value is not used anywhere in the code
- The front-end doesn't like it and throws errors.
- The root feedback option has score 0
- This originates from before SQLAlchemy
We should:
- Make it no longer nullable
- Add a migration that fills all null values with `0`.https://gitlab.kwant-project.org/zesje/zesje/-/issues/678Upload at wrong exam automatically fixed2022-11-10T20:37:40ZFokko van de BultUpload at wrong exam automatically fixedSomehow I was working in the first partial exam (didn't I always go to the last created exam when logging in? This may have changed in the recent update). Thus I uploaded the scans of the second partial exam in the first partial exam. Of...Somehow I was working in the first partial exam (didn't I always go to the last created exam when logging in? This may have changed in the recent update). Thus I uploaded the scans of the second partial exam in the first partial exam. Of course they all failed because "PDF is not from this exam". However, it would be nice if zesje would recognize the pdf as from another exam and add it there. Or at least if I could stop the processing of these uploads (as now I had to wait before it had concluded all pages were from a different exam before it would start processing the re-uploads for the second partial exam).https://gitlab.kwant-project.org/zesje/zesje/-/issues/675Clamp problem margins to page size when adding MC options2023-04-14T09:17:12ZAdrià LabayClamp problem margins to page size when adding MC optionsThe following discussion from !401 should be addressed:
- [ ] @anton-akhmerov started a [discussion](https://gitlab.kwant-project.org/zesje/zesje/-/merge_requests/401#note_62706):
> :rofl:
>
> ![image](/uploads/eaba14f8e6...The following discussion from !401 should be addressed:
- [ ] @anton-akhmerov started a [discussion](https://gitlab.kwant-project.org/zesje/zesje/-/merge_requests/401#note_62706):
> :rofl:
>
> ![image](/uploads/eaba14f8e643605e584472d365263d4a/image.png)
>
> EDIT: I say we can fix it in the next iterations, this bug was technically already present on master, and it's only becoming less severe.https://gitlab.kwant-project.org/zesje/zesje/-/issues/674More back-end checks for merging copies2022-10-27T13:15:51ZHugo KerstensMore back-end checks for merging copiesThe following discussion from !380 should be addressed:
- [ ] @Hugo started a [discussion](https://gitlab.kwant-project.org/zesje/zesje/-/merge_requests/380#note_56105):
> This MR exactly mimicks the old front-end checks. While wr...The following discussion from !380 should be addressed:
- [ ] @Hugo started a [discussion](https://gitlab.kwant-project.org/zesje/zesje/-/merge_requests/380#note_56105):
> This MR exactly mimicks the old front-end checks. While writing the tests, I realized we only warn the user whether we will modify the newly merged submission.
>
> However, when transferring a copy from submission A to B, submission A will be modified and thus ungraded, but it won't trigger any warning. IMO we should catch this as well and warn the user.
>
> We could either fix it in this MR, or make a new issue for it.https://gitlab.kwant-project.org/zesje/zesje/-/issues/673Allow deleting submissions2022-10-29T16:44:50ZAnton AkhmerovAllow deleting submissionsSometimes users accidentally upload empty submissions. Having unassigned submissions prevents sending emails. Right now the workaround is to create a nonexistent student without email and assign the wrongly uploaded submissions to that s...Sometimes users accidentally upload empty submissions. Having unassigned submissions prevents sending emails. Right now the workaround is to create a nonexistent student without email and assign the wrongly uploaded submissions to that student.
We should allow deleting submissions.https://gitlab.kwant-project.org/zesje/zesje/-/issues/672Rethink MultipleChoiceOption API: from frontend to backend2023-04-14T09:16:45ZAdrià LabayRethink MultipleChoiceOption API: from frontend to backendThe following discussion from !393 should be addressed:
- [ ] @anton-akhmerov started a [discussion](https://gitlab.kwant-project.org/zesje/zesje/-/merge_requests/393#note_62610): (+3 comments)
> Let us also update FO names when s...The following discussion from !393 should be addressed:
- [ ] @anton-akhmerov started a [discussion](https://gitlab.kwant-project.org/zesje/zesje/-/merge_requests/393#note_62610): (+3 comments)
> Let us also update FO names when switching label types. This seems to belong here too.https://gitlab.kwant-project.org/zesje/zesje/-/issues/671Searching students in grade view is broken2022-10-31T16:58:44ZHugo KerstensSearching students in grade view is brokenSearching student relies using the grade navigation in the grade view relies on the front-end having the full student data available for each submission. This data is requested from the `api/exams/<exam_id>/?only_metadata=true` endpoint ...Searching student relies using the grade navigation in the grade view relies on the front-end having the full student data available for each submission. This data is requested from the `api/exams/<exam_id>/?only_metadata=true` endpoint in the `Grade` component, but since commit a8e6e83708912687dfbf445c0f0b6e09547fb290, this no longer returns the full student data per submission, just the submission id and student id.
**_Note: this only applies to exams which have anonymous grading set to false._**
I see two options:
1. Add the student names back to the exam metadata endpoint. (How large is the performance impact?)
2. Add a separate API call in the grade navigation endpoint once it is focused, which loads the student names. Could add `only_metadata` option to the `api/submissions/<exam_id>` endpoint, which excludes solution data.https://gitlab.kwant-project.org/zesje/zesje/-/issues/664Code optimisation2022-10-24T13:45:42ZAdrià LabayCode optimisationSome parts of `zesje` are time-consuming and impact the front end, slowing the user experience.
For instance, use [`flask-monitoringdashboard`](https://flask-monitoringdashboard.readthedocs.io/en/latest/installation.html#installing-the-...Some parts of `zesje` are time-consuming and impact the front end, slowing the user experience.
For instance, use [`flask-monitoringdashboard`](https://flask-monitoringdashboard.readthedocs.io/en/latest/installation.html#installing-the-flask-monitoringdashboard-package) to find the most time-consuming functions. This library opens a new endpoint at [127.0.0.1:5000/dashboard/](http://127.0.0.1:5000/dashboard/) where one can inspect the code for each endpoint.https://gitlab.kwant-project.org/zesje/zesje/-/issues/662Show warning when looking at answer with multiple submissions assigned2022-10-31T11:05:25ZStefan HugtenburgShow warning when looking at answer with multiple submissions assignedIn some browsers the scrollbar only shows up when you hover over the image, meaning it is easy to miss that this exam has two (or more) submissions assigned. Especially for longer problems that can lead to incorrectly marking the answer ...In some browsers the scrollbar only shows up when you hover over the image, meaning it is easy to miss that this exam has two (or more) submissions assigned. Especially for longer problems that can lead to incorrectly marking the answer as blank.
Even with the scrollbar, noticing that this is actually 2 is not obvious :smile:
![image](/uploads/845fdab3843938b400b3f0365aca3487/image.png)https://gitlab.kwant-project.org/zesje/zesje/-/issues/657Change *all* MC labels when type changes2023-04-14T09:18:11ZAdrià LabayChange *all* MC labels when type changesBasically, if you start with a numeric label type and move to the alphabetical type, all new options will be added with the correct letter but any previously added option will still have numbers:
![Screenshot_from_2022-06-26_15-53-41](/...Basically, if you start with a numeric label type and move to the alphabetical type, all new options will be added with the correct letter but any previously added option will still have numbers:
![Screenshot_from_2022-06-26_15-53-41](/uploads/d20c4fd841c78c3822fe97e6faa4d66c/Screenshot_from_2022-06-26_15-53-41.png)
Solution: convert all labels to the new typehttps://gitlab.kwant-project.org/zesje/zesje/-/issues/656Automatically rebase MR2022-06-08T14:42:44ZAdrià LabayAutomatically rebase MRhttps://medium.com/ovrsea/how-to-automatically-rebase-all-your-merge-requests-on-gitlab-when-pushing-on-master-9b7c5119ac5fhttps://medium.com/ovrsea/how-to-automatically-rebase-all-your-merge-requests-on-gitlab-when-pushing-on-master-9b7c5119ac5fhttps://gitlab.kwant-project.org/zesje/zesje/-/issues/655Try QR detector in opencv2022-05-18T13:44:50ZAdrià LabayTry QR detector in opencvIt is a possible method to explore and maybe use in replacement/combination of our algorithm. ([DOCS](https://docs.opencv.org/4.x/de/dc3/classcv_1_1QRCodeDetector.html)) [EXAMPLE](https://morioh.com/p/29f7e4c5f900)It is a possible method to explore and maybe use in replacement/combination of our algorithm. ([DOCS](https://docs.opencv.org/4.x/de/dc3/classcv_1_1QRCodeDetector.html)) [EXAMPLE](https://morioh.com/p/29f7e4c5f900)