Exemple #1
0
 def _init_bubble_painter(self):
     self._bubble_painter = BubblePainter(self)
Exemple #2
0
class MonthViewPresenter(MonthEventHorizon):
    name = 'month'

    def _initialize(self):
        MonthEventHorizon._initialize(self)

        self._init_day_indexes_from_weeks()

        self._init_prev_datetime()
        self._init_next_datetime()

        self._init_navigation()
        self._init_bubble_painter()

    def _init_day_indexes_from_weeks(self):
        self._idx_month_day = {}
        self.all_days = []

        for week in self.weeks:
            for day in week:
                self._idx_month_day.setdefault(day.month, {})[day.day] = day
                self.all_days.append(day)

    def _init_prev_datetime(self):
        prior = prior_month(self.focus_datetime.year,
                            self.focus_datetime.month)
        monthrange = calendar.monthrange(prior[0], prior[1])

        if self.focus_datetime.day <= monthrange[1]:
            day = self.focus_datetime.day
        else:
            day = monthrange[1]

        self.prev_datetime = datetime.datetime(prior[0], prior[1], day)

    def _init_next_datetime(self):
        next = next_month(self.focus_datetime.year, self.focus_datetime.month)
        monthrange = calendar.monthrange(next[0], next[1])

        if self.focus_datetime.day <= monthrange[1]:
            day = self.focus_datetime.day
        else:
            day = monthrange[1]

        self.next_datetime = datetime.datetime(next[0], next[1], day)

    def _init_bubble_painter(self):
        self._bubble_painter = BubblePainter(self)

    def paint_events(self, events):
        by_start_date = operator.attrgetter('startDate')

        for event in sorted(events, key=by_start_date):
            if self._bubble_painter.should_paint_event(event):
                self._bubble_painter.paint_event(event)
            else:
                self._paint_event_without_bubble(event)

        self._add_bubble_titles_to_successive_weeks()

    def _paint_event_without_bubble(self, event):
        days = self.days_in_range_of_event(event)

        for day in days:
            if None in day.event_slots:
                slot_index = day.event_slots.index(None)
                tpl_event = self.make_event_for_template(day, event)
                tpl_event.bubbled = False
                day.event_slots[slot_index] = tpl_event
            else:
                day.overflowed_events.append(event)

    def days_in_range_of_event(self, event):
        ''' Find all of the days (DayOnMonthView) that are affected
        by an event. '''
        days = []

        if event.startDate < self.first_moment:
            starts_at = self.first_moment
        else:
            starts_at = event.startDate

        if event.endDate > self.last_moment:
            ends_at = self.last_moment
        else:
            ends_at = event.endDate

        dt = datetime.datetime(starts_at.year, starts_at.month, starts_at.day)
        one_day = datetime.timedelta(days=1)
        while dt < ends_at:
            days.append(self._idx_month_day[dt.month][dt.day])
            dt += one_day

        return days

    def _add_bubble_titles_to_successive_weeks(self):
        for week in self.weeks:
            leftmost_day = week[0]

            for event in leftmost_day.event_slots:
                if event and event.bubbled:
                    event.bubble_title = event.title

    def make_event_for_template(self, day, catalog_event):
        tpl_event = EventOnMonthView(
            day, catalog_event, show_url=self.url_for(context=catalog_event))
        return tpl_event

    @property
    def template_filename(self):
        return 'karl.content.views:templates/calendar_month.pt'
Exemple #3
0
 def _init_bubble_painter(self):
     self._bubble_painter = BubblePainter(self)
