From: <gem...@li...> - 2012-02-15 12:43:09
|
Revision: 476 http://gemstracker.svn.sourceforge.net/gemstracker/?rev=476&view=rev Author: mennodekker Date: 2012-02-15 12:42:58 +0000 (Wed, 15 Feb 2012) Log Message: ----------- Introducing TrackCompletedEvent Modified Paths: -------------- branches/1.5.x/library/changelog.txt branches/1.5.x/library/classes/Gems/Events.php branches/1.5.x/library/classes/Gems/Tracker/Model/TrackModel.php branches/1.5.x/library/classes/Gems/Tracker/RespondentTrack.php branches/1.5.x/library/classes/Gems/Tracker/Snippets/EditTrackEngineSnippetGeneric.php branches/1.5.x/library/configs/db/patches.sql Added Paths: ----------- branches/1.5.x/library/classes/Gems/Event/TrackCompletedEventInterface.php Modified: branches/1.5.x/library/changelog.txt =================================================================== --- branches/1.5.x/library/changelog.txt 2012-02-15 11:29:55 UTC (rev 475) +++ branches/1.5.x/library/changelog.txt 2012-02-15 12:42:58 UTC (rev 476) @@ -1,3 +1,7 @@ +Important changes from 1.5.0 => 1.5.1 +============================================================ +New event introduced: TrackCompletedEvent + Important changes from 1.4.3 => 1.5 ============================================================ Passwords should be set with a project.ini->salt. Salt is now a required project setting! Added: branches/1.5.x/library/classes/Gems/Event/TrackCompletedEventInterface.php =================================================================== --- branches/1.5.x/library/classes/Gems/Event/TrackCompletedEventInterface.php (rev 0) +++ branches/1.5.x/library/classes/Gems/Event/TrackCompletedEventInterface.php 2012-02-15 12:42:58 UTC (rev 476) @@ -0,0 +1,59 @@ +<?php +/** + * Copyright (c) 2011, Erasmus MC + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Erasmus MC nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * @package Gems + * @subpackage Event + * @copyright Copyright (c) 2011 Erasmus MC + * @license New BSD License + * @version $Id: Sample.php 215 2011-07-12 08:52:54Z michiel $ + */ + +/** + * Track completed event interface + * + * Run on completion of an event + * + * @package Gems + * @subpackage Event + * @copyright Copyright (c) 2011 Erasmus MC + * @license New BSD License + * @since Class available since version 1.5.1 + */ +class Gems_Event_TrackCompletedEventInterface extends Gems_Event_EventInterface +{ + /** + * Process the data and return the answers that should be changed. + * + * Storing the changed $values is handled by the calling function. + * + * @param Gems_Tracker_RespondentTrack $track Gems repsondent track object + * @param array $values The values to update the track with, before they were saved + * @param int $userId The current userId + * @return void + */ + public function processTrackCompletion(Gems_Tracker_RespondentTrack $track, &$values, $userId); +} Modified: branches/1.5.x/library/classes/Gems/Events.php =================================================================== --- branches/1.5.x/library/classes/Gems/Events.php 2012-02-15 11:29:55 UTC (rev 475) +++ branches/1.5.x/library/classes/Gems/Events.php 2012-02-15 12:42:58 UTC (rev 476) @@ -48,6 +48,7 @@ { const EVENTS_DIR = 'events'; + const TRACK_COMPLETION_EVENT = 'track/completed'; const ROUND_CHANGED_EVENT = 'round/changed'; const SURVEY_BEFORE_ANSWERING_EVENT = 'survey/beforeanswering'; const SURVEY_COMPLETION_EVENT = 'survey/completed'; @@ -61,6 +62,7 @@ * @var array containing eventType => eventClass for all event classes */ protected $_eventClasses = array( + self::TRACK_COMPLETION_EVENT => 'Gems_Event_TrackCompletedEventInterface', self::ROUND_CHANGED_EVENT => 'Gems_Event_RoundChangedEventInterface', self::SURVEY_BEFORE_ANSWERING_EVENT => 'Gems_Event_SurveyBeforeAnsweringEventInterface', self::SURVEY_COMPLETION_EVENT => 'Gems_Event_SurveyCompletedEventInterface', @@ -174,35 +176,44 @@ /** * - * @param string $eventName - * @return Gems_Event_RoundChangedEventInterface + * @return Gems_Event_SurveyCompletedEventInterface */ - public function loadRoundChangedEvent($eventName) + public function listSurveyBeforeAnsweringEvents() { - return $this->_loadEvent($eventName, self::ROUND_CHANGED_EVENT); + return $this->_listEvents(self::SURVEY_BEFORE_ANSWERING_EVENT); } /** * * @return Gems_Event_SurveyCompletedEventInterface */ - public function listSurveyBeforeAnsweringEvents() + public function listSurveyCompletionEvents() { - return $this->_listEvents(self::SURVEY_BEFORE_ANSWERING_EVENT); + return $this->_listEvents(self::SURVEY_COMPLETION_EVENT); } /** * - * @return Gems_Event_SurveyCompletedEventInterface + * @return Gems_Event_TrackCompletedEventInterface */ - public function listSurveyCompletionEvents() + public function listTrackCompletionEvents() { - return $this->_listEvents(self::SURVEY_COMPLETION_EVENT); + return $this->_listEvents(self::TRACK_COMPLETION_EVENT); } /** * * @param string $eventName + * @return Gems_Event_RoundChangedEventInterface + */ + public function loadRoundChangedEvent($eventName) + { + return $this->_loadEvent($eventName, self::ROUND_CHANGED_EVENT); + } + + /** + * + * @param string $eventName * @return Gems_Event_SurveyBeforeAnsweringEventInterface */ public function loadSurveyBeforeAnsweringEvent($eventName) @@ -219,4 +230,14 @@ { return $this->_loadEvent($eventName, self::SURVEY_COMPLETION_EVENT); } + + /** + * + * @param string $eventName + * @return Gems_Event_TrackCompletedEventInterface + */ + public function loadTrackCompletionEvent($evetName) + { + return $this->_loadEvent($eventName, self::TRACK_COMPLETION_EVENT); + } } Modified: branches/1.5.x/library/classes/Gems/Tracker/Model/TrackModel.php =================================================================== --- branches/1.5.x/library/classes/Gems/Tracker/Model/TrackModel.php 2012-02-15 11:29:55 UTC (rev 475) +++ branches/1.5.x/library/classes/Gems/Tracker/Model/TrackModel.php 2012-02-15 12:42:58 UTC (rev 476) @@ -48,7 +48,18 @@ class Gems_Tracker_Model_TrackModel extends MUtil_Model_TableModel implements MUtil_Registry_TargetInterface { /** - * + * Holds the trackData in array with key trackId, for internal caching use only + * + * @var array + */ + protected $_trackData = array(); + + /** + * @var Gems_Loader + */ + protected $loader; + + /** * @var Gems_Tracker */ protected $tracker; @@ -111,6 +122,12 @@ $this->set('gtr_date_start', 'label', $this->translate->_('From'), 'dateFormat', $translated->dateFormatString, 'formatFunction', $translated->formatDate); $this->set('gtr_date_until', 'label', $this->translate->_('Use until'), 'dateFormat', $translated->dateFormatString, 'formatFunction', $translated->formatDateForever); + if ($detailed) { + $this->setIfExists('gtr_completed_event', + 'label', $this->translate->_('Track completion event'), + 'multiOptions', $this->loader->getEvents()->listTrackCompletionEvents()); + } + return $this; } @@ -147,4 +164,31 @@ { return array_filter(array_keys(get_object_vars($this)), array($this, 'filterRequestNames')); } + + /** + * Get the TrackCompletedEvent for the given trackId + * + * @param int $trackId + * @return Gems_Event_TrackCompletedEventInterface|null + */ + public function getTrackCompletionEvent($trackId) + { + static $trackData = array(); + + if (array_key_exists($trackId, $trackData)) { + $track = $trackData[$trackId]; + } else { + if ($track = $this->loadFirst(array('gtr_id_track' => $trackId))) { + $trackData[$trackId] = $track; + } else { + $track = array(); + } + } + + if (array_key_exists('gtr_completed_event', $track)) { + if (!empty($track['gtr_completed_event'])) { + return $track['gtr_completed_event']; + } + } + } } Modified: branches/1.5.x/library/classes/Gems/Tracker/RespondentTrack.php =================================================================== --- branches/1.5.x/library/classes/Gems/Tracker/RespondentTrack.php 2012-02-15 11:29:55 UTC (rev 475) +++ branches/1.5.x/library/classes/Gems/Tracker/RespondentTrack.php 2012-02-15 12:42:58 UTC (rev 476) @@ -126,7 +126,7 @@ */ public function _checkTrackCount($userId) { - $sqlCount = 'SELECT COUNT(*) AS count, COALESCE(SUM(CASE WHEN gto_completion_time IS NULL THEN 0 ELSE 1 END), 0) AS completed + $sqlCount = 'SELECT COUNT(*) AS count, SUM(CASE WHEN gto_completion_time IS NULL THEN 0 ELSE 1 END) AS completed FROM gems__tokens JOIN gems__reception_codes ON gto_reception_code = grc_id_reception_code AND grc_success = 1 WHERE gto_id_respondent_track = ?'; @@ -142,6 +142,9 @@ ->onlySucces(); $values['gr2t_end_date'] = $tokenSelect->fetchOne(); + + //Handle TrackCompletionEvent + $this->handleTrackCompletion($values, $userId); } else { $values['gr2t_end_date'] = null; } @@ -623,7 +626,25 @@ } /** + * Find out if there are track completion events and delegate to the event if needed * + * @param array $values + * @param int $userId + */ + public function handleTrackCompletion(&$values, $userId) { + // Process any events + $trackEngine = $this->getTrackEngine(); + + //to be backward compatible, first check if the engine has a + if (is_callable(array($trackEngine, 'getTrackCompletionEvent'))) { + if ($event = $this->tracker->getTrackModel()->getTrackCompletionEvent($this->getTrackId())) { + $event->processTrackCompletion($this, $values, $userId); + } + } + } + + /** + * * @return boolean */ public function hasSuccesCode() Modified: branches/1.5.x/library/classes/Gems/Tracker/Snippets/EditTrackEngineSnippetGeneric.php =================================================================== --- branches/1.5.x/library/classes/Gems/Tracker/Snippets/EditTrackEngineSnippetGeneric.php 2012-02-15 11:29:55 UTC (rev 475) +++ branches/1.5.x/library/classes/Gems/Tracker/Snippets/EditTrackEngineSnippetGeneric.php 2012-02-15 12:42:58 UTC (rev 476) @@ -134,6 +134,9 @@ if (! $this->createData) { $bridge->addCheckbox('gtr_active'); } + if ($model->has('gtr_completed_event')) { + $bridge->add('gtr_completed_event'); + } $bridge->addMultiCheckbox('gtr_organizations', 'label', $this->_('Organizations'), 'multiOptions', $this->util->getDbLookup()->getOrganizations(), 'required', true); } Modified: branches/1.5.x/library/configs/db/patches.sql =================================================================== --- branches/1.5.x/library/configs/db/patches.sql 2012-02-15 11:29:55 UTC (rev 475) +++ branches/1.5.x/library/configs/db/patches.sql 2012-02-15 12:42:58 UTC (rev 476) @@ -369,3 +369,9 @@ -- GEMS VERSION: 44 -- PATCH: Add icon field to rounds ALTER TABLE `gems__rounds` ADD gro_icon_file VARCHAR(100) CHARACTER SET 'utf8' COLLATE 'utf8_general_ci' null AFTER `gro_round_description`; + +-- PATCH: Add index for receptioncode to token table +ALTER TABLE `gems__tokens` ADD INDEX ( `gto_reception_code` ) + +-- PATCH: Add track completion event +ALTER TABLE `gems__tracks` ADD gtr_completed_event varchar(64) CHARACTER SET 'utf8' COLLATE 'utf8_general_ci' AFTER gtr_track_class; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |