Voorbeeld: Trello

Trello (https://trello.com) is een web-toepassing waarin je met borden, lijsten en kaartjes een planning kunt maken. Trello heeft een web-API waarmee je deze toepassing kunt besturen. Via dit web-API kan Trello met extra functionaliteit uitgrebreid worden (“power-ups”), en zijn er verbindingen (“integrations”) met andere toepassingen mogelijk.

In dit hoofdstuk geven we een inleiding in het gebruik van deze web-API. We vragen borden, lijsten en kaartjes op; en maken een bord aan, met daarop een kaartje, dat we van de ene lijst naar de andere verplaatsen. En we ruimen het bord weer op.

Importeren Python libraries

Voor het gebruik van de Trello API hebben we de Python-libraries requests en json nodig.

Tip: uitvoeren van de opdrachten

Je kunt de onderstaande opdrachten uitvoeren in een interactief Jupyter Notebook. Klik daarvoor op de Binder-knop hierboven, onder de “raket”. Er wordt dan een server opgestart met dit hoofdstuk als interactief Notebook.

Als je nog geen ervaring hebt met Jupyter Notebook, is het handig om eerst de Inleiding Jupyter Notebook door te werken.

import requests
import json

Trello begrippen

Een Trello-bord (board) bestaat uit een serie lijsten (lists); elke lijst bestaat uit een serie kaartjes (cards). Op de kaartjes kun je allerlei informatie plaatsen, en je kunt de kaartjes van de ene lijst naar de andere verplaatsen. Vaak-gebruikte lijsten zijn “To Do”, “Doing”, en “Done”.

Andere Trello-begrippen zijn acties (actions), attachments, organizations, enz. In dit materiaal gaan we daar niet verder op in.

De beschrijving van de Trello API vind je op https://developer.atlassian.com/cloud/trello/

Authenticatie/autorisatie

Voor het gebruik van Trello via de normale user interface moet je inloggen, met een gebruikersnaam en wachtwoord. Op dezelfde manier moet je je identificeren en authenticeren bij het gebruik van de web-API. Daarvoor zijn twee onderdelen nodig: de Api-key, die gekoppeld is aan de ontwikkelaar (script-programmeur), en een token, dat gekoppeld is aan de gebruiker/borden, met de nodige toegangsrechten (autorisatie).

  • Log in bij Trello

  • Je Api-key kun je ophalen via: https://trello.com/app-key/

  • De waarde die je daar vindt vul je in als invoer voor de volgende cel (eerst uitvoeren: shift-return, dan invoer geven, afgesloten met de return-toets)

  • Je krijgt nu te zien: “ingevulde api_key”, met de waarde

  • Ga daarna met pijltjes naar volgende cel.

api_key = input("API-key? ")
print("ingevulde api_key: " + api_key)

API-token

De beschrijving van de authenticatie en autorisatie vind je op https://developer.atlassian.com/cloud/trello/guides/rest-api/authorization/ . De stappen hieronder zijn een uitwerking daarvan.

Het API-token geeft toegang tot de borden van de gebruiker. Via de onderstaande URL vraag je een token aan voor je eigen borden. Daar moet je toestemming voor geven.

Je kunt de URL eventueel aanpassen: de URL hieronder geeft toestemming voor 1 dag (expiration=1day), voor lezen en schrijven (scope=read,write). Je kunt ook kiezen voor een langere periode. Je kunt ook eerst werken met alleen lezen, maar voor de latere opdrachten heb je ook schrijfrechten nodig.

  • Voer eerst de cel hieronder uit; deze geeft een URL als resultaat

  • Klik op die URL: daarmee krijg je een scherm waarin je toestemming moet geven voor toegang tot je borden.

  • Nadat je toestemming gegeven hebt krijg je een scherm met het token; kopieer dit token (Copy).

url = "https://trello.com/1/authorize?expiration=1day&name=MyTestToken&scope=read,write&response_type=token&key=" + api_key
print(url)
  • Voer de onderstaande cel uit, en vul (Paste) het token in bij de invoer, gevolgd door een return.

  • Je krijgt te zien: “ingevuld token” met de ingevulde waarde.

  • Ga met de pijltjes naar de volgende cel.

token = input("token? ")
print("ingevuld token: ", token)

Opvragen van borden

Als eerste stap vraag je de beschikbare borden op. In de URL moet je de api_key en het token meegeven, voor de authenticatie/autorisatie. Daarnaast kun je (via field) aangeven welke velden je wilt hebben van de bord-objecten: er zijn heel veel velden, maar meestal ben je maar in een paar geïnteresseerd.

Deze gegevens geef je als parameters mee achter het ? in de URL: daar zorgt de requests library voor.

  • voer de volgende twee cellen uit;

  • als de status_code 200 is, dan is de opdracht geslaagd; anders is er mogelijk iets mis met de key/token combinatie.

parameters = {
   'key': api_key,
   'token': token,
   'fields': 'name,id,url'
}
response = requests.get(
   "https://api.trello.com/1/members/me/boards",
   headers={"Accept": "application/json"},
   params=parameters
)
response.status_code
  • Als de status_code 200 is, dan is het resultaat beschikbaar in JSON-formaat:

boards = response.json()
boards
for board in boards:
    print(board["name"], " - ", board["id"])
  • Het laatste bord in de lijst:

boards[-1]

Opvragen van lijsten

  • De volgende stap is het opvragen van de lijsten van één van de borden, bijvoorbeeld het laatste bord uit het overzicht. (Pas dit eventueel hieronder aan.)

board_id = boards[-1]["id"]

parameters = {
   'key': api_key,
   'token': token,
   'fields': 'name,id' 
}

response = requests.get(
   "https://api.trello.com/1/boards/{id}/lists".format(
       id = board_id
   ),
   headers={"Accept": "application/json"},
   params=parameters
)
response.status_code
  • Als de status_code 200 is, is het resultaat als JSON beschikbaar:

lists = response.json()
lists

Opvragen van de lijst-kaartjes

  • De namen en id’s van de kaartjes van de eerste lijst vraag je op met de URL /lists/{id}/cards, waarin {id} de identificatie van deze eerste lijst is:

list_id = lists[0]["id"]

parameters = {
   'key': api_key,
   'token': token,
   'fields': 'name,id' 
}

response = requests.get(
   "https://api.trello.com/1/lists/{id}/cards".format(
       id = list_id
   ),
   headers={"Accept": "application/json"},
   params=parameters
)
response.status_code
cards = response.json()
cards

Opvragen van een kaartje

  • Met de volgende opdracht haal je de gegevens van het eerste kaartje uit de lijst op.

  • Pas eventueel de lijst met velden aan die je van dit kaartje wilt zien.

card_id = cards[0]["id"]

parameters = {
   'key': api_key,
   'token': token,
   'fields': "name,desc,id,url"
}

response = requests.get(
   "https://api.trello.com/1/cards/{id}".format(
       id = card_id
   ),
   headers={"Accept": "application/json"},
   params=parameters
)
response.status_code
my_card = response.json()
my_card

Opdracht

  • Zoek uit welke velden beschikbaar zijn voor een card (zie de API-beschrijving).

  • Voeg twee velden toe in bovenstaande code, en voer de opdracht nog een keer uit.

Een nieuw bord

Trello in het Nederlands?

Bij deze opdrachten gaan er er van uit dat je de Engelstalige versie van Trello gebruikt. In de Nederlandstalige versie heten de lijsten anders. Pas waar nodig de programmatekst aan.

Maak een nieuw bord aan, met de default-lijsten:

  • To Do, Doing, Done

parameters = {
   'key': api_key,
   'token': token,
   'name': "API test board"
}

response = requests.post(
   "https://api.trello.com/1/boards",
   headers={"Accept": "application/json"},
   params=parameters
)
response.status_code
my_board = response.json()
my_board

Opdracht (2e ronde - begin hier)

Voer deze opdracht uit nadat je alle onderstaande opdrachten uitgevoerd hebt, en het bord weer opgeruimd is.

  • Zoek uit hoe je een bord aanmaakt zonder de default-lijsten, en

  • Pas de opdracht hierboven om een leeg bord aan te maken

  • Zoek uit hoe je in de API een lijst aan een bord toevoegt

  • Voeg achtereenvolgens de lijsten Backlog, To Do, Doing, Testing, Done toe

  • Gebruik de onderstaande cellen voor het maken van een request voor het toevoegen van een lijst aan een bord.

Bepaal lijsten

  • Vraag de lijsten van het nieuwe bord op.

parameters = {
   'key': api_key,
   'token': token,
   'fields': 'name,id' 
}

response = requests.get(
   "https://api.trello.com/1/boards/{id}/lists".format(
       id = my_board["id"]
   ),
   headers={"Accept": "application/json"},
   params=parameters
)
response.status_code
my_lists = response.json()
my_lists

Lijsten in Python dictionary

Om deze lijsten beter te kunnen hanteren maken we hiervan een Python dictionary, zodat je de identificatie van een lijst via de naam kunt vinden, bijvoorbeeld `list_ids[“Done”].

  • zet het resultaat om in een Python dictionary list_ids.

list_ids = {}
for elem in my_lists:
    print(elem)
    name = elem["name"]
    list_ids[name] = elem["id"]
list_ids["To Do"]

Nieuw kaartje in lijst To Do

We kunnen nu een nieuw kaartje aanmaken in de lijst “To Do”. Voor dit nieuwe kaartje kunnen we allerlei gegevens invullen; we beperken ons hier tot de naam, beschrijving en positie in de lijst.

  • Maak een nieuwe kaart aan in de lijst “To Do”.

parameters = {
   'key': api_key,
   'token': token,
   'name': "A new card",
   'desc': "A card generated via the API",
   'pos': 'top',
   'idList': list_ids["To Do"]
}

response = requests.post(
   "https://api.trello.com/1/cards",
   headers={"Accept": "application/json"},
   params=parameters
)
response.status_code
new_card = response.json()
new_card

Opdracht (2e ronde)

  • zoek uit in de API-beschrijving welke gegevens je allemaal op een kaartje kunt invullen

  • maak nog een kaartje aan in dezelfde lijst, met een andere naam, en met één of meer labels.

  • gebruik hiervoor de onderstaande cellen.

Verplaats kaartje naar lijst Doing

Voor het wijzigen (update) van een kaartje gebruik je de method PUT. In de parameters geef je de velden aan die je wilt veranderen.

  • Verplaats de card door een andere idList op te geven.

parameters = {
   'key': api_key,
   'token': token,
   'idList': list_ids["Doing"]
}

response = requests.put(
   "https://api.trello.com/1/cards/{id}".format(
       id = new_card["id"]
   ),
   headers={"Accept": "application/json"},
   params=parameters
)
response.status_code
new_card = response.json()
print(new_card["url"])

Opdracht (2e ronde)

  • Zoek in de API-beschrijving uit welke velden je op een card kunt aanpassen.

  • Verander tenminste 1 ander veld op het kaartje

  • gebruik hiervoor de cellen hieronder

Verwijder kaartje

Soms moet je een kaartje verwijderen. Dat kan met de DELETE method.

  • Verwijder het kaartje dat je zojuist aangemaakt hebt.

parameters = {
   'key': api_key,
   'token': token
}

response = requests.delete(
   "https://api.trello.com/1/cards/{id}".format(
       id = new_card["id"]
   ),
   headers={"Accept": "application/json"},
   params=parameters
)
response.status_code

Ruim het bord op

Je kunt nu het bord weer opruimen, met een DELETE voor het bord.

  • Verwijder het bord

parameters = {
   'key': api_key,
   'token': token
}

response = requests.delete(
   "https://api.trello.com/1/boards/{id}".format(
       id = my_board["id"]
   ),
   headers={"Accept": "application/json"},
   params=parameters
)
response.status_code

Volgende opdrachten

2e ronde: voer de opdrachten vanaf het aanmaken van een nieuw bord opnieuw uit, en voer daarbij de opdrachten uit die gelabeld zijn met “2e ronde”.

3e ronde: zoek uit wat er nog meer mogelijk is met de Trello API, bijvoorbeeld op het gebied van Actions, en maak daarbij je eigen API-requests.