def grouped_totals(entries): select = { "day": { "date": """DATE_TRUNC('day', end_time)""" }, "week": { "date": """DATE_TRUNC('week', end_time)""" }, } weekly = entries.extra(select=select["week"]).values('date', 'billable') weekly = weekly.annotate(hours=Sum('hours')).order_by('date') daily = entries.extra(select=select["day"]).values('date', 'project__name', 'billable') daily = daily.annotate(hours=Sum('hours')).order_by( 'date', 'project__name') weeks = {} for week, week_entries in groupby(weekly, lambda x: x['date']): if week is not None: week = add_timezone(week) weeks[week] = get_hours_summary(week_entries) days = [] last_week = None for day, day_entries in groupby(daily, lambda x: x['date']): week = get_week_start(day) if last_week and week > last_week: yield last_week, weeks.get(last_week, {}), days days = [] days.append((day, daily_summary(day_entries))) last_week = week yield week, weeks.get(week, {}), days
def grouped_totals(entries): select = { "day": {"date": """DATE_TRUNC('day', end_time)"""}, "week": {"date": """DATE_TRUNC('week', end_time)"""}, } weekly = entries.extra(select=select["week"]).values('date', 'billable') weekly = weekly.annotate(hours=Sum('hours')).order_by('date') daily = entries.extra(select=select["day"]).values('date', 'project__name', 'billable') daily = daily.annotate(hours=Sum('hours')).order_by('date', 'project__name') weeks = {} for week, week_entries in groupby(weekly, lambda x: x['date']): if week is not None: week = add_timezone(week) weeks[week] = get_hours_summary(week_entries) days = [] last_week = None for day, day_entries in groupby(daily, lambda x: x['date']): week = get_week_start(day) if last_week and week > last_week: yield last_week, weeks.get(last_week, {}), days days = [] days.append((day, daily_summary(day_entries))) last_week = week yield week, weeks.get(week, {}), days
def daily_summary(day_entries): projects = {} all_day = {} for name, entries in groupby(day_entries, lambda x: x['project__name']): hours = get_hours_summary(entries) projects[name] = hours for key in hours.keys(): if key in all_day: all_day[key] += hours[key] else: all_day[key] = hours[key] return (all_day, projects)
def date_totals(entries, by): """Yield a user's name and a dictionary of their hours""" date_dict = {} for date, date_entries in groupby(entries, lambda x: x['date']): if isinstance(date, datetime.datetime): date = date.date() d_entries = list(date_entries) if by == 'user': name = ' '.join((d_entries[0]['user__first_name'], d_entries[0]['user__last_name'])) elif by == 'project': name = d_entries[0]['project__name'] else: name = d_entries[0][by] pk = d_entries[0][by] hours = get_hours_summary(d_entries) date_dict[date] = hours return name, pk, date_dict