close Warning: Can't synchronize with repository "(default)" ("(default)" is not readable or not a Git repository.). Look in the Trac log for more information.

Changes between Version 3 and Version 4 of TracTicketsCustomFields


Ignore:
Timestamp:
Jan 30, 2019, 11:46:52 PM (5 years ago)
Author:
trac
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • TracTicketsCustomFields

    v3 v4  
    33
    44== Configuration
    5 
    65Configuring custom ticket fields is done in the [wiki:TracIni trac.ini] file. All field definitions should be under a section named `[ticket-custom]`.
    76
     
    1211 ...
    1312}}}
    14 
    1513The example below should help to explain the syntax.
    1614
    17 === Field Names
    18 A field name can only contain lowercase letters a-z, uppercase letters A-Z or digits 0-9, and must not start with a leading digit.
    19 
    20 The following field names are reserved and can not be used for custom fields:
    21 * cc
    22 * changetime
    23 * col
    24 * comment
    25 * component
    26 * desc
    27 * description
    28 * format
    29 * group
    30 * groupdesc
    31 * id
    32 * keywords
    33 * max
    34 * milestone
    35 * or
    36 * order
    37 * owner
    38 * page
    39 * priority
    40 * report
    41 * reporter
    42 * resolution
    43 * row
    44 * severity
    45 * status
    46 * summary
    47 * time
    48 * type
    49 * verbose
    50 * version
    51 
    5215=== Available Field Types and Options
    53 
    5416 * '''text''': A simple (one line) text field.
    5517   * label: Descriptive label.
     
    9557Macros will be expanded when rendering `textarea` fields with format `wiki`, but not when rendering `text` fields with format `wiki`.
    9658
    97 === Sample Configuration
    98 
    99 {{{#!ini
     59=== Sample Config
     60{{{
    10061[ticket-custom]
    10162
     
    150111Custom ticket fields are stored in the `ticket_custom` table, not in the `ticket` table. So to display the values from custom fields in a report, you will need a join on the 2 tables. Let's use an example with a custom ticket field called `progress`.
    151112
    152 {{{#!sql
     113{{{
     114#!sql
    153115SELECT p.value AS __color__,
    154116   id AS ticket, summary, owner, c.value AS progress
     
    161123
    162124However, if you want to show all ticket entries (with progress defined and without), you need to use a `JOIN` for every custom field that is in the query:
    163 {{{#!sql
     125{{{
     126#!sql
    164127SELECT p.value AS __color__,
    165128   id AS ticket, summary, component, version, milestone, severity,
     
    168131   changetime AS _changetime, description AS _description,
    169132   reporter AS _reporter,
    170    (CASE WHEN c.value = '0' THEN 'None' ELSE c.value END) AS progress
     133  (CASE WHEN c.value = '0' THEN 'None' ELSE c.value END) AS progress
    171134  FROM ticket t
    172135     LEFT OUTER JOIN ticket_custom c ON (t.id = c.ticket AND c.name = 'progress')
     
    178141Note in particular the `LEFT OUTER JOIN` statement here.
    179142
    180 Note that if your config file uses an '''uppercase''' name:
    181 {{{#!ini
     143Note that if your config file uses an uppercase name, e.g.,
     144{{{
    182145[ticket-custom]
    183146
    184147Progress_Type = text
    185148}}}
    186 you would use '''lowercase''' in the SQL: `AND c.name = 'progress_type'`.
     149you would use lowercase in the SQL: `AND c.name = 'progress_type'`
     150
     151=== Updating the database
     152
     153As noted above, any tickets created before a custom field has been defined will not have a value for that field. Here's a bit of SQL (tested with SQLite) that you can run directly on the Trac database to set an initial value for custom ticket fields. Inserts the default value of 'None' into a custom field called 'request_source' for all tickets that have no existing value:
     154
     155{{{
     156#!sql
     157INSERT INTO ticket_custom
     158   (ticket, name, value)
     159   SELECT
     160      id AS ticket,
     161      'request_source' AS name,
     162      'None' AS value
     163   FROM ticket
     164   WHERE id NOT IN (
     165      SELECT ticket FROM ticket_custom
     166   );
     167}}}
     168
     169If you added multiple custom fields at different points in time, you should be more specific in the subquery on table {{{ticket}}} by adding the exact custom field name to the query:
     170
     171{{{
     172#!sql
     173INSERT INTO ticket_custom
     174   (ticket, name, value)
     175   SELECT
     176      id AS ticket,
     177      'request_source' AS name,
     178      'None' AS value
     179   FROM ticket
     180   WHERE id NOT IN (
     181      SELECT ticket FROM ticket_custom WHERE name = 'request_source'
     182   );
     183}}}
    187184
    188185----