PageRenderTime 43ms CodeModel.GetById 11ms RepoModel.GetById 0ms app.codeStats 1ms

/app/protected/modules/reports/controllers/DefaultController.php

https://bitbucket.org/zurmo/zurmo/
PHP | 551 lines | 483 code | 26 blank | 42 comment | 35 complexity | f24354c78f5fa9dcb5dbc4e5ee650cbf MD5 | raw file
Possible License(s): AGPL-3.0, BSD-3-Clause, GPL-2.0, LGPL-3.0, LGPL-2.1, BSD-2-Clause
  1. <?php
  2. /*********************************************************************************
  3. * Zurmo is a customer relationship management program developed by
  4. * Zurmo, Inc. Copyright (C) 2015 Zurmo Inc.
  5. *
  6. * Zurmo is free software; you can redistribute it and/or modify it under
  7. * the terms of the GNU Affero General Public License version 3 as published by the
  8. * Free Software Foundation with the addition of the following permission added
  9. * to Section 15 as permitted in Section 7(a): FOR ANY PART OF THE COVERED WORK
  10. * IN WHICH THE COPYRIGHT IS OWNED BY ZURMO, ZURMO DISCLAIMS THE WARRANTY
  11. * OF NON INFRINGEMENT OF THIRD PARTY RIGHTS.
  12. *
  13. * Zurmo is distributed in the hope that it will be useful, but WITHOUT
  14. * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
  15. * FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
  16. * details.
  17. *
  18. * You should have received a copy of the GNU Affero General Public License along with
  19. * this program; if not, see http://www.gnu.org/licenses or write to the Free
  20. * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
  21. * 02110-1301 USA.
  22. *
  23. * You can contact Zurmo, Inc. with a mailing address at 27 North Wacker Drive
  24. * Suite 370 Chicago, IL 60606. or at email address contact@zurmo.com.
  25. *
  26. * The interactive user interfaces in original and modified versions
  27. * of this program must display Appropriate Legal Notices, as required under
  28. * Section 5 of the GNU Affero General Public License version 3.
  29. *
  30. * In accordance with Section 7(b) of the GNU Affero General Public License version 3,
  31. * these Appropriate Legal Notices must retain the display of the Zurmo
  32. * logo and Zurmo copyright notice. If the display of the logo is not reasonably
  33. * feasible for technical reasons, the Appropriate Legal Notices must display the words
  34. * "Copyright Zurmo Inc. 2015. All rights reserved".
  35. ********************************************************************************/
  36. /**
  37. * Default controller for all report actions
  38. */
  39. class ReportsDefaultController extends ZurmoBaseController
  40. {
  41. public function filters()
  42. {
  43. return array_merge(parent::filters(),
  44. array(
  45. array(
  46. self::getRightsFilterPath() . ' + drillDownDetails',
  47. 'moduleClassName' => 'ReportsModule',
  48. 'rightName' => ReportsModule::RIGHT_ACCESS_REPORTS,
  49. ),
  50. array(
  51. self::getRightsFilterPath() . ' + selectType',
  52. 'moduleClassName' => 'ReportsModule',
  53. 'rightName' => ReportsModule::RIGHT_CREATE_REPORTS,
  54. ),
  55. array(
  56. ZurmoModuleController::ZERO_MODELS_CHECK_FILTER_PATH . ' + list, index',
  57. 'controller' => $this,
  58. ),
  59. )
  60. );
  61. }
  62. public function actionIndex()
  63. {
  64. $this->actionList();
  65. }
  66. public function actionList()
  67. {
  68. $pageSize = Yii::app()->pagination->resolveActiveForCurrentUserByType(
  69. 'listPageSize', get_class($this->getModule()));
  70. $savedReport = new SavedReport(false);
  71. $searchForm = new ReportsSearchForm($savedReport);
  72. $listAttributesSelector = new ListAttributesSelector('ReportsListView', get_class($this->getModule()));
  73. $searchForm->setListAttributesSelector($listAttributesSelector);
  74. $dataProvider = $this->resolveSearchDataProvider(
  75. $searchForm,
  76. $pageSize,
  77. null,
  78. 'ReportsSearchView'
  79. );
  80. $title = Zurmo::t('ReportsModule', 'Reports');
  81. $breadCrumbLinks = array(
  82. $title,
  83. );
  84. if (isset($_GET['ajax']) && $_GET['ajax'] == 'list-view')
  85. {
  86. $mixedView = $this->makeListView(
  87. $searchForm,
  88. $dataProvider
  89. );
  90. $view = new ReportsPageView($mixedView);
  91. }
  92. else
  93. {
  94. $mixedView = $this->makeActionBarSearchAndListView($searchForm, $dataProvider,
  95. 'SecuredActionBarForReportsSearchAndListView');
  96. $view = new ReportsPageView(ZurmoDefaultViewUtil::
  97. makeViewWithBreadcrumbsForCurrentUser(
  98. $this, $mixedView, $breadCrumbLinks, 'ReportBreadCrumbView'));
  99. }
  100. echo $view->render();
  101. }
  102. public function actionDetails($id)
  103. {
  104. $savedReport = static::getModelAndCatchNotFoundAndDisplayError('SavedReport', intval($id));
  105. ControllerSecurityUtil::resolveCanCurrentUserAccessModule($savedReport->moduleClassName);
  106. ControllerSecurityUtil::resolveAccessCanCurrentUserReadModel($savedReport);
  107. AuditEvent::logAuditEvent('ZurmoModule', ZurmoModule::AUDIT_EVENT_ITEM_VIEWED, array(strval($savedReport), 'ReportsModule'), $savedReport);
  108. $breadCrumbLinks = array(strval($savedReport));
  109. $breadCrumbView = new ReportBreadCrumbView($this->getId(), $this->getModule()->getId(), $breadCrumbLinks);
  110. $detailsAndRelationsView = $this->makeReportDetailsAndRelationsView($savedReport, Yii::app()->request->getRequestUri(),
  111. $breadCrumbView);
  112. $view = new ReportsPageView(ZurmoDefaultViewUtil::
  113. makeStandardViewForCurrentUser($this, $detailsAndRelationsView));
  114. echo $view->render();
  115. }
  116. public function actionSelectType()
  117. {
  118. $breadCrumbLinks = array(Zurmo::t('ReportsModule', 'Select Report Type'));
  119. $view = new ReportsPageView(ZurmoDefaultViewUtil::
  120. makeViewWithBreadcrumbsForCurrentUser(
  121. $this,
  122. new ReportWizardTypesGridView(),
  123. $breadCrumbLinks,
  124. 'ReportBreadCrumbView'));
  125. echo $view->render();
  126. }
  127. public function actionCreate($type = null)
  128. {
  129. if ($type == null)
  130. {
  131. $this->actionSelectType();
  132. Yii::app()->end(0, false);
  133. }
  134. $breadCrumbLinks = array(Zurmo::t('Core', 'Create'));
  135. assert('is_string($type)');
  136. $report = new Report();
  137. $report->setType($type);
  138. $progressBarAndStepsView = ReportWizardViewFactory::makeStepsAndProgressBarViewFromReport($report);
  139. $reportWizardView = ReportWizardViewFactory::makeViewFromReport($report);
  140. $view = new ReportsPageView(ZurmoDefaultViewUtil::
  141. makeTwoViewsWithBreadcrumbsForCurrentUser(
  142. $this,
  143. $progressBarAndStepsView,
  144. $reportWizardView,
  145. $breadCrumbLinks,
  146. 'ReportBreadCrumbView'));
  147. echo $view->render();
  148. }
  149. public function actionEdit($id, $isBeingCopied = false)
  150. {
  151. $savedReport = SavedReport::getById((int)$id);
  152. ControllerSecurityUtil::resolveCanCurrentUserAccessModule($savedReport->moduleClassName);
  153. if (!$isBeingCopied)
  154. {
  155. ControllerSecurityUtil::resolveAccessCanCurrentUserWriteModel($savedReport);
  156. }
  157. $breadCrumbLinks = array(strval($savedReport));
  158. $report = SavedReportToReportAdapter::makeReportBySavedReport($savedReport);
  159. $progressBarAndStepsView = ReportWizardViewFactory::makeStepsAndProgressBarViewFromReport($report);
  160. $reportWizardView = ReportWizardViewFactory::makeViewFromReport($report, (bool)$isBeingCopied);
  161. $view = new ReportsPageView(ZurmoDefaultViewUtil::
  162. makeTwoViewsWithBreadcrumbsForCurrentUser(
  163. $this,
  164. $progressBarAndStepsView,
  165. $reportWizardView,
  166. $breadCrumbLinks,
  167. 'ReportBreadCrumbView'));
  168. echo $view->render();
  169. }
  170. public function actionSave($type, $id = null, $isBeingCopied = false)
  171. {
  172. $postData = PostUtil::getData();
  173. $savedReport = null;
  174. $report = null;
  175. $this->resolveSavedReportAndReportByPostData($postData, $savedReport, $report, $type, $id, (bool)$isBeingCopied);
  176. $reportToWizardFormAdapter = new ReportToWizardFormAdapter($report);
  177. $model = $reportToWizardFormAdapter->makeFormByType();
  178. if (isset($postData['ajax']) && $postData['ajax'] === 'edit-form')
  179. {
  180. $errorData = ReportUtil::validateReportWizardForm($postData, $model);
  181. echo CJSON::encode($errorData);
  182. Yii::app()->end(0, false);
  183. }
  184. $explicitReadWriteModelPermissions = ExplicitReadWriteModelPermissionsUtil::
  185. resolveByPostDataAndModelThenMake($postData[get_class($model)], $savedReport);
  186. SavedReportToReportAdapter::resolveReportToSavedReport($report, $savedReport);
  187. if ($savedReport->id > 0)
  188. {
  189. ControllerSecurityUtil::resolveCanCurrentUserAccessModule($savedReport->moduleClassName);
  190. }
  191. ControllerSecurityUtil::resolveAccessCanCurrentUserWriteModel($savedReport);
  192. if ($savedReport->save())
  193. {
  194. StickyReportUtil::clearDataByKey($savedReport->id);
  195. if ($explicitReadWriteModelPermissions != null)
  196. {
  197. ExplicitReadWriteModelPermissionsUtil::resolveExplicitReadWriteModelPermissions($savedReport,
  198. $explicitReadWriteModelPermissions);
  199. }
  200. //i can do a safety check on perms, then do flash here, on the jscript we can go to list instead and this should come up...
  201. //make sure you add to list of things to test.
  202. $redirectToList = $this->resolveAfterSaveHasPermissionsProblem($savedReport,
  203. $postData[get_class($model)]['name']);
  204. echo CJSON::encode(array('id' => $savedReport->id,
  205. 'redirectToList' => $redirectToList));
  206. Yii::app()->end(0, false);
  207. }
  208. else
  209. {
  210. throw new FailedToSaveModelException();
  211. }
  212. }
  213. public function actionRelationsAndAttributesTree($type, $treeType, $id = null, $nodeId = null, $isBeingCopied = false)
  214. {
  215. $postData = PostUtil::getData();
  216. $savedReport = null;
  217. $report = null;
  218. $this->resolveSavedReportAndReportByPostData($postData, $savedReport, $report, $type, $id, (bool)$isBeingCopied);
  219. if ($nodeId != null)
  220. {
  221. $reportToTreeAdapter = new ReportRelationsAndAttributesToTreeAdapter($report, $treeType);
  222. echo ZurmoTreeView::saveDataAsJson($reportToTreeAdapter->getData($nodeId));
  223. Yii::app()->end(0, false);
  224. }
  225. $view = new ReportRelationsAndAttributesTreeView($type, $treeType, 'edit-form');
  226. $content = $view->render();
  227. Yii::app()->getClientScript()->setToAjaxMode();
  228. Yii::app()->getClientScript()->render($content);
  229. echo $content;
  230. }
  231. public function actionAddAttributeFromTree($type, $treeType, $nodeId, $rowNumber,
  232. $trackableStructurePosition = false, $id = null, $isBeingCopied = false)
  233. {
  234. $postData = PostUtil::getData();
  235. $savedReport = null;
  236. $report = null;
  237. $this->resolveSavedReportAndReportByPostData($postData, $savedReport, $report, $type, $id, (bool)$isBeingCopied);
  238. ReportUtil::processAttributeAdditionFromTree($nodeId, $treeType, $report, $rowNumber, $trackableStructurePosition);
  239. }
  240. public function actionGetAvailableSeriesAndRangesForChart($type, $id = null, $isBeingCopied = false)
  241. {
  242. $postData = PostUtil::getData();
  243. $savedReport = null;
  244. $report = null;
  245. $this->resolveSavedReportAndReportByPostData($postData, $savedReport, $report, $type, $id, (bool)$isBeingCopied);
  246. $moduleClassName = $report->getModuleClassName();
  247. $modelClassName = $moduleClassName::getPrimaryModelName();
  248. $modelToReportAdapter = ModelRelationsAndAttributesToReportAdapter::
  249. make($moduleClassName, $modelClassName, $report->getType());
  250. if (!$modelToReportAdapter instanceof ModelRelationsAndAttributesToSummationReportAdapter)
  251. {
  252. throw new NotSupportedException();
  253. }
  254. $seriesAttributesData = $modelToReportAdapter->
  255. getAttributesForChartSeries($report->getGroupBys(),
  256. $report->getDisplayAttributes());
  257. $rangeAttributesData = $modelToReportAdapter->
  258. getAttributesForChartRange ($report->getDisplayAttributes());
  259. $dataAndLabels = array();
  260. $dataAndLabels['firstSeriesDataAndLabels'] = array('' => Zurmo::t('Core', '(None)'));
  261. $dataAndLabels['firstSeriesDataAndLabels'] = array_merge($dataAndLabels['firstSeriesDataAndLabels'],
  262. ReportUtil::makeDataAndLabelsForSeriesOrRange($seriesAttributesData));
  263. $dataAndLabels['firstRangeDataAndLabels'] = array('' => Zurmo::t('Core', '(None)'));
  264. $dataAndLabels['firstRangeDataAndLabels'] = array_merge($dataAndLabels['firstRangeDataAndLabels'],
  265. ReportUtil::makeDataAndLabelsForSeriesOrRange($rangeAttributesData));
  266. $dataAndLabels['secondSeriesDataAndLabels'] = array('' => Zurmo::t('Core', '(None)'));
  267. $dataAndLabels['secondSeriesDataAndLabels'] = array_merge($dataAndLabels['secondSeriesDataAndLabels'],
  268. ReportUtil::makeDataAndLabelsForSeriesOrRange($seriesAttributesData));
  269. $dataAndLabels['secondRangeDataAndLabels'] = array('' => Zurmo::t('Core', '(None)'));
  270. $dataAndLabels['secondRangeDataAndLabels'] = array_merge($dataAndLabels['secondRangeDataAndLabels'],
  271. ReportUtil::makeDataAndLabelsForSeriesOrRange($rangeAttributesData));
  272. echo CJSON::encode($dataAndLabels);
  273. }
  274. public function actionApplyRuntimeFilters($id)
  275. {
  276. $postData = PostUtil::getData();
  277. $savedReport = SavedReport::getById((int)$id);
  278. ControllerSecurityUtil::resolveCanCurrentUserAccessModule($savedReport->moduleClassName);
  279. ControllerSecurityUtil::resolveAccessCanCurrentUserReadModel($savedReport);
  280. $report = SavedReportToReportAdapter::makeReportBySavedReport($savedReport);
  281. $wizardFormClassName = ReportToWizardFormAdapter::getFormClassNameByType($report->getType());
  282. if (!isset($postData[$wizardFormClassName]))
  283. {
  284. throw new NotSupportedException();
  285. }
  286. DataToReportUtil::resolveFilters($postData[$wizardFormClassName], $report, true);
  287. if (isset($postData['ajax']) && $postData['ajax'] == 'edit-form')
  288. {
  289. $adapter = new ReportToWizardFormAdapter($report);
  290. $reportWizardForm = $adapter->makeFormByType();
  291. $reportWizardForm->setScenario(reportWizardForm::FILTERS_VALIDATION_SCENARIO);
  292. if (!$reportWizardForm->validate())
  293. {
  294. $errorData = array();
  295. foreach ($reportWizardForm->getErrors() as $attribute => $errors)
  296. {
  297. $errorData[ZurmoHtml::activeId($reportWizardForm, $attribute)] = $errors;
  298. }
  299. echo CJSON::encode($errorData);
  300. Yii::app()->end(0, false);
  301. }
  302. }
  303. $filtersData = ArrayUtil::getArrayValue($postData[$wizardFormClassName],
  304. ComponentForReportForm::TYPE_FILTERS);
  305. $sanitizedFiltersData = DataToReportUtil::sanitizeFiltersData($report->getModuleClassName(),
  306. $report->getType(),
  307. $filtersData);
  308. $stickyData = array(ComponentForReportForm::TYPE_FILTERS => $sanitizedFiltersData);
  309. StickyReportUtil::setDataByKeyAndData($report->getId(), $stickyData);
  310. }
  311. public function actionResetRuntimeFilters($id)
  312. {
  313. $savedReport = SavedReport::getById((int)$id);
  314. ControllerSecurityUtil::resolveCanCurrentUserAccessModule($savedReport->moduleClassName);
  315. ControllerSecurityUtil::resolveAccessCanCurrentUserReadModel($savedReport);
  316. $report = SavedReportToReportAdapter::makeReportBySavedReport($savedReport);
  317. StickyReportUtil::clearDataByKey($report->getId());
  318. }
  319. public function actionDelete($id)
  320. {
  321. $savedReport = SavedReport::GetById(intval($id));
  322. ControllerSecurityUtil::resolveAccessCanCurrentUserDeleteModel($savedReport);
  323. $savedReport->delete();
  324. $this->redirect(array($this->getId() . '/index'));
  325. }
  326. public function actionDrillDownDetails($id, $rowId)
  327. {
  328. $savedReport = SavedReport::getById((int)$id);
  329. ControllerSecurityUtil::resolveCanCurrentUserAccessModule($savedReport->moduleClassName);
  330. ControllerSecurityUtil::resolveAccessCanCurrentUserReadModel($savedReport, true);
  331. $report = SavedReportToReportAdapter::makeReportBySavedReport($savedReport);
  332. $report->resolveGroupBysAsFilters(GetUtil::getData());
  333. if (null != $stickyData = StickyReportUtil::getDataByKey($report->id))
  334. {
  335. StickyReportUtil::resolveStickyDataToReport($report, $stickyData);
  336. }
  337. $pageSize = Yii::app()->pagination->resolveActiveForCurrentUserByType(
  338. 'reportResultsSubListPageSize', get_class($this->getModule()));
  339. $dataProvider = ReportDataProviderFactory::makeForSummationDrillDown($report, $pageSize);
  340. $dataProvider->setRunReport(true);
  341. $view = new SummationDrillDownReportResultsGridView('default', 'reports', $dataProvider, $rowId);
  342. $content = $view->render();
  343. Yii::app()->getClientScript()->setToAjaxMode();
  344. Yii::app()->getClientScript()->render($content);
  345. echo $content;
  346. }
  347. public function actionExport($id, $stickySearchKey = null)
  348. {
  349. assert('$stickySearchKey == null || is_string($stickySearchKey)');
  350. $savedReport = SavedReport::getById((int)$id);
  351. ControllerSecurityUtil::resolveCanCurrentUserAccessModule($savedReport->moduleClassName);
  352. ControllerSecurityUtil::resolveAccessCanCurrentUserReadModel($savedReport);
  353. $report = SavedReportToReportAdapter::makeReportBySavedReport($savedReport);
  354. $dataProvider = $this->getDataProviderForExport($report, $report->getId(), false);
  355. $totalItems = intval($dataProvider->calculateTotalItemCount());
  356. $data = array();
  357. if ($totalItems > 0)
  358. {
  359. if ($totalItems <= ExportModule::$asynchronousThreshold)
  360. {
  361. // Output csv file directly to user browser
  362. if ($dataProvider)
  363. {
  364. $reportToExportAdapter = ReportToExportAdapterFactory::createReportToExportAdapter($report, $dataProvider);
  365. $headerData = $reportToExportAdapter->getHeaderData();
  366. $data = $reportToExportAdapter->getData();
  367. }
  368. // Output data
  369. if (count($data))
  370. {
  371. $fileName = $this->getModule()->getName() . ".csv";
  372. ExportItemToCsvFileUtil::export($data, $headerData, $fileName, true);
  373. }
  374. else
  375. {
  376. Yii::app()->user->setFlash('notification',
  377. Zurmo::t('ZurmoModule', 'There is no data to export.')
  378. );
  379. }
  380. }
  381. else
  382. {
  383. if ($dataProvider)
  384. {
  385. $serializedData = ExportUtil::getSerializedDataForExport($dataProvider);
  386. }
  387. // Create background job
  388. $exportItem = new ExportItem();
  389. $exportItem->isCompleted = 0;
  390. $exportItem->exportFileType = 'csv';
  391. $exportItem->exportFileName = $this->getModule()->getName();
  392. $exportItem->modelClassName = 'SavedReport';
  393. $exportItem->serializedData = $serializedData;
  394. $exportItem->save();
  395. $exportItem->forget();
  396. Yii::app()->user->setFlash('notification',
  397. Zurmo::t('ZurmoModule', 'A large amount of data has been requested for export. You will receive ' .
  398. 'a notification with the download link when the export is complete.')
  399. );
  400. }
  401. }
  402. else
  403. {
  404. Yii::app()->user->setFlash('notification',
  405. Zurmo::t('ZurmoModule', 'There is no data to export.')
  406. );
  407. }
  408. $this->redirect(array($this->getId() . '/index'));
  409. }
  410. public function actionModalList($stateMetadataAdapterClassName = null)
  411. {
  412. $modalListLinkProvider = new SelectFromRelatedEditModalListLinkProvider(
  413. $_GET['modalTransferInformation']['sourceIdFieldId'],
  414. $_GET['modalTransferInformation']['sourceNameFieldId'],
  415. $_GET['modalTransferInformation']['modalId']
  416. );
  417. echo ModalSearchListControllerUtil::
  418. setAjaxModeAndRenderModalSearchList($this, $modalListLinkProvider, $stateMetadataAdapterClassName);
  419. }
  420. public function actionAutoComplete($term, $moduleClassName = null, $type = null, $autoCompleteOptions = null)
  421. {
  422. $pageSize = Yii::app()->pagination->resolveActiveForCurrentUserByType(
  423. 'autoCompleteListPageSize', get_class($this->getModule()));
  424. $autoCompleteResults = ReportAutoCompleteUtil::getByPartialName($term, $pageSize, $moduleClassName,
  425. $type, $autoCompleteOptions);
  426. echo CJSON::encode($autoCompleteResults);
  427. }
  428. protected function resolveCanCurrentUserAccessReports()
  429. {
  430. if (!RightsUtil::doesUserHaveAllowByRightName('ReportsModule',
  431. ReportsModule::RIGHT_CREATE_REPORTS,
  432. Yii::app()->user->userModel))
  433. {
  434. $messageView = new AccessFailureView();
  435. $view = new AccessFailurePageView($messageView);
  436. echo $view->render();
  437. Yii::app()->end(0, false);
  438. }
  439. return true;
  440. }
  441. protected function resolveSavedReportAndReportByPostData(Array $postData, & $savedReport, & $report, $type,
  442. $id = null, $isBeingCopied = false)
  443. {
  444. if ($id == null)
  445. {
  446. $this->resolveCanCurrentUserAccessReports();
  447. $savedReport = new SavedReport();
  448. $report = new Report();
  449. $report->setType($type);
  450. }
  451. elseif ($isBeingCopied)
  452. {
  453. $savedReport = new SavedReport();
  454. $oldReport = SavedReport::getById(intval($id));
  455. ControllerSecurityUtil::resolveAccessCanCurrentUserReadModel($oldReport);
  456. SavedReportCopyModelUtil::copy($oldReport, $savedReport);
  457. $report = SavedReportToReportAdapter::makeReportBySavedReport($savedReport);
  458. }
  459. else
  460. {
  461. $savedReport = SavedReport::getById(intval($id));
  462. ControllerSecurityUtil::resolveAccessCanCurrentUserWriteModel($savedReport);
  463. $report = SavedReportToReportAdapter::makeReportBySavedReport($savedReport);
  464. }
  465. DataToReportUtil::resolveReportByWizardPostData($report, $postData,
  466. ReportToWizardFormAdapter::getFormClassNameByType($type));
  467. }
  468. protected function resolveAfterSaveHasPermissionsProblem(SavedReport $savedReport, $modelToStringValue)
  469. {
  470. assert('is_string($modelToStringValue)');
  471. if (ControllerSecurityUtil::doesCurrentUserHavePermissionOnSecurableItem($savedReport, Permission::READ))
  472. {
  473. return false;
  474. }
  475. else
  476. {
  477. $notificationContent = Zurmo::t(
  478. 'ZurmoModule',
  479. 'You no longer have permissions to access {modelName}.',
  480. array('{modelName}' => $modelToStringValue)
  481. );
  482. Yii::app()->user->setFlash('notification', $notificationContent);
  483. return true;
  484. }
  485. }
  486. protected function makeReportDetailsAndRelationsView(SavedReport $savedReport, $redirectUrl,
  487. ReportBreadCrumbView $breadCrumbView)
  488. {
  489. $reportDetailsAndRelationsView = ReportDetailsAndResultsViewFactory::makeView($savedReport, $this->getId(),
  490. $this->getModule()->getId(),
  491. $redirectUrl);
  492. $gridView = new GridView(2, 1);
  493. $gridView->setView($breadCrumbView, 0, 0);
  494. $gridView->setView($reportDetailsAndRelationsView, 1, 0);
  495. return $gridView;
  496. }
  497. protected function getDataProviderForExport(Report $report, $stickyKey, $runReport)
  498. {
  499. assert('is_string($stickyKey) || is_int($stickyKey)');
  500. assert('is_bool($runReport)');
  501. if (null != $stickyData = StickyReportUtil::getDataByKey($stickyKey))
  502. {
  503. StickyReportUtil::resolveStickyDataToReport($report, $stickyData);
  504. }
  505. $pageSize = Yii::app()->pagination->resolveActiveForCurrentUserByType(
  506. 'reportResultsListPageSize', get_class($this->getModule()));
  507. $dataProvider = ReportDataProviderFactory::makeByReport($report, $pageSize);
  508. if (!($dataProvider instanceof MatrixReportDataProvider))
  509. {
  510. $totalItems = intval($dataProvider->calculateTotalItemCount());
  511. $dataProvider->getPagination()->setPageSize($totalItems);
  512. }
  513. if ($runReport)
  514. {
  515. $dataProvider->setRunReport($runReport);
  516. }
  517. return $dataProvider;
  518. }
  519. protected function resolveMetadataBeforeMakingDataProvider(& $metadata)
  520. {
  521. $metadata = SavedReportUtil::resolveSearchAttributeDataByModuleClassNames($metadata,
  522. Report::getReportableModulesClassNamesCurrentUserHasAccessTo());
  523. }
  524. }
  525. ?>