]> git.immae.eu Git - github/wallabag/wallabag.git/commitdiff
Updating logged in user (email, name, etc ..)
authorJeremy <jeremy.benoist@gmail.com>
Tue, 17 Feb 2015 21:45:20 +0000 (22:45 +0100)
committerJeremy <jeremy.benoist@gmail.com>
Tue, 17 Feb 2015 21:45:20 +0000 (22:45 +0100)
src/Wallabag/CoreBundle/Controller/ConfigController.php
src/Wallabag/CoreBundle/Entity/User.php
src/Wallabag/CoreBundle/Form/Type/ChangePasswordType.php
src/Wallabag/CoreBundle/Form/Type/ConfigType.php
src/Wallabag/CoreBundle/Form/Type/UserType.php [new file with mode: 0644]
src/Wallabag/CoreBundle/Resources/views/Config/index.html.twig
src/Wallabag/CoreBundle/Tests/Controller/ConfigControllerTest.php

index 7540f756c4ab525699efd605ad292b9942d6b561..b3236e3ce20d17342e206b4dd02515c13eeb29fd 100644 (file)
@@ -8,6 +8,7 @@ use Symfony\Component\HttpFoundation\Request;
 use Wallabag\CoreBundle\Entity\Config;
 use Wallabag\CoreBundle\Form\Type\ConfigType;
 use Wallabag\CoreBundle\Form\Type\ChangePasswordType;
