Skip to content

New card with Python3 and REST API

Lauri Ojansivu edited this page Sep 16, 2020 · 9 revisions

Also see:

Install

Windows

choco install python3
# REBOOT
pip3 install pip --upgrade
pip3 install pycurl certifi json
python3 wekan.py

Debian/Ubuntu

sudo apt-get -y install python3 python3-pip python3-pycurl python3-simplejson
sudo pip3 install pip --upgrade
sudo pip3 install certifi
chmod +x wekan.py
./wekan.py

wekan.py creating new card with Python3 and REST API

Previously this code did work. In newest Debian/Ubuntu this script did not work, there was some errors. If someone has fixes to this, please add a new issue with fixed code.

Change these:

#! /usr/bin/env python3
# -*- coding: utf-8 -*-
# vi:ts=4:et

import pycurl
try:
    # python 3
    from urllib.parse import urlencode
except ImportError:
    # python 2
    from urllib import urlencode

import certifi
import json
from io import BytesIO
import sys

arguments = len(sys.argv) - 1

if arguments == 0:
    print("=== Wekan API Python CLI: Shows IDs for addcard ===")
    print("AUTHORID is USERID that writes card.")
    print("Syntax:")
    print("  python3 wekan.py users              # All users")
    print("  python3 wekan.py boards USERID      # Boards of USERID")
    print("  python3 wekan.py board BOARDID      # Info of BOARDID")
    print("  python3 wekan.py swimlanes BOARDID  # Swimlanes of BOARDID")
    print("  python3 wekan.py lists BOARDID      # Lists of BOARDID")
    print("  python3 wekan.py addcard AUTHORID BOARDID SWIMLANEID LISTID CARDTITLE CARDDESCRIPTION")
    exit

# ------- SETTINGS START -------------

username = 'wekan-admin'
password = 'wekan-admin-password'
#wekanurl = 'https://boards.example.com/'
wekanurl = 'http://localhost/'

# SYNTAX
# python3 wekan.py addcard AUTHORID BOARDID SWIMLANEID LISTID CARDTITLE CARDDESCRIPTION

# EXAMPLE 2:
# Write to Welcome board
# python3 wekan.py addcard abcd efgh ijkl mnop "Welcome test" "Description test"

# ------- SETTINGS END -------------

# ------- API URL GERENARTION START -----------

loginurl = 'users/login'
wekanloginurl = wekanurl + loginurl
apiboards = 'api/boards/'
apiusers = 'api/users/'
s = '/'
l = 'lists'
sw = 'swimlane'
sws = 'swimlanes'
cs = 'cards'
bs = 'boards'
users = wekanurl + apiusers

# ------- API URL GERENARTION END -----------

# ------- LOGIN TOKEN START -----------

buffer = BytesIO()
c = pycurl.Curl()
c.setopt(c.URL, wekanloginurl)
c.setopt(c.WRITEDATA, buffer)
c.setopt(c.CAINFO, certifi.where())
post_data = {"username": username, "password": password}
# Form data must be provided already urlencoded.
postfields = urlencode(post_data)
# Sets request method to POST,
# Content-Type header to application/x-www-form-urlencoded
# and data to send in request body.
c.setopt(c.POSTFIELDS, postfields)

c.perform()
c.close()

body = buffer.getvalue()
# Body is a byte string.
# We have to know the encoding in order to print it to a text file
# such as standard output.
data = body.decode('iso-8859-1')
#print(data)
d = json.loads(data)
#print(list(d.keys()))
#print(d['token'])
apikey = d['token']

# ------- LOGIN TOKEN END -----------

if arguments == 7:

    if sys.argv[1] == 'addcard':
        
        # ------- WRITE TO CARD START -----------
        authorid = sys.argv[2]
        boardid = sys.argv[3]
        swimlaneid = sys.argv[4]
        listid = sys.argv[5]
        cardtitle = sys.argv[6]
        carddescription = sys.argv[7]
        cardtolist = wekanurl + apiboards + boardid + s + l + s + listid + s + cs
        # Write to card
        c = pycurl.Curl()
        c.setopt(c.URL, cardtolist)
        c.setopt(c.WRITEDATA, buffer)
        c.setopt(c.CAINFO, certifi.where())
        c.setopt(c.HTTPHEADER, ['Accept: application/json', 'Authorization: Bearer {}'.format(apikey)])
        post_data = {"authorId": authorid, "title": cardtitle, "description": carddescription, "swimlaneId": swimlaneid}
        # Form data must be provided already urlencoded.
        postfields = urlencode(post_data)
        # Sets request method to POST,
        # Content-Type header to application/x-www-form-urlencoded
        # and data to send in request body.
        c.setopt(c.POSTFIELDS, postfields)
        c.perform()
        c.close()
        body = buffer.getvalue()
        data = body.decode('iso-8859-1')
        #print(data)

    # ------- WRITE TO CARD END -----------

