feat: 开发采集、采集箱和商品编辑功能
This commit is contained in:
@@ -0,0 +1,14 @@
|
||||
"""鉴权请求/响应模型。"""
|
||||
from __future__ import annotations
|
||||
|
||||
from pydantic import BaseModel
|
||||
|
||||
|
||||
class LoginRequest(BaseModel):
|
||||
token: str
|
||||
|
||||
|
||||
class LoginResponse(BaseModel):
|
||||
access_token: str
|
||||
token_type: str = "bearer"
|
||||
expires_at: int
|
||||
@@ -0,0 +1,42 @@
|
||||
"""采集上传(插件 → 服务端)请求/响应模型,对齐 docs/extension/plan.md §14。"""
|
||||
from __future__ import annotations
|
||||
|
||||
from pydantic import BaseModel, Field
|
||||
|
||||
|
||||
class SourceInfo(BaseModel):
|
||||
platform: str = Field(..., description="ozon | 1688 | taobao")
|
||||
itemId: str | None = None
|
||||
url: str = ""
|
||||
collectedAt: int | None = None # epoch 毫秒
|
||||
|
||||
|
||||
class TextMaterial(BaseModel):
|
||||
kind: str = Field(..., description="title | params | selling_point | desc | price | brand")
|
||||
content: str = ""
|
||||
pairs: list[dict] | None = None # table 模式 kv:[{key, value}]
|
||||
|
||||
|
||||
class ImageMaterial(BaseModel):
|
||||
groupKey: str = Field(..., description="main | sku | detail | video | param")
|
||||
groupName: str = ""
|
||||
variantName: str | None = None # SKU 规格名
|
||||
url: str = Field(..., description="源站原图 URL")
|
||||
index: int = 0
|
||||
type: str = "img" # img | video
|
||||
dedupeKey: str | None = None
|
||||
|
||||
|
||||
class MaterialsRequest(BaseModel):
|
||||
product_id: str | None = Field(default=None, description="传了=追加到已有商品(跨平台补素材)")
|
||||
source: SourceInfo
|
||||
texts: list[TextMaterial] = Field(default_factory=list)
|
||||
images: list[ImageMaterial] = Field(default_factory=list)
|
||||
refererOrigin: str | None = None # 下载源图时需带的 Referer
|
||||
|
||||
|
||||
class MaterialsResponse(BaseModel):
|
||||
product_id: str
|
||||
stage: str
|
||||
assets_queued: int
|
||||
assets_skipped: int = 0 # 因 dedupeKey 重复而跳过
|
||||
@@ -0,0 +1,102 @@
|
||||
"""商品 Pydantic 模型(列表 / 详情 / 部分更新)。"""
|
||||
from __future__ import annotations
|
||||
|
||||
from datetime import datetime
|
||||
from uuid import UUID
|
||||
|
||||
from pydantic import BaseModel, ConfigDict, Field
|
||||
|
||||
|
||||
class ProductListItem(BaseModel):
|
||||
model_config = ConfigDict(from_attributes=True)
|
||||
|
||||
id: UUID
|
||||
stage: str
|
||||
name: str = ""
|
||||
offer_id: str = ""
|
||||
price: float | None = None
|
||||
currency_code: str = "RUB"
|
||||
source_platform: str | None = None
|
||||
source_url: str | None = None
|
||||
asset_counts: dict | None = None
|
||||
ozon_product_id: int | None = None
|
||||
created_at: datetime
|
||||
updated_at: datetime
|
||||
|
||||
|
||||
class ProductDetail(BaseModel):
|
||||
model_config = ConfigDict(from_attributes=True)
|
||||
|
||||
id: UUID
|
||||
shop_id: UUID | None = None
|
||||
stage: str
|
||||
source_platform: str | None = None
|
||||
source_item_id: str | None = None
|
||||
source_url: str | None = None
|
||||
|
||||
offer_id: str = ""
|
||||
ozon_product_id: int | None = None
|
||||
name: str = ""
|
||||
description: str = ""
|
||||
description_category_id: int | None = None
|
||||
type_id: int | None = None
|
||||
price: float | None = None
|
||||
old_price: float | None = None
|
||||
currency_code: str = "RUB"
|
||||
vat: str = "0"
|
||||
depth: float | None = None
|
||||
width: float | None = None
|
||||
height: float | None = None
|
||||
dimension_unit: str = "mm"
|
||||
weight: float | None = None
|
||||
weight_unit: str = "g"
|
||||
barcode: str | None = None
|
||||
|
||||
images: list | None = None
|
||||
primary_image: str | None = None
|
||||
images360: list | None = None
|
||||
color_image: str | None = None
|
||||
attributes: list | None = None
|
||||
complex_attributes: list | None = None
|
||||
|
||||
raw: dict | None = None
|
||||
pricing: dict | None = None
|
||||
copy: dict | None = None
|
||||
fx_rate: float | None = None
|
||||
asset_counts: dict | None = None
|
||||
|
||||
published_at: datetime | None = None
|
||||
created_at: datetime
|
||||
updated_at: datetime
|
||||
|
||||
|
||||
class ProductUpdate(BaseModel):
|
||||
"""编辑页 autosave 的部分更新。仅允许业务字段,id/时间由服务端维护。"""
|
||||
|
||||
shop_id: UUID | None = None
|
||||
stage: str | None = None
|
||||
offer_id: str | None = None
|
||||
name: str | None = None
|
||||
description: str | None = None
|
||||
description_category_id: int | None = None
|
||||
type_id: int | None = None
|
||||
price: float | None = None
|
||||
old_price: float | None = None
|
||||
currency_code: str | None = None
|
||||
vat: str | None = None
|
||||
depth: float | None = None
|
||||
width: float | None = None
|
||||
height: float | None = None
|
||||
dimension_unit: str | None = None
|
||||
weight: float | None = None
|
||||
weight_unit: str | None = None
|
||||
barcode: str | None = None
|
||||
images: list | None = None
|
||||
primary_image: str | None = None
|
||||
attributes: list | None = None
|
||||
complex_attributes: list | None = None
|
||||
raw: dict | None = None
|
||||
pricing: dict | None = None
|
||||
copy: dict | None = None
|
||||
fx_rate: float | None = None
|
||||
source_url: str | None = None
|
||||
@@ -0,0 +1,33 @@
|
||||
"""店铺(Ozon 凭证)请求/响应模型。"""
|
||||
from __future__ import annotations
|
||||
|
||||
from datetime import datetime
|
||||
from uuid import UUID
|
||||
|
||||
from pydantic import BaseModel, ConfigDict
|
||||
|
||||
|
||||
class ShopCreate(BaseModel):
|
||||
name: str
|
||||
client_id: str
|
||||
api_key: str
|
||||
currency_code: str = "CNY"
|
||||
|
||||
|
||||
class ShopUpdate(BaseModel):
|
||||
name: str | None = None
|
||||
client_id: str | None = None
|
||||
api_key: str | None = None
|
||||
currency_code: str | None = None
|
||||
|
||||
|
||||
class ShopListItem(BaseModel):
|
||||
model_config = ConfigDict(from_attributes=True)
|
||||
|
||||
id: UUID
|
||||
name: str
|
||||
currency_code: str
|
||||
status: str
|
||||
client_id_masked: str = "" # 打码尾号
|
||||
last_checked_at: datetime | None = None
|
||||
created_at: datetime
|
||||
Reference in New Issue
Block a user