def _clone_timetable(self, new_event): offset = new_event.start_dt - self.old_event.start_dt # no need to copy the type; it's set automatically based on the object attrs = get_simple_column_attrs(TimetableEntry) - {'type', 'start_dt'} break_strategy = defaultload('break_') break_strategy.joinedload('own_venue') break_strategy.joinedload('own_room').lazyload('*') query = (self.old_event.timetable_entries.options( joinedload('parent').lazyload('*'), break_strategy).order_by( TimetableEntry.parent_id.is_(None).desc())) # iterate over all timetable entries; start with top-level # ones so we can build a mapping that can be used once we # reach nested entries entry_map = {} for old_entry in query: entry = TimetableEntry() entry.start_dt = old_entry.start_dt + offset entry.populate_from_attrs(old_entry, attrs) if old_entry.parent is not None: entry.parent = entry_map[old_entry.parent] if old_entry.session_block is not None: entry.session_block = self._session_block_map[ old_entry.session_block] if old_entry.contribution is not None: entry.contribution = self._contrib_map[old_entry.contribution] if old_entry.break_ is not None: entry.break_ = self._clone_break(old_entry.break_) new_event.timetable_entries.append(entry) entry_map[old_entry] = entry
def _clone_timetable(self, new_event): offset = new_event.start_dt - self.old_event.start_dt # no need to copy the type; it's set automatically based on the object attrs = get_simple_column_attrs(TimetableEntry) - {'type', 'start_dt'} break_strategy = defaultload('break_') break_strategy.joinedload('own_venue') break_strategy.joinedload('own_room').lazyload('*') query = (self.old_event.timetable_entries .options(joinedload('parent').lazyload('*'), break_strategy) .order_by(TimetableEntry.parent_id.is_(None).desc())) # iterate over all timetable entries; start with top-level # ones so we can build a mapping that can be used once we # reach nested entries entry_map = {} for old_entry in query: entry = TimetableEntry() entry.start_dt = old_entry.start_dt + offset entry.populate_from_attrs(old_entry, attrs) if old_entry.parent is not None: entry.parent = entry_map[old_entry.parent] if old_entry.session_block is not None: entry.session_block = self._session_block_map[old_entry.session_block] if old_entry.contribution is not None: entry.contribution = self._contrib_map[old_entry.contribution] if old_entry.break_ is not None: entry.break_ = self._clone_break(old_entry.break_) new_event.timetable_entries.append(entry) entry_map[old_entry] = entry