diff --git a/.env.test b/.env.test index 47001204..69562c40 100644 --- a/.env.test +++ b/.env.test @@ -5,3 +5,4 @@ SYMFONY_DEPRECATIONS_HELPER=disabled DATABASE_URL=postgresql://resop:postgrespwd@postgres/resop-test?serverVersion=11&charset=utf8 PANTHER_CHROME_ARGUMENTS="--headless --no-sandbox" PANTHER_APP_ENV=panther +APP_SLOT_INTERVAL="+2 hours" diff --git a/assets/js/_planning-missions.js b/assets/js/_planning-missions.js index cfd92dbf..0b1b019b 100644 --- a/assets/js/_planning-missions.js +++ b/assets/js/_planning-missions.js @@ -16,11 +16,11 @@ function setSlotMisssion(mission, $slot) { missionsText += ' '; // User part - let url = Routing.generate('app_user_availability_mission_modal', { id: mission.id }); + let url = Routing.generate('app_user_availability_mission_modal', { mission: mission.id }); if (window.location.pathname.indexOf('organizations') >= 0 && !!mission?.organization?.id) { // Organization part - url = Routing.generate('app_organization_mission_modal', { organization: mission.organization.id, id: mission.id }); + url = Routing.generate('app_organization_mission_modal', { organization: mission.organization.id, mission: mission.id }); } missionsText += $(` - + + + - {% include 'organization/_help.html.twig' %} + {% include 'organization/_help.html.twig' %} - {{ 'action.logout' | trans }} + {{ 'action.logout' | trans }} - - - {{ app.user }} - - {% endif %} + + + {{ app.request.attributes.get('currentOrganization') }} + diff --git a/templates/organization/commissionable_asset/_list.html.twig b/templates/organization/commissionable_asset/_list.html.twig index 9d8cee29..a4d36b07 100644 --- a/templates/organization/commissionable_asset/_list.html.twig +++ b/templates/organization/commissionable_asset/_list.html.twig @@ -32,7 +32,7 @@ {% if showLinks is not defined or showLinks %} - diff --git a/templates/organization/commissionable_asset/_show.html.twig b/templates/organization/commissionable_asset/_show.html.twig index 9e228fc4..fbdf6127 100644 --- a/templates/organization/commissionable_asset/_show.html.twig +++ b/templates/organization/commissionable_asset/_show.html.twig @@ -1,5 +1,5 @@ -{% if app.user == asset.organization or app.user == asset.organization.parent %} - {{ 'action.edit' | trans }} +{% if is_granted('ROLE_PARENT_ORGANIZATION', asset.organization) %} + {{ 'action.edit' | trans }} {% endif %}

{{ asset }}

diff --git a/templates/organization/commissionable_asset/form.html.twig b/templates/organization/commissionable_asset/form.html.twig index 8f07516d..693df12a 100644 --- a/templates/organization/commissionable_asset/form.html.twig +++ b/templates/organization/commissionable_asset/form.html.twig @@ -11,7 +11,7 @@ class="btn btn-outline-danger trigger-delete float-right" data-message="{{ 'message.deleteAssetWarning' | trans }}" data-display-name="{{ asset }}" - data-href="{{ path('app_organization_asset_delete', { asset: asset.id, organization: asset.organization.id }) }}" + data-href="{{ path('app_organization_asset_delete', { asset: asset.id }) }}" href="#" >{{ 'action.delete' | trans }} {% endif %} diff --git a/templates/organization/commissionable_asset/list.html.twig b/templates/organization/commissionable_asset/list.html.twig index 0a0c863b..ba9ff830 100644 --- a/templates/organization/commissionable_asset/list.html.twig +++ b/templates/organization/commissionable_asset/list.html.twig @@ -14,7 +14,7 @@
- + {{ 'organization.asset.add' | trans }}
diff --git a/templates/organization/commissionable_asset/preAdd.html.twig b/templates/organization/commissionable_asset/preAdd.html.twig index 4ec23805..5b431a92 100644 --- a/templates/organization/commissionable_asset/preAdd.html.twig +++ b/templates/organization/commissionable_asset/preAdd.html.twig @@ -1,7 +1,7 @@ {% extends 'organization/base.html.twig' %} {% block body %} - {{ form_start(form, { method: 'GET', action: path('app_organization_asset_add', {organization: organization.id | default(app.user.id)})}) }} + {{ form_start(form, { method: 'GET', action: path('app_organization_asset_add')}) }} {{ form_rest(form) }} {{ form_end(form) }} {% endblock %} diff --git a/templates/organization/edit.html.twig b/templates/organization/edit.html.twig index 5b2f8c10..79b21b85 100644 --- a/templates/organization/edit.html.twig +++ b/templates/organization/edit.html.twig @@ -4,7 +4,7 @@ {% set formAction = path('app_organization_new') %} {% set formTitle = 'organization.add' | trans %} {% else %} - {% set formAction = path('app_organization_edit', { object: organization.id }) %} + {% set formAction = path('app_organization_edit', { organizationToEdit: organization.id }) %} {% set formTitle = 'organization.edit' | trans %} {% endif %} diff --git a/templates/organization/home.html.twig b/templates/organization/home.html.twig index a934fa53..3edd8896 100644 --- a/templates/organization/home.html.twig +++ b/templates/organization/home.html.twig @@ -5,27 +5,27 @@ {% block body %} {{ include('misc/flash-messages.html.twig') }} -

