1.1 --- a/EventAggregatorSupport.py Sun Aug 08 17:07:59 2010 +0200
1.2 +++ b/EventAggregatorSupport.py Fri Oct 22 01:13:28 2010 +0200
1.3 @@ -94,6 +94,14 @@
1.4 else:
1.5 return int(x)
1.6
1.7 +def sort_none_first(x, y):
1.8 + if x is None:
1.9 + return -1
1.10 + elif y is None:
1.11 + return 1
1.12 + else:
1.13 + return cmp(x, y)
1.14 +
1.15 # Utility classes and associated functions.
1.16
1.17 class Form:
1.18 @@ -841,6 +849,8 @@
1.19
1.20 return min(first, last), last
1.21
1.22 +# NOTE: Support coverage using times within days.
1.23 +
1.24 def getCoverage(start, end, events):
1.25
1.26 """
1.27 @@ -850,7 +860,7 @@
1.28 of the form (set of covered days, events).
1.29 """
1.30
1.31 - all_events = []
1.32 + all_events = {}
1.33 full_coverage = set()
1.34
1.35 # Get event details.
1.36 @@ -867,28 +877,39 @@
1.37 event_start = max(event_details["start"], start)
1.38 event_end = min(event_details["end"], end)
1.39 event_coverage = set(event_start.days_until(event_end))
1.40 + event_location = event_details.get("location")
1.41
1.42 # Update the overall coverage.
1.43
1.44 full_coverage.update(event_coverage)
1.45
1.46 - # Try and fit the event into the events list.
1.47 -
1.48 - for i, (coverage, covered_events) in enumerate(all_events):
1.49 -
1.50 - # Where the event does not overlap with the current
1.51 - # element, add it alongside existing events.
1.52 + # Add a new events list for a new location.
1.53 + # Locations can be unspecified, thus None refers to all unlocalised
1.54 + # events.
1.55
1.56 - if not coverage.intersection(event_coverage):
1.57 - covered_events.append(event)
1.58 - all_events[i] = coverage.union(event_coverage), covered_events
1.59 - break
1.60 + if not all_events.has_key(event_location):
1.61 + all_events[event_location] = [(event_coverage, [event])]
1.62
1.63 - # Make a new element in the list if the event cannot be
1.64 - # marked alongside existing events.
1.65 + # Try and fit the event into an events list.
1.66
1.67 else:
1.68 - all_events.append((event_coverage, [event]))
1.69 + slot = all_events[event_location]
1.70 +
1.71 + for i, (coverage, covered_events) in enumerate(slot):
1.72 +
1.73 + # Where the event does not overlap with the current
1.74 + # element, add it alongside existing events.
1.75 +
1.76 + if not coverage.intersection(event_coverage):
1.77 + covered_events.append(event)
1.78 + slot[i] = coverage.union(event_coverage), covered_events
1.79 + break
1.80 +
1.81 + # Make a new element in the list if the event cannot be
1.82 + # marked alongside existing events.
1.83 +
1.84 + else:
1.85 + slot.append((event_coverage, [event]))
1.86
1.87 return full_coverage, all_events
1.88