pvl/verkko/hosts.py
author Tero Marttila <terom@paivola.fi>
Sat, 26 Jan 2013 19:40:24 +0200
changeset 179 706972d09f05
parent 178 f9f5e669bace
child 180 e6bca452ce72
permissions -rw-r--r--
pvl.verkko.dhcp: refactor table rendering
178
f9f5e669bace pvl.verkko: refactor into dhcp -> hosts -> web+db modules, reworking index page
Tero Marttila <terom@paivola.fi>
parents: 158
diff changeset
     1
from pvl.verkko import web, db
14
02c21749cb4f pvl.verkko: re-add last_msg back to db, implement state, seen filtering in web frontend
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
     2
from pvl.verkko.utils import parse_timedelta, IPv4Network
0
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     3
151
8a9f01036091 split pvl.web from pvl.verkko, rename test.py -> pvl.verkko-dhcp
Tero Marttila <terom@paivola.fi>
parents: 41
diff changeset
     4
from pvl.web import html
0
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     5
8
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
     6
import re
14
02c21749cb4f pvl.verkko: re-add last_msg back to db, implement state, seen filtering in web frontend
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
     7
import datetime
0
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     8
import socket # dns
16
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
     9
import math
0
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    10
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    11
import logging; log = logging.getLogger('pvl.verkko.hosts')
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    12
178
f9f5e669bace pvl.verkko: refactor into dhcp -> hosts -> web+db modules, reworking index page
Tero Marttila <terom@paivola.fi>
parents: 158
diff changeset
    13
## Model
f9f5e669bace pvl.verkko: refactor into dhcp -> hosts -> web+db modules, reworking index page
Tero Marttila <terom@paivola.fi>
parents: 158
diff changeset
    14
import json
f9f5e669bace pvl.verkko: refactor into dhcp -> hosts -> web+db modules, reworking index page
Tero Marttila <terom@paivola.fi>
parents: 158
diff changeset
    15
import time
f9f5e669bace pvl.verkko: refactor into dhcp -> hosts -> web+db modules, reworking index page
Tero Marttila <terom@paivola.fi>
parents: 158
diff changeset
    16
f9f5e669bace pvl.verkko: refactor into dhcp -> hosts -> web+db modules, reworking index page
Tero Marttila <terom@paivola.fi>
parents: 158
diff changeset
    17
def dt2ts (dt) :
f9f5e669bace pvl.verkko: refactor into dhcp -> hosts -> web+db modules, reworking index page
Tero Marttila <terom@paivola.fi>
parents: 158
diff changeset
    18
    return int(time.mktime(dt.timetuple()))
f9f5e669bace pvl.verkko: refactor into dhcp -> hosts -> web+db modules, reworking index page
Tero Marttila <terom@paivola.fi>
parents: 158
diff changeset
    19
f9f5e669bace pvl.verkko: refactor into dhcp -> hosts -> web+db modules, reworking index page
Tero Marttila <terom@paivola.fi>
parents: 158
diff changeset
    20
def ts2dt (ts) :
f9f5e669bace pvl.verkko: refactor into dhcp -> hosts -> web+db modules, reworking index page
Tero Marttila <terom@paivola.fi>
parents: 158
diff changeset
    21
    return datetime.datetime.fromtimestamp(ts)
f9f5e669bace pvl.verkko: refactor into dhcp -> hosts -> web+db modules, reworking index page
Tero Marttila <terom@paivola.fi>
parents: 158
diff changeset
    22
f9f5e669bace pvl.verkko: refactor into dhcp -> hosts -> web+db modules, reworking index page
Tero Marttila <terom@paivola.fi>
parents: 158
diff changeset
    23
# TODO: this should be DHCPHost
0
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    24
class Host (object) :
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    25
    DATE_FMT = '%Y%m%d'
27
38d050c657da hosts: better seen formatting, fix word wrapping
Tero Marttila <terom@paivola.fi>
parents: 26
diff changeset
    26
    TIME_FMT = '%H:%M:%S'
8
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
    27
    
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
    28
    MAC_HEX = r'([A-Za-z0-9]{2})'
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
    29
    MAC_SEP = r'[-:.]?'
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
    30
    MAC_RE = re.compile(MAC_SEP.join([MAC_HEX] * 6))
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
    31
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
    32
    @classmethod
14
02c21749cb4f pvl.verkko: re-add last_msg back to db, implement state, seen filtering in web frontend
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
    33
    def query (cls, session, seen=None) :
02c21749cb4f pvl.verkko: re-add last_msg back to db, implement state, seen filtering in web frontend
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
    34
        """
02c21749cb4f pvl.verkko: re-add last_msg back to db, implement state, seen filtering in web frontend
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
    35
            seen        - select hosts seen during given timedelta period
02c21749cb4f pvl.verkko: re-add last_msg back to db, implement state, seen filtering in web frontend
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
    36
        """
02c21749cb4f pvl.verkko: re-add last_msg back to db, implement state, seen filtering in web frontend
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
    37
        
02c21749cb4f pvl.verkko: re-add last_msg back to db, implement state, seen filtering in web frontend
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
    38
        query = session.query(cls)
02c21749cb4f pvl.verkko: re-add last_msg back to db, implement state, seen filtering in web frontend
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
    39
02c21749cb4f pvl.verkko: re-add last_msg back to db, implement state, seen filtering in web frontend
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
    40
        return query
02c21749cb4f pvl.verkko: re-add last_msg back to db, implement state, seen filtering in web frontend
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
    41
02c21749cb4f pvl.verkko: re-add last_msg back to db, implement state, seen filtering in web frontend
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
    42
    @classmethod
8
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
    43
    def normalize_mac (cls, mac) :
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
    44
        match = cls.MAC_RE.search(mac)
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
    45
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
    46
        if not match :
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
    47
            raise ValueError(mac)
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
    48
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
    49
        else :
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
    50
            return ':'.join(hh.lower() for hh in match.groups())
0
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    51
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    52
    def __init__ (self, ip, mac, name=None) :
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    53
        self.ip = ip
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    54
        self.mac = mac
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    55
        self.name = name
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    56
   
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    57
    def render_mac (self) :
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    58
        if not self.mac :
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    59
            return None
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    60
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    61
        elif len(self.mac) > (6 * 2 + 5) :
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    62
            return u'???'
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    63
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    64
        else :
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    65
            return unicode(self.mac)
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    66
179
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
    67
    def network (self) :
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
    68
        return self.gw
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
    69
0
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    70
    def render_name (self) :
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    71
        if self.name :
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    72
            return self.name.decode('ascii', 'replace')
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    73
        else :
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    74
            return None
14
02c21749cb4f pvl.verkko: re-add last_msg back to db, implement state, seen filtering in web frontend
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
    75
    
02c21749cb4f pvl.verkko: re-add last_msg back to db, implement state, seen filtering in web frontend
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
    76
    STATES = {
02c21749cb4f pvl.verkko: re-add last_msg back to db, implement state, seen filtering in web frontend
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
    77
        'DHCPACK':      'ack',
02c21749cb4f pvl.verkko: re-add last_msg back to db, implement state, seen filtering in web frontend
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
    78
        'DHCPNAK':      'nak',
02c21749cb4f pvl.verkko: re-add last_msg back to db, implement state, seen filtering in web frontend
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
    79
        'DHCPRELEASE':  'release',
02c21749cb4f pvl.verkko: re-add last_msg back to db, implement state, seen filtering in web frontend
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
    80
        'DHCPDISCOVER': 'search',
02c21749cb4f pvl.verkko: re-add last_msg back to db, implement state, seen filtering in web frontend
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
    81
        'DHCPREQUEST':  'search',
02c21749cb4f pvl.verkko: re-add last_msg back to db, implement state, seen filtering in web frontend
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
    82
        'DHCPOFFER':    'search',
02c21749cb4f pvl.verkko: re-add last_msg back to db, implement state, seen filtering in web frontend
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
    83
    }
