From 45676302e370c07e3735df48f6c3779477e262a8 Mon Sep 17 00:00:00 2001 From: pappfer Date: Mon, 31 Jul 2017 13:46:33 +0200 Subject: [PATCH 1/4] Added `last_login_at` field to user table --- CHANGELOG.md | 3 ++- src/User/Form/LoginForm.php | 1 + .../m000000_000005_add_last_login_at.php | 27 +++++++++++++++++++ src/User/Model/User.php | 2 ++ src/User/Search/UserSearch.php | 12 ++++++++- src/User/resources/views/admin/index.php | 12 +++++++++ 6 files changed, 55 insertions(+), 2 deletions(-) create mode 100644 src/User/Migration/m000000_000005_add_last_login_at.php diff --git a/CHANGELOG.md b/CHANGELOG.md index b1c1864..0df2625 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,8 @@ ## 1.0.10 - Work In Progress - Fix #37: Fix bower alias in test environment (tekord) - Enh #32: Added Italian Translation (maxxer) -- Fix #30: Prefill username and email in SettingsForm (mattheobjornson) +- Fix #30: Prefill username and email in SettingsForm (mattheobjornson) +- Enh #39: Added `last_login_at` field to user table (pappfer) ## 1.0.9 - July 19, 2017 - Enh #22: Added impersonation feature (@tonydspaniard) diff --git a/src/User/Form/LoginForm.php b/src/User/Form/LoginForm.php index c0f5f45..d4312b5 100644 --- a/src/User/Form/LoginForm.php +++ b/src/User/Form/LoginForm.php @@ -117,6 +117,7 @@ class LoginForm extends Model { if ($this->validate()) { $duration = $this->rememberMe ? $this->module->rememberLoginLifespan : 0; + $this->user->updateAttributes(['last_login_at' => time()]); return Yii::$app->getUser()->login($this->user, $duration); } diff --git a/src/User/Migration/m000000_000005_add_last_login_at.php b/src/User/Migration/m000000_000005_add_last_login_at.php new file mode 100644 index 0000000..ab39f4c --- /dev/null +++ b/src/User/Migration/m000000_000005_add_last_login_at.php @@ -0,0 +1,27 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace Da\User\Migration; + +use yii\db\Migration; + +class m000000_000004_create_token_table extends Migration +{ + public function up() + { + $this->addColumn('{{%user}}', 'last_login_at', $this->integer()); + } + + public function down() + { + $this->dropColumn('{{%user}}', 'last_login_at'); + } +} diff --git a/src/User/Model/User.php b/src/User/Model/User.php index 8605cec..60c019f 100644 --- a/src/User/Model/User.php +++ b/src/User/Model/User.php @@ -43,6 +43,7 @@ use yii\web\IdentityInterface; * @property int $flags * @property int $created_at * @property int $updated_at + * @property int $last_login_at * * Defined relations: * @property SocialNetworkAccount[] $socialNetworkAccounts @@ -134,6 +135,7 @@ class User extends ActiveRecord implements IdentityInterface 'password' => Yii::t('usuario', 'Password'), 'created_at' => Yii::t('usuario', 'Registration time'), 'confirmed_at' => Yii::t('usuario', 'Confirmation time'), + 'last_login_at' => Yii::t('usuario', 'Last login'), ]; } diff --git a/src/User/Search/UserSearch.php b/src/User/Search/UserSearch.php index f04856d..a604c2f 100644 --- a/src/User/Search/UserSearch.php +++ b/src/User/Search/UserSearch.php @@ -30,6 +30,10 @@ class UserSearch extends Model * @var int */ public $created_at; + /** + * @var int + */ + public $last_login_at; /** * @var string */ @@ -57,7 +61,7 @@ class UserSearch extends Model public function rules() { return [ - 'safeFields' => [['username', 'email', 'registration_ip', 'created_at'], 'safe'], + 'safeFields' => [['username', 'email', 'registration_ip', 'created_at', 'last_login_at'], 'safe'], 'createdDefault' => ['created_at', 'default', 'value' => null], ]; } @@ -72,6 +76,7 @@ class UserSearch extends Model 'email' => Yii::t('usuario', 'Email'), 'created_at' => Yii::t('usuario', 'Registration time'), 'registration_ip' => Yii::t('usuario', 'Registration IP'), + 'last_login_at' => Yii::t('usuario', 'Last login'), ]; } @@ -99,6 +104,11 @@ class UserSearch extends Model $query->andFilterWhere(['between', 'created_at', $date, $date + 3600 * 24]); } + if ($this->last_login_at !== null) { + $date = strtotime($this->last_login_at); + $query->andFilterWhere(['between', 'last_login_at', $date, $date + 3600 * 24]); + } + $query ->andFilterWhere(['like', 'username', $this->username]) ->andFilterWhere(['like', 'email', $this->email]) diff --git a/src/User/resources/views/admin/index.php b/src/User/resources/views/admin/index.php index bb4dd17..f5cc5e0 100644 --- a/src/User/resources/views/admin/index.php +++ b/src/User/resources/views/admin/index.php @@ -58,6 +58,18 @@ $module = Yii::$app->getModule('user'); return date('Y-m-d G:i:s', $model->created_at); }, ], + [ + 'attribute' => 'last_login_at', + 'value' => function ($model) { + if (!$model->last_login_at || $model->last_login_at == 0) { + return Yii::t('usuario', 'Never'); + } else if (extension_loaded('intl')) { + return Yii::t('usuario', '{0, date, MMMM dd, YYYY HH:mm}', [$model->last_login_at]); + } else { + return date('Y-m-d G:i:s', $model->last_login_at); + } + }, + ], [ 'header' => Yii::t('usuario', 'Confirmation'), 'value' => function ($model) { From e2bf9b2b25756cbc3ca37038f6059d8f15932ef5 Mon Sep 17 00:00:00 2001 From: pappfer Date: Mon, 31 Jul 2017 13:52:32 +0200 Subject: [PATCH 2/4] Migration class name fix. --- src/User/Migration/m000000_000005_add_last_login_at.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/User/Migration/m000000_000005_add_last_login_at.php b/src/User/Migration/m000000_000005_add_last_login_at.php index ab39f4c..b78be0e 100644 --- a/src/User/Migration/m000000_000005_add_last_login_at.php +++ b/src/User/Migration/m000000_000005_add_last_login_at.php @@ -13,7 +13,7 @@ namespace Da\User\Migration; use yii\db\Migration; -class m000000_000004_create_token_table extends Migration +class m000000_000005_create_token_table extends Migration { public function up() { From dfe6a3b0ef89613ea38771b65ca445cec362cadf Mon Sep 17 00:00:00 2001 From: pappfer Date: Mon, 31 Jul 2017 14:04:26 +0200 Subject: [PATCH 3/4] Migration class name fix. --- src/User/Migration/m000000_000005_add_last_login_at.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/User/Migration/m000000_000005_add_last_login_at.php b/src/User/Migration/m000000_000005_add_last_login_at.php index b78be0e..68807ed 100644 --- a/src/User/Migration/m000000_000005_add_last_login_at.php +++ b/src/User/Migration/m000000_000005_add_last_login_at.php @@ -13,7 +13,7 @@ namespace Da\User\Migration; use yii\db\Migration; -class m000000_000005_create_token_table extends Migration +class m000000_000005_add_last_login_at extends Migration { public function up() { From 4762e47405263fe13656027657ed0b75821b66e7 Mon Sep 17 00:00:00 2001 From: pappfer Date: Mon, 31 Jul 2017 16:36:58 +0200 Subject: [PATCH 4/4] Only update the `last_login_at` attribute in case of a successful login --- src/User/Controller/SecurityController.php | 2 ++ src/User/Form/LoginForm.php | 1 - 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/User/Controller/SecurityController.php b/src/User/Controller/SecurityController.php index a150d43..4e06757 100644 --- a/src/User/Controller/SecurityController.php +++ b/src/User/Controller/SecurityController.php @@ -124,6 +124,8 @@ class SecurityController extends Controller if ($form->load(Yii::$app->request->post())) { $this->trigger(FormEvent::EVENT_BEFORE_LOGIN, $event); if ($form->login()) { + Yii::$app->getUser()->identity->updateAttributes(['last_login_at' => time()]); + $this->trigger(FormEvent::EVENT_AFTER_LOGIN, $event); return $this->goBack(); diff --git a/src/User/Form/LoginForm.php b/src/User/Form/LoginForm.php index d4312b5..c0f5f45 100644 --- a/src/User/Form/LoginForm.php +++ b/src/User/Form/LoginForm.php @@ -117,7 +117,6 @@ class LoginForm extends Model { if ($this->validate()) { $duration = $this->rememberMe ? $this->module->rememberLoginLifespan : 0; - $this->user->updateAttributes(['last_login_at' => time()]); return Yii::$app->getUser()->login($this->user, $duration); }