This commit is contained in:
Eden Kirin
2023-08-27 13:35:29 +02:00
parent 03c8aaa312
commit 7b16c2f606
6 changed files with 156 additions and 56 deletions

View File

@ -1,15 +1,12 @@
from typing import Annotated
from litestar.contrib.repository import FilterTypes
from litestar.contrib.sqlalchemy.base import BigIntBase
from litestar.contrib.sqlalchemy.dto import SQLAlchemyDTO
from litestar.contrib.sqlalchemy.repository import SQLAlchemyAsyncRepository
from litestar.contrib.sqlalchemy.repository.types import SelectT
from litestar.dto import DTOConfig
from sqlalchemy import true
from sqlalchemy.orm import Mapped
from app.lib import service
from app.lib.filter_repository import FilterRepository
class Company(BigIntBase):
@ -25,23 +22,15 @@ class Company(BigIntBase):
alive: Mapped[bool]
class Repository(SQLAlchemyAsyncRepository[Company]):
class Repository(FilterRepository[Company]):
model_type = Company
def _apply_filters(
self, *filters: FilterTypes, apply_pagination: bool = True, statement: SelectT
) -> SelectT:
statement = super()._apply_filters(
*filters, apply_pagination=apply_pagination, statement=statement
)
statement = statement.where(self.model_type.alive == true())
return statement
alive_flag = "alive"
class Service(service.Service[Company]):
repository_type = Repository
write_config = DTOConfig()
write_config = DTOConfig(exclude={"id"})
CompanyWriteDTO = SQLAlchemyDTO[Annotated[Company, write_config]]
CompanyReadDTO = SQLAlchemyDTO[Company]

View File

@ -2,17 +2,13 @@ from enum import Enum
from typing import Annotated, Optional
import sqlalchemy
from litestar.contrib.repository import FilterTypes
from litestar.contrib.sqlalchemy.base import BigIntBase
from litestar.contrib.sqlalchemy.dto import SQLAlchemyDTO
from litestar.contrib.sqlalchemy.repository import SQLAlchemyAsyncRepository
from litestar.contrib.sqlalchemy.repository.types import SelectT
from litestar.dto import DTOConfig
from sqlalchemy import ColumnElement
from sqlalchemy.orm import Mapped, mapped_column
from app.lib import service
from app.lib.filters import ExactFilter
from app.lib.filter_repository import FilterRepository
class FiscalModuleEnum(str, Enum):
@ -52,24 +48,9 @@ class FiscalPaymentMapping(BigIntBase):
payment_device_code: Mapped[Optional[int]]
class Repository(SQLAlchemyAsyncRepository[FiscalPaymentMapping]):
class Repository(FilterRepository[FiscalPaymentMapping]):
model_type = FiscalPaymentMapping
def _apply_filters(
self, *filters: FilterTypes, apply_pagination: bool = True, statement: SelectT
) -> SelectT:
standard_filters = []
for filter_ in filters:
if isinstance(filter_, ExactFilter):
field: ColumnElement = getattr(self.model_type, filter_.field_name)
statement = statement.where(field == filter_.value)
else:
standard_filters.append(filter_)
return super()._apply_filters(
*standard_filters, apply_pagination=apply_pagination, statement=statement
)
class Service(service.Service[FiscalPaymentMapping]):
repository_type = Repository

View File

@ -1,15 +1,12 @@
from typing import Annotated
from litestar.contrib.repository import FilterTypes
from litestar.contrib.sqlalchemy.base import BigIntBase
from litestar.contrib.sqlalchemy.dto import SQLAlchemyDTO
from litestar.contrib.sqlalchemy.repository import SQLAlchemyAsyncRepository
from litestar.contrib.sqlalchemy.repository.types import SelectT
from litestar.dto import DTOConfig
from sqlalchemy import true
from sqlalchemy.orm import Mapped
from app.lib import service
from app.lib.company_owned_repository import CompanyOwnedRepository
class Machine(BigIntBase):
@ -20,26 +17,19 @@ class Machine(BigIntBase):
alive: Mapped[bool]
deleted: Mapped[bool]
external_id: Mapped[str]
owner_id: Mapped[int]
class Repository(SQLAlchemyAsyncRepository[Machine]):
class Repository(CompanyOwnedRepository[Machine]):
model_type = Machine
def _apply_filters(
self, *filters: FilterTypes, apply_pagination: bool = True, statement: SelectT
) -> SelectT:
statement = super()._apply_filters(
*filters, apply_pagination=apply_pagination, statement=statement
)
statement = statement.where(self.model_type.alive == true())
return statement
alive_flag = "alive"
company_id_field = "owner_id"
class Service(service.Service[Machine]):
repository_type = Repository
# write_config = DTOConfig(exclude={"created_at", "updated_at", "nationality"})
write_config = DTOConfig()
write_config = DTOConfig(exclude={"id"})
MachineWriteDTO = SQLAlchemyDTO[Annotated[Machine, write_config]]
MachineReadDTO = SQLAlchemyDTO[Machine]