02c21749cb4f pvl.verkko: re-add last_msg back to db, implement state, seen filtering in web frontend
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
    84
02c21749cb4f pvl.verkko: re-add last_msg back to db, implement state, seen filtering in web frontend
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
    85
    def state_class (self) :
16
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
    86
        if self.error :
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
    87
            return 'dhcp-error'
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
    88
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
    89
        elif self.state in self.STATES :
14
02c21749cb4f pvl.verkko: re-add last_msg back to db, implement state, seen filtering in web frontend
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
    90
            return 'dhcp-' + self.STATES[self.state]
02c21749cb4f pvl.verkko: re-add last_msg back to db, implement state, seen filtering in web frontend
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
    91
02c21749cb4f pvl.verkko: re-add last_msg back to db, implement state, seen filtering in web frontend
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
    92
        else :
02c21749cb4f pvl.verkko: re-add last_msg back to db, implement state, seen filtering in web frontend
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
    93
            return None
0
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    94
16
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
    95
    def state_title (self) :
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
    96
        return self.error # or None
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
    97
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
    98
    def render_state (self) :
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
    99
        if self.error :
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   100
            return "{self.state}: {self.error}".format(self=self)
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   101
        else :
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   102
            return self.state
27
38d050c657da hosts: better seen formatting, fix word wrapping
Tero Marttila <terom@paivola.fi>
parents: 26
diff changeset
   103
    
38d050c657da hosts: better seen formatting, fix word wrapping
Tero Marttila <terom@paivola.fi>
parents: 26
diff changeset
   104
    @classmethod
38d050c657da hosts: better seen formatting, fix word wrapping
Tero Marttila <terom@paivola.fi>
parents: 26
diff changeset
   105
    def format_datetime (cls, dt) :
38d050c657da hosts: better seen formatting, fix word wrapping
Tero Marttila <terom@paivola.fi>
parents: 26
diff changeset
   106
        if (datetime.datetime.now() - dt).days :
38d050c657da hosts: better seen formatting, fix word wrapping
Tero Marttila <terom@paivola.fi>
parents: 26
diff changeset
   107
            return dt.strftime(cls.DATE_FMT)
38d050c657da hosts: better seen formatting, fix word wrapping
Tero Marttila <terom@paivola.fi>
parents: 26
diff changeset
   108
38d050c657da hosts: better seen formatting, fix word wrapping
Tero Marttila <terom@paivola.fi>
parents: 26
diff changeset
   109
        else :
38d050c657da hosts: better seen formatting, fix word wrapping
Tero Marttila <terom@paivola.fi>
parents: 26
diff changeset
   110
            return dt.strftime(cls.TIME_FMT)
179
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   111
    
