# -*- coding: utf-8 -*- from odoo.utils.jinja_util import change_to_json LINE = 1 BAR = 2 PIE = 3 class ChartType(object): __slots__ = ['line', 'bar', 'pie'] def __init__(self): self.line = LINE self.bar = BAR self.pie = PIE class Chart(object): def __init__(self, title): self.title = title self.data = [] self.zoom = () self.chart_type = '1' self.is_change_xy = False return def set_data(self, data): self.data = data return def set_zoom(self, start, end): self.zoom = (start, end) return def set_chart_type(self, chart_type): self.chart_type = chart_type return def set_change_xy(self): self.is_change_xy = True return def _get_chart_type(self): if self.chart_type == BAR: return 'bar' if self.chart_type == PIE: return 'pie' return 'line' def get(self): if not self.data or len(self.data) < 2: return Chart._get_default() if self.chart_type == PIE: return self._get_pie() dic = { 'legend': {}, 'tooltip': {}, 'dataset': {'source': self.data} } if self.title: dic['title'] = {'text': self.title} if self.is_change_xy: dic['xAxis'] = {} dic['yAxis'] = {'type': 'category'} else: dic['xAxis'] = {'type': 'category'} dic['yAxis'] = {} if self.zoom: dic['dataZoom'] = [ {'type': 'slider', 'start': self.zoom[0], 'end': self.zoom[1]}, {'type': 'inside', 'start': self.zoom[0], 'end': self.zoom[1]} ] chart_type = self._get_chart_type() series = [{'type': chart_type, 'seriesLayoutBy': 'row'} for x in range(len(self.data) - 1)] dic['series'] = series data = Chart._get_4_json(dic) # print 'data:', data return data def _get_pie(self): if not self.data or len(self.data) == 0: return Chart._get_default() data = self._get_pie_data() dic = { 'series': [ { 'name': '访问来源', 'type': 'pie', # 设置图表类型为饼图 'radius': '55%', # 饼图的半径,外半径为可视区尺寸(容器高宽中较小一项)的 55% 长度。 'label': { 'formatter': '{b}: {@2012} ({d}%)' }, 'data': data } ] } return Chart._get_4_json(dic) def _get_pie_data(self): # 格式举例: # [ # 数据数组,name 为数据项名称,value 为数据项值 # {'value': 235, 'name': '视频广告'}, # {'value': 274, 'name': '联盟广告'} # ] data = self.data[1:] return [{'value': row[1], 'name': row[0]} for row in data] @staticmethod def _get_4_json(data): return data # _data = change_to_json(data) # return change_to_json(_data) @staticmethod def _get_default(): return False # return Chart._get_4_json(False) # dataZoom: [ # { // 这个dataZoom组件,默认控制x轴。 # type: 'slider', // 这个 dataZoom 组件是 slider 型 dataZoom 组件 # start: 10, // 左边在 10% 的位置。 # end: 60 // 右边在 60% 的位置。 # }, # { // 这个dataZoom组件,也控制x轴。 # type: 'inside', // 这个 dataZoom 组件是 inside 型 dataZoom 组件 # start: 10, // 左边在 10% 的位置。 # end: 60 // 右边在 60% 的位置。 # } # # ],