Spaces:
Build error
Build error
import secrets | |
from schemas.user import UserCreate | |
from typing import Any, List | |
import aiofiles | |
from hashlib import sha1 | |
import os | |
from fastapi import APIRouter, Body, Depends, HTTPException, UploadFile, File | |
from fastapi.encoders import jsonable_encoder | |
from pydantic.networks import EmailStr | |
from sqlalchemy.orm import Session | |
from core import settings | |
import cruds | |
import models | |
import schemas | |
from utils import deps | |
from core.config import settings | |
from utils.utils import send_reset_password_email | |
from fastapi import FastAPI, File, Form, UploadFile | |
from typing import List, Optional | |
from datetime import date | |
router = APIRouter() | |
def read_users( | |
db: Session = Depends(deps.get_db), | |
skip: int = 0, | |
limit: int = 100, | |
current_user: models.User = Depends(deps.get_current_admin_or_above), | |
) -> Any: | |
""" | |
Retrieve users. | |
""" | |
users = cruds.crud_user.get_multi(db, skip=skip, limit=limit) | |
return users | |
def get_teachers( | |
db: Session = Depends(deps.get_db), | |
skip: int = 0, | |
limit: int = 200, | |
current_user: models.User = Depends(deps.get_current_active_teacher_or_above), | |
) -> Any: | |
teachers = ( | |
db.query(models.User) | |
.filter(models.User.user_type == settings.UserType.TEACHER.value) | |
.all() | |
) | |
return teachers | |
async def create_user( | |
*, | |
db: Session = Depends(deps.get_db), | |
user_in: schemas.user.AdminUserCreate, | |
current_user: models.User = Depends(deps.get_current_active_superuser), | |
) -> Any: | |
user = cruds.crud_user.get_by_email(db, email=user_in.email) | |
if user: | |
raise HTTPException( | |
status_code=400, | |
detail="Error ID: 128", | |
) # The user with this username already exists in the system. | |
user_create = schemas.UserCreate( | |
email=user_in.email, | |
full_name=user_in.full_name, | |
address=user_in.address, | |
group_id=user_in.group_id, | |
contact_number=user_in.contact_number, | |
dob=user_in.dob, | |
join_year=user_in.join_year, | |
password=settings.SECRET_KEY, | |
) | |
user = cruds.crud_user.create(db, obj_in=user_create) | |
cruds.crud_user.verify_user(db=db, db_obj=user) | |
await send_reset_password_email(user=user) | |
return user | |
async def update_user_me( | |
*, | |
db: Session = Depends(deps.get_db), | |
full_name: Optional[str] = Form(None), | |
address: Optional[str] = Form(None), | |
dob: Optional[date] = Form(None), | |
contact_number: Optional[str] = Form(None), | |
profile_photo: Optional[UploadFile] = File(None), | |
current_user: models.User = Depends(deps.get_current_active_user), | |
) -> Any: | |
""" | |
Update own user. | |
""" | |
profile_db_path = None | |
if profile_photo: | |
profiles_path = os.path.join(settings.UPLOAD_DIR_ROOT, "profiles") | |
content_type = profile_photo.content_type | |
file_extension = content_type[content_type.index("/") + 1 :] | |
new_profile_image = f"{secrets.token_hex(nbytes=16)}.{file_extension}" | |
profile_db_path = os.path.join("profiles", new_profile_image) | |
new_profile_image_file_path = os.path.join( | |
settings.UPLOAD_DIR_ROOT, profile_db_path | |
) | |
if not os.path.exists(profiles_path): | |
os.makedirs(profiles_path) | |
async with aiofiles.open(new_profile_image_file_path, mode="wb") as f: | |
content = await profile_photo.read() | |
await f.write(content) | |
try: | |
if current_user.profile_image != None: | |
os.remove( | |
os.path.join(settings.UPLOAD_DIR_ROOT, current_user.profile_image) | |
) | |
except Exception: | |
pass | |
user_in = schemas.UserUpdate( | |
full_name=full_name, | |
address=address, | |
dob=dob, | |
contact_number=contact_number, | |
profile_image=profile_db_path, | |
) | |
print(jsonable_encoder(user_in)) | |
user = cruds.crud_user.update( | |
db, db_obj=current_user, obj_in=user_in.dict(exclude_none=True) | |
) | |
return user | |
# @router.get("/me/teacher_group", response_model=schemas.user.UserReturn) | |
async def read_user_me( | |
db: Session = Depends(deps.get_db), | |
current_user: models.User = Depends(deps.get_current_active_user), | |
) -> Any: | |
""" | |
Get current user. | |
""" | |
return current_user | |
# @router.put("/me/profile/") | |
# async def update_my_profile_photo( | |
# db: Session = Depends(deps.get_db), | |
# *, | |
# current_user: models.User = Depends(deps.get_current_active_user), | |
# profile_photo: UploadFile = File(...), | |
# ): | |
# cruds.crud_user.update( | |
# db, | |
# db_obj=current_user, | |
# obj_in=schemas.user.ImageUpdate(profile_image=profile_db_path), | |
# ) | |
# return {"msg": "success", "profile": new_profile_image} | |
async def read_user_by_id( | |
user_id: int, | |
current_user: models.User = Depends(deps.get_current_active_user), | |
db: Session = Depends(deps.get_db), | |
) -> Any: | |
""" | |
Get a specific user by id. | |
""" | |
user = cruds.crud_user.get(db, id=user_id) | |
if user == current_user: | |
return user | |
if current_user.user_type > settings.UserType.ADMIN.value: | |
raise HTTPException( | |
status_code=400, detail="Error ID: 131" | |
) # The user doesn't have enough privileges | |
# if not cruds.crud_user.is_superuser(current_user): | |
# raise HTTPException( | |
# status_code=400, detail="Error ID: 131" | |
# ) # The user doesn't have enough privileges | |
return user | |
async def update_user( | |
*, | |
db: Session = Depends(deps.get_db), | |
user_id: int, | |
user_in: schemas.UserUpdate, | |
current_user: models.User = Depends(deps.get_current_admin_or_above), | |
) -> Any: | |
""" | |
Update a user. | |
""" | |
user = cruds.crud_user.get(db, id=user_id) | |
if not user: | |
raise HTTPException( | |
status_code=404, | |
detail="Error ID: 132", | |
) # The user with this username does not exist in the system | |
user = cruds.crud_user.update(db, db_obj=user, obj_in=user_in) | |
return user | |
async def delete_user( | |
*, | |
db: Session = Depends(deps.get_db), | |
user_id: int, | |
current_user: models.User = Depends(deps.get_current_admin_or_above), | |
) -> Any: | |
cruds.crud_user.remove(db, id=user_id) | |
return {"msg": "success"} | |
async def update_profile_photo( | |
db: Session = Depends(deps.get_db), | |
*, | |
user_id: int, | |
current_user: models.User = Depends(deps.get_current_admin_or_above), | |
profile_photo: UploadFile = File(...), | |
): | |
user = cruds.crud_user.get_by_id(db, id=user_id) | |
profile_image_path = os.path.join("uploaded_files", "profiles") | |
profile_image = f"{abs(hash(str(user.id)))}.jpg" | |
profile_image_file_path = os.path.join(profile_image_path, profile_image) | |
if not os.path.exists(profile_image_path): | |
os.makedirs(profile_image_path) | |
else: | |
if os.path.exists(os.path.join(profile_image_path, f"{user.profile_image}")): | |
os.remove(os.path.join(profile_image_path, f"{user.profile_image}")) | |
async with aiofiles.open(profile_image_file_path, mode="wb") as f: | |
content = await profile_photo.read() | |
await f.write(content) | |
user = cruds.crud_user.update( | |
db, | |
db_obj=user, | |
obj_in=schemas.UserUpdate(profile_image=profile_image), | |
) | |
return user | |