Exemplo n.º 1
0
def presence_chart(days):
  """Returns a graph of user presence, in his language of choice."""

  start = datetime.date.today() - datetime.timedelta(days=days)
  start = datetime.date(start.year, start.month, 1)

  genreh = Rehearsal.objects.filter(type='G').filter(date__gte=start).order_by('date')
  begreh = Rehearsal.objects.filter(type='B').filter(date__gte=start).order_by('date')
  concert = Concert.objects.filter(start__gte=start).order_by('start')

  # Calculates the vertical range
  max_y = 0
  genreh_presence = [] 
  active = []
  begreh_presence = []
  concert_presence = []
  for k in genreh: 
    active.append(((k.date-start).days, k.members.count()))
    if k.members.count() > max_y: max_y = k.members.count()
    genreh_presence.append(((k.date-start).days, k.presence().count()))
  for k in begreh: 
    begreh_presence.append(((k.date-start).days, k.presence().count()))
  for k in concert: 
    concert_presence.append(((k.start.date()-start).days, k.participated().count()))
    if k.participated().count() > max_y: max_y = k.participated().count()
  max_y = 5+5*(max_y/5)

  # Chart size of 200x125 pixels and specifying the range for the Y axis
  width = 500
  height = 200
  chart = XYLineChart(width, height, y_range=[0, max_y])
  chart.add_data([k[0] for k in genreh_presence])
  chart.add_data([k[1] for k in genreh_presence])
  chart.add_data([k[0] for k in begreh_presence])
  chart.add_data([k[1] for k in begreh_presence])
  chart.add_data([k[0] for k in concert_presence])
  chart.add_data([k[1] for k in concert_presence])
  chart.add_data([k[0] for k in active])
  chart.add_data([k[1] for k in active])

  # Set the line colours
  chart.set_colours(['0000FF', 'FF0000', '00FF00','000000'])
  chart.set_legend([_(u'General rehearsals'),_(u'Beginner rehearsals'),_(u'Concerts'),_(u'Active members')])
  chart.set_title(_(u'Member presence'))

  # Contents of each axis
  x_labels = range(0, max_y + 1, 5)
  x_labels[0] = ''
  chart.set_axis_labels(Axis.LEFT, x_labels)

  # Calculates the months
  months = [start.month + k for k in range(int(math.ceil(days/30)))]
  while max(months) > 12:
    for k in range(len(months)): 
      if months[k] > 12: months[k] -= 12 
  labels = [k.strftime('%b') for k in [datetime.date(1970, j, 1) for j in months]] + [''] 
  chart.set_axis_labels(Axis.BOTTOM, labels)

  # Set the horizontal dotted lines
  chart.set_grid(0, 20, 1, 5)

  chart.fill_linear_stripes(Chart.CHART, 0, 'CCCCCC', 1.0/(len(labels)-1), 'FFFFFF', 1.0/(len(labels)-1))

  return {'url': chart.get_url(), 'width': width, 'height': height}