diff --git a/README.md b/README.md index a24c0a7..58ac262 100644 --- a/README.md +++ b/README.md @@ -2547,6 +2547,32 @@ project_metadata_id = client.update_project_metadata( ) ``` +### Update Project User Permission + +Update or assign user permissions for a project. + +```python +# Add or update user permission +result = client.update_project_user_permission( + project="YOUR_PROJECT_SLUG", + email="user@example.com", + role="annotator" +) + +# Remove user from project +result = client.update_project_user_permission( + project="YOUR_PROJECT_SLUG", + email="user@example.com", + role="none" +) +``` + +Available roles: +- `annotator`: Annotator +- `reviewer`: Reviewer +- `owner`: Project owner +- `none`: Remove user from project + ## Tags ### Get Tags diff --git a/fastlabel/__init__.py b/fastlabel/__init__.py index 24b0348..5a79d51 100644 --- a/fastlabel/__init__.py +++ b/fastlabel/__init__.py @@ -4137,6 +4137,26 @@ def update_project_metadata( } return self.api.put_request(endpoint, payload=payload) + def update_project_user_permission( + self, + project: str, + email: str, + role: str, + ) -> bool: + """ + Update project user permission. + + project is the slug of the project (Required). + email is the email address of the user (Required). + role is the role of the user in the project (Required). + role can be 'annotator', 'reviewer', 'owner', + 'external_annotator', 'external_reviewer', 'external_approver', + 'external_sub_owner', 'external_owner', or 'none' to remove user from project. + """ + endpoint = "projects-users" + payload = {"project": project, "email": email, "role": role} + return self.api.put_request(endpoint, payload=payload) + # Tags def get_tags( @@ -4680,9 +4700,11 @@ def execute_training_job( "learningRate": learning_rate, "resizeOption": resize_option, "resizeDimension": resize_dimension, - "configFile": utils.base64_encode(str(config_file_path)) - if config_file_path is not None - else None, + "configFile": ( + utils.base64_encode(str(config_file_path)) + if config_file_path is not None + else None + ), } if annotation_value: payload["annotationValue"] = annotation_value diff --git a/fastlabel/utils/mask_image_util.py b/fastlabel/utils/mask_image_util.py index b862f06..b48f6e6 100644 --- a/fastlabel/utils/mask_image_util.py +++ b/fastlabel/utils/mask_image_util.py @@ -27,7 +27,7 @@ def mask_to_polygon(mask_image: Union[str, np.ndarray]) -> list[list[list[int]]] def mask_to_segmentation( - mask_image: Union[str, np.ndarray, Mat, UMat, Image] + mask_image: Union[str, np.ndarray, Mat, UMat, Image], ) -> list[list[list[int]]]: if isinstance(mask_image, str): mask_image_path = mask_image