Edgewall Software

Changeset 1911

Show
Ignore:
Timestamp:
07/06/2005 11:20:07 AM (3 years ago)
Author:
cboos
Message:

InterTrac: merged with TracDiff branch (svn merge -r1908:1910 http://svn.edgewall.com/repos/trac/branches/cboos-dev/anydiff-branch .)

Location:
branches/cboos-dev/intertrac-branch
Files:
26 modified

Legend:

Unmodified
Added
Removed
  • branches/cboos-dev/intertrac-branch/htdocs/css/about.css

    r1587 r1911  
    3636 
    3737#content.about_plugins td.xtnpts { margin-top: 1em; } 
    38 #content.about_plugins td.xtnpts ul { list-style: none; margin: 0; padding: 0; } 
    39 #content.about_plugins td.xtnpts ul ul { list-style: square; margin: 0; padding: 0 0 0 2em; } 
     38#content.about_plugins td.xtnpts ul { list-style: square; margin: 0; padding: 0 0 0 2em; } 
  • branches/cboos-dev/intertrac-branch/templates/ticket.cs

    r1863 r1911  
    124124<?cs if:trac.acl.TICKET_CHGPROP || trac.acl.TICKET_APPEND ?> 
    125125<form action="<?cs var:ticket.href ?>#preview" method="post"> 
     126 <input type="hidden" name="ts" value="<?cs var:ticket.ts ?>"/> 
    126127 <hr /> 
    127128 <h3><a name="edit" onfocus="document.getElementById('comment').focus()">Add/Change #<?cs 
     
    153154   <td class="fullrow" colspan="3"><input type="text" id="summary" name="summary" value="<?cs 
    154155     var:ticket.summary ?>" size="70" /> 
    155   </tr><?cs 
     156   </tr><?cs 
     157   if:len(ticket.fields.type.options) ?> 
     158   <tr> 
     159     <th><label for="type">Type:</label></th> 
     160     <td><?cs  
     161      call:hdf_select(ticket.fields.type.options, 'type', ticket.type, 0) ?> 
     162     </td> 
     163    </tr><?cs 
     164   /if ?><?cs 
    156165   if:trac.acl.TICKET_ADMIN ?><tr> 
    157166    <th><label for="description">Description:</label></th> 
  • branches/cboos-dev/intertrac-branch/templates/timeline.cs

    r1618 r1911  
    2121 </fieldset> 
    2222 <div class="buttons"> 
    23   <input type="submit" value="Update" /> 
     23  <input type="submit" name="update" value="Update" /> 
    2424 </div> 
    2525</form><?cs 
  • branches/cboos-dev/intertrac-branch/trac/About.py

    r1863 r1911  
    6060  <table><thead><tr><th class="section">Section</th> 
    6161   <th class="name">Name</th><th class="value">Value</th></tr></thead><?cs 
    62   each:section = about.config ?> 
    63    <tr><th rowspan="<?cs var:len(section.options) ?>"><?cs var:section.name ?></th><?cs 
    64    each:option = section.options ?><?cs if:name(option) != 0 ?><tr><?cs /if ?> 
    65     <td><?cs var:option.name ?></td> 
    66     <td><?cs var:option.value ?></td> 
    67    </tr><?cs /each ?><?cs 
     62  each:section = about.config ?><?cs 
     63   if:len(section.options) ?> 
     64    <tr><th rowspan="<?cs var:len(section.options) ?>"><?cs var:section.name ?></th><?cs 
     65    each:option = section.options ?><?cs if:name(option) != 0 ?><tr><?cs /if ?> 
     66     <td><?cs var:option.name ?></td> 
     67     <td><?cs var:option.value ?></td> 
     68    </tr><?cs 
     69    /each ?><?cs 
     70   /if ?><?cs 
    6871  /each ?></table> 
    6972  <div id="help"> 
     
    8891     </tr><?cs /if ?><?cs 
    8992     if:len(plugin.extension_points) ?><tr> 
    90       <th class="xtnpts">Extension points:</th> 
    91       <td class="xtnpts"><ul><?cs each:extension_point = plugin.extension_points ?> 
    92        <li> 
    93         <code><?cs var:extension_point.module ?>.<?cs var:extension_point.interface ?></code><?cs 
    94          if:len(extension_point.extensions) ?> (<?cs 
    95           var:len(extension_point.extensions) ?> extensions)<ul><?cs 
    96           each:extension = extension_point.extensions ?> 
    97            <li><a href="#<?cs var:extension.module ?>.<?cs 
    98              var:extension.name ?>"><?cs var:extension.name ?></a></li><?cs 
    99           /each ?></ul><?cs 
    100          /if ?> 
    101        </li><?cs 
    102       /each ?></ul></td></tr><?cs 
     93      <th class="xtnpts" rowspan="<?cs var:len(plugin.extension_points) ?>"> 
     94       Extension points:</th><?cs 
     95       each:extension_point = plugin.extension_points ?><?cs 
     96        if:name(extension_point) != 0 ?><tr><?cs /if ?> 
     97        <td class="xtnpts">         
     98         <code><?cs var:extension_point.module ?>.<?cs var:extension_point.interface ?></code><?cs 
     99          if:len(extension_point.extensions) ?> (<?cs 
     100           var:len(extension_point.extensions) ?> extensions)<ul><?cs 
     101           each:extension = extension_point.extensions ?> 
     102            <li><a href="#<?cs var:extension.module ?>.<?cs 
     103              var:extension.name ?>"><?cs var:extension.name ?></a></li><?cs 
     104           /each ?></ul><?cs 
     105          /if ?> 
     106          <div class="description"><?cs var:extension_point.description ?></div> 
     107        </td></tr><?cs 
     108       /each ?><?cs 
    103109     /if ?> 
    104110    </table><?cs 
     
    169175            self._render_plugins(req) 
    170176 
    171         add_stylesheet(req, 'about.css') 
     177        add_stylesheet(req, 'css/about.css') 
    172178        template = req.hdf.parse(self.about_cs) 
    173179        return template, None 
     
    193199 
    194200    def _render_plugins(self, req): 
     201        try: 
     202            from trac.wiki.formatter import wiki_to_html 
     203            import inspect 
     204            def getdoc(obj): 
     205                return wiki_to_html(inspect.getdoc(obj), self.env, req) 
     206        except: 
     207            def getdoc(obj): 
     208                return obj.__doc__ 
    195209        req.perm.assert_permission('CONFIG_VIEW') 
    196210        import sys 
     
    203217            plugin = {'name': component.__name__} 
    204218            if component.__doc__: 
    205                 plugin['description'] = component.__doc__ 
     219                plugin['description'] = getdoc(component) 
    206220 
    207221            module = sys.modules[component.__module__] 
     
    216230                               'module': xtnpt.interface.__module__}) 
    217231                if xtnpt.interface.__doc__: 
    218                     xtnpts[-1]['description'] = xtnpt.interface.__doc__ 
     232                    xtnpts[-1]['description'] = getdoc(xtnpt.interface) 
    219233                extensions = [] 
    220234                for extension in ComponentMeta._registry.get(xtnpt.interface, []): 
  • branches/cboos-dev/intertrac-branch/trac/attachment.py

    r1880 r1911  
    274274            self._render_view(req, attachment) 
    275275 
    276         add_stylesheet(req, 'code.css') 
     276        add_stylesheet(req, 'css/code.css') 
    277277        return 'attachment.cs', None 
    278278 
  • branches/cboos-dev/intertrac-branch/trac/Browser.py

    r1863 r1911  
    165165            self._render_file(req, repos, node, rev) 
    166166 
    167         add_stylesheet(req, 'browser.css') 
     167        add_stylesheet(req, 'css/browser.css') 
    168168        return 'browser.cs', None 
    169169 
     
    286286            add_link(req, 'alternate', raw_href, 'Original Format', mime_type) 
    287287 
    288             add_stylesheet(req, 'code.css') 
     288            add_stylesheet(req, 'css/code.css') 
    289289 
    290290    # IWikiSyntaxProvider methods 
     
    469469            return 'log_rss.cs', 'application/rss+xml' 
    470470 
    471         add_stylesheet(req, 'browser.css') 
    472         add_stylesheet(req, 'diff.css') 
     471        add_stylesheet(req, 'css/browser.css') 
     472        add_stylesheet(req, 'css/diff.css') 
    473473 
    474474        rss_href = make_log_href(path, format='rss', stop_rev=stop_rev) 
  • branches/cboos-dev/intertrac-branch/trac/Diff.py

    r1864 r1911  
    163163        add_link(req, 'alternate', '?format=zip&'+diff_params, 'Zip Archive', 
    164164                 'application/zip', 'zip') 
    165         add_stylesheet(req, 'changeset.css') 
    166         add_stylesheet(req, 'diff.css') 
     165        add_stylesheet(req, 'css/changeset.css') 
     166        add_stylesheet(req, 'css/diff.css') 
    167167        return 'diff.cs', None 
    168168 
  • branches/cboos-dev/intertrac-branch/trac/Milestone.py

    r1863 r1911  
    281281            cursor = db.cursor() 
    282282            cursor.execute("SELECT completed,name,description FROM milestone " 
    283                            "WHERE completed>=%s AND completed<=%s", start, stop) 
     283                           "WHERE completed>=%s AND completed<=%s", 
     284                           (start, stop,)) 
    284285            for completed,name,description in cursor: 
    285286                title = 'Milestone <em>%s</em> completed' % escape(name) 
     
    330331            self._render_view(req, db, milestone) 
    331332 
    332         add_stylesheet(req, 'roadmap.css') 
     333        add_stylesheet(req, 'css/roadmap.css') 
    333334        return 'milestone.cs', None 
    334335 
  • branches/cboos-dev/intertrac-branch/trac/mimeview/patch.py

    r1633 r1911  
    8181        hdf['diff.files'] = d 
    8282 
    83         add_stylesheet(req, 'diff.css') 
     83        add_stylesheet(req, 'css/diff.css') 
    8484        return hdf.render(hdf.parse(self.diff_cs)) 
    8585 
  • branches/cboos-dev/intertrac-branch/trac/Roadmap.py

    r1863 r1911  
    8686            return 
    8787 
    88         add_stylesheet(req, 'roadmap.css') 
     88        add_stylesheet(req, 'css/roadmap.css') 
    8989 
    9090        # FIXME should use the 'webcal:' scheme, probably 
     
    105105        req.end_headers() 
    106106 
    107         cursor = db.cursor() 
    108         cursor.execute("SELECT name,value FROM enum WHERE type='priority'") 
     107        from trac.ticket import Priority 
    109108        priorities = {} 
    110         for name, value in cursor: 
    111             priorities[name] = float(value) 
     109        for priority in Priority.select(self.env): 
     110            priorities[priority.name] = float(priority.value) 
    112111        def get_priority(ticket): 
    113112            value = priorities.get(ticket['priority']) 
     
    165164                    write_prop('DESCRIPTION', milestone['description_source']) 
    166165                write_prop('END', 'VEVENT') 
    167             for ticket in [ticket for ticket in milestone['tickets'] 
    168                           if ticket['owner'] == user]: 
    169                 ticket = Ticket(db, ticket['id']) 
     166            for tkt_id in [ticket['id'] for ticket in milestone['tickets'] 
     167                           if ticket['owner'] == user]: 
     168                ticket = Ticket(self.env, tkt_id) 
    170169                write_prop('BEGIN', 'VTODO') 
    171170                if milestone.has_key('date'): 
    172171                    write_prop('RELATED-TO', uid) 
    173172                    write_date('DUE', localtime(milestone['due'])) 
    174                 write_prop('SUMMARY', 'Ticket #%i: %s' % (ticket['id'], 
     173                write_prop('SUMMARY', 'Ticket #%i: %s' % (ticket.id, 
    175174                                                          ticket['summary'])) 
    176                 write_prop('URL', req.base_url + '/ticket/' + str(ticket['id'])) 
     175                write_prop('URL', self.env.abs_href.ticket(ticket.id)) 
    177176                write_prop('DESCRIPTION', ticket['description']) 
    178177                priority = get_priority(ticket) 
     
    185184                                   "WHERE ticket=%s AND field='status' " 
    186185                                   "ORDER BY time desc LIMIT 1", 
    187                                    (ticket['id'],)) 
     186                                   (ticket.id,)) 
    188187                    row = cursor.fetchone() 
    189188                    if row: 
  • branches/cboos-dev/intertrac-branch/trac/Search.py

    r1863 r1911  
    108108                add_link(req, 'next', self.env.href.search(params, page=page + 1)) 
    109109 
    110         add_stylesheet(req, 'search.css') 
     110        add_stylesheet(req, 'css/search.css') 
    111111        return 'search.cs', None 
    112112 
  • branches/cboos-dev/intertrac-branch/trac/ticket/query.py

    r1880 r1911  
    2929from trac.web.chrome import add_link, add_stylesheet, INavigationContributor 
    3030from trac.web.main import IRequestHandler 
    31 from trac.wiki import wiki_to_html, wiki_to_oneliner, IWikiMacroProvider, IWikiSyntaxProvider 
     31from trac.wiki import wiki_to_html, wiki_to_oneliner, IWikiMacroProvider, \ 
     32                      IWikiSyntaxProvider 
    3233from trac.util import escape, shorten_line, sql_escape, CRLF, TRUE 
    3334 
     
    457458    def display_html(self, req, query): 
    458459        req.hdf['title'] = 'Custom Query' 
    459         add_stylesheet(req, 'report.css') 
     460        add_stylesheet(req, 'css/report.css') 
    460461 
    461462        db = self.env.get_db_cnx() 
  • branches/cboos-dev/intertrac-branch/trac/ticket/report.py

    r1863 r1911  
    140140            req.hdf['report.query_href'] = self.env.href.query() 
    141141 
    142         add_stylesheet(req, 'report.css') 
     142        add_stylesheet(req, 'css/report.css') 
    143143        return 'report.cs', None 
    144144 
     
    381381            return None 
    382382 
    383         add_stylesheet(req, 'report.css') 
    384383        return 'report.cs', None 
    385384 
  • branches/cboos-dev/intertrac-branch/trac/ticket/web_ui.py

    r1863 r1911  
    9393            req.hdf['newticket.fields.' + name] = field 
    9494 
    95         add_stylesheet(req, 'ticket.css') 
     95        add_stylesheet(req, 'css/ticket.css') 
    9696        return 'newticket.cs', None 
    9797 
     
    161161                ticket.populate(req.args) 
    162162                req.hdf['ticket.action'] = action 
     163                req.hdf['ticket.ts'] = req.args.get('ts') 
    163164                req.hdf['ticket.reassign_owner'] = req.args.get('reassign_owner') \ 
    164165                                                   or req.authname 
     
    174175        else: 
    175176            req.hdf['ticket.reassign_owner'] = req.authname 
     177            # Store a timestamp in order to detect "mid air collisions" 
     178            req.hdf['ticket.ts'] = ticket.time_changed 
    176179 
    177180        self._insert_ticket_data(req, db, ticket, reporter_id) 
     
    195198                add_link(req, 'up', req.session['query_href']) 
    196199 
    197         add_stylesheet(req, 'ticket.css') 
     200        add_stylesheet(req, 'css/ticket.css') 
    198201        return 'ticket.cs', None 
    199202 
     
    271274        else: 
    272275            req.perm.assert_permission('TICKET_APPEND') 
     276 
     277        # Mid air collision? 
     278        if int(req.args.get('ts')) != ticket.time_changed: 
     279            raise TracError("Sorry, can not save your changes. " 
     280                            "This ticket has been modified by someone else " 
     281                            "since you started", 'Mid Air Collision') 
    273282 
    274283        # Do any action on the ticket? 
  • branches/cboos-dev/intertrac-branch/trac/Timeline.py

    r1863 r1911  
    103103        fromdate = time.mktime((t[0], t[1], t[2], 23, 59, 59, t[6], t[7], t[8])) 
    104104        try: 
    105             daysback = max(0, int(req.args.get('daysback', ''))) 
     105            daysback = max(0, int(req.args.get('daysback', '') \ 
     106                                  or req.session.get('timeline.daysback', ''))) 
    106107        except ValueError: 
    107108            daysback = int(self.config.get('timeline', 'default_daysback')) 
     
    112113        for event_provider in self.event_providers: 
    113114            available_filters += event_provider.get_timeline_filters(req) 
    114         filters = [f[0] for f in available_filters if f[0] in req.args.keys()] 
    115         if not filters: 
    116             filters = [f[0] for f in available_filters] 
     115 
     116        filters = [] 
     117        if req.args.has_key('update'):  # setup filters from the update request 
     118          for f in available_filters: 
     119              if f[0] in req.args.keys(): 
     120                  filters.append(f[0]) 
     121                  req.session['timeline.filter.%s' % f[0]] = '1' 
     122              else: 
     123                  req.session['timeline.filter.%s' % f[0]] = '0' 
     124              req.session['timeline.daysback'] = daysback 
     125        else:                           # setup filters from the session 
     126            no_session = True 
     127            for f in available_filters: 
     128                enabled = req.session.get('timeline.filter.%s' % f[0], None) 
     129                if enabled == '1': 
     130                    filters.append(f[0]) 
     131                elif enabled == '0': 
     132                    no_session = False 
     133            if no_session and not filters: 
     134                filters = [f[0] for f in available_filters] 
    117135 
    118136        stop = fromdate 
     
    162180            return 'timeline_rss.cs', 'application/rss+xml' 
    163181 
    164         add_stylesheet(req, 'timeline.css') 
     182        add_stylesheet(req, 'css/timeline.css') 
    165183        rss_href = self.env.href.timeline([(f, 'on') for f in filters], 
    166184                                          daysback=90, max=50, format='rss') 
  • branches/cboos-dev/intertrac-branch/trac/util.py

    r1854 r1911  
    182182            shortline = text[:i]+' ...' 
    183183    return shortline 
     184 
     185def quote_cookie_value(path): 
     186    """ 
     187    Cookie values can not contain " ,;" characters. 
     188    """ 
     189    return path.replace(' ', '%20').replace(';', '%3B').replace(',', '%3C') 
    184190 
    185191def hex_entropy(bytes=32): 
  • branches/cboos-dev/intertrac-branch/trac/versioncontrol/svn_fs.py

    r1780 r1911  
    305305        if self.has_node(old_path, old_rev): 
    306306            old_node = self.get_node(old_path, old_rev) 
     307        else: 
     308            raise TracError, ('The Base for Diff is invalid: path %s' 
     309                              ' doesn\'t exist in revision %s' \ 
     310                              % (old_path, old_rev)) 
    307311        if self.has_node(new_path, new_rev): 
    308312            new_node = self.get_node(new_path, new_rev) 
    309         if not old_node and not new_node: 
    310             raise TracError, ('None of the Diff arguments are valid: ' 
    311                               'neither %s in revision %s nor %s in revision %s exist ' 
    312                               'in the repository' % (old_path, old_rev, 
    313                                                      new_path, new_rev)) 
    314         elif old_node and new_node: 
    315             if new_node.kind != old_node.kind: 
    316                 raise TracError, ('Diff mismatch: Trying to diff ' 
    317                                   'a %s (%s in revision %s) ' 
    318                                   'with a %s (%s in revision %s).' \ 
    319                                   % (old_node.kind, old_path, old_rev, 
    320                                      new_node.kind, new_path, new_rev)) 
    321         if new_node: 
    322             isdir = new_node.isdir 
    323313        else: 
    324             isdir = old_node.isdir 
    325         if isdir: 
     314            raise TracError, ('The Target for Diff is invalid: path %s' 
     315                              ' doesn\'t exist in revision %s' \ 
     316                              % (new_path, new_rev)) 
     317        if new_node.kind != old_node.kind: 
     318            raise TracError, ('Diff mismatch: Base is a %s (%s in revision %s) ' 
     319                              'and Target is a %s (%s in revision %s).' \ 
     320                              % (old_node.kind, old_path, old_rev, 
     321                                 new_node.kind, new_path, new_rev)) 
     322        if new_node.isdir: 
    326323            editor = DiffChangeEditor() 
    327324            e_ptr, e_baton = delta.make_editor(editor, self.pool) 
     
    329326            new_root = fs.revision_root(self.fs_ptr, new_rev, self.pool) 
    330327            def authz_cb(root, path, pool): return 1 
    331             text_deltas = 0 # as this is currently re-done in Diff.py... 
     328            text_deltas = 0 # as this is anyway re-done in Diff.py... 
    332329            entry_props = 0 # ("... typically used only for working copy updates") 
    333330            repos.svn_repos_dir_delta(old_root, old_path, '', 
     
    335332                                      e_ptr, e_baton, authz_cb, 
    336333                                      text_deltas, 
    337                                       isdir and 1 or 0, 
     334                                      1, # directory 
    338335                                      entry_props, 
    339336                                      ignore_ancestry, 
  • branches/cboos-dev/intertrac-branch/trac/web/auth.py

    r1646 r1911  
    8282        self.authname = req.remote_user 
    8383        req.outcookie['trac_auth'] = cookie 
    84         req.outcookie['trac_auth']['path'] = req.cgi_location 
     84        req.outcookie['trac_auth']['path'] = util.quote_cookie_value(req.cgi_location) 
    8585 
    8686    def logout(self): 
  • branches/cboos-dev/intertrac-branch/trac/web/chrome.py

    r1854 r1911  
    3030 
    3131def add_link(req, rel, href, title=None, mimetype=None, classname=None): 
    32     """ 
    33     Add a link to the HDF data set that will be inserted as <link> element in 
     32    """Add a link to the HDF data set that will be inserted as <link> element in 
    3433    the <head> of the generated HTML 
    3534    """ 
     
    4746 
    4847def add_stylesheet(req, filename, mimetype='text/css'):