Edgewall Software

Ticket #2178: trac-r2353.fix-2178-and-2063.diff

File trac-r2353.fix-2178-and-2063.diff, 7.7 KB (added by dserodio@…, 3 years ago)

New patch, replaces the previous one

  • trac/ticket/api.py

     
    6464 
    6565        # Owner field, can be text or drop-down depending on configuration 
    6666        field = {'name': 'owner', 'label': 'Owner'} 
    67         if self.config.get('ticket', 'restrict_owner').lower() in util.TRUE: 
     67        restrict_owner_cfg = self.config.get('ticket', 'restrict_owner').lower() 
     68        if restrict_owner_cfg in util.TRUE + ['username', 'name', 'name+username']: 
    6869            field['type'] = 'select' 
    6970            users = [] 
    7071            for username, name, email in self.env.get_known_users(db): 
    71                 users.append(username) 
     72                # Show name, username or 'name (username)', depending 
     73                # on configuration and available data 
     74                if name is None or restrict_owner_cfg in util.TRUE + ['username' ]: 
     75                    label = username 
     76                else:  
     77                    if restrict_owner_cfg == 'name+username' and name is not None: 
     78                        label = '%s (%s)' % (name, username) 
     79                    else:  
     80                        label = name 
     81 
     82            users.append({'value':username, 'label':label}) 
    7283            field['options'] = users 
    7384            field['optional'] = True 
    7485        else: 
     
    90101                # Fields without possible values are treated as if they didn't 
    91102                # exist 
    92103                continue 
     104            optionItems = [] 
     105            for option in options: 
     106                optionItems.append({'value':option, 'label':option}) 
    93107            field = {'name': name, 'type': 'select', 'label': name.title(), 
    94108                     'value': self.config.get('ticket', 'default_' + name), 
    95                      'options': options} 
     109                     'options': optionItems} 
    96110            if name in ('status', 'resolution'): 
    97111                field['type'] = 'radio' 
    98112            elif name in ('milestone', 'version'): 
     
    124138            } 
    125139            if field['type'] == 'select' or field['type'] == 'radio': 
    126140                options = self.config.get('ticket-custom', name + '.options') 
    127                 field['options'] = [value.strip() for value in options.split('|')] 
     141                field['options'] = {} 
     142                field['options']['value'] = [value.strip() for value in options.split('|')] 
     143                field['options']['label'] = [value.strip() for value in options.split('|')] 
    128144            elif field['type'] == 'textarea': 
    129145                field['width'] = self.config.get('ticket-custom', name + '.cols') 
    130146                field['height'] = self.config.get('ticket-custom', name + '.rows') 
  • trac/ticket/web_ui.py

     
    119119                field['label'] = 'Assign to' 
    120120            elif name == 'milestone': 
    121121                # Don't make completed milestones available for selection 
    122                 options = field['options'][:] 
     122                optionItems = field['options'][:] 
    123123                for option in field['options']: 
    124                     milestone = Milestone(self.env, option, db=db) 
    125                     if milestone.is_completed: 
    126                         options.remove(option) 
    127                 field['options'] = options 
     124                    milestone = Milestone(self.env, option['value'], db=db) 
     125                    if not milestone.is_completed: 
     126                        optionItems.append({'value':option, 'label':option}) 
     127                field['options'] = optionItems 
    128128            req.hdf['newticket.fields.' + name] = field 
    129129 
    130130        add_stylesheet(req, 'common/css/ticket.css') 
     
    371371        for field in TicketSystem(self.env).get_ticket_fields(): 
    372372            if field['type'] in ('radio', 'select'): 
    373373                value = ticket.values.get(field['name']) 
    374                 if value and not value in field['options']: 
     374                if value and not value in [item['value'] for item in field['options']]: 
    375375                    # Current ticket value must be visible even if its not in the 
    376376                    # possible values 
    377                     field['options'].append(value) 
     377                    field['options'].append({'value':value,'label':value}) 
    378378            name = field['name'] 
    379379            del field['name'] 
    380380            if name in ('summary', 'reporter', 'description', 'type', 'status', 
  • trac/ticket/tests/model.py

     
    11from trac.config import Configuration 
    2 from trac.ticket.model import Ticket, Component, Priority 
     2from trac.ticket.model import Ticket, Component, Priority, Type 
    33from trac.test import EnvironmentStub 
    44 
    55import unittest 
     
    211211        p = Priority(self.env, 'bar') 
    212212        p.delete()         
    213213 
     214    def test_ticket_type_enum(self): 
     215        """ 
     216        The Type (ticket type) enum class behaves a little different than 
     217        the rest, so it gets some additional testing. 
     218        """ 
     219        t = Type(self.env, 'task') 
     220        self.assertEqual(t.name, 'task') 
     221        self.assertEqual(t.value, '3') 
     222        t.name = 'foo' 
     223        t.update() 
     224 
    214225def suite(): 
    215226    return unittest.makeSuite(TicketModelTestCase, 'test') 
    216227 
  • templates/ticket.cs

     
    194194        var:name(field) ?>" name="<?cs 
    195195        var:name(field) ?>"><?cs 
    196196        if:field.optional ?><option></option><?cs /if ?><?cs 
    197         each:option = field.options ?><option<?cs 
     197        each:option = field.options ?><option<?cs var option:value ?><?cs 
    198198         if:option == ticket[name(field)] ?> selected="selected"<?cs /if ?>><?cs 
    199          var:option ?></option><?cs 
     199         var:option.label ?></option><?cs 
    200200        /each ?></select><?cs 
    201201      elif:field.type == 'checkbox' ?><input type="hidden" name="checkbox_<?cs 
    202202        var:name(field) ?>" /><input type="checkbox" id="<?cs 
  • templates/macros.cs

     
    22 <select size="1" id="<?cs var:name ?>" name="<?cs var:name ?>"><?cs 
    33  if:optional ?><option></option><?cs /if ?><?cs 
    44  each:option = options ?> 
    5    <option<?cs if:option == selected ?> selected="selected"<?cs /if ?>><?cs  
    6      var:option ?></option><?cs 
     5   <option value="<?cs var:option.value?>"<?cs if:option == selected ?> selected="selected"<?cs /if ?>><?cs  
     6     var:option.label ?></option><?cs 
    77  /each ?> 
    88 </select><?cs 
    99/def?><?cs 
  • templates/newticket.cs

     
    6464      elif:field.type == 'select' ?><select id="<?cs 
    6565        var:name(field) ?>" name="<?cs var:name(field) ?>"><?cs 
    6666        if:field.optional ?><option></option><?cs /if ?><?cs 
    67         each:option = field.options ?><option<?cs 
     67        each:option = field.options ?><option value="<?cs var:option.value ?>" <?cs 
    6868         if:option == newticket[name(field)] ?> selected="selected"<?cs /if ?>><?cs 
    69          var:option ?></option><?cs 
     69         var:option.label ?></option><?cs 
    7070        /each ?></select><?cs 
    7171      elif:field.type == 'checkbox' ?><input type="hidden" name="checkbox_<?cs 
    7272        var:name(field) ?>" /><input type="checkbox" id="<?cs