python - jquery datatables with mongodb(mongoengine)
renier de bruyn
techno206 at gmail.com
Thu Dec 19 02:50:54 EST 2013
UPDATE:
So now I got this code:
import pymongo
from pyramid_mongo import get_db
# translation for sorting between datatables api and mongodb
order_dict = {'asc': 1, 'desc': -1}
class DataTables_Handler(object):
def __init__(self, request, columns, index, collection):
self.columns = columns
self.index = index
self.db = get_db(request)
self.collection = collection
# values specified by the datatable for filtering, sorting, paging
self.request_values = request.params
# results from the db
self.result_data = None
# total in the table after filtering
self.cardinality_filtered = 0
# total in the table unfiltered
self.cadinality = 0
self.run_queries()
def output_result(self):
output = {}
output['sEcho'] = str(int(self.request_values['sEcho']))
output['iTotalRecords'] = str(self.cardinality)
output['iTotalDisplayRecords'] = str(self.cardinality_filtered)
aaData_rows = []
for row in self.result_data:
aaData_row = []
for i in range(len(self.columns)):
aaData_row.append(row[self.columns[i]].replace('"', '\\"'))
# add additional rows here that are not represented in the database
# aaData_row.append(('''<input id='%s' type='checkbox'></input>''' % (str(row[ self.index ]))).replace('\\', ''))
aaData_rows.append(aaData_row)
output['aaData'] = aaData_rows
return output
def run_queries(self):
# pages has 'start' and 'length' attributes
pages = self.paging()
# the term you entered into the datatable search
filters = self.filtering()
# the document field you chose to sort
sorting = self.sorting()
# get result from db
self.result_data = self.db.self.collection.find(spec=filters,
skip=pages.start,
limit=pages.length,
sort=sorting)
total_count = len(list(self.db.self.collection.find(spec=filters)))
self.result_data = list(self.result_data)
self.cardinality_filtered = total_count
self.cardinality = len(list(self.db.self.collection.find()))
def filtering(self):
# build your filter spec
filters = {}
if (self.request_values.has_key('sSearch')) and (self.request_values['sSearch'] != ""):
# the term put into search is logically concatenated with 'or' between all columns
or_filter_on_all_columns = []
for i in range(len(self.columns)):
column_filter = {}
column_filter[self.columns[i]] = {'$regex': self.request_values['sSearch'], '$options': 'i'}
or_filter_on_all_columns.append(column_filter)
filters['$or'] = or_filter_on_all_columns
return filters
def sorting(self):
order = []
# mongo translation for sorting order
if (self.request_values['iSortCol_0'] != "") and (self.request_values['iSortingCols'] > 0):
order = []
for i in range(int(self.request_values['iSortingCols'])):
order.append((self.columns[int(self.request_values['iSortCol_' + str(i)])], order_dict[self.request_values['sSortDir_' + str(i)]]))
return order
def paging(self):
pages = namedtuple('pages', ['start', 'length'])
if (self.request_values['iDisplayStart'] != "") and (self.request_values['iDisplayLength'] != -1):
pages.start = int(self.request_values['iDisplayStart'])
pages.length = int(self.request_values['iDisplayLength'])
return pages
with this code in the View:
@view_config(
route_name='candidates.list.json',
renderer='json',
permission='admin'
)
def candidate_list_json(context, request):
columns = [ 'id_number', 'first_name', 'email', 'mobile_number']
index_column = "id_number"
collection = "candidates"
results = DataTables_Handler(request, columns, index_column, collection).output_result()
# return the results as a string for the datatable
return {"results": results}
and this in the template:
<a id="btn-addteam" class="btn btn-success" href="{{'add_candidate'|route_url}}"><i class="icon-plus"></i> Add Candidate</a>
ID Number Candidate Name Candidate email Mobile Number Health -->
<script src="{{'kivu:static/datatables/jquery.dataTables.js'|static_url}}"></script>
<script src="{{'kivu:static/datatables/dataTables.scroller.js'|static_url}}"></script>
<script>
$(document).ready(function() {
url = "{{'candidates.list.json'|route_url}}";
var oTable = $('#candidate_search').dataTable( {
"bProcessing": true,
"bServerSide": true,
"sPaginationType": "full_numbers",
"bjQueryUI": true,
"sAjaxSource": url
});
} );</script>
But its giving me a js error:
TypeError: aData is undefined
for ( var i=0, iLen=aData.length ; i<iLen ; i++ )
my GET response returns:
{"results": {"aaData": [], "iTotalRecords": "0", "sEcho": "1", "iTotalDisplayRecords": "0"}}
there is data in the database. What am I missing?
More information about the Python-list
mailing list