svv/cal.py
author Tero Marttila <terom@fixme.fi>
Mon, 10 Jan 2011 18:30:58 +0200
changeset 54 d077f2f60098
parent 47 d79a560af791
permissions -rw-r--r--
cal: page title
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
41
36d029a47d37 cal: week starts on monday
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
    23
    FIRST_WEEKDAY = 0
37
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
        """
46
547940cb0e1c cal: adjust event widths to reflect hour offsets into day
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   121
            Return full list of all Orders taking place during the given datetime interval, ordered by start time
37
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))
42
fa5694ee0f98 cal: also include events that span across the whole week
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   130
            |   (db.between(start, Order.event_start, Order.event_end))
37
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   131
        ).order_by(Order.event_start).all()
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   132
46
547940cb0e1c cal: adjust event widths to reflect hour offsets into day
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   133
    def interval_for_dates (self, dates) :
547940cb0e1c cal: adjust event widths to reflect hour offsets into day
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   134
        """
547940cb0e1c cal: adjust event widths to reflect hour offsets into day
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   135
            Returns a datetime (start, end) interval encompassing all of the given dates
547940cb0e1c cal: adjust event widths to reflect hour offsets into day
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   136
        """
547940cb0e1c cal: adjust event widths to reflect hour offsets into day
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   137
        
547940cb0e1c cal: adjust event widths to reflect hour offsets into day
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   138
        # a day is 00:00:00 - 23:59:59
547940cb0e1c cal: adjust event widths to reflect hour offsets into day
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   139
        start = datetime.datetime.combine(min(dates), datetime.time(0, 0, 0))
547940cb0e1c cal: adjust event widths to reflect hour offsets into day
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   140
        end = datetime.datetime.combine(max(dates), datetime.time(23, 59, 59))
547940cb0e1c cal: adjust event widths to reflect hour offsets into day
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   141
        
547940cb0e1c cal: adjust event widths to reflect hour offsets into day
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   142
        return start, end
547940cb0e1c cal: adjust event widths to reflect hour offsets into day
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   143
547940cb0e1c cal: adjust event widths to reflect hour offsets into day
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   144
    def hours_from_day_start (self, dt) :
547940cb0e1c cal: adjust event widths to reflect hour offsets into day
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   145
        """
547940cb0e1c cal: adjust event widths to reflect hour offsets into day
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   146
            Return the number of hours from the start of the day to the given datetime, as a float.
547940cb0e1c cal: adjust event widths to reflect hour offsets into day
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   147
        """
547940cb0e1c cal: adjust event widths to reflect hour offsets into day
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   148
547940cb0e1c cal: adjust event widths to reflect hour offsets into day
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   149
        HOUR = float(60 * 60)
547940cb0e1c cal: adjust event widths to reflect hour offsets into day
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   150
547940cb0e1c cal: adjust event widths to reflect hour offsets into day
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   151
        # dt - 00:00:00
547940cb0e1c cal: adjust event widths to reflect hour offsets into day
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   152
        return (dt - dt.replace(hour=0, minute=0, second=0)).seconds / HOUR
547940cb0e1c cal: adjust event widths to reflect hour offsets into day
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   153
547940cb0e1c cal: adjust event widths to reflect hour offsets into day
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   154
    def hours_to_day_end (self, dt) :
547940cb0e1c cal: adjust event widths to reflect hour offsets into day
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   155
        """
547940cb0e1c cal: adjust event widths to reflect hour offsets into day
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   156
            Return the number of hours from the given datetime to the day's end, as a float.
