users.py 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. from typing import Any, List
  2. from fastapi import APIRouter, Body, Depends, HTTPException
  3. from fastapi.encoders import jsonable_encoder
  4. from pydantic.networks import EmailStr
  5. from sqlalchemy.orm import Session
  6. from app import crud, models, schemas
  7. from app.api import deps
  8. from app.core.config import settings
  9. from app.utils import send_new_account_email
  10. router = APIRouter()
  11. @router.get("/", response_model=List[schemas.User])
  12. def read_users(
  13. db: Session = Depends(deps.get_db),
  14. skip: int = 0,
  15. limit: int = 100,
  16. current_user: models.User = Depends(deps.get_current_active_superuser),
  17. ) -> Any:
  18. """
  19. Retrieve users.
  20. """
  21. users = crud.user.get_multi(db, skip=skip, limit=limit)
  22. return users
  23. @router.post("/", response_model=schemas.User)
  24. def create_user(
  25. *,
  26. db: Session = Depends(deps.get_db),
  27. user_in: schemas.UserCreate,
  28. current_user: models.User = Depends(deps.get_current_active_superuser),
  29. ) -> Any:
  30. """
  31. Create new user.
  32. """
  33. user = crud.user.get_by_email(db, email=user_in.email)
  34. if user:
  35. raise HTTPException(
  36. status_code=400,
  37. detail="The user with this username already exists in the system.",
  38. )
  39. user = crud.user.create(db, obj_in=user_in)
  40. if settings.EMAILS_ENABLED and user_in.email:
  41. send_new_account_email(
  42. email_to=user_in.email, username=user_in.email, password=user_in.password
  43. )
  44. return user
  45. @router.put("/me", response_model=schemas.User)
  46. def update_user_me(
  47. *,
  48. db: Session = Depends(deps.get_db),
  49. password: str = Body(None),
  50. full_name: str = Body(None),
  51. email: EmailStr = Body(None),
  52. current_user: models.User = Depends(deps.get_current_active_user),
  53. ) -> Any:
  54. """
  55. Update own user.
  56. """
  57. current_user_data = jsonable_encoder(current_user)
  58. user_in = schemas.UserUpdate(**current_user_data)
  59. if password is not None:
  60. user_in.password = password
  61. if full_name is not None:
  62. user_in.full_name = full_name
  63. if email is not None:
  64. user_in.email = email
  65. user = crud.user.update(db, db_obj=current_user, obj_in=user_in)
  66. return user
  67. @router.get("/me", response_model=schemas.User)
  68. def read_user_me(
  69. db: Session = Depends(deps.get_db),
  70. current_user: models.User = Depends(deps.get_current_active_user),
  71. ) -> Any:
  72. """
  73. Get current user.
  74. """
  75. return current_user
  76. @router.post("/open", response_model=schemas.User)
  77. def create_user_open(
  78. *,
  79. db: Session = Depends(deps.get_db),
  80. password: str = Body(...),
  81. email: EmailStr = Body(...),
  82. full_name: str = Body(None),
  83. ) -> Any:
  84. """
  85. Create new user without the need to be logged in.
  86. """
  87. if not settings.USERS_OPEN_REGISTRATION:
  88. raise HTTPException(
  89. status_code=403,
  90. detail="Open user registration is forbidden on this server",
  91. )
  92. user = crud.user.get_by_email(db, email=email)
  93. if user:
  94. raise HTTPException(
  95. status_code=400,
  96. detail="The user with this username already exists in the system",
  97. )
  98. user_in = schemas.UserCreate(password=password, email=email, full_name=full_name)
  99. user = crud.user.create(db, obj_in=user_in)
  100. return user
  101. @router.get("/{user_id}", response_model=schemas.User)
  102. def read_user_by_id(
  103. user_id: int,
  104. current_user: models.User = Depends(deps.get_current_active_user),
  105. db: Session = Depends(deps.get_db),
  106. ) -> Any:
  107. """
  108. Get a specific user by id.
  109. """
  110. user = crud.user.get(db, id=user_id)
  111. if user == current_user:
  112. return user
  113. if not crud.user.is_superuser(current_user):
  114. raise HTTPException(
  115. status_code=400, detail="The user doesn't have enough privileges"
  116. )
  117. return user
  118. @router.put("/{user_id}", response_model=schemas.User)
  119. def update_user(
  120. *,
  121. db: Session = Depends(deps.get_db),
  122. user_id: int,
  123. user_in: schemas.UserUpdate,
  124. current_user: models.User = Depends(deps.get_current_active_superuser),
  125. ) -> Any:
  126. """
  127. Update a user.
  128. """
  129. user = crud.user.get(db, id=user_id)
  130. if not user:
  131. raise HTTPException(
  132. status_code=404,
  133. detail="The user with this username does not exist in the system",
  134. )
  135. user = crud.user.update(db, db_obj=user, obj_in=user_in)
  136. return user