From 8f71444c451287d03a1ec572a7ebc6cd55cfe532 Mon Sep 17 00:00:00 2001 From: core23 Date: Sun, 19 Jan 2020 18:19:07 +0100 Subject: [PATCH 1/7] Prefix generics with @phpstan --- tests/App/Entity/TestUser.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/App/Entity/TestUser.php b/tests/App/Entity/TestUser.php index 5ee19a01..436b64ba 100644 --- a/tests/App/Entity/TestUser.php +++ b/tests/App/Entity/TestUser.php @@ -16,7 +16,7 @@ use Nucleos\UserBundle\Model\User; /** - * @extends User<\Nucleos\UserBundle\Model\GroupInterface> + * @phpstan-extends User<\Nucleos\UserBundle\Model\GroupInterface> */ class TestUser extends User { From bcce2c69d5c331cf380dbb0d96c2dc2aa59d785e Mon Sep 17 00:00:00 2001 From: core23 Date: Sun, 19 Jan 2020 18:19:37 +0100 Subject: [PATCH 2/7] Remove imported sonata code --- src/Admin/Model/UserAdmin.php | 9 --------- .../translations/NucleosUserAdminBundle.de.xliff | 4 ---- 2 files changed, 13 deletions(-) diff --git a/src/Admin/Model/UserAdmin.php b/src/Admin/Model/UserAdmin.php index d836a1d5..d5dd1474 100644 --- a/src/Admin/Model/UserAdmin.php +++ b/src/Admin/Model/UserAdmin.php @@ -114,10 +114,6 @@ protected function configureShowFields(ShowMapper $showMapper): void ->with('Groups') ->add('groups') ->end() - ->with('Security') - ->add('token') - ->add('twoStepVerificationCode') - ->end() ; } @@ -131,7 +127,6 @@ protected function configureFormFields(FormMapper $formMapper): void ->tab('Security') ->with('Status', ['class' => 'col-md-4'])->end() ->with('Groups', ['class' => 'col-md-4'])->end() - ->with('Keys', ['class' => 'col-md-4'])->end() ->with('Roles', ['class' => 'col-md-12'])->end() ->end() ; @@ -166,10 +161,6 @@ protected function configureFormFields(FormMapper $formMapper): void 'required' => false, ]) ->end() - ->with('Keys') - ->add('token', null, ['required' => false]) - ->add('twoStepVerificationCode', null, ['required' => false]) - ->end() ->end() ; } diff --git a/src/Resources/translations/NucleosUserAdminBundle.de.xliff b/src/Resources/translations/NucleosUserAdminBundle.de.xliff index ca566006..d11d1a77 100644 --- a/src/Resources/translations/NucleosUserAdminBundle.de.xliff +++ b/src/Resources/translations/NucleosUserAdminBundle.de.xliff @@ -306,10 +306,6 @@ Roles Rollen - - Keys - Schlüssel - Security Sicherheit From d8b048c942fdf00520f7a3236b5e2888d186b342 Mon Sep 17 00:00:00 2001 From: core23 Date: Sun, 19 Jan 2020 19:11:00 +0100 Subject: [PATCH 3/7] Use manager to create new instances --- phpstan-baseline.neon | 10 ++++++++++ src/Admin/Model/GroupAdmin.php | 21 ++++++++++++++++----- src/Admin/Model/UserAdmin.php | 14 ++++++++++---- src/Resources/config/admin_mongodb.xml | 1 + src/Resources/config/admin_orm.xml | 1 + tests/Admin/Entity/GroupAdminTest.php | 8 +++++++- 6 files changed, 45 insertions(+), 10 deletions(-) diff --git a/phpstan-baseline.neon b/phpstan-baseline.neon index e6195fa1..b4fd8b7a 100644 --- a/phpstan-baseline.neon +++ b/phpstan-baseline.neon @@ -10,6 +10,16 @@ parameters: count: 1 path: src/Action/LoginAction.php + - + message: "#^Property Nucleos\\\\UserAdminBundle\\\\Admin\\\\Model\\\\GroupAdmin\\:\\:\\$groupManager with generic interface Nucleos\\\\UserBundle\\\\Model\\\\GroupManagerInterface does not specify its types\\: GroupTemplate$#" + count: 1 + path: src/Admin/Model/GroupAdmin.php + + - + message: "#^Method Nucleos\\\\UserAdminBundle\\\\Admin\\\\Model\\\\GroupAdmin\\:\\:__construct\\(\\) has parameter \\$groupManager with generic interface Nucleos\\\\UserBundle\\\\Model\\\\GroupManagerInterface but does not specify its types\\: GroupTemplate$#" + count: 1 + path: src/Admin/Model/GroupAdmin.php + - message: "#^Call to an undefined method Symfony\\\\Component\\\\Config\\\\Definition\\\\Builder\\\\NodeDefinition\\:\\:children\\(\\)\\.$#" count: 1 diff --git a/src/Admin/Model/GroupAdmin.php b/src/Admin/Model/GroupAdmin.php index 642605ef..3cf4515b 100644 --- a/src/Admin/Model/GroupAdmin.php +++ b/src/Admin/Model/GroupAdmin.php @@ -13,7 +13,8 @@ namespace Nucleos\UserAdminBundle\Admin\Model; -use Nucleos\UserAdminBundle\Form\Type\SecurityRolesType; +use Nucleos\UserAdminBundle\Form\Type\RolesMatrixType; +use Nucleos\UserBundle\Model\GroupManagerInterface; use Sonata\AdminBundle\Admin\AbstractAdmin; use Sonata\AdminBundle\Datagrid\DatagridMapper; use Sonata\AdminBundle\Datagrid\ListMapper; @@ -28,11 +29,21 @@ abstract class GroupAdmin extends AbstractAdmin 'validation_groups' => 'Registration', ]; - public function getNewInstance() + /** + * @var GroupManagerInterface + */ + private $groupManager; + + public function __construct($code, $class, $baseControllerName, GroupManagerInterface $groupManager) { - $class = $this->getClass(); + parent::__construct($code, $class, $baseControllerName); - return new $class('', []); + $this->groupManager = $groupManager; + } + + public function getNewInstance() + { + return $this->groupManager->createGroup(''); } protected function configureListFields(ListMapper $listMapper): void @@ -61,7 +72,7 @@ protected function configureFormFields(FormMapper $formMapper): void ->tab('Security') ->with('Roles', ['class' => 'col-md-12']) - ->add('roles', SecurityRolesType::class, [ + ->add('roles', RolesMatrixType::class, [ 'expanded' => true, 'multiple' => true, 'required' => false, diff --git a/src/Admin/Model/UserAdmin.php b/src/Admin/Model/UserAdmin.php index d5dd1474..90cae3c0 100644 --- a/src/Admin/Model/UserAdmin.php +++ b/src/Admin/Model/UserAdmin.php @@ -13,7 +13,7 @@ namespace Nucleos\UserAdminBundle\Admin\Model; -use Nucleos\UserAdminBundle\Form\Type\SecurityRolesType; +use Nucleos\UserAdminBundle\Form\Type\RolesMatrixType; use Nucleos\UserBundle\Model\UserInterface; use Nucleos\UserBundle\Model\UserManagerInterface; use Sonata\AdminBundle\Admin\AbstractAdmin; @@ -39,6 +39,11 @@ public function __construct($code, $class, $baseControllerName, UserManagerInter $this->userManager = $userManager; } + public function getNewInstance() + { + return $this->userManager->createUser(); + } + public function getFormBuilder(): FormBuilderInterface { $this->formOptions['data_class'] = $this->getClass(); @@ -84,12 +89,13 @@ protected function configureListFields(ListMapper $listMapper): void ->add('email') ->add('groups') ->add('enabled', null, ['editable' => true]) - ->add('createdAt') ; if ($this->isGranted('ROLE_ALLOWED_TO_SWITCH')) { $listMapper - ->add('impersonating', 'string', ['template' => '@NucleosUserAdmin/Admin/Field/impersonating.html.twig']) + ->add('impersonating', 'string', [ + 'template' => '@NucleosUserAdmin/Admin/Field/impersonating.html.twig', + ]) ; } } @@ -154,7 +160,7 @@ protected function configureFormFields(FormMapper $formMapper): void ]) ->end() ->with('Roles') - ->add('realRoles', SecurityRolesType::class, [ + ->add('roles', RolesMatrixType::class, [ 'label' => 'form.label_roles', 'expanded' => true, 'multiple' => true, diff --git a/src/Resources/config/admin_mongodb.xml b/src/Resources/config/admin_mongodb.xml index cefc30f1..0da01460 100755 --- a/src/Resources/config/admin_mongodb.xml +++ b/src/Resources/config/admin_mongodb.xml @@ -21,6 +21,7 @@ %nucleos_user.model.group.class% %nucleos_user_admin.admin.group.controller% + %nucleos_user_admin.admin.group.translation_domain% diff --git a/src/Resources/config/admin_orm.xml b/src/Resources/config/admin_orm.xml index baa69597..c7df3fb3 100644 --- a/src/Resources/config/admin_orm.xml +++ b/src/Resources/config/admin_orm.xml @@ -21,6 +21,7 @@ %nucleos_user.model.group.class% %nucleos_user_admin.admin.group.controller% + %nucleos_user_admin.admin.group.translation_domain% diff --git a/tests/Admin/Entity/GroupAdminTest.php b/tests/Admin/Entity/GroupAdminTest.php index bb4b2923..1deed358 100644 --- a/tests/Admin/Entity/GroupAdminTest.php +++ b/tests/Admin/Entity/GroupAdminTest.php @@ -14,6 +14,7 @@ namespace Nucleos\UserAdminBundle\Tests\Admin\Entity; use Nucleos\UserAdminBundle\Admin\Entity\GroupAdmin; +use Nucleos\UserBundle\Model\GroupManagerInterface; use PHPUnit\Framework\TestCase; use Sonata\AdminBundle\Controller\CRUDController; @@ -21,7 +22,12 @@ final class GroupAdminTest extends TestCase { public function testInstance(): void { - $admin = new GroupAdmin('admin.group', 'Nucleos\UserAdminBundle\Model\Group', CRUDController::class); + $admin = new GroupAdmin( + 'admin.group', + 'Nucleos\UserAdminBundle\Model\Group', + CRUDController::class, + $this->createMock(GroupManagerInterface::class) + ); static::assertNotEmpty($admin); } From 5103fe3abb798983e4a3c3d16b9254edef16403a Mon Sep 17 00:00:00 2001 From: core23 Date: Sun, 19 Jan 2020 21:25:16 +0100 Subject: [PATCH 4/7] Catch exception when creating new user instance --- src/Admin/Model/UserAdmin.php | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/Admin/Model/UserAdmin.php b/src/Admin/Model/UserAdmin.php index 90cae3c0..ab193926 100644 --- a/src/Admin/Model/UserAdmin.php +++ b/src/Admin/Model/UserAdmin.php @@ -13,6 +13,7 @@ namespace Nucleos\UserAdminBundle\Admin\Model; +use DomainException; use Nucleos\UserAdminBundle\Form\Type\RolesMatrixType; use Nucleos\UserBundle\Model\UserInterface; use Nucleos\UserBundle\Model\UserManagerInterface; @@ -41,7 +42,23 @@ public function __construct($code, $class, $baseControllerName, UserManagerInter public function getNewInstance() { - return $this->userManager->createUser(); + $instance = $this->userManager->createUser(); + + // TODO: Find a better way to create editable form models + // BC layer + try { + $instance->getUsername(); + } catch (DomainException $exception) { + $instance->setUsername(''); + } + + try { + $instance->getEmail(); + } catch (DomainException $exception) { + $instance->setEmail(''); + } + + return $instance; } public function getFormBuilder(): FormBuilderInterface From 3c38532bac7fab7aecd0d785fb978cb89975ac2e Mon Sep 17 00:00:00 2001 From: core23 Date: Sun, 19 Jan 2020 21:25:55 +0100 Subject: [PATCH 5/7] Change user admin edit layout --- src/Admin/Model/UserAdmin.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Admin/Model/UserAdmin.php b/src/Admin/Model/UserAdmin.php index ab193926..a6bc287f 100644 --- a/src/Admin/Model/UserAdmin.php +++ b/src/Admin/Model/UserAdmin.php @@ -148,8 +148,8 @@ protected function configureFormFields(FormMapper $formMapper): void ->end() ->tab('Security') + ->with('Groups', ['class' => 'col-md-8'])->end() ->with('Status', ['class' => 'col-md-4'])->end() - ->with('Groups', ['class' => 'col-md-4'])->end() ->with('Roles', ['class' => 'col-md-12'])->end() ->end() ; From 1a6e607db7ffceddbbeffe6c64f7cea155886521 Mon Sep 17 00:00:00 2001 From: core23 Date: Sun, 19 Jan 2020 21:37:20 +0100 Subject: [PATCH 6/7] Add locale field to user admin --- src/Admin/Model/UserAdmin.php | 21 +++++++++++++++++++ .../NucleosUserAdminBundle.de.xliff | 4 ++++ .../NucleosUserAdminBundle.en.xliff | 4 ++++ 3 files changed, 29 insertions(+) diff --git a/src/Admin/Model/UserAdmin.php b/src/Admin/Model/UserAdmin.php index a6bc287f..20ba6bde 100644 --- a/src/Admin/Model/UserAdmin.php +++ b/src/Admin/Model/UserAdmin.php @@ -15,6 +15,7 @@ use DomainException; use Nucleos\UserAdminBundle\Form\Type\RolesMatrixType; +use Nucleos\UserBundle\Model\LocaleAwareInterface; use Nucleos\UserBundle\Model\UserInterface; use Nucleos\UserBundle\Model\UserManagerInterface; use Sonata\AdminBundle\Admin\AbstractAdmin; @@ -23,7 +24,9 @@ use Sonata\AdminBundle\Form\FormMapper; use Sonata\AdminBundle\Form\Type\ModelType; use Sonata\AdminBundle\Show\ShowMapper; +use Symfony\Component\Form\Extension\Core\Type\LocaleType; use Symfony\Component\Form\Extension\Core\Type\TextType; +use Symfony\Component\Form\Extension\Core\Type\TimezoneType; use Symfony\Component\Form\FormBuilderInterface; abstract class UserAdmin extends AbstractAdmin @@ -145,6 +148,9 @@ protected function configureFormFields(FormMapper $formMapper): void $formMapper ->tab('User') ->with('General', ['class' => 'col-md-6'])->end() + ->ifTrue($this->isLocaleAwareSubject()) + ->with('Locale', ['class' => 'col-md-6'])->end() + ->ifEnd() ->end() ->tab('Security') @@ -163,6 +169,16 @@ protected function configureFormFields(FormMapper $formMapper): void 'required' => $this->isNewInstance(), ]) ->end() + ->ifTrue($this->isLocaleAwareSubject()) + ->with('Locale') + ->add('locale', LocaleType::class, [ + 'required' => false, + ]) + ->add('timezone', TimezoneType::class, [ + 'required' => false, + ]) + ->end() + ->ifEnd() ->end() ->tab('Security') @@ -192,4 +208,9 @@ private function isNewInstance(): bool { return !$this->hasSubject() || null === $this->getSubject()|| null === $this->id($this->getSubject()); } + + private function isLocaleAwareSubject(): bool + { + return is_subclass_of($this->getClass(), LocaleAwareInterface::class); + } } diff --git a/src/Resources/translations/NucleosUserAdminBundle.de.xliff b/src/Resources/translations/NucleosUserAdminBundle.de.xliff index d11d1a77..d77d135f 100644 --- a/src/Resources/translations/NucleosUserAdminBundle.de.xliff +++ b/src/Resources/translations/NucleosUserAdminBundle.de.xliff @@ -286,6 +286,10 @@ General Allgemein + + Locale + Ort + Profile Profil diff --git a/src/Resources/translations/NucleosUserAdminBundle.en.xliff b/src/Resources/translations/NucleosUserAdminBundle.en.xliff index 13c902eb..71202610 100644 --- a/src/Resources/translations/NucleosUserAdminBundle.en.xliff +++ b/src/Resources/translations/NucleosUserAdminBundle.en.xliff @@ -210,6 +210,10 @@ General General + + Locale + Locale + Groups Groups From e609f721f91142864fbf6d16fdb4ba11057908a7 Mon Sep 17 00:00:00 2001 From: core23 Date: Sun, 19 Jan 2020 21:53:04 +0100 Subject: [PATCH 7/7] Call translator once for role translation --- src/Resources/views/Form/roles_matrix_list.html.twig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Resources/views/Form/roles_matrix_list.html.twig b/src/Resources/views/Form/roles_matrix_list.html.twig index c2846e70..ab2c9d2a 100644 --- a/src/Resources/views/Form/roles_matrix_list.html.twig +++ b/src/Resources/views/Form/roles_matrix_list.html.twig @@ -1,5 +1,5 @@ {% for role, attributes in roles|sort %} -
  • {{ form_widget(attributes.form, {label: attributes.role_translated, value: attributes.role}) }}
  • +
  • {{ form_widget(attributes.form, {label: attributes.role_translated, translation_domain: false, value: attributes.role}) }}
  • {% if not attributes.is_granted %}