Create
cancel
Showing results forĀ 
Search instead forĀ 
Did you mean:Ā 
Sign up Log in

Reordering Jira Statuses

---- Edited on Nov 01 2021:

A new workaround has been implemented as a Browser Userscript available in 

https://jaus.atlassian.net

The "lauching post" is this: https://community.atlassian.com/t5/Jira-discussions/JAUS-Jira-Admin-Userscripts/m-p/1850976

One of the Userscripts is exactly for this end and is much easier to use than JMeter.

'hope you like it!

Cheers! šŸ»

----

 

Ever noticed how Statuses often aren't in the order you expect them to be in Dashboards or filter results?

That happens because Dashboards (and JQL's order by) order Statuses by their global order. That order is the same for all projects.

 

With admin credential, access .../secure/admin/ViewStatuses.jspa and you'll see the Statuses global order, from top (first) to bottom (last).

Having over a hundred Statuses (don't ask me :-)) and realizing their global order is all messed up can be upsetting. And new Statuses are put last in order by default.

 

You can proceed to reorder each status by clicking in the up/down arrows one-by-one or fallback to one of the lazy webdeveloper's favorite tool: JMeter! :-)

 

1) Open .../secure/admin/ViewStatuses.jspa and mouseover the "edit" link on the status you wish to reorder.

The URL will reveal the status ID, ex. .../secure/admin/EditStatus!default.jspa?id=12800

 

2) Decide how many positions you want to move up or down. Precision might not be critical here. Usually just keeping most of "todo" above "in progress" and above "done" is a good start.

 

3) Copy and paste the XML in the bottom into a new file and save it with ".jmx" extension. Comments are in pt_BR but nevermind. It was tested in JMeter 2 and 5.

 

4) Open JMeter and open the newly created file. Edit the settings like the prints below:

status_method: StatusUp or StatusDown (mopve up or down in the global order)
status_id: The ID you got in step 1).
loop_count: The number of positions you want to move the status up or down.
Hostnaem or IP: ex. jira.yourcompany.com
os_username: An Admin's username
os_password: The admin's password

jira-status-01.pngjira-status-02.pngjira-status-03.png


5) Just save it and play it! It's very fast. On the first executions set the loop_count to few values just to test the config.

 

6) Open .../secure/admin/ViewStatuses.jspa and confirm the Status has been reordered accordingly! :-)

You might need to tweak some more configs depending on your Jira or proxy setup...

 

Happy housekeeping!

 

XML:

