Hi,
for task inserting purposes i'm using one of my old scripts, hope it helps. It should automatically push sequences to make space for new tasks.
int wf::z_get_valid_seq(int new_seq, int new_interval, int chgid) {
int valid_seq, zcount, i;
object seqobj;
valid_seq = (int)(new_seq+new_interval);
send_wait(0, top_object(), "call_attr", "wf", "sync_fetch", "STATIC", format("chg=%d AND sequence=%d", chgid, valid_seq), -1, 0);
if (msg_error()) {
for (i=0;i<msg_length();i++) {
logf(ERROR, "msg[%d]: %s", i, msg[i]);
}
return 0;
}
zcount = msg[1];
if (zcount > 0) {
int zseq, top_seq, low_seq;
valid_seq = 0;
low_seq = 0;
top_seq = 0;
send_wait(0, top_object(), "call_attr", "wf", "sync_fetch", "MLIST_STATIC", format("chg=%d AND status='WAIT'", chgid), -1, 0);
if (msg_error()) {
for (i=0;i<msg_length();i++) {
logf(ERROR, "msg[%d]: %s", i, msg[i]);
}
return 0;
}
if (msg[1] > 0) {
send_wait(0, msg[0], "dob_by_index", "DEFAULT", 0, 0);
if (msg_error()) {
for (i=0;i<msg_length();i++) {
logf(ERROR, "msg[%d]: %s", i, msg[i]);
}
return 0;
}
seqobj = msg[0];
top_seq = seqobj.sequence - 1;
}
send_wait(0, top_object(), "call_attr", "wf", "sync_fetch", "MLIST_STATIC", format("chg=%d AND status!='WAIT'", chgid), -1, 0);
if (msg_error()) {
for (i=0;i<msg_length();i++) {
logf(ERROR, "msg[%d]: %s", i, msg[i]);
}
return 0;
}
if (msg[1] > 0) {
send_wait(0, msg[0], "dob_by_index", "DEFAULT", (int)(msg[1]-1), (int)(msg[1]-1));
if (msg_error()) {
for (i=0;i<msg_length();i++) {
logf(ERROR, "msg[%d]: %s", i, msg[i]);
}
return 0;
}
seqobj = msg[0];
low_seq = seqobj.sequence + 1;
}
if ( (low_seq > 0) && (top_seq > 0) ) {
valid_seq = ((low_seq + top_seq) / 2);
if (!(wf::check_for_seq(chg.id, valid_seq))) {
valid_seq = 0;
} else {
logf(SIGNIFICANT, "valid_seq = %d", valid_seq);
}
} else if ( (low_seq > 0) && (top_seq == 0) ) {
valid_seq = low_seq + 27;
if (!(wf::check_for_seq(chg.id, valid_seq))) {
valid_seq = 0;
} else {
logf(SIGNIFICANT, "valid_seq = %d", valid_seq);
}
} else if ( (low_seq == 0) && (top_seq > 0) ) {
valid_seq = top_seq + 27;
if (!(wf::check_for_seq(chg.id, valid_seq))) {
valid_seq = 0;
} else {
logf(SIGNIFICANT, "valid_seq = %d", valid_seq);
}
}
if (valid_seq == 0) {
for (zseq=top_seq;zseq>low_seq;zseq--) {
if (valid_seq == 0) {
if (wf::check_for_seq(chg.id, zseq)) {
valid_seq = zseq;
}
}
}
}
}
logf(SIGNIFICANT, "%s > valid_seq = %d", persistent_id, valid_seq);
return valid_seq;
}
wf::z_task_pusher(int chgid, int push, ...) {
object gl, wfobj, zfound;
int zcount, i, curseq;
if (argc > 2) {
curseq = argv[2];
}
send_wait(0, top_object(), "get_co_group");
if (msg_error()) {
for (i=0;i<msg_length();i++) {
logf(ERROR, "msg[%d]: %s", i, msg[i]);
}
return;
}
gl = msg[0];
send_wait(0, top_object(), "call_attr", "wf", "sync_fetch", "MLIST_STATIC", format("chg=%d AND status='WAIT' AND sequence != %d", chgid, curseq), -1, 0);
if (msg_error()) {
for (i=0;i<msg_length();i++) {
logf(ERROR, "msg[%d]: %s", i, msg[i]);
}
return;
}
zcount = msg[1];
if (zcount > 0) {
zfound = msg[0];
for (i = 0; i < zcount; i++) {
send_wait(0, zfound, "dob_by_index", "DEFAULT", (int)(zcount-i-1), (int)(zcount-i-1));
if (msg_error()) {
for (i=0;i<msg_length();i++) {
logf(ERROR, "msg[%d]: %s", i, msg[i]);
}
} else {
wfobj = msg[0];
logf(SIGNIFICANT, "%s > trying to push: %s @ %s", persistent_id, wfobj.task, wfobj.sequence);
if (!macro::z_checkout(gl, wfobj, 3, 3)) {
send_wait(0, wfobj, "call_attr", "sequence", "set_val", (int)(wfobj.sequence+push), "SURE_SET");
if (macro::z_checkin(gl, 3, 3)) {
send_wait(0, gl, "uncheck");
}
}
}
}
}
}
string wf::z_new_wf_task(int new_chg_id, string new_type, ...) {
logf(SIGNIFICANT, "Inserting task. Change: %d. ARGC: %d", new_chg_id, argc);
object gl, wfobj, zfound, pastobj, wftplobj;
int zcount, i, new_interval, valid_seq, wftpl_id, new_seq;
string wc;
send_wait(0, top_object(), "get_co_group");
if (msg_error()) {
for (i=0;i<msg_length();i++) {
logf(ERROR, "msg[%d]: %s", i, msg[i]);
}
return;
}
gl = msg[0];
send_wait(0, top_object(), "call_attr", "wf", "get_new_dob", NULL, NULL, gl);
if (msg_error()) {
for (i=0;i<msg_length();i++) {
logf(ERROR, "msg[%d]: %s", i, msg[i]);
}
return;
}
wfobj = msg[0];
new_seq = 0;
new_interval = 15;
wftpl_id = 0;
send_wait(0, wfobj, "call_attr", "chg", "set_val", new_chg_id, "SURE_SET");
send_wait(0, wfobj, "call_attr", "task", "set_val", new_type, "SURE_SET");
send_wait(0, wfobj, "call_attr", "object_type", "set_val", "chg", "SURE_SET");
for (i=2;i<argc-1;i=i+2) {
logf(SIGNIFICANT, "%s = '%s'", argv[i], argv[i+1]);
if ( ((string)argv[i] == "sequence") || ((string)argv[i] == "new_seq") ) {
new_seq = argv[i+1];
} else if ((string)argv[i] == "new_interval") {
new_interval = argv[i+1];
} else if ((string)argv[i] == "wftpl") {
wftpl_id = argv[i+1];
} else {
send_wait(0, wfobj, "call_attr", argv[i], "set_val", argv[i+1], "SURE_SET");
}
}
if (wftpl_id > 0) {
send_wait(0, top_object(), "call_attr", "wftpl", "dob_by_persid", 0, format("wftpl:%d", wftpl_id));
if (!msg_error()) {
logf(SIGNIFICANT, "WFTPLOBJ > %d", wftpl_id);
wftplobj = msg[0];
}
}
if (is_null(wftplobj)) {
send_wait(0, top_object(), "call_attr", "wf", "sync_fetch", "MLIST_STATIC", format("chg=%d AND task='%s' AND z_dop_wf=0 AND creator is NULL", new_chg_id, new_type), -1, 0);
zcount = msg[1];
logf(SIGNIFICANT, "PASTOBJ > [count:%d] chg=%d AND task='%s' AND z_dop_wf=0 AND creator is NULL", zcount, new_chg_id, new_type);
if (zcount > 0) {
zfound = msg[0];
send_wait(0, zfound, "dob_by_index", "DEFAULT", (int)(zcount-1), (int)(zcount-1));
pastobj = msg[0];
}
}
if (!is_null(wftplobj)) {
send_wait(0, wfobj, "call_attr", "wf_template", "set_val", wftplobj.id, "SURE_SET");
if (is_null(wfobj.group)) {
send_wait(0, wfobj, "call_attr", "group", "set_val", wftplobj.group, "SURE_SET");
}
if (is_null(wfobj.assignee)) {
send_wait(0, wfobj, "call_attr", "assignee", "set_val", wftplobj.assignee, "SURE_SET");
}
} else if (!is_null(pastobj)) {
send_wait(0, wfobj, "call_attr", "wf_template", "set_val", pastobj.wf_template, "SURE_SET");
if (is_null(wfobj.group)) {
send_wait(0, wfobj, "call_attr", "group", "set_val", pastobj.group, "SURE_SET");
}
if (is_null(wfobj.assignee)) {
send_wait(0, wfobj, "call_attr", "assignee", "set_val", pastobj.assignee, "SURE_SET");
}
}
if (wfobj.assignee.delete_flag == 1) {
send_wait(0, wfobj, "call_attr", "comments", "set_val", "Deleted assignee detected!", "SURE_SET");
send_wait(0, wfobj, "call_attr", "assignee", "set_val", NULL, "SURE_SET");
}
wf::z_task_pusher(new_chg_id, 30, new_seq);
valid_seq = wf::z_get_valid_seq(new_seq, new_interval, new_chg_id);
if (valid_seq == 0) {
logf(SIGNIFICANT, "%s > Invalid sequence", chg.persistent_id);
set_return_data(format("Invalid sequence. Task:%d. Change:%d", id, chg.id));
set_error(1);
return;
} else {
send_wait(0, wfobj, "call_attr", "sequence", "set_val", valid_seq, "SURE_SET");
}
logf(SIGNIFICANT, "new_assignee = '%s' new_group = '%s' new_wftpl = '%s'", wfobj.assignee, wfobj.group, wfobj.wf_template);
send_wait(0, gl, "checkin");
if (msg_error()) {
for (i=0;i<msg_length();i++) {
logf(ERROR, "msg[%d]: %s", i, msg[i]);
}
send_wait(0, gl, "uncheck");
return;
}
return wfobj.persistent_id;
}