Skip to content

Commit

Permalink
Merge pull request #18 from zuntrax/entrypoint
Browse files Browse the repository at this point in the history
[WIP] Proper entry point
  • Loading branch information
derpeter authored Jun 24, 2017
2 parents d3afe00 + 0be1f21 commit 92de82d
Show file tree
Hide file tree
Showing 21 changed files with 475 additions and 210 deletions.
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

0 comments on commit 92de82d

Please sign in to comment.