Content
View differences
Updated by Andrej Sandorf about 9 hours ago
**As** an admin migrating from Jira to OpenProject
**I want to** migrate custom fields of my Jira Issues to custom fields in OpenProject
**so that** I have a more complete work package description
<br>
**Acceptance criteria**
* Custom fields for custom field types OpenProject has a corresponding field type are migrated
<br>
**Technical notes**
Plan outline:
1. For the selected projects scan the issue payloads, collect only the \`customfield\_XXXXX\` IDs that have non-null values in the selected projects, store field definitions in \`jira\_fields\`
2. Map and create custom fields
1. Re-use CFs which have the correct type
2. Create new CFs with the same name but mismatching type
3. Create new CFs not found
4. Prepare special CFs like "Field context" lists
3. Associated the CFs with each work package type encountered during import, add import (add to work package form form?)
4. Set CF values on work packages at creation time, populate hierarchy items as needed
Caveats:
As with other data, a flag is set so existing CFs are not deleted on revert.
When creating CFs with different names, the names in the issue history have to be updated, too.
<br>
**Supported custom field types** **Straight forward:**
<figure class="table op-uc-figure_align-center op-uc-figure"><table class="op-uc-table"><thead class="op-uc-table--head"><tr class="op-uc-table--row"><th class="op-uc-table--cell op-uc-table--cell_head"><p class="op-uc-p">Jira field type</p></th><th class="op-uc-table--cell op-uc-table--cell_head"><p class="op-uc-p">Jira CF schema</p></th><th class="op-uc-p">Example Jira CF</p></th><th class="op-uc-table--cell op-uc-table--cell_head"><p class="op-uc-p">OP target</p></th><th class="op-uc-table--cell op-uc-table--cell_head"><p class="op-uc-p">Notes</p></th></tr></thead><tbody><tr class="op-uc-table--row"><td class="op-uc-table--cell"><p class="op-uc-p"><code class="op-uc-code">string</code></p></td><td class="op-uc-table--cell"><p class="op-uc-p"><code class="op-uc-code">"type": "string"</code><br><code class="op-uc-code">"custom": "com.atlassian.jira.plugin.system.customfieldtypes:textfield"</code></p></td><td class="op-uc-code">textfield</code>, <code class="op-uc-code">grouppicker</code></p></td><td class="op-uc-table--cell"><p class="op-uc-p"><code class="op-uc-code">string</code></p></td><td class="op-uc-table--cell"><p class="op-uc-p"><br data-cke-filler="true"></p></td></tr><tr class="op-uc-table--row"><td class="op-uc-table--cell"><p class="op-uc-p"><code class="op-uc-code">date</code></p></td><td class="op-uc-table--cell"><p class="op-uc-p"><code class="op-uc-code">"type": "date"</code><br><code class="op-uc-code">"custom": "com.atlassian.jira.plugin.system.customfieldtypes:datepicker"</code></p></td><td class="op-uc-code">datepicker</code></p></td><td class="op-uc-table--cell"><p class="op-uc-p"><code class="op-uc-code">date</code></p></td><td class="op-uc-table--cell"><p class="op-uc-p"><br data-cke-filler="true"></p></td></tr><tr class="op-uc-table--row"><td class="op-uc-table--cell"><p class="op-uc-p"><code class="op-uc-code">checkboxes</code></p></td><td class="op-uc-table--cell"><p class="op-uc-p"><code class="op-uc-code">"type": "array"</code><br><code class="op-uc-code">"items": "option"</code><br><code class="op-uc-code">"custom": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes"</code></p></td><td class="op-uc-code">checkboxes</code><br>Boolean flags (<code class="op-uc-code">"true"</code>/<code class="op-uc-code">"false"</code>)</p></td><td class="op-uc-table--cell"><p class="op-uc-p"><code class="op-uc-code">bool</code></p></td><td class="op-uc-table--cell"><p class="op-uc-p"><mention class="mention" data-id="73933" data-type="work_package" data-text="#73933">#73933</mention> <br>- for data-text="#73933">#73933</mention> <br>for each option of a checkbox list, <br>one dedicated boolean custom field is created<br>- List entries can be "disabled" in Jira,<br>OP does not support this</p></td></tr><tr created</p></td></tr><tr class="op-uc-table--row"><td class="op-uc-table--cell"><p class="op-uc-p"><code class="op-uc-code">string</code> with <code class="op-uc-code">url</code></p></td><td class="op-uc-table--cell"><p class="op-uc-p"><code class="op-uc-code">"type": "string"</code><br><code class="op-uc-code">"custom": "com.atlassian.jira.plugin.system.customfieldtypes:url"</code></p></td><td class="op-uc-p">URL custom field</p></td><td class="op-uc-table--cell"><p class="op-uc-p"><code class="op-uc-code">link</code></p></td><td class="op-uc-table--cell"><p class="op-uc-p"><br data-cke-filler="true"></p></td></tr><tr class="op-uc-table--row"><td class="op-uc-table--cell"><p class="op-uc-p"><code class="op-uc-code">text</code></p></td><td class="op-uc-table--cell"><p class="op-uc-p"><code class="op-uc-code">"type": "string"</code><br><code class="op-uc-code">"custom": "com.atlassian.jira.plugin.system.customfieldtypes:textarea"</code></p></td><td class="op-uc-code">textarea</code></p></td><td class="op-uc-table--cell"><p class="op-uc-p"><code class="op-uc-code">longtext</code></p></td><td class="op-uc-table--cell"><p class="op-uc-p"><mention class="mention" data-id="73944" data-type="work_package" data-text="#73944">#73944</mention> <br>- Text data-text="#73944">#73944</mention> <br>Text is converted into Markdown as Wiki markup, <br>which may result in unexpected formatting.</p></td></tr><tr class="op-uc-table--row"><td class="op-uc-table--cell"><p class="op-uc-p"><code class="op-uc-code">number</code></p></td><td class="op-uc-table--cell"><p class="op-uc-p"><code class="op-uc-code">"type": "number"</code><br><code class="op-uc-code">"custom": "com.atlassian.jira.plugin.system.customfieldtypes:float"</code></p></td><td class="op-uc-code">float</code>, <code class="op-uc-code">story points</code></p></td><td class="op-uc-table--cell"><p class="op-uc-p"><code class="op-uc-code">float</code></p></td><td class="op-uc-table--cell"><p class="op-uc-p"><br data-cke-filler="true"></p></td></tr><tr class="op-uc-table--row"><td class="op-uc-table--cell"><p class="op-uc-p"><code class="op-uc-code">array</code> of <code class="op-uc-code">string</code></p></td><td class="op-uc-table--cell"><p class="op-uc-p"><code class="op-uc-code">"type": "option"</code><br><code class="op-uc-code">"custom": "com.atlassian.jira.plugin.system.customfieldtypes:select"</code>,</p><p class="op-uc-p">and</p><p class="op-uc-p"><code class="op-uc-code">"type": "array"</code><br><code class="op-uc-code">"items": "option"</code><br><code class="op-uc-code">"custom": "com.atlassian.jira.plugin.system.customfieldtypes:multiselect"</code></p></td><td class="op-uc-code">options</code> </p></td><td class="op-uc-table--cell"><p class="op-uc-p"><code class="op-uc-code">list</code></p></td><td class="op-uc-table--cell"><p class="op-uc-p">- If class="op-uc-p">If a "Field context" is used on Jira side for <br>different list options per project and issue type, <br>multiple OP custom fields are created<br>As these contexts are not available via the API <br>their names cannot be used, the field names are<br>suffixed with <code class="op-uc-code">(project_identifier)</code><br>- List class="op-uc-code">(project_identifier)</code><br><br>List entries can be "disabled" "deactivated" in Jira, <br>OP does not support this</p></td></tr><tr class="op-uc-table--row"><td class="op-uc-table--cell"><p class="op-uc-p"><code class="op-uc-code">cascadingselect</code></p></td><td class="op-uc-table--cell"><p class="op-uc-p"><code class="op-uc-code">"type": "option-with-child"</code><br><code class="op-uc-code">"custom": "com.atlassian.jira.plugin.system.customfieldtypes:cascadingselect"</code></p></td><td class="op-uc-table--cell"><p class="op-uc-p"><code class="op-uc-code">hierarchy</code> (Enterprise)</p></td><td class="op-uc-table--cell"><p class="op-uc-p">- If a "Field context" is used on Jira side for <br>different list options per project and issue type, <br>multiple OP custom fields are created<br>As these contexts are not available via the API <br>their names cannot be used, the field names are<br>suffixed with <code class="op-uc-code">(project_identifier)</code></p></td></tr></tbody></table></figure> this</p></td></tr></tbody></table></figure>
**Partial Partial data migration / To discuss**: migration:
<figure class="table op-uc-figure_align-center op-uc-figure"><table class="op-uc-table"><thead class="op-uc-table--head"><tr class="op-uc-table--row"><th class="op-uc-table--cell op-uc-table--cell_head"><p class="op-uc-p">Jira field type</p></th><th class="op-uc-table--cell op-uc-table--cell_head"><p class="op-uc-p">Jira CF schema</p></th><th class="op-uc-p">Example Jira CF</p></th><th class="op-uc-table--cell op-uc-table--cell_head"><p class="op-uc-p">Possible OP target</p></th><th class="op-uc-table--cell op-uc-table--cell_head"><p class="op-uc-p">Notes</p></th></tr></thead><tbody><tr class="op-uc-table--row"><td class="op-uc-table--cell"><p class="op-uc-p"><code class="op-uc-code">datetime</code></p></td><td class="op-uc-table--cell"><p class="op-uc-p"><code class="op-uc-code">"type": "datetime"</code><br><code class="op-uc-code">"custom": "com.atlassian.jira.plugin.system.customfieldtypes:datetime"</code></p></td><td class="op-uc-code">datetime</code></p></td><td class="op-uc-table--cell"><p class="op-uc-p"><code class="op-uc-code">date</code></p></td><td class="op-uc-table--cell"><p class="op-uc-p">#32646 <br>- Time-of-day class="op-uc-p">#32646 </p><p class="op-uc-p"><br>Time-of-day and timezone lost</p></td></tr><tr class="op-uc-table--row"><td class="op-uc-table--cell"><p class="op-uc-p"><code class="op-uc-code">user</code></p></td><td class="op-uc-table--cell"><p class="op-uc-p"><code class="op-uc-code">"type": "user"</code><br><code class="op-uc-code">"custom": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker"</code></p></td><td class="op-uc-code">userpicker</code></p></td><td class="op-uc-table--cell"><p class="op-uc-p"><code class="op-uc-code">user</code></p></td><td class="op-uc-table--cell"><p class="op-uc-p">- OP class="op-uc-p">OP requires users in the select to be members of the project<br>to not change visibility, non-member users are left out</p></td></tr><tr class="op-uc-table--row"><td class="op-uc-table--cell"><p class="op-uc-p"><code class="op-uc-code">array</code> of <code class="op-uc-code">user</code></p></td><td class="op-uc-table--cell"><p class="op-uc-p"><code class="op-uc-code">"type": "array"</code><br><code class="op-uc-code">"items": "user"</code><br><code class="op-uc-code">"custom": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker"</code></p></td><td class="op-uc-code">multiuserpicker</code></p></td><td class="op-uc-table--cell"><p class="op-uc-p"><code class="op-uc-code">user</code></p></td><td class="op-uc-table--cell"><p class="op-uc-p">- OP class="op-uc-p">OP requires users in the select to be members of the project<br>to not change visibility, non-member users are left out</p></td></tr><tr class="op-uc-table--row"><td class="op-uc-table--cell"><p class="op-uc-p"><code class="op-uc-code">array</code> of <code class="op-uc-code">label</code></p></td><td class="op-uc-table--cell"><p class="op-uc-p"><code class="op-uc-code">"type": "array"</code><br><code class="op-uc-code">"items": "string"</code><br><code class="op-uc-code">"custom": "com.atlassian.jira.plugin.system.customfieldtypes:labels"</code></p></td><td class="op-uc-table--cell"><p class="op-uc-p"><code class="op-uc-code">list</code></p></td><td class="op-uc-table--cell"><p class="op-uc-p">Currently imported as a list custom field</p></td></tr><tr class="op-uc-table--row"><td class="op-uc-table--cell"><p class="op-uc-p"><code class="op-uc-code">cascadingselect</code> on Community Edition</p></td><td class="op-uc-table--cell"><p class="op-uc-p"><code class="op-uc-code">"type": "option-with-child"</code><br><code class="op-uc-code">"custom": "com.atlassian.jira.plugin.system.customfieldtypes:cascadingselect"</code></p></td><td class="op-uc-table--cell"><p class="op-uc-p"><code class="op-uc-code">string</code></p></td><td class="op-uc-table--cell"><p class="op-uc-p">e.g. "Animals - Cat"</p></td></tr></tbody></table></figure> out</p></td></tr></tbody></table></figure>
**Out of scope:** **To discuss:**
When creating CFs with different names as in the origin Jira, the names in the issue history are not changed.
<figure class="table op-uc-figure_align-center op-uc-figure"><table class="op-uc-table"><thead class="op-uc-table--head"><tr class="op-uc-table--row"><th class="op-uc-table--cell op-uc-table--cell_head"><p class="op-uc-p">Jira field type</p></th><th class="op-uc-table--cell op-uc-table--cell_head"><p class="op-uc-p">Example Jira CF</p></th><th class="op-uc-table--cell op-uc-table--cell_head"><p class="op-uc-p">Possible OP target</p></th><th class="op-uc-table--cell op-uc-table--cell_head"><p class="op-uc-p">Notes</p></th></tr></thead><tbody><tr class="op-uc-table--row"><td class="op-uc-table--cell"><p class="op-uc-p"><code class="op-uc-code">array</code> of <code class="op-uc-code">options</code></p></td><td class="op-uc-code">cascadingselect</code></p></td><td class="op-uc-table--cell"><p class="op-uc-p"><code class="op-uc-code">"type": "option"</code><br><code class="op-uc-code">"custom": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons"</code></p></td><td class="op-uc-code">cascadingselect</code></p></td><td class="op-uc-table--cell"><p class="op-uc-p"><mention class="mention" data-id="73956" data-type="work_package" data-text="#73956">#73956</mention> </p></td></tr><tr class="op-uc-table--row"><td class="op-uc-table--cell"><p class="op-uc-p">Customer Request Type</p><p class="op-uc-p"><br data-cke-filler="true"></p></td><td class="op-uc-table--cell"><p class="op-uc-p"><code class="op-uc-code">"type": "sd-customerrequesttype"</code><br><code class="op-uc-code">"custom": "com.atlassian.servicedesk:vp-origin"</code></p></td><td class="op-uc-code">hierarchy</code> (Enterprise)</p></td><td class="op-uc-table--cell"><p class="op-uc-p"><br data-cke-filler="true"></p></td></tr><tr class="op-uc-table--row"><td class="op-uc-table--cell"><p class="op-uc-p">Template Type</p></td><td class="op-uc-table--cell"><p class="op-uc-p"><code class="op-uc-code">"type": "any"</code><br><code class="op-uc-code">"custom": "com.intenso.jira.issue-templates:issue-templates-customfield"</code></p></td><td class="op-uc-code">cascadingselect</code> on Community Edition</p></td><td class="op-uc-table--cell"><p class="op-uc-p"><br data-cke-filler="true"></p></td></tr><tr class="op-uc-table--row"><td class="op-uc-table--cell"><p class="op-uc-p">Epic Link</p></td><td class="op-uc-table--cell"><p class="op-uc-p"><code class="op-uc-code">"type": "any"</code><br><code class="op-uc-code">"custom": "com.pyxis.greenhopper.jira:gh-epic-link"</code></p></td><td class="op-uc-code">cascadingselect</code></p></td><td class="op-uc-table--cell"><p class="op-uc-p"><br data-cke-filler="true"></p></td></tr><tr class="op-uc-table--row"><td data-cke-filler="true"></p></td><td class="op-uc-table--cell"><p class="op-uc-p">Rank</p></td><td class="op-uc-table--cell"><p class="op-uc-p"><code class="op-uc-code">"type": "any"</code><br><code class="op-uc-code">"custom": "com.pyxis.greenhopper.jira:gh-lexo-rank"</code></p></td><td class="op-uc-table--cell"><p class="op-uc-p"><br data-cke-filler="true"></p></td></tr><tr class="op-uc-table--row"><td class="op-uc-table--cell"><p class="op-uc-p"><code class="op-uc-code">array</code> of <code class="op-uc-code">component</code></p></td><td class="op-uc-code">string</code></p></td><td class="op-uc-table--cell"><p class="op-uc-p"><code class="op-uc-code">coomponents</code></p></td><td class="op-uc-code">multi-grouppicker</code></p></td><td class="op-uc-table--cell"><p class="op-uc-p"><br data-cke-filler="true"></p></td></tr><tr class="op-uc-table--row"><td class="op-uc-table--cell"><p class="op-uc-p"><code class="op-uc-code">array</code> of <code class="op-uc-code">string</code></p></td><td class="op-uc-code">list</code></p></td><td class="op-uc-table--cell"><p class="op-uc-p"><code class="op-uc-code">multi-grouppicker</code></p></td><td class="op-uc-table--cell"><p class="op-uc-p"><br data-cke-filler="true"></p></td></tr><tr class="op-uc-table--row"><td class="op-uc-table--cell"><p class="op-uc-p"><code class="op-uc-code">version</code> single</p></td><td class="op-uc-table--cell"><p class="op-uc-p"><code class="op-uc-code">version-picker</code></p></td><td class="op-uc-table--cell"><p class="op-uc-p"><br data-cke-filler="true"></p></td><td class="op-uc-table--cell"><p class="op-uc-p">Do we create versions? Those will be global</p></td></tr><tr class="op-uc-table--row"><td class="op-uc-table--cell"><p class="op-uc-p"><code class="op-uc-code">array</code> of <code class="op-uc-code">version</code></p></td><td class="op-uc-table--cell"><p class="op-uc-p"><code class="op-uc-code">array</code> of <code class="op-uc-code">version</code></p></td><td class="op-uc-p">Fix versions, affects versions</p></td><td class="op-uc-table--cell"><p class="op-uc-p"><br data-cke-filler="true"></p></td><td class="op-uc-table--cell"><p class="op-uc-p"><br data-cke-filler="true"></p></td></tr><tr class="op-uc-table--row"><td class="op-uc-table--cell"><p class="op-uc-p"><code class="op-uc-code">array</code> of <code class="op-uc-code">issuelink</code></p></td><td class="op-uc-table--cell"><p class="op-uc-p"><code class="op-uc-code">issuelinks</code></p></td><td class="op-uc-table--cell"><p class="op-uc-p"><br data-cke-filler="true"></p></td><td class="op-uc-table--cell"><p class="op-uc-p"><br data-cke-filler="true"></p></td></tr><tr class="op-uc-table--row"><td class="op-uc-table--cell"><p class="op-uc-p"><code class="op-uc-code">any</code> — sprint</p></td><td class="op-uc-table--cell"><p class="op-uc-p"><code class="op-uc-code">gh-sprint</code></p></td><td class="op-uc-table--cell"><p class="op-uc-p"><br data-cke-filler="true"></p></td><td class="op-uc-table--cell"><p class="op-uc-p">State, board, date info</p></td></tr><tr info lost</p></td></tr><tr class="op-uc-table--row"><td class="op-uc-table--cell"><p class="op-uc-p"><code class="op-uc-code">any</code> — epic link</p></td><td class="op-uc-table--cell"><p class="op-uc-p"><code class="op-uc-code">gh-epic-link</code></p></td><td class="op-uc-table--cell"><p class="op-uc-p"><br data-cke-filler="true"></p></td><td class="op-uc-table--cell"><p class="op-uc-p">(issue key, e.g. <code class="op-uc-code">PROJ-42</code>)</p></td></tr><tr class="op-uc-table--row"><td class="op-uc-table--cell"><p class="op-uc-p"><code class="op-uc-code">any</code> — unknown plugins</p></td><td class="op-uc-table--cell"><p class="op-uc-p">Various Atlassian plugins</p></td><td class="op-uc-table--cell"><p class="op-uc-p"><code class="op-uc-code">string</code> (<code class="op-uc-code">value.to_s</code>)</p></td><td class="op-uc-table--cell"><p class="op-uc-p">Produces raw JSON string dump</p></td></tr></tbody></table></figure><br> dump</p></td></tr><tr class="op-uc-table--row"><td class="op-uc-table--cell"><p class="op-uc-p"><br data-cke-filler="true"></p></td><td class="op-uc-table--cell"><p class="op-uc-p"><br data-cke-filler="true"></p></td><td class="op-uc-table--cell"><p class="op-uc-p"><br data-cke-filler="true"></p></td><td class="op-uc-table--cell"><p class="op-uc-p"><br data-cke-filler="true"></p></td></tr></tbody></table></figure>
<br> **Out of scope**
<figure class="table op-uc-figure_align-center op-uc-figure"><table class="op-uc-table"><thead class="op-uc-table--head"><tr class="op-uc-table--row"><th class="op-uc-table--cell op-uc-table--cell_head"><p class="op-uc-p">Jira field type</p></th><th class="op-uc-table--cell op-uc-table--cell_head"><p class="op-uc-p">Example Jira CF</p></th><th class="op-uc-table--cell op-uc-table--cell_head"><p class="op-uc-p">Notes</p></th></tr></thead><tbody><tr class="op-uc-table--row"><td class="op-uc-table--cell"><p class="op-uc-p"><code class="op-uc-code">array</code> of <code class="op-uc-code">component</code></p></td><td class="op-uc-table--cell"><p class="op-uc-p"><code class="op-uc-code">coomponents</code></p></td><td class="op-uc-table--cell"><p class="op-uc-p"><br data-cke-filler="true"></p></td></tr><tr class="op-uc-table--row"><td class="op-uc-table--cell"><p class="op-uc-p"><code class="op-uc-code">array</code> of <code class="op-uc-code">label</code></p></td><td class="op-uc-table--cell"><p class="op-uc-p"><code class="op-uc-code">labels</code></p></td><td class="op-uc-table--cell"><p class="op-uc-p">Currently imported as a list custom field</p></td></tr><tr class="op-uc-table--row"><td class="op-uc-table--cell"><p class="op-uc-p"><code class="op-uc-code">array</code> of <code class="op-uc-code">options</code></p></td><td class="op-uc-table--cell"><p class="op-uc-p"><code class="op-uc-code">radiobuttons</code></p></td><td class="op-uc-table--cell"><p class="op-uc-p"><mention class="mention" data-id="73956" data-type="work_package" data-text="#73956">#73956</mention> </p></td></tr><tr class="op-uc-table--row"><td class="op-uc-table--cell"><p class="op-uc-p">Customer Request Type</p><p class="op-uc-p"><br data-cke-filler="true"></p></td><td class="op-uc-table--cell"><p class="op-uc-p"><code class="op-uc-code">{</code><br><code class="op-uc-code"> "type": "sd-customerrequesttype",</code><br><code class="op-uc-code"> "custom": "com.atlassian.servicedesk:vp-origin"</code><br><code class="op-uc-code">}</code></p></td><td class="op-uc-table--cell"><p class="op-uc-p"><br data-cke-filler="true"></p></td></tr><tr class="op-uc-table--row"><td class="op-uc-table--cell"><p class="op-uc-p">Template Type</p></td><td class="op-uc-table--cell"><p class="op-uc-p"><code class="op-uc-code">{</code><br><code class="op-uc-code">"type": "any",</code><br><code class="op-uc-code">"custom": "com.intenso.jira.issue-templates:issue-templates-customfield"</code><br><code class="op-uc-code">}</code></p></td><td class="op-uc-table--cell"><p class="op-uc-p"><br data-cke-filler="true"></p></td></tr><tr class="op-uc-table--row"><td class="op-uc-table--cell"><p class="op-uc-p">Epic Link</p></td><td class="op-uc-table--cell"><p class="op-uc-p"><code class="op-uc-code">{</code><br><code class="op-uc-code"> "type": "any",</code><br><code class="op-uc-code"> "custom": "com.pyxis.greenhopper.jira:gh-epic-link"</code><br><code class="op-uc-code">}</code></p></td><td class="op-uc-table--cell"><p class="op-uc-p"><br data-cke-filler="true"></p></td></tr><tr class="op-uc-table--row"><td class="op-uc-table--cell"><p class="op-uc-p">Rank</p></td><td class="op-uc-table--cell"><p class="op-uc-p"><code class="op-uc-code">{</code><br><code class="op-uc-code"> "type": "any",</code><br><code class="op-uc-code"> "custom": "com.pyxis.greenhopper.jira:gh-lexo-rank"</code><br><code class="op-uc-code">}</code></p></td><td class="op-uc-table--cell"><p class="op-uc-p"><br data-cke-filler="true"></p></td></tr></tbody></table></figure>
**I want to** migrate custom fields of my Jira Issues to custom fields in OpenProject
**so that** I have a more complete work package description
* Custom fields for custom field types OpenProject has a corresponding field type are migrated
Plan outline:
1. For the selected projects scan the issue payloads, collect only the \`customfield\_XXXXX\` IDs that have non-null values in the selected projects, store field definitions in \`jira\_fields\`
2. Map and create custom fields
1. Re-use CFs which have the correct type
2. Create new CFs with the same name but mismatching type
3. Create new CFs not found
4. Prepare special CFs like "Field context" lists
3. Associated the CFs with each work package type encountered during import, add
4. Set CF values on work packages at creation time, populate hierarchy items as needed
Caveats:
As with other data, a flag is set so existing CFs are not deleted on revert.
When creating CFs with different names, the names in the issue history have to be updated, too.
<br>
**Supported custom field types**
<figure class="table op-uc-figure_align-center op-uc-figure"><table class="op-uc-table"><thead class="op-uc-table--head"><tr class="op-uc-table--row"><th class="op-uc-table--cell op-uc-table--cell_head"><p class="op-uc-p">Jira field type</p></th><th class="op-uc-table--cell op-uc-table--cell_head"><p class="op-uc-p">Jira CF schema</p></th><th
**Partial
<figure class="table op-uc-figure_align-center op-uc-figure"><table class="op-uc-table"><thead class="op-uc-table--head"><tr class="op-uc-table--row"><th class="op-uc-table--cell op-uc-table--cell_head"><p class="op-uc-p">Jira field type</p></th><th class="op-uc-table--cell op-uc-table--cell_head"><p class="op-uc-p">Jira CF schema</p></th><th
**Out of scope:**
When creating CFs with different names as in the origin Jira, the names in the issue history are not changed.
<figure class="table op-uc-figure_align-center op-uc-figure"><table class="op-uc-table"><thead class="op-uc-table--head"><tr class="op-uc-table--row"><th class="op-uc-table--cell op-uc-table--cell_head"><p class="op-uc-p">Jira field type</p></th><th class="op-uc-table--cell op-uc-table--cell_head"><p class="op-uc-p">Example Jira CF</p></th><th class="op-uc-table--cell op-uc-table--cell_head"><p
<br>
<figure class="table op-uc-figure_align-center op-uc-figure"><table class="op-uc-table"><thead class="op-uc-table--head"><tr class="op-uc-table--row"><th class="op-uc-table--cell op-uc-table--cell_head"><p class="op-uc-p">Jira field type</p></th><th class="op-uc-table--cell op-uc-table--cell_head"><p class="op-uc-p">Example Jira CF</p></th><th class="op-uc-table--cell op-uc-table--cell_head"><p class="op-uc-p">Notes</p></th></tr></thead><tbody><tr class="op-uc-table--row"><td class="op-uc-table--cell"><p class="op-uc-p"><code class="op-uc-code">array</code> of <code class="op-uc-code">component</code></p></td><td class="op-uc-table--cell"><p class="op-uc-p"><code class="op-uc-code">coomponents</code></p></td><td class="op-uc-table--cell"><p class="op-uc-p"><br data-cke-filler="true"></p></td></tr><tr class="op-uc-table--row"><td class="op-uc-table--cell"><p class="op-uc-p"><code class="op-uc-code">array</code> of <code class="op-uc-code">label</code></p></td><td class="op-uc-table--cell"><p class="op-uc-p"><code class="op-uc-code">labels</code></p></td><td class="op-uc-table--cell"><p class="op-uc-p">Currently imported as a list custom field</p></td></tr><tr class="op-uc-table--row"><td class="op-uc-table--cell"><p class="op-uc-p"><code class="op-uc-code">array</code> of <code class="op-uc-code">options</code></p></td><td class="op-uc-table--cell"><p class="op-uc-p"><code class="op-uc-code">radiobuttons</code></p></td><td class="op-uc-table--cell"><p class="op-uc-p"><mention class="mention" data-id="73956" data-type="work_package" data-text="#73956">#73956</mention> </p></td></tr><tr class="op-uc-table--row"><td class="op-uc-table--cell"><p class="op-uc-p">Customer Request Type</p><p class="op-uc-p"><br data-cke-filler="true"></p></td><td class="op-uc-table--cell"><p class="op-uc-p"><code class="op-uc-code">{</code><br><code class="op-uc-code"> "type": "sd-customerrequesttype",</code><br><code class="op-uc-code"> "custom": "com.atlassian.servicedesk:vp-origin"</code><br><code class="op-uc-code">}</code></p></td><td class="op-uc-table--cell"><p class="op-uc-p"><br data-cke-filler="true"></p></td></tr><tr class="op-uc-table--row"><td class="op-uc-table--cell"><p class="op-uc-p">Template Type</p></td><td class="op-uc-table--cell"><p class="op-uc-p"><code class="op-uc-code">{</code><br><code class="op-uc-code">"type": "any",</code><br><code class="op-uc-code">"custom": "com.intenso.jira.issue-templates:issue-templates-customfield"</code><br><code class="op-uc-code">}</code></p></td><td class="op-uc-table--cell"><p class="op-uc-p"><br data-cke-filler="true"></p></td></tr><tr class="op-uc-table--row"><td class="op-uc-table--cell"><p class="op-uc-p">Epic Link</p></td><td class="op-uc-table--cell"><p class="op-uc-p"><code class="op-uc-code">{</code><br><code class="op-uc-code"> "type": "any",</code><br><code class="op-uc-code"> "custom": "com.pyxis.greenhopper.jira:gh-epic-link"</code><br><code class="op-uc-code">}</code></p></td><td class="op-uc-table--cell"><p class="op-uc-p"><br data-cke-filler="true"></p></td></tr><tr class="op-uc-table--row"><td class="op-uc-table--cell"><p class="op-uc-p">Rank</p></td><td class="op-uc-table--cell"><p class="op-uc-p"><code class="op-uc-code">{</code><br><code class="op-uc-code"> "type": "any",</code><br><code class="op-uc-code"> "custom": "com.pyxis.greenhopper.jira:gh-lexo-rank"</code><br><code class="op-uc-code">}</code></p></td><td class="op-uc-table--cell"><p class="op-uc-p"><br data-cke-filler="true"></p></td></tr></tbody></table></figure>