Compare commits

1 Commits

Author SHA1 Message Date
8224b3c7a0 add runner .bat 2025-07-15 22:53:57 +05:00
7 changed files with 11 additions and 35 deletions

View File

@ -57,12 +57,3 @@ async def get_current_admin(token: str = Depends(oauth2_scheme), db: Session = D
if admin is None: if admin is None:
raise credentials_exception raise credentials_exception
return admin return admin
async def get_current_super_admin(current_admin: models.Admin = Depends(get_current_admin)):
"""Проверяет, является ли текущий админ суперадмином"""
if not current_admin.is_super_admin:
raise HTTPException(
status_code=status.HTTP_403_FORBIDDEN,
detail="Недостаточно прав. Эта операция доступна только главному администратору."
)
return current_admin

View File

@ -3,9 +3,9 @@ from models import Admin, Base
from database import SessionLocal, engine from database import SessionLocal, engine
import argparse import argparse
def create_initial_admin(username: str, password: str, super_admin: bool = True): def create_initial_admin(username: str, password: str):
""" """
Создает первого администратора в системе (по умолчанию как главного админа) Создает первого администратора в системе
""" """
Base.metadata.create_all(bind=engine) Base.metadata.create_all(bind=engine)
db = SessionLocal() db = SessionLocal()
@ -18,24 +18,18 @@ def create_initial_admin(username: str, password: str, super_admin: bool = True)
# Создаем нового админа # Создаем нового админа
hashed_password = get_password_hash(password) hashed_password = get_password_hash(password)
db_admin = Admin( db_admin = Admin(username=username, hashed_password=hashed_password)
username=username,
hashed_password=hashed_password,
is_super_admin=super_admin
)
db.add(db_admin) db.add(db_admin)
db.commit() db.commit()
db.refresh(db_admin) db.refresh(db_admin)
admin_type = "главный администратор" if super_admin else "администратор" print(f"Администратор {username} успешно создан!")
print(f"{admin_type.capitalize()} {username} успешно создан!")
db.close() db.close()
if __name__ == "__main__": if __name__ == "__main__":
parser = argparse.ArgumentParser(description="Создание администратора") parser = argparse.ArgumentParser(description="Создание первого администратора")
parser.add_argument("--username", required=True, help="Имя пользователя администратора") parser.add_argument("--username", required=True, help="Имя пользователя администратора")
parser.add_argument("--password", required=True, help="Пароль администратора") parser.add_argument("--password", required=True, help="Пароль администратора")
parser.add_argument("--super", action="store_true", help="Создать как главного администратора")
args = parser.parse_args() args = parser.parse_args()
create_initial_admin(args.username, args.password, args.super) create_initial_admin(args.username, args.password)

View File

@ -9,11 +9,7 @@ def get_admin_by_username(db: Session, username: str) -> Optional[Admin]:
def create_admin(db: Session, admin: schemas.AdminCreate) -> Admin: def create_admin(db: Session, admin: schemas.AdminCreate) -> Admin:
hashed_password = get_password_hash(admin.password) hashed_password = get_password_hash(admin.password)
db_admin = Admin( db_admin = Admin(username=admin.username, hashed_password=hashed_password)
username=admin.username,
hashed_password=hashed_password,
is_super_admin=admin.is_super_admin
)
db.add(db_admin) db.add(db_admin)
db.commit() db.commit()
db.refresh(db_admin) db.refresh(db_admin)

View File

@ -47,11 +47,8 @@ async def login_for_access_token(form_data: OAuth2PasswordRequestForm = Depends(
return {"access_token": access_token, "token_type": "bearer"} return {"access_token": access_token, "token_type": "bearer"}
@app.post("/admins", response_model=schemas.Admin, status_code=status.HTTP_201_CREATED) @app.post("/admins", response_model=schemas.Admin, status_code=status.HTTP_201_CREATED)
def create_admin( def create_admin(admin: schemas.AdminCreate, db: Session = Depends(get_db), current_admin: models.Admin = Depends(auth.get_current_admin)):
admin: schemas.AdminCreate, # Проверка, что создать админа может только существующий админ
db: Session = Depends(get_db),
current_admin: models.Admin = Depends(auth.get_current_super_admin)
):
db_admin = crud.get_admin_by_username(db, username=admin.username) db_admin = crud.get_admin_by_username(db, username=admin.username)
if db_admin: if db_admin:
raise HTTPException( raise HTTPException(

View File

@ -24,7 +24,6 @@ class Admin(Base):
username = Column(String, unique=True, index=True) username = Column(String, unique=True, index=True)
hashed_password = Column(String) hashed_password = Column(String)
is_active = Column(Boolean, default=True) is_active = Column(Boolean, default=True)
is_super_admin = Column(Boolean, default=False) # Новое поле для главного админа
class Car(Base): class Car(Base):
__tablename__ = "cars" __tablename__ = "cars"

View File

@ -32,12 +32,10 @@ class AdminBase(BaseModel):
class AdminCreate(AdminBase): class AdminCreate(AdminBase):
password: str password: str
is_super_admin: Optional[bool] = False
class Admin(AdminBase): class Admin(AdminBase):
id: int id: int
is_active: bool is_active: bool
is_super_admin: bool
class Config: class Config:
from_attributes = True from_attributes = True

1
start.bat Normal file
View File

@ -0,0 +1 @@
uvicorn main:app --reload