Just a heads up: On March 24, 2025, starting at 4:30pm CDT / 19:30 UTC, the site will be undergoing scheduled maintenance for a few hours. During this time, the site might be unavailable for a short while. Thanks for your patience.

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

ScriptRunner total Custom Field number fields into another Custom Field

Matt Noe
Contributor
March 28, 2022

I built the below script to be run as a workflow post function with the following goals:

  1. Retrieve a number of custom fields (all number fields)
  2. Sum groups of the field values
  3. Take the sums to put into another customer (number) field so it can be seen in filters

 

When I run the query, the logs are capturing and adding the fields correctly, but I'm receiving this exception.  When I try to put as a map, double, or int I do receive different exceptions, but none are successful.  I have also tried limiting my put to a single field, and still receive the exception.

Exception:

com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Direct self-reference leading to cycle (through reference chain: com.adaptavist.sr.cloud.output.ScriptExecutionOutput["result"]->io.github.openunirest.request.body.RequestBodyEntity["httpRequest"]->io.github.openunirest.request.HttpRequestWithBody["httpRequest"]) at com.fasterxml.jackson.databind.exc.InvalidDefinitionException.from(InvalidDefinitionException.java:77) at com.fasterxml.jackson.databind.SerializerProvider.reportBadDefinition(SerializerProvider.java:1276) at com.fasterxml.jackson.databind.ser.BeanPropertyWriter._handleSelfReference(BeanPropertyWriter.java:944) at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:722) at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:770) at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:178) at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:728) at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:770) at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:178) at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:728) at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:770) at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeWithType(BeanSerializerBase.java:655) at com.fasterxml.jackson.databind.ser.impl.TypeWrappedSerializer.serialize(TypeWrappedSerializer.java:32) at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider._serialize(DefaultSerializerProvider.java:480) at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:319) at com.fasterxml.jackson.databind.ObjectWriter$Prefetch.serialize(ObjectWriter.java:1514) at com.fasterxml.jackson.databind.ObjectWriter._writeValueAndClose(ObjectWriter.java:1215) at com.fasterxml.jackson.databind.ObjectWriter.writeValueAsString(ObjectWriter.java:1085)

 

Script:

// Specify the issue key to update
//def issueKey = issue.getKey()
import org.apache.log4j.Logger;
def issueKey = 'HWI-30'

def issue = get("/rest/api/2/issue/${issueKey}")
.header('Content-Type', 'application/json')
.asObject(Map)
.body

def fields = issue.fields as Map

def inputAccInitialEstimate = 'customfield_10134'
def inputNCInitialEstimate = 'customfield_10135'
def inputOthInitialEstimate = 'customfield_10136'
def inputHTACNInitial = 'customfield_10311'
def inputOth2InitialEstimate = 'customfield_10317'
def inputACNInitialTestEstimate = 'customfield_10331'

def valueAccInitialEstimate = issue.fields[inputAccInitialEstimate]['value'] as int
def valueNCInitialEstimate = issue.fields[inputNCInitialEstimate]['value'] as int
def valueothInitialEstimate = issue.fields[inputOthInitialEstimate]['value'] as int
def valueHTACNInitialEstimate = issue.fields[inputHTACNInitial]['value'] as int
def valueOth2InitialEstimate = issue.fields[inputOth2InitialEstimate]['value'] as int
def valueACNInitialTestEstimate = issue.fields[inputACNInitialTestEstimate]['value'] as int

def sumInitialEstimate = valueAccInitialEstimate + valueNCInitialEstimate + valueothInitialEstimate + valueHTACNInitialEstimate + valueOth2InitialEstimate + valueACNInitialTestEstimate
def sumInitialTestingEstimate = valueACNInitialTestEstimate
def sumInitialDevEstimte = valueAccInitialEstimate + valueNCInitialEstimate + valueothInitialEstimate + valueHTACNInitialEstimate + valueOth2InitialEstimate


