
- Update FastAPI from 0.96.x to 0.100.x to support Pydantic 2.x - Update uvicorn from 0.22.x to 0.23.x for compatibility - Update Pydantic model configurations to use model_config instead of Config class - Keep Pydantic 2.x version as required by the project
133 lines
2.5 KiB
Python
133 lines
2.5 KiB
Python
from typing import List, Optional
|
|
from datetime import datetime
|
|
from pydantic import BaseModel
|
|
|
|
|
|
class NewsSourceBase(BaseModel):
|
|
name: str
|
|
source_id: str
|
|
url: Optional[str] = None
|
|
|
|
|
|
class NewsSourceCreate(NewsSourceBase):
|
|
pass
|
|
|
|
|
|
class NewsSource(NewsSourceBase):
|
|
id: int
|
|
created_at: datetime
|
|
updated_at: datetime
|
|
|
|
model_config = {
|
|
"from_attributes": True
|
|
}
|
|
|
|
|
|
class NewsCategoryBase(BaseModel):
|
|
name: str
|
|
|
|
|
|
class NewsCategoryCreate(NewsCategoryBase):
|
|
pass
|
|
|
|
|
|
class NewsCategory(NewsCategoryBase):
|
|
id: int
|
|
created_at: datetime
|
|
updated_at: datetime
|
|
|
|
model_config = {
|
|
"from_attributes": True
|
|
}
|
|
|
|
|
|
class NewsArticleBase(BaseModel):
|
|
title: str
|
|
description: Optional[str] = None
|
|
content: Optional[str] = None
|
|
url: str
|
|
image_url: Optional[str] = None
|
|
published_at: datetime
|
|
author: Optional[str] = None
|
|
language: Optional[str] = None
|
|
country: Optional[str] = None
|
|
source_id: Optional[int] = None
|
|
category_id: Optional[int] = None
|
|
|
|
|
|
class NewsArticleCreate(NewsArticleBase):
|
|
pass
|
|
|
|
|
|
class NewsArticleUpdate(BaseModel):
|
|
title: Optional[str] = None
|
|
description: Optional[str] = None
|
|
content: Optional[str] = None
|
|
image_url: Optional[str] = None
|
|
category_id: Optional[int] = None
|
|
|
|
|
|
class NewsArticle(NewsArticleBase):
|
|
id: int
|
|
created_at: datetime
|
|
updated_at: datetime
|
|
source: Optional[NewsSource] = None
|
|
category: Optional[NewsCategory] = None
|
|
|
|
model_config = {
|
|
"from_attributes": True
|
|
}
|
|
|
|
|
|
class SavedArticleBase(BaseModel):
|
|
article_id: int
|
|
notes: Optional[str] = None
|
|
|
|
|
|
class SavedArticleCreate(SavedArticleBase):
|
|
pass
|
|
|
|
|
|
class SavedArticle(SavedArticleBase):
|
|
id: int
|
|
user_id: int
|
|
created_at: datetime
|
|
updated_at: datetime
|
|
article: Optional[NewsArticle] = None
|
|
|
|
model_config = {
|
|
"from_attributes": True
|
|
}
|
|
|
|
|
|
class UserPreferenceBase(BaseModel):
|
|
keywords: Optional[str] = None
|
|
sources: Optional[str] = None
|
|
categories: Optional[str] = None
|
|
countries: Optional[str] = None
|
|
languages: Optional[str] = None
|
|
|
|
|
|
class UserPreferenceCreate(UserPreferenceBase):
|
|
pass
|
|
|
|
|
|
class UserPreferenceUpdate(UserPreferenceBase):
|
|
pass
|
|
|
|
|
|
class UserPreference(UserPreferenceBase):
|
|
id: int
|
|
user_id: int
|
|
created_at: datetime
|
|
updated_at: datetime
|
|
|
|
model_config = {
|
|
"from_attributes": True
|
|
}
|
|
|
|
|
|
# For API responses
|
|
class NewsResponse(BaseModel):
|
|
items: List[NewsArticle]
|
|
total: int |