%PDF- %PDF-
| Direktori : /home/vacivi36/intranet.vacivitta.com.br/protected/humhub/modules/user/models/ |
| Current File : /home/vacivi36/intranet.vacivitta.com.br/protected/humhub/modules/user/models/Group.php |
<?php
/**
* @link https://www.humhub.org/
* @copyright Copyright (c) 2017 HumHub GmbH & Co. KG
* @license https://www.humhub.com/licences
*/
namespace humhub\modules\user\models;
use humhub\components\ActiveRecord;
use humhub\modules\admin\notifications\ExcludeGroupNotification;
use humhub\modules\admin\notifications\IncludeGroupNotification;
use humhub\modules\admin\permissions\ManageGroups;
use humhub\modules\space\models\Space;
use humhub\modules\user\components\ActiveQueryUser;
use humhub\modules\user\Module;
use Yii;
/**
* This is the model class for table "group".
*
* @property integer $id
* @property integer $space_id
* @property string $name
* @property string $description
* @property string $created_at
* @property integer $created_by
* @property integer $sort_order
* @property integer $show_at_directory
* @property integer $show_at_registration
* @property string $updated_at
* @property integer $updated_by
* @property integer $is_admin_group
* @property integer $is_default_group
* @property integer $is_protected
* @property integer $notify_users
*
* @property User[] $manager
* @property Space|null $defaultSpace
* @property GroupUser[] groupUsers
* @property GroupSpace[] groupSpaces
*/
class Group extends ActiveRecord
{
const SCENARIO_EDIT = 'edit';
/**
* @inheritdoc
*/
public static function tableName()
{
return 'group';
}
/**
* @inheritdoc
*/
public function rules()
{
return [
[['sort_order', 'notify_users', 'is_default_group', 'is_protected'], 'integer'],
[['description'], 'string'],
[['name'], 'string', 'max' => 45],
['show_at_registration', 'validateShowAtRegistration'],
['is_default_group', 'validateIsDefaultGroup'],
];
}
/**
* @inheritdoc
*/
public function beforeDelete()
{
GroupSpace::deleteAll(['group_id' => $this->id]);
return parent::beforeDelete();
}
public function validateShowAtRegistration($attribute, $params)
{
if ($this->is_admin_group && $this->show_at_registration) {
$this->addError($attribute, 'Admin group can\'t be a registration group!');
}
}
/**
* Validate default group
* @param string $attribute
*/
public function validateIsDefaultGroup($attribute)
{
if ($this->is_admin_group && $this->is_default_group) {
$this->addError($attribute, 'Admin group can\'t be a default group!');
}
if ($this->getOldAttribute($attribute) && !$this->is_default_group) {
$this->addError($attribute, 'One group must be a default!');
}
}
/**
* @inheritdoc
*/
public function attributeLabels()
{
return [
'id' => 'ID',
'name' => Yii::t('UserModule.base', 'Name'),
'defaultSpaceGuid' => Yii::t('UserModule.base', 'Default Space'),
'managerGuids' => Yii::t('UserModule.base', 'Manager'),
'description' => Yii::t('UserModule.base', 'Description'),
'created_at' => Yii::t('UserModule.base', 'Created at'),
'created_by' => Yii::t('UserModule.base', 'Created by'),
'updated_at' => Yii::t('UserModule.base', 'Updated at'),
'updated_by' => Yii::t('UserModule.base', 'Updated by'),
'show_at_registration' => Yii::t('UserModule.base', 'Show At Registration'),
'show_at_directory' => Yii::t('UserModule.base', 'Visible'),
'sort_order' => Yii::t('UserModule.base', 'Sort order'),
'notify_users' => Yii::t('UserModule.base', 'Enable Notifications'),
'is_default_group' => Yii::t('UserModule.base', 'Default Group'),
];
}
/**
* @inheritdoc
*/
public function attributeHints()
{
return [
'notify_users' => Yii::t('AdminModule.user', 'Send notifications to users when added to or removed from the group.'),
'show_at_registration' => Yii::t('AdminModule.user', 'Make the group selectable at registration.'),
'show_at_directory' => Yii::t('AdminModule.user', 'Will be used as a filter in \'People\'.'),
'is_default_group' => Yii::t('AdminModule.user', 'Applied to new or existing users without any other group membership.'),
];
}
/**
* @return null|Space[]
* @since 1.8
*/
public function getDefaultSpaces()
{
return Space::find()
->innerJoin('group_space', 'space.id = group_space.space_id')
->where(['group_space.group_id' => $this->id])
->all();
}
public function beforeSave($insert)
{
if (empty($this->sort_order)) {
$this->sort_order = 100;
}
if ($this->getOldAttribute('is_default_group') && !$this->is_default_group) {
$this->is_default_group = 1;
return false;
}
if ($this->show_at_registration && $this->is_admin_group) {
// Admin group cannot be shown at registration
$this->show_at_registration = 0;
}
if ($this->is_default_group && $this->is_admin_group) {
// Admin group cannot be default
$this->is_default_group = 0;
}
return parent::beforeSave($insert);
}
/**
* @inheritdoc
*/
public function afterSave($insert, $changedAttributes)
{
if ($this->is_default_group) {
// Only single group can be default:
Group::updateAll(['is_default_group' => '0'], ['!=', 'id', $this->id]);
}
parent::afterSave($insert, $changedAttributes);
}
/**
* @inheritdoc
*/
public function afterDelete()
{
/* @var $module Module */
$module = Yii::$app->getModule('user');
if ($defaultGroup = $module->getDefaultGroup()) {
$defaultGroup->assignDefaultGroup();
}
parent::afterDelete();
}
/**
* Assign users to this Default Group who were not assigned to any other group before
*/
public function assignDefaultGroup()
{
if (empty($this->id) || !$this->is_default_group || $this->is_admin_group) {
return;
}
Yii::$app->getDb()->createCommand('INSERT INTO group_user (user_id, group_id, created_at, updated_at)
SELECT user.id, :defaultGroupId, NOW(), NOW()
FROM user
LEFT JOIN group_user ON group_user.user_id = user.id
WHERE group_user.id IS NULL
AND user.status != :userStatusSoftDeleted', [
':defaultGroupId' => $this->id,
':userStatusSoftDeleted' => User::STATUS_SOFT_DELETED,
])->execute();
}
/**
* Returns the admin group.
* @return Group
*/
public static function getAdminGroup()
{
return self::findOne(['is_admin_group' => '1']);
}
public static function getAdminGroupId()
{
$adminGroupId = Yii::$app->getModule('user')->settings->get('group.adminGroupId');
if ($adminGroupId == null) {
$adminGroupId = self::getAdminGroup()->id;
Yii::$app->getModule('user')->settings->set('group.adminGroupId', $adminGroupId);
}
return $adminGroupId;
}
/**
* Returns all user which are defined as manager in this group as ActiveQuery.
* @return \yii\db\ActiveQuery
*/
public function getManager()
{
return $this->hasMany(User::class, ['id' => 'user_id'])
->via('groupUsers', function ($query) {
$query->where(['is_group_manager' => '1']);
});
}
/**
* Checks if this group has at least one Manager assigned.
* @return boolean
*/
public function hasManager()
{
return $this->getManager()->count() > 0;
}
/**
* Returns the GroupUser relation for a given user.
* @param User|string $user
*
* @return GroupUser|null
*/
public function getGroupUser($user)
{
$userId = ($user instanceof User) ? $user->id : $user;
return GroupUser::findOne(['user_id' => $userId, 'group_id' => $this->id]);
}
/**
* Returns all GroupUser relations for this group as ActiveQuery.
* @return \yii\db\ActiveQuery
*/
public function getGroupUsers()
{
return $this->hasMany(GroupUser::class, ['group_id' => 'id']);
}
/**
* Returns all member user of this group as ActiveQuery
*
* @return ActiveQueryUser
*/
public function getUsers()
{
$query = User::find();
$query->leftJoin('group_user', 'group_user.user_id=user.id AND group_user.group_id=:groupId', [
':groupId' => $this->id,
]);
$query->andWhere(['IS NOT', 'group_user.id', new \yii\db\Expression('NULL')]);
$query->multiple = true;
return $query;
}
/**
* Checks if this group has at least one user assigned.
* @return boolean
*/
public function hasUsers()
{
return $this->getUsers()->count() > 0;
}
/**
* @param $user
* @return bool
*/
public function isManager($user)
{
$userId = ($user instanceof User) ? $user->id : $user;
return $this->getGroupUsers()->where(['user_id' => $userId, 'is_group_manager' => true])->count() > 0;
}
/**
* @param $user
* @return bool
*/
public function isMember($user)
{
return $this->getGroupUser($user) != null;
}
/**
* Adds a user to the group. This function will skip if the user is already a member of the group.
*
* @param User $user user id or user model
* @param bool $isManager mark as group manager
* @return bool true - on success adding user, false - if already member or cannot be added by some reason
* @throws \yii\base\InvalidConfigException
*/
public function addUser($user, $isManager = false)
{
if ($this->isMember($user)) {
return false;
}
$userId = ($user instanceof User) ? $user->id : $user;
$newGroupUser = new GroupUser();
$newGroupUser->user_id = $userId;
$newGroupUser->group_id = $this->id;
$newGroupUser->created_at = date('Y-m-d G:i:s');
$newGroupUser->created_by = Yii::$app->user->id;
$newGroupUser->is_group_manager = $isManager;
if ($newGroupUser->save() && !Yii::$app->user->isGuest) {
if ($this->notify_users) {
if (!($user instanceof User)) {
$user = User::findOne(['id' => $user]);
}
IncludeGroupNotification::instance()
->about($this)
->from(Yii::$app->user->identity)
->send($user);
}
return true;
}
return false;
}
/**
* Removes a user from the group.
* @param User|string $user userId or user model
* @return bool
* @throws \Throwable
* @throws \yii\db\StaleObjectException
*/
public function removeUser($user)
{
$groupUser = $this->getGroupUser($user);
if (!$groupUser) {
return false;
}
if ($groupUser->delete()) {
if ($this->notify_users) {
if (!($user instanceof User)) {
$user = User::findOne(['id' => $user]);
}
ExcludeGroupNotification::instance()
->about($this)
->from(Yii::$app->user->identity)
->send($user);
}
return true;
}
return false;
}
/**
* Notifies groups admins for approval of new user via e-mail.
* This should be done after a new user is created and approval is required.
*
* @param User $user
* @return true|void
* @todo Create message template, move message into translation
*/
public static function notifyAdminsForUserApproval($user)
{
// No admin approval required
if ($user->status != User::STATUS_NEED_APPROVAL ||
!Yii::$app->getModule('user')->settings->get('auth.needApproval', 'user')) {
return;
}
if ($user->registrationGroupId == null) {
return;
}
$group = self::findOne($user->registrationGroupId);
$approvalUrl = \yii\helpers\Url::to(["/admin/approval"], true);
foreach ($group->manager as $manager) {
Yii::$app->i18n->setUserLocale($manager);
$html = Yii::t('UserModule.auth', 'Hello {displayName},',
['displayName' => $manager->displayName]) . "<br><br>\n\n" .
Yii::t('UserModule.auth', 'a new user {displayName} needs approval.',
['displayName' => $user->displayName]) . "<br><br>\n\n" .
Yii::t('UserModule.auth', 'Please click on the link below to view request:') .
"<br>\n\n" .
\yii\helpers\Html::a($approvalUrl, $approvalUrl) . "<br/> <br/>\n";
$mail = Yii::$app->mailer->compose(['html' => '@humhub/views/mail/TextOnly'], [
'message' => $html,
]);
$mail->setTo($manager->email);
$mail->setSubject(Yii::t('UserModule.auth', "New user needs approval"));
$mail->send();
}
Yii::$app->i18n->autosetLocale();
return true;
}
/**
* Returns groups which are available in user registration
*
* @return Group[] the groups which can be selected in registration
*/
public static function getRegistrationGroups()
{
if (Yii::$app->getModule('user')->settings->get('auth.showRegistrationUserGroup')) {
$groups = self::find()
->where(['show_at_registration' => 1, 'is_admin_group' => 0])
->orderBy('name ASC')
->all();
if (count($groups) > 0) {
return $groups;
}
}
$groups = [];
if ($defaultGroup = Yii::$app->getModule('user')->getDefaultGroup()) {
$groups[] = $defaultGroup;
}
return $groups;
}
/**
* @return array|\yii\db\ActiveRecord[]
*/
public static function getDirectoryGroups()
{
return self::find()->where(['show_at_directory' => '1'])->orderBy([
'sort_order' => SORT_ASC,
'name' => SORT_ASC,
])->all();
}
/**
* Returns all GroupSpace relations for this group as ActiveQuery.
* @return \yii\db\ActiveQuery
* @since 1.8
*/
public function getGroupSpaces()
{
return $this->hasMany(GroupSpace::class, ['group_id' => 'id']);
}
/**
* Check if this Group can be deleted by current User
*
* @return bool
* @since 1.9
*/
public function canDelete()
{
return Yii::$app->user->can(ManageGroups::class) && !(
$this->isNewRecord ||
$this->is_admin_group ||
$this->is_default_group ||
$this->is_protected
);
}
}