Skip to content

Commit

Permalink
Merge branch 'release/0.27.0'
Browse files Browse the repository at this point in the history
  • Loading branch information
ri-gilfanov committed Jul 18, 2021
2 parents bcce1a2 + 3851634 commit ae4e0c1
Show file tree
Hide file tree
Showing 8 changed files with 254 additions and 172 deletions.
50 changes: 34 additions & 16 deletions aiohttp_sqlalchemy/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,17 +16,16 @@
DuplicateAppKeyError,
DuplicateRequestKeyError,
)
from aiohttp_sqlalchemy.middlewares import sa_middleware
from aiohttp_sqlalchemy.typedefs import TBind, TBinds, TSessionFactory, TTarget
from aiohttp_sqlalchemy.utils import (
get_session,
get_session_factory,
init_db,
sa_init_db,
sa_session,
sa_session_factory,
)
from aiohttp_sqlalchemy.views import (
from aiohttp_sqlalchemy.handlers import (
ItemAddMixin,
ItemDeleteMixin,
ItemEditMixin,
ItemViewMixin,
ListAddMixin,
ListDeleteMixin,
ListEditMixin,
ListViewMixin,
PrimaryKeyMixin,
SABaseView,
SAItemAddMixin,
SAItemDeleteMixin,
Expand All @@ -43,16 +42,37 @@
SAModelView,
SAModelViewMixin,
SAPrimaryKeyMixin,
SAView,
)
from aiohttp_sqlalchemy.middlewares import sa_middleware
from aiohttp_sqlalchemy.typedefs import TBind, TBinds, TSessionFactory, TTarget
from aiohttp_sqlalchemy.utils import (
get_session,
get_session_factory,
init_db,
sa_init_db,
sa_session,
sa_session_factory,
)

__version__ = '0.26.0'
__version__ = '0.27.0'

__all__ = [
'DEFAULT_KEY',
'DuplicateAppKeyError',
'DuplicateRequestKeyError',
'SAAbstractView',

'ItemAddMixin',
'ItemDeleteMixin',
'ItemEditMixin',
'ItemViewMixin',

'ListAddMixin',
'ListDeleteMixin',
'ListEditMixin',
'ListViewMixin',

'PrimaryKeyMixin',

'SABaseView',
'SA_DEFAULT_KEY',

Expand All @@ -74,7 +94,6 @@
'SAMixin',
'SAModelView',
'SAPrimaryKeyMixin',
'SAView',
'bind',
'get_session',
'get_session_factory',
Expand All @@ -84,7 +103,6 @@
'setup',
# Synonyms
'DEFAULT_KEY',
'SAView',
'sa_bind',
'sa_init_db',
'sa_session',
Expand Down
124 changes: 124 additions & 0 deletions aiohttp_sqlalchemy/handlers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,124 @@
from abc import ABCMeta
from typing import Any, List, Optional

import aiohttp_things as ahth
from aiohttp.web import View
from sqlalchemy import delete, select, update
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.sql import Delete, Select, Update

from aiohttp_sqlalchemy.constants import SA_DEFAULT_KEY
from aiohttp_sqlalchemy.utils import get_session


class SAMixin(ahth.ContextMixin, metaclass=ABCMeta):
sa_session_key: str = SA_DEFAULT_KEY

def sa_session(self, key: Optional[str] = None) -> AsyncSession:
return get_session(self.request, key or self.sa_session_key)


class SAModelMixin(SAMixin, metaclass=ABCMeta):
sa_model: Any = None # Not all developers use declarative mapping


class SAModelDeleteMixin(SAModelMixin):
def get_sa_delete_stmt(self, model: Any = None) -> Delete:
return delete(model or self.sa_model)


class SAModelEditMixin(SAModelMixin):
def get_sa_update_stmt(self, model: Any = None) -> Update:
return update(model or self.sa_model)


class SAModelViewMixin(SAModelMixin):
def get_sa_select_stmt(self, model: Any = None) -> Select:
return select(model or self.sa_model)


class PrimaryKeyMixin(ahth.PrimaryKeyMixin, SAModelMixin, metaclass=ABCMeta):
sa_pk_attr: Any = getattr(SAModelMixin.sa_model, 'pk', None)


class ItemAddMixin(SAModelMixin, ahth.ItemMixin, metaclass=ABCMeta):
def sa_add(self, *, key: Optional[str] = None) -> None:
self.sa_session(key).add(self.item)


class ItemDeleteMixin(
SAModelDeleteMixin,
PrimaryKeyMixin,
metaclass=ABCMeta,
):
def get_sa_delete_stmt(self, model: Any = None) -> Delete:
return super(). \
get_sa_delete_stmt(model). \
where(self.sa_pk_attr == self.pk)


class ItemEditMixin(
ahth.ItemMixin,
SAModelEditMixin,
PrimaryKeyMixin,
metaclass=ABCMeta,
):
def get_sa_edit_stmt(self, model: Any = None) -> Update:
return super(). \
get_sa_update_stmt(model). \
where(self.sa_pk_attr == self.pk)


class ItemViewMixin(
ahth.ItemMixin,
SAModelViewMixin,
PrimaryKeyMixin,
metaclass=ABCMeta,
):
def get_sa_view_stmt(self, model: Any = None) -> Select:
return super(). \
get_sa_select_stmt(model). \
where(self.sa_pk_attr == self.pk)


class ListAddMixin(ahth.ListMixin, SAModelMixin, metaclass=ABCMeta):
items: List[Any]

def sa_add_all(self, *, key: Optional[str] = None) -> None:
self.sa_session(key).add_all(self.items)


class ListDeleteMixin(ahth.ListMixin, SAModelDeleteMixin, metaclass=ABCMeta):
pass


class ListEditMixin(ahth.ListMixin, SAModelEditMixin, metaclass=ABCMeta):
pass


class ListViewMixin(
ahth.ListMixin,
ahth.PaginationMixin,
SAModelViewMixin,
metaclass=ABCMeta,
):
pass


class SABaseView(View, SAMixin):
pass


class SAModelView(View, SAModelMixin):
pass


SAItemAddMixin = ItemAddMixin
SAItemDeleteMixin = ItemDeleteMixin
SAItemEditMixin = ItemEditMixin
SAItemViewMixin = ItemViewMixin
SAListAddMixin = ListAddMixin
SAListDeleteMixin = ListDeleteMixin
SAListEditMixin = ListEditMixin
SAListViewMixin = ListViewMixin
SAPrimaryKeyMixin = PrimaryKeyMixin
159 changes: 33 additions & 126 deletions aiohttp_sqlalchemy/views.py
Original file line number Diff line number Diff line change
@@ -1,130 +1,37 @@
from abc import ABCMeta
from typing import Any, List, Optional

import aiohttp_things as ahth
from aiohttp.web import View
from sqlalchemy import delete, select, update
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.sql import Delete, Select, Update

from aiohttp_sqlalchemy.constants import SA_DEFAULT_KEY
from aiohttp_sqlalchemy.utils import get_session


class SAMixin(ahth.ContextMixin, metaclass=ABCMeta):
"""SQLAlchemy class based view mixin."""

sa_session_key: str = SA_DEFAULT_KEY

def sa_session(self, key: Optional[str] = None) -> AsyncSession:
"""Return `AsyncSession` instance.
:param key: key of SQLAlchemy binding.
"""
return get_session(self.request, key or self.sa_session_key)


class SAModelMixin(SAMixin, metaclass=ABCMeta):
"""SQLAlchemy single model class based view mixin."""

sa_model: Any = None # Not all developers use declarative mapping


class SAModelDeleteMixin(SAModelMixin):
def get_sa_delete_stmt(self, model: Any = None) -> Delete:
return delete(model or self.sa_model)


class SAModelEditMixin(SAModelMixin):
def get_sa_update_stmt(self, model: Any = None) -> Update:
return update(model or self.sa_model)


class SAModelViewMixin(SAModelMixin):
def get_sa_select_stmt(self, model: Any = None) -> Select:
return select(model or self.sa_model)


class SAPrimaryKeyMixin(ahth.PrimaryKeyMixin, SAModelMixin, metaclass=ABCMeta):
"""
Primary key mixin for deleting, editing and viewing a single instance
by primary key.
:param sa_pk_attr: primary key column or hybrid attribute.
"""
sa_pk_attr: Any = getattr(SAModelMixin.sa_model, 'pk', None)


class SAItemAddMixin(SAModelMixin, ahth.ItemMixin, metaclass=ABCMeta):
def sa_add(self, *, key: Optional[str] = None) -> None:
self.sa_session(key).add(self.item)


class SAItemDeleteMixin(
from aiohttp_sqlalchemy.handlers import (
SABaseView,
SAItemAddMixin,
SAItemDeleteMixin,
SAItemEditMixin,
SAItemViewMixin,
SAListAddMixin,
SAListDeleteMixin,
SAListEditMixin,
SAListViewMixin,
SAMixin,
SAModelDeleteMixin,
SAPrimaryKeyMixin,
metaclass=ABCMeta,
):
def get_sa_delete_stmt(self, model: Any = None) -> Delete:
return super(). \
get_sa_delete_stmt(model). \
where(self.sa_pk_attr == self.pk)


class SAItemEditMixin(
ahth.ItemMixin,
SAModelEditMixin,
SAPrimaryKeyMixin,
metaclass=ABCMeta,
):
def get_sa_edit_stmt(self, model: Any = None) -> Update:
return super(). \
get_sa_update_stmt(model). \
where(self.sa_pk_attr == self.pk)


class SAItemViewMixin(
ahth.ItemMixin,
SAModelMixin,
SAModelView,
SAModelViewMixin,
SAPrimaryKeyMixin,
metaclass=ABCMeta,
):
def get_sa_view_stmt(self, model: Any = None) -> Select:
return super(). \
get_sa_select_stmt(model). \
where(self.sa_pk_attr == self.pk)


class SAListAddMixin(ahth.ListMixin, SAModelMixin, metaclass=ABCMeta):
items: List[Any]

def sa_add_all(self, *, key: Optional[str] = None) -> None:
self.sa_session(key).add_all(self.items)


class SAListDeleteMixin(ahth.ListMixin, SAModelDeleteMixin, metaclass=ABCMeta):
pass


class SAListEditMixin(ahth.ListMixin, SAModelEditMixin, metaclass=ABCMeta):
pass


class SAListViewMixin(
ahth.ListMixin,
ahth.PaginationMixin,
SAModelViewMixin,
metaclass=ABCMeta,
):
pass


class SABaseView(View, SAMixin):
"""SQLAlchemy class based view."""


class SAModelView(View, SAModelMixin):
"""SQLAlchemy single model class based view."""


SAView = SAModelView
)

__all__ = [
'SABaseView',
'SAItemAddMixin',
'SAItemDeleteMixin',
'SAItemEditMixin',
'SAItemViewMixin',
'SAListAddMixin',
'SAListDeleteMixin',
'SAListEditMixin',
'SAListViewMixin',
'SAMixin',
'SAModelDeleteMixin',
'SAModelEditMixin',
'SAModelMixin',
'SAModelView',
'SAModelViewMixin',
'SAPrimaryKeyMixin',
]

0 comments on commit ae4e0c1

Please sign in to comment.