Example #1
0
    def process_show(self, req):
        req.perm.assert_permission('CAL_VIEW')

        def stamp_dow (stamp):
            return time.localtime(stamp)[6]

        def stamp_floattime (stamp):
            t = time.localtime(stamp)
            return t[3] + t[4]/60.0

        DIV = 4

        def round_begin (x):
            import math
            return math.floor (x * DIV) / float (DIV)

        def round_end (x):
            import math
            return math.ceil (x * DIV) / float (DIV)

        try:
            date = time.strptime(req.args['date'],"%Y%m%d")
        except:
            date = time.localtime ()

        cweek = [[] for _ in xrange(7)]
        week_range = caltools.get_week_range(date)
        bg, en = time.mktime(week_range[0]), time.mktime(week_range[1])
        for ev in Event.events_between (self.env, bg, en,req.authname):
            begin = max (bg, ev.get_time_begin ())
            end = min (en, ev.get_time_end ()) - 1
            for d in xrange(stamp_dow(begin), stamp_dow(end)+1):
                cweek[d].append(ev)

        week_start = week_range[0]

        day_layouts = [cal_layout.layout (evts, round_begin, round_end)
                       for evts in cweek]

        for d in xrange (len (day_layouts)):
            today = caltools.relative_day(week_start, d)
            today_stamp = time.mktime (today)
            tomorrow_stamp = today_stamp + 24 * 60 * 60

            req.hdf['azcalendar.events.%d.date.year' % d] = today[0]
            req.hdf['azcalendar.events.%d.date.month' % d] = today[1]
            req.hdf['azcalendar.events.%d.date.day' % d] = today[2]
            for l in xrange (len (day_layouts[d])):
                for ev in day_layouts[d][l]:
                    begin = ev.get_time_begin ()
                    if begin < today_stamp:
                        begin = 0.0
                    else:
                        begin = round_begin (stamp_floattime (begin))

                    end = ev.get_time_end ()
                    if end >= tomorrow_stamp:
                        end = 24.0
                    else:
                        end = round_end (stamp_floattime (end))

                    base = 'azcalendar.events.%d.events.%d.%d' % (d, l, ev.get_id ())

                    req.hdf[base + '.id'] = ev.get_id ()
                    req.hdf[base + '.title'] = ev.get_title ()
                    req.hdf[base + '.priority'] = str(EventPriority[ev.get_priority ()])
                    req.hdf[base + '.brd_begin'] = int (round (begin * DIV))
                    req.hdf[base + '.brd_end'] = int (round (end * DIV))

                    if ev.get_time_begin () < today_stamp or ev.get_time_end () > tomorrow_stamp:
                        fmt = "%d.%m.%Y %H:%M"
                    else:
                        fmt = "%H:%M"
                    req.hdf[base + '.time_begin'] = time.strftime (fmt, time.localtime (ev.get_time_begin()))
                    req.hdf[base + '.time_end'] = time.strftime (fmt, time.localtime (ev.get_time_end()))

        display_months = []
        dm_year, dm_month = caltools.get_month_range (week_start)[0][:2]

        prev_year, prev_month, prev_day = date[:3]
        prev_month -= 1
        if prev_month < 1:
            prev_month += 12
            prev_year -= 1
        prev_day = min (calendar.monthrange (prev_year, prev_month)[1], prev_day)

        next_year, next_month, next_day = date[:3]
        next_month += 1
        if next_month > 12:
            next_month -= 12
            next_year += 1
        next_day = min (calendar.monthrange (next_year, next_month)[1], next_day)

        for i in range(3):
            month_range = caltools.get_month_range (tuple([dm_year, dm_month, 1] + [0 for i in range(6)]))
            interesting_days = {}

            bg, en = time.mktime(month_range[0]), time.mktime(month_range[1])
            evts = Event.events_between (self.env, bg, en, req.authname)

            for ev in evts:
                begin = ev.get_time_begin()
                if begin < bg:
                    begin = 1
                else:
                    begin = time.localtime(begin)[2]

                end = ev.get_time_end()
                if end > en:
                    end = calendar.monthrange(dm_year, dm_month)[1]
                else:
                    end = time.localtime(end)[2]

                priority = ev.get_priority()

                # Mark interesting days.
                for day in range (begin, end + 1):
                    if day not in interesting_days or interesting_days[day] < priority:
                        interesting_days[day] = priority

            interesting_days_l = [(day, str(EventPriority[interesting_days[day]]))
                                  for day in interesting_days.keys()]
            display_months.append ((dm_month - 1, dm_year, interesting_days_l))

            dm_month += 1
            if dm_month > 12:
                dm_year += 1
                dm_month = 1

        req.hdf['azcalendar.prev_date'] = "%04d%02d%02d" % (prev_year, prev_month, prev_day)
        req.hdf['azcalendar.today_date'] = time.strftime ("%Y%m%d")
        req.hdf['azcalendar.next_date'] = "%04d%02d%02d" % (next_year, next_month, next_day)

        for m in xrange (len (display_months)):
            month, year, impdays = display_months[m]
            _, numdays = calendar.monthrange (year, month + 1)
            firstday = calendar.weekday(year, month + 1, 1)

            req.hdf['azcalendar.months.%d.month' % m] = month
            req.hdf['azcalendar.months.%d.year' % m] = year
            req.hdf['azcalendar.months.%d.firstday' % m] = firstday
            req.hdf['azcalendar.months.%d.numdays' % m] = numdays

            for d in xrange (len (impdays)):
                day, priority = impdays[d]
                req.hdf['azcalendar.months.%d.impdays.%d' % (m, day)] = priority

        req.hdf['azcalendar.div'] = str(DIV)
        req.hdf['title'] = "Calendar"
        add_stylesheet (req, 'hw/css/azcalendar.css')
        return 'azcalendar.cs', None