svv/cal.py
author Tero Marttila <terom@fixme.fi>
Sat, 08 Jan 2011 23:41:48 +0200
changeset 40 30a0a0fa8c54
parent 39 4f331cfc76a4
child 41 36d029a47d37
permissions -rw-r--r--
cal: span events across weeks
37
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     1
"""
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     2
    Calendar view of orders
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     3
"""
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     4
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     5
from svv.controllers import PageHandler
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     6
from svv.html import tags
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     7
from svv import database as db
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     8
from svv import html
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     9
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    10
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    11
import datetime
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    12
import calendar
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    13
import logging
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    14
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    15
log = logging.getLogger('svv.cal')
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    16
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    17
class CalendarView (PageHandler) :
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    18
    """
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    19
        Single-month calendar view with events for given month shown
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    20
    """
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    21
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    22
    # first date of week
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    23
    FIRST_WEEKDAY = 6
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    24
    
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    25
    # year/month format for URLs
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    26
    URL_FORMAT = "%Y-%m"
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    27
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    28
    # formatting styles
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    29
    MONTH_TITLE_FORMAT = "%B %Y"
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    30
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    31
    @classmethod
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    32
    def dayofweek_title (cls, dow) :
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    33
        """
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    34
            Return day of week name for given dow number
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    35
        """
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    36
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    37
        return calendar.day_name[dow]
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    38
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    39
    @classmethod
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    40
    def _wrap_year (cls, year, month) :
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    41
        """
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    42
            Wraps month to between [1, 12], spilling overflow/underflow by to year.
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    43
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    44
            Returns (year, month)
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    45
        """
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    46
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    47
        # underflow?
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    48
        if month == 0 :
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    49
            # wrap to previous year
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    50
            return (year - 1, 12)
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    51
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    52
        # overflow?
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    53
        elif month == 13 :
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    54
            # wrap to next year
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    55
            return (year + 1, 1)
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    56
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    57
        # sane value
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    58
        elif 1 <= month <= 12 :
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    59
            return (year, month)
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    60
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    61
        # insane value
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    62
        else :
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    63
            assert False, "invalid year/month: %d/%d" % (year, month)
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    64
    
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    65
    @classmethod
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    66
    def prev_month (cls, month) :
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    67
        """
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    68
            Compute date for previous month.
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    69
        """
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    70
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    71
        # normalize
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    72
        y, m = cls._wrap_year(month.year, month.month - 1)
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    73
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    74
        return datetime.date(y, m, 1)
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    75
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    76
    @classmethod
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    77
    def next_month (cls, month) :
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    78
        """
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    79
            Compute date for following month.
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    80
        """
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    81
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    82
        # normalize
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    83
        y, m = cls._wrap_year(month.year, month.month + 1)
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    84
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    85
        return datetime.date(y, m, 1)
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    86
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    87
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    88
    def process (self, **foo) :
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    89
        """
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    90
            Setup
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    91
        """
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    92
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    93
        # db session
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    94
        self.session = self.app.session()
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    95
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    96
    def render_day_header (self, month, date) :
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    97
        """
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    98
            Render <th> for day
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    99
        """
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   100
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   101
        today = datetime.date.today()
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   102
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   103
        classes = []
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   104
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   105
        if (date.year, date.month) == (month.year, month.month) :
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   106
            # current month
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   107
            classes.append('in-month')
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   108
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   109
        else :
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   110
            classes.append('out-month')
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   111
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   112
        if date == today :
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   113
            classes.append('today')
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   114
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   115
        class_ = ' '.join(classes)
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   116
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   117
        return tags.th(date.day, class_=class_)
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   118
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   119
    def get_events_for_interval (self, start, end) :
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   120
        """
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   121
            Returns list of Order objects for given interval, ordered by start time.
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   122
        """
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   123
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   124
        # XXX: bad imports
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   125
        from orders import Order
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   126
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   127
        return self.session.query(Order).filter(
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   128
                (Order.event_start.between(start, end))
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   129
            |   (Order.event_end.between(start, end))
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   130
        ).order_by(Order.event_start).all()
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   131
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   132
    def render_week (self, month, week) :
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   133
        """
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   134
            Render day rows for given week.
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   135
        """
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   136
        
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   137
        # XXX: nasty
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   138
        from svv import urls
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   139
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   140
        # load events for week
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   141
        week_start = datetime.datetime.combine(min(week), datetime.time(0, 0, 0))
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   142
        week_end = datetime.datetime.combine(max(week), datetime.time(23, 59, 59))
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   143
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   144
        orders = self.get_events_for_interval(week_start, week_end)
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   145
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   146
        log.debug("Render week %r -> %r: %d", week_start, week_end, len(orders))
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   147
        
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   148
        # day headers
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   149
        yield tags.tr(class_='week-header')(
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   150
            self.render_day_header(month, date) for date in week
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   151
        )
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   152
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   153
        # each even on its own row for now
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   154
        for order in orders :
