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 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) headers = ["Content-Type: image/gif", "Content-Length: %d" % len(image.getvalue())] request.emit_http_headers(headers) # 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)
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.form and request.form.has_key("page"): filterpage = request.form["page"][0] # get results from cache if filterpage: arena = Page(request, pagename) key = "hitcounts" else: arena = "charts" key = "hitcounts" cache = caching.CacheEntry(request, arena, key) if cache.exists(): try: cache_date, cache_days, cache_views, cache_edits = eval(cache.content()) except: cache_days, cache_views, cache_edits = [], [], [] cache_date = 0 else: cache_days, cache_views, cache_edits = [], [], [] cache_date = 0 logfile = eventlog.EventLog(request) logfile.set_filter(["VIEWPAGE", "SAVEPAGE"]) new_date = logfile.date() # prepare data days = [] views = [] edits = [] ratchet_day = None ratchet_time = None for event in logfile.reverse(): # print ">>>", wikiutil.escape(repr(event)), "<br>" if event[0] <= cache_date: break # XXX Bug: event[2].get('pagename') -> u'Aktuelle%C4nderungen' 8( eventpage = event[2].get("pagename", "") if filterpage and eventpage != filterpage: continue time_tuple = request.user.getTime(wikiutil.version2timestamp(event[0])) day = tuple(time_tuple[0:3]) if day != ratchet_day: # new day while ratchet_time: ratchet_time -= 86400 rday = tuple(request.user.getTime(ratchet_time)[0:3]) if rday <= day: break days.append(request.user.getFormattedDate(ratchet_time)) views.append(0) edits.append(0) days.append(request.user.getFormattedDate(wikiutil.version2timestamp(event[0]))) views.append(0) edits.append(0) ratchet_day = day ratchet_time = wikiutil.version2timestamp(event[0]) if event[1] == "VIEWPAGE": views[-1] = views[-1] + 1 elif event[1] == "SAVEPAGE": edits[-1] = edits[-1] + 1 # give us a chance to develop this if _debug: return "labels = %s<br>views = %s<br>edits = %s<br>" % tuple( map(wikiutil.escape, map(repr, [days, views, edits])) ) days.reverse() views.reverse() edits.reverse() # merge the day on the end of the cache if cache_days and days and days[0] == cache_days[-1]: cache_edits[-1] += edits[0] cache_views[-1] += views[0] days, views, edits = days[1:], views[1:], edits[1:] cache_days.extend(days) cache_views.extend(views) cache_edits.extend(edits) days, views, edits = cache_days, cache_views, cache_edits # save to cache cache.update("(%r, %r, %r, %r)" % (new_date, days, views, edits)) 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 = map(lambda x: x * scalefactor, 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) # send HTTP headers headers = ["Content-Type: image/gif", "Content-Length: %d" % len(image.getvalue())] request.http_headers(headers) # copy the image image.reset() shutil.copyfileobj(image, request, 8192) raise MoinMoinNoFooter
def draw(pagename, request): import shutil, cStringIO, operator 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]) # get results from cache cache = caching.CacheEntry(request, 'charts', 'useragents') if cache.exists(): try: cache_date, data = eval(cache.content()) except: cache_date, data = 0, {} else: cache_date, data = 0, {} logfile = eventlog.EventLog(request) logfile.set_filter(['VIEWPAGE', 'SAVEPAGE']) new_date = logfile.date() for event in logfile.reverse(): if event[0] <= cache_date: break ua = event[2].get('HTTP_USER_AGENT') if ua: pos = ua.find(" (compatible; ") if pos >= 0: ua = ua[pos:].split(';')[1].strip() else: ua = ua.split()[0] #ua = ua.replace(';', '\n') data[ua] = data.get(ua, 0) + 1 # write results to cache cache.update("(%r, %r)" % (new_date, data)) data = [(cnt, ua) for ua, cnt in data.items()] data.sort() data.reverse() maxdata = len(colors) - 1 if len(data) > maxdata: others = [x[0] for x in data[maxdata:]] data = data[:maxdata] + [(reduce(operator.add, others, 0), _('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(map(wikiutil.escape, map(repr, [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) # send HTTP headers headers = [ "Content-Type: image/gif", "Content-Length: %d" % len(image.getvalue()), ] request.http_headers(headers) # copy the image image.reset() shutil.copyfileobj(image, request, 8192) raise MoinMoinNoFooter