mapping.py 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. from typing import List, Optional
  2. from datetime import datetime
  3. from pydantic import BaseModel
  4. from enum import Enum
  5. class MappingStrategy(str, Enum):
  6. SKIP = "SKIP"
  7. OVERWRITE = "OVERWRITE"
  8. class MappingRowStatus(str, Enum):
  9. NEW = "NEW" # User exists, no mapping exists -> Ready to insert
  10. UPDATE = "UPDATE" # User exists, mapping exists -> Ready to update (if overwrite)
  11. ERROR = "ERROR" # Invalid format or other error
  12. AUTO_CREATE_USER = "AUTO_CREATE_USER" # User does not exist -> Create User + Mapping
  13. class MappingRowPreview(BaseModel):
  14. row_index: int
  15. mobile: str
  16. mapped_key: str
  17. mapped_email: Optional[str] = None
  18. status: MappingRowStatus
  19. message: Optional[str] = None
  20. user_id: Optional[int] = None
  21. class MappingPreviewResponse(BaseModel):
  22. total_rows: int
  23. valid_count: int
  24. error_count: int
  25. new_count: int
  26. update_count: int
  27. preview_rows: List[MappingRowPreview]
  28. class MappingImportSummary(BaseModel):
  29. total_processed: int
  30. inserted: int
  31. updated: int
  32. failed: int
  33. class ImportLogItem(BaseModel):
  34. import_time: datetime
  35. mobile: str
  36. mapped_key: Optional[str]
  37. status: str # "Success" or "Failed"
  38. message: Optional[str] = None # Failure reason or success detail
  39. is_unified_account_created: bool = False
  40. generated_password: Optional[str] = None
  41. mapped_email: Optional[str] = None
  42. class ImportLogResponse(BaseModel):
  43. summary: MappingImportSummary
  44. logs: List[ImportLogItem]
  45. class MappingCreate(BaseModel):
  46. mobile: str
  47. mapped_key: Optional[str] = None
  48. mapped_email: Optional[str] = None
  49. password: str # Admin password for verification
  50. class MappingUpdate(BaseModel):
  51. mapped_key: Optional[str] = None
  52. mapped_email: Optional[str] = None
  53. is_active: Optional[bool] = None
  54. password: str # Required for verification
  55. class MappingDelete(BaseModel):
  56. password: str
  57. class MappingResponse(BaseModel):
  58. id: int
  59. app_id: int
  60. user_id: int
  61. mapped_key: Optional[str] = None
  62. mapped_email: Optional[str] = None
  63. user_mobile: str # Convenient to have
  64. user_status: str # Added: Unified Account Status
  65. is_active: bool = True
  66. new_user_created: bool = False
  67. generated_password: Optional[str] = None
  68. class Config:
  69. from_attributes = True
  70. class MappingList(BaseModel):
  71. total: int
  72. items: List[MappingResponse]