4.0.4 / Вопрос по доп. полю типа "Задача"

Обсуждаем TrackStudio по-русски

4.0.4 / Вопрос по доп. полю типа "Задача"

Postby bsalavat » Thu Aug 26, 2010 1:41 am

Доброго времени суток!

Прошу помочь в решении некоторых вопросов...
Ситуация: Производится копирование задач при разборе из общей папке в другие папки с помощью нижеприведенного скрипта;
Собственно вопросы:
1. Корректно ли выполняется установка значения доп. поля "Исходный запрос"? Вроде должно устанавливаться в порожденной задаче, а устанавливается в исходной, в которой формируется сообщение.
2. При решении 1-го вопроса, возникнет следующая проблемка. Каким образом в исходной задаче впоследствии можно получить сведения о порожденной задаче? Когда определяю поле типа "Задача", то там вроде есть какая-то возможность обратной ссылки, но как ее получить в скрипте не совсем понятно.

Категория как исходной, так и порожденной задачи, одна и та же.

Заранее спасибо!

Code: Select all
package scripts.after_add_message;

import com.trackstudio.app.adapter.AdapterManager;
import com.trackstudio.exception.*;
import com.trackstudio.external.OperationTrigger;
import com.trackstudio.secured.*;
import com.trackstudio.secured.SecuredTaskTriggerBean;
import java.util.List;

public class AcceptProblem implements OperationTrigger {

    public SecuredMessageTriggerBean execute(SecuredMessageTriggerBean message) throws GranException {

        String notAllowedCategoryName = "Продукты";

        if (message.getTask().getParent().getCategory().getName().equals(notAllowedCategoryName)) {
            return message;
        }
        String destTaskId = AdapterManager.getInstance().getSecuredTaskAdapterManager().findTaskIdByQuickGo(
                message.getSecure(),
                AdapterManager.getInstance().getSecuredUDFAdapterManager().getTaskUDFValue(
                message.getSecure(),
                message.getTaskId(),
                "Продукт"));

        if (destTaskId != null) {
            List<String> id = AdapterManager.getInstance().getSecuredTaskAdapterManager().pasteTasks(
                    message.getSecure(),
                    destTaskId,
                    message.getTaskId(),
                    "SINGLE_COPY");

            // Укажем в порожденной задаче связь с текущей задачей
            SecuredTaskTriggerBean t = new SecuredTaskTriggerBean(id.get(0), message.getSecure());
            t.setUdfValue("Исходный запрос", message.getTaskId());
            t.update(false);
        }
        return message;
    }
}
TrackStudio 4.0.8 SA
Linux + PostgreSQL
bsalavat
 
Posts: 16
Joined: Sat May 29, 2010 12:19 pm
Location: Moscow

Re: 4.0.4 / Вопрос по доп. полю типа "Задача"

Postby Petr » Thu Aug 26, 2010 11:01 am

можете подробней описать как вы производите копирование, у вас есть поле, которое заполняется при выполнении операции и по нему вы уже копируете задачи куда надо?
TS Support
email: parsentev@yandex.ru
Petr
 
Posts: 1125
Joined: Wed Aug 12, 2009 4:38 pm

Re: 4.0.4 / Вопрос по доп. полю типа "Задача"

Postby bsalavat » Thu Aug 26, 2010 11:58 am

Да, именно так.
Есть поле, его заполняют при выполнении значением узла куда скопировать.
Но при этом необходимо, чтобы порожденная задача связалась с исходной, поэтому в другое поле уже порожденной задачи, хочется записать ссылку на исходную.
TrackStudio 4.0.8 SA
Linux + PostgreSQL
bsalavat
 
Posts: 16
Joined: Sat May 29, 2010 12:19 pm
Location: Moscow

Re: 4.0.4 / Вопрос по доп. полю типа "Задача"

Postby bsalavat » Thu Aug 26, 2010 12:01 pm

Вполне возможно, что некорректно используется вот эта часть (в API пока слабо разбираюсь):
Code: Select all
            List<String> id = <...>
            // Укажем в порожденной задаче связь с текущей задачей
            SecuredTaskTriggerBean t = new SecuredTaskTriggerBean(id.get(0), message.getSecure());
            t.setUdfValue("Исходный запрос", message.getTaskId());
            t.update(false);