+use Wallabag\CoreBundle\Form\Type\UserType;
 
 class ConfigController extends Controller
 {
@@ -20,13 +21,13 @@ class ConfigController extends Controller
     {
         $em = $this->getDoctrine()->getManager();
         $config = $this->getConfig();
+        $user = $this->getUser();
 
         // handle basic config detail
         $configForm = $this->createForm(new ConfigType(), $config);
         $configForm->handleRequest($request);
 
         if ($configForm->isValid()) {
-
             $em->persist($config);
             $em->flush();
 
@@ -43,7 +44,6 @@ class ConfigController extends Controller
         $pwdForm->handleRequest($request);
 
         if ($pwdForm->isValid()) {
-            $user = $this->getUser();
             $user->setPassword($pwdForm->get('new_password')->getData());
             $em->persist($user);
             $em->flush();
@@ -56,9 +56,26 @@ class ConfigController extends Controller
             return $this->redirect($this->generateUrl('config'));
         }
 
+        // handle changing user information
+        $userForm = $this->createForm(new UserType(), $user);
+        $userForm->handleRequest($request);
+
+        if ($userForm->isValid()) {
+            $em->persist($user);
+            $em->flush();
+
+            $this->get('session')->getFlashBag()->add(
+                'notice',
+                'Information updated'
+            );
+
+            return $this->redirect($this->generateUrl('config'));
+        }
+
         return $this->render('WallabagCoreBundle:Config:index.html.twig', array(
             'configForm' => $configForm->createView(),
             'pwdForm' => $pwdForm->createView(),
+            'userForm' => $userForm->createView(),
         ));
     }
 
index c83250c37e6d2a2bec25530c1a92667bc72904d1..193dfebc25bddfe7472f3dcfb07ee112ad84eb26 100644 (file)
@@ -6,6 +6,7 @@ use Doctrine\Common\Collections\ArrayCollection;
 use Doctrine\ORM\Mapping as ORM;
 use Symfony\Component\Security\Core\User\UserInterface;
 use Symfony\Component\Security\Core\User\AdvancedUserInterface;
+use Symfony\Component\Validator\Constraints as Assert;
 
 /**
  * User
@@ -29,6 +30,11 @@ class User implements AdvancedUserInterface, \Serializable
      * @var string
      *
      * @ORM\Column(name="username", type="text")
+     * @Assert\NotBlank()
+     * @Assert\Length(
+     *      min = "3",
+     *      max = "255"
+     * )
      */
     private $username;
 
@@ -56,14 +62,16 @@ class User implements AdvancedUserInterface, \Serializable
     /**
      * @var string
      *
-     * @ORM\Column(name="email", type="text", nullable=true)
+     * @ORM\Column(name="email", type="text", nullable=false)
+     * @Assert\Email()
+     * @Assert\NotBlank()
      */
     private $email;
 
     /**
-     * @ORM\Column(name="is_active", type="boolean")
+     * @ORM\Column(name="is_active", type="boolean", nullable=false)
      */
-    private $isActive;
+    private $isActive = true;
 
     /**
      * @var date
@@ -86,9 +94,8 @@ class User implements AdvancedUserInterface, \Serializable
 
     public function __construct()
     {
-        $this->isActive = true;
-        $this->salt     = md5(uniqid(null, true));
-        $this->entries  = new ArrayCollection();
+        $this->salt    = md5(uniqid(null, true));
+        $this->entries = new ArrayCollection();
     }
 
     /**
index 8bf4ca1ef6d100924e28069644c9057207a9246c..de0ad537811b42c0fd6057d9215c10bc9ef2fdbb 100644 (file)
@@ -3,7 +3,6 @@ namespace Wallabag\CoreBundle\Form\Type;
 
 use Symfony\Component\Form\AbstractType;
 use Symfony\Component\Form\FormBuilderInterface;
-use Symfony\Component\OptionsResolver\OptionsResolverInterface;
 use Symfony\Component\Security\Core\Validator\Constraints\UserPassword;
 use Symfony\Component\Validator\Constraints;
 
@@ -23,11 +22,11 @@ class ChangePasswordType extends AbstractType
                 'second_options' => array('label' => 'Repeat new password'),
                 'constraints' => array(
                     new Constraints\Length(array(
-                        'min' => 6,
-                        'minMessage' => 'Password should by at least 6 chars long'
+                        'min' => 8,
+                        'minMessage' => 'Password should by at least 6 chars long',
                     )),
-                    new Constraints\NotBlank()
-                )
+                    new Constraints\NotBlank(),
+                ),
             ))
             ->add('save', 'submit')
         ;
index 74e2a6f1463aca4ba7025028f5128ab898333631..a1e0ce47d6502c9ab7fee79c3c8081c6a95a5d4a 100644 (file)
@@ -21,7 +21,7 @@ class ConfigType extends AbstractType
                     'solarized_dark' => 'Solarized Dark',
                 ),
             ))
-            ->add('items_per_page')
+            ->add('items_per_page', 'text')
             ->add('language')
             ->add('save', 'submit')
         ;
diff --git a/src/Wallabag/CoreBundle/Form/Type/UserType.php b/src/Wallabag/CoreBundle/Form/Type/UserType.php
new file mode 100644 (file)
index 0000000..b479a0b
--- /dev/null
@@ -0,0 +1,31 @@
+<?php
+namespace Wallabag\CoreBundle\Form\Type;
+
+use Symfony\Component\Form\AbstractType;
+use Symfony\Component\Form\FormBuilderInterface;
+use Symfony\Component\OptionsResolver\OptionsResolverInterface;
+
+class UserType extends AbstractType
+{
+    public function buildForm(FormBuilderInterface $builder, array $options)
+    {
+        $builder
+            ->add('username', 'text')
+            ->add('name', 'text')
+            ->add('email', 'text')
+            ->add('save', 'submit')
+        ;
+    }
+
+    public function setDefaultOptions(OptionsResolverInterface $resolver)
+    {
+        $resolver->setDefaults(array(
+            'data_class' => 'Wallabag\CoreBundle\Entity\User',
+        ));
+    }
+
+    public function getName()
+    {
+        return 'user';
+    }
+}
index 941451778edf4a73ef4427e28b98f258747adcfb..7a45ec1f11e6029359064b54194b6db4dba3e62f 100644 (file)
@@ -7,7 +7,7 @@
 {% endblock %}
 
 {% block content %}
-    <h2>{% trans %}Basic config{% endtrans %}</h2>
+    <h2>{% trans %}Wallabag configuration{% endtrans %}</h2>
 
     <form action="{{ path('config') }}" method="post" {{ form_enctype(configForm) }}>
         {{ form_errors(configForm) }}
         {{ form_rest(configForm) }}
     </form>
 
+    <h2>{% trans %}User information{% endtrans %}</h2>
+
+    <form action="{{ path('config') }}" method="post" {{ form_enctype(userForm) }}>
+        {{ form_errors(userForm) }}
+
+        <fieldset class="w500p inline">
+            <div class="row">
+                {{ form_label(userForm.username) }}
+                {{ form_errors(userForm.username) }}
+                {{ form_widget(userForm.username) }}
+            </div>
+        </fieldset>
+
+        <fieldset class="w500p inline">
+            <div class="row">
+                {{ form_label(userForm.name) }}
+                {{ form_errors(userForm.name) }}
+                {{ form_widget(userForm.name) }}
+            </div>
+        </fieldset>
+
+        <fieldset class="w500p inline">
+            <div class="row">
+                {{ form_label(userForm.email) }}
+                {{ form_errors(userForm.email) }}
+                {{ form_widget(userForm.email) }}
+            </div>
+        </fieldset>
+
+        {{ form_rest(userForm) }}
+    </form>
+
     <h2>{% trans %}Change your password{% endtrans %}</h2>
 
     <form action="{{ path('config') }}" method="post" {{ form_enctype(pwdForm) }}>
index 4aceed1506c5ccba21b6aab4c7e5ace06bf86a65..519b4ba25ddd37a0cfa921bb20e474e831c876ed 100644 (file)
@@ -25,9 +25,9 @@ class ConfigControllerTest extends WallabagTestCase
 
         $this->assertEquals(200, $client->getResponse()->getStatusCode());
 
-        $this->assertCount(1, $crawler->filter('input[type=number]'));
         $this->assertCount(1, $crawler->filter('button[id=config_save]'));
         $this->assertCount(1, $crawler->filter('button[id=change_passwd_save]'));
+        $this->assertCount(1, $crawler->filter('button[id=user_save]'));
     }
 
     public function testUpdate()
@@ -104,7 +104,7 @@ class ConfigControllerTest extends WallabagTestCase
                     'change_passwd[new_password][first]' => '',
                     'change_passwd[new_password][second]' => '',
                 ),
-                'Wrong value for your current password'
+                'Wrong value for your current password',
             ),
             array(
                 array(
@@ -112,7 +112,7 @@ class ConfigControllerTest extends WallabagTestCase
                     'change_passwd[new_password][first]' => '',
                     'change_passwd[new_password][second]' => '',
                 ),
-                'This value should not be blank'
+                'This value should not be blank',
             ),
             array(
                 array(
@@ -120,7 +120,7 @@ class ConfigControllerTest extends WallabagTestCase
                     'change_passwd[new_password][first]' => 'hop',
                     'change_passwd[new_password][second]' => '',
                 ),
-                'The password fields must match'
+                'The password fields must match',
             ),
             array(
                 array(
@@ -128,7 +128,7 @@ class ConfigControllerTest extends WallabagTestCase
                     'change_passwd[new_password][first]' => 'hop',
                     'change_passwd[new_password][second]' => 'hop',
                 ),
-                'Password should by at least 6 chars long'
+                'Password should by at least 6 chars long',
             ),
         );
     }
@@ -181,4 +181,83 @@ class ConfigControllerTest extends WallabagTestCase
         $this->assertGreaterThan(1, $alert = $crawler->filter('div.flash-notice')->extract(array('_text')));
         $this->assertContains('Password updated', $alert[0]);
     }
+
+    public function dataForUserFailed()
+    {
+        return array(
+            array(
+                array(
+                    'user[username]' => '',
+                    'user[name]' => '',
+                    'user[email]' => '',
+                ),
+                'This value should not be blank.',
+            ),
+            array(
+                array(
+                    'user[username]' => 'ad',
+                    'user[name]' => '',
+                    'user[email]' => '',
+                ),
+                'This value is too short.',
+            ),
+            array(
+                array(
+                    'user[username]' => 'admin',
+                    'user[name]' => '',
+                    'user[email]' => 'test',
+                ),
+                'This value is not a valid email address.',
+            ),
+        );
+    }
+
+    /**
+     * @dataProvider dataForUserFailed
+     */
+    public function testUserFailed($data, $expectedMessage)
+    {
+        $this->logInAs('admin');
+        $client = $this->getClient();
+
+        $crawler = $client->request('GET', '/config');
+
+        $this->assertEquals(200, $client->getResponse()->getStatusCode());
+
+        $form = $crawler->filter('button[id=user_save]')->form();
+
+        $crawler = $client->submit($form, $data);
+
+        $this->assertEquals(200, $client->getResponse()->getStatusCode());
+
+        $this->assertGreaterThan(1, $alert = $crawler->filter('body')->extract(array('_text')));
+        $this->assertContains($expectedMessage, $alert[0]);
+    }
+
+    public function testUserUpdate()
+    {
+        $this->logInAs('admin');
+        $client = $this->getClient();
+
+        $crawler = $client->request('GET', '/config');
+
+        $this->assertEquals(200, $client->getResponse()->getStatusCode());
+
+        $form = $crawler->filter('button[id=user_save]')->form();
+
+        $data = array(
+            'user[username]' => 'admin',
+            'user[name]' => 'new name',
+            'user[email]' => 'admin@wallabag.io',
+        );
+
+        $client->submit($form, $data);
+
+        $this->assertEquals(302, $client->getResponse()->getStatusCode());
+
+        $crawler = $client->followRedirect();
+
+        $this->assertGreaterThan(1, $alert = $crawler->filter('div.flash-notice')->extract(array('_text')));
+        $this->assertContains('Information updated', $alert[0]);
+    }
 }