schoolapp-api 2.1.4__tar.gz → 2.1.6__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. {schoolapp_api-2.1.4/schoolapp_api.egg-info → schoolapp_api-2.1.6}/PKG-INFO +1 -1
  2. {schoolapp_api-2.1.4 → schoolapp_api-2.1.6}/pyproject.toml +1 -1
  3. {schoolapp_api-2.1.4 → schoolapp_api-2.1.6}/schoolapp_api/auth.py +20 -10
  4. {schoolapp_api-2.1.4 → schoolapp_api-2.1.6}/schoolapp_api/http_client.py +4 -5
  5. {schoolapp_api-2.1.4 → schoolapp_api-2.1.6}/schoolapp_api/types/element.py +5 -0
  6. {schoolapp_api-2.1.4 → schoolapp_api-2.1.6/schoolapp_api.egg-info}/PKG-INFO +1 -1
  7. {schoolapp_api-2.1.4 → schoolapp_api-2.1.6}/LICENSE +0 -0
  8. {schoolapp_api-2.1.4 → schoolapp_api-2.1.6}/README.md +0 -0
  9. {schoolapp_api-2.1.4 → schoolapp_api-2.1.6}/schoolapp_api/__init__.py +0 -0
  10. {schoolapp_api-2.1.4 → schoolapp_api-2.1.6}/schoolapp_api/constants.py +0 -0
  11. {schoolapp_api-2.1.4 → schoolapp_api-2.1.6}/schoolapp_api/managers/__init__.py +0 -0
  12. {schoolapp_api-2.1.4 → schoolapp_api-2.1.6}/schoolapp_api/managers/attendance_manager.py +0 -0
  13. {schoolapp_api-2.1.4 → schoolapp_api-2.1.6}/schoolapp_api/managers/base_manager.py +0 -0
  14. {schoolapp_api-2.1.4 → schoolapp_api-2.1.6}/schoolapp_api/managers/course_manager.py +0 -0
  15. {schoolapp_api-2.1.4 → schoolapp_api-2.1.6}/schoolapp_api/managers/grades_manager.py +0 -0
  16. {schoolapp_api-2.1.4 → schoolapp_api-2.1.6}/schoolapp_api/managers/profile_manager.py +0 -0
  17. {schoolapp_api-2.1.4 → schoolapp_api-2.1.6}/schoolapp_api/parsers/__init__.py +0 -0
  18. {schoolapp_api-2.1.4 → schoolapp_api-2.1.6}/schoolapp_api/parsers/absences.py +0 -0
  19. {schoolapp_api-2.1.4 → schoolapp_api-2.1.6}/schoolapp_api/parsers/annees.py +0 -0
  20. {schoolapp_api-2.1.4 → schoolapp_api-2.1.6}/schoolapp_api/parsers/filieres.py +0 -0
  21. {schoolapp_api-2.1.4 → schoolapp_api-2.1.6}/schoolapp_api/parsers/modules.py +0 -0
  22. {schoolapp_api-2.1.4 → schoolapp_api-2.1.6}/schoolapp_api/parsers/note_elem.py +0 -0
  23. {schoolapp_api-2.1.4 → schoolapp_api-2.1.6}/schoolapp_api/parsers/note_mod.py +0 -0
  24. {schoolapp_api-2.1.4 → schoolapp_api-2.1.6}/schoolapp_api/parsers/profile.py +0 -0
  25. {schoolapp_api-2.1.4 → schoolapp_api-2.1.6}/schoolapp_api/parsers/sanctions.py +0 -0
  26. {schoolapp_api-2.1.4 → schoolapp_api-2.1.6}/schoolapp_api/parsers/semestres.py +0 -0
  27. {schoolapp_api-2.1.4 → schoolapp_api-2.1.6}/schoolapp_api/parsers/stats.py +0 -0
  28. {schoolapp_api-2.1.4 → schoolapp_api-2.1.6}/schoolapp_api/school_app_client.py +0 -0
  29. {schoolapp_api-2.1.4 → schoolapp_api-2.1.6}/schoolapp_api/types/__init__.py +0 -0
  30. {schoolapp_api-2.1.4 → schoolapp_api-2.1.6}/schoolapp_api/types/annee.py +0 -0
  31. {schoolapp_api-2.1.4 → schoolapp_api-2.1.6}/schoolapp_api/types/base.py +0 -0
  32. {schoolapp_api-2.1.4 → schoolapp_api-2.1.6}/schoolapp_api/types/module.py +0 -0
  33. {schoolapp_api-2.1.4 → schoolapp_api-2.1.6}/schoolapp_api/types/semestre.py +0 -0
  34. {schoolapp_api-2.1.4 → schoolapp_api-2.1.6}/schoolapp_api.egg-info/SOURCES.txt +0 -0
  35. {schoolapp_api-2.1.4 → schoolapp_api-2.1.6}/schoolapp_api.egg-info/dependency_links.txt +0 -0
  36. {schoolapp_api-2.1.4 → schoolapp_api-2.1.6}/schoolapp_api.egg-info/requires.txt +0 -0
  37. {schoolapp_api-2.1.4 → schoolapp_api-2.1.6}/schoolapp_api.egg-info/top_level.txt +0 -0
  38. {schoolapp_api-2.1.4 → schoolapp_api-2.1.6}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: schoolapp-api
