Skip to content

Instantly share code, notes, and snippets.

@jdu
Created March 12, 2013 11:39
Show Gist options
  • Save jdu/5142242 to your computer and use it in GitHub Desktop.
Save jdu/5142242 to your computer and use it in GitHub Desktop.
This class is used to layer over top of SQLAlchemy models to provide access to a Grid-like API
from sqlalchemy import desc, func
from libs.database import Session
def importer(name):
mod = __import__(name)
components = name.split('.')
for comp in components[1:]:
mod = getattr(mod, comp)
return mod
class Grid():
def __init__(self, model):
# Set the page
self.page = 0
# Set the ordering column
self.sort_param = "id"
# Set the ordering direction
self.sort_dir = "DESC"
# Set the number of items per page
self.items_per_page = 10
# Set what model we're using
self.model = model
def get(self, cfg):
pkg = "libs.models.%s" % (self.model)
module = __import__(pkg, fromlist=[self.model])
model = getattr(module, self.model)
page = cfg['page'] - 1
sess = Session()
# Calculate offset
offset = page*cfg['items_per_page']
q = sess.query(model)
order = "%s.%s" % (model.__dict__['__tablename__'], sort_param)
if filters is not None:
for key in filters.keys():
param = "%s.%s = %s" % (model.__dict__['__tablename__'], key, filters[key])
order = order.where(param)
if sort_dir == "DESC":
order = "%s DESC" % (order)
q = q.order_by(order)
else:
order = "%s ASC" % (order)
q = q.order_by(order)
q = q.limit(items_per_page)
q = q.offset(offset)
total_items = sess.query(func.count(model.id)).scalar()
total_pages = 1
if items_per_page < total_items:
total_pages = int(round(float(total_items)/float(items_per_page), 0))
total_pages = total_page + 1
data = {
"items": [i.serialize for i in q.all()],
"success": True,
"page": page,
"sort_param": sort_param,
"sort_dir": sort_dir,
"items_per_page": items_per_page,
"total_pages": total_pages,
"total_items": total_items
}
sess.close()
return data
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment