commit e1952c3f66b7acad07a1c28b139bbd8c27b2ecb0 Author: Jon Michael Aanes Date: Thu Sep 26 16:03:06 2024 +0200 Favro sync initial prototype diff --git a/test.py b/test.py new file mode 100644 index 0000000..a9fc6a6 --- /dev/null +++ b/test.py @@ -0,0 +1,75 @@ +import requests +import secret_loader +from typing import Any +import functools +import dataclasses + +URL_API_ROOT = 'https://favro.com/api/v1' +URL_GET_ALL_CARDS = URL_API_ROOT+'/cards' +URL_UPDATE_CARD = URL_API_ROOT+'/cards/{card_id}' + +# Types + +@dataclasses.dataclass(frozen=True) +class SeqId: + raw_id: int + +@dataclasses.dataclass(frozen=True) +class CardId: + raw_id: str + + +# Authentication + +secrets = secret_loader.SecretLoader() +FAVRO_ORG_ID = secrets.load_or_fail('FAVRO_ORGANIZATION_ID') +FAVRO_USERNAME = secrets.load_or_fail('FAVRO_USERNAME') +FAVRO_PASSWORD = secrets.load_or_fail('FAVRO_PASSWORD') + +headers = { + 'organizationId': FAVRO_ORG_ID, + 'content-type': 'application/json', +} + +SESSION = requests.Session() + +def get_card_json(seqid: SeqId) -> dict[str, Any]: + params = {'cardSequentialId': seqid.raw_id} + response = SESSION.get(URL_GET_ALL_CARDS, headers=headers, auth=(FAVRO_USERNAME, FAVRO_PASSWORD), params = params) + response.raise_for_status() + json = response.json() + assert json['pages'] == 1 + assert len(json['entities']) == 1 + return json['entities'][0] + +@functools.cache +def get_card_id(seqid: SeqId) -> CardId: + json = get_card_json(seqid) + return CardId(json['cardId']) + +description = ''' +I cannot remember what this card involved + +# Tasks + +- [ ] Why doesn't task work? +- [ ] Task 2 + +# Quotes + + I love this card. +''' + +def main(card_id: CardId): + + json_body = { + 'detailedDescription': description, + 'descriptionFormat': 'markdown', + } + + response = SESSION.put(URL_UPDATE_CARD.format(card_id=card_id.raw_id), + json=json_body, headers=headers, auth=(FAVRO_USERNAME, FAVRO_PASSWORD)) + response.raise_for_status() + +if __name__ == '__main__': + main(get_card_id(SeqId(4714)))