Compare commits
22 Commits
9b42f328ae
...
upgrade-sf
Author | SHA1 | Date | |
---|---|---|---|
bf29c7756f
|
|||
002fd7b632
|
|||
8d70ca871b
|
|||
ca84e9416d
|
|||
e03b0f71bf
|
|||
e287a832d2
|
|||
1b5b62ba49
|
|||
eb3c561f85
|
|||
008291bddb
|
|||
c466dc297c
|
|||
2c6fb97f31 | |||
|
c58443dd72 | ||
b6c17f62d0 | |||
7712d146c7 | |||
8a83372e2f | |||
883725af10 | |||
|
7faee98294 | ||
96e0c4c97e | |||
921726ec75 | |||
61a77cc1de | |||
|
0c65d3d681 | ||
9c125c6af6 |
3
.changes/v1.5.0.md
Normal file
3
.changes/v1.5.0.md
Normal file
@@ -0,0 +1,3 @@
|
||||
## v1.5.0 - 2024-02-08
|
||||
### Release
|
||||
* Update dependencies. Chill-bundles upgraded from 2.16.0 to 2.16.1
|
5
.changes/v1.6.0.md
Normal file
5
.changes/v1.6.0.md
Normal file
@@ -0,0 +1,5 @@
|
||||
## v1.6.0 - 2024-02-12
|
||||
### Release
|
||||
* Update dependencies. Chill-bundles upgraded from 2.16.1 to 2.16.1
|
||||
### Fixed
|
||||
* Overwriting of bundles translations removed
|
5
.changes/v1.7.0.md
Normal file
5
.changes/v1.7.0.md
Normal file
@@ -0,0 +1,5 @@
|
||||
## v1.7.0 - 2024-02-13
|
||||
### Release
|
||||
* Update dependencies. Chill-bundles upgraded from 2.16.1 to 2.16.1
|
||||
### Fixed
|
||||
* Upgrade vue to fix multiselect
|
3
.env.dev
3
.env.dev
@@ -11,5 +11,8 @@ MAILER_URL=smtp://smtp:1025
|
||||
PGADMIN_DEFAULT_EMAIL=admin@chill.social
|
||||
PGADMIN_DEFAULT_PASSWORD=password
|
||||
|
||||
|
||||
VAR_DUMPER_SERVER=dumper:9912
|
||||
|
||||
## Phpstorm IDE project path
|
||||
PROJECT_DIR=
|
||||
|
16
CHANGELOG.md
16
CHANGELOG.md
@@ -6,6 +6,22 @@ adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html),
|
||||
and is generated by [Changie](https://github.com/miniscruff/changie).
|
||||
|
||||
|
||||
## v1.7.0 - 2024-02-13
|
||||
### Release
|
||||
* Update dependencies. Chill-bundles upgraded from 2.16.1 to 2.16.1
|
||||
### Fixed
|
||||
* Upgrade vue to fix multiselect
|
||||
|
||||
## v1.6.0 - 2024-02-12
|
||||
### Release
|
||||
* Update dependencies. Chill-bundles upgraded from 2.16.1 to 2.16.1
|
||||
### Fixed
|
||||
* Overwriting of bundles translations removed
|
||||
|
||||
## v1.5.0 - 2024-02-08
|
||||
### Release
|
||||
* Update dependencies. Chill-bundles upgraded from 2.16.0 to 2.16.1
|
||||
|
||||
## v1.4.4 - 2024-02-08
|
||||
### Fixed
|
||||
* fix incorrect upgrade
|
||||
|
2
Makefile
2
Makefile
@@ -2,7 +2,7 @@ THIS_FILE := $(lastword $(MAKEFILE_LIST))
|
||||
PWD:=$(shell echo ${PWD})
|
||||
UID:=$(shell id -u)
|
||||
GID:=$(shell id -g)
|
||||
DOCKERNODE_CMD=docker run --rm --user ${UID}:${GID} -v ${PWD}:/app --workdir /app -e YARN_CACHE_FOLDER=/app/.yarncache node:16
|
||||
DOCKERNODE_CMD=docker run --rm --user ${UID}:${GID} -v ${PWD}:/app --workdir /app -e YARN_CACHE_FOLDER=/app/.yarncache node:20
|
||||
DOCKER_COMPOSE_PHP_EXEC_CMD=docker-compose run --rm --user $(UID):$(GID) -e CLEAR_CACHE=false -e COMPOSER_HOME=/var/www/app/.composer --entrypoint /usr/bin/env php
|
||||
DOCKER_PHP_EXEC_CMD_BASE=docker run --rm --user $(UID):$(GID) -v ${PWD}:/var/www/app -e CLEAR_CACHE=false -e COMPOSER_HOME=/var/www/app/.composer --entrypoint /usr/bin/env $(PHP_BASE_IMAGE_TAG)
|
||||
PHP_BASE_IMAGE=php:8.2-fpm-alpine
|
||||
|
@@ -15,14 +15,14 @@
|
||||
},
|
||||
"require": {
|
||||
"ext-redis": "*",
|
||||
"chill-project/chill-bundles": "^2.16",
|
||||
"chill-project/chill-bundles": "dev-upgrade-sf5@dev",
|
||||
"symfony/flex": "^1.9",
|
||||
"nelmio/alice": "^3.8",
|
||||
"phpoffice/phpword": "^0.18.2",
|
||||
"phpstan/phpstan": "^1.0",
|
||||
"spomky-labs/base64url": "^2.0",
|
||||
"twig/string-extra": "^3.3",
|
||||
"symfony/runtime": "5.4.*"
|
||||
"symfony/runtime": "^5.4"
|
||||
},
|
||||
"require-dev": {
|
||||
"fakerphp/faker": "^1.13",
|
||||
|
2848
composer.lock
generated
2848
composer.lock
generated
File diff suppressed because it is too large
Load Diff
@@ -36,5 +36,4 @@ return [
|
||||
KnpU\OAuth2ClientBundle\KnpUOAuth2ClientBundle::class => ['all' => true],
|
||||
Lexik\Bundle\JWTAuthenticationBundle\LexikJWTAuthenticationBundle::class => ['all' => true],
|
||||
Chill\EventBundle\ChillEventBundle::class => ['all' => true],
|
||||
ChampsLibres\AsyncUploaderBundle\ChampsLibresAsyncUploaderBundle::class => ['all' => true],
|
||||
];
|
||||
|
14
config/packages/cache_chill.yaml
Normal file
14
config/packages/cache_chill.yaml
Normal file
@@ -0,0 +1,14 @@
|
||||
framework:
|
||||
cache:
|
||||
default_redis_provider: '%env(resolve:REDIS_URL)%'
|
||||
pools:
|
||||
cache.user_data:
|
||||
adapter: cache.adapter.redis
|
||||
public: true
|
||||
default_lifetime: 300 # 5 minutes
|
||||
|
||||
# will be used in chill_main.tag_aware_cache service
|
||||
cache.tags:
|
||||
adapter: cache.adapter.redis
|
||||
public: false
|
||||
default_lifetime: 300
|
@@ -27,6 +27,12 @@ chill_main:
|
||||
y: '%env(float:ADD_ADDRESS_MAP_CENTER_Y)%'
|
||||
z: '%env(float:ADD_ADDRESS_MAP_CENTER_Z)%'
|
||||
|
||||
when@test:
|
||||
chill_main:
|
||||
available_languages:
|
||||
- 'fr'
|
||||
- 'en'
|
||||
|
||||
chill_custom_fields:
|
||||
show_empty_values_in_views: false
|
||||
|
||||
|
@@ -1,88 +0,0 @@
|
||||
chill_main:
|
||||
cruds:
|
||||
-
|
||||
class: 'App\Entity\VendeePerson'
|
||||
controller: 'App\Controller\VendeePersonController'
|
||||
name: vendeeperson
|
||||
base_path: /vendee/vendeeperson
|
||||
actions:
|
||||
infosociopro_edit:
|
||||
controller_action: 'infosocioproEdit'
|
||||
path: '/{id}/infosociopro/edit'
|
||||
role: CHILL_PERSON_EDIT
|
||||
infosociopro_view:
|
||||
controller_action: 'infosocioproView'
|
||||
path: '/{id}/infosociopro/view'
|
||||
role: CHILL_PERSON_VIEW
|
||||
entourage_edit:
|
||||
controller_action: 'entourageEdit'
|
||||
path: '/{id}/entourage/edit'
|
||||
role: CHILL_PERSON_EDIT
|
||||
entourage_view:
|
||||
controller_action: 'entourageView'
|
||||
path: '/{id}/entourage/view'
|
||||
role: CHILL_PERSON_VIEW
|
||||
infomedicale_edit:
|
||||
controller_action: 'infomedicaleEdit'
|
||||
path: '/{id}/infomedicale/edit'
|
||||
role: CHILL_PERSON_EDIT
|
||||
infomedicale_view:
|
||||
controller_action: 'infomedicaleView'
|
||||
path: '/{id}/infomedicale/view'
|
||||
role: CHILL_PERSON_VIEW
|
||||
infologement_edit:
|
||||
controller_action: 'infologementEdit'
|
||||
path: '/{id}/infologement/edit'
|
||||
role: CHILL_PERSON_EDIT
|
||||
infologement_view:
|
||||
controller_action: 'infologementView'
|
||||
path: '/{id}/infologement/view'
|
||||
role: CHILL_PERSON_VIEW
|
||||
-
|
||||
class: 'App\Entity\VendeePersonMineur'
|
||||
controller: 'App\Controller\VendeePersonMineurController'
|
||||
name: vendeepersonmineur
|
||||
base_path: /vendee/vendeepersonmineur
|
||||
actions:
|
||||
infofamille_edit:
|
||||
controller_action: 'infofamilleEdit'
|
||||
path: '/{id}/infofamille/edit'
|
||||
role: CHILL_PERSON_EDIT
|
||||
infofamille_view:
|
||||
controller_action: 'infofamilleView'
|
||||
path: '/{id}/infofamille/view'
|
||||
role: CHILL_PERSON_VIEW
|
||||
scolarite_edit:
|
||||
controller_action: 'scolariteEdit'
|
||||
path: '/{id}/scolarite/edit'
|
||||
role: CHILL_PERSON_EDIT
|
||||
scolarite_view:
|
||||
controller_action: 'scolariteView'
|
||||
path: '/{id}/scolarite/view'
|
||||
role: CHILL_PERSON_VIEW
|
||||
infomedicale_edit:
|
||||
controller_action: 'infomedicaleEdit'
|
||||
path: '/{id}/infomedicale/edit'
|
||||
role: CHILL_PERSON_EDIT
|
||||
infomedicale_view:
|
||||
controller_action: 'infomedicaleView'
|
||||
path: '/{id}/infomedicale/view'
|
||||
role: CHILL_PERSON_VIEW
|
||||
-
|
||||
class: 'App\Entity\Security\Profile'
|
||||
name: vendee_security_profile
|
||||
base_path: '/admin/vendee/security/profile'
|
||||
base_role: ROLE_ADMIN
|
||||
form_class: 'App\Form\Security\ProfileType'
|
||||
controller: 'App\Controller\SecurityProfileController'
|
||||
actions:
|
||||
index:
|
||||
template: '/Security/Profile/index.html.twig'
|
||||
role: ROLE_ADMIN
|
||||
new:
|
||||
role: ROLE_ADMIN
|
||||
template: '/Security/Profile/new.html.twig'
|
||||
edit:
|
||||
role: ROLE_ADMIN
|
||||
template: '/Security/Profile/edit.html.twig'
|
||||
|
@@ -1,3 +0,0 @@
|
||||
twig:
|
||||
globals:
|
||||
responsive_debug: false
|
@@ -12,7 +12,8 @@ doctrine:
|
||||
geometry: string
|
||||
# IMPORTANT: You MUST configure your server version,
|
||||
# either here or in the DATABASE_URL env var (see .env file)
|
||||
#server_version: '15'
|
||||
#server_version: '16'
|
||||
use_savepoints: true
|
||||
orm:
|
||||
auto_generate_proxy_classes: true
|
||||
naming_strategy: doctrine.orm.naming_strategy.default
|
||||
|
@@ -2,25 +2,9 @@ doctrine_migrations:
|
||||
migrations_paths:
|
||||
# migrations for custom modules
|
||||
'Application\Migrations': '%kernel.project_dir%/migrations'
|
||||
# migrations for default chill modules
|
||||
'Chill\Migrations\Main': '@ChillMainBundle/migrations'
|
||||
'Chill\Migrations\Activity': '@ChillActivityBundle/migrations'
|
||||
'Chill\Migrations\DocStore': '@ChillDocStoreBundle/migrations'
|
||||
'Chill\Migrations\CustomFields': '@ChillCustomFieldsBundle/migrations'
|
||||
'Chill\Migrations\Event': '@ChillEventBundle/migrations'
|
||||
'Chill\Migrations\Person': '@ChillPersonBundle/migrations'
|
||||
'Chill\Migrations\Task': '@ChillTaskBundle/migrations'
|
||||
'Chill\Migrations\ThirdParty': '@ChillThirdPartyBundle/migrations'
|
||||
'Chill\Migrations\DocGenerator': '@ChillDocGeneratorBundle/migrations'
|
||||
'Chill\Migrations\AsideActivity': '@ChillAsideActivityBundle/migrations'
|
||||
'Chill\Migrations\Calendar': '@ChillCalendarBundle/migrations'
|
||||
'Chill\Migrations\Budget': '@ChillBudgetBundle/migrations'
|
||||
all_or_nothing:
|
||||
true
|
||||
|
||||
services:
|
||||
'Doctrine\Migrations\Version\Comparator': 'Chill\MainBundle\Doctrine\Migrations\VersionComparator'
|
||||
|
||||
storage:
|
||||
table_storage:
|
||||
table_name: 'migration_versions'
|
||||
|
20
config/packages/doctrine_migrations_chill.yaml
Normal file
20
config/packages/doctrine_migrations_chill.yaml
Normal file
@@ -0,0 +1,20 @@
|
||||
doctrine_migrations:
|
||||
migrations_paths:
|
||||
# migrations for default chill modules
|
||||
'Chill\Migrations\Main': '@ChillMainBundle/migrations'
|
||||
'Chill\Migrations\Activity': '@ChillActivityBundle/migrations'
|
||||
'Chill\Migrations\DocStore': '@ChillDocStoreBundle/migrations'
|
||||
'Chill\Migrations\CustomFields': '@ChillCustomFieldsBundle/migrations'
|
||||
'Chill\Migrations\Event': '@ChillEventBundle/migrations'
|
||||
'Chill\Migrations\Person': '@ChillPersonBundle/migrations'
|
||||
'Chill\Migrations\Task': '@ChillTaskBundle/migrations'
|
||||
'Chill\Migrations\ThirdParty': '@ChillThirdPartyBundle/migrations'
|
||||
'Chill\Migrations\DocGenerator': '@ChillDocGeneratorBundle/migrations'
|
||||
'Chill\Migrations\AsideActivity': '@ChillAsideActivityBundle/migrations'
|
||||
'Chill\Migrations\Calendar': '@ChillCalendarBundle/migrations'
|
||||
'Chill\Migrations\Budget': '@ChillBudgetBundle/migrations'
|
||||
all_or_nothing:
|
||||
true
|
||||
|
||||
services:
|
||||
'Doctrine\Migrations\Version\Comparator': 'Chill\MainBundle\Doctrine\Migrations\VersionComparator'
|
@@ -7,8 +7,6 @@ framework:
|
||||
verify_peer: false
|
||||
verify_host: false
|
||||
|
||||
# DIRTY FIX un bug dans symfony4 empêche de récupérer un tableau de variables depuis .env
|
||||
# cfr. https://github.com/symfony/symfony/issues/28599
|
||||
trusted_hosts:
|
||||
- '^(localhost|127.0.0.1|web)$'
|
||||
- '%env(resolve:TRUSTED_HOSTS)%'
|
||||
@@ -31,10 +29,6 @@ framework:
|
||||
|
||||
#error_controller: App\Controller\ErrorController::show
|
||||
|
||||
## sf4 check: ou à déplacer dans un chill.yaml
|
||||
assets:
|
||||
json_manifest_path: '%kernel.project_dir%/public/build/manifest.json'
|
||||
|
||||
when@test:
|
||||
framework:
|
||||
test: true
|
||||
|
3
config/packages/framework_chill.yaml
Normal file
3
config/packages/framework_chill.yaml
Normal file
@@ -0,0 +1,3 @@
|
||||
framework:
|
||||
assets:
|
||||
json_manifest_path: '%kernel.project_dir%/public/build/manifest.json'
|
4
config/packages/mailer_chill.yaml
Normal file
4
config/packages/mailer_chill.yaml
Normal file
@@ -0,0 +1,4 @@
|
||||
framework:
|
||||
mailer:
|
||||
envelope:
|
||||
sender: '%env(NOTIFICATION_FROM_EMAIL)%'
|
@@ -17,11 +17,3 @@ framework:
|
||||
routing:
|
||||
# Route your messages to the transports
|
||||
# 'App\Message\YourMessage': async
|
||||
'Chill\CalendarBundle\Messenger\Message\CalendarRangeMessage': async
|
||||
'Chill\CalendarBundle\Messenger\Message\CalendarRangeRemovedMessage': async
|
||||
'Chill\CalendarBundle\Messenger\Message\CalendarRemovedMessage': async
|
||||
'Chill\CalendarBundle\Messenger\Message\CalendarMessage': async
|
||||
'Chill\CalendarBundle\Messenger\Message\InviteUpdateMessage': async
|
||||
'Chill\CalendarBundle\Messenger\Message\MSGraphChangeNotificationMessage': async
|
||||
'Chill\MainBundle\Service\ShortMessage\ShortMessage': async
|
||||
'Chill\DocGeneratorBundle\Service\Messenger\RequestGenerationMessage': priority
|
||||
|
13
config/packages/messenger_chill.yaml
Normal file
13
config/packages/messenger_chill.yaml
Normal file
@@ -0,0 +1,13 @@
|
||||
framework:
|
||||
messenger:
|
||||
routing:
|
||||
# Route your messages to the transports
|
||||
# 'App\Message\YourMessage': async
|
||||
'Chill\CalendarBundle\Messenger\Message\CalendarRangeMessage': async
|
||||
'Chill\CalendarBundle\Messenger\Message\CalendarRangeRemovedMessage': async
|
||||
'Chill\CalendarBundle\Messenger\Message\CalendarRemovedMessage': async
|
||||
'Chill\CalendarBundle\Messenger\Message\CalendarMessage': async
|
||||
'Chill\CalendarBundle\Messenger\Message\InviteUpdateMessage': async
|
||||
'Chill\CalendarBundle\Messenger\Message\MSGraphChangeNotificationMessage': async
|
||||
'Chill\MainBundle\Service\ShortMessage\ShortMessage': async
|
||||
'Chill\DocGeneratorBundle\Service\Messenger\RequestGenerationMessage': priority
|
@@ -60,3 +60,4 @@ when@test:
|
||||
# type: stream
|
||||
# channels: [deprecation]
|
||||
# path: php://stderr
|
||||
# formatter: monolog.formatter.json
|
||||
|
@@ -1,9 +1,4 @@
|
||||
security:
|
||||
|
||||
access_decision_manager:
|
||||
strategy: unanimous
|
||||
allow_if_all_abstain: false
|
||||
|
||||
enable_authenticator_manager: true
|
||||
# https://symfony.com/doc/current/security.html#registering-the-user-hashing-passwords
|
||||
password_hashers:
|
||||
@@ -12,66 +7,24 @@ security:
|
||||
Symfony\Component\Security\Core\User\PasswordAuthenticatedUserInterface: 'auto'
|
||||
# https://symfony.com/doc/current/security.html#loading-the-user-the-user-provider
|
||||
providers:
|
||||
chain_provider:
|
||||
chain :
|
||||
providers: [in_memory, users]
|
||||
in_memory:
|
||||
# providers added by chill-bundles recipes
|
||||
# those providers are required to make chill working
|
||||
chill_chain_provider:
|
||||
chain:
|
||||
providers: [chill_in_memory, chill_users]
|
||||
chill_in_memory:
|
||||
memory:
|
||||
users:
|
||||
admin: { password: '%env(resolve:ADMIN_PASSWORD)%', roles: ['ROLE_ADMIN', 'ROLE_ALLOWED_TO_SWITCH', 'ROLE_USER'] }
|
||||
users:
|
||||
chill_users:
|
||||
id: chill.main.user_provider
|
||||
encoders:
|
||||
Chill\MainBundle\Entity\User: auto
|
||||
Symfony\Component\Security\Core\User\User: plaintext
|
||||
firewalls:
|
||||
dev:
|
||||
pattern: ^/(_(profiler|wdt)|css|images|js)/
|
||||
security: false
|
||||
wopi:
|
||||
pattern: ^/wopi
|
||||
provider: chain_provider
|
||||
stateless: true
|
||||
guard:
|
||||
authenticators:
|
||||
- lexik_jwt_authentication.jwt_token_authenticator
|
||||
main:
|
||||
# remove during upgrade from symfony 4 to symfony 5 TODO check this
|
||||
#anonymous: ~
|
||||
provider: chain_provider
|
||||
form_login:
|
||||
csrf_parameter: _csrf_token
|
||||
csrf_token_id: authenticate
|
||||
#csrf_provider: security.csrf.token_manager
|
||||
# remove during upgrade from symfony 4 to symfony 5 TODO check this
|
||||
# logout_on_user_change: true
|
||||
logout:
|
||||
path: /logout
|
||||
# end of providers added by chill-bundles recipes
|
||||
# all other providers might be removed, unless you have specific needs
|
||||
# TODO AFTER CHILL-BUNDLES RECIPES INSTALL: remove the user providers which are not used
|
||||
|
||||
# uncomment to enable impersonate mode in Chill
|
||||
# https://symfony.com/doc/current/security/impersonating_user.html
|
||||
switch_user: true
|
||||
|
||||
# activate different ways to authenticate
|
||||
# https://symfony.com/doc/current/security.html#firewalls-authentication
|
||||
|
||||
# Easy way to control access for large sections of your site
|
||||
# Note: Only the *first* access control that matches will be used
|
||||
access_control:
|
||||
- { path: ^/saml/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
|
||||
- { path: ^/saml/metadata, roles: IS_AUTHENTICATED_ANONYMOUSLY }
|
||||
- { path: ^/(login|logout), roles: IS_AUTHENTICATED_ANONYMOUSLY }
|
||||
- { path: ^/public, roles: IS_AUTHENTICATED_ANONYMOUSLY }
|
||||
- { path: ^/wopi, roles: IS_AUTHENTICATED_FULLY }
|
||||
# access for homepage, the homepage redirect admin to admin section
|
||||
- { path: ^/$, roles: [ IS_AUTHENTICATED_REMEMBERED ] }
|
||||
- { path: ^/homepage$, roles: [ IS_AUTHENTICATED_REMEMBERED ] }
|
||||
# idem
|
||||
- { path: ^/([a-z]+/)?homepage, roles: [ IS_AUTHENTICATED_REMEMBERED ] }
|
||||
# admin section, only for admin
|
||||
- { path: ^/([a-z]+/)?admin, roles: ROLE_ADMIN }
|
||||
# other pages, only for regular user (no admin)
|
||||
- { path: ^/, roles: ROLE_USER }
|
||||
|
||||
when@test:
|
||||
security:
|
||||
|
50
config/packages/security_chill.yaml
Normal file
50
config/packages/security_chill.yaml
Normal file
@@ -0,0 +1,50 @@
|
||||
security:
|
||||
access_decision_manager:
|
||||
strategy: unanimous
|
||||
allow_if_all_abstain: false
|
||||
firewalls:
|
||||
dev:
|
||||
pattern: ^/(_(profiler|wdt)|css|images|js)/
|
||||
security: false
|
||||
wopi:
|
||||
pattern: ^/wopi
|
||||
provider: chill_chain_provider
|
||||
stateless: true
|
||||
guard:
|
||||
authenticators:
|
||||
- lexik_jwt_authentication.jwt_token_authenticator
|
||||
chill_main:
|
||||
# remove during upgrade from symfony 4 to symfony 5 TODO check this
|
||||
#anonymous: ~
|
||||
provider: chill_chain_provider
|
||||
form_login:
|
||||
csrf_parameter: _csrf_token
|
||||
csrf_token_id: authenticate
|
||||
#csrf_provider: security.csrf.token_manager
|
||||
# remove during upgrade from symfony 4 to symfony 5 TODO check this
|
||||
# logout_on_user_change: true
|
||||
logout:
|
||||
path: /logout
|
||||
|
||||
# uncomment to enable impersonate mode in Chill
|
||||
# https://symfony.com/doc/current/security/impersonating_user.html
|
||||
switch_user: true
|
||||
|
||||
# activate different ways to authenticate
|
||||
# https://symfony.com/doc/current/security.html#firewalls-authentication
|
||||
|
||||
# Easy way to control access for large sections of your site
|
||||
# Note: Only the *first* access control that matches will be used
|
||||
access_control:
|
||||
- { path: ^/(login|logout), roles: IS_AUTHENTICATED_ANONYMOUSLY }
|
||||
- { path: ^/public, roles: IS_AUTHENTICATED_ANONYMOUSLY }
|
||||
- { path: ^/wopi, roles: IS_AUTHENTICATED_FULLY }
|
||||
# access for homepage, the homepage redirect admin to admin section
|
||||
- { path: ^/$, roles: [ IS_AUTHENTICATED_REMEMBERED ] }
|
||||
- { path: ^/homepage$, roles: [ IS_AUTHENTICATED_REMEMBERED ] }
|
||||
# idem
|
||||
- { path: ^/([a-z]+/)?homepage, roles: [ IS_AUTHENTICATED_REMEMBERED ] }
|
||||
# admin section, only for admin
|
||||
- { path: ^/([a-z]+/)?admin, roles: ROLE_ADMIN }
|
||||
# other pages, only for regular user (no admin)
|
||||
- { path: ^/, roles: ROLE_USER }
|
0
config/packages/test/.gitkeep
Normal file
0
config/packages/test/.gitkeep
Normal file
@@ -1,5 +0,0 @@
|
||||
---
|
||||
chill_main:
|
||||
available_languages:
|
||||
- 'fr'
|
||||
- 'en'
|
@@ -1,8 +1,5 @@
|
||||
---
|
||||
# config/packages/test/security.yaml
|
||||
security:
|
||||
firewalls:
|
||||
default:
|
||||
http_basic: ~
|
||||
role_hierarchy:
|
||||
CHILL_MASTER_ROLE: [CHILL_INHERITED_ROLE_1]
|
||||
|
@@ -1,7 +1,6 @@
|
||||
framework:
|
||||
|
||||
default_locale: '%env(resolve:LOCALE)%'
|
||||
|
||||
translator:
|
||||
default_path: '%kernel.project_dir%/translations'
|
||||
fallbacks: [ '%env(resolve:LOCALE)%' ]
|
||||
providers:
|
||||
|
@@ -1,18 +1,5 @@
|
||||
twig:
|
||||
default_path: '%kernel.project_dir%/templates'
|
||||
|
||||
## In Symfony 5, bootstrap_5 theme is supported. But not yet in sf4 !!
|
||||
# see sf5 https://symfony.com/doc/current/form/form_themes.html
|
||||
# see sf4 https://symfony.com/doc/4.4/form/form_themes.html
|
||||
#
|
||||
# While waiting for the upgrade, we get the form theme file
|
||||
# (https://github.com/symfony/symfony/tree/5.4/src/Symfony/Bridge/Twig/Resources/views/Form),
|
||||
# put it in ChillMainBundle/Resources/views/Form/bootstrap5/
|
||||
# and adapt it lightly.
|
||||
#
|
||||
form_themes: ['@ChillMain/Form/bootstrap5/bootstrap_5_horizontal_layout.html.twig']
|
||||
#form_themes: ['bootstrap_5_horizontal_layout.html.twig']
|
||||
|
||||
when@test:
|
||||
twig:
|
||||
strict_variables: true
|
||||
|
16
config/packages/twig_chill.yaml
Normal file
16
config/packages/twig_chill.yaml
Normal file
@@ -0,0 +1,16 @@
|
||||
twig:
|
||||
## In Symfony 5, bootstrap_5 theme is supported. But not yet in sf4 !!
|
||||
# see sf5 https://symfony.com/doc/current/form/form_themes.html
|
||||
# see sf4 https://symfony.com/doc/4.4/form/form_themes.html
|
||||
#
|
||||
# While waiting for the upgrade, we get the form theme file
|
||||
# (https://github.com/symfony/symfony/tree/5.4/src/Symfony/Bridge/Twig/Resources/views/Form),
|
||||
# put it in ChillMainBundle/Resources/views/Form/bootstrap5/
|
||||
# and adapt it lightly.
|
||||
#
|
||||
form_themes: ['@ChillMain/Form/bootstrap5/bootstrap_5_horizontal_layout.html.twig']
|
||||
|
||||
when@dev:
|
||||
twig:
|
||||
globals:
|
||||
responsive_debug: false
|
@@ -11,6 +11,9 @@ framework:
|
||||
fr: 'Suivi'
|
||||
support_strategy: Chill\MainBundle\Workflow\RelatedEntityWorkflowSupportsStrategy
|
||||
initial_marking: 'initial'
|
||||
marking_store:
|
||||
property: step
|
||||
type: method
|
||||
places:
|
||||
initial:
|
||||
metadata:
|
@@ -22,6 +22,14 @@ services:
|
||||
- DATABASE_URL=postgresql://postgres:postgres@db:5432/postgres?serverVersion=14&charset=utf8
|
||||
links:
|
||||
- smtp
|
||||
- dumper
|
||||
|
||||
dumper:
|
||||
image: gitea.champs-libres.be/chill-project/chill-skeleton-basic/base-image:latest
|
||||
entrypoint: ["/usr/bin/env"]
|
||||
command: ["bin/var-dump-server", "--host", "0.0.0.0:9912"]
|
||||
volumes:
|
||||
- .:/var/www/app
|
||||
|
||||
nginx:
|
||||
volumes:
|
||||
|
@@ -41,6 +41,7 @@ if [ "${APP_ENV}" = "prod" ]; then
|
||||
php /var/www/app/bin/console doctrine:migrations:status
|
||||
php /var/www/app/bin/console doctrine:migrations:migrate -n
|
||||
php /var/www/app/bin/console messenger:setup-transports
|
||||
php /var/www/app/bin/console chill:db:sync-views
|
||||
fi
|
||||
fi
|
||||
|
||||
|
17
symfony.lock
17
symfony.lock
@@ -2,9 +2,6 @@
|
||||
"brick/math": {
|
||||
"version": "0.9.3"
|
||||
},
|
||||
"champs-libres/async-uploader-bundle": {
|
||||
"version": "dev-sf4"
|
||||
},
|
||||
"champs-libres/wopi-bundle": {
|
||||
"version": "dev-master"
|
||||
},
|
||||
@@ -48,12 +45,12 @@
|
||||
"version": "v0.5.3"
|
||||
},
|
||||
"doctrine/doctrine-bundle": {
|
||||
"version": "2.10",
|
||||
"version": "2.11",
|
||||
"recipe": {
|
||||
"repo": "github.com/symfony/recipes",
|
||||
"branch": "main",
|
||||
"version": "2.4",
|
||||
"ref": "013b823e7fee65890b23e40f31e6667a1ac519ac"
|
||||
"ref": "cc62b7e9470998c640ee99d284a013a676f1fc5e"
|
||||
},
|
||||
"files": [
|
||||
"config/packages/doctrine.yaml",
|
||||
@@ -572,7 +569,7 @@
|
||||
"repo": "github.com/symfony/recipes",
|
||||
"branch": "main",
|
||||
"version": "4.3",
|
||||
"ref": "2bf89438209656b85b9a49238c4467bff1b1f939"
|
||||
"ref": "df66ee1f226c46f01e85c29c2f7acce0596ba35a"
|
||||
},
|
||||
"files": [
|
||||
"config/packages/mailer.yaml"
|
||||
@@ -606,12 +603,12 @@
|
||||
"version": "v5.1.3"
|
||||
},
|
||||
"symfony/monolog-bundle": {
|
||||
"version": "3.8",
|
||||
"version": "3.10",
|
||||
"recipe": {
|
||||
"repo": "github.com/symfony/recipes",
|
||||
"branch": "main",
|
||||
"version": "3.7",
|
||||
"ref": "213676c4ec929f046dfde5ea8e97625b81bc0578"
|
||||
"ref": "aff23899c4440dd995907613c1dd709b6f59503f"
|
||||
},
|
||||
"files": [
|
||||
"config/packages/monolog.yaml"
|
||||
@@ -626,7 +623,7 @@
|
||||
"repo": "github.com/symfony/recipes",
|
||||
"branch": "main",
|
||||
"version": "5.3",
|
||||
"ref": "221b9cc0a623f567e83ccd61a8ac82a9a91e2b5b"
|
||||
"ref": "07ce01a897311647520b43d4ddddad9537b99ba6"
|
||||
},
|
||||
"files": [
|
||||
".env.test",
|
||||
@@ -729,7 +726,7 @@
|
||||
"repo": "github.com/symfony/recipes",
|
||||
"branch": "main",
|
||||
"version": "5.3",
|
||||
"ref": "da64f5a2b6d96f5dc24914517c0350a5f91dee43"
|
||||
"ref": "e28e27f53663cc34f0be2837aba18e3a1bef8e7b"
|
||||
},
|
||||
"files": [
|
||||
"config/packages/translation.yaml",
|
||||
|
@@ -4,9 +4,7 @@ use Symfony\Component\Dotenv\Dotenv;
|
||||
|
||||
require dirname(__DIR__).'/vendor/autoload.php';
|
||||
|
||||
if (file_exists(dirname(__DIR__).'/config/bootstrap.php')) {
|
||||
require dirname(__DIR__).'/config/bootstrap.php';
|
||||
} elseif (method_exists(Dotenv::class, 'bootEnv')) {
|
||||
if (method_exists(Dotenv::class, 'bootEnv')) {
|
||||
(new Dotenv())->bootEnv(dirname(__DIR__).'/.env');
|
||||
}
|
||||
|
||||
|
0
translations/.gitkeep
Normal file
0
translations/.gitkeep
Normal file
@@ -1,205 +0,0 @@
|
||||
# activity
|
||||
Show the activity: Voir l'échange
|
||||
Edit the activity: Modifier l'échange
|
||||
Activity: Échange
|
||||
Add a new activity: Ajouter un nouvel échange
|
||||
Activity list: Liste des échanges
|
||||
Update activity: Modifier l'échange
|
||||
Activity data: Données de l'échange
|
||||
Activity location: Localisation de l'échange
|
||||
Activity creation: Nouvel échange
|
||||
Save activity: Sauver l'échange
|
||||
'%user% has done an %activity_type%': '%user% a effectué un échange de type "%activity_type%"'
|
||||
'Success : activity created!': L'échange a été créé.
|
||||
'The form is not valid. The activity has not been created !': Le formulaire est invalide. L'échange n'a pas été créé.
|
||||
'Success : activity updated!': L'échange a été mis à jour.
|
||||
'The form is not valid. The activity has not been updated !': Le formulaire est invalide. L'échange n'a pas été mis à jour.
|
||||
Activity configuration: Configuration des échanges
|
||||
Activity configuration menu: Configuration des échanges
|
||||
Activity Types: Types d'échange
|
||||
Activity Reasons: Sujets d'un échange
|
||||
Activity Reasons Category: Catégories de sujet d'échanges
|
||||
Activity Types Categories: Catégories des types d'échange
|
||||
Activity Presences: Présences aux échanges
|
||||
Travel time: Durée du trajet (aller/retour)
|
||||
Sent received: Entrant / sortant
|
||||
Sent: Sortant
|
||||
Received: Entrant
|
||||
activity:
|
||||
comment: Compte-rendu
|
||||
See activity in accompanying course context: Voir l'échange dans le contexte du parcours d'accompagnement
|
||||
ActivityPresence list: Liste des Présences aux échanges
|
||||
Create a new activity presence: Créer une nouvelle "Présence aux échanges"
|
||||
|
||||
# crud activity
|
||||
crud:
|
||||
save: Enregistrer
|
||||
activity_type:
|
||||
title_new: Nouveau type d'échange
|
||||
title_edit: Edition d'un type d'échange
|
||||
activity_type_category:
|
||||
title_new: Nouvelle catégorie de type d'échange
|
||||
title_edit: Edition d'une catégorie de type d'échange
|
||||
activity_presence:
|
||||
title_new: Nouvelle Présence aux échanges
|
||||
title_edit: Edition d'une Présence aux échanges
|
||||
vendee_security_profile:
|
||||
index:
|
||||
title: Profils de droits
|
||||
add_new: Créer
|
||||
title_new: Nouveau profil
|
||||
title_edit: Modifier profil
|
||||
# activity reason admin
|
||||
ActivityReason list: Liste des sujets
|
||||
Create a new activity reason: Créer un nouveau sujet
|
||||
ActivityReason creation: Nouveau sujet
|
||||
ActivityReason edit: Modification d'un sujet
|
||||
ActivityReason: Sujet d'échange
|
||||
#activity reason category admin
|
||||
ActivityReasonCategory list: Catégories de sujets
|
||||
Create a new activity category reason: Créer une nouvelle catégorie
|
||||
ActivityReasonCategory creation: Nouvelle catégorie de sujet
|
||||
ActivityReasonCategory edit: Modification d'une catégorie de sujet
|
||||
ActivityReasonCategory: Catégorie de sujet d'échange
|
||||
ActivityReasonCategory is active and will be proposed: La catégorie est active et sera proposée
|
||||
ActivityReasonCategory is inactive and won't be proposed: La catégorie est inactive et ne sera pas proposée
|
||||
# activity type type admin
|
||||
ActivityType list: Types d'échanges
|
||||
Create a new activity type: Créer un nouveau type d'échange
|
||||
# activity type category admin
|
||||
ActivityTypeCategory list: Liste des catégories des types d'échange
|
||||
Create a new activity type category: Créer une nouvelle catégorie de type d'échange
|
||||
# activity delete
|
||||
Remove activity: Supprimer un échange
|
||||
Are you sure you want to remove the activity about "%name%" ?: Êtes-vous sûr de vouloir supprimer un échange qui concerne "%name%" ?
|
||||
The activity has been successfully removed.: L'échange a été supprimé.
|
||||
Sum activity duration: Total de la durée des échanges
|
||||
'Filtered by activity type: only %list%': "Filtré par type d'activity: seulement %list%"
|
||||
Filtered by date activity: Filtrer par date d'échange
|
||||
"Filtered by date of activity: only between %date_from% and %date_to%": "Filtré par date de l'échange: uniquement entre %date_from% et %date_to%"
|
||||
This date should be after the date given in "Implied in an activity after this date" field: Cette date devrait être postérieure à la date donnée dans le champ "échanges après cette date"
|
||||
Filtered by person having an activity in a period: Uniquement les personnes ayant eu un échange dans la période donnée
|
||||
Implied in an activity after this date: Impliqué dans un échange après cette date
|
||||
Implied in an activity before this date: Impliqué dans un échange avant cette date
|
||||
Filtered by person having an activity between %date_from% and %date_to% with reasons %reasons_name%: Filtré par personnes associées à un échange entre %date_from% et %date_to% avec les sujets %reasons_name%
|
||||
Activity reasons for those activities: Sujets de ces échanges
|
||||
Filter by activity type: Filtrer par type d'échange
|
||||
Activity type: Type d'échange
|
||||
Activity user: Utilisateur lié à l'activity
|
||||
Aggregate by activity user: Aggréger par utilisateur lié à l'échange
|
||||
Aggregate by activity type: Aggréger par type d'échange
|
||||
Aggregate by activity reason: Aggréger par sujet de l'échange
|
||||
There isn't any activities.: Aucun échange enregistré.
|
||||
Last activities: Les derniers échanges
|
||||
Activities: Échanges
|
||||
|
||||
# person
|
||||
Person: Usager
|
||||
'Add a person': 'Ajout d''un usager'
|
||||
'Person details': 'Généralités'
|
||||
Back to the person details: Retour aux détails de l'usager
|
||||
Show person: Voir la fiche de l'usager
|
||||
Any person selected: Aucun usager sélectionné
|
||||
|
||||
Male: Masculin
|
||||
Man: Masculin
|
||||
man: Masculin
|
||||
Female: Féminin
|
||||
woman: Féminin
|
||||
Woman: Féminin
|
||||
both: Neutre, non binaire
|
||||
Both: Neutre, non binaire
|
||||
Neuter: Neutre, non binaire
|
||||
neuter: Neutre, non binaire
|
||||
|
||||
'Add the person': "Créer l'usager"
|
||||
'Add the person and create an accompanying period': "Créer l’usager ET créer un parcours d’accompagnement"
|
||||
'Add the person and create an household': "Créer l'usager ET créer un ménage"
|
||||
'Add an accompanying period in the past': Ajouter un parcours d'accompagnement dans le passé
|
||||
Begin a new accompanying period: Commencer un nouveau parcours d'accompagnement
|
||||
Create an accompanying period: Créer un parcours d'accompagnement
|
||||
'A period has been created.': Une parcours d'accompagnement a été créé.
|
||||
'Error! Period not created!': Le parcours d'accompagnement n'a pas été créé.
|
||||
Update accompanying period: Mettre à jour un parcours d'accompagnement
|
||||
'An accompanying period has been updated.': Un parcours d'accompagnement a été mis à jour
|
||||
'Error when updating the period': Erreur pendant la mise à jour du parcours d'accompagnement.
|
||||
'An accompanying period has been closed.': Un parcours d'accompagnement a été fermé.
|
||||
'Error! Period not closed!': "Erreur: le parcours d'accompagnement n'a pas été fermé."
|
||||
'An accompanying period has been opened.': Un parcours d'accompagnement a été ouvert.
|
||||
'Period not opened': "Le parcours d'accompagnement n'a pas été ouvert"
|
||||
An accompanying period starts: Un parcours d'accompagnement est ouvert
|
||||
Any accompanying periods are open: Aucun parcours d'accompagnement ouvert
|
||||
An accompanying period is open: Un parcours d'accompagnement est ouvert
|
||||
Accompanying period list: Parcours d'accompagnement
|
||||
Accompanying period list for person: Parcours d'accompagnement de l'usager
|
||||
Period number %number%: 'Parcours n° %number%'
|
||||
Are you sure you want to re-open this period ?: Êtes-vous sûr de vouloir ré-ouvrir ce parcours d'accompagnement ?
|
||||
'The period has been re-opened': Le parcours d'accompagnement a été ré-ouvert.
|
||||
See accompanying period: Voir le parcours
|
||||
See accompanying periods: Voir tous les parcours d'accompagnement
|
||||
Edit accompanying period: Modifier le parcours
|
||||
Close accompanying period: Clôre le parcours
|
||||
Re-open accompanying period: Ré-ouvrir le parcours
|
||||
Closing the accompanying period: Fermeture du parcours d'accompagnement
|
||||
Opening the accompanying period: Ouverture d'un parcours d'accompagnement
|
||||
"Filter by accompanying period: active period": "Filtrer par parcours d'accompagnement: en file active"
|
||||
Some peoples does not belong to any household currently. Add them to an household soon: Certains usagers n'appartiennent à aucun ménage actuellement. Renseignez leur appartenance à un ménage dès que possible.
|
||||
This course is located at a temporarily address. You should locate this course to an user: Le parcours est localisé à une adresse temporaire. Il devrait être localisé auprès d'un usager concerné.
|
||||
Having an accompanying period opened after this date: Ayant un parcours d'accompagnement ouvert après cette date
|
||||
Having an accompanying period ending before this date, or still opened at this date: Ayant un parcours d'accompagnement fermé après cette date, ou toujours ouvert à cette date
|
||||
"Filtered by accompanying period: persons having an accompanying period opened after the %date_from% and closed before the %date_to% (or still opened at the %date_to%)": "Filtré par parcours d'accompagnement: personnes ayant un parcours d'accompagnement ouvert après le %date_from%, et cloturé le %date_to% (ou toujours ouvert le %date_to%)"
|
||||
"Filter by accompanying period: starting between two dates": "Filtrer par parcours d'accompagnement: début de la période entre deux dates"
|
||||
"Having an accompanying period opened before this date": "Ayant un parcours d'accompagnement ouvert avant cette date"
|
||||
"Filtered by accompanying period: persons having an accompanying period opened between the %date_from% and %date_to%": "Filtrer par parcours d'accompagnement: ayant une période ouverte entre le %date_from% et le %date_to%"
|
||||
"Filter by accompanying period: closed between two dates": "Filtrer par parcours d'accompagnement: période fermée entre deux dates"
|
||||
Having an accompanying period closed after this date: Ayant un parcours d'accompagnement fermé après cette date
|
||||
"Having an accompanying period closed before this date": "Ayant un parcours d'accompagnement fermé avant cette date"
|
||||
"Filtered by accompanying period: persons having an accompanying period closed between the %date_from% and %date_to%": "Filtrer par parcours d'accompagnement: ayant une période fermée entre le %date_from% et le %date_to%"
|
||||
Accompanying user: Référent
|
||||
No accompanying user: Aucun référent
|
||||
Participants: Usagers concernés
|
||||
person_admin:
|
||||
closing motive explanation: >
|
||||
Les motifs de clotûre donnent des indications sur la fermeture d'un parcours d'accompagnement.
|
||||
Delete accompanying period: Supprimer le parcours
|
||||
Are you sure you want to remove the accompanying period "%id%" ?: Êtes-vous sûr de vouloir supprimer le parcours %id% ?
|
||||
The accompanying course has been successfully removed.: Le parcours a été supprimé.
|
||||
|
||||
|
||||
Unknown: Non renseigné
|
||||
Center: Territoire
|
||||
Centers: Territoires
|
||||
'Marital status': 'État matrimonial'
|
||||
Comment on the marital status: Remarques sur l'état matrimonial
|
||||
Date of last marital status change: État matrimonial depuis le
|
||||
|
||||
# thirdparty
|
||||
List of third parties: Liste des tiers professionnels
|
||||
The party is visible in those centers: Le tiers est visible dans ces territoires
|
||||
|
||||
# household
|
||||
household:
|
||||
Household history for person: Historique des ménages de l'usager
|
||||
|
||||
# thirdparty
|
||||
chill_3party:
|
||||
key_label:
|
||||
caisse_secu: Caisse primaire d'assurance maladie (CPAM)
|
||||
doctor: Médecin
|
||||
|
||||
# error page
|
||||
Send by email: Envoyer par email
|
||||
Don't panick though, we'll fix it as soon as possible. To help us out, please send us the information below. : Pas de panique, nous allons la corriger au plus vite. Pour faciliter la résolution, communiquez les informations ci-dessous.
|
||||
Oops, we came across an error!: Oops, nous avons rencontré une erreur!
|
||||
Date and time of error: Date et heure de l'erreur
|
||||
Error message: Contenu de l'erreur
|
||||
Copy: Copier
|
||||
Copied: Copié
|
||||
|
||||
You are getting a notification for a period which does not exists any more: Cette notification ne correspond pas à un parcours d'accompagnement valide
|
||||
You are getting a notification for a period you are not allowed to see: La notification fait référence à un parcours d'accompagnement auquel vous n'avez pas accès.
|
||||
This is the minimal period details: Parcours d'accompagnement n°
|
||||
|
||||
You get notified of an activity which does not exists any more: Cette notification ne correspond pas à un échange valide.
|
||||
you are not allowed to see it details: La notification fait référence à un échange auquel vous n'avez pas accès.
|
||||
This is the minimal activity data: Échange n°
|
@@ -1,20 +0,0 @@
|
||||
# Activity validators
|
||||
For this type of activity, you must add at least one person: Pour ce type d'échange, vous devez ajouter au moins un usager
|
||||
For this type of activity, you must add at least one user: Pour ce type d'échange, vous devez ajouter au moins un TMS
|
||||
For this type of activity, you must add at least one third party: Pour ce type d'échange, vous devez ajouter au moins un tiers
|
||||
For this type of activity, the user is required: Pour ce type d'échange, l'utilisateur est requis
|
||||
For this type of activity, the date is required: Pour ce type d'échange, la date est requise
|
||||
For this type of activity, the location is required: Pour ce type d'échange, la localisation est requise
|
||||
For this type of activity, user is required: Pour ce type d'échange, l'utilisateur est requis
|
||||
For this type of activity, date is required: Pour ce type d'échange, la date est requise
|
||||
For this type of activity, location is required: Pour ce type d'échange, la localisation est requise
|
||||
For this type of activity, attendee is required: Pour ce type d'échange, le champ "Présence de la personne" est requis
|
||||
For this type of activity, duration time is required: Pour ce type d'échange, la durée est requise
|
||||
For this type of activity, travel time is required: Pour ce type d'échange, la durée du trajet est requise
|
||||
For this type of activity, reasons is required: Pour ce type d'échange, le champ "sujet" est requis
|
||||
For this type of activity, comment is required: Pour ce type d'échange, un commentaire est requis
|
||||
For this type of activity, sent/received is required: Pour ce type d'échange, le champ Entrant/Sortant est requis
|
||||
For this type of activity, document is required: Pour ce type d'échange, un document est requis
|
||||
For this type of activity, emergency is required: Pour ce type d'échange, le champ "Urgent" est requis
|
||||
For this type of activity, accompanying period is required: Pour ce type d'échange, le parcours d'accompagnement est requis
|
||||
This social issue cannot be deleted because it is associated with an activity or an action: La problématique sociale ne peut pas être supprimée car elle est associée à un échange ou une action
|
Reference in New Issue
Block a user