diff --git a/src/casdoor/async_main.py b/src/casdoor/async_main.py index 6732e1d..2574c27 100644 --- a/src/casdoor/async_main.py +++ b/src/casdoor/async_main.py @@ -419,8 +419,23 @@ async def get_user_count(self, is_online: bool = None) -> int: count = await session.get(path, headers=self.headers, params=params) return count["data"] - async def modify_user(self, method: str, user: User, params=None) -> Dict: + async def modify_user(self, method: str, user: User, params=None, columns: Optional[List[str]] = None) -> Dict: + """ + Modify user with optional columns parameter for selective field updates. + + :param method: the operation method (add-user, update-user, delete-user) + :param user: a User object that contains user's info + :param params: additional parameters + :param columns: optional list of column names to update (e.g., ["roles", "email"]) + """ path = f"/api/{method}" + + # Add columns to params if provided + if columns: + if params is None: + params = {} + params["columns"] = ",".join(columns) + async with self._session as session: return await session.post(path, params=params, headers=self.headers, json=user.to_dict()) @@ -428,9 +443,16 @@ async def add_user(self, user: User) -> Dict: response = await self.modify_user("add-user", user) return response - async def update_user(self, user: User) -> Dict: + async def update_user(self, user: User, columns: Optional[List[str]] = None) -> Dict: + """ + Update a user in Casdoor. + + :param user: a User object that contains user's info + :param columns: optional list of column names to update (e.g., ["roles", "email"]) + If not provided, all fields will be updated + """ params = {"id": f"{user.owner}/{user.name}"} - response = await self.modify_user("update-user", user, params) + response = await self.modify_user("update-user", user, params, columns) return response async def delete_user(self, user: User) -> Dict: diff --git a/src/casdoor/user.py b/src/casdoor/user.py index 63dd153..b730368 100644 --- a/src/casdoor/user.py +++ b/src/casdoor/user.py @@ -368,20 +368,26 @@ def get_user_count(self, is_online: bool = None) -> int: count = response.get("data") return count - def modify_user(self, method: str, user: User) -> Dict: + def modify_user(self, method: str, user: User, columns: Optional[List[str]] = None) -> Dict: """ modifyUser is an encapsulation of user CUD(Create, Update, Delete) operations. possible actions are `add-user`, `update-user`, `delete-user`, + + :param method: the operation method (add-user, update-user, delete-user) + :param user: a User object that contains user's info + :param columns: optional list of column names to update (e.g., ["roles", "email"]) """ id = user.get_id() - return self.modify_user_by_id(method, id, user) + return self.modify_user_by_id(method, id, user, columns) - def modify_user_by_id(self, method: str, id: str, user: User) -> Dict: + def modify_user_by_id(self, method: str, id: str, user: User, columns: Optional[List[str]] = None) -> Dict: """ Modify the user from Casdoor providing the ID. + :param method: the operation method (add-user, update-user, delete-user) :param id: the id ( owner/name ) of the user :param user: a User object that contains user's info + :param columns: optional list of column names to update (e.g., ["roles", "email"]) """ url = self.endpoint + f"/api/{method}" @@ -391,6 +397,11 @@ def modify_user_by_id(self, method: str, id: str, user: User) -> Dict: "clientId": self.client_id, "clientSecret": self.client_secret, } + + # Add columns parameter if provided (for selective field updates) + if columns: + params["columns"] = ",".join(columns) + user_info = json.dumps(user.to_dict()) r = requests.post(url, params=params, data=user_info) response = r.json() @@ -402,12 +413,27 @@ def add_user(self, user: User) -> Dict: response = self.modify_user("add-user", user) return response - def update_user(self, user: User) -> Dict: - response = self.modify_user("update-user", user) + def update_user(self, user: User, columns: Optional[List[str]] = None) -> Dict: + """ + Update a user in Casdoor. + + :param user: a User object that contains user's info + :param columns: optional list of column names to update (e.g., ["roles", "email"]) + If not provided, all fields will be updated + """ + response = self.modify_user("update-user", user, columns) return response - def update_user_by_id(self, id: str, user: User) -> Dict: - response = self.modify_user_by_id("update-user", id, user) + def update_user_by_id(self, id: str, user: User, columns: Optional[List[str]] = None) -> Dict: + """ + Update a user in Casdoor by ID. + + :param id: the id ( owner/name ) of the user + :param user: a User object that contains user's info + :param columns: optional list of column names to update (e.g., ["roles", "email"]) + If not provided, all fields will be updated + """ + response = self.modify_user_by_id("update-user", id, user, columns) return response def delete_user(self, user: User) -> Dict: