Add SDK docs
This commit is contained in:
parent
30b7c62296
commit
ba468b9de6
1 changed files with 173 additions and 0 deletions
173
sdk/src/README.md
Normal file
173
sdk/src/README.md
Normal file
|
@ -0,0 +1,173 @@
|
||||||
|
# Fuji SDK
|
||||||
|
|
||||||
|
## Jak używać
|
||||||
|
|
||||||
|
Obecnie działa jedynie prometeusz (eduvulcan).
|
||||||
|
|
||||||
|
### Techniczny wstęp
|
||||||
|
|
||||||
|
Trzeba skorzystać z interfejsu np. `PrometheusInterface`. Dla każdego interfejsu podajemy dwa parametry:
|
||||||
|
|
||||||
|
- `auth_context` - są w nim dane logowania, sesje, certyfikaty (ogółem dane, które pozwalają dostać się do dziennika, **pamiętaj, by trzymać je w bezpiecznym miejscu**),
|
||||||
|
- `student_context` - są w nim dane ucznia, pozwalające na wykonywanie zapytań do API, których używają interfejsy. (nie jest on konieczny, gdy logujesz się albo pobierasz uczniów)
|
||||||
|
|
||||||
|
Typy tych contextów są różne dla każdego dziennika. Jak uzyskać te contexty, dowiesz się niżej.
|
||||||
|
|
||||||
|
### Logowanie
|
||||||
|
|
||||||
|
#### Prometeusz (eduvulcan)
|
||||||
|
|
||||||
|
Musimy stworzyć instancję interfejsu `PrometheusInterface`, na początku musi on zawierać jedynie `auth_context`, który musi zawierać jedynie dane logowania do dziennika.
|
||||||
|
|
||||||
|
**UWAGA: Nie loguj się do dziennika od nowa za każdym razem, o tym jak zapisać zalogowane konto niżej.**
|
||||||
|
|
||||||
|
```py
|
||||||
|
from sdk.src.interfaces.prometheus.context import (
|
||||||
|
PrometheusAuthContext,
|
||||||
|
PrometheusWebCredentials,
|
||||||
|
)
|
||||||
|
from sdk.src.interfaces.prometheus.interface import PrometheusInterface
|
||||||
|
|
||||||
|
# Tworzymy interfejs prometeuszowy interfejs
|
||||||
|
interface = PrometheusInterface(
|
||||||
|
# Auth context, o tym więcej niżej
|
||||||
|
auth_context=PrometheusAuthContext(
|
||||||
|
# Dane logowania
|
||||||
|
prometheus_web_credentials=PrometheusWebCredentials(
|
||||||
|
username="<nazwa użytkownika>", password="<hasło użytkownika>"
|
||||||
|
)
|
||||||
|
),
|
||||||
|
student_context=None,
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
Gdy stworzyliśmy już instancję interfejsu, trzeba się zalogować, jest to bardzo proste. ~~Szkoda tylko, że w środku interfejsu już nie.~~
|
||||||
|
|
||||||
|
```py
|
||||||
|
interface.login()
|
||||||
|
```
|
||||||
|
|
||||||
|
Reszta część będzie wspólna dla wszystkich dzienników.
|
||||||
|
|
||||||
|
### Zapisywanie zalogowanego konta
|
||||||
|
|
||||||
|
Po zalogowaniu trzeba by było zapisać te dane, bo logowanie za każdym razem od nowa jest czasochłonne.
|
||||||
|
|
||||||
|
```py
|
||||||
|
auth_context = interface.get_auth_context()
|
||||||
|
```
|
||||||
|
|
||||||
|
Później, jak będziesz tworzyć instancję interfejsu, to w parametrze `auth_context` daj właśnie to.
|
||||||
|
|
||||||
|
**Pamiętaj, by trzymać to w bezpiecznym miejscu!**
|
||||||
|
|
||||||
|
### Pobieranie i wybieranie uczniów
|
||||||
|
|
||||||
|
Jak jesteśmy zalogowani, to możemy pobrać uczniów, jest to bardzo proste. **UWAGA! Nie rób tego za każdym razem, tylko zapisz sobie gdzieś te dane.**
|
||||||
|
|
||||||
|
```py
|
||||||
|
students = interface.get_students()
|
||||||
|
```
|
||||||
|
|
||||||
|
Jak dokładnie wygląda to co zwraca `get_students()` możesz sprawdzić w kodzie, to co teraz istotne to to, że każdy uczeń ma w sobie pole `context`. Jak możesz się domyślać jest to pole, które będziemy dawać interfejsowi. Możemy to zrobić albo przy tworzeniu instancji interfejsu:
|
||||||
|
|
||||||
|
```py
|
||||||
|
interface = PrometheusInterface(
|
||||||
|
auth_context=...,
|
||||||
|
student_context=<tu_to_dajesz>,
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
albo, gdy mamy już stworzoną instancję interfejsu:
|
||||||
|
|
||||||
|
```py
|
||||||
|
interface.select_student(<tu_to_dajesz>)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Co dalej?
|
||||||
|
|
||||||
|
No możesz pobrać na przykład oceny, możesz to zrobić (gdy jesteś zalogowany i masz wybranego ucznia) tak:
|
||||||
|
|
||||||
|
```py
|
||||||
|
grades = interface.get_grades(<numer semestru>)
|
||||||
|
```
|
||||||
|
|
||||||
|
## Jak dodawać funkcjonalności:
|
||||||
|
|
||||||
|
1. Zrób model(e) do danych, nie dawaj zbyt dużo danych, bo pamiętaj, że ma być to uniwersalny model dla wielu dzienników.
|
||||||
|
2. Zrób funkcje w odpowiednich api do pobierania tych danych.
|
||||||
|
3. Zrób mappery w modelach dla odpowiednich api.
|
||||||
|
4. Zrób funkcję we wszystkich interfejsach do pobierania tych danych, przy obsłudze api.
|
||||||
|
|
||||||
|
### Przykład dla sprawdzianów (tylko dla Prometeusza)
|
||||||
|
|
||||||
|
1 i 3. `sdk/src/models/exam.py`
|
||||||
|
```py
|
||||||
|
class ExamType(Enum):
|
||||||
|
TEST = 0
|
||||||
|
SHORT_TEST = 1
|
||||||
|
CLASSWORK = 2
|
||||||
|
OTHER = 3
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def from_hebe_type_name(type_name: str):
|
||||||
|
match type_name:
|
||||||
|
case "Sprawdzian":
|
||||||
|
return ExamType.TEST
|
||||||
|
case "Kartkówka":
|
||||||
|
return ExamType.SHORT_TEST
|
||||||
|
case "Praca klasowa":
|
||||||
|
return ExamType.CLASSWORK
|
||||||
|
case _:
|
||||||
|
return ExamType.OTHER
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class Exam:
|
||||||
|
deadline: date
|
||||||
|
subject: str
|
||||||
|
type: ExamType
|
||||||
|
description: str
|
||||||
|
creator: str
|
||||||
|
created_at: datetime
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def from_hebe_dict(data: dict):
|
||||||
|
return Exam(
|
||||||
|
deadline=datetime.fromtimestamp(data["Deadline"]["Timestamp"] / 1000),
|
||||||
|
subject=data["Subject"]["Name"],
|
||||||
|
type=ExamType.from_hebe_type_name(data["Type"]),
|
||||||
|
description=data["Content"],
|
||||||
|
creator=data["Creator"]["DisplayName"],
|
||||||
|
created_at=datetime.fromtimestamp(data["DateCreated"]["Timestamp"] / 1000),
|
||||||
|
)
|
||||||
|
```
|
||||||
|
2. `sdk/src/apis/hebe/client.py`
|
||||||
|
```py
|
||||||
|
def get_exams(self, student_id: int, from_: date, to: date):
|
||||||
|
envelope = self._send_request(
|
||||||
|
"GET",
|
||||||
|
ENDPOINT_EXAM_BYPUPIL,
|
||||||
|
params={
|
||||||
|
"pupilId": student_id,
|
||||||
|
"dateFrom": from_,
|
||||||
|
"dateTo": to,
|
||||||
|
},
|
||||||
|
)
|
||||||
|
return list(map(Exam.from_hebe_dict, envelope))
|
||||||
|
```
|
||||||
|
|
||||||
|
4.
|
||||||
|
|
||||||
|
4.1. prometheus interface
|
||||||
|
```py
|
||||||
|
def get_exams(self, from_: date, to: date):
|
||||||
|
self._check_is_auth_context_full()
|
||||||
|
self._check_is_student_selected()
|
||||||
|
return self._hebe_client.get_exams(self._student_context.student_id, from_, to)
|
||||||
|
```
|
||||||
|
4.2. core interface
|
||||||
|
```py
|
||||||
|
def get_exams(from_: date, to: date) -> list[Exam]:
|
||||||
|
pass
|
||||||
|
```
|
Loading…
Add table
Reference in a new issue