From 1d7367ff541648db10150603c82abc29509cb9dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment?= Date: Tue, 3 Nov 2020 17:18:00 +0100 Subject: [PATCH] =?UTF-8?q?personne=20ratach=C3=A9e=20+=20email=20reset=20?= =?UTF-8?q?pass?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config/services.yaml | 13 +- src/Admin/PersonneAdmin.php | 131 +++++++++++++++++++ src/Admin/UserAdmin.php | 1 + src/Controller/MainController.php | 17 +++ src/Controller/SecurityController.php | 2 +- src/Controller/UserAdminController.php | 42 ++++++ templates/security/resetting-email.html.twig | 15 +++ 7 files changed, 219 insertions(+), 2 deletions(-) create mode 100644 src/Admin/PersonneAdmin.php create mode 100644 src/Controller/UserAdminController.php create mode 100644 templates/security/resetting-email.html.twig diff --git a/config/services.yaml b/config/services.yaml index 98c4dbc..fd26e0a 100644 --- a/config/services.yaml +++ b/config/services.yaml @@ -53,7 +53,7 @@ services: arguments: - ~ - App\Entity\User - - ~ + - App\Controller\UserAdminController calls: - [ setTranslationDomain, [ GlukoseAdminContactBundle ] ] - [ setLdapService, [ '@App\Controller\LdapController' ] ] @@ -80,3 +80,14 @@ services: - ~ calls: - [ setTranslationDomain, [ GlukoseAdminContactBundle ] ] + + sonata.admin.personne: + class: App\Admin\PersonneAdmin + tags: + - { name: sonata.admin, manager_type: orm, group: "Gestion des membres", label: "Personnes intéréssées" } + arguments: + - ~ + - App\Entity\Personne + - ~ + calls: + - [ setTranslationDomain, [ GlukoseAdminContactBundle ] ] diff --git a/src/Admin/PersonneAdmin.php b/src/Admin/PersonneAdmin.php new file mode 100644 index 0000000..2db1c8d --- /dev/null +++ b/src/Admin/PersonneAdmin.php @@ -0,0 +1,131 @@ + 'nom', + ]; + + protected $maxPerPage = 100; + + protected $perPageOptions = array(10, 20, 50, 100, 500, 1000); + + public function toString($object) + { + return $object instanceof Personne + ? $object->getNomAffichage() + : 'Personne intéressée'; + } + + public function getExportFields() + { + return array('nom', 'prenom', 'email', 'exportDatePremiereReunion'); + } + + public function getDataSourceIterator() + { + return new IteratorCallbackSourceIterator(parent::getDataSourceIterator(), function($data) { + $data['nom'] = mb_strtoupper($data['nom']); + return $data; + }); + } + + protected function configureFormFields(FormMapper $formMapper) + { + $formMapper + ->with('Civilité', array( + 'class' => 'col-md-6', + 'description' => ' + Cette section contient les informations principales d’une personne. +
Dans un souci d’homogénéïté, merci de bien veiller à respecter le format proposé (majuscules, espaces…). + ' + )) + ->add('nom', null, array( + 'attr' => array('placeholder' => 'Tibou') + )) + ->add('prenom', null, array( + 'label' => 'Prénom', + 'attr' => array('placeholder' => 'Jean') + )) + ->add('email', null, array( + 'attr' => array('placeholder' => 'j.tibou@example.com'), + 'help' => "Utilisée pour recontacter cette personne et savoir qu'elle est déjà venue à une réunion si elle nous contacte." + )) + ->add('datePremiereReunion', DatePickerType::class, array( + 'label' => 'Date de participation à sa première réunion', + 'required' => false, + 'format' => 'dd/MM/yyyy', + 'attr' => array( + 'data-date-format' => 'DD/MM/YYYY', + 'placeholder' => '15/01/' . date('Y') + ) + )) + ->end(); + } + + protected function configureDatagridFilters(DatagridMapper $datagridMapper) + { + $datagridMapper + ->add('full_text', 'doctrine_orm_callback', [ + 'label' => 'Recherche rapide', + 'show_filter' => true, + 'callback' => [$this, 'getFullTextFilter'], + 'field_type' => TextType::class + ]) + ->add('datePremiereReunion', 'doctrine_orm_date_range', [ + 'label' => 'Date de première réunion' + ]) + ->add('nom') + ->add('prenom', null, [ + 'label' => 'Prénom', + ]) + ->add('email') + ; + } + + public function getFullTextFilter($queryBuilder, $alias, $field, $value) + { + if (!$value['value']) { + return; + } + + $words = array_filter( + array_map('trim', explode(' ', $value['value'])) + ); + + foreach ($words as $word) { + // Use `andWhere` instead of `where` to prevent overriding existing `where` conditions + $literal = $queryBuilder->expr()->literal('%' . $word . '%'); + $queryBuilder->andWhere($queryBuilder->expr()->orX( + $queryBuilder->expr()->like($alias.'.nom', $literal), + $queryBuilder->expr()->like($alias.'.prenom', $literal), + $queryBuilder->expr()->like($alias.'.email', $literal) + )); + } + + return true; + } + + protected function configureListFields(ListMapper $listMapper) + { + $listMapper + ->addIdentifier('nom') + ->add('prenom', null, array('label' => 'Prénom')) + ->addIdentifier('email') + ->add('datePremiereReunion', null, array('label' => 'Date de première réunion')) + ; + } + +} diff --git a/src/Admin/UserAdmin.php b/src/Admin/UserAdmin.php index 10e1070..a994ed5 100755 --- a/src/Admin/UserAdmin.php +++ b/src/Admin/UserAdmin.php @@ -333,6 +333,7 @@ protected function configureDatagridFilters(DatagridMapper $datagridMapper) 'label' => 'Prénom', ]) ->add('email') + ->add('gh') ->add('carteImprimee', null, ['label' => 'Carte imprimée ?']) ->add('enabled', null, ['label' => 'Actif ?']) ; diff --git a/src/Controller/MainController.php b/src/Controller/MainController.php index bd4fad3..39b9c58 100644 --- a/src/Controller/MainController.php +++ b/src/Controller/MainController.php @@ -3,6 +3,7 @@ namespace App\Controller; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; +use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Annotation\Route; @@ -15,4 +16,20 @@ public function index(): Response { return $this->render('main/index.html.twig', [ ]); } + + /** + * @Route("/api/export/gh", name="chouette_coop_admin_export_gh") + */ + public function exportGHCodeBarreAction() + { + $listGh = array(); + $repositoryU = $this->getDoctrine()->getManager()->getRepository('App:User'); + + $users = $repositoryU->findBy(array('gh' => 1)); + /** @var User $gh */ + foreach ($users as $gh){ + $listGh []= $gh->getCodeBarre(); + } + return new JsonResponse($listGh); + } } diff --git a/src/Controller/SecurityController.php b/src/Controller/SecurityController.php index 683cce9..db7e23e 100644 --- a/src/Controller/SecurityController.php +++ b/src/Controller/SecurityController.php @@ -78,7 +78,7 @@ public function forgottenPassword(Request $request, ->from('bureau-des-membres@lachouettecoop.fr') ->to($user->getEmail()) ->html( - "Bonjour,

Vous pouvez changer votre mot de passe en suivant le lien suivant '.$url.'

La Chouette Coop', + $this->renderView('security/resetting-email.html.twig', ['confirmationUrl' => $url, 'user' =>$user]), 'text/html' ); diff --git a/src/Controller/UserAdminController.php b/src/Controller/UserAdminController.php new file mode 100644 index 0000000..a9b4038 --- /dev/null +++ b/src/Controller/UserAdminController.php @@ -0,0 +1,42 @@ +admin->isGranted('EDIT')) { + throw new AccessDeniedException(); + } + + $modelManager = $this->admin->getModelManager(); + $selectedModels = $selectedModelQuery->execute(); + try { + foreach ($selectedModels as $selectedModel) { + $selectedModel->setCarteImprimee(true); + $modelManager->update($selectedModel); + } + } catch (\Exception $e) { + $this->addFlash('sonata_flash_error', 'Une erreur est survenue'); + + return new RedirectResponse( + $this->admin->generateUrl('list', $this->admin->getFilterParameters()) + ); + } + + $this->addFlash('sonata_flash_success', 'Impeccable ! T’es au top, merci…'); + + return new RedirectResponse( + $this->admin->generateUrl('list', $this->admin->getFilterParameters()) + ); + } + + +} \ No newline at end of file diff --git a/templates/security/resetting-email.html.twig b/templates/security/resetting-email.html.twig new file mode 100644 index 0000000..2cfcd18 --- /dev/null +++ b/templates/security/resetting-email.html.twig @@ -0,0 +1,15 @@ +{% autoescape false %} + Bonjour {{ user }} ! +

+ Pour réinitialiser votre mot de passe, merci de vous rendre sur {{ confirmationUrl }} +

+ Cordialement,
+ L'équipe.
+

+ POUR VOTRE INFORMATION : pour les Chouettos qui ont un profil Facebook, n'hésitez pas à rejoindre le groupe des Chouettos + sur Facebook ! Ce groupe est réservé aux membres de La Chouette Coop pour échanger et fédérer les énergies autour du projet de supermarché coopératif et participatif. + Pour ce faire rendez vous sur le Facebook les Chouettos. +

+
+ +{% endautoescape %} \ No newline at end of file