Skip to content

Commit

Permalink
get results from API
Browse files Browse the repository at this point in the history
get planner from API
require platform ID
  • Loading branch information
alessiodam committed May 6, 2024
1 parent d53f53d commit 530287f
Show file tree
Hide file tree
Showing 8 changed files with 234 additions and 7 deletions.
1 change: 1 addition & 0 deletions .env.example
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
SMARTSCHOOL_DOMAIN="myschool.smartschool.be"
SMARTSCHOOL_PHPSESSID="PHPSESSID cookie value here"
SMARTSCHOOL_PID="PID cookie value here"
SMARTSCHOOL_PLATFORM_ID=1234
SMARTSCHOOL_USER_ID="change with your own user ID without quotes, it's a number."
5 changes: 3 additions & 2 deletions examples/get_courses.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
"""
Websocket client example
Get courses example
"""
import os
import logging
Expand All @@ -17,9 +17,10 @@
smart_school_client.phpsessid = os.getenv('SMARTSCHOOL_PHPSESSID')
smart_school_client.pid = os.getenv('SMARTSCHOOL_PID')
smart_school_client.user_id = os.getenv('SMARTSCHOOL_USER_ID')
smart_school_client.platform_id = os.getenv('SMARTSCHOOL_PLATFORM_ID')

courses = smart_school_client.get_courses()

print("Your courses:")
for course in courses:
print("{} - {} - {}".format(course['id'], course['name'], course['teacher']))
print(f"{course['id']} - {course['name']} - {course['teacher']}")
60 changes: 60 additions & 0 deletions examples/get_grades.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
"""
Get grades example
"""
import os
import logging
import dotenv
import smartschoolapi_tkbstudios as smsapi


def format_grade(grade_to_format):
"""
Format grade
"""
course_name = grade_to_format['courses'][0]['name']
grade_name = grade_to_format['name']
grade_percentage = grade_to_format['graphic']['value']
grade_description = grade_to_format['graphic']['description']
grade_date = grade_to_format['date']
grade_available_since_date = grade_to_format['availabilityDate']
teacher_name = grade_to_format['gradebookOwner']['name']['startingWithLastName']
period_name = grade_to_format['period']['name']
period_active = bool(grade_to_format['period']['isActive'])

feedbacks = grade_to_format.get('feedbacks', [])
feedback_str = ""
for feedback in feedbacks:
student_name = feedback['student']['name']['startingWithLastName']
teacher_name = feedback['teacher']['name']['startingWithLastName']
feedback_text = feedback['text']
feedback_str += f"\nFeedback for {student_name} from {teacher_name}:\n {feedback_text}\n"

return f"Course: {course_name}\n" \
f"Grade: {grade_name}\n" \
f"Grade: {grade_percentage}{'%' if isinstance(grade_percentage, int) else ''}" \
f" - {grade_description}\n" \
f"Date: {grade_date}\n" \
f"Available since: {grade_available_since_date}\n" \
f"Teacher: {teacher_name}\n" \
f"Period: {period_name}{' - Active period!' if period_active else ''}\n" \
f"{f"Feedbacks: {feedback_str}" if feedback_str else ''}"


if __name__ == '__main__':
dotenv.load_dotenv()

smart_school_client = smsapi.SmartSchoolClient(
domain=os.getenv('SMARTSCHOOL_DOMAIN'),
loglevel=logging.DEBUG,
)
smart_school_client.phpsessid = os.getenv('SMARTSCHOOL_PHPSESSID')
smart_school_client.pid = os.getenv('SMARTSCHOOL_PID')
smart_school_client.user_id = os.getenv('SMARTSCHOOL_USER_ID')
smart_school_client.platform_id = os.getenv('SMARTSCHOOL_PLATFORM_ID')

grades = smart_school_client.get_results()

