File "datahandler.py"
Full Path: /home/analogde/www/php/integrations/django/samples/fusioncharts/datahandler.py
File size: 3.39 KB
MIME-type: text/x-script.python
Charset: utf-8
from django.shortcuts import render
from django.http import HttpResponse
from django.http import QueryDict
from fusioncharts.models import *
import json
def getdata(request):
levelValueMapping = BuildColumnLevel()
urlQueryString = request.META['QUERY_STRING']
drillLevel = getQueryStringValueByKey(urlQueryString, "drillLevel", "" )
query = ""
label = ""
if not drillLevel:
drillLevel = "1"
# build custom query & parameter column to be fetch
query = BuildQuery(levelValueMapping[int(drillLevel)])
else:
drillLevel = (int(drillLevel) + 1)
label = getQueryStringValueByKey(urlQueryString, "label", "" )
# build custom query
# parameter column to be fetch, previously clicked value, previous level column name
query = BuildQuery(levelValueMapping[int(drillLevel)], label, levelValueMapping[int(drillLevel) - 1])
# fetch chart data from DB data create chart compatible json
chartJsonData = ProcessChartData(query, levelValueMapping[(int(drillLevel))], drillLevel, len(levelValueMapping))
# send response
return HttpResponse(chartJsonData)
def getQueryStringValueByKey(queryString, searchKey, defaultValue):
queryDict = QueryDict(queryString)
for key, value in queryDict.items():
if key.lower() == searchKey.lower():
defaultValue = value
break
return defaultValue
def BuildColumnLevel():
mapDict = {
1: "Region",
2: "Country",
3: "City"
}
return mapDict
def BuildQuery(columnName, parentValue=None, parentName=None):
query = ""
if parentValue is None:
query = "select 1 as id," + columnName + ", SUM([TotalSales]) as [TotalSales]" + "from SalesRecord group by " + columnName
else:
query = "select 1 as id," + columnName + ", SUM([TotalSales]) as [TotalSales]" + "from SalesRecord where " + parentName + "= '" + parentValue + "' Group by " + columnName
return query
def ProcessChartData(sqlQuery, columnName, drillLevel, maxLevel):
# Chart data is passed to the `dataSource` parameter.
dataSource = {}
dataSource['chart'] = {
"caption" : "Total Sales by " + columnName,
"xAxisName" : columnName,
"yAxisName" : "Total Sales",
"numberSuffix": "K",
"theme": "fusion"
}
dataSource['data'] = []
# Iterate rows by invoking 'RawQuerySet' in `SalesRecord` model and insert in to the `dataSource['data']` list.
for key in SalesRecord.objects.raw(sqlQuery):
data = {}
# region-sales, country-sales, city-sales
if str(drillLevel) == "1":
data['label'] = key.Region
data['value'] = key.TotalSales
# Create link for each Region when a data plot is clicked.
data['link'] = "newchart-jsonurl-/datahandler?" + "label=" + key.Region + "&drillLevel=" + str(drillLevel)
elif str(drillLevel) == "2":
data['label'] = key.Country
data['value'] = key.TotalSales
# Create link for each country when a data plot is clicked.
data['link'] = "newchart-jsonurl-/datahandler?" + "label=" + key.Country + "&drillLevel=" + str(drillLevel)
elif str(drillLevel) == "3":
data['label'] = key.City
data['value'] = key.TotalSales
dataSource['data'].append(data)
return json.dumps(dataSource)