547940cb0e1c cal: adjust event widths to reflect hour offsets into day
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   157
        """
547940cb0e1c cal: adjust event widths to reflect hour offsets into day
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   158
547940cb0e1c cal: adjust event widths to reflect hour offsets into day
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   159
        HOUR = float(60 * 60)
547940cb0e1c cal: adjust event widths to reflect hour offsets into day
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   160
        
547940cb0e1c cal: adjust event widths to reflect hour offsets into day
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   161
        # 23:59:59 - dt
547940cb0e1c cal: adjust event widths to reflect hour offsets into day
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   162
        return (dt.replace(hour=23, minute=59, second=59) - dt).seconds / HOUR
547940cb0e1c cal: adjust event widths to reflect hour offsets into day
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   163
37
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   164
    def render_week (self, month, week) :
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   165
        """
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   166
            Render day rows for given week.
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   167
        """
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   168
        
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   169
        # XXX: nasty
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   170
        from svv import urls
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   171
46
547940cb0e1c cal: adjust event widths to reflect hour offsets into day
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   172
        # week as datetime interval
547940cb0e1c cal: adjust event widths to reflect hour offsets into day
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   173
        week_start, week_end = self.interval_for_dates(week)
547940cb0e1c cal: adjust event widths to reflect hour offsets into day
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   174
        
547940cb0e1c cal: adjust event widths to reflect hour offsets into day
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   175
        # all orders for week
37
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   176
        orders = self.get_events_for_interval(week_start, week_end)
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   177
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   178
        # day headers
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   179
        yield tags.tr(class_='week-header')(
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   180
            self.render_day_header(month, date) for date in week
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   181
        )
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   182
46
547940cb0e1c cal: adjust event widths to reflect hour offsets into day
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   183
        # each event on its own row for now
37
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   184
        for order in orders :
39
4f331cfc76a4 cal: span events across week's days
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   185
            # start/end date for this week
46
547940cb0e1c cal: adjust event widths to reflect hour offsets into day
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   186
            start_day = min(date for date in week if order.on_date(date))
547940cb0e1c cal: adjust event widths to reflect hour offsets into day
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   187
            end_day = max(date for date in week if order.on_date(date))
39
4f331cfc76a4 cal: span events across week's days
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   188
            
4f331cfc76a4 cal: span events across week's days
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   189
            # as vector into week
46
547940cb0e1c cal: adjust event widths to reflect hour offsets into day
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   190
            leading_days = (start_day - min(week)).days
547940cb0e1c cal: adjust event widths to reflect hour offsets into day
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   191
            length_days = (end_day - start_day).days + 1
547940cb0e1c cal: adjust event widths to reflect hour offsets into day
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   192
            trailing_days = (max(week) - end_day).days
37
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   193
46
547940cb0e1c cal: adjust event widths to reflect hour offsets into day
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   194
            # continues prev/next week?
547940cb0e1c cal: adjust event widths to reflect hour offsets into day
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   195
            prev_week = (start_day > order.event_start.date())
547940cb0e1c cal: adjust event widths to reflect hour offsets into day
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   196
            next_week = (end_day < order.event_end.date())
40
30a0a0fa8c54 cal: span events across weeks
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   197
46
547940cb0e1c cal: adjust event widths to reflect hour offsets into day
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   198
            log.debug("Event %r from %r -> %r", order.event_name, start_day, end_day)
547940cb0e1c cal: adjust event widths to reflect hour offsets into day
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   199
547940cb0e1c cal: adjust event widths to reflect hour offsets into day
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   200
            # spec class
547940cb0e1c cal: adjust event widths to reflect hour offsets into day
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   201
            classes = ' '.join(cls for cls in (
547940cb0e1c cal: adjust event widths to reflect hour offsets into day
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   202
                'event',
547940cb0e1c cal: adjust event widths to reflect hour offsets into day
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   203
                'continues-prev' if prev_week else None,
547940cb0e1c cal: adjust event widths to reflect hour offsets into day
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   204
                'continues-next' if next_week else None,
547940cb0e1c cal: adjust event widths to reflect hour offsets into day
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   205
            ) if cls)
547940cb0e1c cal: adjust event widths to reflect hour offsets into day
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   206
547940cb0e1c cal: adjust event widths to reflect hour offsets into day
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   207
            # compute dynamic styles
547940cb0e1c cal: adjust event widths to reflect hour offsets into day
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   208
            styles = []
547940cb0e1c cal: adjust event widths to reflect hour offsets into day
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   209
547940cb0e1c cal: adjust event widths to reflect hour offsets into day
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   210
            # width of each hour in the event's span this week, as a percentage
547940cb0e1c cal: adjust event widths to reflect hour offsets into day
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   211
            hour_width = 100.0 / (length_days * 24)
547940cb0e1c cal: adjust event widths to reflect hour offsets into day
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   212
547940cb0e1c cal: adjust event widths to reflect hour offsets into day
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   213
            # margin for start hour offset
547940cb0e1c cal: adjust event widths to reflect hour offsets into day
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   214
            if not prev_week :
547940cb0e1c cal: adjust event widths to reflect hour offsets into day
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   215
                # starts on this week, so calc how many hours into day
547940cb0e1c cal: adjust event widths to reflect hour offsets into day
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   216
                styles.append('margin-left: %d%%' % int(hour_width * self.hours_from_day_start(order.event_start)))
547940cb0e1c cal: adjust event widths to reflect hour offsets into day
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   217
            
547940cb0e1c cal: adjust event widths to reflect hour offsets into day
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   218
            # margin for end hour offset
547940cb0e1c cal: adjust event widths to reflect hour offsets into day
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   219
            if not next_week :
547940cb0e1c cal: adjust event widths to reflect hour offsets into day
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   220
                # ends on this week, se calc how many hours until day end
547940cb0e1c cal: adjust event widths to reflect hour offsets into day
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   221
                styles.append('margin-right: %d%%' % int(hour_width * self.hours_to_day_end(order.event_end)))
547940cb0e1c cal: adjust event widths to reflect hour offsets into day
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   222
            
547940cb0e1c cal: adjust event widths to reflect hour offsets into day
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   223
            # style spec
547940cb0e1c cal: adjust event widths to reflect hour offsets into day
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   224
            if styles :
547940cb0e1c cal: adjust event widths to reflect hour offsets into day
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   225
                style = '; '.join(styles)
547940cb0e1c cal: adjust event widths to reflect hour offsets into day
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   226
547940cb0e1c cal: adjust event widths to reflect hour offsets into day
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   227
            else :
547940cb0e1c cal: adjust event widths to reflect hour offsets into day
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   228
                style = None
37
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   229
39
4f331cfc76a4 cal: span events across week's days
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   230
            yield tags.tr(class_='week-data')(
47
d79a560af791 cal: revert to separate <td> for correct cell borders
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   231
                ([tags.td("")] * leading_days),
46
547940cb0e1c cal: adjust event widths to reflect hour offsets into day
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   232
                tags.td(colspan=length_days, class_=classes)(
547940cb0e1c cal: adjust event widths to reflect hour offsets into day
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   233
                    tags.a(href=self.url_for(urls.OrderView, id=order.id), style=style)(
547940cb0e1c cal: adjust event widths to reflect hour offsets into day
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   234
                        tags.div(class_='arrow-left')("") if prev_week else None,
40
30a0a0fa8c54 cal: span events across weeks
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   235
                        order.event_name,
46
547940cb0e1c cal: adjust event widths to reflect hour offsets into day
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   236
                        tags.div(class_='arrow-right')("") if next_week else None,
40
30a0a0fa8c54 cal: span events across weeks
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   237
                    )
39
4f331cfc76a4 cal: span events across week's days
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   238
                ),
47
d79a560af791 cal: revert to separate <td> for correct cell borders
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   239
                ([tags.td("")] * trailing_days),
37
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
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   242
    def render_calendar (self, month) :
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   243
        """
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   244
            Render calendar for given date's month.
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   245
        """
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   246
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   247
        cal = calendar.Calendar(self.FIRST_WEEKDAY)
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   248
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   249
        # next/prev month
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   250
        prev = self.prev_month(month)
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   251
        next = self.next_month(month)
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   252
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   253
        return tags.table(class_='calendar')(
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   254
            tags.caption(
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   255
                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
   256
                    html.raw("&laquo;")
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   257
                ),
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   258
                month.strftime(self.MONTH_TITLE_FORMAT),
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   259
                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
   260
                    html.raw("&raquo;")
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   261
                ),
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   262
            ),
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   263
            
47
d79a560af791 cal: revert to separate <td> for correct cell borders
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   264
            # would be useful for borders, but too hard to style
d79a560af791 cal: revert to separate <td> for correct cell borders
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   265
            #(tags.col() for dow in cal.iterweekdays()),
d79a560af791 cal: revert to separate <td> for correct cell borders
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   266
            
37
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   267
            # week-day headers
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   268
            tags.thead(
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   269
                tags.tr(
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   270
                    tags.th(
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   271
                        self.dayofweek_title(dow)
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   272
                    ) for dow in cal.iterweekdays()
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   273
                )
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   274
            ),
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   275
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   276
            # month weeks
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   277
            tags.tbody(
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   278
                (
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   279
                    self.render_week(month, week)
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   280
                ) for week in cal.monthdatescalendar(month.year, month.month)
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   281
            ),
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   282
        )
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   283
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   284
    def render_content (self, yearmonth=None) :
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   285
        """
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   286
            Render calendar HTML for given year/month.
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   287
        """
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   288
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   289
        if yearmonth :
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   290
            # requested month
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   291
            month = datetime.datetime.strptime(yearmonth, self.URL_FORMAT).date()
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   292
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   293
        else :
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   294
            # this month
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   295
            month = datetime.date.today()
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   296
        
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   297
        return (
54
d077f2f60098 cal: page title
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   298
            tags.h1(u"Tilauskalenteri"),
d077f2f60098 cal: page title
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   299
37
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   300
            self.render_calendar(month),
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   301
        )
eabea2857143 cal: simple order calendar view
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   302