diff --git a/app/__init__.py b/app/__init__.py
index a63f9a23c5423e1d61784521845c8e91f8a47edb..3187ea7af882baed7eaedb93f5c3a624def2f8cf 100644
--- a/app/__init__.py
+++ b/app/__init__.py
@@ -2,7 +2,7 @@
 # pylint: disable=invalid-name
 
 import os
-import re
+import reprlib
 import socket
 import sys
 import time
@@ -112,7 +112,8 @@ class LogExceptionFormatter(logging.Formatter):
             if request.method == "GET":
                 record.http_params = str(request.args)
             else:
-                record.http_params = "(post data not loggued)"
+                rep = reprlib.Repr()  # abbrège
+                record.http_params = str(rep.repr(request.form))
         else:
             record.url = None
             record.remote_addr = None
diff --git a/app/models/departements.py b/app/models/departements.py
index 32cb8637455860bc3fe699988727422072ee371f..36aa8d4c62e32767c958169a9b0860bf855a8434 100644
--- a/app/models/departements.py
+++ b/app/models/departements.py
@@ -33,7 +33,7 @@ class Departement(db.Model):
     semsets = db.relationship("NotesSemSet", lazy="dynamic", backref="departement")
 
     def __repr__(self):
-        return f"<Departement {self.acronym}>"
+        return f"<{self.__class__.__name__}(id={self.id}, acronym='{self.acronym}')>"
 
     def to_dict(self):
         data = {
@@ -44,6 +44,3 @@ class Departement(db.Model):
             "date_creation": self.date_creation,
         }
         return data
-
-    def __repr__(self):
-        return f"<{self.__class__.__name__}(id={self.id}, acronym='{self.acronym}')>"
diff --git a/app/scodoc/sco_formsemestre_status.py b/app/scodoc/sco_formsemestre_status.py
index ab850d53197dc3b759e8ae61b55badde6f382406..e85fd4a3d1a6aae0926d7b3d43e02cc170a8bc87 100644
--- a/app/scodoc/sco_formsemestre_status.py
+++ b/app/scodoc/sco_formsemestre_status.py
@@ -447,6 +447,7 @@ def retreive_formsemestre_from_request() -> int:
         args = request.form
     else:
         return None
+    formsemestre_id = None
     # Search formsemestre
     group_ids = args.get("group_ids", [])
     if "formsemestre_id" in args:
@@ -479,7 +480,8 @@ def retreive_formsemestre_from_request() -> int:
     elif "partition_id" in args:
         partition = sco_groups.get_partition(args["partition_id"])
         formsemestre_id = partition["formsemestre_id"]
-    else:
+
+    if not formsemestre_id:
         return None  # no current formsemestre
 
     return int(formsemestre_id)
diff --git a/app/scodoc/sco_inscr_passage.py b/app/scodoc/sco_inscr_passage.py
index bbd6f96df52ea0e627544633a680e2706dabc211..22624f7b351e769024c53e8884694d7de86c8f80 100644
--- a/app/scodoc/sco_inscr_passage.py
+++ b/app/scodoc/sco_inscr_passage.py
@@ -287,8 +287,10 @@ def formsemestre_inscr_passage(
     header = html_sco_header.sco_header(page_title="Passage des étudiants")
     footer = html_sco_header.sco_footer()
     H = [header]
-    if type(etuds) == type(""):
+    if isinstance(etuds, str):
         etuds = etuds.split(",")  # vient du form de confirmation
+    elif isinstance(etuds, int):
+        etuds = [etuds]
 
     auth_etuds_by_sem, inscrits, candidats = list_authorized_etuds_by_sem(sem)
     etuds_set = set(etuds)
diff --git a/app/scodoc/sco_synchro_etuds.py b/app/scodoc/sco_synchro_etuds.py
index 73f0e4bf357cebbb6934506b113ecd1baa9cb5a2..649358a6d382d0af2ac99a3c0667f1aa345492ec 100644
--- a/app/scodoc/sco_synchro_etuds.py
+++ b/app/scodoc/sco_synchro_etuds.py
@@ -132,7 +132,7 @@ def formsemestre_synchro_etuds(
         inscrits_without_key = inscrits_without_key.split(",")
     elif not isinstance(inscrits_without_key, list):
         raise ValueError("invalid type for inscrits_without_key")
-    inscrits_without_key = [int(x) for x in inscrits_without_key]
+    inscrits_without_key = [int(x) for x in inscrits_without_key if x]
     (
         etuds_by_cat,
         a_importer,
diff --git a/pylintrc b/pylintrc
index 1914493efeed3c63f8d17d97fd29bb847989c6fa..057a85cd0e166326da758a16949db7710d3b6e88 100644
--- a/pylintrc
+++ b/pylintrc
@@ -3,3 +3,19 @@
 # List of plugins (as comma separated values of python module names) to load,
 # usually to register additional checkers.
 load-plugins=pylint_flask_sqlalchemy, pylint_flask
+
+[TYPECHECK]
+# List of class names for which member attributes should not be checked (useful
+# for classes with dynamically set attributes). This supports the use of
+# qualified names.
+ignored-classes=Permission,
+                SQLObject,
+                Registrant,
+                scoped_session,
+                func
+
+# List of module names for which member attributes should not be checked
+# (useful for modules/projects where namespaces are manipulated during runtime
+# and thus existing member attributes cannot be deduced by static analysis). It
+# supports qualified module names, as well as Unix pattern matching.
+ignored-modules=entreprises