def draw(pagename, request): import shutil, cStringIO from MoinMoin.stats.chart import Chart, ChartData, Color _ = request.getText # check params filterpage = None if request and request.values and 'page' in request.values: filterpage = request.values['page'] days, views, edits = get_data(pagename, request, filterpage) import math try: scalefactor = float(max(views))/max(edits) except (ZeroDivisionError, ValueError): scalefactor = 1.0 else: scalefactor = int(10 ** math.floor(math.log10(scalefactor))) # scale edits up edits = [x * scalefactor for x in edits] # create image image = cStringIO.StringIO() c = Chart() c.addData(ChartData(views, color='green')) c.addData(ChartData(edits, color='red')) chart_title = '' if request.cfg.sitename: chart_title = "%s: " % request.cfg.sitename chart_title = chart_title + _('Page hits and edits') if filterpage: chart_title = _("%(chart_title)s for %(filterpage)s") % { 'chart_title': chart_title, 'filterpage': filterpage, } chart_title = "%s\n%sx%d" % (chart_title, _("green=view\nred=edit"), scalefactor) c.option( title=chart_title.encode('iso-8859-1', 'replace'), # gdchart can't do utf-8 xtitle=(_('date') + ' (Server)').encode('iso-8859-1', 'replace'), ytitle=_('# of hits').encode('iso-8859-1', 'replace'), title_font=c.GDC_GIANT, #thumblabel = 'THUMB', thumbnail = 1, thumbval = 10, #ytitle_color = Color('green'), #yaxis2 = 1, #ytitle2 = '# of edits', #ytitle2_color = Color('red'), #ylabel2_color = Color('black'), #interpolations = 0, threed_depth=1.0, requested_yinterval=1.0, stack_type=c.GDC_STACK_BESIDE ) c.draw(c.GDC_LINE, (request.cfg.chart_options['width'], request.cfg.chart_options['height']), image, days) request.content_type = 'image/gif' request.content_length = len(image.getvalue()) # copy the image image.reset() shutil.copyfileobj(image, request, 8192)
def draw(pagename, request): import shutil, cStringIO from MoinMoin.stats.chart import Chart, ChartData, Color _ = request.getText style = Chart.GDC_3DPIE # get data colors = ['red', 'mediumblue', 'yellow', 'deeppink', 'aquamarine', 'purple', 'beige', 'blue', 'forestgreen', 'orange', 'cyan', 'fuchsia', 'lime'] colors = ([Color(c) for c in colors]) data = get_data(request) maxdata = len(colors) - 1 if len(data) > maxdata: others = [x[0] for x in data[maxdata:]] data = data[:maxdata] + [(sum(others), _('Others').encode('iso-8859-1', 'replace'))] # gdchart can't do utf-8 # shift front to end if others is very small if data[-1][0] * 10 < data[0][0]: data = data[1:] + data[0:1] labels = [x[1] for x in data] data = [x[0] for x in data] # give us a chance to develop this if _debug: return "<p>data = %s</p>" % \ '<br>'.join([wikiutil.escape(repr(x)) for x in [labels, data]]) # create image image = cStringIO.StringIO() c = Chart() c.addData(data) title = '' if request.cfg.sitename: title = "%s: " % request.cfg.sitename title = title + _('Distribution of User-Agent Types') c.option( pie_color=colors, label_font=Chart.GDC_SMALL, label_line=1, label_dist=20, threed_depth=20, threed_angle=225, percent_labels=Chart.GDCPIE_PCT_RIGHT, title_font=c.GDC_GIANT, title=title.encode('iso-8859-1', 'replace')) # gdchart can't do utf-8 labels = [label.encode('iso-8859-1', 'replace') for label in labels] c.draw(style, (request.cfg.chart_options['width'], request.cfg.chart_options['height']), image, labels) request.content_type = 'image/gif' request.content_length = len(image.getvalue()) # copy the image image.reset() shutil.copyfileobj(image, request, 8192)
def draw(pagename, request): import bisect, shutil, cStringIO from MoinMoin.stats.chart import Chart, ChartData, Color _ = request.getText style = Chart.GDC_3DBAR # get data pages = request.rootpage.getPageDict() sizes = [] for name, page in pages.items(): sizes.append((page.size(), name.encode('iso-8859-1', 'replace')) ) # gdchart does no utf-8 sizes.sort() upper_bound = sizes[-1][0] bounds = [s*128 for s in range(1, 9)] if upper_bound >= 1024: bounds.extend([s*1024 for s in range(2, 9)]) if upper_bound >= 8192: bounds.extend([s*8192 for s in range(2, 9)]) if upper_bound >= 65536: bounds.extend([s*65536 for s in range(2, 9)]) data = [None] * len(bounds) for size, name in sizes: idx = bisect.bisect(bounds, size) ##idx = int((size / upper_bound) * classes) data[idx] = (data[idx] or 0) + 1 labels = ["%d" % b for b in bounds] # give us a chance to develop this if _debug: return "<p>data = %s</p>" % \ '<br>'.join([wikiutil.escape(repr(x)) for x in [labels, data]]) # create image image = cStringIO.StringIO() c = Chart() ##c.addData(ChartData(data, 'magenta')) c.addData(ChartData(_slice(data, 0, 7), 'blue')) if upper_bound >= 1024: c.addData(ChartData(_slice(data, 7, 14), 'green')) if upper_bound >= 8192: c.addData(ChartData(_slice(data, 14, 21), 'red')) if upper_bound >= 65536: c.addData(ChartData(_slice(data, 21, 28), 'magenta')) title = '' if request.cfg.sitename: title = "%s: " % request.cfg.sitename title = title + _('Page Size Distribution') c.option( annotation=(bisect.bisect(bounds, upper_bound), Color('black'), "%d %s" % sizes[-1]), title=title.encode('iso-8859-1', 'replace'), # gdchart can't do utf-8 xtitle=_('page size upper bound [bytes]').encode('iso-8859-1', 'replace'), ytitle=_('# of pages of this size').encode('iso-8859-1', 'replace'), title_font=c.GDC_GIANT, threed_depth=2.0, requested_yinterval=1.0, stack_type=c.GDC_STACK_LAYER, ) c.draw(style, (request.cfg.chart_options['width'], request.cfg.chart_options['height']), image, labels) request.content_type = 'image/gif' request.content_length = len(image.getvalue()) # copy the image image.reset() shutil.copyfileobj(image, request, 8192)