{{ app.user }}

+

{{ organization }}

{{ 'calendar.week.current' | trans }} : {{ 'calendar.period' | trans ({ '%from%' : 'this week' | date('d/m/Y'), '%to%' : 'sunday this week' | date('d/m/Y') }) }}

- + {{ 'organization.userAvailabilityCurrentWeek' | trans }}

{{ 'calendar.week.next' | trans }} : {{ 'calendar.period' | trans ({ '%from%' : 'next week' | date('d/m/Y'), '%to%' : 'sunday next week' | date('d/m/Y') }) }}

- + {{ 'organization.userAvailabilityNextWeek' | trans }}


-

{{ 'organization.showUserList' | trans }}

-

{{ 'organization.showCommissionableAssets' | trans }}

+

{{ 'organization.showUserList' | trans }}

+

{{ 'organization.showCommissionableAssets' | trans }}

- {% if app.user.isParent() %} + {% if organization.isParent() %}

{{ 'organization.showAllUsersAvailability' | trans }}

{{ 'organization.forecast.title' | trans }}

diff --git a/templates/organization/list.html.twig b/templates/organization/list.html.twig index d81c5084..d8a11b4a 100644 --- a/templates/organization/list.html.twig +++ b/templates/organization/list.html.twig @@ -3,7 +3,7 @@ {% block title %}{{ 'organization.list' | trans }}{% endblock %} {% block body %} -

{{ app.user }}

+

{{ organization }}

@@ -19,14 +19,14 @@ - {% for organization in organizations %} + {% for child in organization.children %} - {{ organization.name }} + {{ child.name }} - {{ 'action.edit' | trans }} - {{ 'organization.userList' | trans }} - {{ 'organization.assetsList' | trans }} - {{ 'organization.userAvailabilities' | trans }} + {{ 'action.edit' | trans }} + {{ 'organization.userList' | trans }} + {{ 'organization.assetsList' | trans }} + {{ 'organization.userAvailabilities' | trans }} {% endfor %} diff --git a/templates/organization/login.html.twig b/templates/organization/login.html.twig deleted file mode 100644 index d814e45e..00000000 --- a/templates/organization/login.html.twig +++ /dev/null @@ -1,55 +0,0 @@ -{% extends 'organization/base.html.twig' %} - -{% block title %}{{ 'action.login' | trans }}{% endblock %} - -{% block body %} -
-
-
- {% if error %} -
- {{ error.messageKey|trans(error.messageData, 'security_organization') }} -
- {% endif %} - -

{{ 'action.login' | trans }}

