Changeset 18670


Ignore:
Timestamp:
Dec 24, 2024, 9:30:38 PM (3 months ago)
Author:
Jun Omae
Message:

TracLogViewer 0.4dev: convert templates to Jinja2 (refs #13816)

Location:
logviewerplugin/trunk/logviewer
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • logviewerplugin/trunk/logviewer/templates/logviewer.html

    r17736 r18670  
    1 <!DOCTYPE html
    2     PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    3     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    4 <html xmlns="http://www.w3.org/1999/xhtml"
    5       xmlns:py="http://genshi.edgewall.org/"
    6       xmlns:i18n="http://genshi.edgewall.org/i18n"
    7       xmlns:xi="http://www.w3.org/2001/XInclude">
     1# extends 'admin.html'
     2# set levels = [
     3    (1, 'Critical'),
     4    (2, 'Errors'),
     5    (3, 'Warnings'),
     6    (4, 'Info'),
     7    (5, 'Debug'),
     8  ]
    89
    9   <xi:include href="admin.html" />
    10   <head>
    11     <title>Log Viewer</title>
    12   </head>
     10# block admintitle
     11Log Viewer
     12# endblock admintitle
    1313
    14   <body>
    15     <h2>Log Viewer</h2>
    16   <div class="us_message" id="us_message" py:if="len(us_message)>0">
    17     <div py:for="message in us_message">${message}</div>
     14# block adminpanel
     15  <h2>Log Viewer</h2>
     16  # if us_message:
     17  <div class="us_message" id="us_message">
     18    # for message in us_message:
     19    <div>${message}</div>
    1820  </div>
    19   <div class="us_error" id="us_error" py:if="len(us_error)>0">
    20     <div py:for="message in us_error">${message}</div>
     21    # endfor
     22  # endif
     23  # if us_error:
     24  <div class="us_error" id="us_error">
     25    # for message in us_error:
     26    <div>${message}</div>
     27    # endfor
    2128  </div>
     29  # endif
    2230  <div class="form" id="level_input">
    2331    <form method="post" id="log_form" class="us_form">
     32      ${jmacros.form_token_input()}
    2433      <fieldset id="selection">
    25         <legend>Selection</legend><ul class="fieldset">
    26             <li id="li_levels"><fieldset id="fieldset_levels">
     34        <legend>Selection</legend>
     35        <ul class="fieldset">
     36          <li id="li_levels">
     37            <fieldset id="fieldset_levels">
    2738              <legend>Log Levels</legend>
    28           <select name="level">
    29             <option value="1" py:attrs="{'selected': level==1 or None}">Critical</option>
    30             <option value="2" py:attrs="{'selected': level==2 or None}">Errors</option>
    31             <option value="3" py:attrs="{'selected': level==3 or None}">Warnings</option>
    32             <option value="4" py:attrs="{'selected': level==4 or None}">Info</option>
    33             <option value="5" py:attrs="{'selected': level==5 or None}">Debug</option>
    34           </select>
    35           <span title="include levels listed on top of the selected level"><input type="checkbox" name="up" value="1" py:attrs="{'checked': up==1 or None}"/> and higher</span>
    36         </fieldset></li><li id="li_search"><fieldset id="fieldset_search">
    37           <legend>Search</legend>
    38           <span title="show only lines (not) containing this search term">Lines (<input type="checkbox" name="invertsearch" value="1" py:attrs="{'checked': invert==1 or None}"/> not) including  <input type="text" name="filter" value="${filter}"/></span>
    39           <span title="search term is a regular expression"><input type="checkbox" name="regexp" value="1" py:attrs="{'checked': regexp==1 or None}"/> RegExp</span>
    40         </fieldset></li><li id="li_tail"><fieldset id="fieldset_tail">
    41           <legend>Tail</legend>
    42           <span title="Display only this many lines. Default: display all"><input type="text" name="tail" style="width:35px;" value="${tail}"/> lines</span>
    43         </fieldset></li></ul>
     39              <select name="level">
     40                # for level_id, label in levels:
     41                <option value="${level_id}"${{'selected': level == level_id}|htmlattr}>${label}</option>
     42                # endfor
     43              </select>
     44              <label title="include levels listed on top of the selected level">
     45                <input type="checkbox" name="up" value="1"${{'checked': up == 1}|htmlattr} />
     46                and higher
     47              </label>
     48            </fieldset>
     49          </li>
     50          <li id="li_search">
     51            <fieldset id="fieldset_search">
     52              <legend>Search</legend>
     53              <span title="show only lines (not) containing this search term">
     54                Lines
     55                (<label>
     56                  <input type="checkbox" name="invertsearch" value="1"${{'checked': invert == 1}|htmlattr} />
     57                  not
     58                </label>)
     59                <label>including <input type="text" name="filter" value="${filter}" /></label>
     60              </span>
     61              <label title="search term is a regular expression">
     62                <input type="checkbox" name="regexp" value="1"${{'checked': regexp == 1}|htmlattr} />
     63                RegExp
     64              </label>
     65            </fieldset>
     66          </li>
     67          <li id="li_tail">
     68            <fieldset id="fieldset_tail">
     69              <legend>Tail</legend>
     70              <label title="Display only this many lines. Default: display all">
     71                <input type="text" name="tail" style="width:35px;" value="${tail}"/> lines
     72              </label>
     73            </fieldset>
     74          </li>
     75        </ul>
    4476      </fieldset>
    4577      <div class="actions">
     
    4981  </div>
    5082
    51   <div class="us_log" id="us_log" py:if="len(us_log)>0">
     83  # if us_log:
     84  <div class="us_log" id="us_log">
    5285    <fieldset>
    5386      <legend>Log messages</legend>
    54       <div py:for="logline in us_log" class="${logline['level']}">${logline['line']}</div>
     87      # for logline in us_log:
     88      <div class="${logline.level}">${logline.line}</div>
     89      # endfor
    5590    </fieldset>
    5691  </div>
    57   </body>
    58 </html>
     92  # endif
     93# endblock adminpanel
  • logviewerplugin/trunk/logviewer/web_ui.py

    r17738 r18670  
     1import io
    12import os
    23import re
     
    117118        add_stylesheet(req, 'logviewer/css/logviewer.css')
    118119
    119         return 'logviewer.html', data, None
     120        return 'logviewer.html', data
    120121
    121122    # ITemplateProvider methods
     
    158159        classes = ['', 'log_crit', 'log_err',
    159160                   'log_warn', 'log_info', 'log_debug']
     161
     162        try:
     163            with io.open(logname, 'r', encoding='utf-8', errors='replace') as f:
     164                lines = f.readlines()
     165        except IOError:
     166            self.log.debug('Could not read from logfile!')
     167            return []
     168
    160169        log = []
    161170        logline = {}
    162         try:
    163             with open(logname, 'r') as f:
    164                 lines = f.readlines()
    165             linecount = len(lines)
    166             if tail and linecount - tail > 0:
    167                 start = linecount - tail
    168             else:
    169                 start = 0
    170             for i in range(start, linecount):
    171                 line = lines[i].decode('utf-8', 'replace')
    172                 if tfilter:
    173                     if regexp:
    174                         if not invert and not re.search(tfilter, line):
    175                             continue
    176                         if invert and re.search(tfilter, line):
    177                             continue
    178                     else:
    179                         if not invert and line.find(tfilter) == -1:
    180                             continue
    181                         if invert and not line.find(tfilter) == -1:
    182                             continue
    183                 logline = {}
    184                 if line.find(levels[level]) != -1:
    185                     logline['level'] = classes[level]
     171        linecount = len(lines)
     172        if tail and linecount - tail > 0:
     173            start = linecount - tail
     174        else:
     175            start = 0
     176        for i in range(start, linecount):
     177            line = lines[i]
     178            if tfilter:
     179                if regexp:
     180                    if not invert and not re.search(tfilter, line):
     181                        continue
     182                    if invert and re.search(tfilter, line):
     183                        continue
     184                else:
     185                    if not invert and line.find(tfilter) == -1:
     186                        continue
     187                    if invert and not line.find(tfilter) == -1:
     188                        continue
     189            logline = {}
     190            if line.find(levels[level]) != -1:
     191                logline['level'] = classes[level]
     192                logline['line'] = line
     193                log.append(logline)
     194            elif up:
     195                i = level
     196                found = False
     197                while i > 0:
     198                    if line.find(levels[i]) != -1:
     199                        logline['level'] = classes[i]
     200                        logline['line'] = line
     201                        log.append(logline)
     202                        found = True
     203                    i -= 1
     204                if not found and re.search('^[^0-9]+', line):
     205                    logline['level'] = 'log_other'
    186206                    logline['line'] = line
    187207                    log.append(logline)
    188                 elif up:
    189                     i = level
    190                     found = False
    191                     while i > 0:
    192                         if line.find(levels[i]) != -1:
    193                             logline['level'] = classes[i]
    194                             logline['line'] = line
    195                             log.append(logline)
    196                             found = True
    197                         i -= 1
    198                     if not found and re.search('^[^0-9]+', line):
    199                         logline['level'] = 'log_other'
    200                         logline['line'] = line
    201                         log.append(logline)
    202         except IOError:
    203             self.log.debug('Could not read from logfile!')
    204208        return log
Note: See TracChangeset for help on using the changeset viewer.