How do I delete unused screens in JIRA Server via API?

Paul Tiseo May 30, 2018

I have multiple screens unassociated to any workflow or screen schemes. How do I delete these via the JIRA API (not REST)? I have ScriptRunner. I am able to delete WorkflowSchemes and Workflows because I found the WorkflowManager and WorkflowSchemeManager classes in the docs. But, there seems to be no ScreenManager? Does it have another name?

Also, once I have a list of screens, how do I check if it isn't in a screen scheme or workflow? (As in the https://example.com/secure/admin/ViewFieldScreens.jspa)

3 answers

1 accepted

4 votes
Answer accepted
Thanos Batagiannis _Adaptavist_
Rising Star
Rising Star
Rising Stars are recognized for providing high-quality answers to other users. Rising Stars receive a certificate of achievement and are on the path to becoming Community Leaders.
June 8, 2018

Hey Paul

The following script will remove the screens that are not assigned to a scheme or in a workflow. 

Is not fully tested so I would suggest to get a backup first.

import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.fields.screen.FieldScreenManager
import com.atlassian.jira.issue.fields.screen.FieldScreenSchemeManager
import com.atlassian.jira.workflow.WorkflowActionsBean

def fieldScreenManager = ComponentAccessor.getComponent(FieldScreenManager)
def fieldScreenSchemeManager = ComponentAccessor.getComponent(FieldScreenSchemeManager)

def allScreensIds = fieldScreenManager.getFieldScreens().collect {it.id}
def screenSchemes = fieldScreenSchemeManager.fieldScreenSchemes

def screenIdsWithScheme = []
screenSchemes.each {
def items = fieldScreenSchemeManager.getFieldScreenSchemeItems(it).collect {it.fieldScreen.id}
screenIdsWithScheme << items
}

def workflowBean = new WorkflowActionsBean()
def screenIdsWithWorkflowAction = []

ComponentAccessor.workflowManager.workflows?.each {
screenIdsWithWorkflowAction << it.allActions?.findResults { workflowBean.getFieldScreenForView(it)?.id ?: null }
}

def screenIdsInWorkflows = screenIdsWithWorkflowAction.flatten().unique()
def screensNotAssociatedToScheme = (allScreensIds - screenIdsWithScheme.flatten() - screenIdsInWorkflows)

screensNotAssociatedToScheme?.each {
log.debug "${fieldScreenManager.getFieldScreen(it).name} is not associated with any Screen Scheme or workflow and will be removed"
fieldScreenManager.removeFieldScreen(it)
}

Let me know how this went. 

Regards, Thanos

Paul Tiseo June 8, 2018

Can one call remove() on a FieldScreen() I have a different script going, but wasn't 100% sure on what the "delete" method was named?

Ahsan September 1, 2019

@Thanos Batagiannis _Adaptavist_ 

Is there any script to delete unused Field Configuration Schemes, Field Configurations and Fields?

Also, Unused Issue Types Schemes and Issue Types.

Thanks in advance. 

5 votes
Paul Tiseo June 8, 2018

I ended up with a simpler script, posted here for posterity and drive-by googlers:

import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.fields.screen.FieldScreenFactory
import com.atlassian.jira.issue.fields.screen.FieldScreenManager
import com.atlassian.jira.issue.fields.screen.FieldScreenSchemeManager
import com.atlassian.jira.web.action.admin.issuefields.screens.ViewFieldScreens
import com.atlassian.jira.workflow.WorkflowManager

FieldScreenManager fieldScreenManager = ComponentAccessor.getFieldScreenManager()
FieldScreenFactory fieldScreenFactory = ComponentAccessor.getComponent(FieldScreenFactory.class)
FieldScreenSchemeManager fieldScreenSchemeManager = ComponentAccessor.getComponent(FieldScreenSchemeManager.class)
WorkflowManager workflowManager = ComponentAccessor.getWorkflowManager()
ViewFieldScreens viewFieldScreens = new ViewFieldScreens(fieldScreenManager, fieldScreenFactory, fieldScreenSchemeManager, workflowManager)

log.error 'viewFieldScreens: ' + viewFieldScreens

// use StringBuffer to spit out log to screen for ScriptRunner Console
def sb = new StringBuffer()

for(def fieldScreen : fieldScreenManager.getFieldScreens()) {    
    if(viewFieldScreens.isDeletable(fieldScreen)) {
        sb.append("Deleted ${fieldScreen.getName()}")
        fieldScreenManager.removeFieldScreen(fieldScreen.getId())
        sb.append(" xxxxx ")
    }

    /*
    // get screen schemes that use the screen
    def fieldScreenSchemes = viewFieldScreens.getFieldScreenSchemes(fieldScreen)
    int screenSize = fieldScreenSchemes.size()
    sb.append("${fieldScreenSchemes.size()}")
    sb.append(" xxxxx ")

    // get the workflows that use the screen, if any
    def workflows = viewFieldScreens.getWorkflows(fieldScreen)
    def workflowSize = workflows.size()
    sb.append("${workflows.size()}")
    */
}

return sb.toString()
0 votes
Rodrigo December 13, 2018

Hi @Paul Tiseo

 

I just shared an article on bulk deleting unused screens with JMeter.

https://community.atlassian.com/t5/Jira-articles/Bulk-deleting-unused-screens-in-Jira-with-JMeter/ba-p/961695

 

It doesn't require additional apps/plugins and is quite safe, since it's just automatically firing HTTP requests that could be made by an actual (admin) user.

 

Cheers

Suggest an answer

Log in or Sign up to answer