- -
- - -
- -
- - -
- -
- -
- - - - -
-
-
- -{% endblock %} diff --git a/templates/organization/mission/_list.html.twig b/templates/organization/mission/_list.html.twig index c8219ca7..785040d3 100644 --- a/templates/organization/mission/_list.html.twig +++ b/templates/organization/mission/_list.html.twig @@ -58,7 +58,7 @@ {% endif %} {% if modalLinks is not defined or modalLinks %} - {% endif %} diff --git a/templates/organization/mission/_list_full.html.twig b/templates/organization/mission/_list_full.html.twig index 0d2cbb83..3cbb0a06 100644 --- a/templates/organization/mission/_list_full.html.twig +++ b/templates/organization/mission/_list_full.html.twig @@ -23,7 +23,7 @@ {{ mission.type.name | default('') }} - @@ -45,7 +45,7 @@ {{ user.organization.name }} - @@ -66,7 +66,7 @@ {{ asset.organization.name }} - diff --git a/templates/organization/mission/_show.html.twig b/templates/organization/mission/_show.html.twig index d6510371..d99b2cdd 100644 --- a/templates/organization/mission/_show.html.twig +++ b/templates/organization/mission/_show.html.twig @@ -1,4 +1,4 @@ -{% if app.user == mission.organization %} +{% if organization == mission.organization %} {{ 'action.edit' | trans }} {% endif %} diff --git a/templates/organization/planning/_availabilities_assets.html.twig b/templates/organization/planning/_availabilities_assets.html.twig index b233ccd2..8d7e5b85 100644 --- a/templates/organization/planning/_availabilities_assets.html.twig +++ b/templates/organization/planning/_availabilities_assets.html.twig @@ -11,7 +11,7 @@ {% endblock itemDataHeader %} {% block itemDataRowHeader %} - {% endblock itemDataRowHeader %} diff --git a/templates/organization/planning/_availabilities_users.html.twig b/templates/organization/planning/_availabilities_users.html.twig index 45f75c23..d596da04 100644 --- a/templates/organization/planning/_availabilities_users.html.twig +++ b/templates/organization/planning/_availabilities_users.html.twig @@ -14,7 +14,7 @@ {% endblock itemDataHeader %} {% block itemDataRowHeader %} - @@ -41,7 +41,7 @@ from: periodCalculator.from | date('Y-m-d\\T00:00:00'), to: periodCalculator.to | date_modify('- 1 minute') | date('Y-m-d\\T00:00:00'), organization: item.entity.organization.id, - userToAdd: item.entity.id + user: item.entity.id }) }}" title="{{ 'organization.asset.engage' | trans }}" > {{ 'organization.mission.title' | trans }} diff --git a/templates/organization/planning/_results.html.twig b/templates/organization/planning/_results.html.twig index 68dd456d..fff30a5a 100644 --- a/templates/organization/planning/_results.html.twig +++ b/templates/organization/planning/_results.html.twig @@ -1,4 +1,4 @@ -{% set displayActions = app.user.parent is empty %} +{% set displayActions = organization.parent is empty %}
diff --git a/templates/organization/search.html.twig b/templates/organization/search.html.twig index 87cd27aa..e7c9e885 100644 --- a/templates/organization/search.html.twig +++ b/templates/organization/search.html.twig @@ -15,11 +15,11 @@

Bénévoles

{% if users|length %} - {% include 'organization/user/_list.html.twig' with {organization: app.user} %} + {% include 'organization/user/_list.html.twig' %} {% else %}

{{ 'organization.search.noUsers' | trans }}

{% endif %} -

Afficher la liste de mes bénévoles inscrits

+

Afficher la liste de mes bénévoles inscrits


Véhicules

@@ -28,5 +28,5 @@ {% else %}

{{ 'organization.search.noAssets' | trans }}

{% endif %} -

Afficher la liste de mes véhicules

+

Afficher la liste de mes véhicules

{% endblock %} diff --git a/templates/organization/user/_list.html.twig b/templates/organization/user/_list.html.twig index 385439b0..358867d1 100644 --- a/templates/organization/user/_list.html.twig +++ b/templates/organization/user/_list.html.twig @@ -38,7 +38,7 @@ {% if showLinks is not defined or showLinks %} - diff --git a/templates/organization/user/_show.html.twig b/templates/organization/user/_show.html.twig index 9f14a4e1..48ab9870 100644 --- a/templates/organization/user/_show.html.twig +++ b/templates/organization/user/_show.html.twig @@ -1,5 +1,5 @@ -{% if app.user == user.organization or app.user == user.organization.parent %} - {{ 'action.edit' | trans }} +{% if is_granted('ROLE_PARENT_ORGANIZATION', user.organization) %} + {{ 'action.edit' | trans }} {% endif %}

