Skip to content

Commit

Permalink
Allow setting event-wide contribution duration
Browse files Browse the repository at this point in the history
- This resolves indico#3446.
  • Loading branch information
Ergys Dona committed Jul 17, 2018
1 parent 8c2bcc5 commit 05f64a4
Show file tree
Hide file tree
Showing 6 changed files with 44 additions and 6 deletions.
4 changes: 4 additions & 0 deletions indico/modules/events/contributions/blueprint.py
Expand Up @@ -103,6 +103,10 @@
_bp.add_url_rule('/manage/contributions/types/<int:contrib_type_id>/delete', 'delete_type',
management.RHDeleteContributionType, methods=('POST',))

# Default contribution duration
_bp.add_url_rule('/manage/contributions/duration/', 'manage_default_duration',
management.RHManageDefaultContributionDuration, methods=('GET', 'POST',))

# Custom contribution fields
_bp.add_url_rule('/manage/contributions/fields/', 'manage_fields', management.RHManageContributionFields)
_bp.add_url_rule('/manage/contributions/fields/create/<field_type>', 'create_field',
Expand Down
25 changes: 21 additions & 4 deletions indico/modules/events/contributions/controllers/management.py
Expand Up @@ -16,6 +16,7 @@

from __future__ import unicode_literals

from datetime import timedelta
from operator import attrgetter

from flask import flash, jsonify, redirect, request, session
Expand All @@ -25,16 +26,17 @@
from indico.core.db import db
from indico.core.db.sqlalchemy.protection import ProtectionMode, render_acl
from indico.core.permissions import get_principal_permissions
from indico.core.settings.converters import TimedeltaConverter
from indico.legacy.pdfinterface.conference import ContribsToPDF, ContributionBook
from indico.modules.attachments.controllers.event_package import AttachmentPackageGeneratorMixin
from indico.modules.events.abstracts.forms import AbstractContentSettingsForm
from indico.modules.events.abstracts.settings import abstracts_settings
from indico.modules.events.contributions import get_contrib_field_types
from indico.modules.events.contributions.clone import ContributionCloner
from indico.modules.events.contributions.controllers.common import ContributionListMixin
from indico.modules.events.contributions.forms import (ContributionDurationForm, ContributionProtectionForm,
ContributionStartDateForm, ContributionTypeForm,
SubContributionForm)
from indico.modules.events.contributions.forms import (ContributionDefaultDurationForm, ContributionDurationForm,
ContributionProtectionForm, ContributionStartDateForm,
ContributionTypeForm, SubContributionForm)
from indico.modules.events.contributions.lists import ContributionListGenerator
from indico.modules.events.contributions.models.contributions import Contribution
from indico.modules.events.contributions.models.fields import ContributionField
Expand All @@ -54,6 +56,7 @@
from indico.modules.events.models.references import ReferenceType
from indico.modules.events.operations import update_permissions
from indico.modules.events.sessions import Session
from indico.modules.events.settings import event_core_settings
from indico.modules.events.timetable.forms import ImportContributionsForm
from indico.modules.events.timetable.operations import update_timetable_entry
from indico.modules.events.tracks.models.tracks import Track
Expand Down Expand Up @@ -175,8 +178,10 @@ class RHCreateContribution(RHManageContributionsBase):
def _process(self):
inherited_location = self.event.location_data
inherited_location['inheriting'] = True
default_duration = TimedeltaConverter.to_python(event_core_settings.get(self.event, 'contrib_duration'))
contrib_form_class = make_contribution_form(self.event)
form = contrib_form_class(obj=FormDefaults(location_data=inherited_location), event=self.event)
form = contrib_form_class(obj=FormDefaults(location_data=inherited_location), event=self.event,
duration=default_duration)
if form.validate_on_submit():
# Create empty contribution so it can be compared to the new one in flash_if_unregistered
contrib = Contribution()
Expand Down Expand Up @@ -496,6 +501,18 @@ def _process(self):
contrib_types=contrib_types)


class RHManageDefaultContributionDuration(RHManageContributionsBase):
"""Dialog to manage the event-wide contribution duration"""

def _process(self):
default_duration = TimedeltaConverter.to_python(event_core_settings.get(self.event, 'contrib_duration'))
form = ContributionDefaultDurationForm(duration=default_duration)
if form.validate_on_submit():
event_core_settings.set(self.event, 'contrib_duration', form.duration.data.seconds)
return jsonify_data(flash=False)
return jsonify_form(form)


class RHManageContributionTypeBase(RHManageContributionsBase):
"""Manage a contribution type of an event"""

Expand Down
5 changes: 5 additions & 0 deletions indico/modules/events/contributions/forms.py
Expand Up @@ -183,6 +183,11 @@ def validate_duration(self, field):
raise ValidationError(error_msg)


class ContributionDefaultDurationForm(IndicoForm):
duration = TimeDeltaField(_('Duration'), [DataRequired(), MaxDuration(timedelta(days=1))],
default=timedelta(minutes=20), units=('minutes', 'hours'))


class ContributionTypeForm(IndicoForm):
"""Form to create or edit a ContributionType"""

Expand Down
Expand Up @@ -22,6 +22,15 @@
data-ajax-dialog>
{% trans %}Contribution types{% endtrans %}</a>
</li>
<li>
<a href="#"
title="{% trans %}Set default contribution duration{% endtrans %}"
data-title="{% trans %}Set event-wide contribution duration{% endtrans %}"
data-href="{{ url_for('.manage_default_duration', event) }}"
data-qtip-position="right"
data-ajax-dialog>
{% trans %}Contribution duration{% endtrans %}</a>
</li>
<li>
<a href="#"
title="{% trans %}Manage custom fields{% endtrans %}"
Expand Down
1 change: 1 addition & 0 deletions indico/modules/events/models/events.py
Expand Up @@ -419,6 +419,7 @@ def __table_args__(cls):
end_dt_override = _EventSettingProperty(event_core_settings, 'end_dt_override')
organizer_info = _EventSettingProperty(event_core_settings, 'organizer_info')
additional_info = _EventSettingProperty(event_core_settings, 'additional_info')
contrib_duration = _EventSettingProperty(event_core_settings, 'contrib_duration')
contact_title = _EventSettingProperty(event_contact_settings, 'title')
contact_emails = _EventSettingProperty(event_contact_settings, 'emails')
contact_phones = _EventSettingProperty(event_contact_settings, 'phones')
Expand Down
6 changes: 4 additions & 2 deletions indico/modules/events/settings.py
Expand Up @@ -18,14 +18,15 @@

import os
import re
from datetime import timedelta
from functools import wraps

import yaml
from flask.helpers import get_root_path

from indico.core import signals
from indico.core.settings import ACLProxyBase, SettingProperty, SettingsProxyBase
from indico.core.settings.converters import DatetimeConverter
from indico.core.settings.converters import DatetimeConverter, TimedeltaConverter
from indico.core.settings.util import get_all_settings, get_setting, get_setting_acl
from indico.modules.events.models.settings import EventSetting, EventSettingPrincipal
from indico.util.caching import memoize
Expand Down Expand Up @@ -250,7 +251,8 @@ def get_themes_for(self, event_type):
'start_dt_override': None,
'end_dt_override': None,
'organizer_info': '',
'additional_info': ''
'additional_info': '',
'contrib_duration': TimedeltaConverter.from_python(timedelta(minutes=20))
}, converters={
'start_dt_override': DatetimeConverter,
'end_dt_override': DatetimeConverter
Expand Down

0 comments on commit 05f64a4

Please sign in to comment.