Exemple #4
0
class MonthViewPresenter(BasePresenter):
    name = "month"

    def _initialize(self):
        monthname = calendar.month_name[self.focus_datetime.month]
        self.title = "%s %d" % (monthname, self.focus_datetime.year)
        self.feed_url = self.url_for("atom.xml")

        self._init_weeks_skeleton()
        self._init_day_indexes_from_weeks()

        self._init_prev_datetime()
        self._init_next_datetime()

        self._init_navigation()
        self._init_bubble_painter()

    def _init_weeks_skeleton(self):
        skeleton = MonthSkeleton(self.focus_datetime.year, self.focus_datetime.month)

        self.day_headings = skeleton.day_names

        weeks = skeleton.weeks
        nine_hours = datetime.timedelta(hours=9)
        for week in weeks:
            for d, dt in enumerate(week):
                # determine if this day is on the month in focus
                same_year = self.focus_datetime.year == dt.year
                same_month = self.focus_datetime.month == dt.month
                is_focus_month = same_year and same_month

                # determine if this day is today's date (now)
                same_year = self.now_datetime.year == dt.year
                same_month = self.now_datetime.month == dt.month
                same_day = self.now_datetime.day == dt.day
                is_today = same_year and same_month and same_day

                # url to add an event to this day
                day_at_9am = dt + nine_hours
                starts = time.mktime(day_at_9am.timetuple())
                add_event_url = self.url_for("add_calendarevent.html", query={"starts": int(starts)})

                # url to view this day
                format = "%s?year=%d&month=%d&day=%d"
                show_url = format % (self.url_for("day.html"), dt.year, dt.month, dt.day)

                day = DayOnMonthView(
                    dt.year,
                    dt.month,
                    dt.day,
                    current_month=is_focus_month,
                    current_day=is_today,
                    add_event_url=add_event_url,
                    show_day_url=show_url,
                )

                week[d] = day
        self.weeks = weeks

    def _init_day_indexes_from_weeks(self):
        self._idx_month_day = {}
        self.all_days = []

        for week in self.weeks:
            for day in week:
                self._idx_month_day.setdefault(day.month, {})[day.day] = day
                self.all_days.append(day)

    def _init_prev_datetime(self):
        prior = prior_month(self.focus_datetime.year, self.focus_datetime.month)
        monthrange = calendar.monthrange(prior[0], prior[1])

        if self.focus_datetime.day <= monthrange[1]:
            day = self.focus_datetime.day
        else:
            day = monthrange[1]

        self.prev_datetime = datetime.datetime(prior[0], prior[1], day)

    def _init_next_datetime(self):
        next = next_month(self.focus_datetime.year, self.focus_datetime.month)
        monthrange = calendar.monthrange(next[0], next[1])

        if self.focus_datetime.day <= monthrange[1]:
            day = self.focus_datetime.day
        else:
            day = monthrange[1]

        self.next_datetime = datetime.datetime(next[0], next[1], day)

    def _init_bubble_painter(self):
        self._bubble_painter = BubblePainter(self)

    def paint_events(self, events):
        by_start_date = operator.attrgetter("startDate")

        for event in sorted(events, key=by_start_date):
            if self._bubble_painter.should_paint_event(event):
                self._bubble_painter.paint_event(event)
            else:
                self._paint_event_without_bubble(event)

        self._add_bubble_titles_to_successive_weeks()

    def _paint_event_without_bubble(self, event):
        days = self.days_in_range_of_event(event)

        for day in days:
            if None in day.event_slots:
                slot_index = day.event_slots.index(None)
                tpl_event = self.make_event_for_template(day, event)
                tpl_event.bubbled = False
                day.event_slots[slot_index] = tpl_event
            else:
                day.overflowed_events.append(event)

    def days_in_range_of_event(self, event):
        """ Find all of the days (DayOnMonthView) that are affected
        by an event. """
        days = []

        if event.startDate < self.first_moment:
            starts_at = self.first_moment
        else:
            starts_at = event.startDate

        if event.endDate > self.last_moment:
            ends_at = self.last_moment
        else:
            ends_at = event.endDate

        dt = datetime.datetime(starts_at.year, starts_at.month, starts_at.day)
        one_day = datetime.timedelta(days=1)
        while dt < ends_at:
            days.append(self._idx_month_day[dt.month][dt.day])
            dt += one_day

        return days

    def _add_bubble_titles_to_successive_weeks(self):
        for week in self.weeks:
            leftmost_day = week[0]

            for event in leftmost_day.event_slots:
                if event and event.bubbled:
                    event.bubble_title = event.title

    def make_event_for_template(self, day, catalog_event):
        tpl_event = EventOnMonthView(day, catalog_event, show_url=self.url_for(context=catalog_event))
        return tpl_event

    @property
    def first_moment(self):
        day = self.weeks[0][0]
        return datetime.datetime(day.year, day.month, day.day)

    @property
    def last_moment(self):
        day = self.weeks[-1][-1]
        return datetime.datetime(day.year, day.month, day.day, 23, 59, 59)

    @property
    def template_filename(self):
        return "karl.content.views:templates/calendar_month.pt"
