The Atlassian Community Forums are currently in read-only mode. We will be relaunching on a new platform on September 22 (read more here). We apologize for the extended downtime. For concerns or questions, please email communitymanagers@atlassian.com. See you on the other side, on the new Atlassian Community Forums! :)

×

Forums

Articles
Create
cancel
Showing results for 
Search instead for 
Did you mean: 

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

Paul Tiseo
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 Champions.
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

Comments for this post are closed

Community moderators have prevented the ability to post new answers.

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 Champions.
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
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 Champions.
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. 

6 votes
Paul Tiseo
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 Champions.
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
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 Champions.
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