def test_populate_conference_days_invalid_parameters(self): """ Test populate_conference_days """ self.assertRaises(TypeError, populate_conference_days) self.assertRaises(TypeError, populate_conference_days, "string") self.assertRaises(TypeError, populate_conference_days, 123) self.assertRaises(TypeError, populate_conference_days, {}) conference = Conference() self.assertRaises(TypeError, populate_conference_days, conference) conference = Conference(start=datetime(2018, 3, 4)) self.assertRaises(TypeError, populate_conference_days, conference)
def test_populate_conference_days_4days(self): """ Test populate_conference_days """ conference = Conference(start=datetime(2018, 3, 4), end=datetime(2018, 3, 7), days=4) self.assertEqual(0, len(conference.day_objects)) populate_conference_days(conference) self.assertEqual(4, len(conference.day_objects)) # check first day test_day = conference.day_objects[0] self.assertTrue(isinstance(test_day.date, datetime)) self.assertEqual("2018-03-04", test_day.date.strftime("%Y-%m-%d")) # check second day test_day = conference.day_objects[1] self.assertTrue(isinstance(test_day.date, datetime)) self.assertEqual("2018-03-05", test_day.date.strftime("%Y-%m-%d")) # check third day test_day = conference.day_objects[2] self.assertTrue(isinstance(test_day.date, datetime)) self.assertEqual("2018-03-06", test_day.date.strftime("%Y-%m-%d")) # check fourth day test_day = conference.day_objects[3] self.assertTrue(isinstance(test_day.date, datetime)) self.assertEqual("2018-03-07", test_day.date.strftime("%Y-%m-%d"))
def test_populate_conference_days_0day(self): """ Test populate_conference_days """ conference = Conference(start=datetime(2018, 3, 4), end=datetime(2018, 3, 4), days=0) self.assertEqual(0, len(conference.day_objects)) populate_conference_days(conference) self.assertEqual(0, len(conference.day_objects))
def test_populate_conference_days_1day(self): """ Test populate_conference_days """ conference = Conference(start=datetime(2018, 3, 4), end=datetime(2018, 3, 4), days=1) self.assertEqual(0, len(conference.day_objects)) populate_conference_days(conference) self.assertEqual(1, len(conference.day_objects)) # check first day test_day = conference.day_objects[0] self.assertTrue(isinstance(test_day.date, datetime)) self.assertEqual("2018-03-04", test_day.date.strftime("%Y-%m-%d"))
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'])
import html import json import re import urllib.parse from xml.dom import minidom from pentabarf.Conference import Conference from pentabarf.Day import Day from pentabarf.Event import Event from pentabarf.Person import Person from pentabarf.Room import Room conference = Conference(title="Bibliothekartag 2020", start=date(2020, 5, 26), end=date(2020, 5, 29), days=4, timeslot_duration="00:30", venue="Hannover Congress Centrum (HCC)", city="Hannover") twitterHandles = {} if Path('cache/twitterhandles.json').is_file(): with open('cache/twitterhandles.json') as twitterFile: twitterData = json.load(twitterFile) for user in twitterData: if user["name"] in twitterHandles: print("WARNING: Found another twitter user with the same name", user["name"]) twitterHandles[user["name"]] = user["screen_name"] with open("cache/bibtag20-index.json") as file:
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 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(cast(Session.starts_at, DATE)) .filter_by(event_id=event_id) .filter_by(state='accepted') .filter(Session.deleted_at.is_(None)) .order_by(asc(Session.starts_at)).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.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: session_event = Event(id=session.id, date=session.starts_at, start=session.starts_at, duration=str(session.ends_at - session.starts_at) + "00:00", 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'])
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 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
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
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'])