Plantage API sur formsemestre inexistant lors de la recherche du bulletin d'un étudiant #470

Closed
opened 2022-08-06 10:54:32 +02:00 by jmplace · 1 comment
Collaborator

Contexte:

  • l'étudiant 12107 existe
  • le formsemestre 944 existe
  • l'étudiant 12107 n'est pas inscrit au 944

la requete:
/api/etudiant/12017/formsmestre/944/bulletin ne retourne pas un 404 mais plante avec la pile d appel suivante:

Traceback (most recent call last):
  File "/opt/scodoc/venv/lib/python3.9/site-packages/pandas/core/indexes/base.py", line 3621, in get_loc
    return self._engine.get_loc(casted_key)
  File "pandas/_libs/index.pyx", line 136, in pandas._libs.index.IndexEngine.get_loc
  File "pandas/_libs/index.pyx", line 163, in pandas._libs.index.IndexEngine.get_loc
  File "pandas/_libs/hashtable_class_helper.pxi", line 2131, in pandas._libs.hashtable.Int64HashTable.get_item
  File "pandas/_libs/hashtable_class_helper.pxi", line 2140, in pandas._libs.hashtable.Int64HashTable.get_item
KeyError: 12107

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/opt/scodoc/venv/lib/python3.9/site-packages/flask/app.py", line 2095, in __call__
    return self.wsgi_app(environ, start_response)
  File "/opt/scodoc/app/__init__.py", line 212, in __call__
    return self.app(environ, start_response)
  File "/opt/scodoc/venv/lib/python3.9/site-packages/flask/app.py", line 2080, in wsgi_app
    response = self.handle_exception(e)
  File "/opt/scodoc/venv/lib/python3.9/site-packages/flask/app.py", line 2077, in wsgi_app
    response = self.full_dispatch_request()
  File "/opt/scodoc/venv/lib/python3.9/site-packages/flask/app.py", line 1525, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/opt/scodoc/venv/lib/python3.9/site-packages/flask/app.py", line 1523, in full_dispatch_request
    rv = self.dispatch_request()
  File "/opt/scodoc/venv/lib/python3.9/site-packages/flask/app.py", line 1509, in dispatch_request
    return self.ensure_sync(self.view_functions[rule.endpoint])(**req.view_args)
  File "/opt/scodoc/app/decorators.py", line 79, in scodoc_function
    return func(*args, **kwargs)
  File "/opt/scodoc/app/decorators.py", line 91, in decorated_function
    return f(*args, **kwargs)
  File "/opt/scodoc/app/api/etudiants.py", line 353, in etudiant_bulletin_semestre
    return sco_bulletins.get_formsemestre_bulletin_etud_json(
  File "/opt/scodoc/app/scodoc/sco_bulletins.py", line 79, in get_formsemestre_bulletin_etud_json
    r.bulletin_etud(
  File "/opt/scodoc/app/but/bulletin_but.py", line 281, in bulletin_etud
    etud_ues_ids = res.etud_ues_ids(etud.id)
  File "/opt/scodoc/app/comp/res_but.py", line 235, in etud_ues_ids
    s = self.ues_inscr_parcours_df.loc[etudid]
  File "/opt/scodoc/venv/lib/python3.9/site-packages/pandas/core/indexing.py", line 967, in __getitem__
    return self._getitem_axis(maybe_callable, axis=axis)
  File "/opt/scodoc/venv/lib/python3.9/site-packages/pandas/core/indexing.py", line 1202, in _getitem_axis
    return self._get_label(key, axis=axis)
  File "/opt/scodoc/venv/lib/python3.9/site-packages/pandas/core/indexing.py", line 1153, in _get_label
    return self.obj.xs(label, axis=axis)
  File "/opt/scodoc/venv/lib/python3.9/site-packages/pandas/core/generic.py", line 3864, in xs
    loc = index.get_loc(key)
  File "/opt/scodoc/venv/lib/python3.9/site-packages/pandas/core/indexes/base.py", line 3623, in get_loc
    raise KeyError(key) from err
KeyError: 12107

Proposition:
dans api/etudiants ligne 328-329, on teste bien que le formsemestre existe mais pas que l'étudiant y est effectivement inscrit.

    formsemestre = FormSemestre.query.filter_by(id=formsemestre_id).first_or_404()
    dept = Departement.query.filter_by(id=formsemestre.dept_id).first_or_404()

remarque:
On trouve un comportement similaire (différence de comportement entre un formsemestre inexistant et un formsemestre où l'étudiant ne figure pas) mais pour cette entrée le problème est moins grave (on retourne une liste vide au lieu d'une erreur 404).
si besoin compléter entre les lignes 399 et 399.

	query = FormSemestre.query.filter_by(id=formsemestre_id)
    if g.scodoc_dept:
        query = query.filter_by(dept_id=g.scodoc_dept_id)
Contexte: * l'étudiant 12107 existe * le formsemestre 944 existe * l'étudiant 12107 n'est pas inscrit au 944 la requete: `/api/etudiant/12017/formsmestre/944/bulletin` ne retourne pas un 404 mais plante avec la pile d appel suivante: ``` Traceback (most recent call last): File "/opt/scodoc/venv/lib/python3.9/site-packages/pandas/core/indexes/base.py", line 3621, in get_loc return self._engine.get_loc(casted_key) File "pandas/_libs/index.pyx", line 136, in pandas._libs.index.IndexEngine.get_loc File "pandas/_libs/index.pyx", line 163, in pandas._libs.index.IndexEngine.get_loc File "pandas/_libs/hashtable_class_helper.pxi", line 2131, in pandas._libs.hashtable.Int64HashTable.get_item File "pandas/_libs/hashtable_class_helper.pxi", line 2140, in pandas._libs.hashtable.Int64HashTable.get_item KeyError: 12107 The above exception was the direct cause of the following exception: Traceback (most recent call last): File "/opt/scodoc/venv/lib/python3.9/site-packages/flask/app.py", line 2095, in __call__ return self.wsgi_app(environ, start_response) File "/opt/scodoc/app/__init__.py", line 212, in __call__ return self.app(environ, start_response) File "/opt/scodoc/venv/lib/python3.9/site-packages/flask/app.py", line 2080, in wsgi_app response = self.handle_exception(e) File "/opt/scodoc/venv/lib/python3.9/site-packages/flask/app.py", line 2077, in wsgi_app response = self.full_dispatch_request() File "/opt/scodoc/venv/lib/python3.9/site-packages/flask/app.py", line 1525, in full_dispatch_request rv = self.handle_user_exception(e) File "/opt/scodoc/venv/lib/python3.9/site-packages/flask/app.py", line 1523, in full_dispatch_request rv = self.dispatch_request() File "/opt/scodoc/venv/lib/python3.9/site-packages/flask/app.py", line 1509, in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**req.view_args) File "/opt/scodoc/app/decorators.py", line 79, in scodoc_function return func(*args, **kwargs) File "/opt/scodoc/app/decorators.py", line 91, in decorated_function return f(*args, **kwargs) File "/opt/scodoc/app/api/etudiants.py", line 353, in etudiant_bulletin_semestre return sco_bulletins.get_formsemestre_bulletin_etud_json( File "/opt/scodoc/app/scodoc/sco_bulletins.py", line 79, in get_formsemestre_bulletin_etud_json r.bulletin_etud( File "/opt/scodoc/app/but/bulletin_but.py", line 281, in bulletin_etud etud_ues_ids = res.etud_ues_ids(etud.id) File "/opt/scodoc/app/comp/res_but.py", line 235, in etud_ues_ids s = self.ues_inscr_parcours_df.loc[etudid] File "/opt/scodoc/venv/lib/python3.9/site-packages/pandas/core/indexing.py", line 967, in __getitem__ return self._getitem_axis(maybe_callable, axis=axis) File "/opt/scodoc/venv/lib/python3.9/site-packages/pandas/core/indexing.py", line 1202, in _getitem_axis return self._get_label(key, axis=axis) File "/opt/scodoc/venv/lib/python3.9/site-packages/pandas/core/indexing.py", line 1153, in _get_label return self.obj.xs(label, axis=axis) File "/opt/scodoc/venv/lib/python3.9/site-packages/pandas/core/generic.py", line 3864, in xs loc = index.get_loc(key) File "/opt/scodoc/venv/lib/python3.9/site-packages/pandas/core/indexes/base.py", line 3623, in get_loc raise KeyError(key) from err KeyError: 12107 ``` Proposition: dans api/etudiants ligne 328-329, on teste bien que le formsemestre existe mais pas que l'étudiant y est effectivement inscrit. ```python formsemestre = FormSemestre.query.filter_by(id=formsemestre_id).first_or_404() dept = Departement.query.filter_by(id=formsemestre.dept_id).first_or_404() ``` remarque: On trouve un comportement similaire (différence de comportement entre un formsemestre inexistant et un formsemestre où l'étudiant ne figure pas) mais pour cette entrée le problème est moins grave (on retourne une liste vide au lieu d'une erreur 404). si besoin compléter entre les lignes 399 et 399. ```python query = FormSemestre.query.filter_by(id=formsemestre_id) if g.scodoc_dept: query = query.filter_by(dept_id=g.scodoc_dept_id) ```
viennet added the
API
label 2022-08-07 14:27:59 +02:00
Owner

Fixed by f0c342fad5

Fixed by f0c342fad5
Sign in to join this conversation.
No Milestone
No project
No Assignees
2 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.

No due date set.

Dependencies

No dependencies set.

Reference: ScoDoc/ScoDoc#470
No description provided.