Т.е. сама задача копируется, но в новой задаче поле "Исходный запрос" не устанавливается, но устанавливается в текущей.
TrackStudio 4.0.8 SA
Linux + PostgreSQL
bsalavat
 
Posts: 16
Joined: Sat May 29, 2010 12:19 pm
Location: Moscow

Re: 4.0.4 / Вопрос по доп. полю типа "Задача"

Postby Petr » Fri Aug 27, 2010 5:36 pm

написал только под shell,
то есть ссылка на задачу создается когда вы указывается ее в доп.поле родительной задаче.
то есть вам надо поле менять у родителя, а не у потомка.
Code: Select all
import com.trackstudio.app.adapter.AdapterManager;
import com.trackstudio.exception.*;
import com.trackstudio.external.OperationTrigger;
import com.trackstudio.secured.*;
import com.trackstudio.secured.SecuredTaskTriggerBean;
import java.util.List;
   
   String valueUdf = AdapterManager.getInstance().getSecuredUDFAdapterManager().getTaskUDFValue(sc, message.getTaskId(), "Продукт");
   String destTaskId = AdapterManager.getInstance().getSecuredTaskAdapterManager().findTaskIdByQuickGo(sc, valueUdf);

        if (destTaskId != null) {
            List id = AdapterManager.getInstance().getSecuredTaskAdapterManager().pasteTasks(sc, destTaskId, message.getTaskId(), "SINGLE_COPY");
            SecuredTaskTriggerBean t = new SecuredTaskTriggerBean(message.getTaskId(), message.getSecure());
            t.setUdfValue("Исходный запрос", id.get(0).toString());
            t.update(false);
        }
       
return message;
TS Support
email: parsentev@yandex.ru
Petr
 
Posts: 1125
Joined: Wed Aug 12, 2009 4:38 pm

Re: 4.0.4 / Вопрос по доп. полю типа "Задача"

Postby bsalavat » Sun Aug 29, 2010 8:34 pm

Petr wrote:написал только под shell,
то есть ссылка на задачу создается когда вы указывается ее в доп.поле родительной задаче.
то есть вам надо поле менять у родителя, а не у потомка.
...<skipped>


Спасибо за помощь, вроде разобрался как сделать...
Но эти "разборки" породили еще вопросы... :)

Эти задачи: исходная и порожденная - активно обмениваются между собой сообщениями на уровне скриптов. Т.е., например, если в порожденной выполнили операцию "Проверить", то такая же операция создается в исходной, которые переводят состояние обеих задач в состояние "Выполнена". Далее автор исходной задачи может либо подтвердить (обе задачи должны закрываться), либо переоткрыть (обе задачи переводятся в состояние "Переоткрыта"). Проблема в том, что на исходную задачу и порожденную у автора разные права доступа и он не может создать сообщение в порожденной задаче.

1. Вопрос собственно такой: Как правильно создать сообщение в порожденной задаче вне зависимости от прав доступа?
Пробовал работать через классы com.trackstudio.secured.*, но они работают с учетом этих прав, если я правильно понял. Читал на форуме, что можно сделать через KernelManager, но не совсем понял как это сделать правильно, чтобы не задеть критичные вещи. Смутно кажется, что если использовать before_add_message, то значения полей сообщения будут не совсем корректны, если делать через kernel. Так ли это? Может правильнее данный скрипт использовать в after_add_message?


Привожу скрипт, как пытаюсь сделать сейчас:
Code: Select all
package scripts.before_add_message;

import com.trackstudio.app.adapter.AdapterManager;
import com.trackstudio.exception.GranException;
import com.trackstudio.external.OperationTrigger;
import com.trackstudio.kernel.manager.KernelManager;
import com.trackstudio.kernel.manager.SafeString;
import com.trackstudio.secured.*;
import com.trackstudio.securedkernel.SecuredIndexAdapterManager;
import java.util.*;

public class CloseReopenProblem implements OperationTrigger {

