def export(event_id): """Takes an event id and returns the event in pentabarf XML format""" event = EventModel.query.get(event_id) diff = event.ends_at - event.starts_at conference = Conference( title=event.name, start=event.starts_at, end=event.ends_at, days=diff.days if diff.days > 0 else 1, day_change="00:00", timeslot_duration="00:15", venue=event.location_name, ) dates = ( db.session.query(func.date(Session.starts_at, type_=Date)) # type_ needed for sqlite .filter_by(event_id=event_id).filter_by(state='accepted').filter( Session.deleted_at.is_(None)).order_by( asc(func.date(Session.starts_at))).distinct().all()) for date in dates: date = date[0] if date is None: continue # Cannot continue if date is missing day = Day(date=date) microlocation_ids = list( db.session.query(Session.microlocation_id).filter( func.date(Session.starts_at) == date).filter_by( state='accepted').filter( Session.deleted_at.is_(None)).order_by( asc(Session.microlocation_id)).distinct()) for microlocation_tuple in microlocation_ids: microlocation_id = microlocation_tuple[0] if microlocation_id: microlocation = Microlocation.query.get(microlocation_id) sessions = (Session.query.filter_by( microlocation_id=microlocation_id).filter( func.date(Session.starts_at) == date).filter_by( state='accepted').filter( Session.deleted_at.is_(None)).order_by( asc(Session.starts_at)).all()) room = Room(name=microlocation.name) for session in sessions: if session.ends_at is None or session.starts_at is None: duration = "" else: duration = format_timedelta(session.ends_at - session.starts_at) session_event = Event( id=session.id, date=session.starts_at, start=session.starts_at.strftime('%H:%M'), duration=duration, track=session.track.name, abstract=session.short_abstract, title=session.title, type='Talk', description=session.long_abstract, conf_url=url_for('v1.event_list', identifier=event.identifier), full_conf_url=url_for( 'v1.event_list', identifier=event.identifier, _external=True, ), released="True" if event.schedule_published_on else "False", ) for speaker in session.speakers: person = Person(id=speaker.id, name=speaker.name) session_event.add_person(person) room.add_event(session_event) day.add_room(room) conference.add_day(day) return conference.generate("Generated by " + get_settings()['app_name'])
cleanr = re.compile( '</?u>|<sup>\d+(,\s*\d+)*</sup>') authors = re.sub( cleanr, '', presentationData['aut']).split(',') for author in authors: if author.strip( ) in twitterHandles: personList.append( "@" + twitterHandles[ author.strip()]) else: personList.append( author.strip()) person = Person( name=author.strip()) presentationObject.add_person( person) tweetContent = urllib.parse.quote_plus( html.unescape( presentationData['titleplain']) + ' | ' + ", ".join(personList)) presentationObject.abstract += '<p><a href="https://twitter.com/intent/tweet?hashtags=bibtag20&text=' + tweetContent + '">Tweet</a></p>' room.add_event(presentationObject) eventsAdded = True else: print( "WARNING: Found several presentations at the same time in this session", session['id'], session['title'],
def export(event_id): event = DataGetter.get_event(event_id) diff = (event.end_time - event.start_time) tz = event.timezone or 'UTC' tz = pytz.timezone(tz) conference = Conference(title=event.name, start=tz.localize(event.start_time), end=tz.localize(event.end_time), days=diff.days if diff.days > 0 else 1, day_change="00:00", timeslot_duration="00:15", venue=event.location_name) dates = (db.session.query(cast(Session.start_time, DATE)).filter_by( event_id=event_id).filter_by(state='accepted').filter( Session.deleted_at.is_(None)).order_by(asc( Session.start_time)).distinct().all()) for date in dates: date = date[0] day = Day(date=date) microlocation_ids = list( db.session.query(Session.microlocation_id).filter( func.date(Session.start_time) == date).filter_by( state='accepted').filter( Session.deleted_at.is_(None)).order_by( asc(Session.microlocation_id)).distinct()) for microlocation_id in microlocation_ids: microlocation_id = microlocation_id[0] microlocation = DataGetter.get_microlocation(microlocation_id) sessions = Session.query.filter_by(microlocation_id=microlocation_id) \ .filter(func.date(Session.start_time) == date) \ .filter_by(state='accepted') \ .filter(Session.deleted_at.is_(None)) \ .order_by(asc(Session.start_time)).all() room = Room(name=microlocation.name) for session in sessions: session_event = Event( id=session.id, date=tz.localize(session.start_time), start=tz.localize( session.start_time).strftime("%H:%M"), duration=format_timedelta(session.end_time - session.start_time), track=session.track.name, abstract=session.short_abstract, title=session.title, type='Talk', description=session.long_abstract, conf_url=url_for( 'event_detail.display_event_detail_home', identifier=event.identifier), full_conf_url=url_for( 'event_detail.display_event_detail_home', identifier=event.identifier, _external=True), released="True" if event.schedule_published_on else "False") for speaker in session.speakers: person = Person(id=speaker.id, name=speaker.name) session_event.add_person(person) room.add_event(session_event) day.add_room(room) conference.add_day(day) return conference.generate("Generated by " + get_settings()['app_name'])
def read_json(json_input_file, json_schema_file): """ Read and parse the conference schedule JSON file """ # check parameter type if not isinstance(json_input_file, str): raise TypeError("parameter json_input_file should be a string/path") if not isinstance(json_schema_file, str): raise TypeError("parameter json_schema_file should be a string/path") # check if files exist if not isfile(json_input_file): raise IOError("Inputfile '%s' does not exist" % json_input_file) if not isfile(json_schema_file): raise IOError("Schema file '%s' does not exist" % json_schema_file) # read event data file with open(json_input_file) as json_data: try: newline_data = json.load(json_data) except ValueError: raise ValueError( "Inputfile '%s' contains invalid JSON" % json_input_file ) # validate conference data json file with open(json_schema_file) as json_schema: try: schema = json.load(json_schema) except ValueError: raise ValueError( "Schema file '%s' contains invalid JSON" % json_schema_file ) validate(newline_data, schema) # read conference data from json file timezone_name = newline_data.get('event_timezone') or "Europe/Brussels" conf_timezone = timezone(timezone_name) start_day = datetime.fromtimestamp( float(newline_data.get('event_start')), conf_timezone ) end_day = datetime.fromtimestamp( float(newline_data.get('event_end')), conf_timezone ) conference_days = 1 + int( (abs(end_day - start_day)).total_seconds() / (3600 * 24) ) # create conference instance conf = Conference( title=newline_data.get('event_name') or "Event Name", venue=newline_data.get('event_venue') or "Venue", city=newline_data.get('event_city') or "City", start=start_day, end=end_day, days=conference_days, day_change='06:00', timeslot_duration='00:30' ) populate_conference_days(conf) # loop over events in json data file to create schedule instances for event in newline_data.get('event_schedule'): # only add event if the scheduled status is final # else jump to the next event if not event.get('scheduled') == 'final': continue tmp_event_date = datetime.fromtimestamp( float(event.get('start')), conf_timezone ) tmp_duration = time.strftime( "%H:%M:%S", time.gmtime(event.get('duration')) ) # create event tmp_event = Event( id=event.get('id'), title=event.get('name'), description=event.get('description'), type=event.get('type'), duration=tmp_duration, date=tmp_event_date, start=tmp_event_date.strftime("%H:%M:%S") ) # add speakers to event for speaker in event.get('speakers'): tmp_event.add_person(Person(name=speaker)) add_event2conference( conf, tmp_event, event.get('rooms') ) return conf
def parse(string): root = ET.fromstring(string) conference_element = root.find('conference') conference = Conference( title=conference_element.find('title').text, start=datetime.strptime( conference_element.find('start').text, '%Y-%m-%d'), end=datetime.strptime( conference_element.find('end').text, '%Y-%m-%d'), days=int(conference_element.find('days').text), day_change=conference_element.find('day_change').text, city=conference_element.find('city').text, timeslot_duration=conference_element.find( 'timeslot_duration').text, venue=conference_element.find('venue').text, ) for day_element in root.findall('day'): day = Day(date=datetime.strptime(day_element.get('date'), '%Y-%m-%d'), index=int(day_element.get('index'))) for room_element in day_element.findall('room'): room = Room(name=room_element.get('name')) for event_element in room_element.findall('event'): event = Event(id=int(event_element.get('id')), date=day.date, start=get_text(event_element, 'start'), duration=get_text(event_element, 'duration'), track=get_text(event_element, 'track'), abstract=get_text(event_element, 'abstract'), title=get_text(event_element, 'title'), type=get_text(event_element, 'type'), description=get_text(event_element, 'description'), conf_url=get_text(event_element, 'conf_url'), full_conf_url=get_text( event_element, 'conf_url'), level=get_text(event_element, 'level')) persons_element = event_element.find('persons') for person_element in persons_element.findall('person'): person = Person( id=int(person_element.get('id')), name=person_element.text, ) event.add_person(person) links_element = event_element.find('links') if links_element: for link_element in links_element.findall('link'): link_url = link_element.get('href') if not event.video_url and ( 'mp4' in link_url or 'webm' in link_url or 'youtube' in link_url or 'avi' in link_url): event.video_url = link_url if not event.audio_url and ( 'mp3' in link_url or 'wav' in link_url or 'soundcloud' in link_url): event.audio_url = link_url if not event.slides_url and ( 'ppt' in link_url or 'pptx' in link_url or 'slide' in link_url): event.slides_url = link_url room.add_event(event) day.add_room(room) conference.add_day(day) return conference