123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133 |
- # -*- 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% 的位置。
- # }
- #
- # ],
|