Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 25 additions & 3 deletions src/casdoor/async_main.py
Original file line number Diff line number Diff line change
Expand Up @@ -419,18 +419,40 @@ 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())

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:
Expand Down
40 changes: 33 additions & 7 deletions src/casdoor/user.py
Original file line number Diff line number Diff line change
Expand Up @@ -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}"
Expand All @@ -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()
Expand All @@ -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:
Expand Down