for grade in reversed(grades):
formatted_grade = format_grade(grade)
print(formatted_grade)
print("\n")
70 changes: 70 additions & 0 deletions examples/get_planner.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
"""
Get planner example
"""
import os
import logging
import dotenv
import smartschoolapi_tkbstudios as smsapi


def format_agenda_item(item_to_format):
"""
Format agenda item
"""
if 'courses' in item_to_format:
if len(item_to_format['courses']) > 0:
course = item_to_format['courses'][0]['name']
else:
course = 'No course'
else:
course = 'No course'
return {
'id': item_to_format['id'],
'name': item_to_format['name'] if 'name' in item_to_format else 'No name',
'course': course,
'from_date': item_to_format['period']['dateTimeFrom'],
'to_date': item_to_format['period']['dateTimeTo'],
'whole_day': bool(item_to_format['period']['wholeDay']),
'deadline': bool(item_to_format['period']['deadline']),
'pinned': bool(item_to_format['pinned'])
}


def print_item(item_to_print):
"""
Print item
"""
print(
f"{item_to_print['name'] if item_to_print['name'] else ''} "
f"in {item_to_print['course']} "
f"from {item_to_print['from_date']} "
f"to {item_to_print['to_date']}"
)
if item_to_print['whole_day']:
print("Whole day")
if item_to_print['deadline']:
print("Deadline")
if item_to_print['pinned']:
print("Pinned")
print()


if __name__ == '__main__':
dotenv.load_dotenv()

smart_school_client = smsapi.SmartSchoolClient(
domain=os.getenv('SMARTSCHOOL_DOMAIN'),
loglevel=logging.DEBUG,
)
smart_school_client.phpsessid = os.getenv('SMARTSCHOOL_PHPSESSID')
smart_school_client.pid = os.getenv('SMARTSCHOOL_PID')
smart_school_client.user_id = os.getenv('SMARTSCHOOL_USER_ID')
smart_school_client.platform_id = os.getenv('SMARTSCHOOL_PLATFORM_ID')

FROM_DATE = None
TO_DATE = None
planner_items = smart_school_client.get_planner(FROM_DATE, TO_DATE)

for item in planner_items:
print_item(format_agenda_item(item))
4 changes: 1 addition & 3 deletions examples/list_messages.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,6 @@


if __name__ == '__main__':
"""
List messages
"""
os.makedirs("messages", exist_ok=True)
dotenv.load_dotenv()

Expand All @@ -22,6 +19,7 @@
smart_school_client.phpsessid = os.getenv('SMARTSCHOOL_PHPSESSID')
smart_school_client.pid = os.getenv('SMARTSCHOOL_PID')
smart_school_client.user_id = os.getenv('SMARTSCHOOL_USER_ID')
smart_school_client.platform_id = os.getenv('SMARTSCHOOL_PLATFORM_ID')

messages = smart_school_client.list_messages()
print(f"You have {len(messages)} messages.")
Expand Down
1 change: 1 addition & 0 deletions examples/websocket_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ def received_message_callback(message_data):
smart_school_client.phpsessid = os.getenv('SMARTSCHOOL_PHPSESSID')
smart_school_client.pid = os.getenv('SMARTSCHOOL_PID')
smart_school_client.user_id = os.getenv('SMARTSCHOOL_USER_ID')
smart_school_client.platform_id = os.getenv('SMARTSCHOOL_PLATFORM_ID')
smart_school_client.received_message_callback = received_message_callback

