Skip to content

Commit

Permalink
URI shortcut for upcoming category event
Browse files Browse the repository at this point in the history
- This resolves indico#3388.
  • Loading branch information
Ergys Dona committed Jul 9, 2018
1 parent 729aa96 commit bbad4a4
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 6 deletions.
13 changes: 8 additions & 5 deletions indico/modules/categories/blueprint.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,11 +22,11 @@
from indico.modules.categories.controllers.admin import RHManageUpcomingEvents
from indico.modules.categories.controllers.display import (RHCategoryCalendarView, RHCategoryIcon, RHCategoryInfo,
RHCategoryLogo, RHCategoryOverview, RHCategorySearch,
RHCategoryStatistics, RHDisplayCategory, RHEventList,
RHExportCategoryAtom, RHExportCategoryICAL,
RHReachableCategoriesInfo, RHShowFutureEventsInCategory,
RHShowPastEventsInCategory, RHSubcatInfo,
RHXMLExportCategoryInfo)
RHCategoryStatistics, RHCategoryUpcomingEvent,
RHDisplayCategory, RHEventList, RHExportCategoryAtom,
RHExportCategoryICAL, RHReachableCategoriesInfo,
RHShowFutureEventsInCategory, RHShowPastEventsInCategory,
RHSubcatInfo, RHXMLExportCategoryInfo)
from indico.modules.categories.controllers.management import (RHCreateCategory, RHDeleteCategory, RHDeleteEvents,
RHDeleteSubcategories, RHManageCategoryContent,
RHManageCategoryIcon, RHManageCategoryLogo,
Expand All @@ -46,6 +46,9 @@ def _redirect_event_creation(category_id, event_type):
_bp = IndicoBlueprint('categories', __name__, template_folder='templates', virtual_template_folder='categories',
url_prefix='/category/<int:category_id>')

# Upcoming event of the category
_bp.add_url_rule('/upcoming', 'category_upcoming', RHCategoryUpcomingEvent, methods=('GET',))

# Category management
_bp.add_url_rule('/manage/', 'manage_content', RHManageCategoryContent)
_bp.add_url_rule('/manage/delete', 'delete', RHDeleteCategory, methods=('POST',))
Expand Down
27 changes: 26 additions & 1 deletion indico/modules/categories/controllers/display.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,13 +26,14 @@

import dateutil
from dateutil.relativedelta import relativedelta
from flask import Response, jsonify, request, session
from flask import Response, flash, jsonify, redirect, request, session
from pytz import utc
from sqlalchemy.orm import joinedload, load_only, subqueryload, undefer, undefer_group
from werkzeug.exceptions import BadRequest, NotFound

from indico.core.db import db
from indico.core.db.sqlalchemy.colors import ColorTuple
from indico.core.db.sqlalchemy.util.queries import get_n_matching
from indico.modules.categories.controllers.base import RHDisplayCategoryBase
from indico.modules.categories.legacy import XMLCategorySerializer
from indico.modules.categories.models.categories import Category
Expand Down Expand Up @@ -670,3 +671,27 @@ def _get_event_data(self, event_query):
def _render_ongoing_events(self, ongoing_events):
template = get_template_module('categories/display/_calendar_ongoing_events.html')
return template.render_ongoing_events(ongoing_events, self.category.display_tzinfo)


class RHCategoryUpcomingEvent(RHDisplayCategoryBase):
"""Redirect to the upcoming event of a category."""

def _process(self):
event_id = self._get_upcoming_event()
if event_id:
resp = redirect(url_for('events.display', confId=event_id))
else:
flash(_('There are no upcoming events for this category'))
resp = redirect(url_for('categories.display', category_id=self.category.id))
return resp

def _get_upcoming_event(self):
query = (Event.query
.filter(Event.is_visible_in(self.category),
Event.start_dt > now_utc())
.options(load_only('id', 'start_dt'))
.order_by(Event.start_dt)
.order_by(Event.id)) # in case two events start exactly at the same time
res = get_n_matching(query, 1, lambda event: event.can_access(session.user))
if res:
return res[0].id

0 comments on commit bbad4a4

Please sign in to comment.