Spaces:
Sleeping
Sleeping
| from fastapi import FastAPI, Request, Form, Depends, status | |
| from fastapi.responses import RedirectResponse, HTMLResponse | |
| from fastapi.staticfiles import StaticFiles | |
| from fastapi.templating import Jinja2Templates | |
| from starlette.middleware.sessions import SessionMiddleware | |
| from sqlalchemy.orm import Session | |
| from database import engine, Base, SessionLocal | |
| from models import User, UserDetails | |
| from auth import authenticate_user, create_user, get_password_hash | |
| import uvicorn | |
| from datetime import datetime | |
| app = FastAPI() | |
| app.add_middleware(SessionMiddleware, secret_key="your-secret-key") | |
| app.mount("/static", StaticFiles(directory="static"), name="static") | |
| templates = Jinja2Templates(directory="templates") | |
| Base.metadata.create_all(bind=engine) | |
| def get_db(): | |
| db = SessionLocal() | |
| try: | |
| yield db | |
| finally: | |
| db.close() | |
| def index(request: Request): | |
| if request.session.get("user_id"): | |
| return RedirectResponse("/user/form", status_code=302) | |
| return templates.TemplateResponse("login.html", {"request": request, "success": request.session.pop("success", None), "error": request.session.pop("error", None)}) | |
| def login_get(request: Request): | |
| return templates.TemplateResponse("login.html", {"request": request, "success": request.session.pop("success", None), "error": request.session.pop("error", None)}) | |
| def login_post(request: Request, username: str = Form(...), password: str = Form(...), db: Session = Depends(get_db)): | |
| user = authenticate_user(db, username, password) | |
| if user: | |
| request.session["user_id"] = user.id | |
| request.session["is_admin"] = user.is_admin | |
| request.session["success"] = "Login successful!" | |
| if user.is_admin: | |
| return RedirectResponse("/admin/dashboard", status_code=302) | |
| else: | |
| return RedirectResponse("/user/form", status_code=302) | |
| request.session["error"] = "Invalid credentials" | |
| return RedirectResponse("/login", status_code=302) | |
| def signup_get(request: Request): | |
| return templates.TemplateResponse("signup.html", {"request": request, "success": request.session.pop("success", None), "error": request.session.pop("error", None)}) | |
| def signup_post(request: Request, username: str = Form(...), password: str = Form(...), db: Session = Depends(get_db)): | |
| if db.query(User).filter(User.username == username).first(): | |
| request.session["error"] = "Username already exists" | |
| return RedirectResponse("/signup", status_code=302) | |
| create_user(db, username, password) | |
| request.session["success"] = "Signup successful! Please login." | |
| return RedirectResponse("/login", status_code=302) | |
| def logout(request: Request): | |
| request.session.clear() | |
| return RedirectResponse("/login", status_code=302) | |
| def user_form_get(request: Request, db: Session = Depends(get_db)): | |
| user_id = request.session.get("user_id") | |
| if not user_id: | |
| return RedirectResponse("/login", status_code=302) | |
| user = db.query(User).filter(User.id == user_id).first() | |
| details = user.details if user and user.details else None | |
| return templates.TemplateResponse("user_form.html", {"request": request, "details": details or {}, "success": request.session.pop("success", None), "error": request.session.pop("error", None)}) | |
| def user_form_post(request: Request, | |
| first_name: str = Form(...), | |
| last_name: str = Form(...), | |
| email: str = Form(...), | |
| mobile: str = Form(...), | |
| dob: str = Form(...), | |
| gender: str = Form(...), | |
| current_semester: str = Form(...), | |
| tenth_percentage: float = Form(...), | |
| twelfth_percentage: float = Form(...), | |
| graduation_percentage: float = Form(...), | |
| specialization: str = Form(...), | |
| experience_status: str = Form(...), | |
| db: Session = Depends(get_db)): | |
| user_id = request.session.get("user_id") | |
| if not user_id: | |
| return RedirectResponse("/login", status_code=302) | |
| user = db.query(User).filter(User.id == user_id).first() | |
| if not user: | |
| return RedirectResponse("/login", status_code=302) | |
| details = user.details | |
| if not details: | |
| details = UserDetails(user_id=user.id) | |
| db.add(details) | |
| msg = "Details created!" | |
| else: | |
| msg = "Details updated!" | |
| details.first_name = first_name | |
| details.last_name = last_name | |
| details.email = email | |
| details.mobile = mobile | |
| details.dob = datetime.strptime(dob, "%Y-%m-%d").date() | |
| details.gender = gender | |
| details.current_semester = current_semester | |
| details.tenth_percentage = tenth_percentage | |
| details.twelfth_percentage = twelfth_percentage | |
| details.graduation_percentage = graduation_percentage | |
| details.specialization = specialization | |
| details.experience_status = experience_status | |
| db.commit() | |
| request.session["success"] = msg | |
| return RedirectResponse("/user/form", status_code=302) | |
| def admin_dashboard(request: Request, search: str = "", db: Session = Depends(get_db)): | |
| if not request.session.get("is_admin"): | |
| return RedirectResponse("/login", status_code=302) | |
| query = db.query(User).filter(User.is_admin == False) | |
| if search: | |
| query = query.join(UserDetails).filter( | |
| (User.username.contains(search)) | | |
| (UserDetails.first_name.contains(search)) | | |
| (UserDetails.last_name.contains(search)) | | |
| (UserDetails.email.contains(search)) | |
| ) | |
| users = query.all() | |
| return templates.TemplateResponse("admin_dashboard.html", {"request": request, "users": users, "search": search, "success": request.session.pop("success", None), "error": request.session.pop("error", None)}) | |
| def admin_view_user(request: Request, user_id: int, db: Session = Depends(get_db)): | |
| if not request.session.get("is_admin"): | |
| return RedirectResponse("/login", status_code=302) | |
| user = db.query(User).filter(User.id == user_id).first() | |
| if not user: | |
| return RedirectResponse("/admin/dashboard", status_code=302) | |
| details = user.details | |
| return templates.TemplateResponse("admin_view.html", {"request": request, "user": user, "details": details}) | |
| def admin_edit_user_get(request: Request, user_id: int, db: Session = Depends(get_db)): | |
| if not request.session.get("is_admin"): | |
| return RedirectResponse("/login", status_code=302) | |
| user = db.query(User).filter(User.id == user_id).first() | |
| if not user: | |
| return RedirectResponse("/admin/dashboard", status_code=302) | |
| details = user.details or None | |
| return templates.TemplateResponse("admin_edit.html", {"request": request, "user": user, "details": details or {}, "success": request.session.pop("success", None), "error": request.session.pop("error", None)}) | |
| def admin_edit_user_post(request: Request, user_id: int, | |
| first_name: str = Form(...), | |
| last_name: str = Form(...), | |
| email: str = Form(...), | |
| mobile: str = Form(...), | |
| dob: str = Form(...), | |
| gender: str = Form(...), | |
| current_semester: str = Form(...), | |
| tenth_percentage: float = Form(...), | |
| twelfth_percentage: float = Form(...), | |
| graduation_percentage: float = Form(...), | |
| specialization: str = Form(...), | |
| experience_status: str = Form(...), | |
| db: Session = Depends(get_db)): | |
| if not request.session.get("is_admin"): | |
| return RedirectResponse("/login", status_code=302) | |
| user = db.query(User).filter(User.id == user_id).first() | |
| if not user: | |
| return RedirectResponse("/admin/dashboard", status_code=302) | |
| details = user.details | |
| if not details: | |
| details = UserDetails(user_id=user.id) | |
| db.add(details) | |
| msg = "User details created!" | |
| else: | |
| msg = "User details updated!" | |
| details.first_name = first_name | |
| details.last_name = last_name | |
| details.email = email | |
| details.mobile = mobile | |
| details.dob = datetime.strptime(dob, "%Y-%m-%d").date() | |
| details.gender = gender | |
| details.current_semester = current_semester | |
| details.tenth_percentage = tenth_percentage | |
| details.twelfth_percentage = twelfth_percentage | |
| details.graduation_percentage = graduation_percentage | |
| details.specialization = specialization | |
| details.experience_status = experience_status | |
| db.commit() | |
| request.session["success"] = msg | |
| return RedirectResponse(f"/admin/user/{user_id}/edit", status_code=302) | |
| def admin_delete_user(request: Request, user_id: int, db: Session = Depends(get_db)): | |
| if not request.session.get("is_admin"): | |
| return RedirectResponse("/login", status_code=302) | |
| user = db.query(User).filter(User.id == user_id).first() | |
| if user: | |
| db.delete(user) | |
| db.commit() | |
| request.session["success"] = "User deleted!" | |
| return RedirectResponse("/admin/dashboard", status_code=302) | |
| def create_admin(request: Request, db: Session = Depends(get_db)): | |
| if db.query(User).filter(User.username == "admin@149gmail.com").first(): | |
| request.session["error"] = "Admin already exists." | |
| return RedirectResponse("/login", status_code=302) | |
| create_user(db, "admin@149gmail.com", "Admin@149", is_admin=True) | |
| request.session["success"] = "Admin created. You can now login as admin." | |
| return RedirectResponse("/login", status_code=302) | |
| if __name__ == "__main__": | |
| uvicorn.run("main:app", host="127.0.0.1", port=7860, reload=True) | |