<?xml version="1.0" encoding="UTF-8"?>
<jmeterTestPlan version="1.2" properties="5.0" jmeter="5.0 r1840935">
<hashTree>
<TestPlan guiclass="TestPlanGui" testclass="TestPlan" testname="Ordem de status no Jira" enabled="true">
<stringProp name="TestPlan.comments"></stringProp>
<boolProp name="TestPlan.functional_mode">false</boolProp>
<boolProp name="TestPlan.serialize_threadgroups">false</boolProp>
<elementProp name="TestPlan.user_defined_variables" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" testname="VariƔveis Definidas Pelo UsuƔrio" enabled="true">
<collectionProp name="Arguments.arguments"/>
</elementProp>
<stringProp name="TestPlan.user_define_classpath"></stringProp>
</TestPlan>
<hashTree>
<ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="Thread" enabled="true">
<stringProp name="ThreadGroup.on_sample_error">stopthread</stringProp>
<elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="Controlador de IteraĆ§Ć£o" enabled="true">
<boolProp name="LoopController.continue_forever">false</boolProp>
<stringProp name="LoopController.loops">1</stringProp>
</elementProp>
<stringProp name="ThreadGroup.num_threads">1</stringProp>
<stringProp name="ThreadGroup.ramp_time">1</stringProp>
<longProp name="ThreadGroup.start_time">1441750292000</longProp>
<longProp name="ThreadGroup.end_time">1441750292000</longProp>
<boolProp name="ThreadGroup.scheduler">false</boolProp>
<stringProp name="ThreadGroup.duration"></stringProp>
<stringProp name="ThreadGroup.delay"></stringProp>
</ThreadGroup>
<hashTree>
<Arguments guiclass="ArgumentsPanel" testclass="Arguments" testname="VARIAVEIS" enabled="true">
<collectionProp name="Arguments.arguments">
<elementProp name="status_method" elementType="Argument">
<stringProp name="Argument.name">status_method</stringProp>
<stringProp name="Argument.value">StatusUp</stringProp>
<stringProp name="Argument.metadata">=</stringProp>
<stringProp name="Argument.desc">StatusUp ou StatusDown</stringProp>
</elementProp>
<elementProp name="status_id" elementType="Argument">
<stringProp name="Argument.name">status_id</stringProp>
<stringProp name="Argument.value">XYZ</stringProp> <!-- REPLACE WITH STATUS ID -->
<stringProp name="Argument.desc">ID do status</stringProp>
<stringProp name="Argument.metadata">=</stringProp>
</elementProp>
<elementProp name="loop_count" elementType="Argument">
<stringProp name="Argument.name">loop_count</stringProp>
<stringProp name="Argument.value">10</stringProp>
<stringProp name="Argument.metadata">=</stringProp>
<stringProp name="Argument.desc">NĆŗmero de vezes pra subir ou descer o status</stringProp>
</elementProp>
</collectionProp>
</Arguments>
<hashTree/>
<CookieManager guiclass="CookiePanel" testclass="CookieManager" testname="Cookie" enabled="true">
<collectionProp name="CookieManager.cookies"/>
<boolProp name="CookieManager.clearEachIteration">false</boolProp>
</CookieManager>
<hashTree/>
<AuthManager guiclass="AuthPanel" testclass="AuthManager" testname="Auth" enabled="true">
<collectionProp name="AuthManager.auth_list"/>
</AuthManager>
<hashTree/>
<ConfigTestElement guiclass="HttpDefaultsGui" testclass="ConfigTestElement" testname="HTTP Request Defaults" enabled="true">
<elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
<collectionProp name="Arguments.arguments"/>
</elementProp>
<stringProp name="HTTPSampler.domain">XYZ</stringProp> <!-- REPLACE WITH JIRA'S URL -->
<stringProp name="HTTPSampler.port"></stringProp>
<stringProp name="HTTPSampler.protocol">https</stringProp>
<stringProp name="HTTPSampler.contentEncoding"></stringProp>
<stringProp name="HTTPSampler.path"></stringProp>
<stringProp name="HTTPSampler.concurrentPool">4</stringProp>
<stringProp name="HTTPSampler.implementation">HttpClient4</stringProp>
<stringProp name="HTTPSampler.connect_timeout">60000</stringProp>
<stringProp name="HTTPSampler.response_timeout">60000</stringProp>
</ConfigTestElement>
<hashTree/>
<HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Login" enabled="true">
<elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="VariƔveis Definidas Pelo UsuƔrio" enabled="true">
<collectionProp name="Arguments.arguments">
<elementProp name="os_username" elementType="HTTPArgument">
<boolProp name="HTTPArgument.always_encode">false</boolProp>
<stringProp name="Argument.value">XYZ</stringProp> <!-- REPLACE WITH ADMIN USERNAME -->
<stringProp name="Argument.metadata">=</stringProp>
<boolProp name="HTTPArgument.use_equals">true</boolProp>
<stringProp name="Argument.name">os_username</stringProp>
</elementProp>
<elementProp name="os_password" elementType="HTTPArgument">
<boolProp name="HTTPArgument.always_encode">false</boolProp>
<stringProp name="Argument.value">XYZ</stringProp> <!-- REPLACE WITH ADMIN PASSWORD -->
<stringProp name="Argument.metadata">=</stringProp>
<boolProp name="HTTPArgument.use_equals">true</boolProp>
<stringProp name="Argument.name">os_password</stringProp>
</elementProp>
</collectionProp>
</elementProp>
<stringProp name="HTTPSampler.domain"></stringProp>
<stringProp name="HTTPSampler.port"></stringProp>
<stringProp name="HTTPSampler.protocol"></stringProp>
<stringProp name="HTTPSampler.contentEncoding"></stringProp>
<stringProp name="HTTPSampler.path">/rest/gadget/1.0/login</stringProp>
<stringProp name="HTTPSampler.method">POST</stringProp>
<boolProp name="HTTPSampler.follow_redirects">false</boolProp>
<boolProp name="HTTPSampler.auto_redirects">false</boolProp>
<boolProp name="HTTPSampler.use_keepalive">true</boolProp>
<boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
<boolProp name="HTTPSampler.BROWSER_COMPATIBLE_MULTIPART">true</boolProp>
<stringProp name="HTTPSampler.embedded_url_re"></stringProp>
<stringProp name="HTTPSampler.connect_timeout"></stringProp>
<stringProp name="HTTPSampler.response_timeout"></stringProp>
<stringProp name="TestPlan.comments">Faz login com um usuƔrio admin no Jira</stringProp>
</HTTPSamplerProxy>
<hashTree/>
<LoopController guiclass="LoopControlPanel" testclass="LoopController" testname="RepetiĆ§Ć£o" enabled="true">
<boolProp name="LoopController.continue_forever">true</boolProp>
<stringProp name="LoopController.loops">${loop_count}</stringProp>
<stringProp name="TestPlan.comments">Repete a chamada da URL &quot;loop_count&quot; vezes</stringProp>
</LoopController>
<hashTree>
<HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="MovimentaĆ§Ć£o de status" enabled="true">
<elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="VariƔveis Definidas Pelo UsuƔrio" enabled="true">
<collectionProp name="Arguments.arguments">
<elementProp name="up" elementType="HTTPArgument">
<boolProp name="HTTPArgument.always_encode">false</boolProp>
<stringProp name="Argument.value">${status_id}</stringProp>
<stringProp name="Argument.metadata">=</stringProp>
<boolProp name="HTTPArgument.use_equals">true</boolProp>
<stringProp name="Argument.name">up</stringProp>
</elementProp>
<elementProp name="down" elementType="HTTPArgument">
<boolProp name="HTTPArgument.always_encode">false</boolProp>
<stringProp name="Argument.value">${status_id}</stringProp>
<stringProp name="Argument.metadata">=</stringProp>
<boolProp name="HTTPArgument.use_equals">true</boolProp>
<stringProp name="Argument.name">down</stringProp>
</elementProp>
</collectionProp>
</elementProp>
<stringProp name="HTTPSampler.domain"></stringProp>
<stringProp name="HTTPSampler.port"></stringProp>
<stringProp name="HTTPSampler.protocol"></stringProp>
<stringProp name="HTTPSampler.contentEncoding"></stringProp>
<stringProp name="HTTPSampler.path">/secure/admin/${status_method}.jspa</stringProp>
<stringProp name="HTTPSampler.method">GET</stringProp>
<boolProp name="HTTPSampler.follow_redirects">false</boolProp>
<boolProp name="HTTPSampler.auto_redirects">false</boolProp>
<boolProp name="HTTPSampler.use_keepalive">true</boolProp>
<boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
<boolProp name="HTTPSampler.BROWSER_COMPATIBLE_MULTIPART">true</boolProp>
<stringProp name="HTTPSampler.embedded_url_re"></stringProp>
<stringProp name="HTTPSampler.connect_timeout"></stringProp>
<stringProp name="HTTPSampler.response_timeout"></stringProp>
<stringProp name="TestPlan.comments">Chama a URL parametrizada pra mover a ordem de um Status pra cima ou pra baixo</stringProp>
</HTTPSamplerProxy>
<hashTree/>
</hashTree>
</hashTree>
<ResultCollector guiclass="ViewResultsFullVisualizer" testclass="ResultCollector" testname="View Results Tree" enabled="true">
<boolProp name="ResultCollector.error_logging">false</boolProp>
<objProp>
<name>saveConfig</name>
<value class="SampleSaveConfiguration">
<time>true</time>
<latency>true</latency>
<timestamp>true</timestamp>
<success>true</success>
<label>true</label>
<code>true</code>
<message>true</message>
<threadName>true</threadName>
<dataType>true</dataType>
<encoding>false</encoding>
<assertions>true</assertions>
<subresults>true</subresults>
<responseData>false</responseData>
<samplerData>false</samplerData>
<xml>false</xml>
<fieldNames>false</fieldNames>
<responseHeaders>false</responseHeaders>
<requestHeaders>false</requestHeaders>
<responseDataOnError>false</responseDataOnError>
<saveAssertionResultsFailureMessage>false</saveAssertionResultsFailureMessage>
<assertionsResultsToSave>0</assertionsResultsToSave>
<bytes>true</bytes>
<threadCounts>true</threadCounts>
</value>
</objProp>
<stringProp name="filename"></stringProp>
</ResultCollector>
<hashTree/>
</hashTree>
</hashTree>
</jmeterTestPlan>

 

