From: <gem...@li...> - 2011-10-27 15:38:05
|
Revision: 148 http://gemstracker.svn.sourceforge.net/gemstracker/?rev=148&view=rev Author: matijsdejong Date: 2011-10-27 15:37:58 +0000 (Thu, 27 Oct 2011) Log Message: ----------- For #31: gems__staff split into gems__users Temp fix for moving to new password situation while retaining the older versions. DeleteValues moved up to DatabaseModelAbstract. setModelParameters() added to menu for 2 parameter menu items. Modified Paths: -------------- branches/newUser/classes/Gems/Auth.php branches/newUser/classes/Gems/Default/CronAction.php branches/newUser/classes/Gems/Default/IndexAction.php branches/newUser/classes/Gems/Default/OptionAction.php branches/newUser/classes/Gems/Default/RespondentAction.php branches/newUser/classes/Gems/Default/StaffAction.php branches/newUser/classes/Gems/Default/TokenPlanAction.php branches/newUser/classes/Gems/Menu/MenuAbstract.php branches/newUser/classes/Gems/Menu/SubMenuItem.php branches/newUser/classes/Gems/Model/UserModel.php branches/newUser/classes/Gems/User/RespondentUser.php branches/newUser/classes/Gems/User/StaffUser.php branches/newUser/classes/Gems/Util/DbLookup.php branches/newUser/classes/Gems/Validate/GemsPasswordUsername.php branches/newUser/classes/GemsEscort.php branches/newUser/classes/MUtil/Model/DatabaseModelAbstract.php branches/newUser/classes/MUtil/Model/JoinModel.php branches/newUser/classes/MUtil/Model/ModelAbstract.php branches/newUser/classes/MUtil/Model/TableBridgeAbstract.php branches/newUser/classes/MUtil/Model/TableModel.php branches/newUser/configs/db/patches.sql branches/newUser/configs/db/tables/gems__staff.20.sql branches/newUser/configs/db/tables/gems__users.10.sql branches/newUser/controllers/StaffController.php Modified: branches/newUser/classes/Gems/Auth.php =================================================================== --- branches/newUser/classes/Gems/Auth.php 2011-10-27 13:29:59 UTC (rev 147) +++ branches/newUser/classes/Gems/Auth.php 2011-10-27 15:37:58 UTC (rev 148) @@ -98,8 +98,8 @@ * Lookup last failed login and number of failed logins */ try { - $sql = "SELECT gsf_failed_logins, UNIX_TIMESTAMP(gsf_last_failed) - AS gsf_last_failed FROM gems__staff WHERE gsf_login = ?"; + $sql = "SELECT gsu_failed_logins, UNIX_TIMESTAMP(gsu_last_failed) + AS gsu_last_failed FROM gems__users WHERE gsu_login = ?"; $results = $this->db->fetchRow($sql, array($username)); } catch (Zend_Db_Exception $zde) { //If we need to apply a db patch, just use a default value @@ -107,10 +107,10 @@ MUtil_Echo::r(GemsEscort::getInstance()->translate->_('Please update the database')); } - $delay = pow($results['gsf_failed_logins'], $this->_delayFactor); - $remaining = ($results['gsf_last_failed'] + $delay) - time(); + $delay = pow($results['gsu_failed_logins'], $this->_delayFactor); + $remaining = ($results['gsu_last_failed'] + $delay) - time(); - if ($results['gsf_failed_logins'] > 0 && $remaining > 0) { + if ($results['gsu_failed_logins'] > 0 && $remaining > 0) { //$this->_obscureValue = false; $result = $this->_error(self::ERROR_PASSWORD_DELAY, ceil($remaining / 60)); } Modified: branches/newUser/classes/Gems/Default/CronAction.php =================================================================== --- branches/newUser/classes/Gems/Default/CronAction.php 2011-10-27 13:29:59 UTC (rev 147) +++ branches/newUser/classes/Gems/Default/CronAction.php 2011-10-27 15:37:58 UTC (rev 148) @@ -125,7 +125,7 @@ */ protected function getUserLogin($userId) { - return $this->db->fetchOne("SELECT gsf_login FROM gems__staff WHERE gsf_id_user = ?", $userId); + return $this->db->fetchOne("SELECT gsu_login FROM gems__users WHERE gsu_id_user = ?", $userId); } public function indexAction() Modified: branches/newUser/classes/Gems/Default/IndexAction.php =================================================================== --- branches/newUser/classes/Gems/Default/IndexAction.php 2011-10-27 13:29:59 UTC (rev 147) +++ branches/newUser/classes/Gems/Default/IndexAction.php 2011-10-27 15:37:58 UTC (rev 148) @@ -74,7 +74,7 @@ * @return Zend_Auth_Adapter_Interface */ protected function _getAuthAdapter($formValues) { - $adapter = new Zend_Auth_Adapter_DbTable($this->db, 'gems__staff', 'gsf_login', 'gsf_password'); + $adapter = new Zend_Auth_Adapter_DbTable($this->db, 'gems__users', 'gsu_login', 'gsu_password'); $adapter->setIdentity($formValues['userlogin']); $adapter->setCredential($this->escort->passwordHash(null, $formValues['password'], false)); return $adapter; @@ -201,6 +201,19 @@ $adapter = $this->_getAuthAdapter($form->getValues()); $auth = Gems_Auth::getInstance(); $result = $auth->authenticate($adapter, $_POST['userlogin']); + + // Allow login using old password. + if ((! $result->isValid()) && ($userid = $this->db->fetchOne("SELECT gsu_id_user FROM gems__users WHERE gsu_active = 1 AND gsu_password IS NULL AND gsu_login = ?", $_POST['userlogin']))) { + + $adapter = new Zend_Auth_Adapter_DbTable($this->db, 'gems__staff', 'gsf_id_user', 'gsf_password'); + $adapter->setIdentity($userid); + $adapter->setCredential(md5($_POST['password'], false)); + $result = $auth->authenticate($adapter, $_POST['userlogin']); + MUtil_Echo::track('old autho'); + } else { + MUtil_Echo::track('new autho'); + } + if (!$result->isValid()) { // Invalid credentials $errors = $result->getMessages(); @@ -316,19 +329,19 @@ } if ($this->_request->isPost() && $form->isValid($_POST)) { - $sql = $this->db->quoteInto("SELECT gsf_id_user,gsf_email,gsf_reset_key,DATEDIFF(NOW(), gsf_reset_req) AS gsf_days FROM gems__staff WHERE gsf_login = ?", $_POST['userlogin']); + $sql = $this->db->quoteInto("SELECT gsu_id_user, gsf_email, gsu_reset_key, DATEDIFF(NOW(), gsu_reset_requested) AS gsf_days FROM gems__users INNER JOIN gems__staff ON gsu_id_user = gsf_id_user WHERE gsu_login = ?", $_POST['userlogin']); $result = $this->db->fetchRow($sql); if (empty($result) || empty($result['gsf_email'])) { $this->addMessage($this->_('No such user found or no e-mail address known')); - } else if (!empty($result['gsf_reset_key']) && $result['gsf_days'] < 1) { + } else if (!empty($result['gsu_reset_key']) && $result['gsf_days'] < 1) { $this->addMessage($this->_('Reset e-mail already sent, please try again after 24 hours')); } else { $email = $result['gsf_email']; $key = md5(time() . $email); $url = $this->util->getCurrentURI('index/resetpassword/key/' . $key); - $this->db->update('gems__staff', array('gsf_reset_key' => $key, 'gsf_reset_req' => new Zend_Db_Expr('NOW()')), 'gsf_id_user = ' . $result['gsf_id_user']); + $this->db->update('gems__users', array('gsu_reset_key' => $key, 'gsu_reset_requested' => new Zend_Db_Expr('NOW()')), 'gsu_id_user = ' . $result['gsu_id_user']); $mail->setSubject('Password reset requested'); $mail->setBodyText('To reset your password, please click this link: ' . $url); @@ -344,7 +357,7 @@ } } } else if ($key = $this->_request->getParam('key')) { - $sql = $this->db->quoteInto("SELECT gsf_id_user,gsf_email FROM gems__staff WHERE gsf_reset_key = ?", $key); + $sql = $this->db->quoteInto("SELECT gsu_id_user, gsf_email FROM gems__users INNER JOIN gems__staff ON gsu_id_user = gsf_id_user WHERE gsu_reset_key = ?", $key); $result = $this->db->fetchRow($sql); if (!empty($result)) { @@ -360,7 +373,7 @@ try { $mail->send(); $this->addMessage($this->_('An e-mail was sent containing your new password')); - $this->db->update('gems__staff', array('gsf_reset_key' => new Zend_Db_Expr('NULL'), 'gsf_reset_req' => new Zend_Db_Expr('NULL'), 'gsf_password' => $passwordHash), 'gsf_id_user = ' . $result['gsf_id_user']); + $this->db->update('gems__users', array('gsu_reset_key' => new Zend_Db_Expr('NULL'), 'gsu_reset_requested' => new Zend_Db_Expr('NULL'), 'gsu_password' => $passwordHash), 'gsu_id_user = ' . $result['gsu_id_user']); $this->_reroute(array('action' => 'index'), true); } catch (Exception $e) { $this->addMessage($this->_('Unable to send e-mail')); Modified: branches/newUser/classes/Gems/Default/OptionAction.php =================================================================== --- branches/newUser/classes/Gems/Default/OptionAction.php 2011-10-27 13:29:59 UTC (rev 147) +++ branches/newUser/classes/Gems/Default/OptionAction.php 2011-10-27 15:37:58 UTC (rev 148) @@ -61,8 +61,10 @@ */ protected function addFormElements(MUtil_Model_FormBridge $bridge, MUtil_Model_ModelAbstract $model, array $data, $new = false) { + $bridge->addHidden( 'gsu_id_user'); + $bridge->addHidden( 'gsu_id_organization'); $bridge->addHidden( 'gsf_id_user'); - $bridge->addExhibitor('gsf_login', array('size' => 15, 'minlength' => 4)); + $bridge->addExhibitor('gsu_login', array('size' => 15, 'minlength' => 4)); $bridge->addText( 'gsf_first_name'); $bridge->addText( 'gsf_surname_prefix'); $bridge->addText( 'gsf_last_name'); @@ -71,12 +73,11 @@ $bridge->addRadio( 'gsf_gender', 'separator', ''); $bridge->addSelect( 'gsf_iso_lang', array('label' => $this->_('Language'), 'multiOptions' => $this->util->getLocalized()->getLanguages())); - $bridge->addCheckbox( 'gsf_logout_on_survey', 'label', $this->_('Logout on survey'), 'description', $this->_('If checked you will logoff after answering a survey.')); } public function afterSave(array $data, $isNew) { - $this->escort->loadLoginInfo($data['gsf_login']); + $this->escort->loadLoginInfo($data['gsu_login']); } public function changePasswordAction() @@ -86,15 +87,18 @@ *************/ $form = $this->createForm(); - // Veld current password - $element = new Zend_Form_Element_Password('old_password'); - $element->setLabel($this->_('Current password')); - $element->setAttrib('size', 10); - $element->setAttrib('maxlength', 20); - $element->setRenderPassword(true); - $element->setRequired(true); - $element->addValidator(new Gems_Validate_GemsPasswordUsername($this->session->user_login, 'old_password', $this->db)); - $form->addElement($element); + $sql = "SELECT CASE WHEN gsu_password IS NULL THEN 0 ELSE 1 END FROM gems__users WHERE gsu_id_user = ? AND gsu_id_organization = ?"; + if ($this->db->fetchOne($sql, array($this->session->user_id, $this->session->user_organization_id))) { + // Veld current password + $element = new Zend_Form_Element_Password('old_password'); + $element->setLabel($this->_('Current password')); + $element->setAttrib('size', 10); + $element->setAttrib('maxlength', 20); + $element->setRenderPassword(true); + $element->setRequired(true); + $element->addValidator(new Gems_Validate_GemsPasswordUsername($this->session->user_login, 'old_password', $this->db)); + $form->addElement($element); + } // Veld new password $element = new Zend_Form_Element_Password('new_password'); @@ -127,8 +131,9 @@ ****************/ if ($this->_request->isPost() && $form->isValid($_POST)) { - $data['gsf_id_user'] = $this->session->user_id; - $data['gsf_password'] = $this->escort->passwordHash(null,$_POST['new_password']); + $data['gsu_id_user'] = $this->session->user_id; + $data['gsu_id_organization'] = $this->session->user_organization_id; + $data['gsu_password'] = $this->escort->passwordHash(null, $_POST['new_password']); $this->getModel()->save($data); @@ -180,10 +185,10 @@ */ public function createModel($detailed, $action) { - $model = new MUtil_Model_TableModel('gems__staff'); - $model->canCreate = false; + $model = new Gems_Model_UserModel('staff', 'gems__staff', array('gsu_id_user' => 'gsf_id_user'), 'gsf'); + $model->copyKeys(); - $model->set('gsf_login', 'label', $this->_('Login Name')); + $model->set('gsu_login', 'label', $this->_('Login Name')); $model->set('gsf_email', 'label', $this->_('E-Mail')); $model->set('gsf_first_name', 'label', $this->_('First name')); $model->set('gsf_surname_prefix', 'label', $this->_('Surname prefix'), 'description', 'de, van der, \'t, etc...'); @@ -191,14 +196,12 @@ $model->set('gsf_gender', 'label', $this->_('Gender'), 'multiOptions', $this->util->getTranslated()->getGenders()); - Gems_Model::setChangeFieldsByPrefix($model, 'gsf'); - return $model; } public function editAction() { - $this->getModel()->setFilter(array('gsf_id_user' => $this->session->user_id)); + $this->getModel()->setFilter(array('gsu_id_user' => $this->session->user_id)); if ($form = $this->processForm()) { $this->html->h3(sprintf($this->_('Options'), $this->getTopic())); Modified: branches/newUser/classes/Gems/Default/RespondentAction.php =================================================================== --- branches/newUser/classes/Gems/Default/RespondentAction.php 2011-10-27 13:29:59 UTC (rev 147) +++ branches/newUser/classes/Gems/Default/RespondentAction.php 2011-10-27 15:37:58 UTC (rev 148) @@ -326,8 +326,8 @@ $values = $this->db->fetchPairs(" SELECT gsf_id_user, CONCAT(gsf_last_name, ', ', COALESCE(CONCAT(gsf_first_name, ' '), ''), COALESCE(gsf_surname_prefix, '')) AS name - FROM gems__staff INNER JOIN gems__groups ON gsf_id_primary_group = ggp_id_group - WHERE gsf_active=1 AND gsf_id_organization = ? AND ggp_role = 'physician' + FROM (gems__users INNER JOIN gems__staff ON gsu_id_user = gsf_id_user) INNER JOIN gems__groups ON gsf_id_primary_group = ggp_id_group + WHERE gsu_active=1 AND gsu_id_organization = ? AND ggp_role = 'physician' ORDER BY 2", $organizationId); $session->physicians = $values; Modified: branches/newUser/classes/Gems/Default/StaffAction.php =================================================================== --- branches/newUser/classes/Gems/Default/StaffAction.php 2011-10-27 13:29:59 UTC (rev 147) +++ branches/newUser/classes/Gems/Default/StaffAction.php 2011-10-27 15:37:58 UTC (rev 148) @@ -44,7 +44,7 @@ */ class Gems_Default_StaffAction extends Gems_Controller_BrowseEditAction { - public $filterStandard = array('gsf_active' => 1); + public $filterStandard = array('gsu_active' => 1); public $sortKey = array('name' => SORT_ASC); protected $_instanceId; @@ -96,18 +96,27 @@ if ($new) { $model->set('gsf_id_primary_group', 'default', $dbLookup->getDefaultGroup()); } else { - $model->set('gsf_password', 'description', $this->_('Enter only when changing')); - $model->setSaveWhenNotNull('gsf_password'); + $model->set('gsu_password', 'description', $this->_('Enter only when changing')); + $model->setSaveWhenNotNull('gsu_password'); } - $model->setOnSave('gsf_password', array($this->escort, 'passwordHash')); + $model->setOnSave('gsu_password', array($this->escort, 'passwordHash')); $ucfirst = new Zend_Filter_Callback('ucfirst'); - $bridge->addHidden( 'gsf_id_user'); - $bridge->addText( 'gsf_login', 'size', 15, 'minlength', 4, - 'validator', $model->createUniqueValidator('gsf_login')); + $bridge->addHidden( 'gsu_id_user'); + $bridge->addHidden( 'gsf_id_user'); // Needed for e-mail validation + $bridge->addText( 'gsu_login', 'size', 15, 'minlength', 4, + 'validator', $model->createUniqueValidator('gsu_login')); - $bridge->addPassword('gsf_password', + // Can the organization be changed? + if ($this->escort->hasPrivilege('pr.staff.edit.all')) { + $bridge->addHiddenMulti($model->getKeyCopyName('gsu_id_organization')); + $bridge->addSelect('gsu_id_organization'); + } else { + $bridge->addExhibitor('gsu_id_organization'); + } + + $bridge->addPassword('gsu_password', 'label', $this->_('Password'), 'minlength', $this->project->passwords['MinimumLength'], // 'renderPassword', true, @@ -123,11 +132,6 @@ $bridge->addFilter( 'gsf_last_name', $ucfirst); $bridge->addText( 'gsf_email', array('size' => 30))->addValidator('SimpleEmail')->addValidator($model->createUniqueValidator('gsf_email')); - if ($this->escort->hasPrivilege('pr.staff.edit.all')) { - $bridge->addSelect('gsf_id_organization'); - } else { - $bridge->addExhibitor('gsf_id_organization'); - } $bridge->addSelect('gsf_id_primary_group'); $bridge->addCheckbox('gsf_logout_on_survey', 'description', $this->_('If checked the user will logoff when answering a survey.')); @@ -136,15 +140,15 @@ public function afterFormLoad(array &$data, $isNew) { - if (array_key_exists('gsf_login', $data)) { - $this->_instanceId = $data['gsf_login']; + if (array_key_exists('gsu_login', $data)) { + $this->_instanceId = $data['gsu_login']; } $sql = "SELECT ggp_id_group,ggp_role FROM gems__groups WHERE ggp_id_group = " . (int) $data['gsf_id_primary_group']; $groups = $this->db->fetchPairs($sql); if (! ($this->escort->hasPrivilege('pr.staff.edit.all') || - $data['gsf_id_organization'] == $this->escort->getCurrentOrganization())) { + $data['gsu_id_organization'] == $this->escort->getCurrentOrganization())) { throw new Zend_Exception($this->_('You are not allowed to edit this staff member.')); } } @@ -164,18 +168,21 @@ { // MUtil_Model::$verbose = true; - $model = new MUtil_Model_TableModel('gems__staff'); + $model = new Gems_Model_UserModel('staff', 'gems__staff', array('gsu_id_user' => 'gsf_id_user'), 'gsf'); + if ($detailed) { + $model->copyKeys(); + } //$model->resetOrder(); - $model->set('gsf_login', 'label', $this->_('Login')); + $model->set('gsu_login', 'label', $this->_('Login')); $model->set('name', 'label', $this->_('Name'), 'column_expression', "CONCAT(COALESCE(CONCAT(gsf_last_name, ', '), '-, '), COALESCE(CONCAT(gsf_first_name, ' '), ''), COALESCE(gsf_surname_prefix, ''))"); $model->set('gsf_email', 'label', $this->_('E-Mail'), 'itemDisplay', 'MUtil_Html_AElement::ifmail'); if ($detailed || $this->escort->hasPrivilege('pr.staff.see.all')) { - $this->menu->getParameterSource()->offsetSet('gsf_id_organization', $this->escort->getCurrentOrganization()); + $this->menu->getParameterSource()->offsetSet('gsu_id_organization', $this->escort->getCurrentOrganization()); - $model->set('gsf_id_organization', 'label', $this->_('Organization'), + $model->set('gsu_id_organization', 'label', $this->_('Organization'), 'multiOptions', $this->util->getDbLookup()->getOrganizations(), 'default', $this->escort->getCurrentOrganization()); } @@ -188,10 +195,8 @@ $model->set('gsf_logout_on_survey', 'label', $this->_('Logout on survey'), 'multiOptions', $this->util->getTranslated()->getYesNo()); } - $model->setDeleteValues('gsf_active', 0); + $model->setDeleteValues('gsu_active', 0); - Gems_Model::setChangeFieldsByPrefix($model, 'gsf'); - return $model; } @@ -201,8 +206,8 @@ if ($this->escort->hasPrivilege('pr.staff.see.all')) { // Select organization - $options = array('' => $this->_('(all organizations)')) + $this->getModel()->get('gsf_id_organization', 'multiOptions'); - $select = new Zend_Form_Element_Select('gsf_id_organization', array('multiOptions' => $options)); + $options = array('' => $this->_('(all organizations)')) + $this->getModel()->get('gsu_id_organization', 'multiOptions'); + $select = new Zend_Form_Element_Select('gsu_id_organization', array('multiOptions' => $options)); // Position as second element $search = array_shift($elements); @@ -227,7 +232,7 @@ $filter = parent::getDataFilter($data); if (! $this->escort->hasPrivilege('pr.staff.see.all')) { - $filter['gsf_id_organization'] = $this->escort->getCurrentOrganization(); + $filter['gsu_id_organization'] = $this->escort->getCurrentOrganization(); } return $filter; } @@ -257,8 +262,8 @@ // Model filter has now been set. $data = $this->getModel()->loadFirst(); - $this->_setParam('gsf_id_organization', $data['gsf_id_organization']); - $this->menu->getParameterSource()->offsetSet('gsf_id_organization', $data['gsf_id_organization']); + $this->_setParam('gsu_id_organization', $data['gsu_id_organization']); + $this->menu->getParameterSource()->offsetSet('gsu_id_organization', $data['gsu_id_organization']); } return parent::getShowTable($columns, $filter, $sort); } Modified: branches/newUser/classes/Gems/Default/TokenPlanAction.php =================================================================== --- branches/newUser/classes/Gems/Default/TokenPlanAction.php 2011-10-27 13:29:59 UTC (rev 147) +++ branches/newUser/classes/Gems/Default/TokenPlanAction.php 2011-10-27 15:37:58 UTC (rev 148) @@ -351,9 +351,9 @@ COALESCE(gems__staff.gsf_first_name, ''), COALESCE(CONCAT(' ', gems__staff.gsf_surname_prefix), '') ) AS gsf_name - FROM gems__staff INNER JOIN gems__respondent2track ON gsf_id_user = gr2t_created_by + FROM (gems__users INNER JOIN gems__staff ON gsu_id_user = gsf_id_user) INNER JOIN gems__respondent2track ON gsu_id_user = gr2t_created_by WHERE gr2t_id_organization = $orgId AND - gsf_active = 1 AND + gsu_active = 1 AND gr2t_active = 1"; $elements[] = $this->_createSelectElement('gr2t_created_by', $sql, $this->_('(all staff)')); Modified: branches/newUser/classes/Gems/Menu/MenuAbstract.php =================================================================== --- branches/newUser/classes/Gems/Menu/MenuAbstract.php 2011-10-27 13:29:59 UTC (rev 147) +++ branches/newUser/classes/Gems/Menu/MenuAbstract.php 2011-10-27 15:37:58 UTC (rev 148) @@ -381,13 +381,12 @@ $page = $this->addPage($label, 'pr.staff', 'staff', 'index', $other); $page->addAutofilterAction(); $page->addCreateAction(); - $page->addShowAction(); - if ($this->escort->hasPrivilege('pr.staff.edit.all')) { - $page->addEditAction(); - $page->addDeleteAction(); - } else { - $page->addEditAction()->setParameterFilter('gsf_id_organization', $this->escort->getCurrentOrganization()); - $page->addDeleteAction()->setParameterFilter('gsf_id_organization', $this->escort->getCurrentOrganization()); + $page->addShowAction()->setModelParameters(2); + $editPage = $page->addEditAction()->setModelParameters(2); + $delPage = $page->addDeleteAction()->setModelParameters(2); + if (! $this->escort->hasPrivilege('pr.staff.edit.all')) { + $editPage->setParameterFilter('gsu_id_organization', $this->escort->getCurrentOrganization()); + $delPage->setParameterFilter('gsu_id_organization', $this->escort->getCurrentOrganization()); } return $page; Modified: branches/newUser/classes/Gems/Menu/SubMenuItem.php =================================================================== --- branches/newUser/classes/Gems/Menu/SubMenuItem.php 2011-10-27 13:29:59 UTC (rev 147) +++ branches/newUser/classes/Gems/Menu/SubMenuItem.php 2011-10-27 15:37:58 UTC (rev 148) @@ -417,7 +417,7 @@ } $menu = $this->addAction($label, $privilege, 'delete', $other); - $menu->addParameters(MUtil_Model::REQUEST_ID); + $menu->setModelParameters(1); return $menu; } @@ -436,7 +436,7 @@ } $menu = $this->addAction($label, $privilege, 'edit', $other); - $menu->addParameters(MUtil_Model::REQUEST_ID); + $menu->setModelParameters(1); return $menu; } @@ -475,6 +475,17 @@ return $this; } + /** + * Add required parameters - shown in the url - for this + * menu item. + * + * Numeric array keys are changed into the same string as the + * array value. + * + * @param mixed $arrayOrKey1 MUtil_Ra::pairs named array + * @param mixed $key2 + * @return Gems_Menu_SubMenuItem (continuation pattern) + */ public function addNamedParameters($arrayOrKey1 = null, $altName1 = null) { $params = MUtil_Ra::pairs(func_get_args()); @@ -483,16 +494,8 @@ $this->_parameters = new MUtil_Lazy_ArrayWrap(); } foreach ($params as $param => $name) { - if (! $name) { - if (is_int($param)) { - throw new Zend_Exception('Invalid integer required parameter key with empty name.'); - } else { - $name = $param; - } - } else { - if (is_int($param)) { - $param = $name; - } + if (is_int($param)) { + $param = $name; } $this->_requiredParameters[$param] = $name; $this->_parameters[$param] = MUtil_Lazy::L($name); @@ -546,7 +549,7 @@ } $menu = $this->addAction($label, $privilege, 'show', $other); - $menu->addParameters(MUtil_Model::REQUEST_ID); + $menu->setModelParameters(1); return $menu; } @@ -755,6 +758,41 @@ return $this; } + /** + * Defines the number of named parameters using the model naming + * convention: id=x or id1=x id2=y + * + * @see setNamedParamenters() + * + * @param int $idCount The number of parameters to define + * @return Gems_Menu_SubMenuItem (continuation pattern) + */ + public function setModelParameters($idCount) + { + $params = array(); + if (1 == $idCount) { + $params[MUtil_Model::REQUEST_ID] = MUtil_Model::REQUEST_ID; + } else { + for ($i = 1; $i <= $idCount; $i++) { + $params[MUtil_Model::REQUEST_ID . $i] = MUtil_Model::REQUEST_ID . $i; + } + } + $this->setNamedParameters($params); + + return $this; + } + + /** + * Set the required parameters - shown in the url - for this + * menu item. + * + * Numeric array keys are changed into the same string as the + * array value. + * + * @param mixed $arrayOrKey1 MUtil_Ra::pairs named array + * @param mixed $key2 + * @return Gems_Menu_SubMenuItem (continuation pattern) + */ public function setNamedParameters($arrayOrKey1 = null, $key2 = null) { $params = MUtil_Ra::pairs(func_get_args()); Modified: branches/newUser/classes/Gems/Model/UserModel.php =================================================================== --- branches/newUser/classes/Gems/Model/UserModel.php 2011-10-27 13:29:59 UTC (rev 147) +++ branches/newUser/classes/Gems/Model/UserModel.php 2011-10-27 15:37:58 UTC (rev 148) @@ -82,6 +82,8 @@ */ protected function _createUserId() { + $db = $this->getAdapter(); + $max = $this->userIdLen; do { @@ -92,7 +94,7 @@ // Make it a number $out = intval($out); - } while ($this->db->fetchOne('SELECT gsu_id_user FROM gems__users WHERE gsu_id_user = ?', $out)); + } while ($db->fetchOne('SELECT gsu_id_user FROM gems__users WHERE gsu_id_user = ?', $out)); return $out; } @@ -112,6 +114,6 @@ $newValues['gsu_id_user'] = $this->_createUserId(); } - parent::save($newValues, $filter, $saveTables); + return parent::save($newValues, $filter, $saveTables); } } Modified: branches/newUser/classes/Gems/User/RespondentUser.php =================================================================== --- branches/newUser/classes/Gems/User/RespondentUser.php 2011-10-27 13:29:59 UTC (rev 147) +++ branches/newUser/classes/Gems/User/RespondentUser.php 2011-10-27 15:37:58 UTC (rev 148) @@ -38,6 +38,18 @@ /** * * +-- PATCH: New user login structure +INSERT INTO gems__users (gsu_id_user, gsu_login, gsu_id_organization, gsu_user_class, gsu_active, + gsu_password, gsu_failed_logins, gsu_last_failed, gsu_reset_key, gsu_reset_requested, gsu_reset_required, + gsu_changed, gsu_changed_by, gsu_created, gsu_created_by) + SELECT grs_id_user, gr2o_patient_nr, gr2o_id_organization, 'RespondentUser', CASE WHEN gr2o_reception_code = 'OK' THEN 1 ELSE 0 END, + NULL, 0, NULL, NULL, NULL, 0, + gr2o_changed, gr2o_changed_by, gr2o_created, gr2o_created_by + FROM gems__respondents INNER JOIN gems__respondent2org ON grs_id_user = gr2o_id_user + INNER JOIN gems__organizations ON gr2o_id_organization = gor_id_organization + WHERE gor_name = 'HCU / Xpert Clinic'; + + * * @package Gems * @subpackage User * @copyright Copyright (c) 2011 Erasmus MC Modified: branches/newUser/classes/Gems/User/StaffUser.php =================================================================== --- branches/newUser/classes/Gems/User/StaffUser.php 2011-10-27 13:29:59 UTC (rev 147) +++ branches/newUser/classes/Gems/User/StaffUser.php 2011-10-27 15:37:58 UTC (rev 148) @@ -57,11 +57,11 @@ $select->from('gems__users') ->join('gems__staff', 'gsu_login = gsf_id_user') ->join('gems__groups', 'gsf_id_primary_group = ggp_id_group') - ->join('gems__organizations', 'gsf_id_organization = gor_id_organization') + ->join('gems__organizations', 'gsu_id_organization = gor_id_organization') ->where('ggp_group_active = 1') ->where('gor_active = 1') - ->where('gsf_active = 1') - ->where('gsf_login = ?', $this->getLoginName()) + ->where('gsu_active = 1') + ->where('gsu_login = ?', $this->getLoginName()) ->limit(1); return $select; Modified: branches/newUser/classes/Gems/Util/DbLookup.php =================================================================== --- branches/newUser/classes/Gems/Util/DbLookup.php 2011-10-27 13:29:59 UTC (rev 147) +++ branches/newUser/classes/Gems/Util/DbLookup.php 2011-10-27 15:37:58 UTC (rev 148) @@ -105,7 +105,7 @@ if (! $data) { $data = $this->db->fetchPairs("SELECT gsf_id_user, CONCAT(COALESCE(gsf_last_name, '-'), ', ', COALESCE(gsf_first_name, ''), COALESCE(CONCAT(' ', gsf_surname_prefix), '')) - FROM gems__staff WHERE gsf_active = 1 ORDER BY gsf_last_name, gsf_first_name, gsf_surname_prefix"); + FROM gems__users INNER JOIN gems__staff ON gsu_id_user = gsf_id_user WHERE gsu_active = 1 ORDER BY gsf_last_name, gsf_first_name, gsf_surname_prefix"); } return $data; Modified: branches/newUser/classes/Gems/Validate/GemsPasswordUsername.php =================================================================== --- branches/newUser/classes/Gems/Validate/GemsPasswordUsername.php 2011-10-27 13:29:59 UTC (rev 147) +++ branches/newUser/classes/Gems/Validate/GemsPasswordUsername.php 2011-10-27 15:37:58 UTC (rev 148) @@ -86,7 +86,7 @@ */ public function __construct($usernameField, $passwordField, Zend_Db_Adapter_Abstract $adapter = null, $delayFactor = null) { - parent::__construct('gems__staff', 'gsf_login', null, $adapter); + parent::__construct('gems__users', 'gsu_login', null, $adapter); $this->_usernameField = $usernameField; $this->_passwordField = $passwordField; @@ -137,7 +137,7 @@ } } - $condition = $this->_adapter->quoteIdentifier('gsf_password') . ' = ?'; + $condition = $this->_adapter->quoteIdentifier('gsu_password') . ' = ?'; $this->_exclude = $this->_adapter->quoteInto($condition, md5($password)); try { @@ -145,8 +145,8 @@ * Lookup last failed login and number of failed logins */ try { - $sql = "SELECT gsf_failed_logins, UNIX_TIMESTAMP(gsf_last_failed) - AS gsf_last_failed FROM {$this->_table} WHERE gsf_login = ?"; + $sql = "SELECT gsu_failed_logins, UNIX_TIMESTAMP(gsu_last_failed) + AS gsu_last_failed FROM {$this->_table} WHERE gsu_login = ?"; $results = $this->_adapter->fetchRow($sql, array($username)); } catch (Zend_Db_Exception $zde) { //If we need to apply a db patch, just use a default value @@ -154,10 +154,10 @@ MUtil_Echo::r(GemsEscort::getInstance()->translate->_('Please update the database')); } - $delay = pow($results['gsf_failed_logins'], $this->_delayFactor); - $remaining = ($results['gsf_last_failed'] + $delay) - time(); + $delay = pow($results['gsu_failed_logins'], $this->_delayFactor); + $remaining = ($results['gsu_last_failed'] + $delay) - time(); - if ($results['gsf_failed_logins'] > 0 && $remaining > 0) { + if ($results['gsu_failed_logins'] > 0 && $remaining > 0) { $this->_obscureValue = false; $this->_error(self::ERROR_PASSWORD_DELAY, ceil($remaining / 60)); return false; Modified: branches/newUser/classes/GemsEscort.php =================================================================== --- branches/newUser/classes/GemsEscort.php 2011-10-27 13:29:59 UTC (rev 147) +++ branches/newUser/classes/GemsEscort.php 2011-10-27 15:37:58 UTC (rev 148) @@ -927,7 +927,7 @@ * Reset number of failed logins */ try { - $sql = "UPDATE gems__staff SET gsf_failed_logins = 0, gsf_last_failed = NULL WHERE gsf_login = ?"; + $sql = "UPDATE gems__users SET gsu_failed_logins = 0, gsu_last_failed = NULL WHERE gsu_login = ?"; $this->db->query($sql, array($_POST['userlogin'])); } catch (Exception $e) { // swallow exception @@ -941,7 +941,7 @@ */ try { if (isset($_POST['userlogin'])) { - $sql = "UPDATE gems__staff SET gsf_failed_logins = gsf_failed_logins + 1, gsf_last_failed = NOW() WHERE gsf_login = ?"; + $sql = "UPDATE gems__users SET gsu_failed_logins = gsu_failed_logins + 1, gsu_last_failed = NOW() WHERE gsu_login = ?"; $this->db->query($sql, array($_POST['userlogin'])); } } catch (Exception $e) { @@ -1097,12 +1097,7 @@ //If user is current user, read from session $allowedOrganizations = $this->session->allowedOrgs; } else { - //Here we read all allowed orgs for the user - $model = new MUtil_Model_TableModel('gems__organizations'); - $data = $model->load(); - foreach ($data as $org) { - $allowedOrganizations[$org['gor_id_organization']] = $org['gor_name']; - } + $allowedOrganizations = $this->db->fetchPairs("SELECT gor_id_organization, gor_name FROM gems__organizations WHERE gor_active = 1 ORDER BY gor_name"); } return $allowedOrganizations; @@ -1309,22 +1304,24 @@ * compatibility */ $select = new Zend_Db_Select($this->db); - $select->from('gems__staff', array('user_id'=>'gsf_id_user', - 'user_login'=>'gsf_login', - //don't expose the password hash - //'user_password'=>'gsf_password', - 'user_email'=>'gsf_email', - 'user_group'=>'gsf_id_primary_group', - 'user_locale'=>'gsf_iso_lang', - 'user_logout'=>'gsf_logout_on_survey')) + $select->from('gems__users', array('user_id' => 'gsu_id_user', + 'user_login' => 'gsu_login', + //don't expose the password hash + //'user_password'=>'gsu_password', + )) + ->join('gems__staff', 'gsu_id_user = gsf_id_user', array( + 'user_email'=>'gsf_email', + 'user_group'=>'gsf_id_primary_group', + 'user_locale'=>'gsf_iso_lang', + 'user_logout'=>'gsf_logout_on_survey')) ->columns(array('user_name'=>"(concat(coalesce(concat(`gems__staff`.`gsf_first_name`,_utf8' '),_utf8''),coalesce(concat(`gems__staff`.`gsf_surname_prefix`,_utf8' '),_utf8''),coalesce(`gems__staff`.`gsf_last_name`,_utf8'')))")) ->join('gems__groups', 'gsf_id_primary_group = ggp_id_group', array('user_role'=>'ggp_role')) - ->join('gems__organizations', 'gsf_id_organization = gor_id_organization', + ->join('gems__organizations', 'gsu_id_organization = gor_id_organization', array('user_organization_id'=>'gor_id_organization', 'user_organization_name'=>'gor_name')) ->where('ggp_group_active = ?', 1) ->where('gor_active = ?', 1) - ->where('gsf_active = ?', 1) - ->where('gsf_login = ?', $userName) + ->where('gsu_active = ?', 1) + ->where('gsu_login = ?', $userName) ->limit(1); //For a multi-layout project we need to select the appropriate style too @@ -1348,7 +1345,11 @@ public function passwordHash($name, $value, $new) { - return md5($value, false); + if (isset($this->project->salt)) { + return md5($this->project->salt . $value, false); + } else { + return md5($value, false); + } } /** Modified: branches/newUser/classes/MUtil/Model/DatabaseModelAbstract.php =================================================================== --- branches/newUser/classes/MUtil/Model/DatabaseModelAbstract.php 2011-10-27 13:29:59 UTC (rev 147) +++ branches/newUser/classes/MUtil/Model/DatabaseModelAbstract.php 2011-10-27 15:37:58 UTC (rev 148) @@ -60,6 +60,11 @@ // If there exists a table containing two fields that map to these, shoot the table designer!!! /** + * @var array When specified delete() updates the selected rows with these values, instead of physically deleting the rows. + */ + protected $_deleteValues; + + /** * Child classes may technically be able or not able to add extra rows, * but the data model or specific circumstances may require a specific * instance of that class to deviate from the default. @@ -501,6 +506,21 @@ return $this; } + /** + * Adding DeleteValues means delete() updates the selected rows with these values, instead of physically deleting the rows. + * + * @param string|array $arrayOrField1 MUtil_Ra::pairs() arguments + * @param mxied $value1 + * @param string $field2 + * @param mixed $key2 + * @return MUtil_Model_TableModel + */ + public function addDeleteValues($arrayOrField1 = null, $value1 = null, $field2 = null, $key2 = null) + { + $args = MUtil_Ra::pairs(func_get_args()); + $this->_deleteValues = $args + $this->_deleteValues; + return $this; + } /** * Makes a copy for each key item in the model using $this->getKeyCopyName() @@ -521,7 +541,6 @@ return $this; } - /** * Creates a validator that checks that this value is used in no other * row in the table of the $name field, except that row itself. @@ -600,11 +619,12 @@ return $this->canCreate; } - public function getKeyCopier() - { - return $this->keyCopier; - } - + /** + * Returns the key copy name for a field. + * + * @param string $name + * @return string + */ public function getKeyCopyName($name) { return sprintf($this->keyCopier, $name); @@ -722,6 +742,22 @@ return $this; } + /** + * Setting DeleteValues means delete() updates the selected rows with these values, instead of physically deleting the rows. + * + * @param string|array $arrayOrField1 MUtil_Ra::pairs() arguments + * @param mxied $value1 + * @param string $field2 + * @param mixed $key2 + * @return MUtil_Model_TableModel + */ + public function setDeleteValues($arrayOrField1 = null, $value1 = null, $field2 = null, $key2 = null) + { + $args = MUtil_Ra::pairs(func_get_args()); + $this->_deleteValues = $args; + return $this; + } + public function setKeysToTable($keysOrTableName) { if (is_string($keysOrTableName)) { Modified: branches/newUser/classes/MUtil/Model/JoinModel.php =================================================================== --- branches/newUser/classes/MUtil/Model/JoinModel.php 2011-10-27 13:29:59 UTC (rev 147) +++ branches/newUser/classes/MUtil/Model/JoinModel.php 2011-10-27 15:37:58 UTC (rev 148) @@ -174,39 +174,44 @@ } $filter = $this->_checkFilterUsed($filter); - $changed = 0; - foreach ($saveTables as $table_name) { - $table_filter = array(); - $delete = true; + if ($this->_deleteValues) { + MUtil_Echo::track($filter); + $changed = $this->save($this->_deleteValues, $filter, $saveTables); + } else { + $changed = 0; + foreach ($saveTables as $table_name) { + $table_filter = array(); + $delete = true; - // Find per table key filters - foreach ($this->_getKeysFor($table_name) as $key) { - if (isset($filter[$key])) { - $table_filter[$key] = $filter[$key]; - } else { - // If key values are missing, do not delete. - $delete = false; - foreach ($this->_joinFields as $source => $target) { - $found = null; + // Find per table key filters + foreach ($this->_getKeysFor($table_name) as $key) { + if (isset($filter[$key])) { + $table_filter[$key] = $filter[$key]; + } else { + // If key values are missing, do not delete. + $delete = false; + foreach ($this->_joinFields as $source => $target) { + $found = null; - if ($source === $key) { - $found = $target; - } elseif ($target == $key) { - $found = $source; + if ($source === $key) { + $found = $target; + } elseif ($target == $key) { + $found = $source; + } + if ($found && isset($filter[$found])) { + /// Found after all. + $delete = true; + $table_filter[$key] = $filter[$found]; + break; + } } - if ($found && isset($filter[$found])) { - /// Found after all. - $delete = true; - $table_filter[$key] = $filter[$found]; - break; - } } } - } - // MUtil_Echo::r($table_filter, $table_name); - if ($delete && $table_filter) { - $changed = max($changed, $this->_deleteTableData($this->_tables[$table_name], $table_filter)); + // MUtil_Echo::r($table_filter, $table_name); + if ($delete && $table_filter) { + $changed = max($changed, $this->_deleteTableData($this->_tables[$table_name], $table_filter)); + } } } @@ -239,6 +244,8 @@ * @param array $newValues The values to store for a single model item. * @param array $filter If the filter contains old key values these are used * to decide on update versus insert. + * @param array $saveTables Optional array containing the table names to save, + * otherwise the tables set to save at model level will be saved. * @return array The values as they are after saving (they may change). */ public function save(array $newValues, array $filter = null, array $saveTables = null) Modified: branches/newUser/classes/MUtil/Model/ModelAbstract.php =================================================================== --- branches/newUser/classes/MUtil/Model/ModelAbstract.php 2011-10-27 13:29:59 UTC (rev 147) +++ branches/newUser/classes/MUtil/Model/ModelAbstract.php 2011-10-27 15:37:58 UTC (rev 148) @@ -543,13 +543,22 @@ return $href; } + /** + * Returns an array containing the currently defined keys for this + * model. + * + * When no keys are defined, the keys are derived from the model. + * + * @param boolean $reset If true, derives the key from the model. + * @return array + */ public function getKeys($reset = false) { if ((! $this->_keys) || $reset) { $keys = array(); foreach ($this->_model as $name => $info) { if (isset($info['key']) && $info['key']) { - $keys[$name] = $name; + $keys[] = $name; } } $this->setKeys($keys); @@ -1025,12 +1034,29 @@ return false; } + /** + * Sets the keys, processing the array key. + * + * When an array key is numeric MUtil_Model::REQUEST_ID is used. + * When there is more than one key a increasing number is added to + * MUtil_Model::REQUEST_ID starting with 1. + * + * String key names ar eleft as is. + * + * @param array $keys + * @return MUtil_Model_ModelAbstract (continuation pattern) + */ public function setKeys(array $keys) { $this->_keys = array(); if (count($keys) == 1) { - $this->_keys[MUtil_Model::REQUEST_ID] = reset($keys); + $name = reset($keys); + if (is_numeric(key($keys))) { + $this->_keys[MUtil_Model::REQUEST_ID] = $name; + } else { + $this->_keys[key($keys)] = $name; + } } else { $i = 1; foreach ($keys as $idx => $name) { @@ -1081,15 +1107,6 @@ return $this; } - /* appears to be not implemented or at least not functionale so removing - public function setOnLoad($name, $callableOrConstant) - - { - $this->set($name, self::SAVE_TRANSFORMER, $callableOrConstant); - return $this; - } - */ - public function setOnSave($name, $callableOrConstant) { $this->set($name, self::SAVE_TRANSFORMER, $callableOrConstant); Modified: branches/newUser/classes/MUtil/Model/TableBridgeAbstract.php =================================================================== --- branches/newUser/classes/MUtil/Model/TableBridgeAbstract.php 2011-10-27 13:29:59 UTC (rev 147) +++ branches/newUser/classes/MUtil/Model/TableBridgeAbstract.php 2011-10-27 15:37:58 UTC (rev 148) @@ -1,33 +1,33 @@ <?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. - */ - + /** + * 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. + */ + +/** * @author Matijs de Jong * @since 1.0 * @version 1.1 @@ -39,7 +39,7 @@ protected $model; protected $modelKeys; protected $repeater; - + /** * The actual table * @@ -231,9 +231,9 @@ /** * Set the model to use in the tablebridge - * + * * @param MUtil_Model_ModelAbstract $model - * @return MUtil_Model_TableBridgeAbstract + * @return MUtil_Model_TableBridgeAbstract */ public function setModel(MUtil_Model_ModelAbstract $model) { Modified: branches/newUser/classes/MUtil/Model/TableModel.php =================================================================== --- branches/newUser/classes/MUtil/Model/TableModel.php 2011-10-27 13:29:59 UTC (rev 147) +++ branches/newUser/classes/MUtil/Model/TableModel.php 2011-10-27 15:37:58 UTC (rev 148) @@ -47,11 +47,6 @@ class MUtil_Model_TableModel extends MUtil_Model_DatabaseModelAbstract { /** - * @var array When specified delete() updates the selected rows with these values, instead of physically deleting the rows. - */ - protected $_deleteValues; - - /** * * @var Zend_Db_Table_Abstract */ @@ -73,22 +68,6 @@ } /** - * Adding DeleteValues means delete() updates the selected rows with these values, instead of physically deleting the rows. - * - * @param string|array $arrayOrField1 MUtil_Ra::pairs() arguments - * @param mxied $value1 - * @param string $field2 - * @param mixed $key2 - * @return MUtil_Model_TableModel - */ - public function addDeleteValues($arrayOrField1 = null, $value1 = null, $field2 = null, $key2 = null) - { - $args = MUtil_Ra::pairs(func_get_args()); - $this->_deleteValues = $args + $this->_deleteValues; - return $this; - } - - /** * Delete items from the model * * @param mixed $filter True to use the stored filter, array to specify a different filter @@ -113,16 +92,6 @@ } /** - * Returns the DeleteValues used to update selected rows on delete. - * - * @return array|null - */ - public function getDeleteValues() - { - return $this->_deleteValues; - } - - /** * Returns a Zend_Db_Table_Select object to work with * * @return Zend_Db_Table_Select @@ -138,26 +107,18 @@ } } + /** + * Save a single model item. + * + * @param array $newValues The values to store for a single model item. + * @param array $filter If the filter contains old key values these are used + * to decide on update versus insert. + * @return array The values as they are after saving (they may change). + */ public function save(array $newValues, array $filter = null) { // $this->_saveTableData returns the new row values, including any automatic changes. // add $newValues to throw nothing away. return $this->_saveTableData($this->_table, $newValues, $filter) + $newValues; } - - /** - * Setting DeleteValues means delete() updates the selected rows with these values, instead of physically deleting the rows. - * - * @param string|array $arrayOrField1 MUtil_Ra::pairs() arguments - * @param mxied $value1 - * @param string $field2 - * @param mixed $key2 - * @return MUtil_Model_TableModel - */ - public function setDeleteValues($arrayOrField1 = null, $value1 = null, $field2 = null, $key2 = null) - { - $args = MUtil_Ra::pairs(func_get_args()); - $this->_deleteValues = $args; - return $this; - } } Modified: branches/newUser/configs/db/patches.sql =================================================================== --- branches/newUser/configs/db/patches.sql 2011-10-27 13:29:59 UTC (rev 147) +++ branches/newUser/configs/db/patches.sql 2011-10-27 15:37:58 UTC (rev 148) @@ -221,9 +221,9 @@ INSERT INTO gems__users (gsu_id_user, gsu_login, gsu_id_organization, gsu_user_class, gsu_active, gsu_password, gsu_failed_logins, gsu_last_failed, gsu_reset_key, gsu_reset_requested, gsu_reset_required, gsu_changed, gsu_changed_by, gsu_created, gsu_created_by) - SELECT grs_id_user, gr2o_patient_nr, gr2o_id_organization, 'RespondentUser', CASE WHEN gr2o_reception_code = 'OK' THEN 1 ELSE 0 END, - NULL, 0, NULL, NULL, NULL, 0, - gr2o_changed, gr2o_changed_by, gr2o_created, gr2o_created_by - FROM gems__respondents INNER JOIN gems__respondent2org ON grs_id_user = gr2o_id_user - INNER JOIN gems__organizations ON gr2o_id_organization = gor_id_organization - WHERE gor_name = 'HCU / Xpert Clinic'; + SELECT gsf_id_user, gsf_login, gsf_id_organization, 'StaffUser', gsf_active, + NULL, gsf_failed_logins, gsf_last_failed, gsf_reset_key, 0, 1, + gsf_changed, gsf_changed_by, gsf_created, gsf_created_by + FROM gems__staff; + +ALTER TABLE `gems__staff` CHANGE `gsf_id_user` `gsf_id_user` BIGINT( 20 ) UNSIGNED NOT NULL; Modified: branches/newUser/configs/db/tables/gems__staff.20.sql =================================================================== --- branches/newUser/configs/db/tables/gems__staff.20.sql 2011-10-27 13:29:59 UTC (rev 147) +++ branches/newUser/configs/db/tables/gems__staff.20.sql 2011-10-27 15:37:58 UTC (rev 148) @@ -2,20 +2,23 @@ -- Table containing the project staff -- CREATE TABLE if not exists gems__staff ( - gsf_id_user bigint unsigned not null auto_increment, + gsf_id_user bigint unsigned not null references gems__users (gsu_id_user), + -- depreciated gsf_login varchar(20) CHARACTER SET 'utf8' COLLATE 'utf8_general_ci' not null unique key, gsf_password varchar(32) CHARACTER SET 'utf8' COLLATE 'utf8_general_ci' not null, - gsf_active boolean not null default 1, gsf_failed_logins int(11) unsigned not null default 0, gsf_last_failed timestamp null, + gsf_id_organization bigint not null + references gems__organizations (gor_id_organization), + -- end depreciated + + gsf_id_primary_group bigint unsigned references gems__groups (ggp_id_group), - gsf_id_organization bigint not null - references gems__organizations (gor_id_organization), gsf_iso_lang char(2) CHARACTER SET 'utf8' COLLATE 'utf8_general_ci' not null default 'nl' references gems__languages (gml_iso_lang), gsf_logout_on_survey boolean not null default 0, Modified: branches/newUser/configs/db/tables/gems__users.10.sql =================================================================== --- branches/newUser/configs/db/tables/gems__users.10.sql 2011-10-27 13:29:59 UTC (rev 147) +++ branches/newUser/configs/db/tables/gems__users.10.sql 2011-10-27 15:37:58 UTC (rev 148) @@ -3,9 +3,9 @@ -- CREATE TABLE if not exists gems__users ( gsu_id_user bigint unsigned not null, + gsu_id_organization bigint not null references gems__organizations (gor_id_organization), gsu_login varchar(30) CHARACTER SET 'utf8' COLLATE 'utf8_general_ci' not null, - gsu_id_o... [truncated message content] |