3
- Version: 2.1.4
3
+ Version: 2.1.6
4
4
  Summary: Professional client for interacting with the School App API
5
5
  Author: Aferiad Kamal
6
6
  License: MIT
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "schoolapp-api"
7
- version = "2.1.4"
7
+ version = "2.1.6"
8
8
  description = "Professional client for interacting with the School App API"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.7"
@@ -70,20 +70,30 @@ class AuthManager:
70
70
  return self.logged_in
71
71
 
72
72
  def check_session(self):
73
- """
74
- Confirm whether the session is still valid by visiting the index page.
75
- """
76
- from schoolapp_api.constants import INDEX_URL
77
- code, url, content = self.http_client.get(INDEX_URL)
73
+ """Confirm whether the session is still valid by visiting the index page"""
74
+ try:
75
+ from schoolapp_api.constants import INDEX_URL
76
+ code, url, content = self.http_client.get(INDEX_URL)
77
+
78
+ # If url is None (exception) or it contains "/login", session is dead
79
+ if not url or "/login" in url.lower():
80
+ logger.warning(f"Session check: Redirected to {url or 'None'} - session invalid")
81
+ self.logged_in = False
82
+ return False
83
+
84
+ # If content is very short or contains login-like keywords, it's also dead
85
+ if content and (len(content) < 1000 or "login" in content.lower()[:500]):
86
+ logger.warning("Session check: Content looks like a login page - session invalid")
87
+ self.logged_in = False
88
+ return False
78
89
 
79
- # If server redirects us to login, session is dead
80
- if url and "/login" in url:
90
+ self.logged_in = True
91
+ return True
92
+ except Exception as e:
93
+ logger.error(f"Error during check_session: {e}")
81
94
  self.logged_in = False
82
95
  return False
83
96
 
84
- self.logged_in = True
85
- return True
86
-
87
97
  def refresh_csrf_from_url(self, url):
88
98
  """Fetch a fresh CSRF token from a specific page"""
89
99
  try:
@@ -46,15 +46,14 @@ class HTTPClient:
46
46
  return code, response_url, content
47
47
 
48
48
  except urllib.error.HTTPError as e:
49
- # Still get content from error page if possible (some portals return 401 with nice HTML)
50
49
  try:
51
50
  content = e.read().decode("utf-8")
52
51
  except:
53
52
  content = None
54
- logger.error(f"HTTP Error {e.code}: {e.reason}")
53
+ logger.error(f"HTTP Error {e.code} on {url}: {e.reason}")
55
54
  return e.code, e.url, content
56
55
  except Exception as e:
57
- logger.error(f"GET Error: {e}")
56
+ logger.error(f"GET Error on {url}: {e}")
58
57
  return None, None, None
59
58
 
60
59
  def post(self, url, data, referer=None):
@@ -77,8 +76,8 @@ class HTTPClient:
77
76
  content = e.read().decode("utf-8")
78
77
  except:
79
78
  content = None
80
- logger.error(f"HTTP Error {e.code}: {e.reason}")
79
+ logger.error(f"HTTP Error {e.code} on {url}: {e.reason}")
81
80
  return e.code, e.url, content
82
81
  except Exception as e:
83
- logger.error(f"POST Error: {e}")
82
+ logger.error(f"POST Error on {url}: {e}")
84
83
  return None, None, None
@@ -10,6 +10,7 @@ class Element(BaseType):
10
10
  "NoteCC": getattr(self, "CC", None),
11
11
  "NoteEX": getattr(self, "EX", None),
12
12
  "NoteTP": getattr(self, "TP", None),
13
+ "NoteRAT": getattr(self, "RAT", None),
13
14
  "MoyElem": getattr(self, "Moy", None)
14
15
  }
15
16
 
@@ -40,3 +41,7 @@ class Element(BaseType):
40
41
  @property
41
42
  def moy_stats(self):
42
43
  return self._stats.get("MoyElem") or self.fetch_stats("MoyElem")
44
+
45
+ @property
46
+ def rat_stats(self):
47
+ return self._stats.get("NoteRAT") or self.fetch_stats("NoteRAT")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: schoolapp-api
3
- Version: 2.1.4
3
+ Version: 2.1.6
4
4
  Summary: Professional client for interacting with the School App API
5
5
  Author: Aferiad Kamal
6
6
  License: MIT
File without changes
File without changes
File without changes