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.
Online forums and learning are now in one easy-to-use experience.
By continuing, you accept the updated Community Terms of Use and acknowledge the Privacy Policy. Your public name, photo, and achievements may be publicly visible and available in search engines.
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.