Added history track
This commit is contained in:
@@ -8,7 +8,7 @@ from sqlalchemy.ext.asyncio import AsyncSession
|
||||
from src.models import (
|
||||
TokenResponse, UserInfo, GroupResponse,
|
||||
TagResponse, RequirementResponse, PriorityResponse,
|
||||
RequirementCreateRequest, RequirementUpdateRequest,
|
||||
RequirementCreateRequest, RequirementUpdateRequest, RequirementHistoryResponse,
|
||||
ProjectResponse, ProjectCreateRequest, ProjectUpdateRequest, ProjectMemberRequest,
|
||||
ValidationStatusResponse, ValidationHistoryResponse, ValidationCreateRequest,
|
||||
RelationshipTypeResponse, RelationshipTypeCreateRequest, RelationshipTypeUpdateRequest,
|
||||
@@ -793,6 +793,16 @@ def _build_requirement_response(req) -> RequirementResponse:
|
||||
validated_at = latest_validation.created_at
|
||||
validation_version = latest_validation.req_version_snapshot
|
||||
|
||||
# Get author (creator) display name
|
||||
author_username = None
|
||||
if req.user:
|
||||
author_username = _get_display_name(req.user)
|
||||
|
||||
# Get last editor display name
|
||||
last_editor_username = None
|
||||
if req.last_editor:
|
||||
last_editor_username = _get_display_name(req.last_editor)
|
||||
|
||||
return RequirementResponse(
|
||||
id=req.id,
|
||||
project_id=req.project_id,
|
||||
@@ -808,6 +818,8 @@ def _build_requirement_response(req) -> RequirementResponse:
|
||||
validated_by=validated_by,
|
||||
validated_at=validated_at,
|
||||
validation_version=validation_version,
|
||||
author_username=author_username,
|
||||
last_editor_username=last_editor_username,
|
||||
)
|
||||
|
||||
|
||||
@@ -1047,6 +1059,43 @@ async def delete_requirement(
|
||||
await db.commit()
|
||||
|
||||
|
||||
@app.get("/api/requirements/{requirement_id}/history", response_model=List[RequirementHistoryResponse])
|
||||
async def get_requirement_history(
|
||||
requirement_id: int,
|
||||
request: Request,
|
||||
db: AsyncSession = Depends(get_db)
|
||||
):
|
||||
"""
|
||||
Get the version history for a requirement.
|
||||
Returns all previous versions ordered by version (newest first).
|
||||
Note: Group changes are not tracked in history.
|
||||
|
||||
Args:
|
||||
requirement_id: The requirement to get history for
|
||||
|
||||
Returns:
|
||||
List of historical versions with tag, priority, and editor info.
|
||||
"""
|
||||
user = await _get_current_user_db(request, db)
|
||||
|
||||
# Check if requirement exists
|
||||
req_repo = RequirementRepository(db)
|
||||
requirement = await req_repo.get_by_id(requirement_id)
|
||||
if not requirement:
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_404_NOT_FOUND,
|
||||
detail=f"Requirement with id {requirement_id} not found"
|
||||
)
|
||||
|
||||
# Verify user is a member of the requirement's project
|
||||
await _verify_project_membership(requirement.project_id, user.id, db)
|
||||
|
||||
# Get history
|
||||
history = await req_repo.get_history(requirement_id)
|
||||
|
||||
return [RequirementHistoryResponse(**h) for h in history]
|
||||
|
||||
|
||||
# ===========================================
|
||||
# Validation Endpoints
|
||||
# ===========================================
|
||||
@@ -1073,7 +1122,7 @@ async def create_validation(
|
||||
):
|
||||
"""
|
||||
Create a new validation for a requirement.
|
||||
Only auditors (role_id=2) and admins (role_id=1) can validate requirements.
|
||||
Only auditors (role_id=2) can validate requirements.
|
||||
|
||||
Args:
|
||||
requirement_id: The requirement to validate
|
||||
@@ -1084,8 +1133,8 @@ async def create_validation(
|
||||
"""
|
||||
user = await _get_current_user_db(request, db)
|
||||
|
||||
# Only auditors (role_id=2) and admins (role_id=1) can validate
|
||||
_require_role(user, [1, 2], "validate requirements")
|
||||
# Only auditors (role_id=2) can validate
|
||||
_require_role(user, [2], "validate requirements")
|
||||
|
||||
# Check if requirement exists and user has access
|
||||
req_repo = RequirementRepository(db)
|
||||
|
||||
Reference in New Issue
Block a user