User import / Batch user creation
- 
Hi, Apologies in advance if I missed something here: Up to not so long ago there was a possibility to import users in Cloudron (7.1 release notes make mention of it - There are also traces of it here and there in the forum. See here for example). (User export seems to be missing too). For the life of me, I cannot find this anywhere anymore. Thus I suspect it has been removed/disabled. 
 Is there any particular reasons for this?As an alternative, is there a known way to batch create users and generate invitation on the fly? Many thanks, 
- 
I also posted my script somewhere  let me dig it up let me dig it up
- 
I also posted my script somewhere  let me dig it up let me dig it up@BrutalBirdie Oh that would be nice - thanks for this. Thanks also @girish - This works for me also. Just in passing: - I initially had the same powershell annoyance as @prusaman here: https://forum.cloudron.io/post/62509 - Not sure what this is all about, but linux's just fine.
- the curl sample is missing an end quote here: https://docs.cloudron.io/api.html#tag/Users/operation/addUser
 curl -X POST -H "Content-Type: application/json" -H "Authorization: Bearer $CLOUDRON_TOKEN" "https://$CLOUDRON_DOMAIN/api/v1/users" --data '{"username":"Example","email":"example@example.com","password":"insertYourPassword","displayName":"Example", "role":"user","fallbackEmail":"fallback@test.com"}Thanks again 
- 
Found it  
 Here is the python3 code:import json from pprint import pprint import requests # Each user to programmatically create must be in this JSON format data = [ { "Surname": "Lastname", "Name": "Firstname", "Login": "MyAwesomeLoginName", "Mail": "missing@null.none", "Password": "HahaClearTextPasswordGoBrrrrrr" } ] # Replace `DOMAIN.TLD` with your Domain url="https://my.DOMAIN.TLD/api/v1" # Replace `<PLACEHOLDER-TOKEN>` with your Cloudron Token headers = { "Content-Type": "application/json", "Authorization": "Bearer <PLACEHOLDER-TOKEN>" } for value in data: values= { "email": value["Mail"], "username": value["Login"], "password": value["Password"], "displayName": f'{value["Name"]} {value["Surname"]}', "role": "user", "fallbackEmail": value["Mail"], } data = json.dumps(values) try: pprint(data) createUser = requests.post(f'{url}/users', data=data, headers=headers) userId = createUser.json()["id"] pprint(userId) inviteUser = requests.post(f'{url}/users/{userId}/send_invite_email', data=json.dumps({"email": value["Mail"]}), headers=headers) if createUser.status_code != 201 or inviteUser.status_code != 202: print(f"Error creating user or inviting user") print(f"Create user status code: {createUser.status_code}") print(f"InviteUser user status code: {inviteUser.status_code}") exit() except Exception as e: pprint(e) hope this helps. hope this helps.
 ps: I added the invite user email to the program for you since I did not have it in there.
- 
Found it  
 Here is the python3 code:import json from pprint import pprint import requests # Each user to programmatically create must be in this JSON format data = [ { "Surname": "Lastname", "Name": "Firstname", "Login": "MyAwesomeLoginName", "Mail": "missing@null.none", "Password": "HahaClearTextPasswordGoBrrrrrr" } ] # Replace `DOMAIN.TLD` with your Domain url="https://my.DOMAIN.TLD/api/v1" # Replace `<PLACEHOLDER-TOKEN>` with your Cloudron Token headers = { "Content-Type": "application/json", "Authorization": "Bearer <PLACEHOLDER-TOKEN>" } for value in data: values= { "email": value["Mail"], "username": value["Login"], "password": value["Password"], "displayName": f'{value["Name"]} {value["Surname"]}', "role": "user", "fallbackEmail": value["Mail"], } data = json.dumps(values) try: pprint(data) createUser = requests.post(f'{url}/users', data=data, headers=headers) userId = createUser.json()["id"] pprint(userId) inviteUser = requests.post(f'{url}/users/{userId}/send_invite_email', data=json.dumps({"email": value["Mail"]}), headers=headers) if createUser.status_code != 201 or inviteUser.status_code != 202: print(f"Error creating user or inviting user") print(f"Create user status code: {createUser.status_code}") print(f"InviteUser user status code: {inviteUser.status_code}") exit() except Exception as e: pprint(e) hope this helps. hope this helps.
 ps: I added the invite user email to the program for you since I did not have it in there.@BrutalBirdie Thanks a lot! 
- 
Found it  
 Here is the python3 code:import json from pprint import pprint import requests # Each user to programmatically create must be in this JSON format data = [ { "Surname": "Lastname", "Name": "Firstname", "Login": "MyAwesomeLoginName", "Mail": "missing@null.none", "Password": "HahaClearTextPasswordGoBrrrrrr" } ] # Replace `DOMAIN.TLD` with your Domain url="https://my.DOMAIN.TLD/api/v1" # Replace `<PLACEHOLDER-TOKEN>` with your Cloudron Token headers = { "Content-Type": "application/json", "Authorization": "Bearer <PLACEHOLDER-TOKEN>" } for value in data: values= { "email": value["Mail"], "username": value["Login"], "password": value["Password"], "displayName": f'{value["Name"]} {value["Surname"]}', "role": "user", "fallbackEmail": value["Mail"], } data = json.dumps(values) try: pprint(data) createUser = requests.post(f'{url}/users', data=data, headers=headers) userId = createUser.json()["id"] pprint(userId) inviteUser = requests.post(f'{url}/users/{userId}/send_invite_email', data=json.dumps({"email": value["Mail"]}), headers=headers) if createUser.status_code != 201 or inviteUser.status_code != 202: print(f"Error creating user or inviting user") print(f"Create user status code: {createUser.status_code}") print(f"InviteUser user status code: {inviteUser.status_code}") exit() except Exception as e: pprint(e) hope this helps. hope this helps.
 ps: I added the invite user email to the program for you since I did not have it in there.@BrutalBirdie That should be part of the docs! 
 