{{ user }}

diff --git a/templates/organization/user/edit.html.twig b/templates/organization/user/edit.html.twig index d9212767..d1dad217 100644 --- a/templates/organization/user/edit.html.twig +++ b/templates/organization/user/edit.html.twig @@ -12,7 +12,7 @@ class="btn btn-outline-danger trigger-delete float-right" data-message="{{ 'message.deleteUserWarning' | trans }}" data-display-name="{{ user.firstName }} {{ user.lastName }} ( {{ user.identificationNumber }} )" - data-href="{{ path('app_organization_user_delete', { 'userToDelete': user.id }) }}" + data-href="{{ path('app_organization_user_delete', { user: user.id }) }}" href="#" >{{ 'action.delete' | trans }} diff --git a/templates/user/account-form.html.twig b/templates/user/account-form.html.twig index aa03b3dd..c2232583 100644 --- a/templates/user/account-form.html.twig +++ b/templates/user/account-form.html.twig @@ -1,6 +1,6 @@ {% extends 'base.html.twig' %} -{% set actionName = (user is defined and user.id is not null) ? 'Modification' : 'Création' %} +{% set actionName = (user is defined and user.id is not null) ? 'Modification' : 'Création' %} {% block title %}{{ 'user.accountAction' | trans({ '%action%' : actionName }) }}{% endblock %} {% block javascripts %} diff --git a/templates/user/index.html.twig b/templates/user/index.html.twig index 97befd46..9b882fee 100644 --- a/templates/user/index.html.twig +++ b/templates/user/index.html.twig @@ -6,7 +6,10 @@ {{ include('misc/flash-messages.html.twig') }}

{{ 'user.welcome' | trans({'%name%': app.user.fullName}) }}

{{ 'user.identificationNumber' | trans }} : {{ app.user.identificationNumber }}

-

{{ 'user.editMyInfo' | trans }}

+

+ {{ 'user.editMyInfo' | trans }} + {{ (app.user.password is empty ? 'user.createMyPassword' : 'user.editMyPassword') | trans }} +


diff --git a/templates/user/login.html.twig b/templates/user/login.html.twig index e35247ce..d15719b0 100644 --- a/templates/user/login.html.twig +++ b/templates/user/login.html.twig @@ -23,6 +23,7 @@ {{ form_start(loginForm) }} {{ form_row(loginForm.identifier) }} {{ form_row(loginForm.birthday) }} + {{ form_row(loginForm.password) }}
diff --git a/templates/user/password-form.html.twig b/templates/user/password-form.html.twig new file mode 100644 index 00000000..446419ec --- /dev/null +++ b/templates/user/password-form.html.twig @@ -0,0 +1,29 @@ +{% extends 'base.html.twig' %} + +{% block title %}{{ 'user.passwordAction' | trans }}{% endblock %} + +{% block body %} +

{{ 'user.passwordAction' | trans }}

