-
Notifications
You must be signed in to change notification settings - Fork 2
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
8 changed files
with
254 additions
and
172 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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', | ||
] |
Oops, something went wrong.