From ae79c334a0da9562f9398dd039da16fc0f307c02 Mon Sep 17 00:00:00 2001 From: Serghei MIHAI Date: Fri, 30 May 2014 15:25:41 +0200 Subject: [PATCH] agenda: overlapping events marked in the availability bars Closes #4143 --- calebasse/agenda/managers.py | 26 ++++++++++++++++++++++++-- calebasse/agenda/views.py | 8 ++++---- calebasse/static/css/agenda.css | 2 +- 3 files changed, 29 insertions(+), 7 deletions(-) diff --git a/calebasse/agenda/managers.py b/calebasse/agenda/managers.py index cfa892bb..beb63475 100644 --- a/calebasse/agenda/managers.py +++ b/calebasse/agenda/managers.py @@ -78,9 +78,9 @@ class EventQuerySet(InheritanceQuerySet): quarter = 0 interval = IntervalSet.between(start_datetime, end_datetime, False) mins = quarter * 15 - crossed_events = filter(lambda e: e.start_datetime <= start_datetime and e.end_datetime >= end_datetime, events) + crossed_events = self.overlap_occurences(start_datetime, events) if len(crossed_events) > 1: - result[start_datetime.hour][quarter].append((mins, {'id': participant.id, 'dispo': 'common'})) + result[start_datetime.hour][quarter].append((mins, {'id': participant.id, 'dispo': 'overlap'})) elif interval.intersection(events_intervals): result[start_datetime.hour][quarter].append((mins, {'id': participant.id, 'dispo': 'busy'})) elif interval.intersection(holidays_intervals): @@ -94,6 +94,28 @@ class EventQuerySet(InheritanceQuerySet): end_datetime += timedelta(minutes=15) return result + def overlap_occurences(self, date_time=None, events=None): + """ + returns the list of overlapping event occurences which do not begin and end + at the same time and have the same act type + """ + date_time = date_time or datetime.now() + events = events or self.today_occurrences(date_time.date()) + overlap = filter(lambda e: e.start_datetime <= date_time and e.end_datetime > date_time, events) + same_type_events = [] + different_overlap = [] + for event in overlap: + if different_overlap: + for e in different_overlap: + if event.start_datetime == e.start_datetime and \ + event.end_datetime == e.end_datetime and \ + event.act_type == e.act_type: + continue + different_overlap.append(event) + else: + different_overlap.append(event) + return different_overlap + class EventManager(PassThroughManager.for_queryset_class(EventQuerySet), InheritanceManager): diff --git a/calebasse/agenda/views.py b/calebasse/agenda/views.py index 9f586c7b..e870de57 100644 --- a/calebasse/agenda/views.py +++ b/calebasse/agenda/views.py @@ -630,11 +630,11 @@ class AjaxDisponibilityColumnView(TemplateView): if events: for event in events: - if event.start_datetime <= start_datetime and event.end_datetime >= end_datetime: + overlap_events = Event.objects.overlap_occurences(start_datetime, events) + if len(overlap_events) > 1: + dispo = 'overlap' + elif event.start_datetime <= start_datetime and event.end_datetime >= end_datetime: dispo = 'busy' - crossed_events = filter(lambda e: e.start_datetime <= start_datetime and e.end_datetime >= end_datetime, events) - if len(crossed_events) > 1: - dispo = 'common' disponibility[start_datetime.hour][quarter].append((mins, {'id': ressource_id, 'dispo': dispo})) quarter += 1 start_datetime += datetime.timedelta(minutes=15) diff --git a/calebasse/static/css/agenda.css b/calebasse/static/css/agenda.css index 596db9e6..9e8afb80 100644 --- a/calebasse/static/css/agenda.css +++ b/calebasse/static/css/agenda.css @@ -178,7 +178,7 @@ li.away { background: #ccc; } -li.common { +li.overlap { background: #d500a5; }