Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[WIP] Proper entry point #18

Merged
merged 15 commits into from
Jun 24, 2017
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,7 @@ ENV/

# data we work with
*.conf
*.ini
*.xml
*.csv
*.json
Expand Down
150 changes: 0 additions & 150 deletions CSV/__main__.py

This file was deleted.

20 changes: 0 additions & 20 deletions CSV/config.conf.example

This file was deleted.

38 changes: 0 additions & 38 deletions demo.py

This file was deleted.

11 changes: 11 additions & 0 deletions fahrplan/model/day.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,13 @@ def __init__(self, index: int, date: dt.date, start: dt.datetime = None, end: dt
self.start = start
self.end = end
self.rooms = {}
self.schedule = None

def add_room(self, room: Room):
if room.name not in self.rooms:
self.rooms[room.name] = room
room.day = self
# TODO (zuntrax) logging

def add_event(self, room: str, event: Event):
self.rooms[room].add_event(event)
Expand Down Expand Up @@ -52,6 +55,14 @@ def get_end(self):
except ValueError:
raise FahrplanError(f"Day {self.index} has no events, cannot infer timestamps")

def merge(self, other: 'Day'):
for name, room in other.rooms.items():
if name in self.rooms:
self.rooms[name].merge(room)
else:
self.rooms[name] = room
room.day = self

def append_xml(self, xml: XmlWriter, extended: bool):
with xml.context("day", index=self.index, date=self.date,
start=format_datetime(self.get_start()),
Expand Down
2 changes: 1 addition & 1 deletion fahrplan/model/event.py
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ def append_xml(self, xml: XmlWriter, extended: bool):
xml.tag("date", format_datetime(self.date))
xml.tag("start", format_time(self.start))
xml.tag("duration", format_duration(self.duration))
xml.tag("room", self.room)
xml.tag("room", self.room.name)
xml.tag("slug", self.slug)
with xml.context("recording"):
xml.tag("license", self.rec_license)
Expand Down
9 changes: 8 additions & 1 deletion fahrplan/model/room.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,10 @@ class Room(XmlSerializable):
def __init__(self, name: str):
self.name = name
self.events = dict()
self.day = None

def add_event(self, event: Event):
event.room = self.name
event.room = self
self.events[event.id] = event

def get_start(self):
Expand All @@ -25,6 +26,12 @@ def get_end(self):
# No events assigned
return None

def merge(self, other: 'Room'):
for uid, event in other.events.items():
if self.day.schedule.has_collision(event):
continue
self.add_event(event)

def append_xml(self, xml: XmlWriter, extended: bool):
with xml.context("room", name=self.name):
for event in self.events.values():
Expand Down
41 changes: 41 additions & 0 deletions fahrplan/model/schedule.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import logging

from datetime import date as _date, timedelta
from typing import Dict, List

Expand All @@ -9,6 +11,9 @@
from .room import Room


log = logging.getLogger(__name__)


class Schedule(XmlSerializable):
def __init__(self, conference: Conference, days: Dict[int, Day] = None, version: str = "1.0"):
self.conference = conference
Expand All @@ -28,6 +33,9 @@ def __init__(self, conference: Conference, days: Dict[int, Day] = None, version:
date: _date = conference.start + timedelta(i)
self.days[index] = Day(index=index, date=date)

for day in self.days.values():
day.schedule = self

self.version = version

def add_day(self, day: Day):
Expand All @@ -36,6 +44,7 @@ def add_day(self, day: Day):
:return: None
"""
self.days[day.index] = day
day.schedule = self
self.conference.day_count += 1

def add_room(self, name: str, day_filter: List[int] = None):
Expand All @@ -52,6 +61,38 @@ def add_room(self, name: str, day_filter: List[int] = None):
def add_event(self, day: int, room: str, event: Event):
self.days[day].add_event(room, event)

def merge(self, other: 'Schedule'):
if self.conference.acronym != other.conference.acronym:
log.warning(f'Conference acronym mismatch: "{self.conference.acronym}" != '
f'"{other.conference.acronym}". Are you sure you are using compatible data?')

for index, day in other.days.items():
if index in self.days:
self.days[index].merge(day)
else:
self.days[index] = day
day.schedule = self

if len(self.days) != self.conference.day_count:
log.warning('Day count mismatch, adjusting.')
return self # needed to be able to chain calls

def has_collision(self, new_event: 'Event'):
for day in self.days.values():
for room in day.rooms.values():
for event in room.events.values():
if event.slug == new_event.slug:
log.error(f'Duplicate slug "{event.slug}"')
return True
if event.id == new_event.id:
log.error(f'Duplicate event id "{event.id}"')
return True
if event.guid == new_event.guid:
log.error(f'Duplicate guid "{event.guid}"')
return True
else:
return False

def append_xml(self, xml: XmlWriter, extended: bool):
with xml.context("schedule"):
xml.tag("version", self.version)
Expand Down
16 changes: 16 additions & 0 deletions fake2extended.ini.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
[import]
active = fake

[import:fake]
type = fake

[export]
active = basic,extended

[export:basic]
type = xml-basic
path = /tmp/schedule-basic.xml

[export:extended]
type = xml-extended
path = /tmp/schedule-extended.xml
Loading