9 comments

Christian Pascher
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.
January 7, 2019

Hi,

I had to change the request to work with websudo:websudo_jmeter.PNG

Cheers
Christian

Like ā€¢ Rodrigo likes this
Chanda Pwapwa April 9, 2019

This is a severe failing on Atlassian's part. Reordering statuses should be straight forward.

Like ā€¢ Ansar Thennaden likes this
Fummi Ayorinde April 24, 2019

I agree @Chanda Pwapwa  - It should just be a drag and drop...Soo Complicated.

Like ā€¢ P_D_ Foerster likes this
Martin Gregory May 8, 2019

I can't make this work for Cloud - I'm guessing the single-signon process breaks the script trying to log in?

I can't believe that I just downloaded and installed Apache JMeter just to reorder my statues ...

Martin Gregory May 8, 2019

Hey boss, can we hire an intern, just for a day or two?

 

Sure, why?

 

So I can get them to reorder my Jira statuses...

Like ā€¢ # people like this
Rodrigo May 9, 2019

Hi @Martin Gregory 

The script I pasted works on Server and might need some adjustments for Cloud, yeah. I guess mostly on signup, though.

JMeter renders the returned page even in error cases. What message was rendered in your attempt?

Martin Gregory May 9, 2019

It was an authorisation failed type message.

P_D_ Foerster
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.
April 17, 2020

I came here hoping for a simple solution that is working out of the box not using another tool to provide the functionality that Jira itself should!

That's why I had to write a comment JRASERVER-41362 hoping that Atlassian will reconsider its stance. *fingers crossed*

Rodrigo Martinez
Atlassian Team
Atlassian Team members are employees working across the company in a wide variety of roles.
November 1, 2021

Hi folks!

I wanted to revisit this article to share a new workaround to it through the use of Userscripts.

https://community.atlassian.com/t5/Jira-discussions/JAUS-Jira-Admin-Userscripts/m-p/1850976

https://jaus.atlassian.net

There you'll find articles on what it is, how to install it, how to use it and more!

So far the Userscripts are:

This Reorder Status was meant exactly for this.

'hope you like it!

Cheers! šŸ»

TAGS
AUG Leaders

Atlassian Community Events