Exemple #5
0
class WeekViewPresenter(WeekEventHorizon):
    name = 'week'

    def _initialize(self):
        WeekEventHorizon._initialize(self)
        self._init_next_and_prev_datetime()
        self._init_hour_labels()
        self._init_navigation()
        self._init_indexes_to_days_in_week()
        self._init_bubble_painter()

    def _init_indexes_to_days_in_week(self):
        self._idx_month_day = {}
        self.all_days = [] 

        for day in self.week:
            self._idx_month_day.setdefault(day.month, {})[day.day] = day
            self.all_days.append(day)
    
    def _init_next_and_prev_datetime(self):                          
        seven_days = datetime.timedelta(days=7)
        self.next_datetime  = self.focus_datetime + seven_days
        self.prev_datetime = self.focus_datetime - seven_days

    def _init_hour_labels(self):
        self.hour_labels = []
        for hour in range(0, 24):
            if hour == 0:
                label = '12 AM'
            elif hour == 12:
                label = '12 PM'
            elif hour < 12:
                label = '%d AM' % hour
            else:
                label = '%d PM' % (hour - 12)
            self.hour_labels.append(label)

    def _init_bubble_painter(self):
        self._bubble_painter = BubblePainter(self, add_new_slots=True)

    def paint_events(self, events):
        events_to_bubble, other_events = self._separate_events(events)

        self._paint_events_into_upper_tray(events_to_bubble)
        self._paint_events_into_time_slots(other_events)

    def _separate_events(self, events):
        events_to_bubble = [] 
        other_events     = []
        
        for event in events:  
            if self._bubble_painter.should_paint_event(event):
                events_to_bubble.append(event)
            else:
                other_events.append(event)

        return (events_to_bubble, other_events)

    def _paint_events_into_upper_tray(self, events):
        by_start_date = operator.attrgetter('startDate')
        for event in sorted(events, key=by_start_date):
            self._bubble_painter.paint_event(event)

    def _paint_events_into_time_slots(self, events):
        for day in self.week:
            presenter = DayViewPresenter(focus_datetime= day.first_moment,
                                         now_datetime  = self.now_datetime,
                                         url_for       = self.url_for)
            
            presenter.paint_events(
                self._filter_events_for_day(events, day)
            )  
            
            day.half_hour_slots = presenter.half_hour_slots
            day.add_event_url   = presenter.add_event_url

    def _filter_events_for_day(self, events, day):
        filtered = []
        one_day = datetime.timedelta(days=1)
        for event in events: 
            dt = event.startDate
            while dt < event.endDate:
              same_year  = (dt.year  == day.year)
              same_month = (dt.month == day.month)
              same_day   = (dt.day   == day.day)

              if (same_year and same_month and same_day):
                filtered.append(event)

              dt += one_day
        
        return filtered  

    def days_in_range_of_event(self, event):
        ''' Find all of the days (DayOnWeekView) that are affected
        by an event. '''
        days = []

        if event.startDate < self.first_moment:
            starts_at = self.first_moment
        else:
            starts_at = event.startDate

        if event.endDate > self.last_moment:
            ends_at = self.last_moment
        else:
            ends_at = event.endDate

        dt = datetime.datetime(
                starts_at.year, starts_at.month, starts_at.day)
        one_day = datetime.timedelta(days=1)
        while dt < ends_at:                             
            days.append(
                self._idx_month_day[dt.month][dt.day]       
            )
            dt += one_day

        return days

    def make_event_for_template(self, day, catalog_event):
        tpl_event = EventInUpperTray(
                        day, catalog_event,
                        show_url=self.url_for(context=catalog_event)
                    )
        return tpl_event

    @property
    def today_class(self):
        today_class = ''
        for day_of_week in self.week:
            same_year  = (self.now_datetime.year  == day_of_week.year)
            same_month = (self.now_datetime.month == day_of_week.month)
            same_day   = (self.now_datetime.day   == day_of_week.day)
            
            if (same_year and same_month and same_day):
                today_class = 'cal_today_%s' % day_of_week.css_day_abbr
                break
        return today_class

    @property 
    def auto_scroll_class(self):
        at_or_after_first_moment = (self.now_datetime >= self.first_moment)
        at_or_before_last_moment = (self.now_datetime <= self.last_moment)
        
        if at_or_after_first_moment and at_or_before_last_moment:
            css_class = 'today'
        else:
            css_class = ''

        return css_class

    @property
    def template_filename(self):
        return 'karl.content.views:templates/calendar_week.pt'
Exemple #6
0
 def _init_bubble_painter(self):
     self._bubble_painter = BubblePainter(self, add_new_slots=True)
Exemple #7
0
 def _makeOne(self, *args, **kargs):
     from karl.content.calendar.utils import BubblePainter
     return BubblePainter(*args, **kargs)
