amisadmin / fastapi-amis-admin-demo

An example fastapi-amis-admin application

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

修改model以后 create bulk creaate消失了

wanghaisheng opened this issue · comments

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

  • 新增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)

@amisadmin 我自己解决了
3改成0