| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511 | 
							- #! /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
 
-     python3 api.py cardsbyswimlane SWIMLANEID LISTID
 
-     python3 api.py getcard BOARDID LISTID CARDID
 
-     python3 api.py addlabel BOARDID LISTID CARDID LABELID
 
-     python3 api.py addcardwithlabel AUTHORID BOARDID SWIMLANEID LISTID CARDTITLE CARDDESCRIPTION LABELIDS
 
-   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 == 8:
 
-     if sys.argv[1] == 'addcardwithlabel':
 
-         # ------- ADD CARD WITH LABEL 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]
 
-         labelIds = sys.argv[8]  # Aggiunto labelIds
 
-         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),
 
-             'labelIds': labelIds
 
-         }
 
-         body = requests.post(cardtolist, data=post_data, headers=headers)
 
-         print(body.text)
 
-         # If ok id card
 
-         if body.status_code == 200:
 
-             card_data = body.json()
 
-             new_card_id = card_data.get('_id')
 
-             # Updating card
 
-             if new_card_id:
 
-                 edcard = wekanurl + apiboards + boardid + s + l + s + listid + s + cs + s + new_card_id
 
-                 put_data = {'labelIds': labelIds}
 
-                 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)
 
-             else:
 
-                 print("Error obraining ID.")
 
-         else:
 
-             print("Error adding card.")
 
-         # ------- ADD CARD WITH LABEL 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 == 5:
 
-     if sys.argv[1] == 'addlabel':
 
-         # ------- EDIT CARD ADD LABEL START -----------
 
-         boardid = sys.argv[2]
 
-         listid = sys.argv[3]
 
-         cardid = sys.argv[4]
 
-         labelIds = sys.argv[5]
 
-         edcard = wekanurl + apiboards + boardid + s + l + s + listid + s + cs + s + cardid
 
-         print(edcard)
 
-         headers = {'Accept': 'application/json', 'Authorization': 'Bearer {}'.format(apikey)}
 
-         put_data = {'labelIds': labelIds}
 
-         body = requests.put(edcard, data=put_data, headers=headers)
 
-         print("=== ADD LABEL ===\n")
 
-         body = requests.get(edcard, headers=headers)
 
-         data2 = body.text.replace('}',"}\n")
 
-         print(data2)
 
-         # ------- EDIT CARD ADD LABEL 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 sys.argv[1] == 'getcard':
 
-         # ------- LIST OF CARD START -----------
 
-         boardid = sys.argv[2]
 
-         listid = sys.argv[3]
 
-         cardid = sys.argv[4]
 
-         listone = wekanurl + apiboards + boardid + s + l + s + listid + s + cs + s + cardid
 
-         headers = {'Accept': 'application/json', 'Authorization': 'Bearer {}'.format(apikey)}
 
-         print("=== INFO OF ONE LIST ===\n")
 
-         print("URL:", listone)  # Stampa l'URL per debug
 
-         try:
 
-             response = requests.get(listone, headers=headers)
 
-             print("=== RESPONSE ===\n")
 
-             print("Status Code:", response.status_code)  # Stampa il codice di stato per debug
 
-             if response.status_code == 200:
 
-                 data2 = response.text.replace('}', "}\n")
 
-                 print(data2)
 
-             else:
 
-                 print(f"Error: {response.status_code}")
 
-                 print(f"Response: {response.text}")
 
-         except Exception as e:
 
-             print(f"Error in the GET request: {e}")
 
-         # ------- LISTS OF CARD 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 sys.argv[1] == 'cardsbyswimlane':
 
-     # ------- RETRIEVE CARDS BY SWIMLANE ID START -----------
 
-         boardid = sys.argv[2]
 
-         swimlaneid = sys.argv[3]
 
-         cardsbyswimlane = wekanurl + apiboards + boardid + s + sws + s + swimlaneid + s + cs
 
-         headers = {'Accept': 'application/json', 'Authorization': 'Bearer {}'.format(apikey)}
 
-         print("=== CARDS BY SWIMLANE ID ===\n")
 
-         print("URL:", cardsbyswimlane)  # Debug
 
-         try:
 
-             body = requests.get(cardsbyswimlane, headers=headers)
 
-             print("Status Code:", body.status_code)  # Debug
 
-             data = body.text.replace('}', "}\n")
 
-             print("Data:", data)
 
-         except Exception as e:
 
-             print("Error GET:", e)
 
-     # ------- RETRIEVE CARDS BY SWIMLANE ID 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 -----------
 
 
  |