from collections import defaultdict def per_manager(timesheets): per_manager = defaultdict(list) # filter timesheets per manager for timesheet in [t for t in timesheets if need_manager_mail(t)]: manager_id = timesheet.approver per_manager[manager_id].append(timesheet) return per_manager def need_manager_mail(timesheet): return not timesheet.is_submitted() or not timesheet.is_approved() def employees(timesheets): return dict([(t.employee.id, t.employee) for t in timesheets])