pvl/verkko/hosts.py
changeset 9 3334d8ddf2f1
parent 8 f64c44640b15
child 10 513eb70e54f2
equal deleted inserted replaced
8:f64c44640b15 9:3334d8ddf2f1
    92 
    92 
    93     def query (self) :
    93     def query (self) :
    94         hosts = self.db.query(Host)
    94         hosts = self.db.query(Host)
    95 
    95 
    96         # sort ?
    96         # sort ?
    97         sort = self.request.args.get('sort')
    97         self.sort = self.request.args.get('sort')
    98 
    98 
    99         if sort :
    99         if self.sort :
   100             sort = self.HOST_ATTRS[sort]
   100             sort = self.HOST_ATTRS[self.sort]
   101         else :
   101         else :
   102             sort = self.HOST_SORT
   102             sort = self.HOST_SORT
   103 
   103 
   104         log.debug("sort: %s", sort)
   104         log.debug("sort: %s", sort)
   105 
   105 
   106         hosts = hosts.order_by(sort)
   106         hosts = hosts.order_by(sort)
   107 
   107 
   108         # k
   108         # k
   109         self.sort = sort
       
   110 
       
   111         return hosts
   109         return hosts
   112     
   110     
   113     def render_hosts (self, hosts, title=None) :
   111     def render_hosts (self, hosts, title=None, filters=False) :
   114         COLS = (
   112         COLS = (
   115             #title          sort
   113             #title          sort        filter
   116             ('#',           None),
   114             ('IP',          'ip',       'ip'    ),
   117             ('IP',          'ip'),
   115             ('MAC',         'mac',      'mac'   ),
   118             ('MAC',         'mac'),
   116             ('Hostname',    'name',     False   ),
   119             ('Hostname',    'name'),
   117             ('Seen',        'seen',     False   ),
   120             ('Seen',        'seen'),
   118         )
   121         )
   119 
   122 
   120         def url (**opts) :
   123         return html.table(
   121             args = dict(filters)
       
   122             args.update(opts)
       
   123 
       
   124             return self.url(**args)
       
   125 
       
   126         table = html.table(
   124             html.caption(title) if title else None,
   127             html.caption(title) if title else None,
   125             html.thead(
   128             html.thead(
   126                 html.tr(
   129                 html.tr(
   127                     html.th(
   130                     html.th('#'),
   128                         html.a(href=self.url(sort=sort))(title) if sort else (title)
   131                     (
   129                     ) for title, sort in COLS
   132                         html.th(
   130                 )
   133                             html.a(href=url(sort=sort))(title) if sort else (title)
       
   134                         ) for title, sort, filter in COLS
       
   135                     )
       
   136                 ),
       
   137                 html.tr(class_='filter')(
       
   138                     html.td(
       
   139                         html.input(type='submit', value=u'\u00BF'),
       
   140                     ),
       
   141                     (
       
   142                         html.td(
       
   143                             html.input(type='text', name=filter, value=filters.get(filter)) if filter else None
       
   144                         ) for title, sort, filter in COLS
       
   145                     )
       
   146                 ) if filters is not False else None
   131             ),
   147             ),
   132             html.tbody(
   148             html.tbody(
   133                 html.tr(class_=('alternate' if i % 2 else None), id=host.id)(
   149                 html.tr(class_=('alternate' if i % 2 else None), id=host.id)(
   134                     html.td(class_='id')(
   150                     html.td(class_='id')(
   135                         html.a(href=self.url(ItemHandler, id=host.id))(
   151                         html.a(href=self.url(ItemHandler, id=host.id))(
   149                     html.td(host.render_name()),
   165                     html.td(host.render_name()),
   150                     html.td(host.when()),
   166                     html.td(host.when()),
   151                 ) for i, host in enumerate(hosts)
   167                 ) for i, host in enumerate(hosts)
   152             )
   168             )
   153         )
   169         )
       
   170         
       
   171         if filters is False :
       
   172             return table
       
   173         else :
       
   174             return html.form(method='get', action=self.url())(
       
   175                 html.input(type='hidden', name='sort', value=self.sort),
       
   176                 table,
       
   177             )
   154 
   178 
   155     def render_host (self, host, hosts) :
   179     def render_host (self, host, hosts) :
   156         attrs = (
   180         attrs = (
   157                 ('IP',          host.ip),
   181                 ('IP',          host.ip),
   158                 ('MAC',         host.mac),
   182                 ('MAC',         host.mac),
   172             self.render_hosts(hosts),
   196             self.render_hosts(hosts),
   173 
   197 
   174             html.a(href=self.url(ListHandler))(html('«'), 'Back'),
   198             html.a(href=self.url(ListHandler))(html('«'), 'Back'),
   175         )
   199         )
   176 
   200 
   177 class IndexHandler (BaseHandler) :
       
   178     def process (self) :
       
   179         self.hosts = self.query()
       
   180     
       
   181     def title (self) :
       
   182         return "DHCP Hosts"
       
   183 
       
   184     def render (self) :
       
   185         return self.render_hosts(self.hosts)
       
   186 
       
   187 class ItemHandler (BaseHandler) :
   201 class ItemHandler (BaseHandler) :
   188     def process (self, id) :
   202     def process (self, id) :
   189         self.hosts = self.query()
   203         self.hosts = self.query()
   190         self.host = self.hosts.get(id)
   204         self.host = self.hosts.get(id)
   191         
   205         
   200     def render (self) :
   214     def render (self) :
   201         return self.render_host(self.host, self.hosts)
   215         return self.render_host(self.host, self.hosts)
   202 
   216 
   203 class ListHandler (BaseHandler) :
   217 class ListHandler (BaseHandler) :
   204     def process (self) :
   218     def process (self) :
   205         hosts = self.query()
   219         self.hosts = self.query()
       
   220 
       
   221         # filter?
   206         self.filters = {}
   222         self.filters = {}
   207 
   223 
   208         for attr in self.HOST_ATTRS :
   224         for attr in self.HOST_ATTRS :
   209             value = self.request.args.get(attr)
   225             value = self.request.args.get(attr)
   210 
   226 
   211             if not value :
   227             if not value :
   212                 continue
   228                 continue
   213 
   229 
   214             # preprocess
   230             # preprocess
   215             if attr == 'mac' :
   231             like = False
       
   232 
       
   233             if value.endswith('*') :
       
   234                 like = value.replace('*', '%')
       
   235 
       
   236             elif attr == 'mac' :
   216                 value = Host.normalize_mac(value)
   237                 value = Host.normalize_mac(value)
   217 
   238 
   218             # filter
   239             # filter
   219             hosts = hosts.filter(self.HOST_ATTRS[attr] == value)
   240             col = self.HOST_ATTRS[attr]
       
   241 
       
   242             if like :
       
   243                 filter = (col.like(like))
       
   244             else :
       
   245                 filter = (col == value)
       
   246             
       
   247             self.hosts = self.hosts.filter(filter)
   220             self.filters[attr] = value
   248             self.filters[attr] = value
   221         
       
   222         self.hosts = hosts
       
   223 
   249 
   224     def title (self) :
   250     def title (self) :
   225         if self.filters :
   251         if self.filters :
   226             return "DHCP Hosts: {filters}".format(filters=', '.join(self.filters.itervalues()))
   252             return "DHCP Hosts: {filters}".format(filters=', '.join(self.filters.itervalues()))
   227         else :
   253         else :
   228             return "DHCP Hosts"
   254             return "DHCP Hosts"
   229     
   255     
   230     def render (self) :
   256     def render (self) :
   231         return (
   257         return (
   232             self.render_hosts(self.hosts),
   258             self.render_hosts(self.hosts, filters=self.filters),
   233 
   259 
   234             html.a(href=self.url())(html('«'), 'Back') if self.filters else None,
   260             html.a(href=self.url())(html('«'), 'Back') if self.filters else None,
   235         )
   261         )