Skip to content

Commit

Permalink
Outlook: Allow custom reminder config (#183)
Browse files Browse the repository at this point in the history
  • Loading branch information
alexiri authored Dec 10, 2024
1 parent f02841b commit 70395db
Show file tree
Hide file tree
Showing 3 changed files with 123 additions and 19 deletions.
26 changes: 21 additions & 5 deletions outlook/indico_outlook/calendar.py
Original file line number Diff line number Diff line change
Expand Up @@ -68,17 +68,32 @@ def update_calendar():
def _get_status(user, event, settings):
from indico_outlook.plugin import OutlookPlugin
status = OutlookPlugin.user_settings.get(user, 'status', settings['status'])
for override in OutlookPlugin.user_settings.get(user, 'status_overrides'):
for override in OutlookPlugin.user_settings.get(user, 'overrides'):
if override['type'] == 'category' and override['id'] == event.category_id:
# we don't keep going for a specific category Id match
# we don't keep going for a specific category id match
return override['status']
elif override['type'] == 'category_tree' and override['id'] in event.category_chain:
# for category tree matches we keep going in case there's a specific match later.
# we don't try to see which one is more specific becauase that'd be overkill!
# we don't try to see which one is more specific because that'd be overkill!
status = override['status']
return status


def _get_reminder(user, event, settings):
from indico_outlook.plugin import OutlookPlugin
reminder = OutlookPlugin.user_settings.get(user, 'reminder', settings['reminder'])
reminder_minutes = OutlookPlugin.user_settings.get(user, 'reminder_minutes', settings['reminder_minutes'])
for override in OutlookPlugin.user_settings.get(user, 'overrides'):
if override['type'] == 'category' and override['id'] == event.category_id:
# we don't keep going for a specific category id match
return override.get('reminder', reminder), override.get('reminder_minutes', reminder_minutes)
elif override['type'] == 'category_tree' and override['id'] in event.category_chain:
# for category tree matches we keep going in case there's a specific match later.
# we don't try to see which one is more specific becauase that'd be overkill!
reminder = override.get('reminder', reminder), override.get('reminder_minutes', reminder_minutes)
return reminder, reminder_minutes


def _update_calendar_entry(entry, settings):
"""Executes a single calendar update
Expand Down Expand Up @@ -109,6 +124,7 @@ def _update_calendar_entry(entry, settings):
location = strip_control_chars(event.room_name)
description = strip_control_chars(event.description)
event_url = event.external_url
reminder, reminder_minutes = _get_reminder(user, event, settings)
data = {
'status': _get_status(user, event, settings),
'start': int(event.start_dt.timestamp()),
Expand All @@ -117,8 +133,8 @@ def _update_calendar_entry(entry, settings):
# XXX: the API expects 'body', we convert it below
'description': f'<a href="{event_url}">{event_url}</a><br><br>{description}',
'location': location,
'reminder_on': settings['reminder'],
'reminder_minutes': settings['reminder_minutes']
'reminder_on': reminder,
'reminder_minutes': reminder_minutes,
}

# check whether the plugins want to add/override any data
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
"""Update user setting
Revision ID: da9deaa182a4
Revises: 6093a83228a7
Create Date: 2024-11-17 11:13:13.705549
"""

from alembic import op


# revision identifiers, used by Alembic.
revision = 'da9deaa182a4'
down_revision = '6093a83228a7'
branch_labels = None
depends_on = None


def upgrade():
# Rename status_overrides to overrides
op.execute('''
UPDATE users.settings
SET name = 'overrides'
WHERE module = 'plugin_outlook' AND name = 'status_overrides'
''')
# Add the default settings
op.execute('''
UPDATE users.settings
SET value = (
SELECT jsonb_agg(
elem || '{"reminder": true, "reminder_minutes": 15}'
)
FROM jsonb_array_elements(value) AS elem
)
WHERE module = 'plugin_outlook' AND name = 'overrides'
''')


def downgrade():
# Remove the default settings
op.execute('''
UPDATE users.settings
SET value = (
SELECT jsonb_agg(
elem - 'reminder' - 'reminder_minutes'
)
FROM jsonb_array_elements(value) AS elem
)
WHERE module = 'plugin_outlook' AND name = 'overrides'
''')
# Rename the field back to status_overrides
op.execute('''
UPDATE users.settings
SET name = 'status_overrides'
WHERE module = 'plugin_outlook' AND name = 'overrides'
''')
61 changes: 47 additions & 14 deletions outlook/indico_outlook/plugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -59,42 +59,73 @@ class SettingsForm(IndicoForm):

class OutlookUserPreferences(ExtraUserPreferences):
fields = {
'outlook_active': BooleanField(_('Sync with Outlook'), widget=SwitchWidget(),
description=_('Add Indico events in which I participate to my Outlook '
'calendar')),
'outlook_status': SelectField(_('Outlook entry status'), [HiddenUnless('extra_outlook_active',
preserve_data=True)],
choices=_status_choices,
description=_('The status for Outlook Calendar entries')),
'outlook_status_overrides': MultipleItemsField(
_('Outlook entry status overrides'),
'outlook_active': BooleanField(
_('Sync with Outlook'),
widget=SwitchWidget(),
description=_('Add Indico events in which I participate to my Outlook calendar'),
),
'outlook_status': SelectField(
_('Outlook entry status'),
[HiddenUnless('extra_outlook_active', preserve_data=True)],
choices=_status_choices,
description=_('The status for Outlook Calendar entries'),
),
'outlook_reminder': BooleanField(
_('Outlook reminders'),
[HiddenUnless('extra_outlook_active', preserve_data=True)],
widget=SwitchWidget(),
description=_('Enable reminder for Outlook Calendar entries'),
),
'outlook_reminder_minutes': IntegerField(
_('Outlook reminder time'),
[HiddenUnless('extra_outlook_active', preserve_data=True), NumberRange(min=0)],
description=_('Remind X minutes before the event'),
),
'outlook_overrides': MultipleItemsField(
_('Outlook overrides'),
[HiddenUnless('extra_outlook_active', preserve_data=True)],
fields=[
{'id': 'type', 'caption': _('Type'), 'required': True, 'type': 'select'},
{'id': 'id', 'caption': _('Category ID'), 'required': True, 'type': 'number', 'step': 1, 'coerce': int},
{'id': 'status', 'caption': _('Status'), 'required': True, 'type': 'select'},
{'id': 'reminder', 'caption': _('Reminder'), 'required': True, 'type': 'checkbox'},
{
'id': 'reminder_minutes',
'caption': _('Reminder time'),
'required': True,
'type': 'number',
'step': 1,
'coerce': int,
},
],
choices={
'type': {'category': _('Category'), 'category_tree': _('Category & Subcategories')},
'status': dict(_status_choices),
},
description=_('You can override the calendar entry status for specific categories.')
)
description=_('You can override the calendar entry configuration for specific categories.'),
),
}

def load(self):
default_status = OutlookPlugin.settings.get('status')
default_reminder = OutlookPlugin.settings.get('reminder')
default_reminder_minutes = OutlookPlugin.settings.get('reminder_minutes')
return {
'outlook_active': OutlookPlugin.user_settings.get(self.user, 'enabled'),
'outlook_status': OutlookPlugin.user_settings.get(self.user, 'status', default_status),
'outlook_status_overrides': OutlookPlugin.user_settings.get(self.user, 'status_overrides', [])
'outlook_reminder': OutlookPlugin.user_settings.get(self.user, 'reminder', default_reminder),
'outlook_reminder_minutes': OutlookPlugin.user_settings.get(self.user,
'reminder_minutes', default_reminder_minutes),
'outlook_overrides': OutlookPlugin.user_settings.get(self.user, 'overrides', []),
}

def save(self, data):
OutlookPlugin.user_settings.set_multi(self.user, {
'enabled': data['outlook_active'],
'status': data['outlook_status'],
'status_overrides': data['outlook_status_overrides']
'reminder': data['outlook_reminder'],
'reminder_minutes': data['outlook_reminder_minutes'],
'overrides': data['outlook_overrides'],
})


Expand Down Expand Up @@ -122,7 +153,9 @@ class OutlookPlugin(IndicoPlugin):
default_user_settings = {
'enabled': True, # XXX: if the default value ever changes, adapt `get_participating_users`!
'status': None,
'status_overrides': [],
'reminder': True,
'reminder_minutes': 15,
'overrides': [],
}

def init(self):
Expand Down

0 comments on commit 70395db

Please sign in to comment.