/** * prepare a data set as an associative array, service intended to populate gui controller * * @param string $filter 'lastSubmitted', 'firstSubmitted' */ public function getItemVariableDataFromDeliveryResult(core_kernel_classes_Resource $deliveryResult, $filter) { $undefinedStr = __('unknown'); //some data may have not been submitted $itemResults = $this->getItemResultsFromDeliveryResult($deliveryResult); $variablesByItem = array(); foreach ($itemResults as $itemResult) { try { common_Logger::d("Retrieving related Item for itemResult " . $itemResult->getUri() . ""); $relatedItem = $this->getItemFromItemResult($itemResult); } catch (common_Exception $e) { common_Logger::w("The itemResult " . $itemResult->getUri() . " is not linked to a valid item. (deleted item ?)"); $relatedItem = null; } if (get_class($relatedItem) == "core_kernel_classes_Literal") { $itemIdentifier = $relatedItem->__toString(); $itemLabel = $relatedItem->__toString(); $itemModel = $undefinedStr; } elseif (get_class($relatedItem) == "core_kernel_classes_Resource") { $itemIdentifier = $relatedItem->getUri(); $itemLabel = $relatedItem->getLabel(); try { common_Logger::d("Retrieving related Item model for item " . $relatedItem->getUri() . ""); $itemModel = $relatedItem->getUniquePropertyValue(new core_kernel_classes_Property(TAO_ITEM_MODEL_PROPERTY)); $variablesByItem[$itemIdentifier]['itemModel'] = $itemModel->getLabel(); } catch (common_Exception $e) { //a resource but unknown $variablesByItem[$itemIdentifier]['itemModel'] = 'unknown'; } } else { $itemIdentifier = $undefinedStr; $itemLabel = $undefinedStr; $variablesByItem[$itemIdentifier]['itemModel'] = $undefinedStr; } foreach ($this->getVariablesFromItemResult($itemResult) as $variable) { //retrieve the type of the variable $class = current($variable->getTypes()); $type = $class->getUri(); //common properties to all variables $properties = array(PROPERTY_IDENTIFIER, PROPERTY_VARIABLE_BASETYPE, PROPERTY_VARIABLE_CARDINALITY, PROPERTY_VARIABLE_EPOCH); //specific property Response Variable if ($type == TAO_RESULT_RESPONSE) { $properties[] = PROPERTY_RESPONSE_VARIABLE_CORRECTRESPONSE; } $baseTypes = $variable->getPropertyValues(new core_kernel_classes_Property(PROPERTY_VARIABLE_BASETYPE)); $baseType = current($baseTypes); if ($baseType != "file") { $properties[] = RDF_VALUE; $variableDescription = $variable->getPropertiesValues($properties); $variableDescription[RDF_VALUE] = array(base64_decode(current($variableDescription[RDF_VALUE]))); } else { $variableDescription = $variable->getPropertiesValues($properties); } try { common_Logger::d("Retrieving related Item for itemResult " . $itemResult->getUri() . ""); $relatedItem = $this->getItemFromVariable($variable); } catch (common_Exception $e) { common_Logger::w("The variable " . $variable->getUri() . " is not linked to a valid item. (deleted item ?)"); $relatedItem = null; } if (get_class($relatedItem) == "core_kernel_classes_Literal") { $itemIdentifier = $relatedItem->__toString(); $itemLabel = $relatedItem->__toString(); $variablesByItem[$itemIdentifier]['itemModel'] = $undefinedStr; } elseif (get_class($relatedItem) == "core_kernel_classes_Resource") { $itemIdentifier = $relatedItem->getUri(); $itemLabel = $relatedItem->getLabel(); try { $itemModel = $relatedItem->getUniquePropertyValue(new core_kernel_classes_Property(TAO_ITEM_MODEL_PROPERTY)); $variablesByItem[$itemIdentifier]['itemModel'] = $itemModel->getLabel(); } catch (common_Exception $e) { //a resource but unknown $variablesByItem[$itemIdentifier]['itemModel'] = $undefinedStr; } } else { $itemIdentifier = $undefinedStr; $itemLabel = $undefinedStr; $variablesByItem[$itemIdentifier]['itemModel'] = $undefinedStr; } $variableIdentifier = current($variableDescription[PROPERTY_IDENTIFIER])->__toString(); $epoch = current($variableDescription[PROPERTY_VARIABLE_EPOCH])->__toString(); $variableDescription["uri"] = $variable->getUri(); $variableDescription["epoch"] = array(tao_helpers_Date::displayeDate(tao_helpers_Date::getTimeStamp($epoch), tao_helpers_Date::FORMAT_VERBOSE)); if (isset($variableDescription[PROPERTY_RESPONSE_VARIABLE_CORRECTRESPONSE])) { $correctResponse = current($variableDescription[PROPERTY_RESPONSE_VARIABLE_CORRECTRESPONSE]); } else { $correctResponse = false; } if ($correctResponse and get_class($correctResponse) == 'core_kernel_classes_Resource') { if ($correctResponse->getUri() == GENERIS_TRUE) { $variableDescription["isCorrect"] = "correct"; } else { if ($correctResponse->getUri() == GENERIS_FALSE) { $variableDescription["isCorrect"] = "incorrect"; } else { //an unknown core_kernel_classes_Resource $variableDescription["isCorrect"] = "unscored"; } } } else { $variableDescription["isCorrect"] = "unscored"; } $variablesByItem[$itemIdentifier]['sortedVars'][$type][$variableIdentifier][$epoch] = $variableDescription; $variablesByItem[$itemIdentifier]['label'] = $itemLabel; } } //sort by epoch and filter foreach ($variablesByItem as $itemIdentifier => $itemVariables) { foreach ($itemVariables['sortedVars'] as $variableType => $variables) { foreach ($variables as $variableIdentifier => $observation) { uksort($variablesByItem[$itemIdentifier]['sortedVars'][$variableType][$variableIdentifier], "self::sortTimeStamps"); //print_r($observation); switch ($filter) { case "lastSubmitted": $variablesByItem[$itemIdentifier]['sortedVars'][$variableType][$variableIdentifier] = array(array_pop($variablesByItem[$itemIdentifier]['sortedVars'][$variableType][$variableIdentifier])); break; case "firstSubmitted": $variablesByItem[$itemIdentifier]['sortedVars'][$variableType][$variableIdentifier] = array(array_shift($variablesByItem[$itemIdentifier]['sortedVars'][$variableType][$variableIdentifier])); break; } } } } return $variablesByItem; }
/** * @param $options * @return null|number timestamp */ private function getPeriodEnd(array $options) { $periodEnd = null; if (!empty($options['periodEnd'])) { $periodEnd = new DateTime($options['periodEnd']); $periodEnd->setTime(23, 59, 59); $periodEnd = DateHelper::getTimeStamp($periodEnd->getTimestamp()); } return $periodEnd; }
/** * Gets the list of assessment reports related to a test site * * @param $testCenter * @param array [$options] * @return array */ public static function getReports($testCenter, $options = array()) { $periodStart = null; $periodEnd = null; if (isset($options['periodStart'])) { $periodStart = new DateTime($options['periodStart']); $periodStart->setTime(0, 0, 0); $periodStart = DateHelper::getTimeStamp($periodStart->getTimestamp()); } if (isset($options['periodEnd'])) { $periodEnd = new DateTime($options['periodEnd']); $periodEnd->setTime(23, 59, 59); $periodEnd = DateHelper::getTimeStamp($periodEnd->getTimestamp()); } $deliveryService = ServiceManager::getServiceManager()->get(DeliveryService::CONFIG_ID); $deliveries = EligibilityService::singleton()->getEligibleDeliveries($testCenter); $filteredExecutions = array(); foreach ($deliveries as $delivery) { if ($delivery->exists()) { $deliveryExecutions = $deliveryService->getDeliveryExecutions($delivery->getUri()); foreach ($deliveryExecutions as $deliveryExecution) { $startTime = $deliveryExecution->getStartTime(); $finishTime = $deliveryExecution->getFinishTime(); if ($finishTime && $periodStart && $periodStart > DateHelper::getTimeStamp($finishTime)) { continue; } if (!$finishTime && $periodStart && $periodEnd && (DateHelper::getTimeStamp($startTime) > $periodEnd || DateHelper::getTimeStamp($startTime) < $periodStart)) { continue; } if ($startTime && $periodEnd && $periodEnd < DateHelper::getTimeStamp($startTime)) { continue; } $filteredExecutions[] = $deliveryExecution; } } } $deliveryExecutionStateService = ServiceManager::getServiceManager()->get(DeliveryExecutionStateService::SERVICE_ID); return DataTableHelper::paginate($filteredExecutions, $options, function ($deliveryExecutions) use($deliveryExecutionStateService) { $reports = []; foreach ($deliveryExecutions as $deliveryExecution) { /* @var $deliveryExecution DeliveryExecution */ $startTime = $deliveryExecution->getStartTime(); $finishTime = $deliveryExecution->getFinishTime(); $userId = $deliveryExecution->getUserIdentifier(); $user = UserHelper::getUser($userId); $authorizationData = self::getDeliveryLog()->get($deliveryExecution->getIdentifier(), 'TEST_AUTHORISE'); $proctor = empty($authorizationData) ? '' : UserHelper::getUser($authorizationData[0][DeliveryLog::DATA]['proctorUri']); $procActions = self::getProctorActions($deliveryExecution); $reports[] = array('id' => $deliveryExecution->getIdentifier(), 'delivery' => $deliveryExecution->getDelivery()->getLabel(), 'testtaker' => $user ? UserHelper::getUserName($user, true) : '', 'proctor' => $proctor ? UserHelper::getUserName($proctor, true) : '', 'status' => $deliveryExecutionStateService->getState($deliveryExecution), 'start' => $startTime ? DateHelper::displayeDate($startTime) : '', 'end' => $finishTime ? DateHelper::displayeDate($finishTime) : '', 'pause' => $procActions['pause'], 'resume' => $procActions['resume'], 'irregularities' => $procActions['irregularities']); } return $reports; }); }
/** * Compare two deliveryExecution by their start timestamp. * CAUTION: getStartTime() is not cached at this moment, so it request the DB on each call * @param DeliveryExecution $a * @param DeliveryExecution $b * @return int */ public function cmpDeliveryExecution($a, $b) { return DateHelper::getTimeStamp($b->getStartTime()) - DateHelper::getTimeStamp($a->getStartTime()); }
/** * Short description of method prepare * * @access public * @author Joel Bout, <*****@*****.**> * @param array resources results * @param array columns variables * @return mixed */ public function prepare($resources, $columns) { $resultsService = taoResults_models_classes_ResultsService::singleton(); foreach ($resources as $result) { $itemresults = $resultsService->getVariables($result, new core_kernel_classes_Class(TAO_RESULT_VARIABLE), false); $cellData = array(); foreach ($itemresults as $itemResultUri => $vars) { //cache the item information pertaining to a given itemResult (stable over time) if (common_cache_FileCache::singleton()->has('itemResultItemCache' . $itemResultUri)) { $itemUri = common_cache_FileCache::singleton()->get('itemResultItemCache' . $itemResultUri); $item = new core_kernel_classes_Resource($itemUri); } else { $item = $resultsService->getItemFromItemResult(new core_kernel_classes_Resource($itemResultUri)); common_cache_FileCache::singleton()->put($item->getUri(), 'itemResultItemCache' . $itemResultUri); } if (get_class($item) == "core_kernel_classes_Resource") { $contextIdentifier = (string) $item->getUri(); } else { $contextIdentifier = (string) $item->__toString(); } foreach ($vars as $var) { //cache the variable data if (common_cache_FileCache::singleton()->has('variableDataCache' . $var->getUri())) { $varData = common_cache_FileCache::singleton()->get('variableDataCache' . $var->getUri()); } else { $varData = $resultsService->getVariableData($var); common_cache_FileCache::singleton()->put($varData, 'variableDataCache' . $var->getUri()); } if (is_array($varData["value"])) { $varData["value"] = json_encode($varData["value"]); } $variableIdentifier = (string) $varData["identifier"]; foreach ($columns as $column) { if ($variableIdentifier == $column->getIdentifier() and $contextIdentifier == $column->getContextIdentifier()) { $value = (string) $varData["value"]; $epoch = $varData["epoch"]; $readableTime = ""; if ($epoch != "") { $readableTime = "@" . tao_helpers_Date::displayeDate(tao_helpers_Date::getTimeStamp($epoch), tao_helpers_Date::FORMAT_VERBOSE); } $this->cache[$varData["type"]->getUri()][$result->getUri()][$contextIdentifier . $variableIdentifier][(string) $epoch] = array($value, $readableTime); } } } } } }