Added esc functionality to open windows, added 'n' keybind to create new tasks, fixed Accounts and settings page to allow for edits to be made as well as profile picture to be updated

This commit is contained in:
NPS Agent
2026-05-13 09:55:19 +09:30
parent cf3e4cfe41
commit abb6402f86
7 changed files with 135 additions and 30 deletions
+35 -15
View File
@@ -1,6 +1,7 @@
from fastapi import FastAPI, Depends, HTTPException, status
from fastapi.middleware.cors import CORSMiddleware
from sqlalchemy.orm import Session
from sqlalchemy.sql import func
from typing import List
import uuid
@@ -50,9 +51,8 @@ def create_user(user: schemas.UserCreate, db: Session = Depends(get_db), current
initials=user.initials,
email=user.email,
phone=user.phone,
photo=user.photo,
account_type=user.account_type,
password_hash=auth.get_password_hash(user.password)
password_hash=auth.get_password_hash(user.password) if user.password else None,
account_type=user.account_type
)
db.add(db_user)
db.commit()
@@ -61,6 +61,9 @@ def create_user(user: schemas.UserCreate, db: Session = Depends(get_db), current
@app.patch("/users/{user_id}", response_model=schemas.User)
def update_user(user_id: str, user_update: schemas.UserUpdate, db: Session = Depends(get_db), current_user: models.User = Depends(auth.get_current_user)):
if current_user.account_type != "admin" and current_user.id != user_id:
raise HTTPException(status_code=403, detail="Not enough permissions")
db_user = db.query(models.User).filter(models.User.id == user_id).first()
if not db_user:
raise HTTPException(status_code=404, detail="User not found")
@@ -74,25 +77,26 @@ def update_user(user_id: str, user_update: schemas.UserUpdate, db: Session = Dep
return db_user
@app.post("/users/{user_id}/password")
def change_password(user_id: str, payload: schemas.PasswordChange, db: Session = Depends(get_db), current_user: models.User = Depends(auth.get_current_user)):
db_user = db.query(models.User).filter(models.User.id == user_id).first()
if not db_user:
raise HTTPException(status_code=404, detail="User not found")
if not auth.verify_password(payload.old_password, db_user.password_hash):
raise HTTPException(status_code=401, detail="Current password is incorrect")
db_user.password_hash = auth.get_password_hash(payload.new_password)
def change_password(user_id: str, pwd_data: schemas.PasswordChange, db: Session = Depends(get_db), current_user: models.User = Depends(auth.get_current_user)):
if current_user.id != user_id:
raise HTTPException(status_code=403, detail="Cannot change another user's password")
if not auth.verify_password(pwd_data.old_password, current_user.password_hash):
raise HTTPException(status_code=400, detail="Incorrect current password")
current_user.password_hash = auth.get_password_hash(pwd_data.new_password)
db.commit()
return {"message": "Password updated"}
return {"message": "Password updated successfully"}
@app.delete("/users/{user_id}")
def delete_user(user_id: str, db: Session = Depends(get_db), current_user: models.User = Depends(auth.get_current_user)):
if current_user.account_type != "admin":
raise HTTPException(status_code=403, detail="Not enough permissions")
db_user = db.query(models.User).filter(models.User.id == user_id).first()
if not db_user:
raise HTTPException(status_code=404, detail="User not found")
# Reassign tasks to rod
db.query(models.Task).filter(models.Task.assignee_id == user_id).update({"assignee_id": "rod"})
db.delete(db_user)
db.commit()
return {"message": "User deleted"}
@@ -160,11 +164,26 @@ def delete_task(task_id: str, db: Session = Depends(get_db), current_user: model
if not db_task:
raise HTTPException(status_code=404, detail="Task not found")
from sqlalchemy.sql import func
db_task.deleted_at = func.now()
db.commit()
return {"message": "Task moved to trash"}
@app.get("/tasks/{task_id}/notes", response_model=List[schemas.TaskNote])
def read_task_notes(task_id: str, db: Session = Depends(get_db), current_user: models.User = Depends(auth.get_current_user)):
return db.query(models.TaskNote).filter(models.TaskNote.task_id == task_id).order_by(models.TaskNote.created_at.desc()).all()
@app.post("/tasks/{task_id}/notes", response_model=schemas.TaskNote)
def create_task_note(task_id: str, note: schemas.TaskNoteBase, db: Session = Depends(get_db), current_user: models.User = Depends(auth.get_current_user)):
db_note = models.TaskNote(
task_id=task_id,
author_id=current_user.id,
body=note.body
)
db.add(db_note)
db.commit()
db.refresh(db_note)
return db_note
@app.post("/tasks/{task_id}/restore", response_model=schemas.Task)
def restore_task(task_id: str, db: Session = Depends(get_db), current_user: models.User = Depends(auth.get_current_user)):
if current_user.account_type != "admin":
@@ -178,6 +197,7 @@ def restore_task(task_id: str, db: Session = Depends(get_db), current_user: mode
db.commit()
db.refresh(db_task)
return db_task
@app.get("/workspace", response_model=schemas.Workspace)
def read_workspace(db: Session = Depends(get_db)):
ws = db.query(models.Workspace).first()
+2
View File
@@ -25,6 +25,8 @@ class UserUpdate(BaseModel):
role: Optional[str] = None
account_type: Optional[str] = None
photo: Optional[str] = None
email: Optional[str] = None
phone: Optional[str] = None
class PasswordChange(BaseModel):
old_password: str