Exemple #8
0
class WeekViewPresenter(BasePresenter):
    name = "week"

    def _initialize(self):
        self._init_title()
        self.feed_url = self.url_for("atom.xml")

        self._init_week_around_focus_datetime()
        self._init_first_and_last_moment()
        self._init_next_and_prev_datetime()
        self._init_hour_labels()
        self._init_navigation()
        self._init_indexes_to_days_in_week()
        self._init_bubble_painter()

    def _init_title(self):
        day_num = calendar.weekday(self.focus_datetime.year, self.focus_datetime.month, self.focus_datetime.day)
        day_name = calendar.day_name[day_num]

        self.title = "Week of %s %d/%d" % (day_name, self.focus_datetime.month, self.focus_datetime.day)

    def _init_week_around_focus_datetime(self):
        skeleton = MonthSkeleton(self.focus_datetime.year, self.focus_datetime.month)

        # find the week containing the datetime in focus
        found_day = False
        for week_of_datetimes in skeleton.weeks:
            for dt in week_of_datetimes:
                same_year = dt.year == self.focus_datetime.year
                same_month = dt.month == self.focus_datetime.month
                same_day = dt.day == self.focus_datetime.day

                if same_year and same_month and same_day:
                    found_day = True
                    break
            if found_day:
                break

        # save week in focus on the instance
        self.week = []
        for dt in week_of_datetimes:
            format = "%s?year=%d&month=%d&day=%d"
            show_url = format % (self.url_for("day.html"), dt.year, dt.month, dt.day)

            self.week.append(DayOnWeekView(dt.year, dt.month, dt.day, show_url))

    def _init_indexes_to_days_in_week(self):
        self._idx_month_day = {}
        self.all_days = []

        for day in self.week:
            self._idx_month_day.setdefault(day.month, {})[day.day] = day
            self.all_days.append(day)

    def _init_first_and_last_moment(self):
        first_day = self.week[0]
        self._first_moment = datetime.datetime(first_day.year, first_day.month, first_day.day, 0, 0, 0)
        last_day = self.week[6]
        self._last_moment = datetime.datetime(last_day.year, last_day.month, last_day.day, 23, 59, 59)

    def _init_next_and_prev_datetime(self):
        seven_days = datetime.timedelta(days=7)
        self.next_datetime = self.focus_datetime + seven_days
        self.prev_datetime = self.focus_datetime - seven_days

    def _init_hour_labels(self):
        self.hour_labels = []
        for hour in range(0, 24):
            if hour == 0:
                label = "12 AM"
            elif hour == 12:
                label = "12 PM"
            elif hour < 12:
                label = "%d AM" % hour
            else:
                label = "%d PM" % (hour - 12)
            self.hour_labels.append(label)

    def _init_bubble_painter(self):
        self._bubble_painter = BubblePainter(self, add_new_slots=True)

    def paint_events(self, events):
        events_to_bubble, other_events = self._separate_events(events)

        self._paint_events_into_upper_tray(events_to_bubble)
        self._paint_events_into_time_slots(other_events)

    def _separate_events(self, events):
        events_to_bubble = []
        other_events = []

        for event in events:
            if self._bubble_painter.should_paint_event(event):
                events_to_bubble.append(event)
            else:
                other_events.append(event)

        return (events_to_bubble, other_events)

    def _paint_events_into_upper_tray(self, events):
        by_start_date = operator.attrgetter("startDate")
        for event in sorted(events, key=by_start_date):
            self._bubble_painter.paint_event(event)

    def _paint_events_into_time_slots(self, events):
        for day in self.week:
            presenter = DayViewPresenter(
                focus_datetime=day.first_moment, now_datetime=self.now_datetime, url_for=self.url_for
            )

            presenter.paint_events(self._filter_events_for_day(events, day))

            day.half_hour_slots = presenter.half_hour_slots
            day.add_event_url = presenter.add_event_url

    def _filter_events_for_day(self, events, day):
        filtered = []
        one_day = datetime.timedelta(days=1)
        for event in events:
            dt = event.startDate
            while dt < event.endDate:
                same_year = dt.year == day.year
                same_month = dt.month == day.month
                same_day = dt.day == day.day

                if same_year and same_month and same_day:
                    filtered.append(event)

                dt += one_day

        return filtered

    def days_in_range_of_event(self, event):
        """ Find all of the days (DayOnWeekView) that are affected
        by an event. """
        days = []

        if event.startDate < self.first_moment:
            starts_at = self.first_moment
        else:
            starts_at = event.startDate

        if event.endDate > self.last_moment:
            ends_at = self.last_moment
        else:
            ends_at = event.endDate

        dt = datetime.datetime(starts_at.year, starts_at.month, starts_at.day)
        one_day = datetime.timedelta(days=1)
        while dt < ends_at:
            days.append(self._idx_month_day[dt.month][dt.day])
            dt += one_day

        return days

    def make_event_for_template(self, day, catalog_event):
        tpl_event = EventInUpperTray(day, catalog_event, show_url=self.url_for(context=catalog_event))
        return tpl_event

    @property
    def today_class(self):
        today_class = ""
        for day_of_week in self.week:
            same_year = self.now_datetime.year == day_of_week.year
            same_month = self.now_datetime.month == day_of_week.month
            same_day = self.now_datetime.day == day_of_week.day

            if same_year and same_month and same_day:
                today_class = "cal_today_%s" % day_of_week.css_day_abbr
                break
        return today_class

    @property
    def auto_scroll_class(self):
        at_or_after_first_moment = self.now_datetime >= self.first_moment
        at_or_before_last_moment = self.now_datetime <= self.last_moment

        if at_or_after_first_moment and at_or_before_last_moment:
            css_class = "today"
        else:
            css_class = ""

        return css_class

    @property
    def first_moment(self):
        return self._first_moment

    @property
    def last_moment(self):
        return self._last_moment

    @property
    def template_filename(self):
        return "templates/calendar_week.pt"
