refactor(B1): migrate to domain-driven project structure
Move all models/schemas/services/routers into app/domains/. Keep backward-compat shims in old locations for imports. Preserves domains/rendering/tasks.py from Phase A. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1 @@
|
||||
# Domain: imports
|
||||
@@ -0,0 +1,24 @@
|
||||
import uuid
|
||||
from datetime import datetime
|
||||
from sqlalchemy import String, Boolean, DateTime, Text
|
||||
from sqlalchemy.orm import Mapped, mapped_column, relationship
|
||||
from sqlalchemy.dialects.postgresql import UUID, JSONB
|
||||
from app.database import Base
|
||||
|
||||
|
||||
class Template(Base):
|
||||
__tablename__ = "templates"
|
||||
|
||||
id: Mapped[uuid.UUID] = mapped_column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
|
||||
name: Mapped[str] = mapped_column(String(255), nullable=False)
|
||||
category_key: Mapped[str] = mapped_column(String(100), unique=True, nullable=False, index=True)
|
||||
# JSONB config for each of the 11 standard columns: {col_index: {label, required, optional}}
|
||||
standard_fields: Mapped[dict] = mapped_column(JSONB, nullable=False, default=dict)
|
||||
# JSONB schema for expected component pairs
|
||||
component_schema: Mapped[dict] = mapped_column(JSONB, nullable=False, default=dict)
|
||||
description: Mapped[str] = mapped_column(Text, nullable=True)
|
||||
is_active: Mapped[bool] = mapped_column(Boolean, default=True, nullable=False)
|
||||
created_at: Mapped[datetime] = mapped_column(DateTime, default=datetime.utcnow, nullable=False)
|
||||
updated_at: Mapped[datetime] = mapped_column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow, nullable=False)
|
||||
|
||||
orders: Mapped[list["Order"]] = relationship("Order", back_populates="template")
|
||||
@@ -0,0 +1,5 @@
|
||||
# Re-export from original routers.
|
||||
from app.api.routers.uploads import router as uploads_router
|
||||
from app.api.routers.templates import router as templates_router
|
||||
|
||||
__all__ = ["uploads_router", "templates_router"]
|
||||
@@ -0,0 +1,43 @@
|
||||
from pydantic import BaseModel
|
||||
from typing import Any
|
||||
|
||||
|
||||
class ParsedComponent(BaseModel):
|
||||
part_name: str | None = None
|
||||
material: str | None = None
|
||||
component_type: str | None = None
|
||||
column_index: int
|
||||
|
||||
|
||||
class ParsedRow(BaseModel):
|
||||
row_index: int
|
||||
ebene1: str | None = None
|
||||
ebene2: str | None = None
|
||||
baureihe: str | None = None
|
||||
pim_id: str | None = None
|
||||
produkt_baureihe: str | None = None
|
||||
gewaehltes_produkt: str | None = None
|
||||
name_cad_modell: str | None = None
|
||||
gewuenschte_bildnummer: str | None = None
|
||||
lagertyp: str | None = None
|
||||
medias_rendering: bool | None = None
|
||||
components: list[ParsedComponent] = []
|
||||
|
||||
|
||||
class ParsedExcelResponse(BaseModel):
|
||||
filename: str
|
||||
excel_path: str | None = None # server-side path of the saved file
|
||||
category_key: str | None = None
|
||||
template_name: str | None = None
|
||||
row_count: int
|
||||
column_headers: list[str]
|
||||
rows: list[ParsedRow]
|
||||
warnings: list[str] = []
|
||||
|
||||
|
||||
class StepUploadResponse(BaseModel):
|
||||
cad_file_id: str
|
||||
original_name: str
|
||||
file_hash: str
|
||||
status: str
|
||||
matched_items: list[str] = []
|
||||
@@ -0,0 +1,12 @@
|
||||
"""Import services — Excel parsing and product import."""
|
||||
|
||||
# Re-export from original service files for backward compatibility.
|
||||
from app.services.excel_parser import parse_excel, parsed_excel_to_dict
|
||||
from app.services.excel_import import import_excel_to_products, preview_excel_rows
|
||||
|
||||
__all__ = [
|
||||
"parse_excel",
|
||||
"parsed_excel_to_dict",
|
||||
"import_excel_to_products",
|
||||
"preview_excel_rows",
|
||||
]
|
||||
Reference in New Issue
Block a user