Index: user_mailman_register.install =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/user_mailman_register/user_mailman_register.install,v retrieving revision 1.8.2.5.2.4 diff -u -r1.8.2.5.2.4 user_mailman_register.install --- user_mailman_register.install 6 Jun 2009 09:51:22 -0000 1.8.2.5.2.4 +++ user_mailman_register.install 17 Sep 2009 15:22:12 -0000 @@ -30,6 +30,7 @@ db_add_field($ret, 'mailman_users', 'lchecktime', array('type' =>'int', 'not null' => TRUE, 'default' => 0, 'description' => t("Last Mailman subscription check time"))); db_add_field($ret, 'mailman_lists', 'defaultnewreg', array('type' =>'int', 'not null' => TRUE, 'default' => 0, 'description' => t("Default choice in user registration form"))); db_add_field($ret, 'mailman_users', 'lmod', array('type' =>'int', 'not null' => TRUE, 'default' => 0, 'description' => t("Moderation flag"))); + db_add_field($ret, 'mailman_lists', 'role_sync', array('type' =>'int', 'not null' => TRUE, 'default' => 1, 'description' => t("Enable/disable subscription synchronization"))); return $ret; } @@ -56,6 +57,7 @@ db_drop_field($ret, 'mailman_users', 'lchecktime'); db_drop_field($ret, 'mailman_lists', 'defaultnewreg'); db_drop_field($ret, 'mailman_users', 'lmod'); + db_drop_field($ret, 'mailman_lists', 'role_sync'); return $ret; } @@ -87,4 +89,16 @@ $ret = array(); db_add_field($ret, 'mailman_users', 'lmod', array('type' =>'int', 'not null' => TRUE, 'default' => 0, 'description' => t("Moderation flag"))); return $ret; +} + +function user_mailman_register_update_6005() { + $ret = array(); + db_add_field($ret, 'mailman_users', 'lmod', array('type' =>'int', 'not null' => TRUE, 'default' => 0, 'description' => t("Moderation flag"))); + return $ret; +} + +function user_mailman_register_update_6006() { + $ret = array(); + db_add_field($ret, 'mailman_lists', 'role_sync', array('type' =>'int', 'not null' => TRUE, 'default' => 1, 'description' => t("Enable/disable subscription synchronization"))); + return $ret; } \ No newline at end of file Index: user_mailman_register.module =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/user_mailman_register/user_mailman_register.module,v retrieving revision 1.30.2.21.2.28 diff -u -r1.30.2.21.2.28 user_mailman_register.module --- user_mailman_register.module 31 Aug 2009 14:43:19 -0000 1.30.2.21.2.28 +++ user_mailman_register.module 17 Sep 2009 15:22:13 -0000 @@ -95,47 +95,66 @@ $mail_changed = (isset($edit['mail']) && $account->mail != $edit['mail']); // User roles are going to be changed. if (is_array($edit['roles']) && is_array($account->roles)) { - $eroles_array[DRUPAL_AUTHENTICATED_RID] = 'authenticated user'; - $eroles_array += $edit['roles']; - $eroles_string = implode(",",array_keys($eroles_array)); - $aroles_string = implode(",",array_keys($account->roles)); - if ($aroles_string != $eroles_string) { - $role_changed = TRUE; + $edit_roles[DRUPAL_AUTHENTICATED_RID] = 'authenticated user'; + $edit_roles += $edit['roles']; + $str_edit_roles = implode(",",array_keys($edit_roles)); + $str_account_roles = implode(",",array_keys($account->roles)); + if ($str_edit_roles != $str_account_roles) { + $roles_changed = TRUE; + $allow_new_role = _user_mailman_register_allowed_list($list, $edit_roles); } } - if ($mail_changed || $role_changed) { + if ($mail_changed || $roles_changed) { $lists = _mailman_manager_get_lists(); if (!empty($lists)) { foreach ($lists as $list) { - $unsubscribe_email = FALSE; - $subscribe_newemail = FALSE; - if (!_user_mailman_register_allowed_list($list,$account)) { + $allow_cur_role = _user_mailman_register_allowed_list($list,$account); + $unsubscribe_cur_status = FALSE; + $subscribe_new_status = FALSE; + if ((!$mail_changed && !$list['role_sync']) || ($mail_changed && !$roles_changed && !$allow_cur_role)) { + //Do nothing when mail is not changed and role has not to be checked, or when mail is changed but current role is not allowed to subscribe the list by role sync. continue; } $subscription = _user_mailman_register_get_subscriptions($account, $list); - // Unsubscribe a user if his new role is not authorized to be subscribed. - if ($role_changed && $subscription['lstatus'] > USER_MAILMAN_REGISTER_UNSUBSCRIBED && !_user_mailman_register_allowed_list($list, $eroles_array)) { - $unsubscribe_email = TRUE; - } - //Set for unsubscribe the current email and subscribe the new one. - if ($mail_changed && $subscription['lstatus'] > USER_MAILMAN_REGISTER_UNSUBSCRIBED) { - $unsubscribe_email = TRUE; - $subscribe_newemail = TRUE; - } $user_status = array( 'lmod' => $subscription['lmod'], 'old_status' => $subscription['lstatus'], - 'new_status' => USER_MAILMAN_REGISTER_DO_UNSUBSCRIBE, ); + //User is subscribed. + if ($subscription['lstatus'] > USER_MAILMAN_REGISTER_UNSUBSCRIBED) { + //Prepare to change the user email subscription. + if ($mail_changed) { + $unsubscribe_cur_status = TRUE; + $subscribe_new_status = $subscription['lstatus']; + } + //Check role permissions. + if ($list['role_sync']) { + //The role does not allow subscription. + if (($roles_changed && !$allow_new_role) || (!$roles_changed && !$allow_cur_role)) { + // Unsubscribe user (and undo previous setting) when role doesn't allow to subscribe. + $unsubscribe_cur_status = TRUE; + $subscribe_new_status = FALSE; + } + } + } else { + //Check role permissions. + if ($list['role_sync']) { + //The user role allows subscription. + if (($roles_changed && $allow_new_role) || (!$roles_changed && $allow_cur_role)) { + $subscribe_new_status = USER_MAILMAN_REGISTER_SUBSCRIBED_NORMAL; + } + } + } //Send the unsubscription command - if ($unsubscribe_email) { + if ($unsubscribe_cur_status) { + $user_status['new_status'] = USER_MAILMAN_REGISTER_DO_UNSUBSCRIBE; _user_mailman_register_subscribe_update($account, $list, $user_status, $account->mail, NULL); } - if ($subscribe_newemail) { + if ($subscribe_new_status) { $user_status['old_status'] = USER_MAILMAN_REGISTER_UNSUBSCRIBED; - $user_status['new_status'] = $subscription['lstatus']; + $user_status['new_status'] = $subscribe_new_status; //Supposing that new email is not subscribed. To improve retrieving first the new email subscription status - _user_mailman_register_subscribe_update($account, $list, $user_status, $edit['mail'], $edit); + _user_mailman_register_subscribe_update($account, $list, $user_status, ($mail_changed) ? $edit['mail'] : $account->mail, $edit); } } } @@ -503,6 +522,7 @@ array('data' => t('Allow temp disable'), 'field' => 'allow_temp_disable'), array('data' => t('Allow digest'), 'field' => 'allow_digest'), array('data' => t('Default new reg'), 'field' => 'defaultnewreg'), + array('data' => t('Role sync'), 'field' => 'role_sync'), array('data' => t('Actions')), ); @@ -677,6 +697,12 @@ '#type' => 'textfield', '#required' => FALSE, ); + $form['mailman_admin']['webpass'] = array( + '#title' => t('Admin web password'), + '#description' => t('Mailman administrator web password.'), + '#type' => 'password_confirm', + '#size' => 15, + ); $form['mailman_admin']['version'] = array( '#title' => t('Mailman version'), '#description' => t('Select your mailman software version (it should be displayed on the mailman web interface footer). Try different settings if you realize that digest and nomail subscription does not work correctly.'), @@ -685,12 +711,6 @@ '#default_value' => $list->version, '#options' => array(t('2.1.9 or prior'), t('2.1.10 or later')), ); - $form['mailman_admin']['webpass'] = array( - '#title' => t('Admin web password'), - '#description' => t('Mailman administrator web password.'), - '#type' => 'password_confirm', - '#size' => 15, - ); $form['mailman_admin']['user_invite'] = array( '#title' => t('Only invite users'), '#default_value' => $list->user_invite, @@ -709,13 +729,18 @@ '#description' => t('Send notifications of new subscription to the list owner?'), '#type' => 'checkbox', ); - // Drupal list managment $form['drupal_admin'] = array( '#type' => 'fieldset', '#title' => t('List interface settings'), '#tree' => TRUE, ); + $form['drupal_admin']['role_sync'] = array( + '#title' => t('Sync'), + '#default_value' => $list->role_sync, + '#description' => t('When user roles are going to be changed, subscribe or unsubscribe him to this list according to his permissions.'), + '#type' => 'checkbox', + ); $form['drupal_admin']['defaultnewreg'] = array( '#type' => 'radios', '#title' => t('Default choice in user registration form'), @@ -787,6 +812,7 @@ $form_state['values']['drupal_admin']['allow_digest'], $form_state['values']['drupal_admin']['description'], $form_state['values']['drupal_admin']['defaultnewreg'], + $form_state['values']['drupal_admin']['role_sync'], $form_state['values']['lid'], ); $query = 'UPDATE {mailman_lists} SET '; @@ -794,7 +820,7 @@ $query .= "webpass = '%s', "; array_unshift($values, $form_state['values']['mailman_admin']['webpass']); } - $query .= "webadmin = '%s', version = '%s', user_invite = '%s', user_notify = '%s', user_admin_notify = '%s', allow_unsubscribe = '%s', allow_temp_disable = '%s', allow_digest = '%s', description = '%s', defaultnewreg = %d WHERE lid = %d"; + $query .= "webadmin = '%s', version = '%s', user_invite = '%s', user_notify = '%s', user_admin_notify = '%s', allow_unsubscribe = '%s', allow_temp_disable = '%s', allow_digest = '%s', description = '%s', defaultnewreg = %d, role_sync = %d WHERE lid = %d"; $result = db_query($query, $values); if ($result) { @@ -1107,4 +1133,4 @@ } } } -} \ No newline at end of file +}