Package: bakapi
Bakaláři API v3 clientBaka(láři)
   API
------
BakapiJednoduchý klient k API Bakalářů pro Python.Changelog0.3 (2020-10-27)Nyní jsou defaultně používané timezone-aware datetimes. Pokud jetoken_valid_untiltimezone-unaware, předpokládá se že je v UTC.Přidán volitelný parametrtok domácím úkolům, viz změny vAPI dokumentaci0.2 (2020-10-13)Umožnění vytvoření klienta bez hesla, pouze zrefresh_tokenu, případně spolu saccess_tokenem a jeho platností.Přidán volitelný parametrsincek domácím úkolům. Když není zadán, tak Bakaláři
vrátí jen úkoly z posledních dvou měsíců (vizAPI dokumentace)0.1 (2020-04-09)První releaseDokumentaceThe code is the documentation. (Pls naučte mě někdo Sphinx)Modul obsahuje hlavní tříduBakapiUser.Konstruktor vždy vyžaduje dvakeywordargumenty:urlausername. Dále vyžaduje
buďpassword, které je okamžitě použito k získáníaccess_tokenu, neborefresh_token, volitelně spolu saccess_tokenatoken_valid_until. Ty jsou
uloženy a token je v případě potřeby obnoven až při prvním API požadavku.Metody instancíBakapiUsersend_request(endpoint, method="GET", **kwargs)zkontroluje platnostaccess_tokenu, případně ho obnoví. Poté pošle požadavek s autorizačním headrem.kwargsjsou předány metoděrequests.request.Vracírequests.Responsequery_api(endpoint, method="GET", **kwargs)volásend_request, pouze navíc
ověřuje, že dostala validní JSON odpověď.Vrací naparsovaná data jakodictget_user_info()získá informace o uživateli, vracídicttak, jak ho dostane od
Bakalářů. Vypadá zhruba takto:{'UserUID':'...','Class':<trida>,'FullName':'...','SchoolOrganizationName':'...','SchoolType':None,'UserType':'student','UserTypeText':'žák','StudyYear':1,'EnabledModules':[{'Module':'<nazev modulu>','Rights':['...']}],'SettingModules':{'...?'}}Známé názvy modulů:Komens, Absence, Events, Marks, Timetable, Substitutions, Subjects, Homeworks, GdprTřída je jednoduchýdict, vypadá takto:{'Id':'...','Abbrev':'...','Name':'...'}get_homework()získá seznam všech úkolů, vracídicttak, jak ho dostane od
Bakalářů. Přijímá volitelný parametrsince, kterým lze omezit datum, od kterého jsou
brané úkoly. Může býtdatetime.date,datetime.datetimenebo"YYYY-MM-DD".
Odpověď vypadá takto:{"Homeworks":[<ukoly>]}Každý úkol vypadá zhruba takto:{'ID':'...','DateAward':'0001-01-01T00:00:00+01:00','DateControl':None,'DateDone':'0001-01-01T00:00:00+01:00','DateStart':'0001-01-01T00:00:00+01:00','DateEnd':'0001-01-01T00:00:00+01:00','Content':'...','Notice':'','Done':True,'Closed':True,'Electronic':False,'Hour':6,'Class':<trida>,'Group':<skupina>,'Subject':<predmet>,'Teacher':<ucitel>,'Attachments':[<prilohy>]}Třída, skupina, předmět a učitel jsou jednoduchýdict, viz třída uget_user_info()Každá příloha vypadá takto:{'Id':'...','Name':'...','Type':'mime/type'}get_received_komens_messages()získá seznam všech přijatých zpráv v Komens, vracídicttak, jak ho dostane od Bakalářů. Vypadá takto:{"Messages":[<zpravy>]}Každá zpráva vypadá zhruba takto:{'$type':'GeneralMessage','Id':'...','Title':'Obecná zpráva','Text':'...','SentDate':'0001-01-01T00:00:00+01:00','Sender':<odesilatel>,'Attachments':[<prilohy>],'Read':True,'LifeTime':'ToRead','DateFrom':None,'DateTo':None,'Confirmed':True,'CanConfirm':False,'Type':'OBECNA','CanAnswer':True,'Hidden':False,'CanHide':True,'RelevantName':'...','RelevantPersonType':'teacher|administrator|...?'}Odesílatel je jednoduchýdict, viz třída uget_user_info()Pro formát přílohy viz úkoly.download_attachment(attachment_id)stáhne přílohu s daným ID.Vrací dvojicifilename,urllib3.response.HTTPResponseDokumentace endpointů je průběžně vytvářena v repozitářibakalari-api/bakalari-api-v3UkázkyPoužití přímo>>>frombakapiimportBakapiUser>>>u=BakapiUser(url="https://bakalari.skola.cz",username="jan_novak",password="honzikovoHeslo")>>>u.get_homework(){'Homeworks':[{'ID':'ABCDEFG','...':'...','Attachments':[{'Id':'EFAAAAG','Name':'Ukol.doc','Type':'application/msword'}]},'...']}>>>withopen("Ukol.doc","wb")asfh:...fh.write(u.download_attachment("EFAAAAG")[1].read())Použití jako MixinKnihovnu lze také použít jako Mixin do vaší vlastní classy uživatele.Pokud například chcete ve své aplikaci ukládat data do databáze pomocí SQLAlchemy,
vytvořte classu uživatel takto:classUser(BakapiUser,DeclarativeBase):id=Column(Integer,primary_key=True,autoincrement=True)# API používá tyto properties:url=Column(String)username=Column(String)token_valid_until=Column(DateTime)refresh_token=Column(String)access_token=Column(String)# další data, která používá vaše aplikacemore_data=Column(String)u=User(url="https://bakalari.skola.cz",username="jan_novak",password="honzikovoHeslo",more_data="neco")Je důležité, aby BakapiUser byl v seznamu inherited classes první, protože on předává
nepotřebné init parametry. Ostatní classy to ale dělat nemusí (a právě např.
DeclarativeBase to nedělá).Nemusíte definovat metodu__init__, ale pokud ji definujete, musí volatsuper().__init__()Konstruktor příjímá povinné keyword argumenty (viz začátek). Cokoliv
dalšího pošle dálPro pochopení doporučujituto StackOverflow answer