creator.py 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. from datetime import datetime
  2. from typing import Any, List
  3. from fastapi import APIRouter, Body, Depends, HTTPException
  4. from fastapi.encoders import jsonable_encoder
  5. from pydantic.networks import EmailStr
  6. from sqlalchemy.orm import Session
  7. from sqlalchemy.sql import schema
  8. from app import crud, models, schemas
  9. from app.api import deps
  10. from app.core.config import settings
  11. from app.utils import send_new_account_email
  12. router = APIRouter()
  13. @router.get("/", response_model=List[schemas.Creator])
  14. def read_creators(
  15. db: Session = Depends(deps.get_db),
  16. skip: int = 0,
  17. limit: int = 100,
  18. current_creator: models.Creator = Depends(deps.get_current_active_superuser),
  19. ) -> Any:
  20. """
  21. Retrieve users. For superuser.
  22. """
  23. creators = crud.creator.get_multi(db, skip=skip, limit=limit)
  24. return creators
  25. @router.post("/", response_model=schemas.Creator)
  26. def create_creator(
  27. *,
  28. db: Session = Depends(deps.get_db),
  29. creator_in: schemas.CreatorCreate,
  30. current_creator: models.Creator = Depends(deps.get_current_active_superuser),
  31. ) -> Any:
  32. """
  33. Create new user. For superuser.
  34. """
  35. creator = crud.creator.get_by_email(db, email=creator_in.email)
  36. if creator:
  37. raise HTTPException(
  38. status_code=400,
  39. detail="The user with this username already exists in the system.",
  40. )
  41. creator = crud.creator.create(db, obj_in=creator_in)
  42. if settings.EMAILS_ENABLED and creator_in.email:
  43. send_new_account_email(
  44. email_to=creator_in.email, username=creator_in.account, password=creator_in.pwd
  45. )
  46. return creator
  47. @router.put("/me", response_model=schemas.Creator)
  48. def update_creator_me(
  49. *,
  50. db: Session = Depends(deps.get_db),
  51. password: str = Body(None),
  52. nick_name: str = Body(None),
  53. email: EmailStr = Body(None),
  54. phone: str = Body(None),
  55. brief_introduction: str = Body(None),
  56. current_creator: models.Creator = Depends(deps.get_current_active_creator),
  57. ) -> Any:
  58. """
  59. Update own user.
  60. """
  61. current_creator_data = jsonable_encoder(current_creator)
  62. creator_in = schemas.CreatorUpdate(**current_creator_data)
  63. if password is not None:
  64. creator_in.pwd = password
  65. if nick_name is not None:
  66. creator_in.nick_name = nick_name
  67. if email is not None:
  68. creator_in.email = email
  69. if brief_introduction is not None:
  70. creator_in.brief_introduction = brief_introduction
  71. if phone is not None:
  72. creator_in.phone = phone
  73. creator = crud.creator.update(db, db_obj=current_creator, obj_in=creator_in)
  74. return creator
  75. @router.get("/me", response_model=schemas.Creator)
  76. def read_creator_me(
  77. db: Session = Depends(deps.get_db),
  78. current_creator: models.Creator = Depends(deps.get_current_active_creator),
  79. ) -> Any:
  80. """
  81. Get current user.
  82. """
  83. return current_creator
  84. @router.post("/open", response_model=schemas.Creator)
  85. def create_creator_open(
  86. *,
  87. db: Session = Depends(deps.get_db),
  88. phone: str = Body(...),
  89. password: str = Body(...),
  90. email: EmailStr = Body(...),
  91. account: str = Body(...),
  92. nick_name: str = Body(None),
  93. brief_introduction: str = Body(None),
  94. work_exerience: str = Body(None),
  95. case_type: str = Body(None)
  96. ) -> Any:
  97. """
  98. Create new user without the need to be logged in.
  99. """
  100. if not settings.USERS_OPEN_REGISTRATION:
  101. raise HTTPException(
  102. status_code=403,
  103. detail="Open user registration is forbidden on this server",
  104. )
  105. creator = crud.creator.get_by_account(db, account=account)
  106. if creator:
  107. raise HTTPException(
  108. status_code=400,
  109. detail="The user with this username already exists in the system",
  110. )
  111. creator = crud.creator.get_by_email(db, email=email)
  112. if creator:
  113. raise HTTPException(
  114. status_code=400,
  115. detail="The user with this email already exists in the system",
  116. )
  117. try:
  118. user_in = schemas.CreatorCreate(
  119. account=account, phone=phone, email=email,
  120. nick_name=nick_name, brief_introduction=brief_introduction,
  121. work_exerience=work_exerience, case_type=case_type,
  122. pwd=password
  123. )
  124. except ValueError:
  125. raise HTTPException(
  126. status_code=400,
  127. detail='Please provide a valid mobile phone number',
  128. )
  129. creator = crud.creator.create(db, obj_in=user_in)
  130. return creator