Edgewall Software

Ticket #1791: trac.format.custom.fields.0.10.patch

File trac.format.custom.fields.0.10.patch, 5.9 KB (added by nathan(dot)wells at dtn.com, 5 years ago)

Patch against trac 0.10 to enable wiki formating of custom fields & collapsable change history

  • templates/ticket.cs

     
    6565    if:fullrow && idx % 2 ?><th></th><td></td></tr><tr><?cs /if ?> 
    6666    <th id="h_<?cs var:name(field) ?>"><?cs var:field.label ?>:</th> 
    6767    <td<?cs if:fullrow ?> colspan="3"<?cs /if ?> headers="h_<?cs 
    68       var:name(field) ?>"><?cs var:ticket[name(field)] ?></td><?cs  
     68      var:name(field) ?>"><?cs var:field.formatted ?></td><?cs  
    6969    if:idx % 2 || fullrow ?></tr><tr><?cs  
    7070    elif:idx == num_fields - 1 ?><th></th><td></td><?cs 
    7171    /if ?><?cs set:idx = idx + #fullrow + 1 ?><?cs 
     
    135135   each:field = change.fields ?> 
    136136    <li><strong><?cs var:name(field) ?></strong> <?cs 
    137137    if:name(field) == 'attachment' ?><em><?cs var:field.new ?></em> added<?cs 
     138    elif:field.format != 'plain' ?>changed<?cs 
    138139    elif:field.old && field.new ?>changed from <em><?cs 
    139140     var:field.old ?></em> to <em><?cs var:field.new ?></em><?cs 
    140141    elif:!field.old && field.new ?>set to <em><?cs var:field.new ?></em><?cs 
    141142    elif:field.old && !field.new ?>deleted<?cs 
    142143    else ?>changed<?cs 
    143     /if ?>.</li> 
     144    /if ?>.<?cs 
     145    if field.format != 'plain' ?><div style="font-size:0.8em;font-weight:bold;">Detail <span style="cursor:pointer" onclick="document.getElementById('chang_detail_<?cs var:change.cnum ?>_<?cs var:name(field) ?>').style.display='block';">+</span>/<span style="cursor:pointer" onclick="document.getElementById('chang_detail_<?cs var:change.cnum ?>_<?cs var:name(field) ?>').style.display='none';">-</span></div> 
     146      <div id="chang_detail_<?cs var:change.cnum ?>_<?cs var:name(field) ?>" style="display:none;"> 
     147        <div style="border: 1px outset #996; padding: 1em;"><?cs var:field.old ?></div> 
     148        <div style="margin:1em;2em;">to</div> 
     149        <div style="border: 1px outset #996; padding: 1em;"><?cs var:field.new ?></div> 
     150      </div><?cs 
     151    /if ?></li> 
    144152    <?cs 
    145153   /each ?> 
    146154   </ul><?cs 
  • ticket/api.py

     
    164164                'type': config.get(name), 
    165165                'order': config.getint(name + '.order', 0), 
    166166                'label': config.get(name + '.label') or name.capitalize(), 
    167                 'value': config.get(name + '.value', '') 
     167                'value': config.get(name + '.value', ''), 
     168                'format': config.get(name + '.format', 'plain')  
    168169            } 
    169170            if field['type'] == 'select' or field['type'] == 'radio': 
    170171                field['options'] = config.getlist(name + '.options', sep='|') 
     
    176177 
    177178        fields.sort(lambda x, y: cmp(x['order'], y['order'])) 
    178179        return fields 
     180     
     181    def get_field_by_name(self, name): 
     182        ret = None 
     183        for f in self.get_ticket_fields(): 
     184            if f['name'] == name: 
     185                ret = f 
     186                break 
     187        return ret 
     188         
    179189 
    180190    # IPermissionRequestor methods 
    181191 
  • ticket/web_ui.py

     
    583583            if name in ('summary', 'reporter', 'description', 'type', 'status', 
    584584                        'resolution', 'owner'): 
    585585                field['skip'] = True 
     586            else:  
     587                if 'format' in field:  
     588                    if field['format'] == 'wiki':  
     589                        field['formatted'] = wiki_to_html(ticket.values.get(name), self.env, req, db)  
     590                    elif field['format'] == 'wiki_oneliner':  
     591                        field['formatted'] = wiki_to_oneliner(ticket.values.get(name), self.env, db, shorten=True)  
     592                    elif field['format'] == 'pre':  
     593                        field['formatted'] = wiki_to_html('{{{\n' + ticket.values.get(name) + '\n}}}', self.env, req, db)  
     594                    else:  
     595                        field['formatted'] = ticket.values.get(name)  
     596                else:  
     597                    field['formatted'] = ticket.values.get(name)  
    586598            req.hdf['ticket.fields.' + name] = field 
    587599 
    588600        req.hdf['ticket.reporter_id'] = reporter_id 
     
    660672        in a `dict` object. 
    661673        """ 
    662674        changelog = ticket.get_changelog(when=when, db=db) 
     675        custom_fields = [f['name'] for f in ticket.fields if f.get('custom')] 
    663676        autonum = 0 # used for "root" numbers 
    664677        last_uid = current = None 
    665678        for date, author, field, old, new, permanent in changelog: 
     
    689702                        this_num = old 
    690703                    current['cnum'] = int(this_num) 
    691704            else: 
    692                 current['fields'][field] = {'old': old, 'new': new} 
     705                type = 'standard' 
     706                format = 'plain' 
     707                if field in custom_fields: 
     708                    type = 'custom' 
     709                    field_def = TicketSystem(self.env).get_field_by_name(field) 
     710                    if field_def and 'format' in field_def: 
     711                        format = field_def['format'] 
     712                        if format == 'wiki': 
     713                            old = wiki_to_html(old, self.env, None, db) 
     714                            new = wiki_to_html(new, self.env, None, db) 
     715                        elif format == 'wiki_oneliner': 
     716                            old = wiki_to_oneliner(old, self.env, db, shorten=True) 
     717                            new = wiki_to_oneliner(new, self.env, db, shorten=True) 
     718                        elif format == 'pre': 
     719                            old = wiki_to_html('{{{\n' + old + '\n}}}', self.env, None, db) 
     720                            new = wiki_to_html('{{{\n' + new + '\n}}}', self.env, None, db) 
     721                 
     722                current['fields'][field] = {'old': old, 'new': new, 'type': type, 'format': format} 
    693723        if current: 
    694724            yield current