Refactor model classes to improve structure; streamline database session handlin…

…g and enhance relationship definitions
1 parent bee0da17
......@@ -2,6 +2,7 @@ from .meta import *
from .common import *
from .base import *
from .users import *
from .users import _User, _UserGroup
from .wilayah import *
from .partner import *
from .targets import *
......
......@@ -29,6 +29,7 @@ def flush(row, db_session=DBSession):
class CommonModel(object):
db_session = DBSession
def to_dict_hybrid(self):
values = {}
for item in sa_inspect(self.__class__).all_orm_descriptors:
......@@ -95,12 +96,12 @@ class DefaultModel(CommonModel):
return row
@classmethod
def count(cls, db_session=DBSession):
return self.db_session.query(func.count('id')).scalar()
def count(cls):
return cls.db_session.query(func.count('id')).scalar()
@classmethod
def query(cls, db_session=DBSession, filters=None):
query = db_session.query(cls)
def query(cls, filters=None):
query = cls.db_session.query(cls)
if filters:
filter_expressions = []
for d in filters:
......@@ -113,24 +114,24 @@ class DefaultModel(CommonModel):
return query
@classmethod
def query_from(cls, db_session=DBSession, columns=[], filters=None):
query = db_session.query().select_from(cls)
def query_from(cls, columns=[], filters=None):
query = cls.db_session.query().select_from(cls)
for c in columns:
query = query.add_columns(c)
return query
@classmethod
def query_id(cls, row_id, db_session=DBSession):
return cls.query(db_session).filter_by(id=row_id)
def query_id(cls, row_id):
return cls.query().filter_by(id=row_id)
@classmethod
def delete(cls, row_id, db_session=DBSession):
cls.query_id(row_id, db_session).delete()
def delete(cls, row_id):
cls.query_id(row_id).delete()
@classmethod
def flush(cls, row, db_session=DBSession):
db_session.add(row)
db_session.flush()
def flush(cls, row):
cls.db_session.add(row)
cls.db_session.flush()
class StandarModel(DefaultModel):
......@@ -142,8 +143,8 @@ class StandarModel(DefaultModel):
# New Method
@classmethod
def query_status(cls, status=0, db_session=DBSession):
return cls.query(db_session).filter_by(status=status)
def query_status(cls, status=0):
return cls.query().filter_by(status=status)
@classmethod
def disabled(cls):
......@@ -174,52 +175,52 @@ class StandarModel(DefaultModel):
return cls.query_status(status=0).all()
@classmethod
def get_archived(cls, db_session=DBSession):
return cls.query_status(status=0, db_session=db_session).all()
def get_archived(cls):
return cls.query_status(status=0).all()
class KodeModel(StandarModel):
kode = Column(String(32), nullable=False)
@classmethod
def query_kode(cls, kode, db_session=DBSession):
return cls.query(db_session).filter_by(kode=kode)
def query_kode(cls, kode):
return cls.query().filter_by(kode=kode)
@classmethod
def get_by_kode(cls, kode, db_session=DBSession):
return cls.query_kode(kode, db_session).first()
def get_by_kode(cls, kode):
return cls.query_kode(kode).first()
class UraianModel(StandarModel):
nama = Column(String(128))
@classmethod
def query_nama(cls, nama, db_session=DBSession):
return cls.query(db_session).filter_by(nama=nama)
def query_nama(cls, nama):
return cls.query().filter_by(nama=nama)
@classmethod
def get_by_nama(cls, nama, db_session=DBSession):
return cls.query_nama(nama, db_session).first()
def get_by_nama(cls, nama):
return cls.query_nama(nama).first()
@classmethod
def get_list(cls):
return DBSession.query(cls.id, cls.nama).order_by(cls.nama).all()
return cls.db_session.query(cls.id, cls.nama).order_by(cls.nama).all()
class NamaModel(KodeModel):
nama = Column(String(128), nullable=False)
@classmethod
def query_nama(cls, nama, db_session=DBSession):
return cls.query(db_session).filter_by(nama=nama)
def query_nama(cls, nama):
return cls.query().filter_by(nama=nama)
@classmethod
def get_by_nama(cls, nama, db_session=DBSession):
return cls.query_nama(nama, db_session).first()
def get_by_nama(cls, nama):
return cls.query_nama(nama).first()
@classmethod
def query_list(cls, db_session=DBSession):
return db_session.query(cls.id, cls.nama).order_by(cls.nama)
def query_list(cls):
return cls.db_session.query(cls.id, cls.nama).order_by(cls.nama)
@classmethod
def get_list(cls):
......
from sqlalchemy import (Column, Integer, ForeignKey, String, SmallInteger)
from sqlalchemy.orm import (relationship, backref)
from sqlalchemy.orm import (relationship, backref, declared_attr)
from ..models import DBSession, Base
from ..models import (NamaModel, TABLE_ARGS)
class Departemen(Base, NamaModel):
class _Departemen(NamaModel):
__tablename__ = 'departemen'
__table_args__ = (TABLE_ARGS,)
id = Column(Integer, primary_key=True)
......@@ -13,8 +13,10 @@ class Departemen(Base, NamaModel):
alamat = Column(String(255))
singkat = Column(String(32))
level_id = Column(SmallInteger)
children = relationship(
"Departemen", backref=backref('parent', remote_side=[id]))
@declared_attr
def children(self):
return relationship(
"Departemen", backref=backref('parent', remote_side=[self.id]))
def get_parents(self, start=False):
allparents = []
......@@ -43,3 +45,6 @@ class Departemen(Base, NamaModel):
@classmethod
def get_list(cls):
return DBSession.query(cls.id, cls.nama).order_by(cls.nama).all()
class Departemen(_Departemen, Base):
pass
......@@ -22,23 +22,28 @@ from ziggurat_foundations.models.user_group import UserGroupMixin
from ziggurat_foundations.models.user_permission import UserPermissionMixin
from ziggurat_foundations.models.user_resource_permission import \
UserResourcePermissionMixin
from sqlalchemy.ext.declarative import declared_attr
from .base import CommonModel, DBSession, DefaultModel
from .meta import Base
from .base import TABLE_ARGS
class GroupPermission(GroupPermissionMixin, Base):
class _GroupPermission(GroupPermissionMixin):
pass
class UserGroup(UserGroupMixin, Base, CommonModel):
class GroupPermission(_GroupPermission, Base):
pass
class _UserGroup(UserGroupMixin, CommonModel):
@classmethod
def _get_by_user(cls, user):
return DBSession.query(cls).filter_by(user_id=user.id).all()
return cls.db_session.query(cls).filter_by(user_id=user.id).all()
@classmethod
def query(cls):
return DBSession.query(cls)
return cls.db_session.query(cls)
@classmethod
def get_by_user(cls, user):
......@@ -47,8 +52,10 @@ class UserGroup(UserGroupMixin, Base, CommonModel):
groups.append(g.group_id)
return groups
class UserGroup(_UserGroup, Base):
pass
class GroupResourcePermission(GroupResourcePermissionMixin, Base):
class _GroupResourcePermission(GroupResourcePermissionMixin):
__table_args__ = (
sa.PrimaryKeyConstraint(
"group_id",
......@@ -60,19 +67,32 @@ class GroupResourcePermission(GroupResourcePermissionMixin, Base):
)
class Resource(ResourceMixin, Base):
class GroupResourcePermission(_GroupResourcePermission, Base):
pass
class _Resource(ResourceMixin):
pass
class Resource(_Resource, Base):
pass
class _UserPermission(UserPermissionMixin):
pass
class UserPermission(UserPermissionMixin, Base):
class UserPermission(_UserPermission, Base):
pass
class UserResourcePermission(UserResourcePermissionMixin, Base):
class _UserResourcePermission(UserResourcePermissionMixin):
pass
class UserResourcePermission(_UserResourcePermission, Base):
pass
class User(UserMixin, BaseModel, DefaultModel, Base):
class _User(UserMixin, BaseModel):
last_login_date = Column(DateTime(timezone=True), nullable=True)
registered_date = Column(DateTime(timezone=True),
nullable=False,
......@@ -114,15 +134,15 @@ class User(UserMixin, BaseModel, DefaultModel, Base):
# @classmethod
# def query(cls):
# return DBSession.query(cls)
# return cls.db_session.query(cls)
@classmethod
def get_by_email(cls, email):
return DBSession.query(cls).filter_by(email=email).first()
return cls.db_session.query(cls).filter_by(email=email).first()
@classmethod
def get_by_name(cls, name):
return DBSession.query(cls).filter_by(user_name=name).first()
return cls.db_session.query(cls).filter_by(user_name=name).first()
@classmethod
def get_by_identity(cls, identity):
......@@ -132,7 +152,7 @@ class User(UserMixin, BaseModel, DefaultModel, Base):
@classmethod
def get_by_token(cls, token):
return DBSession.query(cls).filter_by(security_code=token)
return cls.db_session.query(cls).filter_by(security_code=token)
@classmethod
def query_register(cls):
......@@ -141,7 +161,7 @@ class User(UserMixin, BaseModel, DefaultModel, Base):
@classmethod
def query_list(cls):
return DBSession.query(cls.id, cls.user_name).order_by(cls.user_name)
return cls.db_session.query(cls.id, cls.user_name).order_by(cls.user_name)
@classmethod
def get_list(cls):
......@@ -152,7 +172,7 @@ class User(UserMixin, BaseModel, DefaultModel, Base):
groups = UserGroup.get_by_user(self)
perm_names=[]
for g in groups:
group_permissions = DBSession.query(GroupPermission).filter_by(group_id=g).all()
group_permissions = cls.db_session.query(GroupPermission).filter_by(group_id=g).all()
for gp in group_permissions:
if gp.perm_name not in perm_names:
perm_names.append(gp.perm_name)
......@@ -180,7 +200,7 @@ class User(UserMixin, BaseModel, DefaultModel, Base):
# @classmethod
# def get_list_by_departemen(cls, departemen_id):
# rows = DBSession.query(User.id, Partner.nama) \
# rows = cls.db_session.query(User.id, Partner.nama) \
# .join(Partner, User.id == Partner.user_id) \
# .filter(Partner.departemen_id == departemen_id).all()
# result = list(((row[0], row[1]) for row in rows))
......@@ -188,14 +208,17 @@ class User(UserMixin, BaseModel, DefaultModel, Base):
# return result
class ExternalIdentity(ExternalIdentityMixin, CommonModel, Base):
user = relationship(User, backref=backref("external"))
class User(_User, DefaultModel, Base):
pass
class _ExternalIdentity(ExternalIdentityMixin):
# ,
# overlaps = "external_identities,owner"
@classmethod
def query(cls):
return DBSession.query(cls)
return cls.db_session.query(cls)
@classmethod
def query_user(cls, user):
......@@ -206,6 +229,9 @@ class ExternalIdentity(ExternalIdentityMixin, CommonModel, Base):
return cls.query_user(user).count() > 0
class ExternalIdentity(Base, _ExternalIdentity, CommonModel):
user = relationship(User, backref=backref("external"))
# class GroupRoutePermission(Base, CommonModel):
# __tablename__ = 'groups_routes_permissions'
# __table_args__ = {'extend_existing': True, }
......@@ -215,7 +241,7 @@ class ExternalIdentity(ExternalIdentityMixin, CommonModel, Base):
# groups = relationship("Group", backref=backref('grouppermission'))
class Permission(Base, CommonModel):
class _Permission(CommonModel):
__tablename__ = 'permissions'
__table_args__ = (TABLE_ARGS)
id = Column(Integer, primary_key=True)
......@@ -223,13 +249,18 @@ class Permission(Base, CommonModel):
description = Column(String(64), nullable=False, unique=True)
class Group(GroupMixin, Base, DefaultModel):
class Permission(Base, _Permission):
pass
class _Group(GroupMixin, CommonModel):
member_count = Column(Integer, nullable=True, default=0)
@classmethod
def query_group_name(cls, group_name):
return DBSession.query(cls).filter_by(group_name=group_name)
return cls.db_session.query(cls).filter_by(group_name=group_name)
class Group(_Group, Base, DefaultModel):
pass
# It is used when there is a web request.
class RootFactory:
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!