修改model以后 create bulk creaate消失了
wanghaisheng opened this issue · comments
HeisenBerg? commented
from datetime import datetime
from typing import Optional, List
import sqlmodel
from fastapi_amis_admin.amis.components import InputRichText, InputImage, ColumnImage
from fastapi_amis_admin.models.enums import IntegerChoices
from fastapi_amis_admin.models.fields import Field
from fastapi_user_auth.auth.models import User
from sqlalchemy import Column, String
class VideoStatus(IntegerChoices):
unpublished = 0, '未发布'
published = 1, '已发布'
inspection = 2, '审核中'
disabled = 3, '已禁用'
# Create your models here.
class BaseSQLModel(sqlmodel.SQLModel):
id: int = Field(default=None, primary_key=True, nullable=False)
class Config:
use_enum_values = True
class Platform(BaseSQLModel, table=True):
__tablename__ = 'publish_platform'
name: str = Field(title='PlatformName', sa_column=Column(String(100), unique=True, index=True, nullable=False))
description: str = Field(default='', title='Description', amis_form_item='textarea')
status: bool = Field(None, title='status')
videos: List["Video"] = sqlmodel.Relationship(back_populates="platform")
class VideoTagLink(sqlmodel.SQLModel, table=True):
__tablename__ = 'publish_video_tags'
tag_id: Optional[int] = Field(
default=None, foreign_key="publish_tag.id", primary_key=True
)
video_id: Optional[int] = Field(
default=None, foreign_key="publish_video.id", primary_key=True
)
class Tag(BaseSQLModel, table=True):
__tablename__ = 'publish_tag'
name: str = Field(..., title='TagName', sa_column=Column(String(255), unique=True, index=True, nullable=False))
videos: List["Video"] = sqlmodel.Relationship(back_populates="tags", link_model=VideoTagLink)
class Video(BaseSQLModel, table=True):
__tablename__ = 'publish_video'
filename: str = Field(title='VideoFilename', max_length=200)
title: str = Field(title='VideoTitle', max_length=200)
img: str = Field(None, title='VideoThumbnail', max_length=300,
amis_form_item=InputImage(maxLength=1, maxSize=2 * 1024 * 1024,
receiver='post:/admin/file/upload'),
amis_table_column=ColumnImage(width=100, height=60, enlargeAble=True))
description: str = Field(default='', title='VideoDescription', amis_form_item='textarea')
des_prefix: str = Field(default='', title='VideoDescriptionPrefix', amis_form_item='textarea')
des_body: str = Field(default='', title='VideoDescriptionBody', amis_form_item='textarea')
des_suffix: str = Field(default='', title='VideoDescriptionSuffix', amis_form_item='textarea')
status: VideoStatus = Field(VideoStatus.unpublished, title='status')
content: str = Field(..., title='VideoContent', amis_form_item=InputRichText())
create_time: Optional[datetime] = Field(default_factory=datetime.utcnow, title='CreateTime')
upload_time: Optional[datetime] = Field(default_factory=datetime.utcnow, title='UploadTime')
schedule_time: Optional[datetime] = Field(default_factory=datetime.utcnow, title='ScheduleTime')
source: str = Field(default='', title='VideoSource', max_length=200)
platform_id: Optional[int] = Field(default=None, foreign_key="publish_platform.id", title='PlatformId')
platform: Optional[Platform] = sqlmodel.Relationship(back_populates="videos")
tags: List[Tag] = sqlmodel.Relationship(back_populates="videos", link_model=VideoTagLink)
user_id: int = Field(default=None, foreign_key="auth_user.id", title='UserId')
user: User = sqlmodel.Relationship()
admin里面我没有修改额外内容
class ExcelAdmin(admin.ModelAdmin):
group_schema = None
page_schema = PageSchema(label='from excel', icon='fa fa-file')
model = Video
# 配置列表展示字段
list_display = [Video.id, Video.title, Video.img, Video.status,
Platform.name, User.username,
TableColumn(type='tpl', label='自定义模板列',
tpl='<a href="${source}" target="_blank">ID:${id},Title:${title}</a>'),
Video.create_time, Video.description,
]
# 配置模糊搜索字段
search_fields = [Video.title, Platform.name, User.username]
# 配置关联模型
link_model_fields = [Video.tags]
# 自定义查询选择器
async def get_select(self, request: Request) -> Select:
sel = await super().get_select(request)
return sel.join(Platform, isouter=True).join(User, isouter=True)
# 权限验证
async def has_page_permission(self, request: Request) -> bool:
return True
async def has_list_permission(
self, request: Request, paginator: Paginator,
filter: BaseModel = None, **kwargs
) -> bool:
# 用户未登录,不可按标题过滤文章,并且最多每页最多只能查看10条数据.
return bool(
await self.site.auth.requires(response=False)(request)
or (paginator.perPage <= 10 and filter.title == '')
)
async def has_create_permission(
self, request: Request, data: BaseModel, **kwargs
) -> bool:
# 用户已登录,并且注册时间大于3天,才可以发布文章
return bool(
await self.site.auth.requires(response=False)(request)
and request.user.create_time < datetime.now() - timedelta(days=3)
)
async def has_delete_permission(
self, request: Request, item_id: List[str], **kwargs
) -> bool:
# 必须管理员才可以删除文章.
return await self.site.auth.requires(roles='admin', response=False)(request)
async def has_update_permission(
self, request: Request, item_id: List[str],
data: BaseModel, **kwargs
) -> bool:
if await self.site.auth.requires(response=False)(request):
if item_id is None:
return True
async with self.site.db.session_maker() as session:
# 管理员可以修改全部文章, 并且可以批量修改.
if await request.user.has_role(['admin'], session):
return True
# 非管理员,只能修改自己的文章,并且不可批量修改.
result = await session.execute(
select(Video.id).where(
Video.id == item_id[0], Video.user_id == request.user.id
).limit(1)
)
if result.first():
return True
return False
async def on_create_pre(
self, request: Request, obj: BaseModel, **kwargs
) -> Dict[str, Any]:
data = await super().on_create_pre(request, obj, **kwargs)
# 创建新文章时,设置当前用户为发布者
data['user_id'] = request.user.id
return data
AmisAdmin commented
- 新增admin角色创建数据权限
async def has_create_permission(
self, request: Request, data: BaseModel, **kwargs
) -> bool:
# 用户已登录,并且注册时间大于3天,才可以发布文章; 或admin角色
return bool(
await self.site.auth.requires(response=False)(request)
and request.user.create_time < datetime.now() - timedelta(days=3)
) or await self.site.auth.requires(roles='admin', response=False)(request)
HeisenBerg? commented
@amisadmin 我自己解决了
3改成0