Skip to content
Snippets Groups Projects
Commit f14feebc authored by Kobus van Wyk's avatar Kobus van Wyk
Browse files

Merge branch 'issue/block_inactive_users-3200345-3200345-create-cancel-users' into 8.x-1.x

parents 11cf40e5 b1305eab
Branches 8.x-1.x
No related tags found
No related merge requests found
name: Block Inactive Users
type: module
description: Automatically blocks users who haven't been active for a designated amount of time.
description: Automatically blocks users who haven't been active for a designated amount of time. Cancel users on a bulk level.
package: Configuration
configure: block_inactive_users.settings
core: 8.x
......
......@@ -3,3 +3,8 @@ block_inactive_users.settings:
parent: user.admin_index
description: 'Configurations to block inactive users automatically.'
route_name: block_inactive_users.settings
block_inactive_users.settings_cancel_users:
title: 'Cancel Users'
parent: user.admin_index
description: 'Configurations to Cancel Users automatically.'
route_name: block_inactive_users.settings_cancel_users
block_inactive_users.settings:
title: Inactive Users
route_name: block_inactive_users.settings
base_route: block_inactive_users.settings
block_inactive_users.settings_cancel_users:
title: Cancel Users
route_name: block_inactive_users.settings_cancel_users
base_route: block_inactive_users.settings
weight: 1
\ No newline at end of file
......@@ -79,3 +79,64 @@ function block_inactive_users_block_users() {
}
}
}
/**
* Helper function to Cancel Users based on configured rules.
*/
function block_inactive_users_block_cancel_users() {
$config = \Drupal::config('block_inactive_users.settings_cancel_users');
$include_status = $config->get('block_inactive_users_include_status');
$include_user_roles = $config->get('block_inactive_users_include_roles');
$whitelist_user = $config->get('block_inactive_users_whitelist_user');
$whitelist_email = $config->get('block_inactive_users_whitelist_email');
$disable_account_method = $config->get('block_inactive_users_disable_account_method');
$block_inactive_users_cancel_email = $config->get('block_inactive_users_cancel_email');
$query = \Drupal::entityQuery('user');
// Exclude User 0 and 1
$query->condition('uid', array('0','1'), 'NOT IN');
if (!empty($include_user_roles)) {
// If any role excluded, update query condition accordingly.
$query->condition('roles.target_id', $include_user_roles, 'IN');
}
if (!empty($include_status)) {
// If any status included.
$query->condition('status', $include_status, 'IN');
}
if (!empty($whitelist_user)) {
// Excluded users on user, query condition accordingly.
$users_names = preg_split('/\n|\r\n?/', $whitelist_user);
$and_condition_users_names = $query->andConditionGroup();
foreach ($users_names as $name) {
$and_condition_users_names->condition('name', '%' . $name . '%', 'NOT LIKE');
}
$query->condition($and_condition_users_names);
}
if (!empty($whitelist_email)) {
// Excluded users on mail, query condition accordingly.
$users_emails = preg_split('/\n|\r\n?/', $whitelist_email);
$and_condition_users_emails = $query->andConditionGroup();
foreach ($users_emails as $email) {
$and_condition_users_emails->condition('mail', '%' . $email . '%', 'NOT LIKE');
}
$query->condition($and_condition_users_emails);
}
$user_ids = $query->execute();
foreach ($user_ids as $uid) {
// Set the notify and cancel type options.
user_cancel(array(
'user_cancel_notify' => $block_inactive_users_cancel_email,
'user_cancel_method' => $disable_account_method,
), $uid , $disable_account_method);
}
}
......@@ -16,3 +16,10 @@ block_inactive_users.reactivate_confirm:
_permission: 'access content'
option:
_user_is_logged_in: 'FALSE'
block_inactive_users.settings_cancel_users:
path: '/admin/config/people/block_inactive_users/cancel_users'
defaults:
_form: '\Drupal\block_inactive_users\Form\SettingsCancelUsersForm'
_title: 'Module configuration Cancel Users'
requirements:
_permission: 'administer site configuration'
block_inactive_users_include_roles:
authenticated: authenticated
block_inactive_users_whitelist_user: "abc123"
block_inactive_users_whitelist_email: "@test.com\r\n@test1.com\r\n@test2.com"
block_inactive_users_disable_account_method: user_cancel_delete
block_inactive_users_cancel_email: false
_core:
default_config_hash: TTR9FOogqO6ewluKXPgG8DB0GmF1BX8lNyv5S73x2Bc
block_inactive_users_include_status:
- '0'
......@@ -23,3 +23,28 @@ block_inactive_users.settings:
sequence:
type: string
label: 'Role'
block_inactive_users.settings_cancel_users:
type: config_object
label: 'Block Inactive Users Module settings'
mapping:
block_inactive_users_include_roles:
type: sequence
label: 'Roles to Include'
sequence:
type: string
label: 'Role'
block_inactive_users_whitelist_user:
type: text
label: 'Whitelist User'
block_inactive_users_whitelist_email:
type: text
label: 'Whitelist Email'
block_inactive_users_disable_account_method:
type: sequence
label: 'User Cancelation Methods'
sequence:
type: string
label: 'Methods'
block_inactive_users_cancel_email:
type: boolean
label: 'Email confirmation to cancel account'
\ No newline at end of file
<?php
namespace Drupal\block_inactive_users\Form;
use Drupal\Core\Form\ConfigFormBase;
use Drupal\Core\Form\FormStateInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Drupal\Core\Logger\LoggerChannelFactoryInterface;
use Drupal\Core\Entity\EntityTypeManagerInterface;
/**
* Class SettingsCancelUsersForm.
*
* @package Drupal\block_inactive_users\Form
*/
class SettingsCancelUsersForm extends ConfigFormBase {
/**
* A logger instance.
*
* @var \Drupal\Core\Logger\LoggerChannelFactoryInterface
*/
protected $loggerChannelFactory;
/**
* An entity type manager instance.
*
* @var \Drupal\Core\Entity\EntityTypeManagerInterface
*/
protected $entityTypeManager;
/**
* Create function for dependency injection.
*/
public static function create(ContainerInterface $container) {
$loggerFactory = $container->get('logger.factory');
return new static($loggerFactory,
$container->get('entity_type.manager'));
}
/**
* Constructor.
*/
public function __construct(LoggerChannelFactoryInterface $loggerChannelFactory, EntityTypeManagerInterface $entityTypeManager) {
$this->entityTypeManager = $entityTypeManager;
$this->loggerChannelFactory = $loggerChannelFactory;
}
/**
* {@inheritdoc}
*/
public function getFormId() {
return "block_inactive_users_settings";
}
/**
* {@inheritdoc}
*/
protected function getEditableConfigNames() {
return ['block_inactive_users.settings_cancel_users'];
}
/**
* {@inheritdoc}
*/
public function buildForm(array $form, FormStateInterface $form_state) {
$config = $this->config('block_inactive_users.settings_cancel_users');
$roles = user_role_names();
$form["users_settings"] = [
"#type" => "details",
"#title" => $this->t("Cancel Users settings"),
'#open' => TRUE,
];
$form['users_settings']['block_inactive_users_include_roles'] = [
'#type' => 'select',
'#multiple' => TRUE,
'#title' => $this->t('Include users with role(s):'),
'#default_value' => $config->get('block_inactive_users_include_roles'),
'#options' => $roles,
'#size' => sizeof($roles),
'#description' => $this->t('Select role(s) to disabling account.'),
];
$form['users_settings']['block_inactive_users_include_status'] = [
'#type' => 'select',
'#multiple' => TRUE,
'#title' => $this->t('Include users with status:'),
'#default_value' => $config->get('block_inactive_users_include_status'),
'#options' => array(
'0' => $this->t('Blocked'),
'1' => $this->t('Active'),
),
'#size' => 2,
'#description' => $this->t('Select status to disabling account.'),
];
$form['users_settings']['block_inactive_users_whitelist_user'] = [
'#title' => $this->t('Whitelist user(s) by username'),
'#type' => 'textarea',
'#attributes' => ['placeholder' => $this->t('abc123')],
'#default_value' => $config->get('block_inactive_users_whitelist_user'),
'#description' => $this->t('Whitelist user(s) by username separated per line.'),
];
$form['users_settings']['block_inactive_users_whitelist_email'] = [
'#title' => $this->t('Whitelist user(s) by mail'),
'#type' => 'textarea',
'#attributes' => ['placeholder' => $this->t('@test.com')],
'#default_value' => $config->get('block_inactive_users_whitelist_email'),
'#description' => $this->t('Whitelist user(s) by mail separated per line.'),
];
$form['users_settings']['block_inactive_users_disable_account_method'] = [
'#type' => 'select',
'#title' => $this->t('When cancelling the account(s):'),
'#default_value' => $config->get('block_inactive_users_disable_account_method'),
'#options' => array(
'user_cancel_block' => $this->t('Disable the account and keep its content.') . ' - ' . $this->t('Your account will be blocked and you will no longer be able to log in. All of your content will remain attributed to your username.'),
'user_cancel_block_unpublish' => $this->t('Disable the account and unpublish its content.') . ' - ' . $this->t('Your account will be blocked and you will no longer be able to log in. All of your content will be hidden from everyone but administrators.'),
'user_cancel_reassign' => $this->t("Delete the account and make its content belong to the Anonymous user. Reassign its groups to the super administrator."),
'user_cancel_delete' => $this->t('Delete the account and its content.') . ' - ' . $this->t('Your account will be removed and all account information deleted. All of your content will also be deleted.'),
),
'#description' => $this->t('Select the method to cancel the accounts. This action cannot be undone.'),
];
$form['users_settings']['block_inactive_users_cancel_email'] = [
'#type' => 'checkbox',
'#title' => $this->t('Require email confirmation to cancel account'),
'#default_value' => $config->get('block_inactive_users_cancel_email'),
'#description' => $this->t('When enabled, the user must confirm the account cancellation via email.'),
'#attributes' => [
'name' => 'block_inactive_users_cancel_email',
],
];
$form['actions']['block_inactive_users_cancel_users_update'] = [
'#type' => 'submit',
'#value' => $this->t('Cancel Users'),
'#submit' => ['::updateCancelUsers'],
];
return parent::buildForm($form, $form_state);
}
/**
* {@inheritdoc}
*/
public function submitForm(array &$form, FormStateInterface $form_state) {
$this->configFactory->getEditable('block_inactive_users.settings_cancel_users')
->set('block_inactive_users_include_roles', $form_state->getValue('block_inactive_users_include_roles'))
->set('block_inactive_users_include_status', $form_state->getValue('block_inactive_users_include_status'))
->set('block_inactive_users_whitelist_user', $form_state->getValue('block_inactive_users_whitelist_user'))
->set('block_inactive_users_whitelist_email', $form_state->getValue('block_inactive_users_whitelist_email'))
->set('block_inactive_users_disable_account_method', $form_state->getValue('block_inactive_users_disable_account_method'))
->set('block_inactive_users_cancel_email', $form_state->getValue('block_inactive_users_cancel_email'))
->save();
parent::submitForm($form, $form_state);
}
/**
* Cancel listed users.
*
* Remove users after they have idle for time period.
*/
public function updateCancelUsers(array &$form, FormStateInterface $form_state) {
$this->submitForm($form, $form_state);
// Cancel Users based on configured rules.
block_inactive_users_block_cancel_users();
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment