Files
warehouse13/app/schemas/artifact.py
Mondo Diaz 21347d8c65 Add tags prominence and SIM source grouping features
Database changes:
- Add sim_source_id column to artifacts table for grouping multiple artifacts
- Create Alembic migration (001_add_sim_source_id) for schema update
- Add Alembic env.py for migration support with environment-based DB URLs

API enhancements:
- Add sim_source_id parameter to upload endpoint
- Add sim_source_id filter to query endpoint
- Add new /grouped-by-sim-source endpoint for getting artifacts by group
- Update all API documentation to include sim_source_id

UI improvements:
- Make tags required field and more prominent in upload form
- Add tags display directly in artifacts table (below filename)
- Add SIM Source ID field in upload form with helper text for grouping
- Update table to show sim_source_id (falls back to test_suite if null)
- Tags now displayed as inline badges in main table view

Seed data updates:
- Generate sim_source_id for 70% of artifacts to demonstrate grouping
- Multiple artifacts can share same sim_source_id
- Improved seed data variety with tag combinations

Features:
- Tags are now prominently displayed in both table and detail views
- Multiple artifacts can be grouped by SIM source ID
- Users can filter/query by sim_source_id
- Backward compatible - existing artifacts without sim_source_id still work

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-15 09:30:25 -05:00

55 lines
1.7 KiB
Python

from pydantic import BaseModel, Field
from typing import Optional, Dict, Any, List
from datetime import datetime
class ArtifactCreate(BaseModel):
test_name: Optional[str] = None
test_suite: Optional[str] = None
test_config: Optional[Dict[str, Any]] = None
test_result: Optional[str] = None
sim_source_id: Optional[str] = None # Groups artifacts from same SIM source
custom_metadata: Optional[Dict[str, Any]] = None
description: Optional[str] = None
tags: Optional[List[str]] = None
version: Optional[str] = None
parent_id: Optional[int] = None
class ArtifactResponse(BaseModel):
id: int
filename: str
file_type: str
file_size: int
storage_path: str
content_type: Optional[str] = None
test_name: Optional[str] = None
test_suite: Optional[str] = None
test_config: Optional[Dict[str, Any]] = None
test_result: Optional[str] = None
sim_source_id: Optional[str] = None
custom_metadata: Optional[Dict[str, Any]] = None
description: Optional[str] = None
tags: Optional[List[str]] = None
created_at: datetime
updated_at: datetime
version: Optional[str] = None
parent_id: Optional[int] = None
class Config:
from_attributes = True
class ArtifactQuery(BaseModel):
filename: Optional[str] = None
file_type: Optional[str] = None
test_name: Optional[str] = None
test_suite: Optional[str] = None
test_result: Optional[str] = None
sim_source_id: Optional[str] = None
tags: Optional[List[str]] = None
start_date: Optional[datetime] = None
end_date: Optional[datetime] = None
limit: int = Field(default=100, le=1000)
offset: int = Field(default=0, ge=0)