Exemple #9
0
class MonthViewPresenter(MonthEventHorizon):
    name = 'month'

    def _initialize(self):
        MonthEventHorizon._initialize(self)

        self._init_day_indexes_from_weeks()
        
        self._init_prev_datetime()
        self._init_next_datetime()

        self._init_navigation()
        self._init_bubble_painter()

    def _init_day_indexes_from_weeks(self):
        self._idx_month_day = {}
        self.all_days = []

        for week in self.weeks:
            for day in week:
                self._idx_month_day.setdefault(day.month, {})[day.day] = day
                self.all_days.append(day)

    def _init_prev_datetime(self):
        prior = prior_month(self.focus_datetime.year, 
                            self.focus_datetime.month)
        monthrange = calendar.monthrange(prior[0], prior[1])  
                                         
        if self.focus_datetime.day <= monthrange[1]:
            day = self.focus_datetime.day
        else:
            day = monthrange[1]    
            
        self.prev_datetime = datetime.datetime(prior[0], prior[1], day)

    def _init_next_datetime(self):
        next = next_month(self.focus_datetime.year, 
                          self.focus_datetime.month)
        monthrange = calendar.monthrange(next[0], next[1])

        if self.focus_datetime.day <= monthrange[1]:
            day = self.focus_datetime.day
        else:
            day = monthrange[1]

        self.next_datetime = datetime.datetime(next[0], next[1], day)        

    def _init_bubble_painter(self):
        self._bubble_painter = BubblePainter(self)
        
    def paint_events(self, events):
        by_start_date = operator.attrgetter('startDate')

        for event in sorted(events, key=by_start_date):
            if self._bubble_painter.should_paint_event(event):
                self._bubble_painter.paint_event(event)
            else:
                self._paint_event_without_bubble(event)
                 
        self._add_bubble_titles_to_successive_weeks()

    def _paint_event_without_bubble(self, event):
        days = self.days_in_range_of_event(event)

        for day in days:
            if None in day.event_slots:
                slot_index = day.event_slots.index(None)
                tpl_event = self.make_event_for_template(day, event)
                tpl_event.bubbled = False
                day.event_slots[slot_index] = tpl_event
            else:
                day.overflowed_events.append(event)

    def days_in_range_of_event(self, event):
        ''' Find all of the days (DayOnMonthView) that are affected
        by an event. '''
        days = []

        if event.startDate < self.first_moment:
            starts_at = self.first_moment
        else:
            starts_at = event.startDate
        
        if event.endDate > self.last_moment:
            ends_at = self.last_moment
        else:
            ends_at = event.endDate

        dt = datetime.datetime(
                starts_at.year, starts_at.month, starts_at.day)
        one_day = datetime.timedelta(days=1)
        while dt < ends_at:                             
            days.append(
                self._idx_month_day[dt.month][dt.day]       
            )
            dt += one_day

        return days

    def _add_bubble_titles_to_successive_weeks(self):
        for week in self.weeks:
            leftmost_day = week[0]

            for event in leftmost_day.event_slots:
                if event and event.bubbled:
                    event.bubble_title = event.title                 

    def make_event_for_template(self, day, catalog_event):
        tpl_event = EventOnMonthView(
                        day, catalog_event,
                        show_url=self.url_for(context=catalog_event)
                    )
        return tpl_event

    @property
    def template_filename(self):
        return 'karl.content.views:templates/calendar_month.pt'