User management

Guide explains how to manipulate user and team members using Supervisely SDK and API

Introduction

In this tutorial you will learn how to work with User and manage team members using Supervisely SDK and API.

📗 Everything you need to reproduce this tutorial is on GitHub: source code and demo data.

How to debug this tutorial

Step 1. Prepare ~/supervisely.env file with credentials. Learn more here.

Step 2. Clone repository with source code and demo data and create Virtual Environment.

git clone https://github.com/supervisely-ecosystem/automation-with-python-sdk-and-api
cd automation-with-python-sdk-and-api
./create_venv.sh

Step 3. Open repository directory in Visual Studio Code.

code -r .

Step 4. change ✅ IDs ✅ in local.env file by copying the IDs from Supervisely instance.

  • Copy your TEAM ID from context menu of the team.

    CONTEXT_TEAMID=8                 # ⬅️ change it
  • You can find your user ID and login at Start -> Team members page

    CONTEXT_USERID=7                 # ⬅️ change it
    CONTEXT_USERLOGIN="my_username"  # ⬅️ change it

Step 5. Start debugging examples/user-automation/main.py

User automation

Import libraries

import os
from dotenv import load_dotenv
import supervisely as sly

Init API client

​Init API for communicating with Supervisely Instance. First, we load environment variables with credentials:

load_dotenv("local.env")
load_dotenv(os.path.expanduser("~/supervisely.env"))
api = sly.Api()

Get your IDs and username from environment

TEAM_ID = int(os.environ["CONTEXT_TEAMID"])
USER_ID = int(os.environ["CONTEXT_USERID"])
USER_LOGIN = os.environ["CONTEXT_USERLOGIN"]

List available roles on Supervisely instance

Print all roles that are available on Supervisely instance.

roles = api.role.get_list()
print(roles)

Output:

[
  RoleInfo(id=1, role='admin', created_at='2019-04-11T10:52:06.517Z', updated_at='2019-04-11T10:52:06.517Z'),
  RoleInfo(id=2, role='developer', created_at='2019-04-11T10:52:06.517Z', updated_at='2019-04-11T10:52:06.517Z'),
  RoleInfo(id=3, role='annotator', created_at='2019-04-11T10:52:06.517Z', updated_at='2019-04-11T10:52:06.517Z'),
  RoleInfo(id=4, role='viewer', created_at='2019-04-11T10:52:06.517Z', updated_at='2019-04-11T10:52:06.517Z')
]

Get UserInfo about yourself

my_info = api.user.get_my_info()
print("my login:", my_info.login)
print("my ID:", my_info.id)

Output:

my login: my_username
my ID: 100

Get UserInfo by ID

Get general information about user by ID.

Note: requires admin permission if requested ID is not equal to user id

user_info = api.user.get_info_by_id(USER_ID)
print(user_info)

Output:

UserInfo(
  id=100, 
  login='my_username', 
  name='user', 
  email=None, 
  logins=7, 
  disabled=False, 
  last_login='2019-08-02T09:18:09.155Z', 
  created_at='2019-04-11T10:59:50.472Z', 
  updated_at='2019-08-04T17:06:39.414Z'
)

List all team users with corresponding roles

team = api.team.get_info_id(TEAM_ID)
members = api.user.get_team_members(team.id)
print(f"All members in team: '{team.name}'")
print(members)

Output:

All members in team 'my_team'
[
  UserInfo(
    id=4, 
    login='max', 
    name='max_k', 
    email=None, 
    logins=7, 
    disabled=False,
    last_login='2019-08-02T09:18:09.155Z',
    created_at='2019-04-11T10:59:50.472Z',
    updated_at='2019-08-05T08:42:20.463Z'
  ),

  ...

  UserInfo(
    id=31, 
    login='labeler_03',
    name='',
    email=None, 
    logins=0, 
    disabled=False,
    last_login=None,
    created_at='2019-07-20T15:12:52.779Z',
    updated_at='2019-07-20T15:12:52.779Z'
  )
]