+ + {{ form_start(form) }} + {{ form_errors(form) }} + +
+ {% if form.currentPassword is defined %} +
+ {{ form_row(form.currentPassword) }} +
+ {% endif %} +
+ {{ form_row(form.plainPassword) }} +
+
+ +
+
+ +
+
+
+ {{ form_end(form) }} +{% endblock %} diff --git a/tests/Behat/SecurityContext.php b/tests/Behat/SecurityContext.php index bc7cf07e..2798ce3b 100644 --- a/tests/Behat/SecurityContext.php +++ b/tests/Behat/SecurityContext.php @@ -4,9 +4,6 @@ namespace App\Tests\Behat; -use App\Entity\Organization; -use App\Entity\User; -use App\Repository\OrganizationRepository; use App\Repository\UserRepository; use Behat\Behat\Context\Environment\InitializedContextEnvironment; use Behat\Behat\Hook\Scope\BeforeScenarioScope; @@ -15,7 +12,6 @@ use Behat\MinkExtension\Context\MinkContext; use Behat\MinkExtension\Context\RawMinkContext; use PantherExtension\Driver\PantherDriver; -use Symfony\Bridge\Doctrine\Security\User\UserLoaderInterface; use Symfony\Component\BrowserKit\Cookie; use Symfony\Component\HttpFoundation\Session\SessionInterface; use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken; @@ -25,14 +21,12 @@ final class SecurityContext extends RawMinkContext { private UserRepository $userRepository; - private OrganizationRepository $organizationRepository; private SessionInterface $session; private MinkContext $minkContext; - public function __construct(UserRepository $userRepository, OrganizationRepository $organizationRepository, SessionInterface $session) + public function __construct(UserRepository $userRepository, SessionInterface $session) { $this->userRepository = $userRepository; - $this->organizationRepository = $organizationRepository; $this->session = $session; } @@ -51,16 +45,11 @@ public function gatherContext(BeforeScenarioScope $scope): void /** * @Given I am authenticated as :username */ - public function login(string $username, UserLoaderInterface $repository = null): void + public function login(string $username): void { - if ($repository) { - $user = $repository->loadUserByUsername($username); - } elseif (!$user = $this->userRepository->loadUserByUsername($username)) { - $user = $this->organizationRepository->loadUserByUsername($username); - } - + $user = $this->userRepository->loadUserByUsername($username); if (!$user) { - throw new UsernameNotFoundException(\sprintf('%s is not a valid User or Organization.', $username)); + throw new UsernameNotFoundException(\sprintf('%s is not a valid User.', $username)); } /** @var BrowserKitDriver|PantherDriver $driver */ @@ -72,10 +61,9 @@ public function login(string $username, UserLoaderInterface $repository = null): return; } - $firewall = $user instanceof Organization ? 'organizations' : 'main'; $this->session->set( - "_security_$firewall", - serialize(new UsernamePasswordToken($user, null, $firewall, $user->getRoles())) + '_security_main', + serialize(new UsernamePasswordToken($user, null, 'main', $user->getRoles())) ); $this->session->save(); @@ -88,32 +76,13 @@ public function login(string $username, UserLoaderInterface $repository = null): private function loginForPanther(UserInterface $user): void { try { - if ($user instanceof User) { - $this->loginUserForPantherDriver($user); - } - - if ($user instanceof Organization) { - $this->loginOrganizationForPantherDriver($user); - } + $this->minkContext->visit('/login'); + $this->minkContext->fillField('user_login[identifier]', $user->getUsername()); + $this->minkContext->fillField('user_login[password]', 'covid19'); + $this->minkContext->pressButton('Je me connecte'); + $this->minkContext->assertPageAddress('/'); } catch (\Exception $exception) { throw new ExpectationException(sprintf('Impossible to connect user: %s', $exception->getMessage()), $this->getSession(), $exception); } } - - private function loginUserForPantherDriver(User $user): void - { - $this->minkContext->visit('/login'); - $this->minkContext->fillField('user_login[identifier]', $user->getIdentificationNumber()); - $this->minkContext->pressButton('Je me connecte'); - $this->minkContext->assertPageAddress('/'); - } - - private function loginOrganizationForPantherDriver(Organization $user): void - { - $this->minkContext->visit('/organizations/login'); - $this->minkContext->selectOption('identifier', $user->getUsername()); - $this->minkContext->fillField('password', 'covid19'); - $this->minkContext->pressButton('Je me connecte'); - $this->minkContext->assertPageAddress('/organizations/'.$user->getId()); - } } diff --git a/tests/Behat/UserPlanningContext.php b/tests/Behat/UserPlanningContext.php index 4681d008..094f4413 100644 --- a/tests/Behat/UserPlanningContext.php +++ b/tests/Behat/UserPlanningContext.php @@ -4,12 +4,20 @@ namespace App\Tests\Behat; +use App\Domain\DatePeriodCalculator; use Behat\Mink\Exception\ElementNotFoundException; use Behat\Mink\Exception\ExpectationException; use Behat\MinkExtension\Context\RawMinkContext; final class UserPlanningContext extends RawMinkContext { + private string $slotInterval; + + public function __construct(string $slotInterval) + { + $this->slotInterval = $slotInterval; + } + /** * @When /^I (?P(?:check|uncheck)) "(?P