This repository has been archived on 2024-11-28. You can view files and clone it, but cannot push or open issues or pull requests.
Incam_SGD/plugins/ktcore/KTAssist.php

319 lines
12 KiB
PHP
Raw Normal View History

<?php
/**
* $Id$
*
* KnowledgeTree Community Edition
* Document Management Made Simple
* Copyright (C) 2008, 2009 KnowledgeTree Inc.
*
*
* This program is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License version 3 as published by the
* Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
* details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* You can contact KnowledgeTree Inc., PO Box 7775 #87847, San Francisco,
* California 94120-7775, or email info@knowledgetree.com.
*
* The interactive user interfaces in modified source and object code versions
* of this program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU General Public License version 3.
*
* In accordance with Section 7(b) of the GNU General Public License version 3,
* these Appropriate Legal Notices must retain the display of the "Powered by
* KnowledgeTree" logo and retain the original copyright notice. If the display of the
* logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices
* must display the words "Powered by KnowledgeTree" and retain the original
* copyright notice.
* Contributor( s): ______________________________________
*
*/
require_once(KT_LIB_DIR . '/actions/documentaction.inc.php');
require_once(KT_LIB_DIR . '/subscriptions/Subscription.inc');
require_once(KT_LIB_DIR . '/widgets/fieldWidgets.php');
require_once(KT_LIB_DIR . '/browse/browseutil.inc.php');
require_once(KT_LIB_DIR . '/documentmanagement/documentutil.inc.php');
// {{{ KTDocumentAssistAction
class KTDocumentAssistAction extends KTDocumentAction {
var $sName = 'ktcore.actions.document.assist';
function getDisplayName() {
return _kt('Request Assistance');
}
function do_main() {
$this->oPage->setBreadcrumbDetails(_kt("assistance"));
$oTemplate =& $this->oValidator->validateTemplate('ktcore/action/assistance');
$fields = array();
$fields[] = new KTStringWidget(_kt('Subject'), _kt('A one-line description introducing the assistance that you wish to receive'), 'subject', "", $this->oPage, true);
$fields[] = new KTTextWidget(_kt('Details'), _kt('A full description of the assistance that you with to receive. Provide all necessary information to assist in your request.'), 'details', "", $this->oPage, true);
$oTemplate->setData(array(
'context' => &$this,
'fields' => $fields,
));
return $oTemplate->render();
}
function do_assistance() {
$sSubject = $this->oValidator->validateString($_REQUEST['subject']);
$sDetails = $this->oValidator->validateString($_REQUEST['details']);
$aUsers = array();
$aGroups = array();
$aRoles = array();
foreach (Group::getAdministratorGroups() as $oGroup) {
$aGroups[$oGroup->getId()] =& $oGroup;
}
foreach (Unit::getUnitsForFolder($this->oDocument->getFolderId()) as $oUnit) {
foreach (Group::getUnitAdministratorGroupsByUnit($oUnit) as $oGroup) {
$aGroups[$oGroup->getId()] =& $oGroup;
}
}
$aRoles[-2] = Role::get(-2);
$oDocument =& $this->oDocument;
foreach ($aRoles as $oRole) {
// Ignore anonymous or Everyone roles
$iRoleId = KTUtil::getId($oRole);
if (($iRoleId == -3) || ($iRoleId == -4)) {
continue;
}
// first try on the document, then the folder above it.
$oRoleAllocation = DocumentRoleAllocation::getAllocationsForDocumentAndRole($oDocument->getId(), $iRoleId);
if (is_null($oRoleAllocation)) {
// if we don't get a document role, try folder role.
$oRoleAllocation = RoleAllocation::getAllocationsForFolderAndRole($oDocument->getFolderID(), $oRole->getId());
}
if (is_null($oRoleAllocation) || PEAR::isError($oRoleAllocation)) {
continue;
}
$aRoleUsers = $oRoleAllocation->getUsers();
$aRoleGroups = $oRoleAllocation->getGroups();
foreach ($aRoleUsers as $id => $oU) {
$aUsers[$id] = $oU;
}
foreach ($aRoleGroups as $id => $oGroup) {
$aGroups[$id] = $oGroup;
}
}
$aGroupMembershipSet = GroupUtil::buildGroupArray();
$aAllIds = array_keys($aGroups);
foreach ($aGroups as $id => $oGroup) {
$aAllIds = kt_array_merge($aGroupMembershipSet[$id], $aAllIds);
}
foreach ($aAllIds as $id) {
if (!array_key_exists($id, $aGroups)) {
$aGroups[$id] = Group::get($id);
}
}
// now, merge this (again) into the user-set.
foreach ($aGroups as $oGroup) {
$aNewUsers = $oGroup->getMembers();
foreach ($aNewUsers as $oU) {
$id = $oU->getId();
if (!array_key_exists($id, $aUsers)) {
$aUsers[$id] = $oU;
}
}
}
foreach ($aUsers as $oU) {
if (!PEAR::isError($oU)) {
KTAssistNotification::newNotificationForDocument($this->oDocument, $oU, $this->oUser, $sSubject, $sDetails);
}
}
$this->commitTransaction();
$params = 'fDocumentId=' . $oDocument->getId();
$url = generateControllerLink('viewDocument', $params);
exit(redirect($url));
}
}
// }}}
class KTAssistNotification extends KTNotificationHandler {
function & clearNotificationsForDocument($oDocument) {
$aNotifications = KTNotification::getList('data_int_1 = ' . $oDocument->getId());
foreach ($aNotifications as $oNotification) {
$oNotification->delete();
}
}
function &newNotificationForDocument($oDocument, $oUser, $oActor, $sSubject, $sDetails) {
$aInfo = array();
$aInfo['sData1'] = $sSubject;
$aInfo['sText1'] = $sDetails;
$aInfo['iData1'] = $oDocument->getId();
$aInfo['iData2'] = $oActor->getId();
$aInfo['sType'] = 'ktcore/assist';
$aInfo['dCreationDate'] = getCurrentDateTime();
$aInfo['iUserId'] = $oUser->getId();
$aInfo['sLabel'] = $oDocument->getName();
$oNotification = KTNotification::createFromArray($aInfo);
$handler = new KTAssistNotification();
if ($oUser->getEmailNotification() && (strlen($oUser->getEmail()) > 0)) {
$emailContent = $handler->handleNotification($oNotification);
$emailSubject = sprintf(_kt('Assistance request: %s'), $oDocument->getName());
$oEmail = new EmailAlert($oUser->getEmail(), $emailSubject, $emailContent);
$oEmail->send();
}
return $oNotification;
}
function handleNotification($oKTNotification) {
$oTemplating =& KTTemplating::getSingleton();
$oTemplate =& $oTemplating->loadTemplate('ktcore/assist/assist_notification');
$oDoc = Document::get($oKTNotification->getIntData1());
$isBroken = (PEAR::isError($oDoc) || ($oDoc->getStatusID() != LIVE && $oDoc->getStatusID() != ARCHIVED));
$oTemplate->setData(array(
'context' => $this,
'document_id' => $oKTNotification->getIntData1(),
'subject' => $oKTNotification->getStrData1(),
'actor' => User::get($oKTNotification->getIntData2()),
'document_name' => $oKTNotification->getLabel(),
'notify_id' => $oKTNotification->getId(),
'details' => $oKTNotification->getTextData1(),
'document' => $oDoc,
'is_broken' => $isBroken,
));
return $oTemplate->render();
}
function resolveNotification($oKTNotification) {
$notify_action = KTUtil::arrayGet($_REQUEST, 'notify_action', null);
$this->oNotification =& $oKTNotification;
$this->redispatch('notify_action', 'notify');
exit(0);
}
function notify_main() {
$this->aBreadcrumbs = array(array('action' => 'dashboard', 'name' => _kt('Dashboard')));
$this->oPage->setBreadcrumbDetails(_kt('Help request'));
$oTemplating =& KTTemplating::getSingleton();
$oKTNotification =& $this->oNotification;
$oDoc = Document::get($oKTNotification->getIntData1());
$isBroken = (PEAR::isError($oDoc) || ($oDoc->getStatusID() != LIVE));
$isArchived = ($oDoc->getStatusID() == ARCHIVED)? true : false;
$oTemplate =& $oTemplating->loadTemplate('ktcore/assist/assist_notification_details');
$oTemplate->setData(array(
'context' => $this,
'document_id' => $oKTNotification->getIntData1(),
'subject' => $oKTNotification->getStrData1(),
'actor' => User::get($oKTNotification->getIntData2()),
'document_name' => $oKTNotification->getLabel(),
'notify_id' => $oKTNotification->getId(),
'details' => $oKTNotification->getTextData1(),
'document' => $oDoc,
'is_broken' => $isBroken,
'is_archived' => $isArchived,
));
return $oTemplate->render();
}
function notify_clear() {
$_SESSION['KTInfoMessage'][] = _kt('Assistance Request cleared.');
$this->oNotification->delete();
exit(redirect(generateControllerLink('dashboard')));
}
function notify_view() {
$params = 'fDocumentId=' . $this->oNotification->getIntData1();
$url = generateControllerLink('viewDocument', $params);
// $this->oNotification->delete(); // clear the alert.
exit(redirect($url));
}
function notify_restore() {
$iDocId = $this->oNotification->getIntData1();
$res = $this->restore($iDocId);
if(PEAR::isError($res) || !$res){
$msg = _kt('Document could not be restored');
if($res){
$msg .= ': '.$res->getMessage();
}
$this->addErrorMessage($msg);
}else{
$this->addInfoMessage(_kt('The document has been successfully restored.'));
}
$notify_id = $_REQUEST['id'];
$url = KTUtil::ktLink("notify.php", '', "id=$notify_id");
exit(redirect($url));
}
function restore($iDocId) {
// Get the document object
$oDoc = Document::get($iDocId);
if (PEAR::isError($oDoc) || ($oDoc === false)) {
return $oDoc;
}
$this->startTransaction();
$iRestoreFolder = $oDoc->getRestoreFolderId();
$oFolder = Folder::get($iRestoreFolder);
// move to root if parent no longer exists.
if (PEAR::isError($oFolder)) {
$oDoc->setFolderId(1);
$oFolder = Folder::get(1);
} else {
$oDoc->setFolderId($iRestoreFolder);
}
$oStorage = KTStorageManagerUtil::getSingleton();
if ($oStorage->restore($oDoc)) {
$oDoc = Document::get($iDocId); // storage path has changed for most recent object...
$oDoc->setStatusId(LIVE);
$oDoc->setPermissionObjectId($oFolder->getPermissionObjectId());
$res = $oDoc->update();
if (PEAR::isError($res) || ($res == false)) {
return $res;
}
$res = KTPermissionUtil::updatePermissionLookup($oDoc);
if (PEAR::isError($res)) {
return $res;
}
// create a doc-transaction.
$oTransaction = new DocumentTransaction($oDoc, sprintf(_kt("Restored from deleted state by %s"), $this->oUser->getName()), 'ktcore.transactions.update');
$oTransaction->create();
}
$this->commitTransaction();
return true;
}
}
?>