1
1
import json
2
- from datetime import timedelta
3
2
from icalendar import Calendar , Event
4
3
from flask import request , abort , current_app as app , redirect , url_for , Response
5
4
from flask_cors import cross_origin
6
5
from flask_login import current_user
7
- from math import ceil
8
6
9
- from main import external_url
10
- from models import event_year , event_start , event_end
7
+ from models import event_year
11
8
from models .user import User
12
9
from models .cfp import Proposal
13
10
14
11
from ..common import feature_flag , feature_enabled , json_response
15
- from .schedule_xml import export_frab , get_day_start_end , get_duration
12
+ from .schedule_json import export_frab_json
13
+ from .schedule_xml import export_frab
16
14
from .historic import feed_historic
17
15
from .data import (
18
16
_get_scheduled_proposals ,
19
17
_get_proposal_dict ,
20
18
_convert_time_to_str ,
21
19
_get_upcoming ,
22
20
)
23
- from . import event_tz , schedule
21
+ from . import schedule
24
22
25
23
26
24
def _format_event_description (event ):
@@ -37,9 +35,9 @@ def _format_event_description(event):
37
35
venue_str = event ["venue" ]
38
36
if event ["map_link" ]:
39
37
venue_str = f'{ venue_str } ({ event ["map_link" ]} )'
40
- footer_block .append (f' Venue: { venue_str } ' )
38
+ footer_block .append (f" Venue: { venue_str } " )
41
39
if footer_block :
42
- description += ' \n \n ' + ' \n ' .join (footer_block )
40
+ description += " \n \n " + " \n " .join (footer_block )
43
41
44
42
return description
45
43
@@ -78,102 +76,10 @@ def schedule_frab_json(year):
78
76
.all ()
79
77
)
80
78
81
- duration_days = ceil ((event_end () - event_end ()).total_seconds / 86400 )
82
-
83
- rooms = [proposal .scheduled_venue .name for proposal in schedule ]
84
-
85
- schedule_json = {
86
- "version" : "1.0-public" ,
87
- "conference" : {
88
- "acronym" : "emf{}" .format (event_year ()),
89
- "days" : [],
90
- "daysCount" : duration_days ,
91
- "end" : event_end ().strftime ("%Y-%m-%d" ),
92
- "rooms" : [
93
- {
94
- "name" : room ,
95
- }
96
- for room in rooms
97
- ],
98
- "start" : event_start ().strftime ("%Y-%m-%d" ),
99
- "time_zone_name" : event_tz ,
100
- "timeslot_duration" : "00:10" ,
101
- "title" : "Electromagnetic Field {}" .format (event_year ()),
102
- "url" : external_url ("main" ),
103
- },
104
- }
105
-
106
- for day in range (0 , duration_days ):
107
- day_dt = event_start () + timedelta (days = day )
108
- day_start , day_end = get_day_start_end (day_dt )
109
- day_schedule = {
110
- "date" : day_dt .strftime ("%Y-%m-%d" ),
111
- "day_end" : day_start .isoformat (),
112
- "day_start" : day_end .isoformat (),
113
- "index" : day ,
114
- "rooms" : {},
115
- }
116
- for room in rooms :
117
- day_schedule ["rooms" ][room ] = []
118
- for proposal in schedule :
119
- if proposal .scheduled_venue .name != room :
120
- # TODO find a better way to do that
121
- continue
122
- links = {
123
- proposal .c3voc_url ,
124
- proposal .youtube_url ,
125
- proposal .thumbnail_url ,
126
- proposal .map_link ,
127
- }
128
- links .discard (None )
129
- links .discard ("" )
130
- day_schedule ["rooms" ][room ].append (
131
- {
132
- "abstract" : None , # The proposal model does not implement abstracts
133
- "attachments" : [],
134
- "date" : event_tz .localize (proposal .start_date ).isoformat (),
135
- "description" : proposal .description ,
136
- "do_not_record" : proposal .video_privacy != "public" ,
137
- "duration" : get_duration (proposal .start_date , proposal .end_date ),
138
- "guid" : None ,
139
- "id" : proposal .id ,
140
- # This assumes there will never be a non-english talk,
141
- # which is probably fine for a conference in the UK.
142
- "language" : "en" ,
143
- "links" : sorted (links ),
144
- "persons" : [
145
- {
146
- "name" : name .strip (),
147
- "public_name" : name .strip (),
148
- }
149
- for name in (proposal .published_names or proposal .user .name ).split ("," )
150
- ],
151
- "recording_license" : "CC BY-SA 3.0" ,
152
- "room" : room ,
153
- "slug" : "emf{}-{}-{}" .format (
154
- event_year (),
155
- proposal .id ,
156
- proposal .slug ,
157
- ),
158
- "start" : event_tz .localize (proposal .start_date ).strftime ("%H:%M" ),
159
- "subtitle" : None ,
160
- "title" : proposal .display_title ,
161
- "track" : None ,
162
- "type" : proposal .type ,
163
- "url" : external_url (
164
- ".item" ,
165
- year = event_year (),
166
- proposal_id = proposal .id ,
167
- slug = proposal .slug ,
168
- ),
169
- }
170
- )
171
- schedule_json ["conference" ]["days" ].append (day_schedule )
172
-
173
79
return Response (
174
80
json .dumps (
175
81
{
176
- "schedule" : schedule_json ,
82
+ "schedule" : export_frab_json ( schedule ) ,
177
83
"$schema" : "https://c3voc.de/schedule/schema.json" ,
178
84
"generator" : {
179
85
"name" : "emfcamp-website" ,
@@ -187,7 +93,8 @@ def schedule_frab_json(year):
187
93
188
94
@schedule .route ("/schedule/<int:year>.frab" )
189
95
def schedule_frab (year ):
190
- return redirect (url_for ('schedule_frab_xml' , year = year ), code = 301 )
96
+ return redirect (url_for ("schedule_frab_xml" , year = year ), code = 301 )
97
+
191
98
192
99
@schedule .route ("/schedule/frab-<int:year>.xml" )
193
100
def schedule_frab_xml (year ):
0 commit comments