Beispiel #1
0
 /**
  * Return the version of OG currently installed MaestroOgCommon::OG_VERSION_1 or OG_VERSION_2
  * @return type
  */
 public static function getOGVersion()
 {
     if (self::$ogVersion === NULL) {
         self::$ogVersion = function_exists('og_get_group') ? MaestroOgCommon::OG_VERSION_1 : MaestroOgCommon::OG_VERSION_2;
     }
     return self::$ogVersion;
 }
 function getQueue($show_system_tasks = FALSE)
 {
     if (!empty($this->_userId) and $this->_userId > 0) {
         /* Instance where the user id is known.  need to see if there is a processID given.
          * This means that the mode in which we're working is user based.. we only care about a user in this case
          */
         $queries = array();
         //query to get the user assigned to this task
         if ($this->_mode != 'admin') {
             $this->_mode = 'user';
         }
         if ($this->_debug) {
             watchdog('maestro', "Entering getQueue - {$this->_mode} mode");
         }
         $this->_userTaskCount = 0;
         $query = db_select('maestro_queue', 'a');
         $query->join('maestro_template_data', 'b', 'a.template_data_id = b.id');
         $query->leftJoin('maestro_production_assignments', 'c', 'a.id = c.task_id');
         $query->join('maestro_process', 'd', 'a.process_id = d.id');
         $query->fields('a', array('id', 'template_data_id', 'process_id', 'is_interactive', 'handler', 'task_data', 'created_date', 'started_date'));
         $query->fields('b', array('task_class_name', 'template_id', 'taskname', 'is_dynamic_taskname', 'dynamic_taskname_variable_id'));
         if ($this->_mode == 'admin') {
             $query->fields('c', array('assign_id', 'assign_type'));
             $query->fields('e', array('name'));
             $query->leftJoin('users', 'e', 'c.assign_id = e.uid');
         }
         $query->addField('d', 'pid', 'parent_process_id');
         $query->fields('d', array('tracking_id', 'flow_name'));
         if ($this->_mode != 'admin') {
             $query->condition('c.assign_id', $this->_userId, '=');
         }
         if ($show_system_tasks == FALSE) {
             $query->condition('a.is_interactive', MaestroInteractiveFlag::IS_INTERACTIVE);
         }
         $query->condition(db_or()->condition('a.archived', 0)->condition('a.archived', NULL));
         $query->condition(db_and()->condition('a.status', 0, '>='));
         $query->condition('c.assign_type', MaestroAssignmentTypes::USER, '=');
         $query->orderBy('a.id', 'DESC');
         $queries[MaestroAssignmentTypes::USER] = $query;
         //query to get the users associated with a role assigned to this task
         $query = db_select('maestro_queue', 'a');
         $query->join('maestro_template_data', 'b', 'a.template_data_id = b.id');
         $query->leftJoin('maestro_production_assignments', 'c', 'a.id = c.task_id');
         $query->join('maestro_process', 'd', 'a.process_id = d.id');
         $query->leftJoin('users_roles', 'f', 'c.assign_id = f.rid');
         $query->fields('a', array('id', 'template_data_id', 'process_id', 'is_interactive', 'handler', 'task_data', 'created_date', 'started_date'));
         $query->fields('b', array('task_class_name', 'template_id', 'taskname', 'is_dynamic_taskname', 'dynamic_taskname_variable_id'));
         if ($this->_mode == 'admin') {
             $query->fields('c', array('assign_id', 'assign_type'));
             $query->fields('g', array('name'));
             $query->leftJoin('users', 'e', 'f.uid = e.uid');
             $query->leftJoin('role', 'g', 'c.assign_id = g.rid');
         }
         $query->addField('d', 'pid', 'parent_process_id');
         $query->fields('d', array('tracking_id', 'flow_name'));
         if ($this->_mode != 'admin') {
             $query->condition('f.uid', $this->_userId, '=');
         }
         if ($show_system_tasks == FALSE) {
             $query->condition('a.is_interactive', MaestroInteractiveFlag::IS_INTERACTIVE);
         }
         $query->condition(db_or()->condition('a.archived', 0)->condition('a.archived', NULL));
         $query->condition(db_and()->condition('a.status', 0, '>='));
         $query->condition('c.assign_type', MaestroAssignmentTypes::ROLE, '=');
         $query->orderBy('a.id', 'DESC');
         $queries[MaestroAssignmentTypes::ROLE] = $query;
         if (module_exists('og')) {
             //query gets all og's assigned to this task, up to the logic to determine whether or not they are assigned
             $query = db_select('maestro_queue', 'a');
             $query->join('maestro_template_data', 'b', 'a.template_data_id = b.id');
             $query->leftJoin('maestro_production_assignments', 'c', 'a.id = c.task_id');
             $query->join('maestro_process', 'd', 'a.process_id = d.id');
             $query->leftJoin('users_roles', 'f', 'c.assign_id = f.rid');
             $query->fields('a', array('id', 'template_data_id', 'process_id', 'is_interactive', 'handler', 'task_data', 'created_date', 'started_date'));
             $query->fields('b', array('task_class_name', 'template_id', 'taskname', 'is_dynamic_taskname', 'dynamic_taskname_variable_id'));
             $query->fields('c', array('assign_id', 'assign_type', 'process_variable'));
             if ($this->_mode == 'admin') {
                 $og_values = MaestroOgCommon::getOgTableValues();
                 $query->leftJoin($og_values['table'], 'g', 'c.assign_id = g.' . $og_values['gid_column']);
                 $query->addField('g', $og_values['title_column'], 'name');
             }
             $query->addField('d', 'pid', 'parent_process_id');
             $query->fields('d', array('tracking_id', 'flow_name'));
             if ($show_system_tasks == FALSE) {
                 $query->condition('a.is_interactive', MaestroInteractiveFlag::IS_INTERACTIVE);
             }
             $query->condition(db_or()->condition('a.archived', 0)->condition('a.archived', NULL));
             $query->condition(db_and()->condition('a.status', 0, '>='));
             $query->condition('c.assign_type', MaestroAssignmentTypes::GROUP, '=');
             $query->orderBy('a.id', 'DESC');
             $queries[MaestroAssignmentTypes::GROUP] = $query;
         }
         foreach ($queries as $assign_type => $query) {
             $userTaskResult = $query->execute();
             $numTaskRows = $query->countQuery()->execute()->fetchField();
             if ($numTaskRows > 0) {
                 // Return a semi-colon delimited list of queue id's for that user.
                 foreach ($userTaskResult as $userTaskRecord) {
                     if ($assign_type == MaestroAssignmentTypes::GROUP && $this->_mode != 'admin') {
                         // Test if group name has been set to use a variable for this task
                         if ($userTaskRecord->assign_id == 0 or $userTaskRecord->process_variable > 0) {
                             // The group variable is expected to contain the group name
                             $group_variable = $this->getProcessVariable($userTaskRecord->process_variable, $userTaskRecord->process_id);
                             $og_groups = MaestroOgCommon::getAllGroups();
                             foreach ($og_groups as $og_group) {
                                 if ($og_group->label == $group_variable) {
                                     $userTaskRecord->assign_id = $og_group->gid;
                                 }
                             }
                         }
                         if ($userTaskRecord->assign_id > 0) {
                             if (MaestroOgCommon::getOGVersion() === MaestroOgCommon::OG_VERSION_2) {
                                 $query = db_select("og_membership", "a");
                                 $query->fields("a", array("gid"));
                                 $query->condition("a.gid", $userTaskRecord->assign_id);
                                 $query->condition("a.etid", $this->_userId);
                                 $res = $query->execute()->fetchAssoc();
                                 if (count($res) == 0) {
                                     continue;
                                 }
                             } else {
                                 $og_query = new EntityFieldQuery();
                                 $og_query->entityCondition('entity_type', 'user')->fieldCondition(OG_AUDIENCE_FIELD, 'gid', $userTaskRecord->assign_id, '=');
                                 $og_res = $og_query->execute();
                                 if (!array_key_exists($this->_userId, $og_res['user'])) {
                                     continue;
                                 }
                             }
                         } else {
                             watchdog('maestro', "maestro->getQueue could not resolve the assigned to user id for queue record {$userTaskRecord->id}");
                             break;
                         }
                     }
                     if ($this->_queueId == '') {
                         $this->_queueId = $userTaskRecord->id;
                     } else {
                         $this->_queueId .= ";" . $userTaskRecord->id;
                     }
                     // Simple test to determine if the task ID already exists for this user
                     $flag = 0;
                     for ($flagcntr = 0; $flagcntr <= $this->_userTaskCount; $flagcntr++) {
                         if (isset($this->_userTaskObject[$flagcntr]->queue_id) and $this->_userTaskObject[$flagcntr]->queue_id == $userTaskRecord->id) {
                             $flag = 1;
                         }
                     }
                     if ($flag == 0) {
                         $taskObject = new stdClass();
                         $templatename = db_query("SELECT template_name FROM {maestro_template} WHERE id = :tid", array(':tid' => $userTaskRecord->template_id))->fetchField();
                         // Determine if this task is for a regenerated workflow and we need to update the main project/request record
                         $taskObject->regen = FALSE;
                         if ($userTaskRecord->parent_process_id > 0) {
                             // Now check if this same template task id was executed in the previous process - if so then it is a recycled task
                             // Don't show the re-generated attribute if in this instance of the process we proceed further and are executing new tasks
                             $regenquery = db_select('maestro_queue', 'a');
                             $regenquery->addExpression('COUNT(id)', 'rec_count');
                             $regenquery->condition('a.process_id', $userTaskRecord->parent_process_id, '=');
                             $regenquery->condition(db_and()->condition('a.template_data_id', $userTaskRecord->template_data_id, '='));
                             if ($regenquery->execute()->fetchField() > 0) {
                                 $taskObject->regen = TRUE;
                             }
                         }
                         $queueRecDates = array('created' => $userTaskRecord->created_date, 'started' => $userTaskRecord->started_date);
                         $queueRecFlags = array('is_interactive' => $userTaskRecord->is_interactive);
                         $taskObject->task_data = $userTaskRecord->task_data;
                         $taskObject->queue_id = $userTaskRecord->id;
                         $taskObject->task_id = $userTaskRecord->template_data_id;
                         $taskObject->process_id = $userTaskRecord->process_id;
                         $taskObject->parent_process_id = $userTaskRecord->parent_process_id;
                         $taskObject->template_id = $userTaskRecord->template_id;
                         $taskObject->template_name = $templatename;
                         $taskObject->flow_name = $userTaskRecord->flow_name;
                         $taskObject->tracking_id = $userTaskRecord->tracking_id;
                         $taskObject->url = $userTaskRecord->handler;
                         $taskObject->dates = $queueRecDates;
                         $taskObject->flags = $queueRecFlags;
                         if ($this->_mode == 'admin') {
                             $taskObject->assign_type = $userTaskRecord->assign_type;
                             $taskObject->uid = $userTaskRecord->assign_id;
                             $taskObject->username = $userTaskRecord->name != '' ? $userTaskRecord->name : '[' . t('nobody assigned') . ']';
                         }
                         // Handle dynamic task name based on a variable's value
                         $taskname = '';
                         if ($userTaskRecord->is_dynamic_taskname == 1) {
                             $q2 = db_select('maestro_process_variables', 'a');
                             $q2->addField('a', 'variable_value');
                             $q2->condition('a.process_id', $userTaskRecord->process_id, '=');
                             $q2->condition('a.template_variable_id', $userTaskRecord->dynamic_taskname_variable_id, '=');
                             $res1 = $query->execute()->fetchObject();
                             if ($res1) {
                                 $userTaskRecord->taskname = $res1->variable_value;
                             }
                         }
                         /* @TODO: Need to look at using a module HOOK that can be used in a similar way to define an custom taskname */
                         /*
                         if (function_exists('PLG_Nexflow_taskname')) {
                         $parms = array('pid' => $A['nf_processID'], 'tid' => $A['nf_templateDataID'], 'qid' => $A['id'], 'user' => $this->_nfUserId);
                         if (!empty($taskame)) {
                         $apiRetval = PLG_Nexflow_taskname($parms,$taskname);
                         } else {
                         $apiRetval = PLG_Nexflow_taskname($parms,$A['taskname']);
                         }
                         $taskname = $apiRetval['taskname'];
                         }
                         */
                         $taskObject->taskname = $userTaskRecord->taskname;
                         $taskObject->tasktype = $userTaskRecord->task_class_name;
                         $this->_userTaskObject[$this->_userTaskCount] = $taskObject;
                         $this->_userTaskCount += 1;
                         // Increment the total user task counter
                     }
                 }
             }
         }
     }
     if ($this->_debug) {
         watchdog('maestro', "Exiting getQueue - user mode");
     }
     // Now sort the array of task objects so that the newest task (highest queue_id_) is first
     $sorted = array();
     if (is_array($this->_userTaskObject) and count($this->_userTaskObject) > 0) {
         foreach ($this->_userTaskObject as $task) {
             $sorted[$task->queue_id] = $task;
         }
         krsort($sorted);
     }
     return $sorted;
 }
 function modulateExportOG($group)
 {
     if (module_exists('og')) {
         $og_values = MaestroOgCommon::getOgTableValues();
         $query = db_select($og_values['table'], 'a');
         $query->addField('a', $og_values['gid_column'], 'gid');
         $query->condition('a.' . $og_values['title_column'], $group, '=');
         $gid = current($query->execute()->fetchAll());
         if (is_numeric($gid->gid)) {
             return intval($gid->gid);
         } else {
             //here's the problem... we should return false here so that the import can insert the initiator
             return FALSE;
         }
     }
 }