agenda: overlapping events marked in the availability bars

Closes #4143
This commit is contained in:
Serghei Mihai 2014-05-30 15:25:41 +02:00
parent 3e29d8ecb3
commit ae79c334a0
3 changed files with 29 additions and 7 deletions

View File

@ -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):

View File

@ -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)

View File

@ -178,7 +178,7 @@ li.away {
background: #ccc;
}
li.common {
li.overlap {
background: #d500a5;
}