Add Departemen model and refactor ApiViews for improved query handling

1 parent 97e10a94
...@@ -6,3 +6,4 @@ from .wilayah import * ...@@ -6,3 +6,4 @@ from .wilayah import *
from .partner import * from .partner import *
from .targets import * from .targets import *
from .user_area import * from .user_area import *
from .departmen import *
from sqlalchemy import (Column, Integer, ForeignKey, String, SmallInteger)
from sqlalchemy.orm import (relationship, backref)
from ..models import DBSession, Base
from ..models import (NamaModel, TABLE_ARGS)
class Departemen(Base, NamaModel):
__tablename__ = 'departemen'
__table_args__ = (TABLE_ARGS,)
id = Column(Integer, primary_key=True)
parent_id = Column(Integer, ForeignKey('public.departemen.id'))
kategori = Column(String(32))
alamat = Column(String(255))
singkat = Column(String(32))
level_id = Column(SmallInteger)
children = relationship(
"Departemen", backref=backref('parent', remote_side=[id]))
def get_parents(self, start=False):
allparents = []
if start:
allparents.append(self.nama)
p = self.parent
while p:
allparents.append(p.nama)
p = p.parent
return allparents
@property
def parents(self, start=False):
return self.get_parents()
@property
def name_get(self):
allparents = self.get_parents(True)
return '/'.join(reversed(allparents))
@property
def uraian_all(self):
allparents = self.get_parents(True)
return '/'.join(reversed(allparents))
@classmethod
def get_list(cls):
return DBSession.query(cls.id, cls.nama).order_by(cls.nama).all()
...@@ -4,7 +4,6 @@ from deform import Form ...@@ -4,7 +4,6 @@ from deform import Form
from pyramid.response import Response from pyramid.response import Response
from pyramid.exceptions import HTTPNotFound from pyramid.exceptions import HTTPNotFound
from opensipkd.base.models import DBSession from opensipkd.base.models import DBSession
from opensipkd.tools.pbb import FixSppt
from opensipkd.tools.buttons import btn_save, btn_cancel from opensipkd.tools.buttons import btn_save, btn_cancel
from . import api_messages from . import api_messages
from ..tools import obj2json from ..tools import obj2json
...@@ -66,11 +65,8 @@ class ApiViews: ...@@ -66,11 +65,8 @@ class ApiViews:
return Form(schema, buttons=buttons, autocomplete=self.autocomplete) return Form(schema, buttons=buttons, autocomplete=self.autocomplete)
def filter_ids(self, query, **kw): def get_filters(self, query, **kw):
# table = kw.get("table", self.table) return query
ids = FixSppt(self.id).row_dotted.split(".")
filters = dict(zip(self.pkey, ids))
return query.filter_by(**filters)
def get_orders(self, query, **kw): def get_orders(self, query, **kw):
table = kw.get("table", self.table) table = kw.get("table", self.table)
...@@ -80,26 +76,39 @@ class ApiViews: ...@@ -80,26 +76,39 @@ class ApiViews:
query = query.order_by(*(getattr(table, k) for k in self.orders)) query = query.order_by(*(getattr(table, k) for k in self.orders))
return query return query
def get_joins(self, query, **kw):
return query
def get_groups(self, query, **kw):
return query
def query(self, **kw): def query(self, **kw):
table = kw.get("table", self.table) table = kw.get("table", self.table)
filter_ids = kw.get("filters", self.filter_ids) get_filters = kw.get("filters", self.get_filters)
orders = kw.get("orders", self.get_orders) get_joins = kw.get("joins", self.get_joins)
get_groups = kw.get("groups", self.get_groups)
get_orders = kw.get("orders", self.get_orders)
query = self.db_session.query(table) query = self.db_session.query(table)
if self.id: query = get_joins(query, table=table)
query = filter_ids(query, table=table) query = get_groups(query, table=table)
else: query = get_filters(query, table=table)
query = orders(query, table=table) query = get_orders(query, table=table)
query = query.limit(self.psize).offset( query = query.limit(self.psize).offset((self.page - 1) * self.psize)
(self.page - 1) * self.psize)
return query return query
def query_id(self, **kw): def query_id(self, **kw):
table = kw.get("table", self.table) table = kw.get("table", self.table)
orders = kw.get("orders", self.get_orders) get_joins = kw.get("joins", self.get_joins)
get_groups = kw.get("groups", self.get_groups)
get_filters = kw.get("filters", self.get_filters)
get_orders = kw.get("orders", self.get_orders)
if hasattr(table, "query_id") and self.id: if hasattr(table, "query_id") and self.id:
query = table.query_id(self.id) query = table.query_id(self.id)
query = orders(query, table=table) query = get_joins(query, table=table)
query = get_groups(query, table=table)
query = get_filters(query, table=table)
query = get_orders(query, table=table)
query = query.limit(self.psize).offset( query = query.limit(self.psize).offset(
(self.page - 1) * self.psize) (self.page - 1) * self.psize)
return query return query
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!