def perform_carryforward(): """Perform as many carryforwards as needed. Walk back through weeks until the week is non-persistent or carryforward is true. Then perform carry-forward on the oldest week without carryforward set. Repeat until we're carrying forward last week until this week. """ offset = 1 nonpersistentweeks = 0 while True: weekname = naming.relative_name(offset) week = reader.DiaryReader().read_file(weekname) if not week.persistent: nonpersistentweeks += 1 if week.has_carryforward() or nonpersistentweeks == MAXIMUM_HOLIDAY_WEEKS: break offset += 1 while offset > 1: offset -= 1 fromname = naming.relative_name(offset) toname = naming.relative_name(offset - 1) fromweek = reader.DiaryReader().read_file(fromname) toweek = reader.DiaryReader().read_file(toname) _carryforward(fromweek, toweek) writer.DiaryWriter().write_file(fromname, fromweek) writer.DiaryWriter().write_file(toname, toweek) return