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)
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
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?
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
@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.
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
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()
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
Hi @Paul Tiseo
I just shared an article on bulk deleting unused screens with JMeter.
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
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.