Bug remonté de Rennes #773

Closed
opened 2023-10-02 13:54:37 +02:00 by viennet · 3 comments
Owner

no-reply@xxx.fr
12:16 PM (1 hour ago)
to exception

[2023-10-02 12:16:20,268] xxx requested https://xxx/ScoDoc/Informatique/api/assiduites/etudid/create


ERROR: Exception on /ScoDoc/Informatique/api/assiduites/etudid/create [GET]
Referrer: https://scodociut9.iutlan.univ-rennes1.fr/ScoDoc/Informatique/Scolarite/Assiduites/SignalAssiduiteGr?group_ids=1234&jour=2023-10-02&formsemestre_id=345%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20&moduleimpl_id=6764
Method: GET
Params: ImmutableMultiDict([])
Traceback (most recent call last):
  File "/opt/scodoc/venv/lib/python3.11/site-packages/sqlalchemy/engine/base.py", line 1965, in _exec_single_context
    self.dialect.do_execute(
  File "/opt/scodoc/venv/lib/python3.11/site-packages/sqlalchemy/engine/default.py", line 921, in do_execute
    cursor.execute(statement, parameters)
psycopg2.errors.InvalidTextRepresentation: ERREUR:  syntaxe en entrée invalide pour le type integer : « create »
LINE 3: WHERE identite.id = 'create' AND (departement.acronym = 'MMI...
                            ^


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

Traceback (most recent call last):
  File "/opt/scodoc/venv/lib/python3.11/site-packages/flask/app.py", line 2190, in wsgi_app
    response = self.full_dispatch_request()
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/scodoc/venv/lib/python3.11/site-packages/flask/app.py", line 1486, in full_dispatch_request
    rv = self.handle_user_exception(e)
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/scodoc/venv/lib/python3.11/site-packages/flask/app.py", line 1484, in full_dispatch_request
    rv = self.dispatch_request()
         ^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/scodoc/venv/lib/python3.11/site-packages/flask/app.py", line 1469, in dispatch_request
    return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/scodoc/venv/lib/python3.11/site-packages/flask_login/utils.py", line 290, in decorated_view
    return current_app.ensure_sync(func)(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/scodoc/app/decorators.py", line 80, in scodoc_function
    return func(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^
  File "/opt/scodoc/venv/lib/python3.11/site-packages/flask_json.py", line 219, in wrapper
    rv = f(*args, **kwargs)
         ^^^^^^^^^^^^^^^^^^
  File "/opt/scodoc/app/decorators.py", line 92, in decorated_function
    return f(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^
  File "/opt/scodoc/app/api/assiduites.py", line 254, in assiduites
    etud: Identite = tools.get_etud(etudid, nip, ine)
                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/scodoc/app/api/tools.py", line 47, in get_etud
    return query.join(Admission).order_by(desc(Admission.annee)).first()
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/scodoc/venv/lib/python3.11/site-packages/sqlalchemy/orm/query.py", line 2743, in first
    return self.limit(1)._iter().first()  # type: ignore
           ^^^^^^^^^^^^^^^^^^^^^
  File "/opt/scodoc/venv/lib/python3.11/site-packages/sqlalchemy/orm/query.py", line 2842, in _iter
    result: Union[ScalarResult[_T], Result[_T]] = self.session.execute(
                                                  ^^^^^^^^^^^^^^^^^^^^^
  File "/opt/scodoc/venv/lib/python3.11/site-packages/sqlalchemy/orm/session.py", line 2262, in execute
    return self._execute_internal(
           ^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/scodoc/venv/lib/python3.11/site-packages/sqlalchemy/orm/session.py", line 2144, in _execute_internal
    result: Result[Any] = compile_state_cls.orm_execute_statement(
                          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/scodoc/venv/lib/python3.11/site-packages/sqlalchemy/orm/context.py", line 293, in orm_execute_statement
    result = conn.execute(
             ^^^^^^^^^^^^^
  File "/opt/scodoc/venv/lib/python3.11/site-packages/sqlalchemy/engine/base.py", line 1412, in execute
    return meth(
           ^^^^^
  File "/opt/scodoc/venv/lib/python3.11/site-packages/sqlalchemy/sql/elements.py", line 515, in _execute_on_connection
    return connection._execute_clauseelement(
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/scodoc/venv/lib/python3.11/site-packages/sqlalchemy/engine/base.py", line 1635, in _execute_clauseelement
    ret = self._execute_context(
          ^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/scodoc/venv/lib/python3.11/site-packages/sqlalchemy/engine/base.py", line 1844, in _execute_context
    return self._exec_single_context(
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/scodoc/venv/lib/python3.11/site-packages/sqlalchemy/engine/base.py", line 1984, in _exec_single_context
    self._handle_dbapi_exception(
  File "/opt/scodoc/venv/lib/python3.11/site-packages/sqlalchemy/engine/base.py", line 2339, in _handle_dbapi_exception
    raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
  File "/opt/scodoc/venv/lib/python3.11/site-packages/sqlalchemy/engine/base.py", line 1965, in _exec_single_context
    self.dialect.do_execute(
  File "/opt/scodoc/venv/lib/python3.11/site-packages/sqlalchemy/engine/default.py", line 921, in do_execute
    cursor.execute(statement, parameters)
sqlalchemy.exc.DataError: (psycopg2.errors.InvalidTextRepresentation) ERREUR:  syntaxe en entrée invalide pour le type integer : « create »
LINE 3: WHERE identite.id = 'create' AND (departement.acronym = 'MMI...
                            ^

[SQL: SELECT identite.id AS identite_id, identite.dept_id AS identite_dept_id, identite.nom AS identite_nom, identite.prenom AS identite_prenom, identite.nom_usuel AS identite_nom_usuel, identite.civilite AS identite_civilite, identite.civilite_etat_civil AS identite_civilite_etat_civil, identite.prenom_etat_civil AS identite_prenom_etat_civil, identite.date_naissance AS identite_date_naissance, identite.lieu_naissance AS identite_lieu_naissance, identite.dept_naissance AS identite_dept_naissance, identite.nationalite AS identite_nationalite, identite.statut AS identite_statut, identite.boursier AS identite_boursier, identite.photo_filename AS identite_photo_filename, identite.code_nip AS identite_code_nip, identite.code_ine AS identite_code_ine, identite.scodoc7_id AS identite_scodoc7_id
FROM identite JOIN departement ON departement.id = identite.dept_id JOIN admissions ON identite.id = admissions.etudid
WHERE identite.id = %(id_1)s AND (departement.acronym = %(acronym_1)s OR departement.acronym = %(acronym_2)s OR departement.acronym = %(acronym_3)s OR departement.acronym = %(acronym_4)s) ORDER BY admissions.annee DESC
 LIMIT %(param_1)s]
[parameters: {'id_1': 'create', 'acronym_1': 'MMI', 'acronym_2': 'Informatique', 'acronym_3': 'DUGEN', 'acronym_4': 'LPWEB', 'param_1': 1}]
```txt no-reply@xxx.fr 12:16 PM (1 hour ago) to exception [2023-10-02 12:16:20,268] xxx requested https://xxx/ScoDoc/Informatique/api/assiduites/etudid/create ERROR: Exception on /ScoDoc/Informatique/api/assiduites/etudid/create [GET] Referrer: https://scodociut9.iutlan.univ-rennes1.fr/ScoDoc/Informatique/Scolarite/Assiduites/SignalAssiduiteGr?group_ids=1234&jour=2023-10-02&formsemestre_id=345%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20&moduleimpl_id=6764 Method: GET Params: ImmutableMultiDict([]) Traceback (most recent call last): File "/opt/scodoc/venv/lib/python3.11/site-packages/sqlalchemy/engine/base.py", line 1965, in _exec_single_context self.dialect.do_execute( File "/opt/scodoc/venv/lib/python3.11/site-packages/sqlalchemy/engine/default.py", line 921, in do_execute cursor.execute(statement, parameters) psycopg2.errors.InvalidTextRepresentation: ERREUR: syntaxe en entrée invalide pour le type integer : « create » LINE 3: WHERE identite.id = 'create' AND (departement.acronym = 'MMI... ^ The above exception was the direct cause of the following exception: Traceback (most recent call last): File "/opt/scodoc/venv/lib/python3.11/site-packages/flask/app.py", line 2190, in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/scodoc/venv/lib/python3.11/site-packages/flask/app.py", line 1486, in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/scodoc/venv/lib/python3.11/site-packages/flask/app.py", line 1484, in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/scodoc/venv/lib/python3.11/site-packages/flask/app.py", line 1469, in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/scodoc/venv/lib/python3.11/site-packages/flask_login/utils.py", line 290, in decorated_view return current_app.ensure_sync(func)(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/scodoc/app/decorators.py", line 80, in scodoc_function return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ File "/opt/scodoc/venv/lib/python3.11/site-packages/flask_json.py", line 219, in wrapper rv = f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ File "/opt/scodoc/app/decorators.py", line 92, in decorated_function return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ File "/opt/scodoc/app/api/assiduites.py", line 254, in assiduites etud: Identite = tools.get_etud(etudid, nip, ine) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/scodoc/app/api/tools.py", line 47, in get_etud return query.join(Admission).order_by(desc(Admission.annee)).first() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/scodoc/venv/lib/python3.11/site-packages/sqlalchemy/orm/query.py", line 2743, in first return self.limit(1)._iter().first() # type: ignore ^^^^^^^^^^^^^^^^^^^^^ File "/opt/scodoc/venv/lib/python3.11/site-packages/sqlalchemy/orm/query.py", line 2842, in _iter result: Union[ScalarResult[_T], Result[_T]] = self.session.execute( ^^^^^^^^^^^^^^^^^^^^^ File "/opt/scodoc/venv/lib/python3.11/site-packages/sqlalchemy/orm/session.py", line 2262, in execute return self._execute_internal( ^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/scodoc/venv/lib/python3.11/site-packages/sqlalchemy/orm/session.py", line 2144, in _execute_internal result: Result[Any] = compile_state_cls.orm_execute_statement( ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/scodoc/venv/lib/python3.11/site-packages/sqlalchemy/orm/context.py", line 293, in orm_execute_statement result = conn.execute( ^^^^^^^^^^^^^ File "/opt/scodoc/venv/lib/python3.11/site-packages/sqlalchemy/engine/base.py", line 1412, in execute return meth( ^^^^^ File "/opt/scodoc/venv/lib/python3.11/site-packages/sqlalchemy/sql/elements.py", line 515, in _execute_on_connection return connection._execute_clauseelement( ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/scodoc/venv/lib/python3.11/site-packages/sqlalchemy/engine/base.py", line 1635, in _execute_clauseelement ret = self._execute_context( ^^^^^^^^^^^^^^^^^^^^^^ File "/opt/scodoc/venv/lib/python3.11/site-packages/sqlalchemy/engine/base.py", line 1844, in _execute_context return self._exec_single_context( ^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/scodoc/venv/lib/python3.11/site-packages/sqlalchemy/engine/base.py", line 1984, in _exec_single_context self._handle_dbapi_exception( File "/opt/scodoc/venv/lib/python3.11/site-packages/sqlalchemy/engine/base.py", line 2339, in _handle_dbapi_exception raise sqlalchemy_exception.with_traceback(exc_info[2]) from e File "/opt/scodoc/venv/lib/python3.11/site-packages/sqlalchemy/engine/base.py", line 1965, in _exec_single_context self.dialect.do_execute( File "/opt/scodoc/venv/lib/python3.11/site-packages/sqlalchemy/engine/default.py", line 921, in do_execute cursor.execute(statement, parameters) sqlalchemy.exc.DataError: (psycopg2.errors.InvalidTextRepresentation) ERREUR: syntaxe en entrée invalide pour le type integer : « create » LINE 3: WHERE identite.id = 'create' AND (departement.acronym = 'MMI... ^ [SQL: SELECT identite.id AS identite_id, identite.dept_id AS identite_dept_id, identite.nom AS identite_nom, identite.prenom AS identite_prenom, identite.nom_usuel AS identite_nom_usuel, identite.civilite AS identite_civilite, identite.civilite_etat_civil AS identite_civilite_etat_civil, identite.prenom_etat_civil AS identite_prenom_etat_civil, identite.date_naissance AS identite_date_naissance, identite.lieu_naissance AS identite_lieu_naissance, identite.dept_naissance AS identite_dept_naissance, identite.nationalite AS identite_nationalite, identite.statut AS identite_statut, identite.boursier AS identite_boursier, identite.photo_filename AS identite_photo_filename, identite.code_nip AS identite_code_nip, identite.code_ine AS identite_code_ine, identite.scodoc7_id AS identite_scodoc7_id FROM identite JOIN departement ON departement.id = identite.dept_id JOIN admissions ON identite.id = admissions.etudid WHERE identite.id = %(id_1)s AND (departement.acronym = %(acronym_1)s OR departement.acronym = %(acronym_2)s OR departement.acronym = %(acronym_3)s OR departement.acronym = %(acronym_4)s) ORDER BY admissions.annee DESC LIMIT %(param_1)s] [parameters: {'id_1': 'create', 'acronym_1': 'MMI', 'acronym_2': 'Informatique', 'acronym_3': 'DUGEN', 'acronym_4': 'LPWEB', 'param_1': 1}] ```
viennet added this to the Amélioration de la gestion de l'assiduité project 2023-10-02 13:54:37 +02:00
viennet added this to the ScoDoc 9.6 milestone 2023-10-02 13:54:43 +02:00
viennet added the
bug
ABS
prio
labels 2023-10-02 13:54:53 +02:00
Contributor

Je viens de reproduire cette erreur à 00:21:51, en formant mal une requete API.
/api/assiduites/etudid/create

Est ce que les route dans https://scodoc.org/git/ScoDoc/ScoDoc/src/branch/master/app/api/assiduites.py#L185 ne devrait pas être de la forme :
@bp.route("/assiduites/<int:etudid>", defaults={"with_query": False})
au lieu de
@bp.route("/assiduites/<etudid>", defaults={"with_query": False})

Je viens de reproduire cette erreur à 00:21:51, en formant mal une requete API. `/api/assiduites/etudid/create` Est ce que les route dans https://scodoc.org/git/ScoDoc/ScoDoc/src/branch/master/app/api/assiduites.py#L185 ne devrait pas être de la forme : `@bp.route("/assiduites/<int:etudid>", defaults={"with_query": False})` au lieu de `@bp.route("/assiduites/<etudid>", defaults={"with_query": False})`
Contributor

Inventaire rapide :
\app\api\assiduites.py

	Line 87: @bp.route("/assiduites/<etudid>/count", defaults={"with_query": False})
	Line 89: @bp.route("/assiduites/<etudid>/count/query", defaults={"with_query": True})
	Line 91: @bp.route("/assiduites/etudid/<etudid>/count", defaults={"with_query": False})
	Line 93: @bp.route("/assiduites/etudid/<etudid>/count/query", defaults={"with_query": True})
	Line 98: @bp.route("/assiduites/nip/<nip>/count", defaults={"with_query": False})
	Line 100: @bp.route("/assiduites/nip/<nip>/count/query", defaults={"with_query": True})
	Line 103: @bp.route("/assiduites/ine/<ine>/count", defaults={"with_query": False})
	Line 105: @bp.route("/assiduites/ine/<ine>/count/query", defaults={"with_query": True})
	Line 186: @bp.route("/assiduites/<etudid>", defaults={"with_query": False})
	Line 188: @bp.route("/assiduites/<etudid>/query", defaults={"with_query": True})
	Line 190: @bp.route("/assiduites/etudid/<etudid>", defaults={"with_query": False})
	Line 192: @bp.route("/assiduites/etudid/<etudid>/query", defaults={"with_query": True})
	Line 195: @bp.route("/assiduites/nip/<nip>", defaults={"with_query": False})
	Line 197: @bp.route("/assiduites/nip/<nip>/query", defaults={"with_query": True})
	Line 200: @bp.route("/assiduites/ine/<ine>", defaults={"with_query": False})
	Line 202: @bp.route("/assiduites/ine/<ine>/query", defaults={"with_query": True})
	Line 440: @bp.route("/assiduite/<etudid>/create", methods=["POST"])
	Line 442: @bp.route("/assiduite/etudid/<etudid>/create", methods=["POST"])
	Line 445: @bp.route("/assiduite/nip/<nip>/create", methods=["POST"])
	Line 448: @bp.route("/assiduite/ine/<ine>/create", methods=["POST"])

\app\api\justificatifs.py

	Line 66: @bp.route("/justificatifs/<etudid>", defaults={"with_query": False})
	Line 68: @bp.route("/justificatifs/<etudid>/query", defaults={"with_query": True})
	Line 70: @bp.route("/justificatifs/etudid/<etudid>", defaults={"with_query": False})
	Line 72: @bp.route("/justificatifs/etudid/<etudid>/query", defaults={"with_query": True})
	Line 75: @bp.route("/justificatifs/nip/<nip>", defaults={"with_query": False})
	Line 77: @bp.route("/justificatifs/nip/<nip>/query", defaults={"with_query": True})
	Line 80: @bp.route("/justificatifs/ine/<ine>", defaults={"with_query": False})
	Line 82: @bp.route("/justificatifs/ine/<ine>/query", defaults={"with_query": True})
	Line 233: @bp.route("/justificatif/etudid/<etudid>/create", methods=["POST"])
	Line 236: @bp.route("/justificatif/nip/<nip>/create", methods=["POST"])
	Line 239: @bp.route("/justificatif/ine/<ine>/create", methods=["POST"])
Inventaire rapide : **\app\api\assiduites.py** ``` Line 87: @bp.route("/assiduites/<etudid>/count", defaults={"with_query": False}) Line 89: @bp.route("/assiduites/<etudid>/count/query", defaults={"with_query": True}) Line 91: @bp.route("/assiduites/etudid/<etudid>/count", defaults={"with_query": False}) Line 93: @bp.route("/assiduites/etudid/<etudid>/count/query", defaults={"with_query": True}) Line 98: @bp.route("/assiduites/nip/<nip>/count", defaults={"with_query": False}) Line 100: @bp.route("/assiduites/nip/<nip>/count/query", defaults={"with_query": True}) Line 103: @bp.route("/assiduites/ine/<ine>/count", defaults={"with_query": False}) Line 105: @bp.route("/assiduites/ine/<ine>/count/query", defaults={"with_query": True}) Line 186: @bp.route("/assiduites/<etudid>", defaults={"with_query": False}) Line 188: @bp.route("/assiduites/<etudid>/query", defaults={"with_query": True}) Line 190: @bp.route("/assiduites/etudid/<etudid>", defaults={"with_query": False}) Line 192: @bp.route("/assiduites/etudid/<etudid>/query", defaults={"with_query": True}) Line 195: @bp.route("/assiduites/nip/<nip>", defaults={"with_query": False}) Line 197: @bp.route("/assiduites/nip/<nip>/query", defaults={"with_query": True}) Line 200: @bp.route("/assiduites/ine/<ine>", defaults={"with_query": False}) Line 202: @bp.route("/assiduites/ine/<ine>/query", defaults={"with_query": True}) Line 440: @bp.route("/assiduite/<etudid>/create", methods=["POST"]) Line 442: @bp.route("/assiduite/etudid/<etudid>/create", methods=["POST"]) Line 445: @bp.route("/assiduite/nip/<nip>/create", methods=["POST"]) Line 448: @bp.route("/assiduite/ine/<ine>/create", methods=["POST"]) ``` **\app\api\justificatifs.py** ``` Line 66: @bp.route("/justificatifs/<etudid>", defaults={"with_query": False}) Line 68: @bp.route("/justificatifs/<etudid>/query", defaults={"with_query": True}) Line 70: @bp.route("/justificatifs/etudid/<etudid>", defaults={"with_query": False}) Line 72: @bp.route("/justificatifs/etudid/<etudid>/query", defaults={"with_query": True}) Line 75: @bp.route("/justificatifs/nip/<nip>", defaults={"with_query": False}) Line 77: @bp.route("/justificatifs/nip/<nip>/query", defaults={"with_query": True}) Line 80: @bp.route("/justificatifs/ine/<ine>", defaults={"with_query": False}) Line 82: @bp.route("/justificatifs/ine/<ine>/query", defaults={"with_query": True}) Line 233: @bp.route("/justificatif/etudid/<etudid>/create", methods=["POST"]) Line 236: @bp.route("/justificatif/nip/<nip>/create", methods=["POST"]) Line 239: @bp.route("/justificatif/ine/<ine>/create", methods=["POST"]) ```
Author
Owner

Je viens de reproduire cette erreur à 00:21:51, en formant mal une requete API.
/api/assiduites/etudid/create

Est ce que les route dans https://scodoc.org/git/ScoDoc/ScoDoc/src/branch/master/app/api/assiduites.py#L185 ne devrait pas être de la forme :
@bp.route("/assiduites/<int:etudid>", defaults={"with_query": False})
au lieu de
@bp.route("/assiduites/<etudid>", defaults={"with_query": False})

fait. merci @pascal.bouron

> Je viens de reproduire cette erreur à 00:21:51, en formant mal une requete API. > `/api/assiduites/etudid/create` > > Est ce que les route dans https://scodoc.org/git/ScoDoc/ScoDoc/src/branch/master/app/api/assiduites.py#L185 ne devrait pas être de la forme : > `@bp.route("/assiduites/<int:etudid>", defaults={"with_query": False})` > au lieu de > `@bp.route("/assiduites/<etudid>", defaults={"with_query": False})` > > fait. merci @pascal.bouron
viennet changed title from Bug remonté de ennes to Bug remonté de Rennes 2023-10-24 15:16:16 +02:00
Sign in to join this conversation.
No Milestone
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#773
No description provided.