[OND211-2329]: Added API to update department.

This commit is contained in:
Hetavi Shah 2025-11-17 16:52:14 +05:30
parent 83bf319ea8
commit ab88159186
2 changed files with 155 additions and 2 deletions

View file

@ -39,6 +39,8 @@ from api.utils.api_utils import (
from common.constants import RetCode, StatusEnum
from common.misc_utils import get_uuid
from common.time_utils import current_timestamp, datetime_format
from datetime import datetime
manager = Blueprint("department", __name__)
@ -199,6 +201,156 @@ def create_department() -> Response:
return server_error_response(e)
@manager.route("/<department_id>", methods=["PUT"]) # noqa: F821
@login_required
def update_department(department_id: str) -> Response:
"""Update a department's details.
Only team owners, admins, or department members can update departments.
---
tags:
- Department
security:
- ApiKeyAuth: []
parameters:
- in: path
name: department_id
required: true
type: string
description: Department ID
- in: body
name: body
required: true
schema:
type: object
properties:
name:
type: string
description: Department name (optional).
description:
type: string
description: Department description (optional).
responses:
200:
description: Department updated successfully.
schema:
type: object
properties:
data:
type: object
description: Updated department information.
message:
type: string
description: Success message.
400:
description: Invalid request.
401:
description: Unauthorized.
403:
description: Forbidden - not team owner, admin, or department member.
404:
description: Department not found.
"""
if request.json is None:
return get_json_result(
data=False,
message="Request body is required!",
code=RetCode.ARGUMENT_ERROR,
)
# Get department and verify it exists
success: bool
department: Optional[Department]
success, department = DepartmentService.get_by_id(department_id)
if not success or not department:
return get_data_error_result(message="Department not found.")
# Check if user is team owner or admin
is_admin_or_owner: bool = is_team_admin_or_owner(department.tenant_id, current_user.id)
# Check if user is a member of the department
user_department: Optional[UserDepartment] = UserDepartmentService.filter_by_department_and_user_id(
department_id, current_user.id
)
is_department_member: bool = (
user_department is not None and
user_department.status == StatusEnum.VALID.value
)
# User must be either team owner/admin OR department member
if not is_admin_or_owner and not is_department_member:
return get_json_result(
data=False,
message="Only team owners, admins, or department members can update departments.",
code=RetCode.PERMISSION_ERROR,
)
req: Dict[str, Any] = request.json
update_data: Dict[str, Any] = {
"update_time": current_timestamp(),
"update_date": datetime_format(datetime.now()),
}
# Update name if provided
if "name" in req:
name: str = req.get("name", "").strip()
if name:
if len(name) > 128:
return get_json_result(
data=False,
message="Department name must be 128 characters or less!",
code=RetCode.ARGUMENT_ERROR,
)
update_data["name"] = name
else:
return get_json_result(
data=False,
message="Department name cannot be empty!",
code=RetCode.ARGUMENT_ERROR,
)
# Update description if provided
if "description" in req:
description: Optional[str] = req.get("description")
if description is not None:
description = description.strip() if isinstance(description, str) else None
update_data["description"] = description if description else None
# If no fields to update (only update_time and update_date were set), return error
if len(update_data) == 2: # Only update_time and update_date
return get_json_result(
data=False,
message="No fields provided to update. Please provide 'name' and/or 'description'.",
code=RetCode.ARGUMENT_ERROR,
)
try:
from api.db.db_models import DB
# Update the department
with DB.connection_context():
Department.update(update_data).where(
(Department.id == department_id) &
(Department.status == StatusEnum.VALID.value)
).execute()
# Get updated department
success, updated_department = DepartmentService.get_by_id(department_id)
if not success or not updated_department:
return get_data_error_result(message="Department updated but could not retrieve updated data.")
return get_json_result(
data=updated_department.to_dict(),
message="Department updated successfully!",
)
except Exception as e:
logging.exception(e)
return server_error_response(e)
@manager.route("/<department_id>/members/add", methods=["POST"]) # noqa: F821
@login_required
@validate_request("user_ids")
@ -436,7 +588,7 @@ def remove_member(department_id: str, user_id: str) -> Response:
# Soft delete by setting status to invalid
with DB.connection_context():
UserDepartment.model.update({"status": StatusEnum.INVALID.value}).where(
UserDepartment.update({"status": StatusEnum.INVALID.value}).where(
(UserDepartment.id == user_department.id)
).execute()

View file

@ -419,7 +419,8 @@ class UserDepartmentService(CommonService):
"""
if "id" not in kwargs:
kwargs["id"] = get_uuid()
obj = cls.model(**kwargs).save(force_insert=True)
obj = cls.model(**kwargs)
obj.save(force_insert=True)
return obj
@classmethod