def _process(self): item = self.entry.object entry_dt = self.entry.start_dt.astimezone(self.event_new.tzinfo) form = BaseEntryForm(obj=FormDefaults(item, time=entry_dt.time()), day=entry_dt.date(), event=self.event_new, entry=self.entry, session_block=self.entry.parent.object if self.entry.parent else None) data = form.data shift_later = data.pop('shift_later') updated_entries = [] if form.validate_on_submit(): with track_time_changes(auto_extend=True, user=session.user) as changes: if shift_later: new_end_dt = form.start_dt.data + form.duration.data shift = new_end_dt - self.entry.end_dt updated_entries += shift_following_entries(self.entry, shift, session_=self.session) if self.entry.contribution: update_timetable_entry(self.entry, {'start_dt': form.start_dt.data}) update_contribution(item, {'duration': form.duration.data}) elif self.entry.break_: update_break_entry(item, data) elif self.entry.session_block: update_session_block(item, data) notifications = get_time_changes_notifications(changes, tzinfo=self.event_new.tzinfo, entry=self.entry) updated_entries.append(item.timetable_entry) return jsonify_data(entries=[serialize_entry_update(entry) for entry in updated_entries], flash=False, shift_later=shift_later, notifications=notifications) self.commit = False return jsonify_form(form, back_button=False, disabled_until_change=True)
def _process(self): form = MeetingSessionBlockForm(obj=FormDefaults(**self._get_form_defaults()), event=self.event, session_block=self.session_block) if form.validate_on_submit(): session_data = {k[8:]: v for k, v in form.data.iteritems() if k in form.session_fields} block_data = {k[6:]: v for k, v in form.data.iteritems() if k in form.block_fields} update_session(self.session, session_data) update_session_block(self.session_block, block_data) return jsonify_data(flash=False) self.commit = False return jsonify_template('events/forms/session_block_form.html', form=form, block=self.session_block)
def update_timetable_entry_object(entry, data): """Update the `object` of a timetable entry according to its type""" from indico.modules.events.contributions.operations import update_contribution obj = entry.object if entry.type == TimetableEntryType.CONTRIBUTION: update_contribution(obj, data) elif entry.type == TimetableEntryType.SESSION_BLOCK: update_session_block(obj, data) elif entry.type == TimetableEntryType.BREAK: obj.populate_from_dict(data) db.session.flush()
def _process(self): form = None parent_session_block = self.entry.parent.object if self.entry.parent else None if self.entry.contribution: contrib = self.entry.contribution tt_entry_dt = self.entry.start_dt.astimezone(self.event_new.tzinfo) form = ContributionEntryForm(obj=FormDefaults(contrib, time=tt_entry_dt.time()), event=self.event_new, contrib=contrib, to_schedule=False, day=tt_entry_dt.date(), session_block=parent_session_block) if form.validate_on_submit(): with track_time_changes(auto_extend=True, user=session.user) as changes: with flash_if_unregistered(self.event_new, lambda: contrib.person_links): update_contribution(contrib, *get_field_values(form.data)) notifications = get_time_changes_notifications(changes, tzinfo=self.event_new.tzinfo, entry=self.entry) return jsonify_data(update=serialize_entry_update(self.entry, session_=self.session), notifications=notifications) elif not form.is_submitted(): handle_legacy_description(form.description, contrib) return jsonify_template('events/contributions/forms/contribution.html', form=form, fields=form._display_fields) elif self.entry.break_: break_ = self.entry.break_ tt_entry_dt = self.entry.start_dt.astimezone(self.event_new.tzinfo) form = BreakEntryForm(obj=FormDefaults(break_, time=tt_entry_dt.time()), event=self.event_new, day=tt_entry_dt.date(), session_block=parent_session_block) if form.validate_on_submit(): with track_time_changes(auto_extend=True, user=session.user) as changes: update_break_entry(break_, form.data) notifications = get_time_changes_notifications(changes, tzinfo=self.event_new.tzinfo, entry=self.entry) return jsonify_data(update=serialize_entry_update(self.entry, session_=self.session), notifications=notifications, flash=False) elif self.entry.session_block: if self.edit_session: session_ = self.entry.session_block.session form = SessionForm(obj=FormDefaults(session_), event=self.event_new) if form.validate_on_submit(): update_session(session_, form.data) return jsonify_data(update=serialize_entry_update(self.entry, session_=self.session), flash=False) else: block = self.entry.session_block tt_entry_dt = self.entry.start_dt.astimezone(self.event_new.tzinfo) form = SessionBlockEntryForm(obj=FormDefaults(block, time=tt_entry_dt.time()), event=self.event_new, session_block=block, to_schedule=False, day=tt_entry_dt.date()) if form.validate_on_submit(): with track_time_changes(auto_extend=True, user=session.user) as changes: update_session_block(block, form.data) notifications = get_time_changes_notifications(changes, tzinfo=self.event_new.tzinfo, entry=self.entry) return jsonify_data(update=serialize_entry_update(self.entry, session_=self.session), notifications=notifications, flash=False) self.commit = False return jsonify_form(form, fields=getattr(form, '_display_fields', None))
def move_timetable_entry(entry, parent=None, day=None): """Move the `entry` to another session or top-level timetable. :param entry: `TimetableEntry` to be moved :param parent: If specified then the entry will be set as a child of parent :param day: If specified then the entry will be moved to the top-level timetable on this day """ if bool(parent) + bool(day) != 1: raise TypeError("Wrong number of arguments") from indico.modules.events.contributions.operations import update_contribution updates = {} contrib_update_data = {} if day: new_start_dt = entry.start_dt.replace(day=day.day, month=day.month) updates['start_dt'] = new_start_dt updates['parent'] = None contrib_update_data = {'session_id': None, 'session_block_id': None} elif parent: new_start_dt = find_latest_entry_end_dt( parent.object) or parent.start_dt tz = entry.event.tzinfo if (new_start_dt + entry.duration ).astimezone(tz).date() != parent.start_dt.astimezone(tz).date(): raise UserValueError( _('Session block cannot span more than one day')) updates['parent'] = parent updates['start_dt'] = new_start_dt contrib_update_data = { 'session': parent.session_block.session, 'session_block': parent.session_block } update_timetable_entry(entry, updates) if entry.type == TimetableEntryType.CONTRIBUTION: update_contribution(entry.object, contrib_update_data) if parent and entry.end_dt > parent.end_dt: duration = parent.object.duration + (entry.end_dt - parent.end_dt) update_session_block(parent.object, {'duration': duration})
def _process(self): form = MeetingSessionBlockForm( obj=FormDefaults(**self._get_form_defaults()), event=self.event, session_block=self.session_block) if form.validate_on_submit(): session_data = { k[8:]: v for k, v in form.data.iteritems() if k in form.session_fields } block_data = { k[6:]: v for k, v in form.data.iteritems() if k in form.block_fields } update_session(self.session, session_data) update_session_block(self.session_block, block_data) return jsonify_data(flash=False) self.commit = False return jsonify_template('events/forms/session_block_form.html', form=form, block=self.session_block)
def _process(self): item = self.entry.object entry_dt = self.entry.start_dt.astimezone(self.event_new.tzinfo) form = BaseEntryForm(obj=FormDefaults(item, time=entry_dt.time()), day=entry_dt.date(), event=self.event_new, entry=self.entry, session_block=self.entry.parent.object if self.entry.parent else None) data = form.data shift_later = data.pop('shift_later') if form.validate_on_submit(): with track_time_changes(auto_extend=True, user=session.user) as changes: if shift_later: new_end_dt = form.start_dt.data + form.duration.data shift = new_end_dt - self.entry.end_dt shift_following_entries(self.entry, shift, session_=self.session) if self.entry.contribution: update_timetable_entry(self.entry, {'start_dt': form.start_dt.data}) update_contribution(item, {'duration': form.duration.data}) elif self.entry.break_: update_break_entry(item, data) elif self.entry.session_block: update_session_block(item, data) notifications = get_time_changes_notifications( changes, tzinfo=self.event_new.tzinfo, entry=self.entry) return jsonify_data(update=serialize_entry_update( self.entry, session_=self.session), notifications=notifications, flash=False) self.commit = False return jsonify_form(form, back_button=False, disabled_until_change=True)
def move_timetable_entry(entry, parent=None, day=None): """Move the `entry` to another session or top-level timetable :param entry: `TimetableEntry` to be moved :param parent: If specified then the entry will be set as a child of parent :param day: If specified then the entry will be moved to the top-level timetable on this day """ if bool(parent) + bool(day) != 1: raise TypeError("Wrong number of arguments") from indico.modules.events.contributions.operations import update_contribution updates = {} contrib_update_data = {} if day: new_start_dt = entry.start_dt.replace(day=day.day, month=day.month) updates["start_dt"] = new_start_dt updates["parent"] = None contrib_update_data = {"session_id": None, "session_block_id": None} elif parent: new_start_dt = find_latest_entry_end_dt(parent.object) or parent.start_dt tz = entry.event_new.tzinfo if (new_start_dt + entry.duration).astimezone(tz).date() != parent.start_dt.astimezone(tz).date(): raise UserValueError(_("Session block cannot span more than one day")) updates["parent"] = parent updates["start_dt"] = new_start_dt contrib_update_data = {"session": parent.session_block.session, "session_block": parent.session_block} update_timetable_entry(entry, updates) if entry.type == TimetableEntryType.CONTRIBUTION: update_contribution(entry.object, contrib_update_data) if parent and entry.end_dt > parent.end_dt: duration = parent.object.duration + (entry.end_dt - parent.end_dt) update_session_block(parent.object, {"duration": duration})
def _process(self): form = None parent_session_block = self.entry.parent.object if self.entry.parent else None if self.entry.contribution: contrib = self.entry.contribution tt_entry_dt = self.entry.start_dt.astimezone(self.event_new.tzinfo) form = ContributionEntryForm(obj=FormDefaults( contrib, time=tt_entry_dt.time()), event=self.event_new, contrib=contrib, to_schedule=False, day=tt_entry_dt.date(), session_block=parent_session_block) if form.validate_on_submit(): with track_time_changes(auto_extend=True, user=session.user) as changes: with flash_if_unregistered(self.event_new, lambda: contrib.person_links): update_contribution(contrib, *get_field_values(form.data)) notifications = get_time_changes_notifications( changes, tzinfo=self.event_new.tzinfo, entry=self.entry) return jsonify_data(update=serialize_entry_update( self.entry, session_=self.session), notifications=notifications) elif not form.is_submitted(): handle_legacy_description(form.description, contrib) return jsonify_template( 'events/contributions/forms/contribution.html', form=form, fields=form._display_fields) elif self.entry.break_: break_ = self.entry.break_ tt_entry_dt = self.entry.start_dt.astimezone(self.event_new.tzinfo) form = BreakEntryForm(obj=FormDefaults(break_, time=tt_entry_dt.time()), event=self.event_new, day=tt_entry_dt.date(), session_block=parent_session_block) if form.validate_on_submit(): with track_time_changes(auto_extend=True, user=session.user) as changes: update_break_entry(break_, form.data) notifications = get_time_changes_notifications( changes, tzinfo=self.event_new.tzinfo, entry=self.entry) return jsonify_data(update=serialize_entry_update( self.entry, session_=self.session), notifications=notifications, flash=False) elif self.entry.session_block: if self.edit_session: session_ = self.entry.session_block.session form = SessionForm(obj=FormDefaults(session_), event=self.event_new) if form.validate_on_submit(): update_session(session_, form.data) return jsonify_data(update=serialize_entry_update( self.entry, session_=self.session), flash=False) else: block = self.entry.session_block tt_entry_dt = self.entry.start_dt.astimezone( self.event_new.tzinfo) form = SessionBlockEntryForm(obj=FormDefaults( block, time=tt_entry_dt.time()), event=self.event_new, session_block=block, to_schedule=False, day=tt_entry_dt.date()) if form.validate_on_submit(): with track_time_changes(auto_extend=True, user=session.user) as changes: update_session_block(block, form.data) notifications = get_time_changes_notifications( changes, tzinfo=self.event_new.tzinfo, entry=self.entry) return jsonify_data(update=serialize_entry_update( self.entry, session_=self.session), notifications=notifications, flash=False) self.commit = False return jsonify_form(form, fields=getattr(form, '_display_fields', None))