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