Plantage sur /api/formsemestre/<int:formsemestre_id>/etat_eval #466

Closed
opened 2022-08-02 09:17:58 +02:00 by jmplace · 2 comments
Collaborator

j ai un plantage sur au moins un de mes semestres avec la pile d'appel suivante:

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/venv/lib/python3.9/site-packages/flask_login/utils.py", line 277, in decorated_view
    return current_app.ensure_sync(func)(*args, **kwargs)
  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/formsemestres.py", line 407, in etat_evals
    return jsonify(result)
  File "/opt/scodoc/venv/lib/python3.9/site-packages/flask/json/__init__.py", line 297, in jsonify
    f"{dumps(data, indent=indent, separators=separators)}\n",
  File "/opt/scodoc/venv/lib/python3.9/site-packages/flask/json/__init__.py", line 131, in dumps
    return _json.dumps(obj, **kwargs)
  File "/usr/lib/python3.9/json/__init__.py", line 234, in dumps
    return cls(
  File "/usr/lib/python3.9/json/encoder.py", line 201, in encode
    chunks = list(chunks)
  File "/usr/lib/python3.9/json/encoder.py", line 429, in _iterencode
    yield from _iterencode_list(o, _current_indent_level)
  File "/usr/lib/python3.9/json/encoder.py", line 325, in _iterencode_list
    yield from chunks
  File "/usr/lib/python3.9/json/encoder.py", line 405, in _iterencode_dict
    yield from chunks
  File "/usr/lib/python3.9/json/encoder.py", line 438, in _iterencode
    o = _default(o)
  File "/opt/scodoc/app/__init__.py", line 118, in default
    return super().default(o)
  File "/opt/scodoc/venv/lib/python3.9/site-packages/flask/json/__init__.py", line 50, in default
    return super().default(o)
  File "/usr/lib/python3.9/json/encoder.py", line 179, in default
    raise TypeError(f'Object of type {o.__class__.__name__} '
TypeError: Object of type FormSemestre is not JSON serializable

cela semble se produire juste apres un flask clear-cache

apres investigation en mode debug j obtient une erreur sur :

(Pdb) pp modimpl_dict['inscriptions'][1].etud.__dict__
{'_sa_instance_state': <sqlalchemy.orm.state.InstanceState object at 0x7fc7e950b820>,
 'boursier': True,
 'civilite': 'M',
 'code_ine': '071119980DC',
 'code_nip': '42014777',
 'date_naissance': datetime.date(2002, 1, 29),
 'departement': <Departement(id=6, acronym='INFO')>,
 'dept_id': 6,
 'dept_naissance': None,
 'id': 11835,
 'lieu_naissance': 'Lesquin',
 'nationalite': None,
 'nom': 'FANION',
 'nom_usuel': None,
 'photo_filename': 'F18/INFO_11835',
 'prenom': 'DANIEL',
 'scodoc7_id': 'EID10450',
 'statut': None}
(Pdb) pp modimpl_dict['inscriptions'][1].etud.departement
<Departement(id=6, acronym='INFO')>
(Pdb) pp jsonify(modimpl_dict['inscriptions'][1].etud.departement)
*** TypeError: Object of type Departement is not JSON serializable
(Pdb) 
j ai un plantage sur au moins un de mes semestres avec la pile d'appel suivante: ``` 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/venv/lib/python3.9/site-packages/flask_login/utils.py", line 277, in decorated_view return current_app.ensure_sync(func)(*args, **kwargs) 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/formsemestres.py", line 407, in etat_evals return jsonify(result) File "/opt/scodoc/venv/lib/python3.9/site-packages/flask/json/__init__.py", line 297, in jsonify f"{dumps(data, indent=indent, separators=separators)}\n", File "/opt/scodoc/venv/lib/python3.9/site-packages/flask/json/__init__.py", line 131, in dumps return _json.dumps(obj, **kwargs) File "/usr/lib/python3.9/json/__init__.py", line 234, in dumps return cls( File "/usr/lib/python3.9/json/encoder.py", line 201, in encode chunks = list(chunks) File "/usr/lib/python3.9/json/encoder.py", line 429, in _iterencode yield from _iterencode_list(o, _current_indent_level) File "/usr/lib/python3.9/json/encoder.py", line 325, in _iterencode_list yield from chunks File "/usr/lib/python3.9/json/encoder.py", line 405, in _iterencode_dict yield from chunks File "/usr/lib/python3.9/json/encoder.py", line 438, in _iterencode o = _default(o) File "/opt/scodoc/app/__init__.py", line 118, in default return super().default(o) File "/opt/scodoc/venv/lib/python3.9/site-packages/flask/json/__init__.py", line 50, in default return super().default(o) File "/usr/lib/python3.9/json/encoder.py", line 179, in default raise TypeError(f'Object of type {o.__class__.__name__} ' TypeError: Object of type FormSemestre is not JSON serializable ``` cela semble se produire juste apres un `flask clear-cache` apres investigation en mode debug j obtient une erreur sur : ``` (Pdb) pp modimpl_dict['inscriptions'][1].etud.__dict__ {'_sa_instance_state': <sqlalchemy.orm.state.InstanceState object at 0x7fc7e950b820>, 'boursier': True, 'civilite': 'M', 'code_ine': '071119980DC', 'code_nip': '42014777', 'date_naissance': datetime.date(2002, 1, 29), 'departement': <Departement(id=6, acronym='INFO')>, 'dept_id': 6, 'dept_naissance': None, 'id': 11835, 'lieu_naissance': 'Lesquin', 'nationalite': None, 'nom': 'FANION', 'nom_usuel': None, 'photo_filename': 'F18/INFO_11835', 'prenom': 'DANIEL', 'scodoc7_id': 'EID10450', 'statut': None} (Pdb) pp modimpl_dict['inscriptions'][1].etud.departement <Departement(id=6, acronym='INFO')> (Pdb) pp jsonify(modimpl_dict['inscriptions'][1].etud.departement) *** TypeError: Object of type Departement is not JSON serializable (Pdb) ```
Author
Collaborator

apres investigation, il semble que les modimpl chargés font référence au département est sous forme de weakref sqlalchemy (c'est à dire non chargé):

(Pdb) pp jsonify(modimpl_dict['inscriptions'][1].etud.departement._sa_instance_state.obj)
*** TypeError: Object of type weakref is not JSON serializable

les modimpl sont renseignéns par les lignes 350-352 de api/formsemestres;py:

        modimpl_results: ModuleImplResults = nt.modimpls_results[modimpl_id]
        modimpl = ModuleImpl.query.get_or_404(modimpl_id)
        modimpl_dict = modimpl.to_dict()
apres investigation, il semble que les modimpl chargés font référence au département est sous forme de weakref sqlalchemy (c'est à dire non chargé): ``` (Pdb) pp jsonify(modimpl_dict['inscriptions'][1].etud.departement._sa_instance_state.obj) *** TypeError: Object of type weakref is not JSON serializable ``` les modimpl sont renseignéns par les lignes 350-352 de api/formsemestres;py: ``` modimpl_results: ModuleImplResults = nt.modimpls_results[modimpl_id] modimpl = ModuleImpl.query.get_or_404(modimpl_id) modimpl_dict = modimpl.to_dict() ```
Owner

Corrigé par 9b0dec8675

Corrigé par 9b0dec8675
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#466
No description provided.