def group_milestones(milestones, include_completed): """Group milestones into "open with due date", "open with no due date", and possibly "completed". Return a list of (label, milestones) tuples.""" def category(m): return 1 if m.is_completed else 2 if m.due else 3 open_due_milestones, open_not_due_milestones, closed_milestones = partition( [(m, category(m)) for m in milestones], (2, 3, 1) ) groups = [(_("Open (by due date)"), open_due_milestones), (_("Open (no due date)"), open_not_due_milestones)] if include_completed: groups.append((_("Closed"), closed_milestones)) return groups
def group_milestones(milestones, include_completed): """Group milestones into "open with due date", "open with no due date", and possibly "completed". Return a list of (label, milestones) tuples.""" def category(m): return 1 if m.is_completed else 2 if m.due else 3 open_due_milestones, open_not_due_milestones, \ closed_milestones = partition([(m, category(m)) for m in milestones], (2, 3, 1)) groups = [ (_("Open (by due date)"), open_due_milestones), (_("Open (no due date)"), open_not_due_milestones), ] if include_completed: groups.append((_('Closed'), closed_milestones)) return groups
def reorganize(milestones): if not milestones: return milestones for milestone in milestones: milestone._kids = [] grouped = partition((milestone, milestone.parent) for milestone in milestones) roots = [] name_to_struct = {} delayed_items ={} for parent, kids in grouped.iteritems(): target = roots if parent: if name_to_struct.has_key(parent): target = name_to_struct[parent].kids else: target = delayed_items.setdefault(parent, []) for child in kids: child.kids.extend(delayed_items.pop(child.name,[])) name_to_struct[child.name] = child target.append(child) return StructuredMilestone._deep_sort(roots)