39
4f331cfc76a4 cal: span events across week's days
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   155
            # start/end date for this week
4f331cfc76a4 cal: span events across week's days
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   156
            start = min(date for date in week if order.on_date(date))
4f331cfc76a4 cal: span events across week's days
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   157
            end = max(date for date in week if order.on_date(date))
4f331cfc76a4 cal: span events across week's days
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   158
            
4f331cfc76a4 cal: span events across week's days
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   159
            # as vector into week
4f331cfc76a4 cal: span events across week's days
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   160
            leading = (start - min(week)).days
4f331cfc76a4 cal: span events across week's days
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   161
            length = (end - start).days + 1
4f331cfc76a4 cal: span events across week's days
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   162
            trailing = (max(week) - end).days
37
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   163
40
30a0a0fa8c54 cal: span events across weeks
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   164
            # continues prev/next?
30a0a0fa8c54 cal: span events across weeks
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   165
            prev = (start > order.event_start.date())
30a0a0fa8c54 cal: span events across weeks
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   166
            next = (end < order.event_end.date())
30a0a0fa8c54 cal: span events across weeks
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   167
39
4f331cfc76a4 cal: span events across week's days
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   168
            log.debug("Event %r from %r -> %r", order.event_name, start, end)
37
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   169
39
4f331cfc76a4 cal: span events across week's days
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   170
            yield tags.tr(class_='week-data')(
4f331cfc76a4 cal: span events across week's days
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   171
                [tags.td("")] * leading,
40
30a0a0fa8c54 cal: span events across weeks
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   172
                tags.td(colspan=length, class_=(' '.join(cls for cls in (
30a0a0fa8c54 cal: span events across weeks
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   173
                    'event',
30a0a0fa8c54 cal: span events across weeks
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   174
                    'continues-prev' if prev else None,
30a0a0fa8c54 cal: span events across weeks
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   175
                    'continues-next' if next else None,
30a0a0fa8c54 cal: span events across weeks
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   176
                ) if cls)))(
30a0a0fa8c54 cal: span events across weeks
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   177
                    tags.a(href=self.url_for(urls.OrderView, id=order.id))(
30a0a0fa8c54 cal: span events across weeks
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   178
                        tags.div(class_='arrow-left')("") if prev else None,
30a0a0fa8c54 cal: span events across weeks
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   179
                        order.event_name,
30a0a0fa8c54 cal: span events across weeks
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   180
                        tags.div(class_='arrow-right')("") if next else None,
30a0a0fa8c54 cal: span events across weeks
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   181
                    )
39
4f331cfc76a4 cal: span events across week's days
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   182
                ),
4f331cfc76a4 cal: span events across week's days
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   183
                [tags.td("")] * trailing,
37
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   184
            )
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   185
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   186
    def render_calendar (self, month) :
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   187
        """
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   188
            Render calendar for given date's month.
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   189
        """
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   190
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   191
        cal = calendar.Calendar(self.FIRST_WEEKDAY)
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   192
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   193
        # next/prev month
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   194
        prev = self.prev_month(month)
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   195
        next = self.next_month(month)
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   196
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   197
        return tags.table(class_='calendar')(
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   198
            tags.caption(
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   199
                tags.a(href=self.url_for(CalendarView, yearmonth=prev.strftime(self.URL_FORMAT)), class_='prev-month')(
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   200
                    html.raw("&laquo;")
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   201
                ),
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   202
                month.strftime(self.MONTH_TITLE_FORMAT),
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   203
                tags.a(href=self.url_for(CalendarView, yearmonth=next.strftime(self.URL_FORMAT)), class_='next-month')(
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   204
                    html.raw("&raquo;")
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   205
                ),
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   206
            ),
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   207
            
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   208
            # week-day headers
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   209
            tags.thead(
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   210
                tags.tr(
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   211
                    tags.th(
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   212
                        self.dayofweek_title(dow)
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   213
                    ) for dow in cal.iterweekdays()
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   214
                )
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   215
            ),
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   216
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   217
            # month weeks
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   218
            tags.tbody(
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   219
                (
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   220
                    self.render_week(month, week)
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   221
                ) for week in cal.monthdatescalendar(month.year, month.month)
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   222
            ),
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   223
        )
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   224
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   225
    def render_content (self, yearmonth=None) :
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   226
        """
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   227
            Render calendar HTML for given year/month.
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   228
        """
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   229
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   230
        if yearmonth :
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   231
            # requested month
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   232
            month = datetime.datetime.strptime(yearmonth, self.URL_FORMAT).date()
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   233
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   234
        else :
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   235
            # this month
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   236
            month = datetime.date.today()
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   237
        
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   238
        return (
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   239
            self.render_calendar(month),
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   240
        )
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   241