smart_school_client.run_websocket()
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[project]
name = "smartschoolapi_tkbstudios"
version = "1.1.0"
version = "1.1.1"
authors = [
{ name="TKB Studios", email="tkbstudios@mail.tkbstudios.com" },
]
Expand Down
98 changes: 97 additions & 1 deletion src/smartschoolapi_tkbstudios/smartschool.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
import logging
from xml.etree import ElementTree
from uuid import uuid4
import re
import datetime
import colorlog
import requests
import websocket
Expand Down Expand Up @@ -37,6 +39,7 @@ class SmartSchoolClient:
phpsessid: PHPSESSID
pid: pid
user_id: user id
platform_id: platform id
received_message_callback: callback function
api_logger: logger for API
Expand All @@ -47,13 +50,15 @@ class SmartSchoolClient:
get_token_from_api()
get_messages_from_api()
get_message_by_id(message_id)
get_school_courses()
get_planner(from_date=None, to_date=None)
list_messages()
authenticate()
run_websocket()
"""

def __init__(self, domain, loglevel=logging.DEBUG):
self.domain = domain
self.platform_id = None
self.phpsessid = None
self.pid = None
self.user_id = None
Expand Down Expand Up @@ -308,6 +313,97 @@ def get_courses(self):
self.api_logger.error("Could not get courses")
raise ApiException("Could not get courses")

def get_school_courses(self):
"""
WARNING: IN DEVELOPMENT
Get school courses
"""
self.api_logger.info("Requesting school courses from API")
self.api_logger.debug("Sending request to get school courses")
headers = {
'Cookie': f'pid={self.pid}; PHPSESSID={self.phpsessid}',
'Content-Type': 'application/json',
}
response = requests.post(
f'https://{self.domain}/course-list/api/v1/courses',
headers=headers,
timeout=10
)
if response.status_code == 200:
self.api_logger.info("School courses received")
courses_json = json.loads(response.text)
return courses_json
self.api_logger.error("Could not get school courses")
raise ApiException("Could not get school courses")

def get_results(self, page: int = 1, per_page: int = 50):
"""
Get results
"""
self.api_logger.info("Requesting results from API")
self.api_logger.debug("Sending request to get results")
headers = {
'Cookie': f'pid={self.pid}; PHPSESSID={self.phpsessid}',
'Content-Type': 'application/json',
'Accept': '*/*'
}
response = requests.get(
f'https://{self.domain}/results/api/v1/evaluations/?pageNumber={page}&itemsOnPage={per_page}',
headers=headers,
timeout=10
)
if response.status_code == 200:
self.api_logger.info("Results received")
results_json = json.loads(response.text)
return results_json
self.api_logger.error("Could not get results")

def get_planner(self, from_date=None, to_date=None):
"""
IN DEVELOPMENT
Get planner
Args:
from_date: from date (YYYY-MM-DD)
to_date: to date (YYYY-MM-DD)
"""
if from_date is not None and not re.match(r'^[0-9]{4}-[0-9]{2}-[0-9]{2}$', from_date):
raise ValueError("from_date must be in format YYYY-MM-DD")
if to_date is not None and not re.match(r'^[0-9]{4}-[0-9]{2}-[0-9]{2}$', to_date):
raise ValueError("to_date must be in format YYYY-MM-DD")

if from_date is None:
from_date = datetime.date.today().strftime("%Y-%m-%d")
if to_date is None:
to_date = (
datetime.datetime.strptime(from_date, "%Y-%m-%d")
+
datetime.timedelta(days=7)
).strftime("%Y-%m-%d")

self.api_logger.info("Requesting planner from API")
self.api_logger.debug("Sending request to get planner")
headers = {
'Cookie': f'pid={self.pid}; PHPSESSID={self.phpsessid}',
'Content-Type': 'application/json',
'Accept': '*/*'
}
if from_date is None and to_date is None:
url = f'https://{self.domain}/planner/api/v1/planned-elements/user/{self.platform_id}_{self.user_id}_0'
else:
url = f"https://{self.domain}/planner/api/v1/planned-elements/user/{self.platform_id}{self.user_id}_0?from={from_date}&to={to_date}"
response = requests.get(
url=url,
headers=headers,
timeout=10
)
if response.status_code == 200:
self.api_logger.info("Planner received")
planner_json = response.json()
return planner_json
self.api_logger.error("Could not get planner")
return None

# websockets
def ws_on_error(self, _, error):
"""
Expand Down

0 comments on commit 530287f

Please sign in to comment.