Methods that require admin permisssion

List all registered users

Print all registered users on Supervisely instance.

users = api.user.get_list()
print('Total number of users: ', len(users))
for user in users:
    print("Id: {:<5} Login: {:<25s} logins_count: {:<5}".format(user.id, user.login, user.logins))

Output:

Total number of users:  100
Id: 1     Login: admin                     logins_count: 88   
Id: 2     Login: supervisely               logins_count: 55    
...  
Id: 99    Login: alex                      logins_count: 0    
Id: 100   Login: my_username               logins_count: 3

Get UserInfo by login

Get general information about user by name.

user_info = api.user.get_info_by_login(USER_LOGIN)
print(user_info)

Output:

UserInfo(
  id=100, 
  login='my_username', 
  name='user', 
  email=None, 
  logins=7, 
  disabled=False, 
  last_login='2019-08-02T09:18:09.155Z', 
  created_at='2019-04-11T10:59:50.472Z', 
  updated_at='2019-08-04T17:06:39.414Z'
)

List all user teams with corresponding roles

Print user teams, with user's role in them.

def print_user_teams(login):
    user = api.user.get_info_by_login(login)
    user_teams = api.user.get_teams(user.id)
    print("\nTeams of user {!r}:".format(login))
    for team in user_teams:
        print("[team_id={}] {:<25s} [role_id={}] {}".format(team.id, team.name, team.role_id, team.role))

print_user_teams(USER_LOGIN)

Output:

Teams of user 'my_username':
[team_id=7] team_x                    [role_id=1] admin
[team_id=5] my_team                   [role_id=1] admin
[team_id=3] jupyter_tutorials         [role_id=1] admin

Create new user

new_user = api.user.get_info_by_login('demo_user_451')
if new_user is None:
    new_user = api.user.create(login='demo_user_451', password='123abc', is_restricted=False)
print(new_user)

Output:

UserInfo(
  id=101, 
  login='demo_user_451',
  name='',
  email=None,
  logins=0,
  disabled=False,
  last_login=None,
  created_at='2019-07-19T09:44:45.750Z',
  updated_at='2019-08-03T16:17:15.228Z'
)

Update user info

Change user's name and password.

new_password = 'abc123'
new_name = 'Bob'
user_info = api.user.update(user_info.id, password=new_password, name=new_name)
print(user_info)

Output:

UserInfo(
  id=101, 
  login='demo_user_451',
  name='Bob',
  email=None,
  logins=0,
  disabled=False,
  last_login=None,
  created_at='2019-07-19T09:44:45.750Z',
  updated_at='2019-08-03T16:17:15.228Z'
)

Disable/Enable user

api.user.disable(new_user.id)
api.user.enable(new_user.id)

Invite user to team

user = api.user.get_info_by_login('demo_user_451')
team = api.team.get_info_by_id(TEAM_ID)
if api.user.get_team_role(user.id, team.id) is None:
    api.user.add_to_team(user.id, team.id, api.role.DefaultRole.ANNOTATOR)

Output:

Teams of user 'demo_user451':
[team_id=22] demo_user451              [role_id=1] admin
[team_id=4] my_team                    [role_id=3] annotator

Change user role in team

user = api.user.get_info_by_login('demo_user_451')
team = api.team.get_info_by_id(TEAM_ID)
api.user.change_team_role(user.id, team.id, api.role.DefaultRole.VIEWER)
print_user_teams('demo_user_451')

Output:

Teams of user 'demo_user451':
[team_id=22] demo_user451              [role_id=4] viewer
[team_id=4] max                        [role_id=1] admin

Remove user from team

team = api.team.get_info_by_id(TEAM_ID)
user = api.user.get_info_by_login('demo_user_451')
api.user.remove_from_team(user.id, team.id)
print_user_teams('demo_user_451')

Output:

Teams of user 'demo_user451':
[team_id=22] demo_user451              [role_id=4] viewer

Last updated