Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 7 additions & 2 deletions apps/base/tasks_export.py
Original file line number Diff line number Diff line change
Expand Up @@ -144,8 +144,13 @@ def export_db(stdout, table):
return

with app.test_client() as client:
for file_type in ["frab", "json", "ics"]:
url = f"/schedule/{year}.{file_type}"
for file_type, url_suffix in [
("frab", "frab.xml"),
("frab_json", "frab.json"),
("json", "json"),
("ics", "ics"),
]:
url = f"/schedule/{year}.{url_suffix}"
dest_path = os.path.join(path, "public", f"schedule.{file_type}")
response = client.get(url)
if response.status_code != 200:
Expand Down
2 changes: 1 addition & 1 deletion apps/schedule/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ def lineup_talk_redirect(year, proposal_id, slug=None):
def feed_redirect(fmt):
routes = {
"json": "schedule.schedule_json",
"frab": "schedule.schedule_frab",
"frab": "schedule.schedule_frab_xml",
"ical": "schedule.schedule_ical",
"ics": "schedule.schedule_ical",
}
Expand Down
65 changes: 54 additions & 11 deletions apps/schedule/feeds.py
Original file line number Diff line number Diff line change
@@ -1,26 +1,21 @@
import json

from flask import Response, abort, request
from flask import Response, abort, redirect, request, url_for
from flask import current_app as app
from flask_cors import cross_origin
from flask_login import current_user
from icalendar import Calendar, Event

from main import db, get_or_404
from main import db, external_url, get_or_404
from models import event_year
from models.cfp import Proposal
from models.user import User

from ..common import feature_enabled, feature_flag, json_response
from . import schedule
from .data import (
_convert_time_to_str,
_get_proposal_dict,
_get_scheduled_proposals,
_get_upcoming,
)
from .data import _convert_time_to_str, _get_proposal_dict, _get_scheduled_proposals, _get_upcoming
from .frab_exporter import FrabJsonExporter, FrabXmlExporter
from .historic import feed_historic
from .schedule_xml import export_frab


def _format_event_description(event):
Expand Down Expand Up @@ -64,6 +59,14 @@ def schedule_frab(year):
if year != event_year():
return feed_historic(year, "frab")

return redirect(url_for("schedule.schedule_frab_xml", year=year))


@schedule.route("/schedule/<int:year>.frab.xml")
def schedule_frab_xml(year):
if year != event_year():
return feed_historic(year, "frab")

if not feature_enabled("SCHEDULE"):
abort(404)

Expand All @@ -78,13 +81,53 @@ def schedule_frab(year):
.all()
)

schedule = [_get_proposal_dict(p, []) for p in schedule]
scheduled_content_only = request.args.get("scheduled_content_only") in ("true", "yes")
village_id = request.args.get("village_id")
venue_ids = request.args.get("venue_ids", "").split(",")

frab = export_frab(schedule)
exporter = FrabXmlExporter(
schedule, scheduled_content_only=scheduled_content_only, village_id=village_id, venue_ids=venue_ids
)
frab = exporter.run()

return Response(frab, mimetype="application/xml")


@schedule.route("/schedule/<int:year>.frab.json")
def schedule_frab_json(year):
if year != event_year():
return feed_historic(year, "frab_json")

if not feature_enabled("SCHEDULE"):
abort(404)

schedule = (
Proposal.query.filter(
Proposal.is_accepted,
Proposal.scheduled_time.isnot(None),
Proposal.scheduled_venue_id.isnot(None),
Proposal.scheduled_duration.isnot(None),
)
.order_by(Proposal.scheduled_time)
.all()
)

scheduled_content_only = request.args.get("scheduled_content_only") in ("true", "yes")
village_id = request.args.get("village_id")
venue_ids = request.args.get("venue_ids", "").split(",")

exporter = FrabJsonExporter(
schedule,
url=external_url("schedule.schedule_frab_json", year=year),
scheduled_content_only=scheduled_content_only,
village_id=village_id,
venue_ids=venue_ids,
)
frab = exporter.run()

return Response(json.dumps(frab, indent=4), mimetype="application/json")


@schedule.route("/schedule/<int:year>.ical")
@schedule.route("/schedule/<int:year>.ics")
def schedule_ical(year):
Expand Down
Loading
Loading