mirror of
https://gitlab.com/Chill-Projet/chill-bundles.git
synced 2025-06-12 21:34:25 +00:00
add flags to permissions groups
Flags can be added to permissions group to store some metadata. An interface `PermissionsGroupFlagProvider` allow to add some flag to the form which create/ edit permissions groups.
This commit is contained in:
parent
b1ae55ba80
commit
b9a7314975
@ -12,6 +12,7 @@ use Chill\MainBundle\DependencyInjection\CompilerPass\ExportsCompilerPass;
|
|||||||
use Chill\MainBundle\DependencyInjection\CompilerPass\WidgetsCompilerPass;
|
use Chill\MainBundle\DependencyInjection\CompilerPass\WidgetsCompilerPass;
|
||||||
use Chill\MainBundle\DependencyInjection\CompilerPass\NotificationCounterCompilerPass;
|
use Chill\MainBundle\DependencyInjection\CompilerPass\NotificationCounterCompilerPass;
|
||||||
use Chill\MainBundle\DependencyInjection\CompilerPass\MenuCompilerPass;
|
use Chill\MainBundle\DependencyInjection\CompilerPass\MenuCompilerPass;
|
||||||
|
use Chill\MainBundle\DependencyInjection\CompilerPass\ACLFlagsCompilerPass;
|
||||||
|
|
||||||
|
|
||||||
class ChillMainBundle extends Bundle
|
class ChillMainBundle extends Bundle
|
||||||
@ -27,5 +28,6 @@ class ChillMainBundle extends Bundle
|
|||||||
$container->addCompilerPass(new WidgetsCompilerPass());
|
$container->addCompilerPass(new WidgetsCompilerPass());
|
||||||
$container->addCompilerPass(new NotificationCounterCompilerPass());
|
$container->addCompilerPass(new NotificationCounterCompilerPass());
|
||||||
$container->addCompilerPass(new MenuCompilerPass());
|
$container->addCompilerPass(new MenuCompilerPass());
|
||||||
|
$container->addCompilerPass(new ACLFlagsCompilerPass());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
39
DependencyInjection/CompilerPass/ACLFlagsCompilerPass.php
Normal file
39
DependencyInjection/CompilerPass/ACLFlagsCompilerPass.php
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
<?php
|
||||||
|
/*
|
||||||
|
*/
|
||||||
|
namespace Chill\MainBundle\DependencyInjection\CompilerPass;
|
||||||
|
|
||||||
|
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
|
||||||
|
use Symfony\Component\DependencyInjection\ContainerBuilder;
|
||||||
|
use Chill\MainBundle\Form\PermissionsGroupType;
|
||||||
|
use Symfony\Component\DependencyInjection\Reference;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @author Julien Fastré <julien.fastre@champs-libres.coop>
|
||||||
|
*/
|
||||||
|
class ACLFlagsCompilerPass implements CompilerPassInterface
|
||||||
|
{
|
||||||
|
public function process(ContainerBuilder $container)
|
||||||
|
{
|
||||||
|
$permissionGroupType = $container->getDefinition(PermissionsGroupType::class);
|
||||||
|
|
||||||
|
foreach($container->findTaggedServiceIds('chill_main.flags') as $id => $tags) {
|
||||||
|
$reference = new Reference($id);
|
||||||
|
|
||||||
|
foreach ($tags as $tag) {
|
||||||
|
switch($tag['scope']) {
|
||||||
|
case PermissionsGroupType::FLAG_SCOPE:
|
||||||
|
|
||||||
|
$permissionGroupType->addMethodCall('addFlagProvider', [ $reference ]);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
throw new \LogicalException(sprintf(
|
||||||
|
"This tag 'scope' is not implemented: %s, on service with id %s", $tag['scope'], $id)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -58,7 +58,7 @@ class GroupCenter
|
|||||||
|
|
||||||
public function __construct()
|
public function __construct()
|
||||||
{
|
{
|
||||||
$this->permissionGroups = new ArrayCollection();
|
$this->permissionsGroup = new ArrayCollection();
|
||||||
$this->users = new ArrayCollection();
|
$this->users = new ArrayCollection();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -43,6 +43,12 @@ class PermissionsGroup
|
|||||||
*/
|
*/
|
||||||
private $name;
|
private $name;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @var string[]
|
||||||
|
*/
|
||||||
|
private $flags = [];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @var \Doctrine\Common\Collections\Collection
|
* @var \Doctrine\Common\Collections\Collection
|
||||||
@ -109,6 +115,19 @@ class PermissionsGroup
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getFlags()
|
||||||
|
{
|
||||||
|
return $this->flags;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setFlags(array $flags)
|
||||||
|
{
|
||||||
|
$this->flags = $flags;
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Test that a role scope is associated only once with the permission group
|
* Test that a role scope is associated only once with the permission group
|
||||||
*
|
*
|
||||||
|
@ -5,9 +5,20 @@ namespace Chill\MainBundle\Form;
|
|||||||
use Symfony\Component\Form\AbstractType;
|
use Symfony\Component\Form\AbstractType;
|
||||||
use Symfony\Component\Form\FormBuilderInterface;
|
use Symfony\Component\Form\FormBuilderInterface;
|
||||||
use Symfony\Component\OptionsResolver\OptionsResolver;
|
use Symfony\Component\OptionsResolver\OptionsResolver;
|
||||||
|
use Symfony\Component\Form\Extension\Core\Type\TextType;
|
||||||
|
use Chill\MainBundle\Form\Utils\PermissionsGroupFlagProvider;
|
||||||
|
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
|
||||||
|
|
||||||
class PermissionsGroupType extends AbstractType
|
class PermissionsGroupType extends AbstractType
|
||||||
{
|
{
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @var PermissionsGroupFlagProvider[]
|
||||||
|
*/
|
||||||
|
protected $flagProviders = [];
|
||||||
|
|
||||||
|
const FLAG_SCOPE = 'permissions_group';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param FormBuilderInterface $builder
|
* @param FormBuilderInterface $builder
|
||||||
* @param array $options
|
* @param array $options
|
||||||
@ -15,8 +26,40 @@ class PermissionsGroupType extends AbstractType
|
|||||||
public function buildForm(FormBuilderInterface $builder, array $options)
|
public function buildForm(FormBuilderInterface $builder, array $options)
|
||||||
{
|
{
|
||||||
$builder
|
$builder
|
||||||
->add('name')
|
->add('name', TextType::class)
|
||||||
;
|
;
|
||||||
|
|
||||||
|
$flags = $this->getFlags();
|
||||||
|
|
||||||
|
if (count($flags) > 0) {
|
||||||
|
$builder
|
||||||
|
->add('flags', ChoiceType::class, [
|
||||||
|
'choices' => \array_combine($flags, $flags),
|
||||||
|
'multiple' => true,
|
||||||
|
'expanded' => true,
|
||||||
|
'required' => false
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
protected function getFlags(): array
|
||||||
|
{
|
||||||
|
$flags = [];
|
||||||
|
|
||||||
|
foreach ($this->flagProviders as $flagProvider) {
|
||||||
|
$flags = \array_merge($flags, $flagProvider->getPermissionsGroupFlags());
|
||||||
|
}
|
||||||
|
|
||||||
|
return $flags;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function addFlagProvider(PermissionsGroupFlagProvider $provider)
|
||||||
|
{
|
||||||
|
$this->flagProviders[] = $provider;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
18
Form/Utils/PermissionsGroupFlagProvider.php
Normal file
18
Form/Utils/PermissionsGroupFlagProvider.php
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
|
||||||
|
namespace Chill\MainBundle\Form\Utils;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
interface PermissionsGroupFlagProvider
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Return an array of flags
|
||||||
|
*
|
||||||
|
* @return string[] an array. Keys are ignored.
|
||||||
|
*/
|
||||||
|
public function getPermissionsGroupFlags(): array;
|
||||||
|
}
|
@ -14,6 +14,10 @@ Chill\MainBundle\Entity\PermissionsGroup:
|
|||||||
name:
|
name:
|
||||||
type: string
|
type: string
|
||||||
length: 255
|
length: 255
|
||||||
|
flags:
|
||||||
|
type: json
|
||||||
|
options:
|
||||||
|
default: '[]'
|
||||||
manyToMany:
|
manyToMany:
|
||||||
roleScopes:
|
roleScopes:
|
||||||
targetEntity: Chill\MainBundle\Entity\RoleScope
|
targetEntity: Chill\MainBundle\Entity\RoleScope
|
||||||
|
@ -33,6 +33,7 @@ services:
|
|||||||
- "@doctrine.orm.entity_manager"
|
- "@doctrine.orm.entity_manager"
|
||||||
tags:
|
tags:
|
||||||
- { name: form.type, alias: select2_chill_language }
|
- { name: form.type, alias: select2_chill_language }
|
||||||
|
|
||||||
chill.main.form.type.center:
|
chill.main.form.type.center:
|
||||||
class: Chill\MainBundle\Form\Type\CenterType
|
class: Chill\MainBundle\Form\Type\CenterType
|
||||||
arguments:
|
arguments:
|
||||||
@ -130,5 +131,9 @@ services:
|
|||||||
arguments:
|
arguments:
|
||||||
$chillLogger: '@monolog.logger.chill'
|
$chillLogger: '@monolog.logger.chill'
|
||||||
$passwordEncoder: '@Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface'
|
$passwordEncoder: '@Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface'
|
||||||
|
tags:
|
||||||
|
- { name: form.type }
|
||||||
|
|
||||||
|
Chill\MainBundle\Form\PermissionsGroupType:
|
||||||
tags:
|
tags:
|
||||||
- { name: form.type }
|
- { name: form.type }
|
25
Resources/migrations/Version20180905101426.php
Normal file
25
Resources/migrations/Version20180905101426.php
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
<?php declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Application\Migrations;
|
||||||
|
|
||||||
|
use Doctrine\DBAL\Schema\Schema;
|
||||||
|
use Doctrine\Migrations\AbstractMigration;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Auto-generated Migration: Please modify to your needs!
|
||||||
|
*/
|
||||||
|
final class Version20180905101426 extends AbstractMigration
|
||||||
|
{
|
||||||
|
public function up(Schema $schema) : void
|
||||||
|
{
|
||||||
|
$this->addSql('ALTER TABLE permission_groups ADD flags JSONB DEFAULT \'[]\' NOT NULL');
|
||||||
|
$this->addSql('ALTER TABLE group_centers ALTER permissionsgroup_id DROP NOT NULL');
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public function down(Schema $schema) : void
|
||||||
|
{
|
||||||
|
$this->addSql('ALTER TABLE permission_groups DROP COLUMN flags');
|
||||||
|
$this->addSql('ALTER TABLE group_centers ALTER permissionsgroup_id SET DEFAULT NULL');
|
||||||
|
}
|
||||||
|
}
|
@ -129,6 +129,7 @@ Edit password for %username%: Éditer le mot de passe de %username%
|
|||||||
Change password: Changer le mot de passe
|
Change password: Changer le mot de passe
|
||||||
Back to the user edition: Retour au formulaire d'édition
|
Back to the user edition: Retour au formulaire d'édition
|
||||||
Password successfully updated!: Mot de passe mis à jour
|
Password successfully updated!: Mot de passe mis à jour
|
||||||
|
Flags: Drapeaux
|
||||||
|
|
||||||
#admin section for circles (old: scopes)
|
#admin section for circles (old: scopes)
|
||||||
List circles: Liste des cercles
|
List circles: Liste des cercles
|
||||||
|
@ -9,6 +9,7 @@
|
|||||||
|
|
||||||
{{ form_start(edit_form) }}
|
{{ form_start(edit_form) }}
|
||||||
{{ form_row(edit_form.name) }}
|
{{ form_row(edit_form.name) }}
|
||||||
|
{{ form_row(edit_form.flags) }}
|
||||||
{{ form_row(edit_form.submit, { 'attr': { 'class': 'sc-button green' } } ) }}
|
{{ form_row(edit_form.submit, { 'attr': { 'class': 'sc-button green' } } ) }}
|
||||||
{{ form_end(edit_form) }}
|
{{ form_end(edit_form) }}
|
||||||
|
|
||||||
|
@ -7,6 +7,7 @@
|
|||||||
|
|
||||||
{{ form_start(form) }}
|
{{ form_start(form) }}
|
||||||
{{ form_row(form.name) }}
|
{{ form_row(form.name) }}
|
||||||
|
{{ form_row(form.flags) }}
|
||||||
{{ form_row(form.submit, { 'attr': { 'class': 'sc-button green' } } ) }}
|
{{ form_row(form.submit, { 'attr': { 'class': 'sc-button green' } } ) }}
|
||||||
{{ form_end(form) }}
|
{{ form_end(form) }}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user