def _process(self): form = ContributionDurationForm(obj=FormDefaults(self.contrib), contrib=self.contrib) if form.validate_on_submit(): with track_time_changes(): update_contribution(self.contrib, {'duration': form.duration.data}) return jsonify_data(new_value=format_human_timedelta(self.contrib.duration)) return jsonify_form(form, back_button=False, disabled_until_change=True)
def _process(self): contrib_form_class = make_contribution_form(self.event) custom_field_values = { 'custom_{}'.format(x.contribution_field_id): x.data for x in self.contrib.field_values } parent_session_block = ( self.contrib.timetable_entry.parent.session_block if (self.contrib.timetable_entry and self.contrib.timetable_entry.parent) else None) form = contrib_form_class(obj=FormDefaults( self.contrib, start_date=self.contrib.start_dt, **custom_field_values), event=self.event, contrib=self.contrib, session_block=parent_session_block) if form.validate_on_submit(): with track_time_changes(), flash_if_unregistered( self.event, lambda: self.contrib.person_links): update_contribution(self.contrib, *get_field_values(form.data)) flash( _("Contribution '{}' successfully updated").format( self.contrib.title), 'success') tpl_components = self.list_generator.render_list(self.contrib) if tpl_components['hide_contrib']: self.list_generator.flash_info_message(self.contrib) return jsonify_data(flash=(request.args.get('flash') == '1'), **tpl_components) elif not form.is_submitted(): handle_legacy_description(form.description, self.contrib) self.commit = False return jsonify_template('events/contributions/forms/contribution.html', form=form)
def _process(self): item = self.entry.object entry_dt = self.entry.start_dt.astimezone(self.event.tzinfo) form = BaseEntryForm(obj=FormDefaults(item, time=entry_dt.time()), day=entry_dt.date(), event=self.event, 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.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 _process(self): contrib_form_class = make_contribution_form(self.event_new) custom_field_values = { 'custom_{}'.format(x.contribution_field_id): x.data for x in self.contrib.field_values } parent_session_block = ( self.contrib.timetable_entry.parent.session_block if (self.contrib.timetable_entry and self.contrib.timetable_entry.parent) else None) form = contrib_form_class(obj=FormDefaults( self.contrib, start_date=self.contrib.start_dt, **custom_field_values), event=self.event_new, contrib=self.contrib, session_block=parent_session_block) if form.validate_on_submit(): with track_time_changes(): update_contribution(self.contrib, *_get_field_values(form.data)) flash( _("Contribution '{}' successfully updated").format( self.contrib.title), 'success') tpl_components = self.reporter.render_contrib_report(self.contrib) if tpl_components['hide_contrib']: self.reporter.flash_info_message(self.contrib) return jsonify_data(**tpl_components) self.commit = False return jsonify_template('events/contributions/forms/contribution.html', form=form)
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 = ContributionProtectionForm(obj=FormDefaults(**self._get_defaults()), contrib=self.contrib, prefix='contribution-protection-') if form.validate_on_submit(): update_permissions(self.contrib, form) update_contribution(self.contrib, {'protection_mode': form.protection_mode.data}) return jsonify_data(flash=False, **self.list_generator.render_list(self.contrib)) return jsonify_template('events/management/protection_dialog.html', form=form)
def _process(self): form = ContributionProtectionForm(obj=FormDefaults(**self._get_defaults()), contrib=self.contrib, prefix='contribution-protection-') if form.validate_on_submit(): update_contribution(self.contrib, {'protection_mode': form.protection_mode.data}) update_object_principals(self.contrib, form.managers.data, full_access=True) if self.contrib.is_protected: update_object_principals(self.contrib, form.acl.data, read_access=True) update_object_principals(self.contrib, form.submitters.data, role='submit') return jsonify_data(flash=False, **self.list_generator.render_list(self.contrib)) return jsonify_form(form)
def _process(self): form = ContributionProtectionForm(obj=FormDefaults(**self._get_defaults()), contrib=self.contrib, prefix='contribution-protection-') if form.validate_on_submit(): update_contribution(self.contrib, {'protection_mode': form.protection_mode.data}) update_object_principals(self.contrib, form.managers.data, full_access=True) if self.contrib.is_protected: update_object_principals(self.contrib, form.acl.data, read_access=True) update_object_principals(self.contrib, form.submitters.data, role='submit') return jsonify_data(flash=False, **self.list_generator.render_list(self.contrib)) return jsonify_form(form)
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 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 _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.tzinfo) form = ContributionEntryForm(obj=FormDefaults(contrib, time=tt_entry_dt.time()), event=self.event, 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, lambda: contrib.person_links): update_contribution(contrib, *get_field_values(form.data)) notifications = get_time_changes_notifications(changes, tzinfo=self.event.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.tzinfo) form = BreakEntryForm(obj=FormDefaults(break_, time=tt_entry_dt.time()), event=self.event, 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.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) 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.tzinfo) form = SessionBlockEntryForm(obj=FormDefaults(block, time=tt_entry_dt.time()), event=self.event, 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.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 _process(self): contrib_form_class = make_contribution_form(self.event_new) custom_field_values = {'custom_{}'.format(x.contribution_field_id): x.data for x in self.contrib.field_values} parent_session_block = (self.contrib.timetable_entry.parent.session_block if (self.contrib.timetable_entry and self.contrib.timetable_entry.parent) else None) form = contrib_form_class(obj=FormDefaults(self.contrib, start_date=self.contrib.start_dt, **custom_field_values), event=self.event_new, contrib=self.contrib, session_block=parent_session_block) if form.validate_on_submit(): with track_time_changes(): update_contribution(self.contrib, *_get_field_values(form.data)) flash(_("Contribution '{}' successfully updated").format(self.contrib.title), 'success') tpl_components = self.reporter.render_contrib_report(self.contrib) if tpl_components['hide_contrib']: self.reporter.flash_info_message(self.contrib) return jsonify_data(**tpl_components) self.commit = False return jsonify_template('events/contributions/forms/contribution.html', form=form)
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): contrib_form_class = make_contribution_form(self.event) custom_field_values = {'custom_{}'.format(x.contribution_field_id): x.data for x in self.contrib.field_values} parent_session_block = (self.contrib.timetable_entry.parent.session_block if (self.contrib.timetable_entry and self.contrib.timetable_entry.parent) else None) form = contrib_form_class(obj=FormDefaults(self.contrib, start_date=self.contrib.start_dt, **custom_field_values), event=self.event, contrib=self.contrib, session_block=parent_session_block) if form.validate_on_submit(): with track_time_changes(), flash_if_unregistered(self.event, lambda: self.contrib.person_links): update_contribution(self.contrib, *get_field_values(form.data)) flash(_("Contribution '{}' successfully updated").format(self.contrib.title), 'success') tpl_components = self.list_generator.render_list(self.contrib) if tpl_components['hide_contrib']: self.list_generator.flash_info_message(self.contrib) return jsonify_data(flash=(request.args.get('flash') == '1'), **tpl_components) elif not form.is_submitted(): handle_legacy_description(form.description, self.contrib) self.commit = False return jsonify_template('events/contributions/forms/contribution.html', form=form)
def _process_PATCH(self): data = request.json updates = {} if set(data.viewkeys()) > {'session_id', 'track_id'}: raise BadRequest if 'session_id' in data: updates.update(self._get_contribution_session_updates(data['session_id'])) if 'track_id' in data: updates.update(self._get_contribution_track_updates(data['track_id'])) rv = {} if updates: rv = update_contribution(self.contrib, updates) return jsonify(unscheduled=rv.get('unscheduled', False), undo_unschedule=rv.get('undo_unschedule'))
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: 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( entries=[serialize_entry_update(contrib.timetable_entry)], notifications=notifications, flash=False) 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( entries=[serialize_entry_update(break_.timetable_entry)], 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(entries=[ serialize_entry_update(x.timetable_entry) for x in session_.blocks ], 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(entries=[ serialize_entry_update(block.timetable_entry) ], notifications=notifications, flash=False) self.commit = False return jsonify_form(form, fields=getattr(form, '_display_fields', None))