#! /usr/bin/env python3 # -*- coding: utf-8 -*- # vi:ts=4:et # Wekan API Python CLI, originally from here, where is more details: # https://github.com/wekan/wekan/wiki/New-card-with-Python3-and-REST-API # TODO: # addcustomfieldtoboard: There is error: Settings must be object. So adding does not work yet. try: # python 3 from urllib.parse import urlencode except ImportError: # python 2 from urllib import urlencode import json import requests import sys arguments = len(sys.argv) - 1 syntax = """=== Wekan API Python CLI: Shows IDs for addcard === # AUTHORID is USERID that writes card or custom field. If *nix: chmod +x api.py => ./api.py users Syntax: User API: python3 api.py user # Current user and list of current user boards python3 api.py boards USERID # Boards of USERID python3 api.py swimlanes BOARDID # Swimlanes of BOARDID python3 api.py lists BOARDID # Lists of BOARDID python3 api.py list BOARDID LISTID # Info of LISTID python3 api.py createlist BOARDID LISTTITLE # Create list python3 api.py addcard AUTHORID BOARDID SWIMLANEID LISTID CARDTITLE CARDDESCRIPTION python3 api.py editcard BOARDID LISTID CARDID NEWCARDTITLE NEWCARDDESCRIPTION python3 api.py customfields BOARDID # Custom Fields of BOARDID python3 api.py customfield BOARDID CUSTOMFIELDID # Info of CUSTOMFIELDID python3 api.py addcustomfieldtoboard AUTHORID BOARDID NAME TYPE SETTINGS SHOWONCARD AUTOMATICALLYONCARD SHOWLABELONMINICARD SHOWSUMATTOPOFLIST # Add Custom Field to Board python3 api.py editcustomfield BOARDID LISTID CARDID CUSTOMFIELDID NEWCUSTOMFIELDVALUE python3 api.py listattachments BOARDID # List attachments Admin API: python3 api.py users # All users python3 api.py boards # All Public Boards python3 api.py newuser USERNAME EMAIL PASSWORD """ if arguments == 0: print(syntax) exit # TODO: # print(" python3 api.py attachmentjson BOARDID ATTACHMENTID # One attachment as JSON base64") # print(" python3 api.py attachmentbinary BOARDID ATTACHMENTID # One attachment as binary file") # print(" python3 api.py attachmentdownload BOARDID ATTACHMENTID # One attachment as file") # print(" python3 api.py attachmentsdownload BOARDID # All attachments as files") # ------- SETTINGS START ------------- # Username is your Wekan username or email address. # OIDC/OAuth2 etc uses email address as username. username = 'testtest' password = 'testtest' wekanurl = 'http://localhost:4000/' # ------- SETTINGS END ------------- """ === ADD CUSTOM FIELD TO BOARD === Type: text, number, date, dropdown, checkbox, currency, stringtemplate. python3 api.py addcustomfieldtoboard cmx3gmHLKwAXLqjxz LcDW4QdooAx8hsZh8 "SomeField" "date" "" true true true true === USERS === python3 api.py users => abcd1234 === BOARDS === python3 api.py boards abcd1234 === SWIMLANES === python3 api.py swimlanes dYZ [{"_id":"Jiv","title":"Default"} ] === LISTS === python3 api.py lists dYZ [] There is no lists, so create a list: === CREATE LIST === python3 api.py createlist dYZ 'Test' {"_id":"7Kp"} # python3 api.py addcard AUTHORID BOARDID SWIMLANEID LISTID CARDTITLE CARDDESCRIPTION python3 api.py addcard ppg dYZ Jiv 7Kp 'Test card' 'Test description' === LIST ATTACHMENTS WITH DOWNLOAD URLs ==== python3 api.py listattachments BOARDID """ # ------- API URL GENERATION START ----------- loginurl = 'users/login' wekanloginurl = wekanurl + loginurl apiboards = 'api/boards/' apiattachments = 'api/attachments/' apiusers = 'api/users' apiuser = 'api/user' apiallusers = 'api/allusers' e = 'export' s = '/' l = 'lists' sw = 'swimlane' sws = 'swimlanes' cs = 'cards' cf = 'custom-fields' bs = 'boards' apbs = 'allpublicboards' atl = 'attachmentslist' at = 'attachment' ats = 'attachments' users = wekanurl + apiusers user = wekanurl + apiuser allusers = wekanurl + apiallusers # ------- API URL GENERATION END ----------- # ------- LOGIN TOKEN START ----------- data = {"username": username, "password": password} body = requests.post(wekanloginurl, json=data) d = body.json() apikey = d['token'] # ------- LOGIN TOKEN END ----------- if arguments == 10: if sys.argv[1] == 'addcustomfieldtoboard': # ------- ADD CUSTOM FIELD TO BOARD START ----------- authorid = sys.argv[2] boardid = sys.argv[3] name = sys.argv[4] type1 = sys.argv[5] settings = str(json.loads(sys.argv[6])) # There is error: Settings must be object. So this does not work yet. #settings = {'currencyCode': 'EUR'} print(type(settings)) showoncard = sys.argv[7] automaticallyoncard = sys.argv[8] showlabelonminicard = sys.argv[9] showsumattopoflist = sys.argv[10] customfieldtoboard = wekanurl + apiboards + boardid + s + cf # Add Custom Field to Board headers = {'Accept': 'application/json', 'Authorization': 'Bearer {}'.format(apikey)} post_data = {'authorId': '{}'.format(authorid), 'name': '{}'.format(name), 'type': '{}'.format(type1), 'settings': '{}'.format(settings), 'showoncard': '{}'.format(showoncard), 'automaticallyoncard': '{}'.format(automaticallyoncard), 'showlabelonminicard': '{}'.format(showlabelonminicard), 'showsumattopoflist': '{}'.format(showsumattopoflist)} body = requests.post(customfieldtoboard, data=post_data, headers=headers) print(body.text) # ------- ADD CUSTOM FIELD TO BOARD END ----------- if arguments == 7: if sys.argv[1] == 'addcard': # ------- ADD 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 # Add card headers = {'Accept': 'application/json', 'Authorization': 'Bearer {}'.format(apikey)} post_data = {'authorId': '{}'.format(authorid), 'title': '{}'.format(cardtitle), 'description': '{}'.format(carddescription), 'swimlaneId': '{}'.format(swimlaneid)} body = requests.post(cardtolist, data=post_data, headers=headers) print(body.text) # ------- ADD CARD END ----------- if arguments == 6: if sys.argv[1] == 'editcard': # ------- EDIT CARD START ----------- boardid = sys.argv[2] listid = sys.argv[3] cardid = sys.argv[4] newcardtitle = sys.argv[5] newcarddescription = sys.argv[6] edcard = wekanurl + apiboards + boardid + s + l + s + listid + s + cs + s + cardid print(edcard) headers = {'Accept': 'application/json', 'Authorization': 'Bearer {}'.format(apikey)} put_data = {'title': '{}'.format(newcardtitle), 'description': '{}'.format(newcarddescription)} body = requests.put(edcard, data=put_data, headers=headers) print("=== EDIT CARD ===\n") body = requests.get(edcard, headers=headers) data2 = body.text.replace('}',"}\n") print(data2) # ------- EDIT CARD END ----------- if sys.argv[1] == 'editcustomfield': # ------- EDIT CUSTOMFIELD START ----------- boardid = sys.argv[2] listid = sys.argv[3] cardid = sys.argv[4] customfieldid = sys.argv[5] newcustomfieldvalue = sys.argv[6] edfield = wekanurl + apiboards + boardid + s + l + s + listid + s + cs + s + cardid + s + 'customFields' + s + customfieldid #print(edfield) headers = {'Accept': 'application/json', 'Authorization': 'Bearer {}'.format(apikey)} post_data = {'_id': '{}'.format(customfieldid), 'value': '{}'.format(newcustomfieldvalue)} #print(post_data) body = requests.post(edfield, data=post_data, headers=headers) print("=== EDIT CUSTOMFIELD ===\n") data2 = body.text.replace('}',"}\n") print(data2) # ------- EDIT CUSTOMFIELD END ----------- if arguments == 4: if sys.argv[1] == 'newuser': # ------- CREATE NEW USER START ----------- username = sys.argv[2] email = sys.argv[3] password = sys.argv[4] headers = {'Accept': 'application/json', 'Authorization': 'Bearer {}'.format(apikey)} post_data = {'username': '{}'.format(username),'email': '{}'.format(email),'password': '{}'.format(password)} body = requests.post(users, data=post_data, headers=headers) print("=== CREATE NEW USER ===\n") print(body.text) # ------- CREATE NEW USER END ----------- if arguments == 3: if sys.argv[1] == 'createlist': # ------- CREATE LIST START ----------- boardid = sys.argv[2] listtitle = sys.argv[3] list = wekanurl + apiboards + boardid + s + l headers = {'Accept': 'application/json', 'Authorization': 'Bearer {}'.format(apikey)} post_data = {'title': '{}'.format(listtitle)} body = requests.post(list, data=post_data, headers=headers) print("=== CREATE LIST ===\n") print(body.text) # ------- CREATE LIST END ----------- if sys.argv[1] == 'list': # ------- LIST OF BOARD START ----------- boardid = sys.argv[2] listid = sys.argv[3] listone = wekanurl + apiboards + boardid + s + l + s + listid headers = {'Accept': 'application/json', 'Authorization': 'Bearer {}'.format(apikey)} print("=== INFO OF ONE LIST ===\n") body = requests.get(listone, headers=headers) data2 = body.text.replace('}',"}\n") print(data2) # ------- LISTS OF BOARD END ----------- if sys.argv[1] == 'customfield': # ------- INFO OF CUSTOM FIELD START ----------- boardid = sys.argv[2] customfieldid = sys.argv[3] customfieldone = wekanurl + apiboards + boardid + s + cf + s + customfieldid headers = {'Accept': 'application/json', 'Authorization': 'Bearer {}'.format(apikey)} print("=== INFO OF ONE CUSTOM FIELD ===\n") body = requests.get(customfieldone, headers=headers) data2 = body.text.replace('}',"}\n") print(data2) # ------- INFO OF CUSTOM FIELD END ----------- if arguments == 2: # ------- BOARDS LIST START ----------- userid = sys.argv[2] boards = users + s + userid + s + bs if sys.argv[1] == 'boards': headers = {'Accept': 'application/json', 'Authorization': 'Bearer {}'.format(apikey)} #post_data = {'userId': '{}'.format(userid)} body = requests.get(boards, headers=headers) print("=== BOARDS ===\n") data2 = body.text.replace('}',"}\n") print(data2) # ------- BOARDS LIST END ----------- if sys.argv[1] == 'board': # ------- BOARD INFO START ----------- boardid = sys.argv[2] board = wekanurl + apiboards + boardid headers = {'Accept': 'application/json', 'Authorization': 'Bearer {}'.format(apikey)} body = requests.get(board, headers=headers) print("=== BOARD ===\n") data2 = body.text.replace('}',"}\n") print(data2) # ------- BOARD INFO END ----------- if sys.argv[1] == 'customfields': # ------- CUSTOM FIELDS OF BOARD START ----------- boardid = sys.argv[2] boardcustomfields = wekanurl + apiboards + boardid + s + cf headers = {'Accept': 'application/json', 'Authorization': 'Bearer {}'.format(apikey)} body = requests.get(boardcustomfields, headers=headers) print("=== CUSTOM FIELDS OF BOARD ===\n") data2 = body.text.replace('}',"}\n") print(data2) # ------- CUSTOM FIELDS OF BOARD END ----------- if sys.argv[1] == 'swimlanes': boardid = sys.argv[2] swimlanes = wekanurl + apiboards + boardid + s + sws # ------- SWIMLANES OF BOARD START ----------- headers = {'Accept': 'application/json', 'Authorization': 'Bearer {}'.format(apikey)} print("=== SWIMLANES ===\n") body = requests.get(swimlanes, headers=headers) data2 = body.text.replace('}',"}\n") print(data2) # ------- SWIMLANES OF BOARD END ----------- if sys.argv[1] == 'lists': # ------- LISTS OF BOARD START ----------- boardid = sys.argv[2] lists = wekanurl + apiboards + boardid + s + l headers = {'Accept': 'application/json', 'Authorization': 'Bearer {}'.format(apikey)} print("=== LISTS ===\n") body = requests.get(lists, headers=headers) data2 = body.text.replace('}',"}\n") print(data2) # ------- LISTS OF BOARD END ----------- if sys.argv[1] == 'listattachments': # ------- LISTS OF ATTACHMENTS START ----------- boardid = sys.argv[2] listattachments = wekanurl + apiboards + boardid + s + ats headers = {'Accept': 'application/json', 'Authorization': 'Bearer {}'.format(apikey)} print("=== LIST OF ATTACHMENTS ===\n") body = requests.get(listattachments, headers=headers) data2 = body.text.replace('}',"}\n") print(data2) # ------- LISTS OF ATTACHMENTS END ----------- if arguments == 1: if sys.argv[1] == 'users': # ------- LIST OF USERS START ----------- headers = {'Accept': 'application/json', 'Authorization': 'Bearer {}'.format(apikey)} print(users) print("=== USERS ===\n") body = requests.get(users, headers=headers) data2 = body.text.replace('}',"}\n") print(data2) # ------- LIST OF USERS END ----------- if sys.argv[1] == 'user': # ------- LIST OF ALL USERS START ----------- headers = {'Accept': 'application/json', 'Authorization': 'Bearer {}'.format(apikey)} print(user) print("=== USER ===\n") body = requests.get(user, headers=headers) data2 = body.text.replace('}',"}\n") print(data2) # ------- LIST OF ALL USERS END ----------- if sys.argv[1] == 'boards': # ------- LIST OF PUBLIC BOARDS START ----------- headers = {'Accept': 'application/json', 'Authorization': 'Bearer {}'.format(apikey)} print("=== PUBLIC BOARDS ===\n") listpublicboards = wekanurl + apiboards body = requests.get(listpublicboards, headers=headers) data2 = body.text.replace('}',"}\n") print(data2) # ------- LIST OF PUBLIC BOARDS END -----------