schoolapp-api 2.1.3__tar.gz → 2.1.4__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.
- {schoolapp_api-2.1.3/schoolapp_api.egg-info → schoolapp_api-2.1.4}/PKG-INFO +1 -1
- {schoolapp_api-2.1.3 → schoolapp_api-2.1.4}/pyproject.toml +1 -1
- {schoolapp_api-2.1.3 → schoolapp_api-2.1.4}/schoolapp_api/auth.py +4 -3
- {schoolapp_api-2.1.3 → schoolapp_api-2.1.4}/schoolapp_api/http_client.py +15 -10
- {schoolapp_api-2.1.3 → schoolapp_api-2.1.4/schoolapp_api.egg-info}/PKG-INFO +1 -1
- {schoolapp_api-2.1.3 → schoolapp_api-2.1.4}/LICENSE +0 -0
- {schoolapp_api-2.1.3 → schoolapp_api-2.1.4}/README.md +0 -0
- {schoolapp_api-2.1.3 → schoolapp_api-2.1.4}/schoolapp_api/__init__.py +0 -0
- {schoolapp_api-2.1.3 → schoolapp_api-2.1.4}/schoolapp_api/constants.py +0 -0
- {schoolapp_api-2.1.3 → schoolapp_api-2.1.4}/schoolapp_api/managers/__init__.py +0 -0
- {schoolapp_api-2.1.3 → schoolapp_api-2.1.4}/schoolapp_api/managers/attendance_manager.py +0 -0
- {schoolapp_api-2.1.3 → schoolapp_api-2.1.4}/schoolapp_api/managers/base_manager.py +0 -0
- {schoolapp_api-2.1.3 → schoolapp_api-2.1.4}/schoolapp_api/managers/course_manager.py +0 -0
- {schoolapp_api-2.1.3 → schoolapp_api-2.1.4}/schoolapp_api/managers/grades_manager.py +0 -0
- {schoolapp_api-2.1.3 → schoolapp_api-2.1.4}/schoolapp_api/managers/profile_manager.py +0 -0
- {schoolapp_api-2.1.3 → schoolapp_api-2.1.4}/schoolapp_api/parsers/__init__.py +0 -0
- {schoolapp_api-2.1.3 → schoolapp_api-2.1.4}/schoolapp_api/parsers/absences.py +0 -0
- {schoolapp_api-2.1.3 → schoolapp_api-2.1.4}/schoolapp_api/parsers/annees.py +0 -0
- {schoolapp_api-2.1.3 → schoolapp_api-2.1.4}/schoolapp_api/parsers/filieres.py +0 -0
- {schoolapp_api-2.1.3 → schoolapp_api-2.1.4}/schoolapp_api/parsers/modules.py +0 -0
- {schoolapp_api-2.1.3 → schoolapp_api-2.1.4}/schoolapp_api/parsers/note_elem.py +0 -0
- {schoolapp_api-2.1.3 → schoolapp_api-2.1.4}/schoolapp_api/parsers/note_mod.py +0 -0
- {schoolapp_api-2.1.3 → schoolapp_api-2.1.4}/schoolapp_api/parsers/profile.py +0 -0
- {schoolapp_api-2.1.3 → schoolapp_api-2.1.4}/schoolapp_api/parsers/sanctions.py +0 -0
- {schoolapp_api-2.1.3 → schoolapp_api-2.1.4}/schoolapp_api/parsers/semestres.py +0 -0
- {schoolapp_api-2.1.3 → schoolapp_api-2.1.4}/schoolapp_api/parsers/stats.py +0 -0
- {schoolapp_api-2.1.3 → schoolapp_api-2.1.4}/schoolapp_api/school_app_client.py +0 -0
- {schoolapp_api-2.1.3 → schoolapp_api-2.1.4}/schoolapp_api/types/__init__.py +0 -0
- {schoolapp_api-2.1.3 → schoolapp_api-2.1.4}/schoolapp_api/types/annee.py +0 -0
- {schoolapp_api-2.1.3 → schoolapp_api-2.1.4}/schoolapp_api/types/base.py +0 -0
- {schoolapp_api-2.1.3 → schoolapp_api-2.1.4}/schoolapp_api/types/element.py +0 -0
- {schoolapp_api-2.1.3 → schoolapp_api-2.1.4}/schoolapp_api/types/module.py +0 -0
- {schoolapp_api-2.1.3 → schoolapp_api-2.1.4}/schoolapp_api/types/semestre.py +0 -0
- {schoolapp_api-2.1.3 → schoolapp_api-2.1.4}/schoolapp_api.egg-info/SOURCES.txt +0 -0
- {schoolapp_api-2.1.3 → schoolapp_api-2.1.4}/schoolapp_api.egg-info/dependency_links.txt +0 -0
- {schoolapp_api-2.1.3 → schoolapp_api-2.1.4}/schoolapp_api.egg-info/requires.txt +0 -0
- {schoolapp_api-2.1.3 → schoolapp_api-2.1.4}/schoolapp_api.egg-info/top_level.txt +0 -0
- {schoolapp_api-2.1.3 → schoolapp_api-2.1.4}/setup.cfg +0 -0
|
@@ -71,11 +71,12 @@ class AuthManager:
|
|
|
71
71
|
|
|
72
72
|
def check_session(self):
|
|
73
73
|
"""
|
|
74
|
-
Confirm whether the session is still valid.
|
|
74
|
+
Confirm whether the session is still valid by visiting the index page.
|
|
75
75
|
"""
|
|
76
|
-
|
|
76
|
+
from schoolapp_api.constants import INDEX_URL
|
|
77
|
+
code, url, content = self.http_client.get(INDEX_URL)
|
|
77
78
|
|
|
78
|
-
# If server redirects us
|
|
79
|
+
# If server redirects us to login, session is dead
|
|
79
80
|
if url and "/login" in url:
|
|
80
81
|
self.logged_in = False
|
|
81
82
|
return False
|
|
@@ -24,13 +24,9 @@ class HTTPClient:
|
|
|
24
24
|
def __init__(self, base_url):
|
|
25
25
|
self.base_url = base_url
|
|
26
26
|
self.cookie_jar = http.cookiejar.CookieJar()
|
|
27
|
-
opener = urllib.request.build_opener(
|
|
28
|
-
urllib.request.HTTPCookieProcessor(self.cookie_jar)
|
|
29
|
-
NoRedirectHandler()
|
|
27
|
+
self.opener = urllib.request.build_opener(
|
|
28
|
+
urllib.request.HTTPCookieProcessor(self.cookie_jar)
|
|
30
29
|
)
|
|
31
|
-
urllib.request.install_opener(opener)
|
|
32
|
-
# opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(self.cookie_jar))
|
|
33
|
-
# urllib.request.install_opener(opener)
|
|
34
30
|
self.headers = DEFAULT_HEADERS.copy()
|
|
35
31
|
|
|
36
32
|
def get(self, url, params=None):
|
|
@@ -43,15 +39,20 @@ class HTTPClient:
|
|
|
43
39
|
|
|
44
40
|
req = urllib.request.Request(url, headers=self.headers, method="GET")
|
|
45
41
|
|
|
46
|
-
with
|
|
42
|
+
with self.opener.open(req, timeout=15) as response:
|
|
47
43
|
code = response.getcode()
|
|
48
44
|
response_url = response.geturl()
|
|
49
45
|
content = response.read().decode("utf-8")
|
|
50
46
|
return code, response_url, content
|
|
51
47
|
|
|
52
48
|
except urllib.error.HTTPError as e:
|
|
49
|
+
# Still get content from error page if possible (some portals return 401 with nice HTML)
|
|
50
|
+
try:
|
|
51
|
+
content = e.read().decode("utf-8")
|
|
52
|
+
except:
|
|
53
|
+
content = None
|
|
53
54
|
logger.error(f"HTTP Error {e.code}: {e.reason}")
|
|
54
|
-
return e.code,
|
|
55
|
+
return e.code, e.url, content
|
|
55
56
|
except Exception as e:
|
|
56
57
|
logger.error(f"GET Error: {e}")
|
|
57
58
|
return None, None, None
|
|
@@ -66,14 +67,18 @@ class HTTPClient:
|
|
|
66
67
|
if referer:
|
|
67
68
|
req.add_header('Referer', referer)
|
|
68
69
|
|
|
69
|
-
with
|
|
70
|
+
with self.opener.open(req, timeout=15) as response:
|
|
70
71
|
code = response.getcode()
|
|
71
72
|
response_url = response.geturl()
|
|
72
73
|
content = response.read().decode('utf-8')
|
|
73
74
|
return code, response_url, content
|
|
74
75
|
except urllib.error.HTTPError as e:
|
|
76
|
+
try:
|
|
77
|
+
content = e.read().decode("utf-8")
|
|
78
|
+
except:
|
|
79
|
+
content = None
|
|
75
80
|
logger.error(f"HTTP Error {e.code}: {e.reason}")
|
|
76
|
-
return e.code,
|
|
81
|
+
return e.code, e.url, content
|
|
77
82
|
except Exception as e:
|
|
78
83
|
logger.error(f"POST Error: {e}")
|
|
79
84
|
return None, None, None
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|