26
589249097230 hosts: convert realtime list into table; breaks animations :(
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   112
    def seen (self) :
16
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   113
        return (
27
38d050c657da hosts: better seen formatting, fix word wrapping
Tero Marttila <terom@paivola.fi>
parents: 26
diff changeset
   114
                html.span(title=self.first_seen)(self.format_datetime(self.first_seen)),
16
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   115
                '-',
27
38d050c657da hosts: better seen formatting, fix word wrapping
Tero Marttila <terom@paivola.fi>
parents: 26
diff changeset
   116
                html.span(title=self.last_seen)(self.format_datetime(self.last_seen))
0
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   117
        )
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   118
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   119
    def dns (self) :
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   120
        """
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   121
            Reverse-DNS lookup.
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   122
        """
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   123
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   124
        if not self.ip :
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   125
            return None
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   126
        
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   127
        sockaddrs = set(sockaddr for family, socktype, proto, canonname, sockaddr in socket.getaddrinfo(self.ip, 0, 0, 0, 0, socket.AI_NUMERICHOST))
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   128
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   129
        for sockaddr in sockaddrs :
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   130
            try :
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   131
                host, port = socket.getnameinfo(sockaddr, socket.NI_NAMEREQD)
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   132
            except socket.gaierror :
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   133
                continue
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   134
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   135
            return host
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   136
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   137
    def __unicode__ (self) :
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   138
        return u"{host.ip} ({host.mac})".format(host=self)
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   139
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   140
db.mapper(Host, db.dhcp_hosts, properties=dict(
16
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   141
    #id      = db.dhcp_hosts.c.rowid,
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   142
    #state   = db.dhcp_hosts.c.,
0
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   143
))
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   144
178
f9f5e669bace pvl.verkko: refactor into dhcp -> hosts -> web+db modules, reworking index page
Tero Marttila <terom@paivola.fi>
parents: 158
diff changeset
   145
## Controller 
179
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   146
def column (attr, title, column, rowhtml=None, sort=True, filter=True, colcss=True, rowfilter=True, rowtitle=None, rowcss=None) :
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   147
    """
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   148
        web.Table column spec.
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   149
    """
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   150
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   151
    return (attr, title, column, sort, filter, colcss, rowhtml, rowfilter, rowtitle, rowcss)
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   152
178
f9f5e669bace pvl.verkko: refactor into dhcp -> hosts -> web+db modules, reworking index page
Tero Marttila <terom@paivola.fi>
parents: 158
diff changeset
   153
class BaseHandler (web.DatabaseHandler) :
f9f5e669bace pvl.verkko: refactor into dhcp -> hosts -> web+db modules, reworking index page
Tero Marttila <terom@paivola.fi>
parents: 158
diff changeset
   154
    """
f9f5e669bace pvl.verkko: refactor into dhcp -> hosts -> web+db modules, reworking index page
Tero Marttila <terom@paivola.fi>
parents: 158
diff changeset
   155
        Common controller stuff for DHCP hosts
f9f5e669bace pvl.verkko: refactor into dhcp -> hosts -> web+db modules, reworking index page
Tero Marttila <terom@paivola.fi>
parents: 158
diff changeset
   156
    """
26
589249097230 hosts: convert realtime list into table; breaks animations :(
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   157
178
f9f5e669bace pvl.verkko: refactor into dhcp -> hosts -> web+db modules, reworking index page
Tero Marttila <terom@paivola.fi>
parents: 158
diff changeset
   158
    CSS = (
f9f5e669bace pvl.verkko: refactor into dhcp -> hosts -> web+db modules, reworking index page
Tero Marttila <terom@paivola.fi>
parents: 158
diff changeset
   159
        "/static/dhcp/hosts.css", 
f9f5e669bace pvl.verkko: refactor into dhcp -> hosts -> web+db modules, reworking index page
Tero Marttila <terom@paivola.fi>
parents: 158
diff changeset
   160
    )
f9f5e669bace pvl.verkko: refactor into dhcp -> hosts -> web+db modules, reworking index page
Tero Marttila <terom@paivola.fi>
parents: 158
diff changeset
   161
    JS = (
f9f5e669bace pvl.verkko: refactor into dhcp -> hosts -> web+db modules, reworking index page
Tero Marttila <terom@paivola.fi>
parents: 158
diff changeset
   162
        #"/static/jquery/jquery.js"
f9f5e669bace pvl.verkko: refactor into dhcp -> hosts -> web+db modules, reworking index page
Tero Marttila <terom@paivola.fi>
parents: 158
diff changeset
   163
    )
179
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   164
    
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   165
    TABLE = Host
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   166
    TABLE_COLUMNS = (
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   167
        #column('id',    "#",        Host.id         ),
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   168
        column('ip',    "IP",       Host.ip,        ),
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   169
        column('mac',   "MAC",      Host.mac,       Host.render_mac),
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   170
        column('name',  "Hostname", Host.name,      Host.render_name, rowfilter=False),
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   171
        column('gw',    "Network",  Host.gw,        Host.network, rowfilter=False),
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   172
        column('seen',  "Seen",     Host.last_seen, Host.seen, rowfilter=False),
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   173
        column('state', "State",    Host.count,     rowtitle=Host.state_title, rowcss=Host.state_class, rowfilter=False),
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   174
    )
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   175
    
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   176
    # attr -> column
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   177
    TABLE_ATTRS = dict((attr, column) for attr, title, column, sort, filter, colcss, rowhtml, rowfilter, rowtitle, rowcss in TABLE_COLUMNS)
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   178
    
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   179
    # default sort
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   180
    TABLE_SORT = Host.last_seen.desc()
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   181
    
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   182
    # items per page
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   183
    TABLE_PAGE = 10
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   184
    
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   185
    # target for items
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   186
    TABLE_URL = None
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   187
    TABLE_ITEM_URL = None
0
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   188
5
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   189
    def query (self) :
179
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   190
        """
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   191
            Database SELECT query.
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   192
        """
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   193
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   194
        return self.db.query(self.TABLE)
16
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   195
    
179
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   196
    def sort (self, query, default=TABLE_SORT) :
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   197
        """
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   198
            Apply ?sort= from requset args to query.
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   199
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   200
            Return { attr: sort }, query
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   201
        """
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   202
30
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   203
        sort = self.request.args.get('sort')
0
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   204
30
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   205
        if sort :
36
90af93caef84 hosts: two-way sorting
Tero Marttila <terom@paivola.fi>
parents: 31
diff changeset
   206
            name = sort.lstrip('+-')
90af93caef84 hosts: two-way sorting
Tero Marttila <terom@paivola.fi>
parents: 31
diff changeset
   207
        else :
90af93caef84 hosts: two-way sorting
Tero Marttila <terom@paivola.fi>
parents: 31
diff changeset
   208
            name = None
90af93caef84 hosts: two-way sorting
Tero Marttila <terom@paivola.fi>
parents: 31
diff changeset
   209
90af93caef84 hosts: two-way sorting
Tero Marttila <terom@paivola.fi>
parents: 31
diff changeset
   210
        if name :
179
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   211
            order_by = self.TABLE_ATTRS[name]
3
5990b188c54b web.Handler
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
   212
        else :
30
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   213
            order_by = default
36
90af93caef84 hosts: two-way sorting
Tero Marttila <terom@paivola.fi>
parents: 31
diff changeset
   214
        
179
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   215
        # prefix -> ordering
36
90af93caef84 hosts: two-way sorting
Tero Marttila <terom@paivola.fi>
parents: 31
diff changeset
   216
        if not sort :
90af93caef84 hosts: two-way sorting
Tero Marttila <terom@paivola.fi>
parents: 31
diff changeset
   217
            pass
90af93caef84 hosts: two-way sorting
Tero Marttila <terom@paivola.fi>
parents: 31
diff changeset
   218
        elif sort.startswith('+') :
90af93caef84 hosts: two-way sorting
Tero Marttila <terom@paivola.fi>
parents: 31
diff changeset
   219
            order_by = order_by.asc()
90af93caef84 hosts: two-way sorting
Tero Marttila <terom@paivola.fi>
parents: 31
diff changeset
   220
        elif sort.startswith('-') :
90af93caef84 hosts: two-way sorting
Tero Marttila <terom@paivola.fi>
parents: 31
diff changeset
   221
            order_by = order_by.desc()
90af93caef84 hosts: two-way sorting
Tero Marttila <terom@paivola.fi>
parents: 31
diff changeset
   222
        else :
90af93caef84 hosts: two-way sorting
Tero Marttila <terom@paivola.fi>
parents: 31
diff changeset
   223
            pass
179
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   224
        
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   225
        # apply
30
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   226
        log.debug("sort: %s", order_by)
16
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   227
        
179
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   228
        query = query.order_by(order_by)
3
5990b188c54b web.Handler
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
   229
179
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   230
        return sort, query
5
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   231
    
179
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   232
    def filter_seen (self, value) :
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   233
        """
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   234
            Return filter expression for given attr == value
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   235
        """
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   236
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   237
        column = Host.last_seen
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   238
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   239
        if value.isdigit() :
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   240
            # specific date
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   241
            date = datetime.datetime.strptime(value, Host.DATE_FMT).date()
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   242
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   243
            return db.between(date.strftime(Host.DATE_FMT), 
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   244
                    db.func.strftime(Host.DATE_FMT, Host.first_seen),
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   245
                    db.func.strftime(Host.DATE_FMT, Host.last_seen)
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   246
            )
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   247
        else :
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   248
            # recent
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   249
            timedelta = parse_timedelta(value)
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   250
            
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   251
            return ((db.func.now() - Host.last_seen) < timedelta)
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   252
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   253
            # XXX: for sqlite, pgsql should handle this natively?
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   254
            # to seconds
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   255
            #timeout = timedelta.days * (24 * 60 * 60) + timedelta.seconds
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   256
            
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   257
            # WHERE strftime('%s', 'now') - strftime('%s', last_seen) < :timeout
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   258
            #filter = (db.func.strftime('%s', 'now') - db.func.strftime('%s', Host.last_seen) < timeout)
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   259
        
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   260
    def filter_ip (self, value) :
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   261
        column = Host.ip
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   262
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   263
        # column is IPv4 string literal format...
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   264
        if '/' in value :
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   265
            return (db.func.inet(Host.ip).op('<<')(db.func.cidr(value)))
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   266
        else :
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   267
            return (db.func.inet(Host.ip) == db.func.inet(value))
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   268
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   269
    def filter_mac (self, value) :
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   270
        return self.filter_attr('mac', Host.normalize_mac(value))
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   271
30
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   272
    def filter_attr (self, attr, value) :
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   273
        """
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   274
            Return filter expression for given attr == value
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   275
        """
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   276
179
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   277
        # preprocess
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   278
        like = False
30
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   279
179
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   280
        if value.endswith('*') :
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   281
            like = value.replace('*', '%')
30
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   282
179
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   283
        # filter
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   284
        column = self.TABLE_ATTRS[attr]
30
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   285
179
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   286
        if like :
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   287
            return (column.like(like))
30
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   288
        else :
179
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   289
            return (column == value)
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   290
 
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   291
    def _filter (self, attr, values) :
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   292
        """
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   293
            Apply filters for given attr -> (value, expression)
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   294
        """
30
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   295
179
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   296
        for value in values :
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   297
            value = value.strip()
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   298
            
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   299
            # ignore empty fields
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   300
            if not value :
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   301
                continue
30
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   302
179
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   303
            # lookup attr-specific filter
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   304
            filter = getattr(self, 'filter_{attr}'.format(attr=attr), None)
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   305
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   306
            if filter :
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   307
                filter = filter(value)
30
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   308
            else :
179
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   309
                # use generic
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   310
                filter = self.filter_attr(attr, value)
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   311
            
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   312
            log.debug("%s: %s: %s", attr, value, filter)
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   313
            
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   314
            yield value, filter
30
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   315
179
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   316
    def filter (self, query) :
30
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   317
        """
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   318
            Apply filters from request.args against given hosts.
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   319
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   320
            Returns (filters, hosts).
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   321
        """
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   322
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   323
        # filter?
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   324
        filters = {}
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   325
179
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   326
        for attr in self.TABLE_ATTRS :
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   327
            # from request args
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   328
            values = self.request.args.getlist(attr)
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   329
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   330
            # lookup attr filters as expressions
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   331
            value_filters = list(self._filter(attr, values))
30
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   332
41
9d08152b46a7 pvl.verkko.hosts: fix filter attr for empty fields
Tero Marttila <terom@paivola.fi>
parents: 37
diff changeset
   333
            # ignore empty fields
179
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   334
            if not value_filters :
30
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   335
                continue
179
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   336
        
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   337
            # filtering values, and filter expressions
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   338
            values, expressions = zip(*value_filters)
30
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   339
179
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   340
            # apply
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   341
            query = query.filter(db.or_(*expressions))
30
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   342
            filters[attr] = values
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   343
179
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   344
        return filters, query
30
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   345
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   346
    def filters_title (self) :
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   347
        """
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   348
            Return a string representing the applied filters.
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   349
        """
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   350
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   351
        return ', '.join(value for values in self.filters.itervalues() for value in values)
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   352
 
179
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   353
    def render_table (self, query, caption=None, sort=None, filters=None, page=None, hilight=None) :
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   354
        """
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   355
            Return <table> element. Wrapped in <form> if filters.
4
Tero Marttila <terom@paivola.fi>
parents: 3
diff changeset
   356
179
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   357
                query   - filter()'d sort()'d SELECT query()
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   358
                caption - optional <caption>
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   359
                sort    - None for no sorting ui, sort-attr otherwise.
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   360
                filters - None for no filtering ui, dict of filters otherwise.
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   361
                page    - display pagination for given page
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   362
                hilight - { attr: value } cells to hilight
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   363
        """
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   364
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   365
        def url (filters=filters, sort=sort, **opts) :
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   366
            """
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   367
                URL for table with given opts, keeping our sorting/filtering unless overriden.
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   368
            """
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   369
11
d1e17bd498e7 fix filters in ItemHandler, tweak id styling
Tero Marttila <terom@paivola.fi>
parents: 10
diff changeset
   370
            args = dict()
d1e17bd498e7 fix filters in ItemHandler, tweak id styling
Tero Marttila <terom@paivola.fi>
parents: 10
diff changeset
   371
d1e17bd498e7 fix filters in ItemHandler, tweak id styling
Tero Marttila <terom@paivola.fi>
parents: 10
diff changeset
   372
            if filters :
d1e17bd498e7 fix filters in ItemHandler, tweak id styling
Tero Marttila <terom@paivola.fi>
parents: 10
diff changeset
   373
                args.update(filters)
179
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   374
            
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   375
            if sort :
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   376
                args['sort'] = sort
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   377
            
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   378
            if opts :
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   379
                args.update(opts)
9
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   380
179
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   381
            return self.url(self.TABLE_URL, **args)
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   382
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   383
        def sorturl (attr, sort=sort) :
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   384
            """
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   385
                URL for table sorted by given column, reversing direction if already sorting by given column.
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   386
            """
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   387
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   388
            if not sort :
36
90af93caef84 hosts: two-way sorting
Tero Marttila <terom@paivola.fi>
parents: 31
diff changeset
   389
                sort = attr
179
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   390
            elif sort.lstrip('+-') != attr :
36
90af93caef84 hosts: two-way sorting
Tero Marttila <terom@paivola.fi>
parents: 31
diff changeset
   391
                sort = attr
179
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   392
            elif sort.startswith('-') :
36
90af93caef84 hosts: two-way sorting
Tero Marttila <terom@paivola.fi>
parents: 31
diff changeset
   393
                sort = "+" + attr
90af93caef84 hosts: two-way sorting
Tero Marttila <terom@paivola.fi>
parents: 31
diff changeset
   394
            else :
90af93caef84 hosts: two-way sorting
Tero Marttila <terom@paivola.fi>
parents: 31
diff changeset
   395
                sort = "-" + attr
90af93caef84 hosts: two-way sorting
Tero Marttila <terom@paivola.fi>
parents: 31
diff changeset
   396
179
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   397
            return url(sort=sort)
36
90af93caef84 hosts: two-way sorting
Tero Marttila <terom@paivola.fi>
parents: 31
diff changeset
   398
179
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   399
        def itemurl (item) :
16
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   400
            """
179
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   401
                URL for given item, by id.
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   402
            """
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   403
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   404
            if self.TABLE_ITEM_URL :
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   405
                # separate page
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   406
                return self.url(self.TABLE_ITEM_URL, id=item.id)
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   407
            else :
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   408
                # to our table
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   409
                return url() + '#{id}'.format(id=item.id)
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   410
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   411
        def render_filter (attr) :
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   412
            """
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   413
                Render filter-input for column.
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   414
            """
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   415
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   416
            value = filters.get(attr)
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   417
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   418
            if value :
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   419
                # XXX: multi-valued filters?
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   420
                value = value[0]
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   421
            else :
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   422
                value = None
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   423
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   424
            return html.input(type='text', name=attr, value=value)
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   425
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   426
        def render_head () :
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   427
            """
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   428
                Yield header, filter rows for columns in table header.
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   429
            """
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   430
            
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   431
            # id
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   432
            yield html.td('#'), html.td(html.input(type='submit', value=u'\u00BF'))
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   433
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   434
            for attr, title, column, sort, filter, colcss, rowhtml, rowfilter, rowtitle, rowcss in self.TABLE_COLUMNS :
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   435
                header = title
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   436
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   437
                if sort :
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   438
                    header = html.a(href=sorturl(attr))(header)
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   439
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   440
                header = html.th(header)
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   441
                
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   442
                if filters is not None and filter :
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   443
                    filter = render_filter(attr)
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   444
                else  :
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   445
                    filter = None
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   446
                
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   447
                if colcss is True :
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   448
                    colcss = attr
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   449
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   450
                filter = html.td(class_=colcss)(filter)
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   451
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   452
                yield header, filter
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   453
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   454
        def render_cell (attr, value, rowhtml=None, colcss=True, filter=None, rowtitle=None, rowcss=None, hilight=hilight) :
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   455
            """
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   456
                Render a single cell.
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   457
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   458
                    colcss      - css class for column; True -> attr
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   459
                    filter      - render filter link for value?
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   460
                    htmlvalue   - rendered value?
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   461
                    title       - mouseover title for cell
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   462
                    rowcss      - css class for row
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   463
            """
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   464
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   465
            if not rowhtml :
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   466
                rowhtml = value
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   467
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   468
            if filter :
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   469
                cell = html.a(href=url(filters=None, **{attr: value}))(rowhtml)
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   470
            else :
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   471
                cell = rowhtml
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   472
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   473
            if colcss is True :
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   474
                colcss = attr
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   475
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   476
            if hilight :
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   477
                hilight = attr in hilight and value in hilight[attr]
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   478
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   479
            css = (colcss, rowcss, 'hilight' if hilight else None)
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   480
            css = ' '.join(cls for cls in css if cls)
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   481
            
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   482
            return html.td(class_=css, title=rowtitle)(cell)
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   483
       
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   484
        def render_row (item) :
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   485
            """
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   486
                Yield columns for row.
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   487
            """
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   488
            
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   489
            for attr, title, column, sort, filter, colcss, rowhtml, rowfilter, rowtitle, rowcss in self.TABLE_COLUMNS :
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   490
                # XXX: this is sometimes broken, figure out how to index by column
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   491
                value = getattr(item, attr)
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   492
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   493
                if rowhtml :
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   494
                    rowhtml = rowhtml(item)
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   495
                else :
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   496
                    rowhtml = value
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   497
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   498
                if rowtitle :
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   499
                    rowtitle = rowtitle(item)
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   500
                else :
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   501
                    rowtitle = None
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   502
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   503
                if rowcss :
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   504
                    rowcss = rowcss(item)
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   505
                else :
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   506
                    rowcss = None
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   507
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   508
                yield render_cell(attr, value,
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   509
                        rowhtml     = rowhtml,
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   510
                        colcss      = colcss,
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   511
                        filter      = value if rowfilter else None,
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   512
                        rowtitle    = rowtitle,
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   513
                        rowcss      = rowcss,
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   514
                )
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   515
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   516
        def render_body (rows) :
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   517
            """
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   518
                Yield rows.
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   519
            """
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   520
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   521
            for i, item in enumerate(rows) :
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   522
                yield html.tr(class_=('alternate' if i % 2 else None), id=item.id)(
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   523
                    html.th(
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   524
                        html.a(href=itemurl(item))("#")
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   525
                    ),
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   526
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   527
                    render_row(item)
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   528
                )
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   529
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   530
        def render_pagination (page, count=None) :
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   531
            """
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   532
                Render pagination links.
16
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   533
            """
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   534
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   535
            if count is not None :
179
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   536
                pages = int(math.ceil(count / self.TABLE_PAGE))
16
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   537
            else :
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   538
                pages = None
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   539
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   540
            if page > 0 :
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   541
                yield html.a(href=url(page=0))(html("&laquo;&laquo; First"))
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   542
                yield html.a(href=url(page=(page - 1)))(html("&laquo; Prev"))
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   543
            
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   544
            yield html.span("Page {page} of {pages}".format(page=(page + 1), pages=(pages or '???')))
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   545
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   546
            yield html.a(href=url(page=(page + 1)))(html("&raquo; Next"))
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   547
21
55ca67b5000d hosts.BaseHandler.render_hosts: hilight for ip/mac in host related list
Tero Marttila <terom@paivola.fi>
parents: 20
diff changeset
   548
179
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   549
        def render_foot () :
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   550
            # XXX: does separate SELECT count()
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   551
            count = query.count()
21
55ca67b5000d hosts.BaseHandler.render_hosts: hilight for ip/mac in host related list
Tero Marttila <terom@paivola.fi>
parents: 20
diff changeset
   552
179
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   553
            if page :
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   554
                return render_pagination(page, count)
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   555
            else :
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   556
                return "{count} hosts".format(count=count)
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   557
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   558
        # columns for the two header rows
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   559
        headers, filtering = zip(*list(render_head()))
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   560
        
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   561
        # render table
9
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   562
        table = html.table(
179
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   563
            html.caption(caption) if caption else None,
5
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   564
            html.thead(
179
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   565
                html.tr(headers),
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   566
                # filters?
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   567
                html.tr(class_='filter')(filtering) if filters is not None else None,
5
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   568
            ),
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   569
            html.tbody(
179
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   570
                render_body(query)
12
Tero Marttila <terom@paivola.fi>
parents: 11
diff changeset
   571
            ),
Tero Marttila <terom@paivola.fi>
parents: 11
diff changeset
   572
            html.tfoot(
Tero Marttila <terom@paivola.fi>
parents: 11
diff changeset
   573
                html.tr(
179
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   574
                    html.td(colspan=(1 + len(self.TABLE_COLUMNS)))(
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   575
                        render_foot()
12
Tero Marttila <terom@paivola.fi>
parents: 11
diff changeset
   576
                    )
Tero Marttila <terom@paivola.fi>
parents: 11
diff changeset
   577
                )
5
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   578
            )
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   579
        )
9
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   580
        
179
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   581
        # filters form?
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   582
        if filters is None :
9
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   583
            return table
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   584
        else :
179
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   585
            return html.form(method='get', action=url(filters=None, sort=None))(
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   586
                html.input(type='hidden', name='sort', value=sort),
9
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   587
                table,
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   588
            )
4
Tero Marttila <terom@paivola.fi>
parents: 3
diff changeset
   589
5
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   590
class ItemHandler (BaseHandler) :
178
f9f5e669bace pvl.verkko: refactor into dhcp -> hosts -> web+db modules, reworking index page
Tero Marttila <terom@paivola.fi>
parents: 158
diff changeset
   591
    """
f9f5e669bace pvl.verkko: refactor into dhcp -> hosts -> web+db modules, reworking index page
Tero Marttila <terom@paivola.fi>
parents: 158
diff changeset
   592
        A specific DHCP host, along with a list of related hosts.
f9f5e669bace pvl.verkko: refactor into dhcp -> hosts -> web+db modules, reworking index page
Tero Marttila <terom@paivola.fi>
parents: 158
diff changeset
   593
    """
179
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   594
    
5
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   595
    def process (self, id) :
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   596
        self.hosts = self.query()
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   597
        self.host = self.hosts.get(id)
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   598
        
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   599
        if not self.host :
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   600
            raise web.NotFound("No such host: {id}".format(id=id))
30
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   601
        
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   602
        self.sorts, self.hosts = self.sort(self.hosts.filter((Host.ip == self.host.ip) | (Host.mac == self.host.mac)))
5
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   603
    
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   604
    def title (self) :
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   605
        return u"DHCP Host: {self.host}".format(self=self)
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   606
20
790e78bed63e hosts: mac/ip filtering keeps current filter; move render_host into ItemHandler
Tero Marttila <terom@paivola.fi>
parents: 19
diff changeset
   607
    def render_host (self, host) :
790e78bed63e hosts: mac/ip filtering keeps current filter; move render_host into ItemHandler
Tero Marttila <terom@paivola.fi>
parents: 19
diff changeset
   608
        """
790e78bed63e hosts: mac/ip filtering keeps current filter; move render_host into ItemHandler
Tero Marttila <terom@paivola.fi>
parents: 19
diff changeset
   609
            Details for specific host.
790e78bed63e hosts: mac/ip filtering keeps current filter; move render_host into ItemHandler
Tero Marttila <terom@paivola.fi>
parents: 19
diff changeset
   610
        """
790e78bed63e hosts: mac/ip filtering keeps current filter; move render_host into ItemHandler
Tero Marttila <terom@paivola.fi>
parents: 19
diff changeset
   611
790e78bed63e hosts: mac/ip filtering keeps current filter; move render_host into ItemHandler
Tero Marttila <terom@paivola.fi>
parents: 19
diff changeset
   612
        attrs = (
790e78bed63e hosts: mac/ip filtering keeps current filter; move render_host into ItemHandler
Tero Marttila <terom@paivola.fi>
parents: 19
diff changeset
   613
                ('Network',     host.gw),
790e78bed63e hosts: mac/ip filtering keeps current filter; move render_host into ItemHandler
Tero Marttila <terom@paivola.fi>
parents: 19
diff changeset
   614
                ('IP',          host.ip),
790e78bed63e hosts: mac/ip filtering keeps current filter; move render_host into ItemHandler
Tero Marttila <terom@paivola.fi>
parents: 19
diff changeset
   615
                ('MAC',         host.mac),
790e78bed63e hosts: mac/ip filtering keeps current filter; move render_host into ItemHandler
Tero Marttila <terom@paivola.fi>
parents: 19
diff changeset
   616
                ('Hostname',    host.name),
790e78bed63e hosts: mac/ip filtering keeps current filter; move render_host into ItemHandler
Tero Marttila <terom@paivola.fi>
parents: 19
diff changeset
   617
                ('DNS',         host.dns()),
790e78bed63e hosts: mac/ip filtering keeps current filter; move render_host into ItemHandler
Tero Marttila <terom@paivola.fi>
parents: 19
diff changeset
   618
                ('First seen',  host.first_seen),
790e78bed63e hosts: mac/ip filtering keeps current filter; move render_host into ItemHandler
Tero Marttila <terom@paivola.fi>
parents: 19
diff changeset
   619
                ('Last seen',   host.last_seen),
790e78bed63e hosts: mac/ip filtering keeps current filter; move render_host into ItemHandler
Tero Marttila <terom@paivola.fi>
parents: 19
diff changeset
   620
                ('Last state',  host.render_state()),
790e78bed63e hosts: mac/ip filtering keeps current filter; move render_host into ItemHandler
Tero Marttila <terom@paivola.fi>
parents: 19
diff changeset
   621
                ('Total messages',      host.count),
790e78bed63e hosts: mac/ip filtering keeps current filter; move render_host into ItemHandler
Tero Marttila <terom@paivola.fi>
parents: 19
diff changeset
   622
        )
790e78bed63e hosts: mac/ip filtering keeps current filter; move render_host into ItemHandler
Tero Marttila <terom@paivola.fi>
parents: 19
diff changeset
   623
        
790e78bed63e hosts: mac/ip filtering keeps current filter; move render_host into ItemHandler
Tero Marttila <terom@paivola.fi>
parents: 19
diff changeset
   624
        return (
790e78bed63e hosts: mac/ip filtering keeps current filter; move render_host into ItemHandler
Tero Marttila <terom@paivola.fi>
parents: 19
diff changeset
   625
            html.dl(
790e78bed63e hosts: mac/ip filtering keeps current filter; move render_host into ItemHandler
Tero Marttila <terom@paivola.fi>
parents: 19
diff changeset
   626
                (html.dt(title), html.dd(value)) for title, value in attrs
790e78bed63e hosts: mac/ip filtering keeps current filter; move render_host into ItemHandler
Tero Marttila <terom@paivola.fi>
parents: 19
diff changeset
   627
            )
790e78bed63e hosts: mac/ip filtering keeps current filter; move render_host into ItemHandler
Tero Marttila <terom@paivola.fi>
parents: 19
diff changeset
   628
        )
790e78bed63e hosts: mac/ip filtering keeps current filter; move render_host into ItemHandler
Tero Marttila <terom@paivola.fi>
parents: 19
diff changeset
   629
5
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   630
    def render (self) :
20
790e78bed63e hosts: mac/ip filtering keeps current filter; move render_host into ItemHandler
Tero Marttila <terom@paivola.fi>
parents: 19
diff changeset
   631
        return (
790e78bed63e hosts: mac/ip filtering keeps current filter; move render_host into ItemHandler
Tero Marttila <terom@paivola.fi>
parents: 19
diff changeset
   632
            html.h2('Host'),
790e78bed63e hosts: mac/ip filtering keeps current filter; move render_host into ItemHandler
Tero Marttila <terom@paivola.fi>
parents: 19
diff changeset
   633
            self.render_host(self.host),
790e78bed63e hosts: mac/ip filtering keeps current filter; move render_host into ItemHandler
Tero Marttila <terom@paivola.fi>
parents: 19
diff changeset
   634
790e78bed63e hosts: mac/ip filtering keeps current filter; move render_host into ItemHandler
Tero Marttila <terom@paivola.fi>
parents: 19
diff changeset
   635
            html.h2('Related'),
179
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   636
            self.render_table(self.hosts, sort=self.sorts, hilight=dict(ip=self.host.ip, mac=self.host.mac)),
20
790e78bed63e hosts: mac/ip filtering keeps current filter; move render_host into ItemHandler
Tero Marttila <terom@paivola.fi>
parents: 19
diff changeset
   637
790e78bed63e hosts: mac/ip filtering keeps current filter; move render_host into ItemHandler
Tero Marttila <terom@paivola.fi>
parents: 19
diff changeset
   638
            html.a(href=self.url(ListHandler))(html('&laquo;'), 'Back'),
790e78bed63e hosts: mac/ip filtering keeps current filter; move render_host into ItemHandler
Tero Marttila <terom@paivola.fi>
parents: 19
diff changeset
   639
        )
790e78bed63e hosts: mac/ip filtering keeps current filter; move render_host into ItemHandler
Tero Marttila <terom@paivola.fi>
parents: 19
diff changeset
   640
5
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   641
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   642
class ListHandler (BaseHandler) :
178
f9f5e669bace pvl.verkko: refactor into dhcp -> hosts -> web+db modules, reworking index page
Tero Marttila <terom@paivola.fi>
parents: 158
diff changeset
   643
    """
f9f5e669bace pvl.verkko: refactor into dhcp -> hosts -> web+db modules, reworking index page
Tero Marttila <terom@paivola.fi>
parents: 158
diff changeset
   644
        List of DHCP hosts for given filter.
f9f5e669bace pvl.verkko: refactor into dhcp -> hosts -> web+db modules, reworking index page
Tero Marttila <terom@paivola.fi>
parents: 158
diff changeset
   645
    """
f9f5e669bace pvl.verkko: refactor into dhcp -> hosts -> web+db modules, reworking index page
Tero Marttila <terom@paivola.fi>
parents: 158
diff changeset
   646
179
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   647
    TABLE_PAGE = 10
16
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   648
8
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
   649
    def process (self) :
14
02c21749cb4f pvl.verkko: re-add last_msg back to db, implement state, seen filtering in web frontend
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   650
        hosts = self.query()
9
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   651
30
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   652
        # filter
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   653
        self.filters, hosts = self.filter(hosts)
16
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   654
19
4e2e26f4d058 pvl.verkko.hosts: multi-value filters
Tero Marttila <terom@paivola.fi>
parents: 17
diff changeset
   655
        # sort XXX: default per filter column?
30
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   656
        self.sorts, hosts = self.sort(hosts)
16
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   657
        
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   658
        # page?
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   659
        self.page = self.request.args.get('page')
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   660
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   661
        if self.page :
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   662
            self.page = int(self.page)
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   663
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   664
            hosts = hosts.offset(self.page * self.PAGE).limit(self.PAGE)
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   665
14
02c21749cb4f pvl.verkko: re-add last_msg back to db, implement state, seen filtering in web frontend
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   666
        self.hosts = hosts
30
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   667
  
5
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   668
    def title (self) :
8
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
   669
        if self.filters :
30
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   670
            return "DHCP Hosts: {filters}".format(filters=self.filters_title())
8
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
   671
        else :
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
   672
            return "DHCP Hosts"
5
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   673
    
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   674
    def render (self) :
8
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
   675
        return (
179
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   676
            self.render_table(self.hosts, filters=self.filters, sort=self.sorts, page=self.page),
8
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
   677
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
   678
            html.a(href=self.url())(html('&laquo;'), 'Back') if self.filters else None,
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
   679
        )
25
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   680
179
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   681
# XXX:
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   682
BaseHandler.TABLE_URL = ListHandler
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   683
BaseHandler.TABLE_ITEM_URL = ItemHandler
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   684
30
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   685
class RealtimeHandler (BaseHandler) :
178
f9f5e669bace pvl.verkko: refactor into dhcp -> hosts -> web+db modules, reworking index page
Tero Marttila <terom@paivola.fi>
parents: 158
diff changeset
   686
    TITLE = "DHCP Pseudo-Realtime hosts.."
f9f5e669bace pvl.verkko: refactor into dhcp -> hosts -> web+db modules, reworking index page
Tero Marttila <terom@paivola.fi>
parents: 158
diff changeset
   687
    CSS = BaseHandler.CSS + (
28
9940bc6c0a34 hosts: use jquery ui background color animation instead of position
Tero Marttila <terom@paivola.fi>
parents: 27
diff changeset
   688
        'http://code.jquery.com/ui/1.9.0/themes/base/jquery-ui.css',
9940bc6c0a34 hosts: use jquery ui background color animation instead of position
Tero Marttila <terom@paivola.fi>
parents: 27
diff changeset
   689
    )
25
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   690
    JS = (
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   691
        #"/static/jquery/jquery.js",
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   692
        'http://code.jquery.com/jquery-1.8.2.js',
28
9940bc6c0a34 hosts: use jquery ui background color animation instead of position
Tero Marttila <terom@paivola.fi>
parents: 27
diff changeset
   693
        'http://code.jquery.com/ui/1.9.0/jquery-ui.js',
158
3ff66d4f401c split up static into rrd/dhcp
Tero Marttila <terom@paivola.fi>
parents: 151
diff changeset
   694
        '/static/dhcp/spin.js',
3ff66d4f401c split up static into rrd/dhcp
Tero Marttila <terom@paivola.fi>
parents: 151
diff changeset
   695
        '/static/dhcp/hosts.js',
25
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   696
    )
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   697
29
38265b7d8f62 hosts.RealtimeHandler: refactor COLUMNS handling
Tero Marttila <terom@paivola.fi>
parents: 28
diff changeset
   698
    COLUMNS = (
38265b7d8f62 hosts.RealtimeHandler: refactor COLUMNS handling
Tero Marttila <terom@paivola.fi>
parents: 28
diff changeset
   699
        ( 'ip',     'IP',           lambda host: host.ip    ),
38265b7d8f62 hosts.RealtimeHandler: refactor COLUMNS handling
Tero Marttila <terom@paivola.fi>
parents: 28
diff changeset
   700
        ( 'mac',    'MAC',          lambda host: host.mac   ),
38265b7d8f62 hosts.RealtimeHandler: refactor COLUMNS handling
Tero Marttila <terom@paivola.fi>
parents: 28
diff changeset
   701
        ( 'name',   'Hostname',     lambda host: host.name  ),
38265b7d8f62 hosts.RealtimeHandler: refactor COLUMNS handling
Tero Marttila <terom@paivola.fi>
parents: 28
diff changeset
   702
        ( 'gw',     'Network',      lambda host: host.gw    ),
38265b7d8f62 hosts.RealtimeHandler: refactor COLUMNS handling
Tero Marttila <terom@paivola.fi>
parents: 28
diff changeset
   703
        ( 'seen',   'Seen',         Host.seen,              ),
38265b7d8f62 hosts.RealtimeHandler: refactor COLUMNS handling
Tero Marttila <terom@paivola.fi>
parents: 28
diff changeset
   704
        ( 'state',  'State',        lambda host: host.state ),
38265b7d8f62 hosts.RealtimeHandler: refactor COLUMNS handling
Tero Marttila <terom@paivola.fi>
parents: 28
diff changeset
   705
    )
38265b7d8f62 hosts.RealtimeHandler: refactor COLUMNS handling
Tero Marttila <terom@paivola.fi>
parents: 28
diff changeset
   706
25
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   707
    def process (self) :
30
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   708
        """
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   709
            Either return JSON (if ?t=...), or fetch hosts/t for rendering.
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   710
        """
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   711
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   712
        hosts = self.db.query(Host)
25
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   713
        t = self.request.args.get('t')
30
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   714
        
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   715
        # always sorted by last_seen
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   716
        hosts = hosts.order_by(Host.last_seen.desc())
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   717
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   718
        # filter
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   719
        self.filters, hosts = self.filter(hosts)
29
38265b7d8f62 hosts.RealtimeHandler: refactor COLUMNS handling
Tero Marttila <terom@paivola.fi>
parents: 28
diff changeset
   720
38265b7d8f62 hosts.RealtimeHandler: refactor COLUMNS handling
Tero Marttila <terom@paivola.fi>
parents: 28
diff changeset
   721
        def host_params (host) :
38265b7d8f62 hosts.RealtimeHandler: refactor COLUMNS handling
Tero Marttila <terom@paivola.fi>
parents: 28
diff changeset
   722
            yield 'id', host.id
38265b7d8f62 hosts.RealtimeHandler: refactor COLUMNS handling
Tero Marttila <terom@paivola.fi>
parents: 28
diff changeset
   723
38265b7d8f62 hosts.RealtimeHandler: refactor COLUMNS handling
Tero Marttila <terom@paivola.fi>
parents: 28
diff changeset
   724
            for name, title, fvalue in self.COLUMNS :
38265b7d8f62 hosts.RealtimeHandler: refactor COLUMNS handling
Tero Marttila <terom@paivola.fi>
parents: 28
diff changeset
   725
                value = fvalue(host)
38265b7d8f62 hosts.RealtimeHandler: refactor COLUMNS handling
Tero Marttila <terom@paivola.fi>
parents: 28
diff changeset
   726
38265b7d8f62 hosts.RealtimeHandler: refactor COLUMNS handling
Tero Marttila <terom@paivola.fi>
parents: 28
diff changeset
   727
                if name == 'seen' :
38265b7d8f62 hosts.RealtimeHandler: refactor COLUMNS handling
Tero Marttila <terom@paivola.fi>
parents: 28
diff changeset
   728
                    # XXX: hackfix html() rendering
38265b7d8f62 hosts.RealtimeHandler: refactor COLUMNS handling
Tero Marttila <terom@paivola.fi>
parents: 28
diff changeset
   729
                    value = unicode(html.div(value))
38265b7d8f62 hosts.RealtimeHandler: refactor COLUMNS handling
Tero Marttila <terom@paivola.fi>
parents: 28
diff changeset
   730
38265b7d8f62 hosts.RealtimeHandler: refactor COLUMNS handling
Tero Marttila <terom@paivola.fi>
parents: 28
diff changeset
   731
                yield name, value
38265b7d8f62 hosts.RealtimeHandler: refactor COLUMNS handling
Tero Marttila <terom@paivola.fi>
parents: 28
diff changeset
   732
            
38265b7d8f62 hosts.RealtimeHandler: refactor COLUMNS handling
Tero Marttila <terom@paivola.fi>
parents: 28
diff changeset
   733
            # special
38265b7d8f62 hosts.RealtimeHandler: refactor COLUMNS handling
Tero Marttila <terom@paivola.fi>
parents: 28
diff changeset
   734
            yield 'state_class', host.state_class()
25
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   735
        
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   736
        if t :
29
38265b7d8f62 hosts.RealtimeHandler: refactor COLUMNS handling
Tero Marttila <terom@paivola.fi>
parents: 28
diff changeset
   737
            # return json
25
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   738
            t = ts2dt(int(t))
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   739
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   740
            hosts = hosts.filter(Host.last_seen > t)
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   741
            hosts = list(hosts)
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   742
            hosts.reverse()
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   743
            
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   744
            if hosts :
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   745
                t = hosts[-1].last_seen
29
38265b7d8f62 hosts.RealtimeHandler: refactor COLUMNS handling
Tero Marttila <terom@paivola.fi>
parents: 28
diff changeset
   746
                hosts = [dict(host_params(host)) for host in hosts]
26
589249097230 hosts: convert realtime list into table; breaks animations :(
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   747
25
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   748
            else :
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   749
                hosts = []
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   750
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   751
            data = dict(
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   752
                t       = dt2ts(t),
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   753
                hosts   = hosts,
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   754
            )
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   755
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   756
            return web.Response(json.dumps(data), mimetype='text/json')
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   757
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   758
        else :
29
38265b7d8f62 hosts.RealtimeHandler: refactor COLUMNS handling
Tero Marttila <terom@paivola.fi>
parents: 28
diff changeset
   759
            # render html
31
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents: 30
diff changeset
   760
            hosts = hosts.limit(10)
25
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   761
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   762
            # XXX: testing
31
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents: 30
diff changeset
   763
            hosts = hosts.offset(1)
25
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   764
31
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents: 30
diff changeset
   765
            self.hosts = list(hosts)
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents: 30
diff changeset
   766
            
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents: 30
diff changeset
   767
            if self.hosts :
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents: 30
diff changeset
   768
                self.t = self.hosts[0].last_seen
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents: 30
diff changeset
   769
            else :
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents: 30
diff changeset
   770
                self.t = datetime.datetime.now()
25
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   771
30
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   772
    def title (self) :
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   773
        if self.filters :
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   774
            return "{title}: {filters}".format(title=self.TITLE, filters=self.filters_title())
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   775
        else :
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   776
            return self.TITLE
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   777
25
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   778
    def render (self) :
30
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   779
        """
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   780
            Render page HTML and initial <table>, along with bootstrap JS (t0, configuration).
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   781
        """
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   782
29
38265b7d8f62 hosts.RealtimeHandler: refactor COLUMNS handling
Tero Marttila <terom@paivola.fi>
parents: 28
diff changeset
   783
        def column (name, title, fvalue, host) :
38265b7d8f62 hosts.RealtimeHandler: refactor COLUMNS handling
Tero Marttila <terom@paivola.fi>
parents: 28
diff changeset
   784
            cls = name
38265b7d8f62 hosts.RealtimeHandler: refactor COLUMNS handling
Tero Marttila <terom@paivola.fi>
parents: 28
diff changeset
   785
38265b7d8f62 hosts.RealtimeHandler: refactor COLUMNS handling
Tero Marttila <terom@paivola.fi>
parents: 28
diff changeset
   786
            if name == 'state' :
38265b7d8f62 hosts.RealtimeHandler: refactor COLUMNS handling
Tero Marttila <terom@paivola.fi>
parents: 28
diff changeset
   787
                cls = host.state_class()
38265b7d8f62 hosts.RealtimeHandler: refactor COLUMNS handling
Tero Marttila <terom@paivola.fi>
parents: 28
diff changeset
   788
38265b7d8f62 hosts.RealtimeHandler: refactor COLUMNS handling
Tero Marttila <terom@paivola.fi>
parents: 28
diff changeset
   789
            return html.td(class_=cls)(fvalue(host))
38265b7d8f62 hosts.RealtimeHandler: refactor COLUMNS handling
Tero Marttila <terom@paivola.fi>
parents: 28
diff changeset
   790
25
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   791
        params = dict(
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   792
            url     = self.url(),
30
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   793
            filters = self.filters,
25
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   794
            t       = dt2ts(self.t),
26
589249097230 hosts: convert realtime list into table; breaks animations :(
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   795
            host    = self.url(ItemHandler, id='0'),
29
38265b7d8f62 hosts.RealtimeHandler: refactor COLUMNS handling
Tero Marttila <terom@paivola.fi>
parents: 28
diff changeset
   796
            columns = [name for name, title, fvalue in self.COLUMNS]
25
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   797
        )
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   798
        params = json.dumps(params)
26
589249097230 hosts: convert realtime list into table; breaks animations :(
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   799
        
589249097230 hosts: convert realtime list into table; breaks animations :(
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   800
        return html.div(id='wrapper')(
589249097230 hosts: convert realtime list into table; breaks animations :(
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   801
            html.input(type='submit', id='refresh', value="Refresh"),
37
9039238f8885 hosts realtime: pause button
Tero Marttila <terom@paivola.fi>
parents: 36
diff changeset
   802
            html.input(type='reset', id='pause', value="Pause"),
26
589249097230 hosts: convert realtime list into table; breaks animations :(
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   803
            html.table(id='hosts')(
589249097230 hosts: convert realtime list into table; breaks animations :(
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   804
                html.thead(
589249097230 hosts: convert realtime list into table; breaks animations :(
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   805
                    html.tr(
29
38265b7d8f62 hosts.RealtimeHandler: refactor COLUMNS handling
Tero Marttila <terom@paivola.fi>
parents: 28
diff changeset
   806
                        html.th('#'),
38265b7d8f62 hosts.RealtimeHandler: refactor COLUMNS handling
Tero Marttila <terom@paivola.fi>
parents: 28
diff changeset
   807
                        (
38265b7d8f62 hosts.RealtimeHandler: refactor COLUMNS handling
Tero Marttila <terom@paivola.fi>
parents: 28
diff changeset
   808
                            html.th(class_=name)(title) for name, title, fvalue in self.COLUMNS
38265b7d8f62 hosts.RealtimeHandler: refactor COLUMNS handling
Tero Marttila <terom@paivola.fi>
parents: 28
diff changeset
   809
                        )
26
589249097230 hosts: convert realtime list into table; breaks animations :(
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   810
                    ),
589249097230 hosts: convert realtime list into table; breaks animations :(
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   811
                ),
589249097230 hosts: convert realtime list into table; breaks animations :(
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   812
                html.tbody(
589249097230 hosts: convert realtime list into table; breaks animations :(
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   813
                    html.tr(id=host.id)(
589249097230 hosts: convert realtime list into table; breaks animations :(
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   814
                        html.td(html.a(href=self.url(ItemHandler, id=host.id))('#')),
589249097230 hosts: convert realtime list into table; breaks animations :(
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   815
                        (
29
38265b7d8f62 hosts.RealtimeHandler: refactor COLUMNS handling
Tero Marttila <terom@paivola.fi>
parents: 28
diff changeset
   816
                            column(name, title, fvalue, host) for name, title, fvalue in self.COLUMNS
26
589249097230 hosts: convert realtime list into table; breaks animations :(
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   817
                        ),
589249097230 hosts: convert realtime list into table; breaks animations :(
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   818
                    ) for host in self.hosts
589249097230 hosts: convert realtime list into table; breaks animations :(
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   819
                )
25
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   820
            ),
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   821
            html.script(type='text/javascript')("""
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   822
$(document).ready(hosts_realtime({params}));
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   823
""".format(params=params)
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   824
            )
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   825
        )
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   826