if arguments == 2:

    # ------- BOARDS LIST START -----------
    userid = sys.argv[2]
    boards = wekanurl + apiusers + userid + s + bs
    if sys.argv[1] == 'boards':
        c = pycurl.Curl()
        c.setopt(c.URL, boards)
        c.setopt(c.WRITEDATA, buffer)
        c.setopt(c.CAINFO, certifi.where())
        c.setopt(c.HTTPHEADER, ['Accept: application/json', 'Authorization: Bearer {}'.format(apikey)])
        c.perform()
        c.close()
        body = buffer.getvalue()
        data = body.decode('iso-8859-1')
        print("=== BOARDS ===\n")
        data2 = data.replace('}',"}\n")
        print(data2)
        print("\n")
        data = ""
    # ------- BOARDS LIST END -----------

    if sys.argv[1] == 'board':

        # ------- BOARD INFO START -----------
        boardid = sys.argv[2]
        board = wekanurl + apiboards + boardid
        c = pycurl.Curl()
        c.setopt(c.URL, board)
        c.setopt(c.WRITEDATA, buffer)
        c.setopt(c.CAINFO, certifi.where())
        c.setopt(c.HTTPHEADER, ['Accept: application/json', 'Authorization: Bearer {}'.format(apikey)])
        c.perform()
        c.close()
        body = buffer.getvalue()
        data = body.decode('iso-8859-1')
        print("=== BOARD ===\n")
        data2 = data.replace('}',"}\n")
        print(data2)
        print("\n")
        data = ""

        # ------- BOARD INFO END -----------

    if sys.argv[1] == 'swimlanes':
        
        boardid = sys.argv[2]
        swimlanes = wekanurl + apiboards + boardid + s + sws
        # ------- SWIMLANES OF BOARD START -----------
        c = pycurl.Curl()
        c.setopt(c.URL, swimlanes)
        c.setopt(c.WRITEDATA, buffer)
        c.setopt(c.CAINFO, certifi.where())
        c.setopt(c.HTTPHEADER, ['Accept: application/json', 'Authorization: Bearer {}'.format(apikey)])
        c.perform()
        c.close()
        body = buffer.getvalue()
        data = body.decode('iso-8859-1')
        print("=== SWIMLANES ===\n")
        data2 = data.replace('}',"}\n")
        print(data2)
        print("\n")
        data = ""
        # ------- SWIMLANES OF BOARD END -----------

    if sys.argv[1] == 'lists':

        # ------- LISTS OF BOARD START -----------
        boardid = sys.argv[2]
        lists = wekanurl + apiboards + boardid + s + l
        c = pycurl.Curl()
        c.setopt(c.URL, lists)
        c.setopt(c.WRITEDATA, buffer)
        c.setopt(c.CAINFO, certifi.where())
        c.setopt(c.HTTPHEADER, ['Accept: application/json', 'Authorization: Bearer {}'.format(apikey)])
        c.perform()
        c.close()
        body = buffer.getvalue()
        data = body.decode('iso-8859-1')
        print("=== LISTS ===\n")
        data2 = data.replace('}',"}\n")
        print(data2)
        print("\n")
        data = ""
        # ------- LISTS OF BOARD END -----------

if arguments == 1:

    if sys.argv[1] == 'users':

        # ------- LIST OF USERS START -----------
        c = pycurl.Curl()
        c.setopt(c.URL, users)
        c.setopt(c.WRITEDATA, buffer)
        c.setopt(c.CAINFO, certifi.where())
        c.setopt(c.HTTPHEADER, ['Accept: application/json', 'Authorization: Bearer {}'.format(apikey)])
        c.perform()
        c.close()
        body = buffer.getvalue()
        data = body.decode('iso-8859-1')
        print("=== USERS ===\n")
        data2 = data.replace('}',"}\n")
        print(data2)
        print("\n")
        data = ""
        # ------- LIST OF USERS END -----------


"""
authorId: string
members: string
assignees: string
title: string
description: string
swimlaneId: string
"""

Wekan

General

Support priorities for new features and bugfixes

  1. Commercial Support
  2. Community Support
  3. Debugging

Security

Backup

Repair

Themes

Features

Email

Logs and Stats

Migrating

Required Settings

Download

Webservers

REST API Docs

REST API issue

REST API client code

Webhooks

Case Studies

Development

Issues

Clone this wiki locally