def inputAccDetailEstimate = 'customfield_10152'
def inputNCDetailEstimate = 'customfield_10154'
def inputOthDetailEstimate = 'customfield_10155'
def inputNCDetailTestEstimate = 'customfield_10334'
def inputHTACNDetailTestEstimate = 'customfield_10332'
def inputHTACNDetailedEstimate = 'customfield_10312'
def inputOth2DetailedEstimate = 'customfield_10318'

def valueAccDetailEstimate = issue.fields[inputAccDetailEstimate]['value'] as int
def valueNCDetailEstimate = issue.fields[inputNCDetailEstimate]['value'] as int
def valueothDetailEstimate = issue.fields[inputOthDetailEstimate]['value'] as int
def valueNCDetailTestEstimate = issue.fields[inputNCDetailTestEstimate]['value'] as int
def valueHTACNDetailTestEstimate = issue.fields[inputHTACNDetailTestEstimate]['value'] as int
def valueHTACNDetailedEstimate = issue.fields[inputHTACNDetailedEstimate]['value'] as int
def valueOth2DetailedEstimate = issue.fields[inputOth2DetailedEstimate]['value'] as int


def sumDetailEstimate = valueAccDetailEstimate + valueNCDetailEstimate + valueothDetailEstimate + valueNCDetailTestEstimate + valueHTACNDetailTestEstimate + valueHTACNDetailedEstimate + valueOth2DetailedEstimate
def sumDetailTestEstimate = valueNCDetailTestEstimate + valueHTACNDetailTestEstimate
def sumDetailDevEstimate = valueAccDetailEstimate + valueNCDetailEstimate + valueothDetailEstimate + valueHTACNDetailedEstimate + valueOth2DetailedEstimate

 

 

def log = Logger.getLogger("com.onresolve.jira.groovy");

log.info ("Acc Intial Estimate: "+valueAccInitialEstimate);
log.info ("NC Initial Estimate: "+valueNCInitialEstimate);
log.info ("Oth Initial Estimate: "+valueothInitialEstimate);
log.info ("HTACN Initial Estimate: "+valueHTACNInitialEstimate);
log.info ("Oth2 Initial Estimate: "+valueOth2InitialEstimate);
log.info ("HTACN Initial Test Estimate: "+valueACNInitialTestEstimate);
log.info ("Total Initial: "+sumInitialEstimate);
log.info ("Total Initial Testing: "+sumInitialTestingEstimate);
log.info ("Total Initial Dev: "+sumInitialDevEstimte);log.info ("Acc Detail Estimate: "+valueAccDetailEstimate);
log.info ("NC Detail Estimate: "+valueNCDetailEstimate);
log.info ("NC Detail Test Estimate: "+valueNCDetailTestEstimate);
log.info ("Oth Detail Estimate: "+valueothDetailEstimate);
log.info ("HTACN Detail Test Estimate: "+valueHTACNDetailTestEstimate);
log.info ("HTACN Detail Estimate: "+valueHTACNDetailedEstimate);
log.info ("Oth2 Detail Estimate: "+valueOth2DetailedEstimate);
log.info ("Total Detail: "+sumDetailEstimate);
log.info ("Total Detail Test: "+sumDetailTestEstimate);
log.info ("Total Detail Dev: "+sumDetailDevEstimate);


put("/rest/api/2/issue/${issueKey}")
.queryString("overrideScreenSecurity", Boolean.TRUE)
.header('Content-Type', 'application/json')
.body([
fields:[
Customfield_10336:[name:+sumInitialDevEstimte] as Map,
Customfield_10337:[name:+sumInitialTestingEstimate] as Map,
Customfield_10320:[name:+sumInitialEstimate] as Map,
Customfield_10339:[name:+sumDetailTestEstimate] as Map,
Customfield_10338:[name:+sumDetailDevEstimate] as Map,
Customfield_10321:[name:+sumDetailEstimate] as Map
]
])

 

1 answer

0 votes
Dave Brennan July 5, 2023

It looks like it's having trouble with trying to parse the return from the put call back into JSON. You can fix this by adding .asString() on the end of your put call.

Is it totally janky? Yes

Does it work? Also, yes.

Suggest an answer

Log in or Sign up to answer