PageRenderTime 46ms CodeModel.GetById 17ms RepoModel.GetById 1ms app.codeStats 0ms

/tine20/Courses/Frontend/Json.php

https://github.com/testruby/Tine-2.0-Open-Source-Groupware-and-CRM
PHP | 417 lines | 213 code | 59 blank | 145 comment | 21 complexity | 47fbfd7f2af6699f5e7819f672e0218f MD5 | raw file
  1. <?php
  2. /**
  3. * Tine 2.0
  4. * @package Courses
  5. * @subpackage Frontend
  6. * @license http://www.gnu.org/licenses/agpl.html AGPL Version 3
  7. * @author Philipp Schüle <p.schuele@metaways.de>
  8. * @copyright Copyright (c) 2007-2011 Metaways Infosystems GmbH (http://www.metaways.de)
  9. *
  10. */
  11. /**
  12. *
  13. * This class handles all Json requests for the Courses application
  14. *
  15. * @package Courses
  16. * @subpackage Frontend
  17. */
  18. class Courses_Frontend_Json extends Tinebase_Frontend_Json_Abstract
  19. {
  20. /**
  21. * the controller
  22. *
  23. * @var Courses_Controller_Course
  24. */
  25. protected $_controller = NULL;
  26. /**
  27. * the groups controller
  28. *
  29. * @var Admin_Controller_Group
  30. */
  31. protected $_groupController = NULL;
  32. /**
  33. * config of courses
  34. *
  35. * @var Zend_Config
  36. */
  37. protected $_config = NULL;
  38. /**
  39. * the constructor
  40. *
  41. */
  42. public function __construct()
  43. {
  44. $this->_applicationName = 'Courses';
  45. $this->_controller = Courses_Controller_Course::getInstance();
  46. $this->_groupController = Admin_Controller_Group::getInstance();
  47. $this->setConfig();
  48. }
  49. /**
  50. * set config
  51. *
  52. * @param array $_config
  53. */
  54. public function setConfig($_config = array())
  55. {
  56. $this->_config = isset(Tinebase_Core::getConfig()->courses) ? Tinebase_Core::getConfig()->courses : new Zend_Config($_config);
  57. }
  58. /************************************** protected helper functions **********************/
  59. /**
  60. * returns task prepared for json transport
  61. *
  62. * @param Tinebase_Record_Interface $_record
  63. * @return array record data
  64. */
  65. protected function _recordToJson($_record)
  66. {
  67. $recordArray = parent::_recordToJson($_record);
  68. // group data
  69. $groupData = $this->_groupController->get($_record->group_id)->toArray();
  70. unset($groupData['id']);
  71. $groupData['members'] = $this->_getCourseMembers($_record->group_id);
  72. // course type
  73. $recordArray['type'] = array(
  74. 'value' => $recordArray['type'],
  75. 'records' => $this->searchCourseTypes(NULL, NULL)
  76. );
  77. return array_merge($groupData, $recordArray);
  78. }
  79. /**
  80. * returns multiple records prepared for json transport
  81. *
  82. * @param Tinebase_Record_RecordSet $_records
  83. * @return array data
  84. */
  85. protected function _multipleRecordsToJson(Tinebase_Record_RecordSet $_records, $_filter=NULL)
  86. {
  87. $result = parent::_multipleRecordsToJson($_records, $_filter);
  88. // get groups + types (departments) and merge data
  89. $groupIds = $_records->group_id;
  90. $groups = Tinebase_Group::getInstance()->getMultiple(array_unique(array_values($groupIds)));
  91. $knownTypes = Tinebase_Department::getInstance()->search(new Tinebase_Model_DepartmentFilter());
  92. foreach ($result as &$course) {
  93. $groupIdx = $groups->getIndexById($course['group_id']);
  94. if ($groupIdx !== FALSE) {
  95. $group = $groups[$groupIdx]->toArray();
  96. unset($group['id']);
  97. $course = array_merge($group, $course);
  98. } else {
  99. if (Tinebase_Core::isLogLevel(Zend_Log::NOTICE)) Tinebase_Core::getLogger()->notice(__METHOD__ . '::' . __LINE__ . ' Group with ID ' . $course['group_id'] . ' does not exist.');
  100. }
  101. $typeIdx = $knownTypes->getIndexById($course['type']);
  102. if ($typeIdx !== FALSE) {
  103. //if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . ' ' . print_r($knownTypes[$typeIdx]->toArray(), true));
  104. $course['type'] = $knownTypes[$typeIdx]->toArray();
  105. } else {
  106. if (Tinebase_Core::isLogLevel(Zend_Log::NOTICE)) Tinebase_Core::getLogger()->notice(__METHOD__ . '::' . __LINE__ . ' Department with ID ' . $course['type'] . ' does not exist.');
  107. $course['type'] = array(
  108. 'id' => $course['type'],
  109. 'name' => $course['type']
  110. );
  111. }
  112. }
  113. return $result;
  114. }
  115. /**
  116. * get course members
  117. *
  118. * @param int $_groupId
  119. * @return array
  120. */
  121. protected function _getCourseMembers($_groupId)
  122. {
  123. $adminJson = new Admin_Frontend_Json();
  124. $members = $adminJson->getGroupMembers($_groupId);
  125. $result = array();
  126. foreach ($members['results'] as $member) {
  127. // get full user for login name
  128. $fullUser = Tinebase_User::getInstance()->getFullUserById($member['id']);
  129. $result[] = array(
  130. 'id' => $member['id'],
  131. 'name' => $member['name'],
  132. 'data' => $fullUser->accountLoginName,
  133. 'type' => Tinebase_Acl_Rights::ACCOUNT_TYPE_USER,
  134. );
  135. }
  136. return $result;
  137. }
  138. /**
  139. * add or remove members from internet/fileserver groups
  140. *
  141. * @param array $_members array of member ids
  142. * @param boolean $_access yes/no
  143. */
  144. protected function _manageAccessGroups(array $_members, $_access, $_type = 'internet')
  145. {
  146. $configField = $_type . '_group';
  147. if (!isset($this->_config) || !isset($this->_config->{$configField})) {
  148. return;
  149. }
  150. $groupId = $this->_config->{$configField};
  151. $groupController = Admin_Controller_Group::getInstance();
  152. if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . " Setting $_type to $_access for " . print_r($_members, true));
  153. // add or remove members to or from internet/fileserver groups (defined in config.inc.php)
  154. foreach ($_members as $memberId) {
  155. if ($_access) {
  156. $groupController->addGroupMember($groupId, $memberId);
  157. } else {
  158. $groupController->removeGroupMember($groupId, $memberId);
  159. }
  160. }
  161. }
  162. /************************************** public API **************************************/
  163. /**
  164. * Returns registry data of the application.
  165. *
  166. * @return mixed array 'variable name' => 'data'
  167. */
  168. public function getRegistryData()
  169. {
  170. $courseTypes = Tinebase_Department::getInstance()->search(new Tinebase_Model_DepartmentFilter());
  171. $defaultType = count($courseTypes) > 0 ? $courseTypes[0]->getId() : '';
  172. $result = array(
  173. 'defaultType' => array(
  174. 'value' => $defaultType,
  175. 'records' => $this->searchCourseTypes(NULL, NULL)
  176. )
  177. );
  178. if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ .' result: ' . print_r($result, true));
  179. return $result;
  180. }
  181. /**
  182. * Search for records matching given arguments
  183. *
  184. * @param array $filter
  185. * @param array $paging
  186. * @return array
  187. */
  188. public function searchCourses($filter, $paging)
  189. {
  190. return $this->_search($filter, $paging, $this->_controller, 'Courses_Model_CourseFilter');
  191. }
  192. /**
  193. * Return a single record
  194. *
  195. * @param string $id
  196. * @return array record data
  197. */
  198. public function getCourse($id)
  199. {
  200. return $this->_get($id, $this->_controller);
  201. }
  202. /**
  203. * creates/updates a record
  204. *
  205. * @todo move non api specific stuff to controller!
  206. *
  207. * @param array $recordData
  208. * @return array created/updated record
  209. */
  210. public function saveCourse($recordData)
  211. {
  212. // create course and group from json data
  213. $course = new Courses_Model_Course(array(), TRUE);
  214. $course->setFromJsonInUsersTimezone($recordData);
  215. $group = new Tinebase_Model_Group(array(), TRUE);
  216. $group->setFromJsonInUsersTimezone($recordData);
  217. $i18n = Tinebase_Translation::getTranslation('Courses');
  218. $groupNamePrefix = $i18n->_('Course');
  219. $groupNamePrefix = is_array($groupNamePrefix) ? $groupNamePrefix[0] : $groupNamePrefix;
  220. $group->name = $groupNamePrefix . '-' . $course->name;
  221. if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . ' ' . print_r($group->toArray(), true));
  222. if (empty($group->id)) {
  223. $savedGroup = $this->_groupController->create($group);
  224. $course->group_id = $savedGroup->getId();
  225. $savedRecord = $this->_controller->create($course);
  226. } else {
  227. $savedRecord = $this->_controller->update($course);
  228. $currentMembers = $this->_groupController->getGroupMembers($course->group_id);
  229. $newCourseMembers = array_diff((array)$group->members, $currentMembers);
  230. $this->_controller->addCourseMembers($course, $newCourseMembers);
  231. $deletedAccounts = array_diff($currentMembers, (array)$group->members);
  232. // delete members wich got removed from course
  233. Admin_Controller_User::getInstance()->delete($deletedAccounts);
  234. }
  235. // add/remove members to/from internet/fileserver group
  236. if (! empty($group->members)) {
  237. $this->_manageAccessGroups($group->members, $savedRecord->internet, 'internet');
  238. $this->_manageAccessGroups($group->members, $savedRecord->fileserver, 'fileserver');
  239. }
  240. return $this->_recordToJson($savedRecord);
  241. }
  242. /**
  243. * deletes existing records
  244. *
  245. * @param string $ids
  246. * @return string
  247. */
  248. public function deleteCourses($ids)
  249. {
  250. return $this->_delete($ids, $this->_controller);
  251. }
  252. /**
  253. * import course members
  254. *
  255. * @param string $tempFileId
  256. * @param string $groupId
  257. * @param string $courseName
  258. *
  259. * @todo write test!!
  260. */
  261. public function importMembers($tempFileId, $groupId, $courseId)
  262. {
  263. $tempFile = Tinebase_TempFile::getInstance()->getTempFile($tempFileId);
  264. $course = $this->_controller->get($courseId);
  265. $schoolName = strtolower(Tinebase_Department::getInstance()->get($course->type)->name);
  266. // get definition and start import with admin user import csv plugin
  267. $definitionName = $this->_config->get('import_definition', 'admin_user_import_csv');
  268. if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . ' Using import definition: ' . $definitionName);
  269. $definition = Tinebase_ImportExportDefinition::getInstance()->getByName($definitionName);
  270. $importer = Admin_Import_Csv::createFromDefinition($definition, array(
  271. //'accountLoginNamePrefix' => $course->name . '-',
  272. 'group_id' => $groupId,
  273. 'accountEmailDomain' => (isset($this->_config->domain)) ? $this->_config->domain : '',
  274. 'accountHomeDirectoryPrefix' => (isset($this->_config->basehomedir)) ? $this->_config->basehomedir . $schoolName . '/'. $course->name . '/' : '',
  275. 'password' => $course->name,
  276. 'course' => $course,
  277. 'samba' => (isset($this->_config->samba)) ? array(
  278. 'homePath' => $this->_config->samba->basehomepath,
  279. 'homeDrive' => $this->_config->samba->homedrive,
  280. 'logonScript' => $course->name . $this->_config->samba->logonscript_postfix_member,
  281. 'profilePath' => $this->_config->samba->baseprofilepath . $schoolName . '\\' . $course->name . '\\',
  282. 'pwdCanChange' => new Tinebase_DateTime('@1'),
  283. 'pwdMustChange' => new Tinebase_DateTime('@1')
  284. ) : array(),
  285. ));
  286. $importer->importFile($tempFile->path);
  287. // return members to update members grid and add to student group
  288. $members = $this->_getCourseMembers($groupId);
  289. // add to student group if available
  290. if (isset($this->_config->students_group) && !empty($this->_config->students_group)) {
  291. $groupController = Admin_Controller_Group::getInstance();
  292. foreach ($members as $member) {
  293. $groupController->addGroupMember($this->_config->students_group, $member['id']);
  294. }
  295. }
  296. return array(
  297. 'results' => $members,
  298. 'status' => 'success'
  299. );
  300. }
  301. /**
  302. * Search for records matching given arguments
  303. *
  304. * @param array $filter
  305. * @param array $paging
  306. * @return array
  307. */
  308. public function searchCourseTypes($filter, $paging)
  309. {
  310. $result = Tinebase_Department::getInstance()->search(new Tinebase_Model_DepartmentFilter())->toArray();
  311. return array(
  312. 'results' => $result,
  313. 'totalcount' => count($result),
  314. 'filter' => $filter,
  315. );
  316. }
  317. /**
  318. * update fileserver/internet access
  319. *
  320. * @param array $ids
  321. * @param string $type
  322. * @param boolean $access
  323. * @return array
  324. */
  325. public function updateAccess($ids, $type, $access)
  326. {
  327. $result = FALSE;
  328. $allowedTypes = array('internet', 'fileserver');
  329. if (in_array($type, $allowedTypes)) {
  330. foreach ($ids as $courseId) {
  331. $course = $this->_controller->get($courseId);
  332. $members = $this->_groupController->getGroupMembers($course->group_id);
  333. // update course and groups
  334. $this->_manageAccessGroups($members, $access, $type);
  335. $course->{$type} = $access;
  336. $course = $this->_controller->update($course);
  337. }
  338. $result = TRUE;
  339. }
  340. return array(
  341. 'status' => ($result) ? 'success' : 'failure'
  342. );
  343. }
  344. /**
  345. * reset password for given account
  346. * - call Admin_Frontend_Json::resetPassword()
  347. *
  348. * @param array $account data of Tinebase_Model_FullUser or account id
  349. * @param string $password the new password
  350. * @param bool $mustChange
  351. * @return array
  352. */
  353. public function resetPassword($account, $password, $mustChange)
  354. {
  355. $adminJson = new Admin_Frontend_Json();
  356. return $adminJson->resetPassword($account, $password, (bool)$mustChange);
  357. }
  358. }