from ninja import Router, Query from django.shortcuts import get_object_or_404 from accounts.models import User from authorize.models import ResumeDetailAccessRequest from authorize.schemas import ResumeAccessRequestIn from resumes.models import ResumeDetail from utils.auth import jwt_auth from utils.permissions import login_required, manager_required from logs.models import LogEntry resume_authorize_router = Router(tags=["简历(详情信息)授权管理"]) @resume_authorize_router.post("/apply", auth=jwt_auth, summary="申请简历详情[普]", description="普通用户申请查看某一份简历详情") @login_required def apply_resume_access(request, data: ResumeAccessRequestIn): user = request.user if not user.is_user(): return {"success": False, "message": "仅普通用户可申请查看简历"} resume = get_object_or_404(ResumeDetail, id=data.resume_id) exists = ResumeDetailAccessRequest.objects.filter( user=user, resume=resume, status="pending" ).exists() if exists: return {"success": False, "message": "您已申请过该简历,正在等待审批"} ResumeDetailAccessRequest.objects.create( user=user, resume=resume, reason=data.reason or "" ) LogEntry.objects.create( user=user, action="apply_resume", target_type="resume", target_id=resume.id, message="申请查看简历" ) return {"success": True, "message": "申请已提交,等待审批"} @resume_authorize_router.get("/pending", auth=jwt_auth, summary="待审批简历[分]", description="分管理查看自己网站下的待审批简历详情申请") @manager_required def list_pending_resume_requests(request): manager = request.user manageable_ids = manager.managed_websites.values_list("id", flat=True) requests = ResumeDetailAccessRequest.objects.filter( resume__source_id__in=manageable_ids, status="pending" ) data = [ { "id": r.id, "user": r.user.username, "resume_id": r.resume.id, "reason": r.reason, "created_at": r.created_at, } for r in requests ] return {"success": True, "items": data} @resume_authorize_router.post("/approve", auth=jwt_auth, summary="审批简历详情[分]", description="分管理审批某个用户的简历查看申请") @manager_required def approve_resume_request(request, request_id: int = Query(...), approve: bool = Query(...)): req = get_object_or_404(ResumeDetailAccessRequest, id=request_id) if req.resume.source not in request.user.managed_websites.all(): return {"success": False, "message": "无权审批该申请"} req.status = "approved" if approve else "rejected" req.save() LogEntry.objects.create( user=request.user, action="approve_resume", target_type="resume", target_id=req.resume.id, message=f"审批简历:{req.user.username} -> {req.status}" ) return {"success": True, "message": f"已{'通过' if approve else '拒绝'}对简历 {req.resume.id} 的访问申请"} @resume_authorize_router.get("/history", auth=jwt_auth, summary="我的简历申请记录[普]", description="普通用户查看自己申请的简历详情访问记录") @login_required def my_resume_request_history(request): user = request.user if not user.is_user(): return {"success": False, "message": "仅普通用户可查看"} records = ResumeDetailAccessRequest.objects.filter(user=user).order_by("-created_at") data = [ { "resume_id": r.resume.id, "reason": r.reason, "status": r.status, "created_at": r.created_at, } for r in records ] return {"success": True, "items": data} @resume_authorize_router.post("/manual-authorize", auth=jwt_auth, summary="手动授权简历详情[分]", description="分管理跳过申请流程,直接授权某用户查看指定简历") @manager_required def manually_authorize_resume(request, user_id: int = Query(...), resume_id: int = Query(...)): user = get_object_or_404(User, id=user_id) resume = get_object_or_404(ResumeDetail, id=resume_id) if not user.is_user(): return {"success": False, "message": "仅能授权给普通用户"} if resume.source not in request.user.managed_websites.all(): return {"success": False, "message": "无权授权该简历"} record, created = ResumeDetailAccessRequest.objects.get_or_create( user=user, resume=resume, defaults={"status": "approved", "reason": "由分管理手动授权"} ) if not created: record.status = "approved" record.save() LogEntry.objects.create( user=request.user, action="manual_grant_resume", target_type="resume", target_id=resume.id, message=f"手动授权 {user.username} 查看简历" ) return {"success": True, "message": f"已手动授权 {user.username} 访问简历 {resume.id}"} @resume_authorize_router.get("/granted", auth=jwt_auth, summary="我已获授权的简历ID[普]", description="普通用户查看当前已被授权访问的简历ID列表") @login_required def list_granted_resume_ids(request): user = request.user if not user.is_user(): return {"success": False, "message": "仅普通用户可访问"} ids = ResumeDetailAccessRequest.objects.filter( user=user, status="approved" ).values_list("resume_id", flat=True) return {"success": True, "resume_ids": list(ids)}