export.py 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. """
  2. Pydantic schemas for Export API.
  3. Defines request and response models for data export operations.
  4. """
  5. from datetime import datetime
  6. from typing import Optional, List, Any
  7. from pydantic import BaseModel, Field
  8. from enum import Enum
  9. class ExportFormat(str, Enum):
  10. """Supported export formats."""
  11. JSON = "json"
  12. CSV = "csv"
  13. COCO = "coco"
  14. YOLO = "yolo"
  15. PASCAL_VOC = "pascal_voc"
  16. SHAREGPT = "sharegpt"
  17. ALPACA = "alpaca"
  18. class ExportStatus(str, Enum):
  19. """Export job status."""
  20. PENDING = "pending"
  21. PROCESSING = "processing"
  22. COMPLETED = "completed"
  23. FAILED = "failed"
  24. class StatusFilter(str, Enum):
  25. """Task status filter for export."""
  26. ALL = "all"
  27. COMPLETED = "completed"
  28. PENDING = "pending"
  29. IN_PROGRESS = "in_progress"
  30. class ExportRequest(BaseModel):
  31. """Schema for export request."""
  32. format: ExportFormat = Field(..., description="Export format: json, csv, coco, yolo")
  33. status_filter: StatusFilter = Field(
  34. default=StatusFilter.ALL,
  35. description="Filter tasks by status: all, completed, pending, in_progress"
  36. )
  37. include_metadata: bool = Field(
  38. default=True,
  39. description="Whether to include task metadata in export"
  40. )
  41. class Config:
  42. json_schema_extra = {
  43. "example": {
  44. "format": "json",
  45. "status_filter": "completed",
  46. "include_metadata": True
  47. }
  48. }
  49. class ExportJobResponse(BaseModel):
  50. """Schema for export job response."""
  51. id: str = Field(..., description="Export job unique identifier")
  52. project_id: str = Field(..., description="Project ID being exported")
  53. format: str = Field(..., description="Export format")
  54. status: str = Field(..., description="Export job status")
  55. status_filter: str = Field(..., description="Task status filter used")
  56. include_metadata: bool = Field(..., description="Whether metadata is included")
  57. file_path: Optional[str] = Field(None, description="Path to exported file")
  58. download_url: Optional[str] = Field(None, description="URL to download the file")
  59. error_message: Optional[str] = Field(None, description="Error message if failed")
  60. created_at: datetime = Field(..., description="Job creation timestamp")
  61. completed_at: Optional[datetime] = Field(None, description="Job completion timestamp")
  62. total_tasks: int = Field(default=0, description="Total number of tasks to export")
  63. exported_tasks: int = Field(default=0, description="Number of tasks exported")
  64. class Config:
  65. json_schema_extra = {
  66. "example": {
  67. "id": "export_abc123",
  68. "project_id": "proj_123abc",
  69. "format": "json",
  70. "status": "completed",
  71. "status_filter": "completed",
  72. "include_metadata": True,
  73. "file_path": "exports/export_abc123.json",
  74. "download_url": "/api/exports/export_abc123/download",
  75. "error_message": None,
  76. "created_at": "2024-01-12T12:00:00",
  77. "completed_at": "2024-01-12T12:01:00",
  78. "total_tasks": 100,
  79. "exported_tasks": 100
  80. }
  81. }
  82. class ExportProgressResponse(BaseModel):
  83. """Schema for export progress response."""
  84. id: str = Field(..., description="Export job unique identifier")
  85. status: str = Field(..., description="Export job status")
  86. progress: float = Field(..., description="Export progress (0.0 to 1.0)")
  87. total_tasks: int = Field(..., description="Total number of tasks")
  88. exported_tasks: int = Field(..., description="Number of tasks exported")
  89. error_message: Optional[str] = Field(None, description="Error message if failed")
  90. class AnnotationExportItem(BaseModel):
  91. """Schema for a single annotation in export."""
  92. id: str = Field(..., description="Annotation ID")
  93. task_id: str = Field(..., description="Task ID")
  94. user_id: str = Field(..., description="User ID who created the annotation")
  95. result: Any = Field(..., description="Annotation result data")
  96. created_at: str = Field(..., description="Creation timestamp")
  97. updated_at: str = Field(..., description="Last update timestamp")
  98. class TaskExportItem(BaseModel):
  99. """Schema for a single task in export."""
  100. id: str = Field(..., description="Task ID")
  101. name: str = Field(..., description="Task name")
  102. data: Any = Field(..., description="Task data")
  103. status: str = Field(..., description="Task status")
  104. assigned_to: Optional[str] = Field(None, description="Assigned user ID")
  105. created_at: str = Field(..., description="Creation timestamp")
  106. annotations: List[AnnotationExportItem] = Field(
  107. default_factory=list,
  108. description="List of annotations for this task"
  109. )
  110. class ProjectExportData(BaseModel):
  111. """Schema for complete project export data."""
  112. project_id: str = Field(..., description="Project ID")
  113. project_name: str = Field(..., description="Project name")
  114. project_description: Optional[str] = Field(None, description="Project description")
  115. config: str = Field(..., description="Project label config")
  116. export_format: str = Field(..., description="Export format used")
  117. export_time: str = Field(..., description="Export timestamp")
  118. total_tasks: int = Field(..., description="Total number of tasks exported")
  119. total_annotations: int = Field(..., description="Total number of annotations")
  120. tasks: List[TaskExportItem] = Field(..., description="List of exported tasks")
  121. # COCO format schemas
  122. class COCOImage(BaseModel):
  123. """COCO format image entry."""
  124. id: int
  125. file_name: str
  126. width: int = 0
  127. height: int = 0
  128. class COCOCategory(BaseModel):
  129. """COCO format category entry."""
  130. id: int
  131. name: str
  132. supercategory: str = ""
  133. class COCOAnnotation(BaseModel):
  134. """COCO format annotation entry."""
  135. id: int
  136. image_id: int
  137. category_id: int
  138. bbox: List[float] = Field(default_factory=list)
  139. area: float = 0.0
  140. segmentation: List[Any] = Field(default_factory=list)
  141. iscrowd: int = 0
  142. class COCOExportData(BaseModel):
  143. """COCO format export data."""
  144. info: dict = Field(default_factory=dict)
  145. licenses: List[dict] = Field(default_factory=list)
  146. images: List[COCOImage] = Field(default_factory=list)
  147. annotations: List[COCOAnnotation] = Field(default_factory=list)
  148. categories: List[COCOCategory] = Field(default_factory=list)