build 4.6 Demo
This commit is contained in:
@@ -0,0 +1,80 @@
|
||||
"""User-account services for the controlled demo environment."""
|
||||
|
||||
from django.contrib.auth import authenticate, get_user_model, login, logout
|
||||
from django.contrib.auth.password_validation import validate_password
|
||||
from django.core.exceptions import ValidationError
|
||||
from django.db import transaction
|
||||
|
||||
User = get_user_model()
|
||||
|
||||
|
||||
@transaction.atomic
|
||||
def register_user(username: str, password: str, role: str) -> dict:
|
||||
username = (username or "").strip()
|
||||
if not username:
|
||||
raise ValidationError("Username is required.")
|
||||
if role not in {"admin", "user"}:
|
||||
raise ValidationError("Role must be admin or user.")
|
||||
if User.objects.filter(username=username).exists():
|
||||
raise ValidationError("This username already exists.")
|
||||
|
||||
validate_password(password)
|
||||
is_admin = role == "admin"
|
||||
User.objects.create_user(
|
||||
username=username,
|
||||
password=password,
|
||||
is_superuser=is_admin,
|
||||
is_staff=is_admin,
|
||||
)
|
||||
return {"status": "success", "message": "User created successfully."}
|
||||
|
||||
|
||||
@transaction.atomic
|
||||
def delete_user(request, user_id: int) -> dict:
|
||||
if request.user.id == user_id:
|
||||
raise ValidationError("You cannot delete your own account.")
|
||||
user = User.objects.get(id=user_id)
|
||||
user.delete()
|
||||
return {"status": "success", "message": "User deleted successfully."}
|
||||
|
||||
|
||||
@transaction.atomic
|
||||
def set_password(user_id: int, new_password: str) -> dict:
|
||||
user = User.objects.get(id=user_id)
|
||||
validate_password(new_password, user)
|
||||
user.set_password(new_password)
|
||||
user.save(update_fields=["password"])
|
||||
return {"status": "success", "message": "Password reset successfully."}
|
||||
|
||||
|
||||
def login_user(request, username: str, password: str):
|
||||
user = authenticate(request, username=(username or "").strip(), password=password)
|
||||
if user is None:
|
||||
return False, {"message": "Invalid username or password."}
|
||||
|
||||
login(request, user)
|
||||
role = "admin" if user.is_superuser else "user"
|
||||
return True, {
|
||||
"message": "Login successful.",
|
||||
"user": {"id": user.id, "username": user.username, "role": role},
|
||||
}
|
||||
|
||||
|
||||
def logout_user(request) -> dict:
|
||||
logout(request)
|
||||
return {"status": "success", "message": "Logout successful."}
|
||||
|
||||
|
||||
def list_users() -> dict:
|
||||
return {
|
||||
"status": "success",
|
||||
"data": [
|
||||
{
|
||||
"id": user.id,
|
||||
"username": user.username,
|
||||
"email": user.email,
|
||||
"role": "admin" if user.is_superuser else "user",
|
||||
}
|
||||
for user in User.objects.order_by("username")
|
||||
],
|
||||
}
|
||||
Reference in New Issue
Block a user