TS-ResHub/authorize/api/resume_authorize.py
2025-04-17 16:58:00 +08:00

168 lines
5.7 KiB
Python

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)}