    public SecuredMessageTriggerBean execute(SecuredMessageTriggerBean message) throws GranException {

        String taskId = message.getTask().getId();
        SecuredTaskBean task = message.getTask();

        SecuredIndexAdapterManager mgr = AdapterManager.getInstance().getSecuredIndexAdapterManager();
        Map linkedTask = mgr.getReferencedTasksForTask(task);

        for (Iterator u = linkedTask.values().iterator(); u.hasNext();) {
            ArrayList links = (ArrayList) u.next();
            for (Iterator i = links.iterator(); i.hasNext();) {
                SecuredTaskBean s = (SecuredTaskBean) i.next();
                KernelManager.getMessage().createMessage(
                        message.getSecure().getUserId(),
                        s.getId(),
                        message.getMstatusId(),
                        SafeString.createSafeString(message.getDescription()),
                        message.getHrs(),
                        s.getHandlerUserId(),
                        s.getHandlerGroupId(),
                        message.getResolutionId(),
                        message.getPriorityId(),
                        message.getDeadline(),
                        message.getBudget(),
                        message.getTime());
            }
        }

        return message;
    }
}


2. Попутно еще один вопрос... В разных примерах на форуме встречал выражения: log.debug[info|error]("sometext"). Как правильно объявить такую переменную log с учетом того, что используются компилируемые скрипты?

3. И еще вопрос... Каким образом в триггере типа after_add_message определить состояние задачи, которое было так сказать "на входе" добавления сообщения? В before_add_message это определяется легко, т.к. состояние еще не менялось, а вот в after... непонятно. В принципе можно через служебное дополнительное поле, но опять возникают заморочки с правами и его видимостью (хочется, чтобы было скрытое, типа переменная-параметр такая своеобразная). Может есть какой-то более простой способ?

P.S. Все дополнительные поля о которых ведется речь привязаны к процессу
TrackStudio 4.0.8 SA
Linux + PostgreSQL
bsalavat
 
Posts: 16
Joined: Sat May 29, 2010 12:19 pm
Location: Moscow

Re: 4.0.4 / Вопрос по доп. полю типа "Задача"

Postby Petr » Mon Aug 30, 2010 12:13 pm

1. вот так можно создать сообщения через ядро
Code: Select all
KernelManager.getMessage().createMessage(...);
/**
     * Создает сообщение
     *
     * @param userId         ID пользователя, который создает сообщение
     * @param taskId         ID задачи, для которой создается сообещщние
     * @param mstatusId      ID типа сообщения
     * @param text           текст сообщения
     * @param hrs            потраченное время
     * @param handlerUserId  ID пользователя, назначенного в качестве ответственного
     * @param handlerGroupId ID группы, назначченной в качестве отвественной
     * @param resolutionId   ID резолюции
     * @param priorityId     ID приоритета
     * @param deadline       Дата Deadline
     * @param budget         Бюджет
     * @param submitDate     Дата создания сообщения
     * @return ID созданного сообщения
     * @throws GranException при необходимости
     */
    public String createMessage(String userId, String taskId, String mstatusId, SafeString text, Long hrs,
                                String handlerUserId, String handlerGroupId, String resolutionId, String priorityId, Calendar deadline, Long budget, Calendar submitDate) throws GranException {

2.
это система логирования log4j
private static Log log = LogFactory.getLog(NameClassForLog.class);
библиотеку к проекту только подключите когда скрипт компилировать будите она в WEB-INF/lib/commons-logging.jar лежит
3. Ни как, вариант как вы предложили можно использовать, то есть сделать доп поле и в него писать состояние через begore_add_message, потом читать в after_add_message и удалять.
TS Support
email: parsentev@yandex.ru
Petr
 
Posts: 1125
Joined: Wed Aug 12, 2009 4:38 pm

Re: 4.0.4 / Вопрос по доп. полю типа "Задача"

Postby bsalavat » Tue Aug 31, 2010 1:25 pm

3. Сделал через before_add_message, тогда и откат операции можно обработать, если копирование не удалось совершить.

Спасибо большое!
TrackStudio 4.0.8 SA
Linux + PostgreSQL
bsalavat
 
Posts: 16
Joined: Sat May 29, 2010 12:19 pm
Location: Moscow


Return to TrackStudio Support [Russian]

Who is online

Users browsing this forum: No registered users and 0 guests

cron