Added history track

This commit is contained in:
gulimabr
2025-12-02 11:21:03 -03:00
parent 0e30db3c18
commit 459ceaa162
6 changed files with 593 additions and 13 deletions

View File

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